star-vx

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

commit 9000cccded657cc3713869fd9643efbc4cf3effe
parent 3e141ddbc625bc5d3a0958d60d6586dbfb8f1dc6
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Fri,  4 May 2018 15:44:21 +0200

Test the svx_tree_for_each_leaf function on binary trees

Diffstat:
Msrc/test_svx_bintree.c | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 51 insertions(+), 0 deletions(-)

diff --git a/src/test_svx_bintree.c b/src/test_svx_bintree.c @@ -18,6 +18,17 @@ #include "test_svx_utils.h" #include <rsys/math.h> + +struct leaves_context { + double lower; + double upper; + size_t nvoxels; + size_t depth; + enum svx_axis axis; + + size_t count; +}; + static void get(const size_t xyz[3], void* dst, void* ctx) { @@ -56,6 +67,36 @@ keep_max(void* dst, const void* voxels[], const size_t nvoxels, void* ctx) *vox_dst = max_val; } +static void +check_leaves + (const struct svx_voxel* leaf, + const size_t ileaf, + void* context) +{ + const double* dbl = NULL; + struct leaves_context* ctx = context; + double delta; + double lower; + + CHK(leaf != NULL); + CHK(leaf->data != NULL); + CHK(ctx != NULL); + CHK(leaf->lower[ctx->axis] < leaf->upper[ctx->axis]); + CHK(ileaf < ctx->nvoxels); + + dbl = leaf->data; + CHK(*dbl >= 0); + + delta = (ctx->upper - ctx->lower) / (double)ctx->nvoxels; + lower = *dbl * delta; + + CHK(eq_eps(lower, leaf->lower[ctx->axis], 1.e-6)); + CHK(eq_eps(lower+delta, leaf->upper[ctx->axis], 1.e-6)); + + CHK(leaf->depth == ctx->depth - 1); + ctx->count += 1; +} + int main(int argc, char** argv) { @@ -64,6 +105,7 @@ main(int argc, char** argv) struct mem_allocator allocator; struct svx_voxel_desc vox_desc = SVX_VOXEL_DESC_NULL; struct svx_tree_desc tree_desc = SVX_TREE_DESC_NULL; + struct leaves_context ctx; enum svx_axis axis; double low, upp; size_t nvxls; @@ -122,6 +164,15 @@ main(int argc, char** argv) CHK(NEW_TREE(dev, low, upp, nvxls, axis, &vox_desc, NULL) == RES_BAD_ARG); CHK(NEW_TREE(dev, low, upp, nvxls, axis, &vox_desc, &tree) == RES_OK); + ctx.lower = low; + ctx.upper = upp; + ctx.nvoxels = nvxls; + ctx.depth = 4; + ctx.axis = SVX_AXIS_Y; + ctx.count = 0; + CHK(svx_tree_for_each_leaf(tree, check_leaves, &ctx) == RES_OK); + CHK(ctx.count == 5); + CHK(svx_tree_get_desc(NULL, &tree_desc) == RES_BAD_ARG); CHK(svx_tree_get_desc(tree, NULL) == RES_BAD_ARG); CHK(svx_tree_get_desc(tree, &tree_desc) == RES_OK);