/* * 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 "SphereShapeComponent.h" #include #include #include #include namespace LmbrCentral { void SphereShapeComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) { provided.push_back(AZ_CRC("ShapeService", 0xe86aa5fe)); provided.push_back(AZ_CRC("SphereShapeService", 0x90c8dc80)); provided.push_back(AZ_CRC("AreaLightShapeService", 0x68ea78dc)); } void SphereShapeComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible) { incompatible.push_back(AZ_CRC("ShapeService", 0xe86aa5fe)); incompatible.push_back(AZ_CRC("SphereShapeService", 0x90c8dc80)); incompatible.push_back(AZ_CRC("AreaLightShapeService", 0x68ea78dc)); } void SphereShapeComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) { required.push_back(AZ_CRC("TransformService", 0x8ee22c50)); } void SphereShapeDebugDisplayComponent::Reflect(AZ::ReflectContext* context) { EntityDebugDisplayComponent::Reflect(context); if (auto serializeContext = azrtti_cast(context)) { serializeContext->Class() ->Version(1) ->Field("Configuration", &SphereShapeDebugDisplayComponent::m_sphereShapeConfig) ; } } void SphereShapeDebugDisplayComponent::Activate() { EntityDebugDisplayComponent::Activate(); ShapeComponentNotificationsBus::Handler::BusConnect(GetEntityId()); } void SphereShapeDebugDisplayComponent::Deactivate() { ShapeComponentNotificationsBus::Handler::BusDisconnect(); EntityDebugDisplayComponent::Deactivate(); } void SphereShapeDebugDisplayComponent::Draw(AzFramework::DebugDisplayRequests& debugDisplay) { DrawSphereShape(m_sphereShapeConfig.GetDrawParams(), m_sphereShapeConfig, debugDisplay); } bool SphereShapeDebugDisplayComponent::ReadInConfig(const AZ::ComponentConfig* baseConfig) { if (const auto config = azrtti_cast(baseConfig)) { m_sphereShapeConfig = *config; return true; } return false; } void SphereShapeDebugDisplayComponent::OnShapeChanged(ShapeChangeReasons changeReason) { if (changeReason == ShapeChangeReasons::ShapeChanged) { SphereShapeComponentRequestsBus::EventResult(m_sphereShapeConfig, GetEntityId(), &SphereShapeComponentRequests::GetSphereConfiguration); } } bool SphereShapeDebugDisplayComponent::WriteOutConfig(AZ::ComponentConfig* outBaseConfig) const { if (auto outConfig = azrtti_cast(outBaseConfig)) { *outConfig = m_sphereShapeConfig; return true; } return false; } namespace ClassConverters { static bool DeprecateSphereColliderConfiguration(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement); static bool DeprecateSphereColliderComponent(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement); } void SphereShapeConfig::Reflect(AZ::ReflectContext* context) { if (auto serializeContext = azrtti_cast(context)) { // Deprecate: SphereColliderConfiguration -> SphereShapeConfig serializeContext->ClassDeprecate( "SphereColliderConfiguration", "{0319AE62-3355-4C98-873D-3139D0427A53}", &ClassConverters::DeprecateSphereColliderConfiguration) ; serializeContext->Class() ->Version(2) ->Field("Radius", &SphereShapeConfig::m_radius) ; if (AZ::EditContext* editContext = serializeContext->GetEditContext()) { editContext->Class("Configuration", "Sphere shape configuration parameters") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->DataElement(AZ::Edit::UIHandlers::Default, &SphereShapeConfig::m_radius, "Radius", "Radius of sphere") ->Attribute(AZ::Edit::Attributes::Min, 0.f) ->Attribute(AZ::Edit::Attributes::Suffix, " m") ->Attribute(AZ::Edit::Attributes::Step, 0.05f) ; } } if (AZ::BehaviorContext* behaviorContext = azrtti_cast(context)) { behaviorContext->Class() ->Constructor() ->Constructor() ->Property("Radius", BehaviorValueProperty(&SphereShapeConfig::m_radius)) ; } } void SphereShapeComponent::Reflect(AZ::ReflectContext* context) { SphereShape::Reflect(context); if (auto serializeContext = azrtti_cast(context)) { // Deprecate: SphereColliderComponent -> SphereShapeComponent serializeContext->ClassDeprecate( "SphereColliderComponent", "{99F33E4A-4EFB-403C-8918-9171D47A03A4}", &ClassConverters::DeprecateSphereColliderComponent) ; serializeContext->Class() ->Version(2, &ClassConverters::UpgradeSphereShapeComponent) ->Field("SphereShape", &SphereShapeComponent::m_sphereShape) ; } if (AZ::BehaviorContext* behaviorContext = azrtti_cast(context)) { behaviorContext->Constant("SphereShapeComponentTypeId", BehaviorConstant(SphereShapeComponentTypeId)); behaviorContext->EBus("SphereShapeComponentRequestsBus") ->Event("GetSphereConfiguration", &SphereShapeComponentRequestsBus::Events::GetSphereConfiguration) ->Event("SetRadius", &SphereShapeComponentRequestsBus::Events::SetRadius) ; } } void SphereShapeComponent::Activate() { m_sphereShape.Activate(GetEntityId()); } void SphereShapeComponent::Deactivate() { m_sphereShape.Deactivate(); } bool SphereShapeComponent::ReadInConfig(const AZ::ComponentConfig* baseConfig) { if (const auto config = azrtti_cast(baseConfig)) { m_sphereShape.SetSphereConfiguration(*config); return true; } return false; } bool SphereShapeComponent::WriteOutConfig(AZ::ComponentConfig* outBaseConfig) const { if (auto outConfig = azrtti_cast(outBaseConfig)) { *outConfig = m_sphereShape.GetSphereConfiguration(); return true; } return false; } namespace ClassConverters { static bool DeprecateSphereColliderConfiguration(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement) { /* Old: New: */ // Cache the Radius float oldRadius = 0.f; const int oldIndex = classElement.FindElement(AZ_CRC("Radius", 0x3b7c6e5a)); if (oldIndex != -1) { classElement.GetSubElement(oldIndex).GetData(oldRadius); } else { return false; } // Convert to SphereShapeConfig const bool result = classElement.Convert(context); if (result) { const int newIndex = classElement.AddElement(context, "Radius"); if (newIndex != -1) { classElement.GetSubElement(newIndex).SetData(context, oldRadius); return true; } return false; } return false; } static bool DeprecateSphereColliderComponent(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement) { /* Old: New: */ // Cache the Configuration SphereShapeConfig configuration; int configIndex = classElement.FindElement(AZ_CRC("Configuration", 0xa5e2a5d7)); if (configIndex != -1) { classElement.GetSubElement(configIndex).GetData(configuration); } else { return false; } // Convert to SphereShapeComponent 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; } return false; } } // namespace ClassConverters } // namespace LmbrCentral