3#include "Module/ApplyBumpMap2TriangleSet.h"
5#include "GLSurfaceVisualModule.h"
9 template<typename TDataType>
10 LargeOcean<TDataType>::LargeOcean()
11 : OceanBase<TDataType>()
13 auto ts = std::make_shared<TriangleSet<TDataType>>();
14 this->stateTriangleSet()->setDataPtr(ts);
17 this->varFileName()->setValue(getAssetPath() + "ocean/OceanPlane.obj");
19 auto mapper = std::make_shared<ApplyBumpMap2TriangleSet<DataType3f>>();
20 this->stateTriangleSet()->connect(mapper->inTriangleSet());
21 this->stateHeightField()->connect(mapper->inHeightField());
22 this->graphicsPipeline()->pushModule(mapper);
24 auto sRender = std::make_shared<GLSurfaceVisualModule>();
25 sRender->setColor(Color(0, 0.2, 1.0));
26 sRender->varUseVertexNormal()->setValue(true);
27 mapper->outTriangleSet()->connect(sRender->inTriangleSet());
28 this->graphicsPipeline()->pushModule(sRender);
31 template<typename TDataType>
32 LargeOcean<TDataType>::~LargeOcean()
36 template <typename Coord3D>
37 __global__ void LO_CalculateTexCoord(
38 DArray<Vec2f> texCoords,
39 DArray<Coord3D> vertices)
41 int tId = threadIdx.x + blockIdx.x * blockDim.x;
42 if (tId >= vertices.size()) return;
44 Coord3D vert = vertices[tId];
46 //TODO: expose the parameter
47 float scale = 1 / 512.0f;
51 float u = vert.x - floor(vert.x);
52 float v = vert.z - floor(vert.z);
54 texCoords[tId] = Vec2f(u, v);
57 template <typename Coord3D, typename Coord4D>
58 __global__ void LO_UpdateBumpMap(
59 DArray2D<Coord4D> bumpMap,
60 DArray2D<Coord3D> displacement)
62 unsigned int i = blockIdx.x * blockDim.x + threadIdx.x;
63 unsigned int j = blockIdx.y * blockDim.y + threadIdx.y;
64 if (i < displacement.nx() && j < displacement.ny())
66 Coord3D disp_ij = displacement(i, j);
75 bumpMap(i, j) = pixel;
79 template<typename TDataType>
80 void LargeOcean<TDataType>::resetStates()
82 auto patch = this->getOceanPatch();
84 auto topo = patch->stateHeightField()->constDataPtr();
85 auto& disp = topo->getDisplacement();
87 auto ts = this->stateTriangleSet()->constDataPtr();
89 auto name = this->varFileName()->getValue().string();
90 if (name != mFileName)
92 ts->loadObjFile(name);
96 this->stateTexCoord()->resize(ts->getPointSize());
97 this->stateBumpMap()->resize(disp.nx(), disp.ny());
99 cuExecute(ts->getPointSize(),
100 LO_CalculateTexCoord,
101 this->stateTexCoord()->getData(),
104 cuExecute2D(make_uint2(disp.nx(), disp.ny()),
106 this->stateBumpMap()->getData(),
109 this->stateHeightField()->setDataPtr(topo);
112 template<typename TDataType>
113 void LargeOcean<TDataType>::updateStates()
115 this->stateHeightField()->tick();
118 DEFINE_CLASS(LargeOcean);