1#include "TextureMeshMerge.h"
2#include "GLPhotorealisticRender.h"
6 template<typename Vec3f>
7 __global__ void mergeVec3f(
14 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
15 if (pId >= target.size()) return;
18 target[pId] = v0[pId];
20 target[pId] = v1[pId - sizeV0];
23 template<typename Vec2f>
24 __global__ void mergeVec2f(
31 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
32 if (pId >= target.size()) return;
35 target[pId] = v0[pId];
37 target[pId] = v1[pId - sizeV0];
40 __global__ void mergeUint(
47 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
48 if (pId >= target.size()) return;
51 target[pId] = v0[pId];
53 target[pId] = v1[pId - sizeV0];
56 __global__ void mergeShapeId(
64 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
65 if (pId >= target.size()) return;
68 target[pId] = v0[pId];
70 target[pId] = v1[pId - sizeV0] + shapeSize;
73 template<typename Triangle>
74 __global__ void updateVertexIndex(
76 DArray<Triangle> target,
80 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
81 if (pId >= target.size()) return;
83 target[pId] = Triangle(v[pId][0] + offset, v[pId][1] + offset, v[pId][2] + offset);
86 template<typename TDataType>
87 TextureMeshMerge<TDataType>::TextureMeshMerge()
89 this->stateTextureMesh()->setDataPtr(std::make_shared<TextureMesh>());
91 auto render = std::make_shared<GLPhotorealisticRender>();
92 this->stateTextureMesh()->connect(render->inTextureMesh());
93 this->stateTextureMesh()->promoteOuput();
95 this->graphicsPipeline()->pushModule(render);
96 this->setForceUpdate(false);
99 template<typename TDataType>
100 TextureMeshMerge<TDataType>::~TextureMeshMerge()
104 template<typename TDataType>
105 void TextureMeshMerge<TDataType>::merge(const std::shared_ptr<TextureMesh>& texMesh01, const std::shared_ptr<TextureMesh>& texMesh02, std::shared_ptr<TextureMesh>& out)
107 auto vertices01 = texMesh01->vertices();
108 auto vertices02 = texMesh02->vertices();
110 out->vertices().resize(vertices01.size() + vertices02.size());
112 cuExecute(out->vertices().size(),
120 auto normals01 = texMesh01->normals();
121 auto normals02 = texMesh02->normals();
122 out->normals().resize(normals01.size() + normals02.size());
124 cuExecute(out->normals().size(),
132 auto texCoords01 = texMesh01->texCoords();
133 auto texCoords02 = texMesh02->texCoords();
134 out->texCoords().resize(texCoords01.size() + texCoords02.size());
136 cuExecute(out->texCoords().size(),
144 auto shapeIds01 = texMesh01->shapeIds();
145 auto shapeIds02 = texMesh02->shapeIds();
146 out->shapeIds().resize(shapeIds01.size() + shapeIds02.size());
148 cuExecute(out->texCoords().size(),
154 texMesh01->shapes().size()
158 auto material01 = texMesh01->materials();
159 auto material02 = texMesh02->materials();
161 auto outMaterials = out->materials();
162 outMaterials.clear();
164 for (auto it : material01)
165 outMaterials.push_back(it);
167 for (auto it : material02)
168 outMaterials.push_back(it);
171 auto shapes01 = texMesh01->shapes();
172 auto shapes02 = texMesh02->shapes();
174 std::vector<std::shared_ptr<Shape>> outShapes;
176 for (auto it : shapes01)
178 auto element = std::make_shared<Shape>();
179 element->vertexIndex.assign(it->vertexIndex);
180 element->normalIndex.assign(it->normalIndex);
181 element->texCoordIndex.assign(it->texCoordIndex);
182 element->boundingBox = it->boundingBox;
183 element->boundingTransform = it->boundingTransform;
184 element->material = it->material;
186 outShapes.push_back(element);
190 for (auto it : shapes02)
192 auto element = std::make_shared<Shape>();
193 element->vertexIndex.assign(it->vertexIndex);
194 element->normalIndex.assign(it->normalIndex);
195 element->texCoordIndex.assign(it->texCoordIndex);
196 element->boundingBox = it->boundingBox;
197 element->boundingTransform = it->boundingTransform;
198 element->material = it->material;
200 outShapes.push_back(element);
202 cuExecute(it->vertexIndex.size(),
205 element->vertexIndex,
209 cuExecute(it->normalIndex.size(),
212 element->normalIndex,
216 cuExecute(it->texCoordIndex.size(),
219 element->texCoordIndex,
225 out->shapes() = outShapes;
226 out->materials() = outMaterials;
232 template<typename TDataType>
233 void TextureMeshMerge<TDataType>::resetStates()
235 auto texMesh01 = this->inFirst()->constDataPtr();
236 auto texMesh02 = this->inSecond()->constDataPtr();
238 auto out = this->stateTextureMesh()->getDataPtr();
240 this->merge(texMesh01,texMesh02,out);
243 DEFINE_CLASS(TextureMeshMerge);