diff options
| -rw-r--r-- | gfx/src/scene/scene_graph.h | 78 | 
1 files changed, 39 insertions, 39 deletions
| diff --git a/gfx/src/scene/scene_graph.h b/gfx/src/scene/scene_graph.h index 93d2e38..a26f828 100644 --- a/gfx/src/scene/scene_graph.h +++ b/gfx/src/scene/scene_graph.h | |||
| @@ -44,50 +44,50 @@ | |||
| 44 | /// - The node's parent cannot be the node's child or sibling, unless it's 0. | 44 | /// - The node's parent cannot be the node's child or sibling, unless it's 0. | 
| 45 | /// - If the node has a parent and the node is the leftmost sibling, then the | 45 | /// - If the node has a parent and the node is the leftmost sibling, then the | 
| 46 | /// parent's child is the node. | 46 | /// parent's child is the node. | 
| 47 | #define ASSERT_TREE_NODE_INVARIANT(ITEM) \ | 47 | #define ASSERT_TREE_NODE_INVARIANT(ITEM) \ | 
| 48 | { \ | 48 | { \ | 
| 49 | const gfx_idx item_idx = MEM_GET_INDEX(ITEM).val; \ | 49 | const gfx_idx item_idx = MEM_GET_INDEX(ITEM).val; \ | 
| 50 | assert((ITEM)->prev.val != item_idx); \ | 50 | assert((ITEM)->prev.val != item_idx); \ | 
| 51 | assert((ITEM)->next.val != item_idx); \ | 51 | assert((ITEM)->next.val != item_idx); \ | 
| 52 | if ((ITEM)->prev.val) { \ | 52 | if ((ITEM)->prev.val) { \ | 
| 53 | assert((ITEM)->prev.val != (ITEM)->next.val); \ | 53 | assert((ITEM)->prev.val != (ITEM)->next.val); \ | 
| 54 | } \ | 54 | } \ | 
| 55 | if ((ITEM)->child.val) { \ | 55 | if ((ITEM)->child.val) { \ | 
| 56 | assert((ITEM)->child.val != (ITEM)->prev.val); \ | 56 | assert((ITEM)->child.val != (ITEM)->prev.val); \ | 
| 57 | assert((ITEM)->child.val != (ITEM)->next.val); \ | 57 | assert((ITEM)->child.val != (ITEM)->next.val); \ | 
| 58 | } \ | 58 | } \ | 
| 59 | assert((ITEM)->parent.val != item_idx); \ | 59 | assert((ITEM)->parent.val != item_idx); \ | 
| 60 | if ((ITEM)->parent.val && !(ITEM)->prev.val) { \ | 60 | if ((ITEM)->parent.val && !(ITEM)->prev.val) { \ | 
| 61 | assert((ITEM)->parent.val != (ITEM)->prev.val); \ | 61 | assert((ITEM)->parent.val != (ITEM)->prev.val); \ | 
| 62 | assert((ITEM)->parent.val != (ITEM)->next.val); \ | 62 | assert((ITEM)->parent.val != (ITEM)->next.val); \ | 
| 63 | const typeof(ITEM) item_parent = MEM_GET((ITEM)->parent); \ | 63 | const __typeof__(ITEM) item_parent = MEM_GET((ITEM)->parent); \ | 
| 64 | assert(item_parent->child.val == item_idx); \ | 64 | assert(item_parent->child.val == item_idx); \ | 
| 65 | } \ | 65 | } \ | 
| 66 | } | 66 | } | 
| 67 | 67 | ||
| 68 | /// Prepend an item to a list. | 68 | /// Prepend an item to a list. | 
| 69 | /// Modify HEAD_INDEX to equal the index of the new head. | 69 | /// Modify HEAD_INDEX to equal the index of the new head. | 
| 70 | #define LIST_PREPEND(HEAD_INDEX, ITEM) \ | 70 | #define LIST_PREPEND(HEAD_INDEX, ITEM) \ | 
| 71 | (ITEM)->next = HEAD_INDEX; \ | 71 | (ITEM)->next = HEAD_INDEX; \ | 
| 72 | if (HEAD_INDEX.val) { \ | 72 | if (HEAD_INDEX.val) { \ | 
| 73 | typeof(ITEM) old_head = MEM_GET(HEAD_INDEX); \ | 73 | __typeof__(ITEM) old_head = MEM_GET(HEAD_INDEX); \ | 
| 74 | old_head->prev = MEM_GET_INDEX(ITEM); \ | 74 | old_head->prev = MEM_GET_INDEX(ITEM); \ | 
| 75 | } \ | 75 | } \ | 
| 76 | HEAD_INDEX = MEM_GET_INDEX(ITEM); \ | 76 | HEAD_INDEX = MEM_GET_INDEX(ITEM); \ | 
| 77 | ASSERT_LIST_NODE_INVARIANT(ITEM); | 77 | ASSERT_LIST_NODE_INVARIANT(ITEM); | 
| 78 | 78 | ||
| 79 | /// Disconnect an item from its siblings. | 79 | /// Disconnect an item from its siblings. | 
| 80 | #define LIST_REMOVE(ITEM) \ | 80 | #define LIST_REMOVE(ITEM) \ | 
| 81 | if ((ITEM)->prev.val) { \ | 81 | if ((ITEM)->prev.val) { \ | 
| 82 | typeof(ITEM) prev_sibling = MEM_GET((ITEM)->prev); \ | 82 | __typeof__(ITEM) prev_sibling = MEM_GET((ITEM)->prev); \ | 
| 83 | prev_sibling->next = (ITEM)->next; \ | 83 | prev_sibling->next = (ITEM)->next; \ | 
| 84 | } \ | 84 | } \ | 
| 85 | if ((ITEM)->next.val) { \ | 85 | if ((ITEM)->next.val) { \ | 
| 86 | typeof(ITEM) next_sibling = MEM_GET((ITEM)->next); \ | 86 | __typeof__(ITEM) next_sibling = MEM_GET((ITEM)->next); \ | 
| 87 | next_sibling->prev = (ITEM)->prev; \ | 87 | next_sibling->prev = (ITEM)->prev; \ | 
| 88 | } \ | 88 | } \ | 
| 89 | (ITEM)->prev.val = 0; \ | 89 | (ITEM)->prev.val = 0; \ | 
| 90 | (ITEM)->next.val = 0; \ | 90 | (ITEM)->next.val = 0; \ | 
| 91 | ASSERT_LIST_NODE_INVARIANT(ITEM); | 91 | ASSERT_LIST_NODE_INVARIANT(ITEM); | 
| 92 | 92 | ||
| 93 | /// Set the child's parent. | 93 | /// Set the child's parent. | 
| @@ -126,8 +126,8 @@ | |||
| 126 | /* The parent points only to its first/leftmost child. If this item is */ \ | 126 | /* The parent points only to its first/leftmost child. If this item is */ \ | 
| 127 | /* the leftmost sibling, then we need to rewire the parent to point to */ \ | 127 | /* the leftmost sibling, then we need to rewire the parent to point to */ \ | 
| 128 | /* the next sibling to keep the parent connected to its children. */ \ | 128 | /* the next sibling to keep the parent connected to its children. */ \ | 
| 129 | typeof(ITEM) parent = MEM_GET((ITEM)->parent); \ | 129 | __typeof__(ITEM) parent = MEM_GET((ITEM)->parent); \ | 
| 130 | const typeof(ITEM) parent_child = MEM_GET(parent->child); \ | 130 | const __typeof__(ITEM) parent_child = MEM_GET(parent->child); \ | 
| 131 | if (parent_child == ITEM) { \ | 131 | if (parent_child == ITEM) { \ | 
| 132 | assert((ITEM)->prev.val == 0); \ | 132 | assert((ITEM)->prev.val == 0); \ | 
| 133 | parent->child = (ITEM)->next; \ | 133 | parent->child = (ITEM)->next; \ | 
