/** * \brief Remove Current Walker State * * Remove and free an item from the end of the walker state * worklist. */ void BMW_state_remove(BMWalker *walker) { void *oldstate; oldstate = BMW_current_state(walker); BLI_remlink(&walker->states, oldstate); BLI_mempool_free(walker->worklist, oldstate); }
/** * \brief Reset Walker * * Frees all states from the worklist, resetting the walker * for reuse in a new walk. */ void BMW_reset(BMWalker *walker) { while (BMW_current_state(walker)) { BMW_state_remove(walker); } walker->depth = 0; BLI_gset_clear(walker->visit_set, NULL); BLI_gset_clear(walker->visit_set_alt, NULL); }
/** * \brief Reset Walker * * Frees all states from the worklist, resetting the walker * for reuse in a new walk. */ void BMW_reset(BMWalker *walker) { while (BMW_current_state(walker)) { BMW_state_remove(walker); } walker->depth = 0; BLI_ghash_free(walker->visithash, NULL, NULL); BLI_ghash_free(walker->secvisithash, NULL, NULL); walker->visithash = BLI_ghash_ptr_new("bmesh walkers 1"); walker->secvisithash = BLI_ghash_ptr_new("bmesh walkers sec 1"); }
/** * \brief Main Walking Function * * Steps a mesh walker forward by one element */ void *BMW_walk(BMWalker *walker) { void *current = NULL; while (BMW_current_state(walker)) { current = walker->step(walker); if (current) { return current; } } return NULL; }
void *BMW_begin(BMWalker *walker, void *start) { walker->begin(walker, start); return BMW_current_state(walker) ? walker->step(walker) : NULL; }