summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ix3.c43
-rw-r--r--src/ix3.h7
-rw-r--r--src/test.c2
3 files changed, 35 insertions, 17 deletions
diff --git a/src/ix3.c b/src/ix3.c
index 29ee4e7..ea8e46d 100644
--- a/src/ix3.c
+++ b/src/ix3.c
@@ -676,13 +676,22 @@ unsigned ix3_search_by_point(ix3_t *ix3, v3f_t *point, ix3_search_cb cb, void *c
ix3_object_t *o = ref->object;
r = cb(cb_context, o, &o->position, &o->aabb, o->object);
- if (r == IX3_SEARCH_STOP) {
+ switch (r) {
+ case IX3_SEARCH_STOP_HIT:
+ n_hits++;
+
+ case IX3_SEARCH_STOP_MISS:
+ return n_hits;
+
+ case IX3_SEARCH_MORE_HIT:
n_hits++;
- break;
- }
- if (r == IX3_SEARCH_IGNORE)
+ case IX3_SEARCH_MORE_MISS:
continue;
+
+ default:
+ assert(0);
+ }
}
n_hits++;
@@ -772,22 +781,30 @@ unsigned ix3_search_by_aabb(ix3_t *ix3, v3f_t *search_position, v3f_t *search_or
ix3_search_status_t r;
r = cb(cb_context, o, &o->position, &o->aabb, o->object);
- if (r == IX3_SEARCH_STOP) {
+ switch (r) {
+ case IX3_SEARCH_STOP_HIT:
n_hits++;
- break;
- }
- if (r == IX3_SEARCH_IGNORE)
+ case IX3_SEARCH_STOP_MISS:
+ /* XXX: this is necessary, the hits nodes must be kept movable */
+ list_for_each_entry_safe(o, _o, &hits, hits)
+ list_del_init(&o->hits);
+
+ return n_hits;
+
+ case IX3_SEARCH_MORE_HIT:
+ n_hits++;
+
+ case IX3_SEARCH_MORE_MISS:
continue;
+
+ default:
+ assert(0);
+ }
}
n_hits++;
}
- /* just in case the search was aborted, finish deleting these nodes */
- /* FIXME: this whole hit list thing is pretty janky */
- list_for_each_entry_safe(o, _o, &hits, hits)
- list_del_init(&o->hits);
-
return n_hits;
}
diff --git a/src/ix3.h b/src/ix3.h
index 81feaca..f850b81 100644
--- a/src/ix3.h
+++ b/src/ix3.h
@@ -23,9 +23,10 @@ typedef struct bb3f_t bb3f_t;
typedef struct v3f_t v3f_t;
typedef enum ix3_search_status_t {
- IX3_SEARCH_STOP,
- IX3_SEARCH_IGNORE,
- IX3_SEARCH_CONTINUE
+ IX3_SEARCH_STOP_MISS,
+ IX3_SEARCH_STOP_HIT,
+ IX3_SEARCH_MORE_MISS,
+ IX3_SEARCH_MORE_HIT,
} ix3_search_status_t;
typedef ix3_search_status_t (*ix3_search_cb)(void *cb_context, ix3_object_t *ix3_object, v3f_t *ix3_object_position, bb3f_t *ix3_object_aabb, void *object);
diff --git a/src/test.c b/src/test.c
index c8736b8..0110197 100644
--- a/src/test.c
+++ b/src/test.c
@@ -35,7 +35,7 @@ ix3_search_status_t cb(void *cb_context, ix3_object_t *ix3_object, v3f_t *ix3_ob
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;
+ return IX3_SEARCH_MORE_HIT;
}
typedef struct object_t {
© All Rights Reserved