/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, * or, if provided, by the license below or the license accompanying this file. Do not * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ #include #include "ColliderAssetScaleMode.h" #include #include #include #include #include #include #include namespace PhysX { AZ_CLASS_ALLOCATOR_IMPL(ColliderAssetScaleMode, AZ::SystemAllocator, 0); namespace { const float MinAssetScale = 0.001f; const AZ::Vector3 ResetScale = AZ::Vector3::CreateOne(); } ColliderAssetScaleMode::ColliderAssetScaleMode() : m_dimensionsManipulators(AZ::Transform::Identity()) { } void ColliderAssetScaleMode::Setup(const AZ::EntityComponentIdPair& idPair) { AZ::Transform colliderWorldTransform = AZ::Transform::Identity(); PhysX::EditorColliderComponentRequestBus::EventResult(colliderWorldTransform, idPair, &PhysX::EditorColliderComponentRequests::GetColliderWorldTransform); m_dimensionsManipulators.SetSpace(colliderWorldTransform); m_dimensionsManipulators.AddEntityComponentIdPair(idPair); m_dimensionsManipulators.Register(AzToolsFramework::g_mainManipulatorManagerId); m_dimensionsManipulators.SetAxes( AZ::Vector3::CreateAxisX(), AZ::Vector3::CreateAxisY(), AZ::Vector3::CreateAxisZ()); m_dimensionsManipulators.ConfigureView( AzFramework::ViewportConstants::DefaultLinearManipulatorAxisLength, AzFramework::ViewportColors::XAxisColor, AzFramework::ViewportColors::YAxisColor, AzFramework::ViewportColors::ZAxisColor); m_dimensionsManipulators.InstallAxisLeftMouseDownCallback( [this, idPair] (const AzToolsFramework::LinearManipulator::Action& action) { AZ_UNUSED(action); OnManipulatorDown(idPair); }); m_dimensionsManipulators.InstallAxisMouseMoveCallback( [this, idPair] (const AzToolsFramework::LinearManipulator::Action& action) { OnManipulatorMoved(action.LocalScaleOffset() + m_initialScale, idPair); }); m_dimensionsManipulators.InstallUniformLeftMouseDownCallback( [this, idPair](const AzToolsFramework::LinearManipulator::Action& action) { AZ_UNUSED(action); OnManipulatorDown(idPair); }); m_dimensionsManipulators.InstallUniformMouseMoveCallback( [this, idPair] (const AzToolsFramework::LinearManipulator::Action& action) { // Uniform scale manipulator will only set the Z value for the offset, use this to create uniform scale. const AZ::Vector3 uniformScale(action.LocalScaleOffset().GetZ()); OnManipulatorMoved(uniformScale + m_initialScale, idPair); }); } void ColliderAssetScaleMode::Refresh(const AZ::EntityComponentIdPair& idPair) { AZ::Transform colliderWorldTransform = AZ::Transform::Identity(); PhysX::EditorColliderComponentRequestBus::EventResult(colliderWorldTransform, idPair, &PhysX::EditorColliderComponentRequests::GetColliderWorldTransform); m_dimensionsManipulators.SetSpace(colliderWorldTransform); } void ColliderAssetScaleMode::Teardown(const AZ::EntityComponentIdPair& idPair) { m_dimensionsManipulators.RemoveEntityComponentIdPair(idPair); m_dimensionsManipulators.Unregister(); } void ColliderAssetScaleMode::OnManipulatorDown(const AZ::EntityComponentIdPair& idPair) { // Remember the initial asset scale here. PhysX::EditorColliderComponentRequestBus::EventResult(m_initialScale, idPair, &PhysX::EditorColliderComponentRequests::GetAssetScale); } void ColliderAssetScaleMode::OnManipulatorMoved(const AZ::Vector3& scale, const AZ::EntityComponentIdPair& idPair) { AZ::Vector3 clampedScale = scale.GetMax(AZ::Vector3(MinAssetScale)); PhysX::EditorColliderComponentRequestBus::Event(idPair, &PhysX::EditorColliderComponentRequests::SetAssetScale, clampedScale); } void ColliderAssetScaleMode::ResetValues(const AZ::EntityComponentIdPair& idPair) { PhysX::EditorColliderComponentRequestBus::Event(idPair, &PhysX::EditorColliderComponentRequests::SetAssetScale, ResetScale); } } // namespace PhysX