/* * 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 "LmbrCentral_precompiled.h" #include "CylinderShapeComponent.h" #include #include #include #include #include namespace LmbrCentral { void CylinderShapeComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) { provided.push_back(AZ_CRC("ShapeService", 0xe86aa5fe)); provided.push_back(AZ_CRC("CylinderShapeService", 0x507c688e)); } void CylinderShapeComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible) { incompatible.push_back(AZ_CRC("ShapeService", 0xe86aa5fe)); incompatible.push_back(AZ_CRC("CylinderShapeService", 0x507c688e)); } void CylinderShapeComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) { required.push_back(AZ_CRC("TransformService", 0x8ee22c50)); } void CylinderShapeDebugDisplayComponent::Reflect(AZ::ReflectContext* context) { if (auto serializeContext = azrtti_cast(context)) { serializeContext->Class() ->Version(1) ->Field("Configuration", &CylinderShapeDebugDisplayComponent::m_cylinderShapeConfig) ; } } void CylinderShapeDebugDisplayComponent::Activate() { EntityDebugDisplayComponent::Activate(); ShapeComponentNotificationsBus::Handler::BusConnect(GetEntityId()); } void CylinderShapeDebugDisplayComponent::Deactivate() { ShapeComponentNotificationsBus::Handler::BusDisconnect(); EntityDebugDisplayComponent::Deactivate(); } void CylinderShapeDebugDisplayComponent::Draw(AzFramework::DebugDisplayRequests& debugDisplay) { DrawCylinderShape(m_cylinderShapeConfig.GetDrawParams(), m_cylinderShapeConfig, debugDisplay); } bool CylinderShapeDebugDisplayComponent::ReadInConfig(const AZ::ComponentConfig* baseConfig) { if (const auto config = azrtti_cast(baseConfig)) { m_cylinderShapeConfig = *config; return true; } return false; } bool CylinderShapeDebugDisplayComponent::WriteOutConfig(AZ::ComponentConfig* outBaseConfig) const { if (auto outConfig = azrtti_cast(outBaseConfig)) { *outConfig = m_cylinderShapeConfig; return true; } return false; } void CylinderShapeDebugDisplayComponent::OnShapeChanged(ShapeChangeReasons changeReason) { if (changeReason == ShapeChangeReasons::ShapeChanged) { CylinderShapeComponentRequestsBus::EventResult(m_cylinderShapeConfig, GetEntityId(), &CylinderShapeComponentRequests::GetCylinderConfiguration); } } namespace ClassConverters { static bool DeprecateCylinderColliderConfiguration(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement); static bool DeprecateCylinderColliderComponent(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement); } void CylinderShapeConfig::Reflect(AZ::ReflectContext* context) { if (auto serializeContext = azrtti_cast(context)) { // Deprecate: CylinderColliderConfiguration -> CylinderShapeConfig serializeContext->ClassDeprecate( "CylinderColliderConfiguration", "{E1DCB833-EFC4-43AC-97B0-4E07AA0DFAD9}", &ClassConverters::DeprecateCylinderColliderConfiguration) ; serializeContext->Class() ->Version(2) ->Field("Height", &CylinderShapeConfig::m_height) ->Field("Radius", &CylinderShapeConfig::m_radius) ; if (AZ::EditContext* editContext = serializeContext->GetEditContext()) { editContext->Class("Configuration", "Cylinder shape configuration parameters") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::AutoExpand, true) ->DataElement(AZ::Edit::UIHandlers::Default, &CylinderShapeConfig::m_height, "Height", "Height of cylinder") ->Attribute(AZ::Edit::Attributes::Min, 0.f) ->Attribute(AZ::Edit::Attributes::Max, 1000000.f) ->Attribute(AZ::Edit::Attributes::Suffix, " m") ->Attribute(AZ::Edit::Attributes::Step, 0.1f) ->DataElement(AZ::Edit::UIHandlers::Default, &CylinderShapeConfig::m_radius, "Radius", "Radius of cylinder") ->Attribute(AZ::Edit::Attributes::Min, 0.f) ->Attribute(AZ::Edit::Attributes::Max, 1000000.f) ->Attribute(AZ::Edit::Attributes::Suffix, " m") ->Attribute(AZ::Edit::Attributes::Step, 0.05f) ; } } if (AZ::BehaviorContext* behaviorContext = azrtti_cast(context)) { behaviorContext->Class() ->Property("Height", BehaviorValueProperty(&CylinderShapeConfig::m_height)) ->Property("Radius", BehaviorValueProperty(&CylinderShapeConfig::m_radius)) ; } } void CylinderShapeComponent::Reflect(AZ::ReflectContext* context) { CylinderShape::Reflect(context); if (auto serializeContext = azrtti_cast(context)) { serializeContext->ClassDeprecate( "CylinderColliderComponent", "{A43F684B-07B6-4CD7-8D59-643709DF9486}", &ClassConverters::DeprecateCylinderColliderComponent) ; serializeContext->Class() ->Version(2, &ClassConverters::UpgradeCylinderShapeComponent) ->Field("CylinderShape", &CylinderShapeComponent::m_cylinderShape) ; } if (AZ::BehaviorContext* behaviorContext = azrtti_cast(context)) { behaviorContext->Constant("CylinderShapeComponentTypeId", BehaviorConstant(CylinderShapeComponentTypeId)); behaviorContext->EBus("CylinderShapeComponentRequestsBus") ->Event("GetCylinderConfiguration", &CylinderShapeComponentRequestsBus::Events::GetCylinderConfiguration) ->Event("SetHeight", &CylinderShapeComponentRequestsBus::Events::SetHeight) ->Event("SetRadius", &CylinderShapeComponentRequestsBus::Events::SetRadius) ; } } void CylinderShapeComponent::Activate() { m_cylinderShape.Activate(GetEntityId()); } void CylinderShapeComponent::Deactivate() { m_cylinderShape.Deactivate(); } bool CylinderShapeComponent::ReadInConfig(const AZ::ComponentConfig* baseConfig) { if (const auto config = azrtti_cast(baseConfig)) { m_cylinderShape.SetCylinderConfiguration(*config); return true; } return false; } bool CylinderShapeComponent::WriteOutConfig(AZ::ComponentConfig* outBaseConfig) const { if (auto outConfig = azrtti_cast(outBaseConfig)) { *outConfig = m_cylinderShape.GetCylinderConfiguration(); return true; } return false; } namespace ClassConverters { static bool DeprecateCylinderColliderConfiguration(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement) { /* Old: New: */ // Cache the Height and Radius float oldHeight = 0.f; float oldRadius = 0.f; int oldIndex = classElement.FindElement(AZ_CRC("Height", 0xf54de50f)); if (oldIndex != -1) { classElement.GetSubElement(oldIndex).GetData(oldHeight); } oldIndex = classElement.FindElement(AZ_CRC("Radius", 0x3b7c6e5a)); if (oldIndex != -1) { classElement.GetSubElement(oldIndex).GetData(oldRadius); } // Convert to CylinderShapeConfig const bool result = classElement.Convert(context); if (result) { int newIndex = classElement.AddElement(context, "Height"); if (newIndex != -1) { classElement.GetSubElement(newIndex).SetData(context, oldHeight); } newIndex = classElement.AddElement(context, "Radius"); if (newIndex != -1) { classElement.GetSubElement(newIndex).SetData(context, oldRadius); } return true; } return false; } static bool DeprecateCylinderColliderComponent(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement) { /* Old: New: */ // Cache the Configuration CylinderShapeConfig configuration; int configIndex = classElement.FindElement(AZ_CRC("Configuration", 0xa5e2a5d7)); if (configIndex != -1) { classElement.GetSubElement(configIndex).GetData(configuration); } // Convert to CylinderShapeComponent const bool result = classElement.Convert(context); if (result) { configIndex = classElement.AddElement(context, "Configuration"); if (configIndex != -1) { classElement.GetSubElement(configIndex).SetData(context, configuration); } return true; } return false; } } // namespace ClassConverters } // namespace LmbrCentral