1#include "HeightFieldToTriangleSet.h"
5 template<typename TDataType>
6 HeightFieldToTriangleSet<TDataType>::HeightFieldToTriangleSet()
11 template<typename Real, typename Coord>
12 __global__ void SetupVerticesForHeightField(
13 DArray<Coord> vertices,
14 DArray2D<Coord> displacement,
20 int i = threadIdx.x + (blockIdx.x * blockDim.x);
21 int j = threadIdx.y + (blockIdx.y * blockDim.y);
23 if (i >= displacement.nx() || j >= displacement.ny()) return;
25 Coord di = displacement(i, j);
26 Coord v = Coord(origin.x + i * h + di.x, origin.y + di.y, origin.z + j * h + di.z);
28 vertices[i + j * displacement.nx()] = scale * v + translation;
31 template<typename Triangle>
32 __global__ void SetupTrianglesForHeightField(
33 DArray<Triangle> vertices,
37 int i = threadIdx.x + (blockIdx.x * blockDim.x);
38 int j = threadIdx.y + (blockIdx.y * blockDim.y);
40 if (i >= nx - 1 || j >= ny - 1) return;
43 uint v1 = i + 1 + j * nx;
45 uint v2 = i + (j + 1) * nx;
46 uint v3 = i + 1 + (j + 1) * nx;
48 Triangle t0(v1, v0, v2);
49 Triangle t1(v1, v2, v3);
51 uint offset = 2 * i + 2 * j * (nx - 1);
52 vertices[offset] = t0;
53 vertices[offset + 1] = t1;
56 template<typename TDataType>
57 bool HeightFieldToTriangleSet<TDataType>::apply()
59 if (this->outTriangleSet()->isEmpty())
61 this->outTriangleSet()->allocate();
64 auto heights = this->inHeightField()->getDataPtr();
66 auto triSet = this->outTriangleSet()->getDataPtr();
68 auto& vertices = triSet->getPoints();
69 auto& indices = triSet->getTriangles();
71 int numOfVertices = heights->width() * heights->height();
72 int numOfTriangles = 2 * (heights->width() - 1) * (heights->height() - 1);
74 vertices.resize(numOfVertices);
75 indices.resize(numOfTriangles);
78 auto& disp = heights->getDisplacement();
80 Real scale = this->varScale()->getData();
81 Coord translation = this->varTranslation()->getData();
87 SetupVerticesForHeightField,
91 heights->getGridSpacing(),
95 dim.x = disp.nx() - 1;
96 dim.y = disp.ny() - 1;
98 SetupTrianglesForHeightField,
108 DEFINE_CLASS(HeightFieldToTriangleSet);