diff options
Diffstat (limited to 'src/test.c')
-rw-r--r-- | src/test.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/src/test.c b/src/test.c new file mode 100644 index 0000000..7c0389e --- /dev/null +++ b/src/test.c @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2018 Vito Caputo - <vcaputo@pengaru.com> + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 3 as published + * by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + + +#include <assert.h> +#include <stdio.h> + +#include <ix3.h> + +typedef struct v3f_t { + float x, y, z; +} v3f_t; + +typedef struct bb3f_t { + v3f_t min, max; +} bb3f_t; + + +ix3_search_status_t cb(void *cb_context, ix3_object_t *ix3_object, v3f_t *ix3_object_position, bb3f_t *ix3_object_aabb, void *object) +{ + fprintf(stderr, "found %p ix3_object=%p ix3_object_aabb=%f,%f,%f ... %f,%f,%f\n", cb_context, ix3_object, + ix3_object_aabb->min.x, ix3_object_aabb->min.y, ix3_object_aabb->min.z, + ix3_object_aabb->max.x, ix3_object_aabb->max.y, ix3_object_aabb->max.z); + + return IX3_SEARCH_CONTINUE; +} + +typedef struct object_t { + bb3f_t aabb; + ix3_object_t *ix; +} object_t; + +int main(int argc, char *argv[]) +{ + object_t objects[] = { + { .aabb = {{ -1.f, -1.f, -1.f }, { 1.f, 1.f, 1.f }} }, + { .aabb = {{ -.2f, -.2f, -.2f }, { -.1f, -.1f, -.1f }} }, + { .aabb = {{ -.2f, .2f, -.2f }, { -.1f, .3f, -.1f }} }, + { .aabb = {{ .1f, .1f, .1f }, { .2f, .2f, .2f }} }, + { .aabb = {{ -.2f, -.2f, -.2f }, { .1f, .1f, .1f }} }, + { .aabb = {{ -.1f, -.1f, -.1f }, { .2f, .2f, .2f }} }, + }; + + ix3_object_t *o, *j; + ix3_t *ix3; + + ix3 = ix3_new(NULL, 2, 8); + if (!ix3) { + fprintf(stderr, "unable to create index\n"); + return 1; + } + + for (int i = 0; i < sizeof(objects) / sizeof(*objects); i++) { + objects[i].ix = ix3_object_new(ix3, NULL, NULL, &objects[i].aabb, &objects[i]); + if (!o) { + fprintf(stderr, "unable to insert object %i\n", i); + return 1; + } + } + + for (int i = 0; i < sizeof(objects) / sizeof(*objects); i++) { + /* TODO: actually verify the expected objects are hit */ + if (!ix3_search_by_point(ix3, &objects[i].aabb.min, cb, &objects[i])) { + fprintf(stderr, "unable to lookup object %i by min point\n", i); + return 1; + } + + if (!ix3_search_by_point(ix3, &objects[i].aabb.max, cb, &objects[i])) { + fprintf(stderr, "unable to lookup object %i by max point\n", i); + return 1; + } + } + + for (int i = 0; i < sizeof(objects) / sizeof(*objects); i++) { + /* TODO: actually verify the expected objects are hit */ + if (!ix3_search_by_aabb(ix3, NULL, NULL, &objects[i].aabb, cb, &objects[i])) { + fprintf(stderr, "unable to lookup object %i by perfect aabb\n", i); + return 1; + } + } + + for (int i = 0; i < sizeof(objects) / sizeof(*objects); i++) + ix3_object_free(ix3, objects[i].ix); + + ix3_free(ix3); + + return 0; +} |