| 1614 | } |
| 1615 | |
| 1616 | static uint16_t CollectRenderEntries(HScene scene, uint16_t start_index, uint16_t order, dmArray<InternalClippingNode>& clippers, dmArray<RenderEntry>& render_entries) { |
| 1617 | #define PUSH_RENDER_ENTRY(e) \ |
| 1618 | if (render_entries.Full()) \ |
| 1619 | render_entries.OffsetCapacity(16U); \ |
| 1620 | render_entries.Push(e); |
| 1621 | |
| 1622 | uint16_t index = start_index; |
| 1623 | uint32_t active_nodes = 0; |
| 1624 | while (index != INVALID_INDEX) { |
| 1625 | InternalNode* n = &scene->m_Nodes[index]; |
| 1626 | if (n->m_Node.m_Enabled) { |
| 1627 | ++active_nodes; |
| 1628 | HNode node = GetNodeHandle(n); |
| 1629 | uint16_t layer = GetLayerIndex(scene, n); |
| 1630 | if (n->m_ClipperIndex != INVALID_INDEX) { |
| 1631 | InternalClippingNode& clipper = clippers[n->m_ClipperIndex]; |
| 1632 | if (clipper.m_NodeIndex == index) { |
| 1633 | uint64_t clipping_key = CalcRenderKey(layer, order++); |
| 1634 | uint64_t render_key = CalcRenderKey(layer, order++); |
| 1635 | |
| 1636 | order = CollectRenderEntries(scene, n->m_ChildHead, order, clippers, render_entries); |
| 1637 | |
| 1638 | clipper.m_VisibleRenderKey = render_key; |
| 1639 | |
| 1640 | RenderEntry entry; |
| 1641 | entry.m_Node = node; |
| 1642 | entry.m_RenderKey = clipping_key; |
| 1643 | |
| 1644 | PUSH_RENDER_ENTRY(entry); |
| 1645 | |
| 1646 | if (n->m_Node.m_ClippingVisible) { |
| 1647 | entry.m_RenderKey = render_key; |
| 1648 | PUSH_RENDER_ENTRY(entry); |
| 1649 | } |
| 1650 | |
| 1651 | index = n->m_NextIndex; |
| 1652 | continue; |
| 1653 | } |
| 1654 | } |
| 1655 | |
| 1656 | if (n->m_Node.m_NodeType == NODE_TYPE_PARTICLEFX) |
| 1657 | { |
| 1658 | HNode hnode = GetNodeHandle(n); |
| 1659 | uint32_t alive_count = scene->m_AliveParticlefxs.Size(); |
| 1660 | for (uint32_t i = 0; i < alive_count; ++i) |
| 1661 | { |
| 1662 | ParticlefxComponent* comp = &scene->m_AliveParticlefxs[i]; |
| 1663 | if (hnode == comp->m_Node) |
| 1664 | { |
| 1665 | uint32_t emitter_count = dmParticle::GetInstanceEmitterCount(scene->m_ParticlefxContext, comp->m_Instance); |
| 1666 | |
| 1667 | // Create a render entry for each emitter |
| 1668 | for (uint32_t emitter_i = 0; emitter_i < emitter_count; ++emitter_i) |
| 1669 | { |
| 1670 | dmParticle::EmitterRenderData* emitter_render_data; |
| 1671 | dmParticle::GetEmitterRenderData(scene->m_ParticlefxContext, comp->m_Instance, emitter_i, &emitter_render_data); |
| 1672 | |
| 1673 | if (emitter_render_data == 0x0) |
no test coverage detected