star-vx

Structuring voxels for ray-tracing
git clone git://git.meso-star.fr/star-vx.git
Log | Files | Refs | README | LICENSE

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:
Msrc/htvox.h | 4++--
Msrc/test_htvox_octree.c | 115+++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------
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);