28 Kokkos::View<const ShapeDesc*, CpMem> shapes,
bool px,
31 const long total = (long)rx * ry * rz;
33 const F3 vox{(dmax.
x -
dmin.x) / rx, (dmax.
y -
dmin.y) / ry, (dmax.
z -
dmin.z) / rz};
35 Kokkos::View<float*, CpMem> grid(
"sdf_grid", total);
36 Kokkos::View<int*, CpMem> state(
"sdf_state", total);
37 Kokkos::deep_copy(grid, 100.0f);
38 Kokkos::deep_copy(state, 0);
42 "peclet::dem::sdf::splat", Kokkos::RangePolicy<CpExec>(space, 0, numReal),
43 KOKKOS_LAMBDA(
int i) {
45 const F4 q =
loadF4(quat, i);
46 const float sc = scale(i);
47 const ShapeDesc shp = shapes(shapeId(i));
50 const float r = shp.params.x, h = shp.params.y;
51 rbound = Kokkos::sqrt(r * r + (h * 0.5f) * (h * 0.5f));
52 }
else if (shp.type ==
SPHERE)
53 rbound = shp.params.x;
55 rbound = shp.params.x;
59 int minx = (int)Kokkos::floor((pw.x - rbound - origin.x) / vox.x),
60 maxx = (
int)Kokkos::ceil((pw.x + rbound - origin.x) / vox.x);
61 int miny = (int)Kokkos::floor((pw.y - rbound - origin.y) / vox.y),
62 maxy = (
int)Kokkos::ceil((pw.y + rbound - origin.y) / vox.y);
63 int minz = (int)Kokkos::floor((pw.z - rbound - origin.z) / vox.z),
64 maxz = (
int)Kokkos::ceil((pw.z + rbound - origin.z) / vox.z);
66 minx = minx < 0 ? 0 : minx;
67 maxx = maxx > rx - 1 ? rx - 1 : maxx;
70 miny = miny < 0 ? 0 : miny;
71 maxy = maxy > ry - 1 ? ry - 1 : maxy;
74 minz = minz < 0 ? 0 : minz;
75 maxz = maxz > rz - 1 ? rz - 1 : maxz;
78 for (
int z = minz; z <= maxz; ++z)
79 for (
int y = miny; y <= maxy; ++y)
80 for (
int x = minx; x <= maxx; ++x) {
81 const F3 vp{origin.x + (x + 0.5f) * vox.x, origin.y + (y + 0.5f) * vox.y,
82 origin.z + (z + 0.5f) * vox.z};
83 const F3 prel =
sub3(vp, pw);
88 else if (shp.type ==
SPHERE)
92 const float dist = distc * sc;
93 const int wx = (x % rx + rx) % rx, wy = (y % ry + ry) % ry, wz = (z % rz + rz) % rz;
94 if (!px && (x < 0 || x >= rx))
96 if (!py && (y < 0 || y >= ry))
98 if (!pz && (z < 0 || z >= rz))
100 const long vi = (long)wz * rx * ry + (
long)wy * rx + wx;
101 Kokkos::atomic_min(&grid(vi), dist);
109 Kokkos::View<float*, CpMem> grid2(
"sdf_grid2", total);
110 const int iters = Kokkos::max(Kokkos::max(rx, ry), rz) * 4;
111 const float h = vox.x;
112 Kokkos::View<float*, CpMem> in = grid, out = grid2;
113 for (
int it = 0; it < iters; ++it) {
114 Kokkos::View<float*, CpMem> din = in, dout = out;
115 Kokkos::View<int*, CpMem> st = state;
116 Kokkos::parallel_for(
117 "peclet::dem::sdf::eikonal", Kokkos::RangePolicy<CpExec>(space, 0, total),
118 KOKKOS_LAMBDA(
long idx) {
120 dout(idx) = din(idx);
123 const long sy = rx, sz = (long)rx * ry;
124 const int z = (int)(idx / sz);
125 const long rem = idx % sz;
126 const int y = (int)(rem / sy), x = (int)(rem % sy);
127 float xm = 100.0f, xp = 100.0f, ym = 100.0f, yp = 100.0f, zm = 100.0f, zp = 100.0f;
131 xm = din(idx - 1 + rx);
135 xp = din(idx + 1 - rx);
139 ym = din((
long)z * sz + (
long)(ry - 1) * sy + x);
143 yp = din((
long)z * sz + x);
147 zm = din((
long)(rz - 1) * sz + (
long)y * sy + x);
151 zp = din((
long)y * sy + x);
152 float a = Kokkos::fmin(xm, xp), b = Kokkos::fmin(ym, yp), c = Kokkos::fmin(zm, zp);
168 float u = 100.0f, u1 = a + h;
172 const float d2 = 2.0f * h * h - (a - b) * (a - b);
173 float u2 = (d2 < 0.0f) ? 100.0f : (a + b + Kokkos::sqrt(d2)) * 0.5f;
177 const float s = a + b + c, qd = s * s - 3.0f * (a * a + b * b + c * c - h * h);
178 u = (qd < 0.0f) ? 100.0f : (s + Kokkos::sqrt(qd)) / 3.0f;
189 std::vector<float> h_grid(total);
190 auto hv = Kokkos::create_mirror_view(in);
191 Kokkos::deep_copy(hv, in);
192 for (
long i = 0; i < total; ++i)
std::vector< float > generateSdfKokkos(int rx, int ry, int rz, F3 dmin, F3 dmax, int numReal, PosView pos, QuatView quat, ScalarF scale, ScalarI shapeId, Kokkos::View< const ShapeDesc *, CpMem > shapes, bool px, bool py, bool pz, GridView sdfGrid=GridView{})