| 1539 | } |
| 1540 | |
| 1541 | static void CollectInvClippers(HScene scene, uint16_t start_index, dmArray<InternalClippingNode>& clippers, ScopeContext& scope_context, uint16_t parent_index) { |
| 1542 | uint32_t index = start_index; |
| 1543 | InternalClippingNode* parent = 0x0; |
| 1544 | if (parent_index != INVALID_INDEX) { |
| 1545 | parent = &clippers[parent_index]; |
| 1546 | } |
| 1547 | while (index != INVALID_INDEX) |
| 1548 | { |
| 1549 | InternalNode* n = &scene->m_Nodes[index]; |
| 1550 | if (n->m_Node.m_Enabled) |
| 1551 | { |
| 1552 | switch (n->m_Node.m_ClippingMode) { |
| 1553 | case CLIPPING_MODE_STENCIL: |
| 1554 | { |
| 1555 | uint32_t clipper_index = clippers.Size(); |
| 1556 | clippers.SetSize(clipper_index + 1); |
| 1557 | InternalClippingNode& clipper = clippers.Back(); |
| 1558 | clipper.m_NodeIndex = index; |
| 1559 | clipper.m_ParentIndex = parent_index; |
| 1560 | clipper.m_NextNonInvIndex = INVALID_INDEX; |
| 1561 | clipper.m_VisibleRenderKey = ~0ULL; |
| 1562 | n->m_ClipperIndex = clipper_index; |
| 1563 | if (n->m_Node.m_ClippingInverted) { |
| 1564 | StencilScope* parent_scope = 0x0; |
| 1565 | if (parent != 0x0) { |
| 1566 | parent_scope = &parent->m_ChildScope; |
| 1567 | } |
| 1568 | UpdateScope(n, clipper.m_Scope, clipper.m_ChildScope, parent_scope, scope_context.m_InvClipperCount, 0, 0, scope_context.m_BitFieldOffset); |
| 1569 | ++scope_context.m_InvClipperCount; |
| 1570 | CollectInvClippers(scene, n->m_ChildHead, clippers, scope_context, clipper_index); |
| 1571 | } else { |
| 1572 | // append to linked list |
| 1573 | uint16_t* pointer = &scope_context.m_NonInvClipperHead; |
| 1574 | if (*pointer != INVALID_INDEX) { |
| 1575 | pointer = &clippers[scope_context.m_NonInvClipperTail].m_NextNonInvIndex; |
| 1576 | } |
| 1577 | *pointer = clipper_index; |
| 1578 | scope_context.m_NonInvClipperTail = clipper_index; |
| 1579 | ++scope_context.m_ClipperCount; |
| 1580 | } |
| 1581 | } |
| 1582 | break; |
| 1583 | case CLIPPING_MODE_NONE: |
| 1584 | n->m_ClipperIndex = parent_index; |
| 1585 | CollectInvClippers(scene, n->m_ChildHead, clippers, scope_context, parent_index); |
| 1586 | break; |
| 1587 | } |
| 1588 | } |
| 1589 | index = n->m_NextIndex; |
| 1590 | } |
| 1591 | } |
| 1592 | |
| 1593 | static void CollectClippers(HScene scene, uint16_t start_index, uint16_t bit_field_offset, uint16_t inv_clipper_count, dmArray<InternalClippingNode>& clippers, uint16_t parent_index) |
| 1594 | { |
no test coverage detected