Showing the changes to libraries/script-engine/src/ModelScriptingInterface.cpp (1 of 9 files). Show all
Unified · Split
| @@ -151,84 +151,105 @@ QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) { · 150 unmodified lines | ||
| 151 | 151 | } |
| 152 | 152 | |
| 153 | 153 | |
| 154 | −QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshProxy* meshProxy) { | |
| 155 | − int attributeTypeNormal = gpu::Stream::InputSlot::NORMAL; // libraries/gpu/src/gpu/Stream.h | |
| 154 | +// QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshProxy* meshProxy) { | |
| 155 | +// int attributeTypeNormal = gpu::Stream::InputSlot::NORMAL; // libraries/gpu/src/gpu/Stream.h | |
| 156 | + | |
| 157 | +// if (!meshProxy) { | |
| 158 | +// return QScriptValue(false); | |
| 159 | +// } | |
| 160 | + | |
| 161 | +// MeshPointer mesh = meshProxy->getMeshPointer(); | |
| 162 | + | |
| 163 | +// gpu::Resource::Size vertexSize = mesh->getNumVertices() * sizeof(glm::vec3); | |
| 164 | +// unsigned char* resultVertexData = new unsigned char[vertexSize]; | |
| 165 | +// unsigned char* vertexDataCursor = resultVertexData; | |
| 166 | + | |
| 167 | +// gpu::Resource::Size normalSize = mesh->getNumAttributes() * sizeof(glm::vec3); | |
| 168 | +// unsigned char* resultNormalData = new unsigned char[normalSize]; | |
| 169 | +// unsigned char* normalDataCursor = resultNormalData; | |
| 170 | + | |
| 171 | +// gpu::Resource::Size indexSize = mesh->getNumIndices() * sizeof(uint32_t); | |
| 172 | +// unsigned char* resultIndexData = new unsigned char[indexSize]; | |
| 173 | +// unsigned char* indexDataCursor = resultIndexData; | |
| 174 | + | |
| 175 | +// // vertex data | |
| 176 | +// const gpu::BufferView& vertexBufferView = mesh->getVertexBuffer(); | |
| 177 | +// gpu::BufferView::Index numVertices = (gpu::BufferView::Index)mesh->getNumVertices(); | |
| 178 | +// for (gpu::BufferView::Index i = 0; i < numVertices; i ++) { | |
| 179 | +// glm::vec3 pos = vertexBufferView.get<glm::vec3>(i); | |
| 180 | +// pos = glm::vec3(transform * glm::vec4(pos, 1.0f)); | |
| 181 | +// memcpy(vertexDataCursor, &pos, sizeof(pos)); | |
| 182 | +// vertexDataCursor += sizeof(pos); | |
| 183 | +// } | |
| 184 | + | |
| 185 | +// // normal data | |
| 186 | +// const gpu::BufferView& normalsBufferView = mesh->getAttributeBuffer(attributeTypeNormal); | |
| 187 | +// gpu::BufferView::Index numNormals = (gpu::BufferView::Index)mesh->getNumAttributes(); | |
| 188 | +// for (gpu::BufferView::Index i = 0; i < numNormals; i ++) { | |
| 189 | +// glm::vec3 normal = normalsBufferView.get<glm::vec3>(i); | |
| 190 | +// normal = glm::vec3(transform * glm::vec4(normal, 0.0f)); | |
| 191 | +// memcpy(normalDataCursor, &normal, sizeof(normal)); | |
| 192 | +// normalDataCursor += sizeof(normal); | |
| 193 | +// } | |
| 194 | +// // TODO -- other attributes | |
| 195 | + | |
| 196 | +// // face data | |
| 197 | +// const gpu::BufferView& indexBufferView = mesh->getIndexBuffer(); | |
| 198 | +// gpu::BufferView::Index numIndexes = (gpu::BufferView::Index)mesh->getNumIndices(); | |
| 199 | +// for (gpu::BufferView::Index i = 0; i < numIndexes; i ++) { | |
| 200 | +// uint32_t index = indexBufferView.get<uint32_t>(i); | |
| 201 | +// memcpy(indexDataCursor, &index, sizeof(index)); | |
| 202 | +// indexDataCursor += sizeof(index); | |
| 203 | +// } | |
| 204 | + | |
| 205 | +// model::MeshPointer result(new model::Mesh()); | |
| 206 | + | |
| 207 | +// gpu::Element vertexElement = gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ); | |
| 208 | +// gpu::Buffer* resultVertexBuffer = new gpu::Buffer(vertexSize, resultVertexData); | |
| 209 | +// gpu::BufferPointer resultVertexBufferPointer(resultVertexBuffer); | |
| 210 | +// gpu::BufferView resultVertexBufferView(resultVertexBufferPointer, vertexElement); | |
| 211 | +// result->setVertexBuffer(resultVertexBufferView); | |
| 212 | + | |
| 213 | +// gpu::Element normalElement = gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ); | |
| 214 | +// gpu::Buffer* resultNormalsBuffer = new gpu::Buffer(normalSize, resultNormalData); | |
| 215 | +// gpu::BufferPointer resultNormalsBufferPointer(resultNormalsBuffer); | |
| 216 | +// gpu::BufferView resultNormalsBufferView(resultNormalsBufferPointer, normalElement); | |
| 217 | +// result->addAttribute(attributeTypeNormal, resultNormalsBufferView); | |
| 218 | + | |
| 219 | +// gpu::Element indexElement = gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::RAW); | |
| 220 | +// gpu::Buffer* resultIndexesBuffer = new gpu::Buffer(indexSize, resultIndexData); | |
| 221 | +// gpu::BufferPointer resultIndexesBufferPointer(resultIndexesBuffer); | |
| 222 | +// gpu::BufferView resultIndexesBufferView(resultIndexesBufferPointer, indexElement); | |
| 223 | +// result->setIndexBuffer(resultIndexesBufferView); | |
| 224 | + | |
| 225 | + | |
| 226 | +// std::vector<model::Mesh::Part> parts; | |
| 227 | +// parts.emplace_back(model::Mesh::Part((model::Index)0, // startIndex | |
| 228 | +// (model::Index)result->getNumIndices(), // numIndices | |
| 229 | +// (model::Index)0, // baseVertex | |
| 230 | +// model::Mesh::TRIANGLES)); // topology | |
| 231 | +// result->setPartBuffer(gpu::BufferView(new gpu::Buffer(parts.size() * sizeof(model::Mesh::Part), | |
| 232 | +// (gpu::Byte*) parts.data()), gpu::Element::PART_DRAWCALL)); | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | +// MeshProxy* resultProxy = new MeshProxy(result); | |
| 237 | +// return meshToScriptValue(_modelScriptEngine, resultProxy); | |
| 238 | +// } | |
| 156 | 239 | |
| 157 | − MeshPointer mesh = meshProxy->getMeshPointer(); | |
| 158 | 240 | |
| 159 | − gpu::Resource::Size vertexSize = mesh->getNumVertices() * sizeof(glm::vec3); | |
| 160 | − unsigned char* resultVertexData = new unsigned char[vertexSize]; | |
| 161 | − unsigned char* vertexDataCursor = resultVertexData; | |
| 162 | − | |
| 163 | − gpu::Resource::Size normalSize = mesh->getNumAttributes() * sizeof(glm::vec3); | |
| 164 | − unsigned char* resultNormalData = new unsigned char[normalSize]; | |
| 165 | − unsigned char* normalDataCursor = resultNormalData; | |
| 166 | − | |
| 167 | − gpu::Resource::Size indexSize = mesh->getNumIndices() * sizeof(uint32_t); | |
| 168 | − unsigned char* resultIndexData = new unsigned char[indexSize]; | |
| 169 | − unsigned char* indexDataCursor = resultIndexData; | |
| 170 | − | |
| 171 | − // vertex data | |
| 172 | − const gpu::BufferView& vertexBufferView = mesh->getVertexBuffer(); | |
| 173 | − gpu::BufferView::Index numVertices = (gpu::BufferView::Index)mesh->getNumVertices(); | |
| 174 | − for (gpu::BufferView::Index i = 0; i < numVertices; i ++) { | |
| 175 | − glm::vec3 pos = vertexBufferView.get<glm::vec3>(i); | |
| 176 | − pos = glm::vec3(transform * glm::vec4(pos, 0.0f)); | |
| 177 | − memcpy(vertexDataCursor, &pos, sizeof(pos)); | |
| 178 | − vertexDataCursor += sizeof(pos); | |
| 179 | − } | |
| 180 | − | |
| 181 | − // normal data | |
| 182 | − const gpu::BufferView& normalsBufferView = mesh->getAttributeBuffer(attributeTypeNormal); | |
| 183 | − gpu::BufferView::Index numNormals = (gpu::BufferView::Index)mesh->getNumAttributes(); | |
| 184 | − for (gpu::BufferView::Index i = 0; i < numNormals; i ++) { | |
| 185 | − glm::vec3 normal = normalsBufferView.get<glm::vec3>(i); | |
| 186 | − normal = glm::vec3(transform * glm::vec4(normal, 0.0f)); | |
| 187 | − memcpy(normalDataCursor, &normal, sizeof(normal)); | |
| 188 | − normalDataCursor += sizeof(normal); | |
| 241 | +QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshProxy* meshProxy) { | |
| 242 | + if (!meshProxy) { | |
| 243 | + return QScriptValue(false); | |
| 189 | 244 | } |
| 190 | − // TODO -- other attributes | |
| 191 | − | |
| 192 | − // face data | |
| 193 | − const gpu::BufferView& indexBufferView = mesh->getIndexBuffer(); | |
| 194 | − gpu::BufferView::Index numIndexes = (gpu::BufferView::Index)mesh->getNumIndices(); | |
| 195 | − for (gpu::BufferView::Index i = 0; i < numIndexes; i ++) { | |
| 196 | − uint32_t index = indexBufferView.get<uint32_t>(i); | |
| 197 | − memcpy(indexDataCursor, &index, sizeof(index)); | |
| 198 | − indexDataCursor += sizeof(index); | |
| 245 | + MeshPointer mesh = meshProxy->getMeshPointer(); | |
| 246 | + if (!mesh) { | |
| 247 | + return QScriptValue(false); | |
| 199 | 248 | } |
| 200 | 249 | |
| 201 | − model::MeshPointer result(new model::Mesh()); | |
| 202 | − | |
| 203 | − gpu::Element vertexElement = gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ); | |
| 204 | − gpu::Buffer* resultVertexBuffer = new gpu::Buffer(vertexSize, resultVertexData); | |
| 205 | − gpu::BufferPointer resultVertexBufferPointer(resultVertexBuffer); | |
| 206 | − gpu::BufferView resultVertexBufferView(resultVertexBufferPointer, vertexElement); | |
| 207 | − result->setVertexBuffer(resultVertexBufferView); | |
| 208 | − | |
| 209 | − gpu::Element normalElement = gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ); | |
| 210 | − gpu::Buffer* resultNormalsBuffer = new gpu::Buffer(normalSize, resultNormalData); | |
| 211 | − gpu::BufferPointer resultNormalsBufferPointer(resultNormalsBuffer); | |
| 212 | − gpu::BufferView resultNormalsBufferView(resultNormalsBufferPointer, normalElement); | |
| 213 | − result->addAttribute(attributeTypeNormal, resultNormalsBufferView); | |
| 214 | − | |
| 215 | − gpu::Element indexElement = gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::RAW); | |
| 216 | − gpu::Buffer* resultIndexesBuffer = new gpu::Buffer(indexSize, resultIndexData); | |
| 217 | − gpu::BufferPointer resultIndexesBufferPointer(resultIndexesBuffer); | |
| 218 | − gpu::BufferView resultIndexesBufferView(resultIndexesBufferPointer, indexElement); | |
| 219 | − result->setIndexBuffer(resultIndexesBufferView); | |
| 220 | − | |
| 221 | − | |
| 222 | − std::vector<model::Mesh::Part> parts; | |
| 223 | − parts.emplace_back(model::Mesh::Part((model::Index)0, // startIndex | |
| 224 | − (model::Index)result->getNumIndices(), // numIndices | |
| 225 | − (model::Index)0, // baseVertex | |
| 226 | − model::Mesh::TRIANGLES)); // topology | |
| 227 | − result->setPartBuffer(gpu::BufferView(new gpu::Buffer(parts.size() * sizeof(model::Mesh::Part), | |
| 228 | − (gpu::Byte*) parts.data()), gpu::Element::PART_DRAWCALL)); | |
| 229 | − | |
| 230 | − | |
| 231 | − | |
| 250 | + model::MeshPointer result = mesh->map([&](glm::vec3 position){ return glm::vec3(transform * glm::vec4(position, 1.0f)); }, | |
| 251 | + [&](glm::vec3 normal){ return glm::vec3(transform * glm::vec4(normal, 0.0f)); }, | |
| 252 | + [&](uint32_t index){ return index; }); | |
| 232 | 253 | MeshProxy* resultProxy = new MeshProxy(result); |
| 233 | 254 | return meshToScriptValue(_modelScriptEngine, resultProxy); |
| 234 | 255 | } |