/** * @file iterator.h * @brief The work order handed to a registry sweep. * * There is no iterator object with a `next()` on it. Traversal is SDL's -- * `SDL_EnumerateProperties` over a registry -- and this struct is the `userdata` * carried into each callback, telling it *which* entries to touch and *what* to * do to each one. akgl_registry_iterate_actor and * akgl_registry_iterate_character are the callbacks that read it; * akgl_game_update, akgl_physics_simulate, and akgl_render_2d_draw_world are the * entry points that take one. * * The operations are independent bits, not an enum: a single sweep can update, * scale, and render, and they run in that fixed order regardless of how the bits * were set. Passing `NULL` where an `akgl_Iterator *` is expected is not an * error at the top-level entry points -- each substitutes its own default set -- * but it *is* an error once inside a callback. */ #ifndef _AKGL_ITERATOR_H_ #define _AKGL_ITERATOR_H_ /** @brief Selects operations and an optional layer for actor traversal. */ typedef struct { uint32_t flags; /**< Bitwise OR of the `AKGL_ITERATOR_OP_*` values below. */ uint8_t layerid; /**< Layer to restrict the sweep to. Read only when #AKGL_ITERATOR_OP_LAYERMASK is set. */ } akgl_Iterator; #define AKGL_ITERATOR_OP_UPDATE 1 // 1 Call the actor's updatefunc #define AKGL_ITERATOR_OP_RENDER 1 << 1 // 2 Call the actor's renderfunc #define AKGL_ITERATOR_OP_RELEASE 1 << 2 // 4 Release the object back to its heap layer #define AKGL_ITERATOR_OP_LAYERMASK 1 << 3 // 8 Skip anything whose layer != layerid #define AKGL_ITERATOR_OP_TILEMAPSCALE 1 << 4 // 16 Scale actors to the tilemap; otherwise force scale 1.0 #define AKGL_ITERATOR_OP_UNDEFINED_5 1 << 5 // 32 #define AKGL_ITERATOR_OP_UNDEFINED_6 1 << 6 // 64 #define AKGL_ITERATOR_OP_UNDEFINED_7 1 << 7 // 128 #define AKGL_ITERATOR_OP_UNDEFINED_8 1 << 8 // 256 #define AKGL_ITERATOR_OP_UNDEFINED_9 1 << 9 // 512 #define AKGL_ITERATOR_OP_UNDEFINED_10 1 << 10 // 1024 #define AKGL_ITERATOR_OP_UNDEFINED_11 1 << 11 // 2048 #define AKGL_ITERATOR_OP_UNDEFINED_12 1 << 12 // 4096 #define AKGL_ITERATOR_OP_UNDEFINED_13 1 << 13 // 8192 #define AKGL_ITERATOR_OP_UNDEFINED_14 1 << 14 // 16384 #define AKGL_ITERATOR_OP_UNDEFINED_15 1 << 15 // 32768 #define AKGL_ITERATOR_OP_UNDEFINED_16 1 << 16 // 65536 #define AKGL_ITERATOR_OP_UNDEFINED_17 1 << 17 // 131072 #define AKGL_ITERATOR_OP_UNDEFINED_18 1 << 18 // 262144 #define AKGL_ITERATOR_OP_UNDEFINED_19 1 << 19 // 524288 #define AKGL_ITERATOR_OP_UNDEFINED_20 1 << 20 // 1048576 #define AKGL_ITERATOR_OP_UNDEFINED_21 1 << 21 // 2097152 #define AKGL_ITERATOR_OP_UNDEFINED_22 1 << 22 // 4194304 #define AKGL_ITERATOR_OP_UNDEFINED_23 1 << 23 // 8388608 #define AKGL_ITERATOR_OP_UNDEFINED_24 1 << 24 // 16777216 #define AKGL_ITERATOR_OP_UNDEFINED_25 1 << 25 // 33554432 #define AKGL_ITERATOR_OP_UNDEFINED_26 1 << 26 // 67108864 #define AKGL_ITERATOR_OP_UNDEFINED_27 1 << 27 // 134217728 #define AKGL_ITERATOR_OP_UNDEFINED_28 1 << 28 // 268435456 #define AKGL_ITERATOR_OP_UNDEFINED_29 1 << 29 // 536870912 #define AKGL_ITERATOR_OP_UNDEFINED_30 1 << 30 // 1073741824 #define AKGL_ITERATOR_OP_UNDEFINED_31 1 << 31 // 2147483648 #endif // _AKGL_ITERATOR_H_