1#include "TextureMeshToTriangleSet.h"
5 IMPLEMENT_TCLASS(TextureMeshToTriangleSet, TDataType)
7 template<typename TDataType>
8 TextureMeshToTriangleSet<TDataType>::TextureMeshToTriangleSet()
11 this->inTransform()->tagOptional(true);
14 template<typename TDataType>
15 TextureMeshToTriangleSet<TDataType>::~TextureMeshToTriangleSet()
20 template <typename Coord, typename Transform>
21 __global__ void TM2TS_TransformVertices(
22 DArray<Coord> vertices,
23 DArray<uint> shapeIds,
24 DArray<Transform> localTransform,
25 DArrayList<Transform> globalTransform)
27 int tId = threadIdx.x + (blockIdx.x * blockDim.x);
28 if (tId >= vertices.size()) return;
30 uint shapeId = shapeIds[tId];
31 Coord v = vertices[tId];
33 Transform locT = localTransform[shapeId];
34 //TODO: This is a temporary code
35 Transform globalT = globalTransform[shapeId][0];
37 Coord s = globalT.scale();
39 vertices[tId] = globalT.rotation() * Coord(v.x * s.x, v.y * s.y, v.z * s.z) + globalT.translation();
42 template <typename Coord, typename Transform>
43 __global__ void TransformVertices(
44 DArray<Coord> vertices,
45 DArray<uint> shapeIds,
46 DArray<Transform> localTransform
49 int tId = threadIdx.x + (blockIdx.x * blockDim.x);
50 if (tId >= vertices.size()) return;
52 uint shapeId = shapeIds[tId];
53 Coord v = vertices[tId];
55 Transform locT = localTransform[shapeId];
56 Coord s = locT.scale();
58 vertices[tId] = locT.rotation() * Coord(v.x * s.x, v.y * s.y, v.z * s.z) + locT.translation();
63 template<typename TDataType>
64 bool TextureMeshToTriangleSet<TDataType>::apply()
66 if (this->outTriangleSet()->isEmpty()) {
67 this->outTriangleSet()->allocate();
70 auto mesh = this->inTextureMesh()->constDataPtr();
73 for (uint i = 0; i < mesh->shapes().size(); i++) {
74 indexNum += mesh->shapes()[i]->vertexIndex.size();
77 auto ts = this->outTriangleSet()->getDataPtr();
79 auto& vertices = ts->getPoints();
80 auto& indices = ts->getTriangles();
82 vertices.assign(mesh->vertices());
84 if (indices.size() != indexNum)
86 indices.resize(indexNum);
90 for (uint i = 0; i < mesh->shapes().size(); i++) {
91 uint num = mesh->shapes()[i]->vertexIndex.size();
92 indices.assign(mesh->shapes()[i]->vertexIndex, num, offset, 0);
97 if (!this->inTransform()->isEmpty())
99 uint N = mesh->shapes().size();
100 CArray<Transform> hostT(N);
101 DArray<Transform> devT(N);
103 for (uint i = 0; i < N; i++)
105 hostT[i] = mesh->shapes()[i]->boundingTransform;
110 cuExecute(vertices.size(),
111 TM2TS_TransformVertices,
115 this->inTransform()->constData());
122 uint N = mesh->shapes().size();
123 CArray<Transform> hostT(N);
124 DArray<Transform> devT(N);
126 for (uint i = 0; i < N; i++)
128 hostT[i] = mesh->shapes()[i]->boundingTransform;
133 cuExecute(vertices.size(),
149 DEFINE_CLASS(TextureMeshToTriangleSet);
152 IMPLEMENT_TCLASS(TextureMeshToTriangleSetNode, TDataType);
154 template<typename TDataType>
155 TextureMeshToTriangleSetNode<TDataType>::TextureMeshToTriangleSetNode()
158 this->setForceUpdate(false);
160 mTM2TS = std::make_shared<TextureMeshToTriangleSet<TDataType>>();
162 this->inTextureMesh()->connect(mTM2TS->inTextureMesh());
163 mTM2TS->outTriangleSet()->connect(this->outTriangleSet());
166 template<typename TDataType>
167 void TextureMeshToTriangleSetNode<TDataType>::resetStates()
169 auto mesh = this->inTextureMesh()->constDataPtr();
171 uint N = mesh->shapes().size();
173 CArrayList<Transform3f> hostT;
176 for (uint i = 0; i < N; i++)
178 hostT[i].insert(mesh->shapes()[i]->boundingTransform);
181 mTM2TS->inTransform()->assign(hostT);
188 template<typename TDataType>
189 void TextureMeshToTriangleSetNode<TDataType>::updateStates()
191 auto mesh = this->inTextureMesh()->constDataPtr();
193 uint N = mesh->shapes().size();
195 CArrayList<Transform3f> hostT;
198 for (uint i = 0; i < N; i++)
200 hostT[i].insert(mesh->shapes()[i]->boundingTransform);
203 mTM2TS->inTransform()->assign(hostT);
210 DEFINE_CLASS(TextureMeshToTriangleSetNode);