PeriDyno 1.0.0
Loading...
Searching...
No Matches
LargeOcean.cu
Go to the documentation of this file.
1#include "LargeOcean.h"
2
3#include "Module/ApplyBumpMap2TriangleSet.h"
4
5#include "GLSurfaceVisualModule.h"
6
7namespace dyno
8{
9 template<typename TDataType>
10 LargeOcean<TDataType>::LargeOcean()
11 : OceanBase<TDataType>()
12 {
13 auto ts = std::make_shared<TriangleSet<TDataType>>();
14 this->stateTriangleSet()->setDataPtr(ts);
15
16 //Set default mesh
17 this->varFileName()->setValue(getAssetPath() + "ocean/OceanPlane.obj");
18
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);
23
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);
29 }
30
31 template<typename TDataType>
32 LargeOcean<TDataType>::~LargeOcean()
33 {
34 }
35
36 template <typename Coord3D>
37 __global__ void LO_CalculateTexCoord(
38 DArray<Vec2f> texCoords,
39 DArray<Coord3D> vertices)
40 {
41 int tId = threadIdx.x + blockIdx.x * blockDim.x;
42 if (tId >= vertices.size()) return;
43
44 Coord3D vert = vertices[tId];
45
46 //TODO: expose the parameter
47 float scale = 1 / 512.0f;
48
49 vert *= scale;
50
51 float u = vert.x - floor(vert.x);
52 float v = vert.z - floor(vert.z);
53
54 texCoords[tId] = Vec2f(u, v);
55 }
56
57 template <typename Coord3D, typename Coord4D>
58 __global__ void LO_UpdateBumpMap(
59 DArray2D<Coord4D> bumpMap,
60 DArray2D<Coord3D> displacement)
61 {
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())
65 {
66 Coord3D disp_ij = displacement(i, j);
67
68 Coord4D pixel;
69
70 pixel.x = disp_ij.x;
71 pixel.y = disp_ij.y;
72 pixel.z = disp_ij.z;
73 pixel.w = 0;
74
75 bumpMap(i, j) = pixel;
76 }
77 }
78
79 template<typename TDataType>
80 void LargeOcean<TDataType>::resetStates()
81 {
82 auto patch = this->getOceanPatch();
83
84 auto topo = patch->stateHeightField()->constDataPtr();
85 auto& disp = topo->getDisplacement();
86
87 auto ts = this->stateTriangleSet()->constDataPtr();
88
89 auto name = this->varFileName()->getValue().string();
90 if (name != mFileName)
91 {
92 ts->loadObjFile(name);
93 mFileName = name;
94 }
95
96 this->stateTexCoord()->resize(ts->getPointSize());
97 this->stateBumpMap()->resize(disp.nx(), disp.ny());
98
99 cuExecute(ts->getPointSize(),
100 LO_CalculateTexCoord,
101 this->stateTexCoord()->getData(),
102 ts->getPoints());
103
104 cuExecute2D(make_uint2(disp.nx(), disp.ny()),
105 LO_UpdateBumpMap,
106 this->stateBumpMap()->getData(),
107 disp);
108
109 this->stateHeightField()->setDataPtr(topo);
110 }
111
112 template<typename TDataType>
113 void LargeOcean<TDataType>::updateStates()
114 {
115 this->stateHeightField()->tick();
116 }
117
118 DEFINE_CLASS(LargeOcean);
119}
120