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..8436e61 --- /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 <ix2.h> + +typedef struct v2f_t { + float x, y; +} v2f_t; + +typedef struct aabb_t { + v2f_t min, max; +} aabb_t; + + +ix2_search_status_t cb(void *cb_context, ix2_object_t *ix2_object, aabb_t *ix2_object_aabb, void *object) +{ + fprintf(stderr, "found %p ix2_object=%p ix2_object_aabb=%f,%f ... %f,%f\n", cb_context, ix2_object, + ix2_object_aabb->min.x, ix2_object_aabb->min.y, ix2_object_aabb->max.x, ix2_object_aabb->max.y); + + return IX2_SEARCH_CONTINUE; +} + +typedef struct object_t { + aabb_t aabb; + ix2_object_t *ix; +} object_t; + +int main(int argc, char *argv[]) +{ + object_t objects[] = { + { .aabb = {{ -1.f, -1.f }, { 1.f, 1.f }} }, + { .aabb = {{ -.2f, -.2f }, { -.1f, -.1f }} }, + { .aabb = {{ -.2f, .2f }, { -.1f, .3f }} }, + { .aabb = {{ .1f, .1f }, { .2f, .2f }} }, + { .aabb = {{ -.2f, -.2f }, { .1f, .1f }} }, + { .aabb = {{ -.1f, -.1f }, { .2f, .2f }} }, + }; + aabb_t aabb = {{ -1.f, -1.f }, {1.f, 1.f }}; + + ix2_object_t *o, *j; + ix2_t *ix2; + + ix2 = ix2_new(&aabb, 2, 8); + if (!ix2) { + fprintf(stderr, "unable to create index\n"); + return 1; + } + + for (int i = 0; i < sizeof(objects) / sizeof(*objects); i++) { + objects[i].ix = ix2_insert_object(ix2, &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 (!ix2_search_by_point(ix2, &objects[i].aabb.min, cb, &objects[i])) { + fprintf(stderr, "unable to lookup object %i by min point\n", i); + return 1; + } + + if (!ix2_search_by_point(ix2, &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 (!ix2_search_by_aabb(ix2, &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++) + ix2_remove_object(ix2, objects[i].ix); + + ix2_free(ix2); + + return 0; +} |