1.3.64
 
Loading...
Searching...
No Matches
selfTest.cpp
1#include "VoxelIntersection.h"
2
3#define DOCTEST_CONFIG_IMPLEMENT
4#include <doctest.h>
5#include "doctest_utils.h"
6
7using namespace helios;
8
9DOCTEST_TEST_CASE("VoxelIntersection - Patch with no slices") {
10 Context context;
11
12 // Create patch using center and size instead of vertices
13 vec3 patch_center = make_vec3(0.5, 0, 0.5);
14 vec2 patch_size = make_vec2(1, 1);
15
16 uint prim_UUID = context.addPatch(patch_center, patch_size);
17
18 vec3 grid_center = make_vec3(0, 1, 0);
19 vec3 grid_size = make_vec3(10, 10, 10);
20
21 VoxelIntersection voxelintersection(&context);
22 voxelintersection.disableMessages();
23
24 std::vector<uint> voxel_UUIDs = voxelintersection.slicePrimitivesUsingGrid(std::vector<uint>{prim_UUID}, grid_center, grid_size, make_int3(2, 2, 2));
25
26 DOCTEST_CHECK(voxel_UUIDs.size() >= 1);
27}
28
29DOCTEST_TEST_CASE("VoxelIntersection - Patch with one slice") {
30 Context context;
31
32 // Create patch using center and size instead of vertices
33 vec3 patch_center = make_vec3(0.5, 0, 0);
34 vec2 patch_size = make_vec2(2, 2);
35
36 uint prim_UUID = context.addPatch(patch_center, patch_size);
37
38 vec3 grid_center = make_vec3(0, 0, 0);
39 vec3 grid_size = make_vec3(1, 10, 10);
40
41 VoxelIntersection voxelintersection(&context);
42 voxelintersection.disableMessages();
43
44 std::vector<uint> voxel_UUIDs = voxelintersection.slicePrimitivesUsingGrid(std::vector<uint>{prim_UUID}, grid_center, grid_size, make_int3(2, 1, 1));
45
46 DOCTEST_CHECK(voxel_UUIDs.size() >= 1);
47}
48
49DOCTEST_TEST_CASE("VoxelIntersection - Patch with 2 slices") {
50 Context context;
51
52 // Create patch using center and size instead of vertices
53 vec3 patch_center = make_vec3(1, 0, 0);
54 vec2 patch_size = make_vec2(3, 1);
55
56 uint prim_UUID = context.addPatch(patch_center, patch_size);
57
58 vec3 grid_center = make_vec3(0, 0, 0);
59 vec3 grid_size = make_vec3(2, 10, 1);
60
61 VoxelIntersection voxelintersection(&context);
62 voxelintersection.disableMessages();
63
64 std::vector<uint> voxel_UUIDs = voxelintersection.slicePrimitivesUsingGrid(std::vector<uint>{prim_UUID}, grid_center, grid_size, make_int3(3, 1, 1));
65
66 DOCTEST_CHECK(voxel_UUIDs.size() >= 1);
67}
68
69DOCTEST_TEST_CASE("VoxelIntersection - Patch with 3 slices and no vertices inside voxel") {
70 Context context;
71
72 // Create patch using center and size instead of vertices
73 vec3 patch_center = make_vec3(2, 0, 0);
74 vec2 patch_size = make_vec2(3, 2);
75
76 uint prim_UUID = context.addPatch(patch_center, patch_size);
77
78 vec3 grid_center = make_vec3(0, 0, 0);
79 vec3 grid_size = make_vec3(4, 10, 10);
80
81 VoxelIntersection voxelintersection(&context);
82 voxelintersection.disableMessages();
83
84 std::vector<uint> voxel_UUIDs = voxelintersection.slicePrimitivesUsingGrid(std::vector<uint>{prim_UUID}, grid_center, grid_size, make_int3(4, 1, 1));
85
86 DOCTEST_CHECK(voxel_UUIDs.size() >= 1);
87}
88
89DOCTEST_TEST_CASE("VoxelIntersection - Areas after slicing (non-textured)") {
90 Context context;
91
92 // Create patch using center and size instead of vertices
93 vec3 patch_center = make_vec3(0, 0, 0);
94 vec2 patch_size = make_vec2(2, 2);
95
96 uint prim_UUID = context.addPatch(patch_center, patch_size);
97
98 float area_patch = context.getPrimitiveArea(prim_UUID);
99
100 vec3 grid_center = make_vec3(0, 0, 0);
101 vec3 grid_size = make_vec3(2, 10, 2);
102
103 VoxelIntersection voxelintersection(&context);
104 voxelintersection.disableMessages();
105
106 std::vector<uint> voxel_UUIDs = voxelintersection.slicePrimitivesUsingGrid(std::vector<uint>{prim_UUID}, grid_center, grid_size, make_int3(2, 1, 2));
107
108 float area_tot = 0;
109 for (uint UUID: voxel_UUIDs) {
110 area_tot += context.getPrimitiveArea(UUID);
111 }
112
113 DOCTEST_CHECK(fabs(area_tot - area_patch) / area_patch < 0.05f);
114}
115
116DOCTEST_TEST_CASE("VoxelIntersection - Textured areas after slicing") {
117 Context context;
118
119 // Create textured patch using center, size, and texture file
120 vec3 patch_center = make_vec3(0, 0, 0);
121 vec2 patch_size = make_vec2(2, 2);
122
123 uint prim_UUID = context.addPatch(patch_center, patch_size, make_SphericalCoord(0, 0), "lib/images/disk_texture.png");
124
125 float area_patch = context.getPrimitiveArea(prim_UUID);
126
127 vec3 grid_center = make_vec3(0, 0, 0);
128 vec3 grid_size = make_vec3(2, 10, 2);
129
130 VoxelIntersection voxelintersection(&context);
131 voxelintersection.disableMessages();
132
133 std::vector<uint> voxel_UUIDs = voxelintersection.slicePrimitivesUsingGrid(std::vector<uint>{prim_UUID}, grid_center, grid_size, make_int3(2, 1, 2));
134
135 float area_tot = 0;
136 for (uint UUID: voxel_UUIDs) {
137 area_tot += context.getPrimitiveArea(UUID);
138 }
139
140 DOCTEST_CHECK(fabs(area_tot - area_patch) / area_patch < 0.05f);
141}
142
143DOCTEST_TEST_CASE("VoxelIntersection - Cropping non-textured primitives") {
144 Context context;
145
146 // Create two triangles to form a quad (replacement for addPolygon)
147 uint tri1_UUID = context.addTriangle(make_vec3(-1, 0, 1), make_vec3(1, 0, 1), make_vec3(1, 0, -1));
148 uint tri2_UUID = context.addTriangle(make_vec3(1, 0, -1), make_vec3(-1, 0, -1), make_vec3(-1, 0, 1));
149 uint prim_UUID = tri1_UUID; // Use first triangle for the test
150
151 vec3 grid_center = make_vec3(0, 0, 0);
152 vec3 grid_size = make_vec3(1, 10, 1);
153
154 VoxelIntersection voxelintersection(&context);
155 voxelintersection.disableMessages();
156
157 // Test slicing the primitive within the voxel bounds
158 std::vector<uint> voxel_UUIDs = voxelintersection.slicePrimitivesUsingGrid(std::vector<uint>{prim_UUID}, grid_center, grid_size, make_int3(1, 1, 1));
159
160 DOCTEST_CHECK(voxel_UUIDs.size() >= 1);
161}
162
163DOCTEST_TEST_CASE("VoxelIntersection - Cropping textured primitives") {
164 Context context;
165
166 // Create textured patch using center, size, and texture file
167 vec3 patch_center = make_vec3(0, 0, 0);
168 vec2 patch_size = make_vec2(2, 2);
169
170 uint prim_UUID = context.addPatch(patch_center, patch_size, make_SphericalCoord(0, 0), "lib/images/disk_texture.png");
171
172 vec3 grid_center = make_vec3(0, 0, 0);
173 vec3 grid_size = make_vec3(1, 10, 1);
174
175 VoxelIntersection voxelintersection(&context);
176 voxelintersection.disableMessages();
177
178 // Test slicing the textured primitive within the voxel bounds
179 std::vector<uint> voxel_UUIDs = voxelintersection.slicePrimitivesUsingGrid(std::vector<uint>{prim_UUID}, grid_center, grid_size, make_int3(1, 1, 1));
180
181 DOCTEST_CHECK(voxel_UUIDs.size() >= 1);
182}
183
184DOCTEST_TEST_CASE("VoxelIntersection - Basic functionality test") {
185 Context context;
186
187 // Create patch using center and size instead of vertices
188 vec3 patch_center = make_vec3(0, 0, 0);
189 vec2 patch_size = make_vec2(2, 2);
190
191 uint prim_UUID = context.addPatch(patch_center, patch_size);
192
193 VoxelIntersection voxelintersection(&context);
194 voxelintersection.disableMessages();
195
196 // Test slicing the primitive within a grid
197 vec3 grid_center = make_vec3(0, 0, 0);
198 vec3 grid_size = make_vec3(3, 3, 3);
199 std::vector<uint> sliced_UUIDs = voxelintersection.slicePrimitivesUsingGrid(std::vector<uint>{prim_UUID}, grid_center, grid_size, make_int3(2, 1, 2));
200
201 // Check that slicing worked and produced some output
202 DOCTEST_CHECK(sliced_UUIDs.size() >= 1);
203}
204
205int VoxelIntersection::selfTest(int argc, char **argv) {
206 return helios::runDoctestWithValidation(argc, argv);
207}