| 2579 | } |
| 2580 | |
| 2581 | void UpdateTransforms(Collection* collection) |
| 2582 | { |
| 2583 | DM_PROFILE("UpdateTransforms"); |
| 2584 | |
| 2585 | // Calculate world transforms |
| 2586 | // First root-level instances |
| 2587 | dmArray<uint16_t>& root_level = collection->m_LevelIndices[0]; |
| 2588 | uint32_t root_count = root_level.Size(); |
| 2589 | for (uint32_t i = 0; i < root_count; ++i) |
| 2590 | { |
| 2591 | uint16_t index = root_level[i]; |
| 2592 | Instance* instance = collection->m_Instances[index]; |
| 2593 | CheckEuler(instance); |
| 2594 | collection->m_WorldTransforms[index] = dmTransform::ToMatrix4(instance->m_Transform); |
| 2595 | uint16_t parent_index = instance->m_Parent; |
| 2596 | assert(parent_index == INVALID_INSTANCE_INDEX); |
| 2597 | } |
| 2598 | |
| 2599 | for (uint32_t level_i = 1; level_i < MAX_HIERARCHICAL_DEPTH; ++level_i) |
| 2600 | { |
| 2601 | dmArray<uint16_t>& level = collection->m_LevelIndices[level_i]; |
| 2602 | uint32_t instance_count = level.Size(); |
| 2603 | for (uint32_t i = 0; i < instance_count; ++i) |
| 2604 | { |
| 2605 | uint16_t index = level[i]; |
| 2606 | Instance* instance = collection->m_Instances[index]; |
| 2607 | CheckEuler(instance); |
| 2608 | Matrix4* trans = &collection->m_WorldTransforms[index]; |
| 2609 | |
| 2610 | uint16_t parent_index = instance->m_Parent; |
| 2611 | assert(parent_index != INVALID_INSTANCE_INDEX); |
| 2612 | |
| 2613 | Matrix4* parent_trans = &collection->m_WorldTransforms[parent_index]; |
| 2614 | Matrix4 own = dmTransform::ToMatrix4(instance->m_Transform); |
| 2615 | *trans = *parent_trans * own; |
| 2616 | } |
| 2617 | } |
| 2618 | |
| 2619 | collection->m_DirtyTransforms = false; |
| 2620 | } |
| 2621 | |
| 2622 | void UpdateTransforms(HCollection hcollection) |
| 2623 | { |