commit 3a5dd4bc4993914b918f777b8a69bcf4d8fa5e85
parent e5218c470d110658cc89de569d9a558c2a4d8b4d
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Fri, 2 Mar 2018 12:26:18 +0100
Push further the tests on the `at' accessor
Diffstat:
2 files changed, 85 insertions(+), 34 deletions(-)
diff --git a/src/htvox.h b/src/htvox.h
@@ -43,7 +43,7 @@
struct htvox_voxel {
const void* data; /* Data of the voxel */
size_t id; /* Indentifier of the voxel */
- size_t depth; /* Depth of the voxel into the hierarchy */
+ size_t depth; /* Depth of the voxel, in [0, htvox_octree_desc.depth[ */
int is_leaf; /* Define if the voxel is a leaf into the hierarchy */
};
@@ -90,7 +90,7 @@ struct htvox_octree_desc {
size_t nleaves; /* #leaves */
size_t nvoxels; /* #voxels, i.e. #leaves + #parents */
- size_t depth; /* Maximum depth of the octree */
+ size_t depth; /* Depth of the octree */
};
#define HTVOX_OCTREE_DESC_NULL__ \
diff --git a/src/test_htvox_octree.c b/src/test_htvox_octree.c
@@ -233,6 +233,88 @@ dump_data(FILE* stream, struct htvox_octree* oct)
CHK(htvox_octree_for_each_leaf(oct, write_scalars, stream) == RES_OK);
}
+static int
+max_lod
+ (const struct htvox_voxel* vox,
+ const double pos[3],
+ void* ctx)
+{
+ size_t* pdepth = ctx;
+
+ CHK(vox != NULL);
+ CHK(pos != NULL);
+ CHK(ctx != NULL);
+ CHK(vox->depth <= *pdepth);
+ return vox->depth < *pdepth;
+}
+
+
+static void
+test_at_accessor(struct htvox_octree* oct, const size_t nvoxels[3])
+{
+ struct htvox_octree_desc octdesc;
+ size_t nvxls;
+ double pos[3];
+ double delta[3];
+ size_t depth;
+ size_t x, y, z;
+
+ CHK(nvoxels != NULL);
+ CHK(htvox_octree_get_desc(oct, &octdesc) == RES_OK);
+
+ delta[0] = (octdesc.upper[0] - octdesc.lower[0])/(double)nvoxels[0];
+ delta[1] = (octdesc.upper[1] - octdesc.lower[1])/(double)nvoxels[1];
+ delta[2] = (octdesc.upper[2] - octdesc.lower[2])/(double)nvoxels[2];
+
+ nvxls = nvoxels[0];
+ nvxls = MMAX(nvxls, nvoxels[1]);
+ nvxls = MMAX(nvxls, nvoxels[2]);
+
+ depth = octdesc.depth;
+
+ while(depth-- != 0) {
+ const size_t iter = octdesc.depth - depth - 1;
+
+ FOR_EACH(x, 0, nvxls) {
+ pos[0] = octdesc.lower[0] + ((double)x+1.0/(1u<<(2+iter)))*delta[0];
+ if(x*(1u<<iter) >= nvoxels[0]) break;
+
+ FOR_EACH(y, 0, nvxls) {
+ pos[1] = octdesc.lower[1] + ((double)y+1.0/(1u<<(2+iter)))*delta[1];
+ if(y*(1u<<iter) >= nvoxels[1]) break;
+
+ FOR_EACH(z, 0, nvxls) {
+ struct htvox_voxel vox;
+ uint32_t ui3[3];
+ uint64_t mcode;
+
+ pos[2] = octdesc.lower[2] + ((double)z+1.0/(1u<<(2+iter)))*delta[2];
+ if(z*(1u<<iter) >= nvoxels[2]) break;
+
+ CHK(htvox_octree_at(oct, pos, max_lod, &depth, &vox) == RES_OK);
+ CHK(!HTVOX_VOXEL_NONE(&vox));
+
+ ui3[0] = (uint32_t)x * (1u << iter) + ((1u << iter) - 1);
+ ui3[1] = (uint32_t)y * (1u << iter) + ((1u << iter) - 1);
+ ui3[2] = (uint32_t)z * (1u << iter) + ((1u << iter) - 1);
+ ui3[0] = MMIN(ui3[0], (uint32_t)(nvoxels[0]-1));
+ ui3[1] = MMIN(ui3[1], (uint32_t)(nvoxels[1]-1));
+ ui3[2] = MMIN(ui3[2], (uint32_t)(nvoxels[2]-1));
+
+ mcode = morton_xyz_encode_u21(ui3);
+ CHK(*((double*)vox.data) == mcode);
+ CHK(vox.is_leaf == (octdesc.depth-1==depth));
+ CHK(vox.depth == depth);
+ }
+ }
+ }
+
+ nvxls = nvxls == 1 ? 0 : (nvxls + 1/*ceil*/) / 2;
+ d3_muld(delta, delta, 2);
+ }
+ CHK(nvxls == 0);
+}
+
int
main(int argc, char** argv)
{
@@ -243,12 +325,9 @@ main(int argc, char** argv)
struct htvox_octree_desc octdesc = HTVOX_OCTREE_DESC_NULL;
double low[3];
double upp[3];
- double pos[3];
- double delta[3];
size_t nvxls[3];
struct check_context ctx;
void* ptr = (void*)0xDECAFBAD;
- size_t x, y, z;
(void)argc, (void)argv;
CHK(mem_init_proxy_allocator(&allocator, &mem_default_allocator) == RES_OK);
@@ -328,35 +407,7 @@ main(int argc, char** argv)
CHK(d3_eq(octdesc.lower, low));
CHK(d3_eq(octdesc.upper, upp));
- delta[0] = (upp[0] - low[0])/(double)nvxls[0];
- delta[1] = (upp[1] - low[1])/(double)nvxls[1];
- delta[2] = (upp[2] - low[2])/(double)nvxls[2];
-
- FOR_EACH(x, 0, nvxls[0]) {
- pos[0] = low[0] + ((double)x + 0.5) * delta[0];
- FOR_EACH(y, 0, nvxls[1]) {
- pos[1] = low[1] + ((double)y + 0.5) * delta[1];
- FOR_EACH(z, 0, nvxls[2]) {
- struct htvox_voxel vox;
- uint32_t ui3[3];
- uint64_t mcode;
-
- pos[2] = low[2] + ((double)z + 0.5) * delta[2];
-
- ui3[0] = (uint32_t)x;
- ui3[1] = (uint32_t)y;
- ui3[2] = (uint32_t)z;
-
- CHK(htvox_octree_at(oct, pos, NULL, NULL, &vox) == RES_OK);
- CHK(!HTVOX_VOXEL_NONE(&vox));
-
- mcode = morton_xyz_encode_u21(ui3);
- CHK(*((double*)vox.data) == mcode);
- CHK(vox.is_leaf == 1);
- CHK(vox.depth == octdesc.depth);
- }
- }
- }
+ test_at_accessor(oct, nvxls);
CHK(htvox_octree_ref_put(oct) == RES_OK);