diff --git a/Source/Engine/Level/Actors/AnimatedModel.cpp b/Source/Engine/Level/Actors/AnimatedModel.cpp index 9605119a3..a0e6ccab4 100644 --- a/Source/Engine/Level/Actors/AnimatedModel.cpp +++ b/Source/Engine/Level/Actors/AnimatedModel.cpp @@ -25,7 +25,7 @@ AnimatedModel::AnimatedModel(const SpawnParams& params) { _drawCategory = SceneRendering::SceneDrawAsync; GraphInstance.Object = this; - _box = _boxLocal = BoundingBox(Vector3::Zero); + _box = BoundingBox(Vector3::Zero); _sphere = BoundingSphere(Vector3::Zero, 0.0f); SkinnedModel.Changed.Bind(this); @@ -511,50 +511,41 @@ void AnimatedModel::OnActiveInTreeChanged() ModelInstanceActor::OnActiveInTreeChanged(); } -void AnimatedModel::UpdateLocalBounds() +void AnimatedModel::UpdateBounds() { - BoundingBox box; if (CustomBounds.GetSize().LengthSquared() > 0.01f) { - box = CustomBounds; + BoundingBox::Transform(CustomBounds, _transform, _box); } else if (SkinnedModel && SkinnedModel->IsLoaded()) { - //box = SkinnedModel->GetBox(GraphInstance.RootTransform.GetWorld()); - //box = SkinnedModel->GetBox(); - if (GraphInstance.NodesPose.Count() != 0) { // Per-bone bounds estimated from positions auto& skeleton = SkinnedModel->Skeleton; const int32 bonesCount = skeleton.Bones.Count(); - box = BoundingBox(GraphInstance.NodesPose[skeleton.Bones[0].NodeIndex].GetTranslation()); +#define GET_NODE_POS(i) _transform.LocalToWorld(GraphInstance.NodesPose[skeleton.Bones[i].NodeIndex].GetTranslation()) + BoundingBox box(GET_NODE_POS(0)); for (int32 boneIndex = 1; boneIndex < bonesCount; boneIndex++) - box.Merge(GraphInstance.NodesPose[skeleton.Bones[boneIndex].NodeIndex].GetTranslation()); + box.Merge(GET_NODE_POS(boneIndex)); + _box = box; +#undef GET_NODE_POS } else { - box = SkinnedModel->GetBox(); + _box = SkinnedModel->GetBox(_transform.GetWorld()); } // Apply margin based on model dimensions const Vector3 modelBoxSize = SkinnedModel->GetBox().GetSize(); - const Vector3 center = box.GetCenter(); - const Vector3 sizeHalf = Vector3::Max(box.GetSize() + modelBoxSize * 0.2f, modelBoxSize) * 0.5f; - box = BoundingBox(center - sizeHalf, center + sizeHalf); + const Vector3 center = _box.GetCenter(); + const Vector3 sizeHalf = Vector3::Max(_box.GetSize() + modelBoxSize * 0.2f, modelBoxSize) * 0.5f; + _box = BoundingBox(center - sizeHalf, center + sizeHalf); } else { - box = BoundingBox(Vector3::Zero); + _box = BoundingBox(_transform.Translation); } - _boxLocal = BoundingBox::MakeScaled(box, BoundsScale); -} - -void AnimatedModel::UpdateBounds() -{ - UpdateLocalBounds(); - - BoundingBox::Transform(_boxLocal, _transform, _box); BoundingSphere::FromBox(_box, _sphere); if (_sceneRenderingKey != -1) GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); @@ -963,10 +954,7 @@ void AnimatedModel::OnTransformChanged() // Base ModelInstanceActor::OnTransformChanged(); - BoundingBox::Transform(_boxLocal, _transform, _box); - BoundingSphere::FromBox(_box, _sphere); - if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); + UpdateBounds(); } void AnimatedModel::WaitForModelLoad() diff --git a/Source/Engine/Level/Actors/AnimatedModel.h b/Source/Engine/Level/Actors/AnimatedModel.h index 3c578d244..f7bed48d5 100644 --- a/Source/Engine/Level/Actors/AnimatedModel.h +++ b/Source/Engine/Level/Actors/AnimatedModel.h @@ -55,7 +55,6 @@ public: }; private: - BoundingBox _boxLocal; GeometryDrawStateData _drawState; SkinnedMeshDrawData _skinningData; AnimationUpdateMode _actualMode; @@ -349,7 +348,6 @@ private: void SyncParameters(); void Update(); - void UpdateLocalBounds(); void UpdateBounds(); void UpdateSockets(); void OnAnimationUpdated_Async();