1#include "HeightField.h"
10 IMPLEMENT_TCLASS(HeightField, TDataType)
12 template<typename TDataType>
13 HeightField<TDataType>::HeightField()
16 mDisplacement.resize(128, 128);
17 mDisplacement.reset();
19 mGridSpacing = Real(0.1);
21 mOrigin = Coord(-mGridSpacing * 64, Real(0), -mGridSpacing * 64);
24 template<typename TDataType>
25 HeightField<TDataType>::~HeightField()
27 mDisplacement.clear();
30 template<typename TDataType>
31 void HeightField<TDataType>::setExtents(uint nx, uint ny)
33 mDisplacement.resize(nx, ny);
34 mHeights.resize(nx, ny);
36 mDisplacement.reset();
40 template<typename TDataType>
41 uint HeightField<TDataType>::width()
43 return mDisplacement.nx();
46 template<typename TDataType>
47 uint HeightField<TDataType>::height()
49 return mDisplacement.ny();
52 template<typename TDataType>
53 void HeightField<TDataType>::copyFrom(HeightField<TDataType>& hf)
56 mGridSpacing = hf.mGridSpacing;
57 mDisplacement.assign(hf.mDisplacement);
58 mHeights.assign(hf.mHeights);
61 template <typename Real, typename Coord>
62 __global__ void PS_Scale(
66 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
67 if (pId >= vertex.size()) return;
69 vertex[pId] = vertex[pId] * s;
72 template<typename TDataType>
73 void HeightField<TDataType>::scale(Real s)
75 //cuExecute(m_coords.size(), PS_Scale, m_coords, s);
78 template <typename Coord>
79 __global__ void PS_Scale(
83 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
84 if (pId >= vertex.size()) return;
86 Coord pos_i = vertex[pId];
87 vertex[pId] = Coord(pos_i[0] * s[0], pos_i[1] * s[1], pos_i[2] * s[2]);
90 template<typename TDataType>
91 void HeightField<TDataType>::scale(Coord s)
93 //cuExecute(m_coords.size(), PS_Scale, m_coords, s);
96 template <typename Coord>
97 __global__ void PS_Translate(
101 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
102 if (pId >= vertex.size()) return;
104 vertex[pId] = vertex[pId] + t;
108 template<typename TDataType>
109 void HeightField<TDataType>::translate(Coord t)
111 //cuExecute(m_coords.size(), PS_Translate, m_coords, t);
113// uint pDims = cudaGridSize(m_coords.size(), BLOCK_SIZE);
115// PS_Translate << <pDims, BLOCK_SIZE >> > (
121 //Back tracing using the semi-Lagrangian scheme
122 template <typename Real, typename Coord>
123 __global__ void HF_RasterizeDisplacements(
124 DArray2D<Real> vertical,
125 DArray2D<Coord> displacements,
129 unsigned int i = blockIdx.x * blockDim.x + threadIdx.x;
130 unsigned int j = blockIdx.y * blockDim.y + threadIdx.y;
132 uint nx = displacements.nx();
133 uint ny = displacements.ny();
135 if (i < nx && j < ny)
137 Coord disp_ij = displacements(i, j);
139 Coord interp_ij = bilinear(displacements, i - disp_ij.x / h, j - disp_ij.z / h, LerpMode::REPEAT);
141 vertical(i, j) = interp_ij.y;
145 template<typename TDataType>
146 DArray2D<typename TDataType::Real>& HeightField<TDataType>::calculateHeightField()
148 uint nx = mDisplacement.nx();
149 uint ny = mDisplacement.ny();
151 if (nx != mHeights.nx() || ny != mHeights.ny()) {
152 mHeights.resize(nx, ny);
155 cuExecute2D(make_uint2(nx, ny),
156 HF_RasterizeDisplacements,
165 DEFINE_CLASS(HeightField);