diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ix2.c | 45 | ||||
-rw-r--r-- | src/ix2.h | 7 | ||||
-rw-r--r-- | src/test.c | 2 |
3 files changed, 36 insertions, 18 deletions
@@ -612,17 +612,26 @@ unsigned ix2_search_by_point(ix2_t *ix2, v2f_t *point, ix2_search_cb cb, void *c continue; if (cb) { - ix2_search_status_t r; ix2_object_t *o = ref->object; + ix2_search_status_t r; r = cb(cb_context, o, &o->position, &o->aabb, o->object); - if (r == IX2_SEARCH_STOP) { + switch (r) { + case IX2_SEARCH_STOP_HIT: n_hits++; - break; - } - if (r == IX2_SEARCH_IGNORE) + case IX2_SEARCH_STOP_MISS: + return n_hits; + + case IX2_SEARCH_MORE_HIT: + n_hits++; + + case IX2_SEARCH_MORE_MISS: continue; + + default: + assert(0); + } } n_hits++; @@ -712,22 +721,30 @@ unsigned ix2_search_by_aabb(ix2_t *ix2, v2f_t *search_position, v2f_t *search_or ix2_search_status_t r; r = cb(cb_context, o, &o->position, &o->aabb, o->object); - if (r == IX2_SEARCH_STOP) { + switch (r) { + case IX2_SEARCH_STOP_HIT: + n_hits++; + + case IX2_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 IX2_SEARCH_MORE_HIT: n_hits++; - break; - } - if (r == IX2_SEARCH_IGNORE) + case IX2_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; } @@ -23,9 +23,10 @@ typedef struct bb2f_t bb2f_t; typedef struct v2f_t v2f_t; typedef enum ix2_search_status_t { - IX2_SEARCH_STOP, - IX2_SEARCH_IGNORE, - IX2_SEARCH_CONTINUE + IX2_SEARCH_STOP_MISS, /* stop && current object is a miss */ + IX2_SEARCH_STOP_HIT, /* stop && current object is a hit */ + IX2_SEARCH_MORE_MISS, /* continue && current object is a miss */ + IX2_SEARCH_MORE_HIT, /* continue && current object is a miss */ } ix2_search_status_t; typedef ix2_search_status_t (*ix2_search_cb)(void *cb_context, ix2_object_t *ix2_object, v2f_t *ix2_object_position, bb2f_t *ix2_object_aabb, void *object); @@ -34,7 +34,7 @@ ix2_search_status_t cb(void *cb_context, ix2_object_t *ix2_object, v2f_t *ix2_ob 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; + return IX2_SEARCH_MORE_HIT; } typedef struct object_t { |