14int main(
int argc,
char** argv) {
15 Kokkos::initialize(argc, argv);
16 std::vector<std::uint32_t> bits;
19 std::uint32_t st = 0xC0FFEEu;
20 auto u = [&](
float lo,
float hi) {
21 st = st * 1664525u + 1013904223u;
22 const float t = (float)((st >> 8) & 0xFFFFFFu) / (
float)0x1000000u;
23 return lo + (hi - lo) * t;
27 for (
int s = 0; s < 40; ++s) {
28 const F4 par{u(0.2f, 2.0f), u(0.2f, 2.0f), u(0.05f, 0.6f), 0.0f};
29 for (
int i = 0; i < 400; ++i) {
30 const F3 p{u(-3, 3), u(-3, 3), u(-3, 3)};
31 const float vals[4] = {sdfSphere(p, par), sdfBox(p, par), sdfHollowCylinder(p, par),
32 sdfEval(p, (i % 4), par)};
33 for (
float v : vals) {
35 std::memcpy(&b, &v, 4);
42 const int NX = 9,
NY = 7,
NZ = 6;
43 Kokkos::View<float*, CpMem> pool(
"pool", (std::size_t)
NX *
NY *
NZ);
44 auto hp = Kokkos::create_mirror_view(pool);
45 for (
int k = 0; k <
NZ; ++k)
46 for (
int j = 0; j <
NY; ++j)
47 for (
int i = 0; i <
NX; ++i) {
48 const float x = -1.0f + 0.3f * i, y = -1.0f + 0.3f * j, z = -1.0f + 0.3f * k;
49 hp(i +
NX * (j +
NY * k)) = Kokkos::sqrt(x * x + y * y + z * z) - 0.55f;
51 Kokkos::deep_copy(pool, hp);
54 sd.type = SHAPE_GRID_SDF;
59 sd.grid.origin = peclet::core::Vec3<float>{-1.0f, -1.0f, -1.0f};
60 sd.grid.invSpacing = peclet::core::Vec3<float>{1.0f / 0.3f, 1.0f / 0.3f, 1.0f / 0.3f};
61 sd.grid.extension = peclet::core::geom::GridExtension::kObject;
68 w.grid.origin = peclet::core::Vec3<float>{-1.0f, -1.0f, -1.0f};
69 w.grid.invSpacing = peclet::core::Vec3<float>{1.0f / 0.3f, 1.0f / 0.3f, 1.0f / 0.3f};
70 w.grid.extension = peclet::core::geom::GridExtension::kContainer;
73 Kokkos::View<float*, CpMem> out(
"out", 2 * NP);
74 std::vector<F3> pts(NP);
75 for (
int i = 0; i < NP; ++i)
76 pts[i] = F3{u(-2.5f, 2.0f), u(-2.5f, 2.0f), u(-2.5f, 2.0f)};
77 Kokkos::View<F3*, CpMem> dp(
"dp", NP);
78 auto hdp = Kokkos::create_mirror_view(dp);
79 for (
int i = 0; i < NP; ++i)
81 Kokkos::deep_copy(dp, hdp);
84 "cap", Kokkos::RangePolicy<CpExec>(0, NP), KOKKOS_LAMBDA(
int i) {
85 out(2 * i) = sampleGridSdf(dp(i), sd, pool);
86 out(2 * i + 1) = sampleWallSdf(dp(i), w, pool);
89 auto ho = Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace{}, out);
90 for (
int i = 0; i < 2 * NP; ++i) {
93 std::memcpy(&b, &v, 4);
98 Kokkos::View<ShapeDesc*, CpMem> shp(
"shp", 1);
99 auto hs = Kokkos::create_mirror_view(shp);
101 Kokkos::deep_copy(shp, hs);
102 Kokkos::View<float*, CpMem> out2(
"out2", NP);
103 Kokkos::parallel_for(
104 "cap2", Kokkos::RangePolicy<CpExec>(0, NP),
105 KOKKOS_LAMBDA(
int i) { out2(i) = sdfEvalShape(dp(i), shp(0), pool); });
107 auto ho2 = Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace{}, out2);
108 for (
int i = 0; i < NP; ++i) {
111 std::memcpy(&b, &v, 4);
117 std::FILE* f = std::fopen(argv[1],
"wb");
118 std::fwrite(bits.data(), 4, bits.size(), f);
120 std::printf(
"wrote %zu values to %s\n", bits.size(), argv[1]);