----------------------------------- TransformSystem::Compute::Process Update transforms
| 59 | // Update transforms |
| 60 | // |
| 61 | void TransformSystem::Compute::Process(ComponentRange<TransformSystem::ComputeView>& range) |
| 62 | { |
| 63 | render::Scene& renderScene = UnifiedScene::Instance().GetRenderScene(); |
| 64 | |
| 65 | for (ComputeView& view : range) |
| 66 | { |
| 67 | // if neither this component nor the parent component has an updated transform, we don't need to recalculate anything |
| 68 | if (!view.transf->HasTransformChanged() && (!view.parent.IsValid() || !view.parent->HasTransformChanged())) |
| 69 | { |
| 70 | continue; |
| 71 | } |
| 72 | |
| 73 | // this is the local matrix |
| 74 | view.transf->m_WorldTransform = math::scale(view.transf->m_Scale) |
| 75 | * math::rotate(view.transf->m_Rotation) |
| 76 | * math::translate(view.transf->m_Position); |
| 77 | |
| 78 | if (view.parent.IsValid()) |
| 79 | { |
| 80 | // transform based on parent matrix |
| 81 | view.transf->m_WorldTransform = view.transf->m_WorldTransform * view.parent->m_WorldTransform; |
| 82 | |
| 83 | // update world variables |
| 84 | view.transf->m_WorldPosition = (view.parent->m_WorldTransform * vec4(view.transf->m_Position, 0)).xyz; |
| 85 | view.transf->m_WorldRotation = view.parent->GetWorldRotation() * view.transf->m_WorldRotation; |
| 86 | view.transf->m_WorldScale = view.parent->GetWorldScale() * view.transf->m_Scale; |
| 87 | } |
| 88 | else |
| 89 | { |
| 90 | view.transf->m_WorldPosition = view.transf->m_Position; |
| 91 | view.transf->m_WorldRotation = view.transf->m_Rotation; |
| 92 | view.transf->m_WorldScale = view.transf->m_Scale; |
| 93 | } |
| 94 | |
| 95 | // orientation helpers |
| 96 | view.transf->m_Forward = view.transf->m_WorldRotation * vec3::FORWARD; |
| 97 | view.transf->m_Right = view.transf->m_WorldRotation * vec3::RIGHT; |
| 98 | view.transf->m_Up = math::cross(view.transf->m_Forward, view.transf->m_Right); |
| 99 | |
| 100 | // update in the rendering scene |
| 101 | renderScene.UpdateNode(view.transf->m_NodeId, view.transf->m_WorldTransform); |
| 102 | |
| 103 | // since we changed our transform we need to set the transform changed flags so that the change trickles down to children |
| 104 | view.transf->m_TransformChanged = TransformComponent::E_TransformChanged::All; |
| 105 | } |
| 106 | } |
| 107 | |
| 108 | //--------------------------------- |
| 109 | // TransformSystem::Reset::Process |
nothing calls this directly
no test coverage detected