History

ModelScriptingInterface::appendMeshes

Seth Alves committed 9 years ago

Commit 200550a1 parent a3fadbc4 files · +94 −3Browse files

Showing the changes to libraries/script-engine/src/ModelScriptingInterface.cpp (1 of 4 files). Show all

Unified · Split

libraries/script-engine/src/ModelScriptingInterface.cpp+88−1
@@ -12,11 +12,12 @@ · 11 unmodified lines
12#include <QScriptEngine>12#include <QScriptEngine>
13#include <QScriptValueIterator>13#include <QScriptValueIterator>
14#include <QtScript/QScriptValue>14#include <QtScript/QScriptValue>
15#include "ScriptEngine.h"
15#include "ModelScriptingInterface.h"16#include "ModelScriptingInterface.h"
16#include "OBJWriter.h"17#include "OBJWriter.h"
17 18
18
19ModelScriptingInterface::ModelScriptingInterface(QObject* parent) : QObject(parent) {19ModelScriptingInterface::ModelScriptingInterface(QObject* parent) : QObject(parent) {
20 _modelScriptEngine = qobject_cast<ScriptEngine*>(parent);
20}21}
21 22
22QScriptValue meshToScriptValue(QScriptEngine* engine, MeshProxy* const &in) {23QScriptValue meshToScriptValue(QScriptEngine* engine, MeshProxy* const &in) {
@@ -51,3 +52,89 @@ QString ModelScriptingInterface::meshToOBJ(MeshProxyList in) { · 28 unmodified lines
51 52
52 return writeOBJToString(meshes);53 return writeOBJToString(meshes);
53}54}
55
56
57QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) {
58 model::MeshPointer result(new model::Mesh());
59 int attributeTypeNormal = gpu::Stream::InputSlot::NORMAL; // libraries/gpu/src/gpu/Stream.h
60
61 size_t totalVertexCount { 0 };
62 size_t totalAttributeCount { 0 };
63 size_t totalIndexCount { 0 };
64 foreach (const MeshProxy* meshProxy, in) {
65 MeshPointer mesh = meshProxy->getMeshPointer();
66 totalVertexCount += mesh->getNumVertices();
67 totalAttributeCount += mesh->getNumAttributes();
68 totalIndexCount += mesh->getNumIndices();
69 }
70
71 gpu::Resource::Size combinedVertexSize = totalVertexCount * sizeof(glm::vec3);
72 unsigned char* combinedVertexData = new unsigned char[combinedVertexSize];
73 unsigned char* combinedVertexDataCursor = combinedVertexData;
74
75 gpu::Resource::Size combinedNormalSize = totalVertexCount * sizeof(glm::vec3);
76 unsigned char* combinedNormalData = new unsigned char[combinedNormalSize];
77 unsigned char* combinedNormalDataCursor = combinedNormalData;
78
79 gpu::Resource::Size combinedIndexSize = totalVertexCount * sizeof(uint32_t);
80 unsigned char* combinedIndexData = new unsigned char[combinedIndexSize];
81 unsigned char* combinedIndexDataCursor = combinedIndexData;
82
83 uint32_t indexStartOffset { 0 };
84
85 foreach (const MeshProxy* meshProxy, in) {
86 MeshPointer mesh = meshProxy->getMeshPointer();
87
88 // vertex data
89 const gpu::BufferView& vertexBufferView = mesh->getVertexBuffer();
90 gpu::BufferView::Index numVertices = (gpu::BufferView::Index)mesh->getNumVertices();
91 for (gpu::BufferView::Index i = 0; i < numVertices; i ++) {
92 glm::vec3 pos = vertexBufferView.get<glm::vec3>(i);
93 memcpy(combinedVertexDataCursor, &pos, sizeof(pos));
94 combinedVertexDataCursor += sizeof(pos);
95 }
96
97 // normal data
98 const gpu::BufferView& normalsBufferView = mesh->getAttributeBuffer(attributeTypeNormal);
99 gpu::BufferView::Index numNormals = (gpu::BufferView::Index)mesh->getNumAttributes();
100 for (gpu::BufferView::Index i = 0; i < numNormals; i ++) {
101 glm::vec3 normal = normalsBufferView.get<glm::vec3>(i);
102 memcpy(combinedNormalDataCursor, &normal, sizeof(normal));
103 combinedNormalDataCursor += sizeof(normal);
104 }
105 // TODO -- other attributes
106
107 // face data
108 const gpu::BufferView& indexBufferView = mesh->getIndexBuffer();
109 gpu::BufferView::Index numIndexes = (gpu::BufferView::Index)mesh->getNumAttributes();
110 for (gpu::BufferView::Index i = 0; i < numIndexes; i ++) {
111 uint32_t index = indexBufferView.get<uint32_t>(i);
112 index += indexStartOffset;
113 memcpy(combinedIndexDataCursor, &index, sizeof(index));
114 combinedIndexDataCursor += sizeof(index);
115 }
116
117 indexStartOffset += numVertices;
118 }
119
120 gpu::Element vertexElement = gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ);
121 gpu::Buffer* combinedVertexBuffer = new gpu::Buffer(combinedVertexSize, combinedVertexData);
122 gpu::BufferPointer combinedVertexBufferPointer(combinedVertexBuffer);
123 gpu::BufferView combinedVertexBufferView(combinedVertexBufferPointer, vertexElement);
124 result->setVertexBuffer(combinedVertexBufferView);
125
126 gpu::Element normalElement = gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ);
127 gpu::Buffer* combinedNormalsBuffer = new gpu::Buffer(combinedNormalSize, combinedNormalData);
128 gpu::BufferPointer combinedNormalsBufferPointer(combinedNormalsBuffer);
129 gpu::BufferView combinedNormalsBufferView(combinedNormalsBufferPointer, normalElement);
130 result->addAttribute(attributeTypeNormal, combinedNormalsBufferView);
131
132 gpu::Element indexElement = gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::RAW);
133 gpu::Buffer* combinedIndexesBuffer = new gpu::Buffer(combinedIndexSize, combinedIndexData);
134 gpu::BufferPointer combinedIndexesBufferPointer(combinedIndexesBuffer);
135 gpu::BufferView combinedIndexesBufferView(combinedIndexesBufferPointer, indexElement);
136 result->setIndexBuffer(combinedIndexesBufferView);
137
138 MeshProxy* resultProxy = new MeshProxy(result);
139 return meshToScriptValue(_modelScriptEngine, resultProxy);
140}