Merge pull request #488 from aws-lumberyard-dev/Atom/dmcdiar/ATOM-14933
[ATOM-14933] Reflection probes do not show mesh reflections if the entity's transform is scaled up
This commit is contained in:
@@ -120,13 +120,13 @@ namespace AZ
|
||||
{
|
||||
// stencil Srg
|
||||
// Note: the stencil pass uses a slightly reduced inner AABB to avoid seams
|
||||
Vector3 innerExtentsReduced = m_innerExtents - Vector3(0.1f, 0.1f, 0.1f);
|
||||
Matrix3x4 modelToWorldStencil = Matrix3x4::CreateFromMatrix3x3AndTranslation(Matrix3x3::CreateIdentity(), m_position) * Matrix3x4::CreateScale(innerExtentsReduced);
|
||||
Vector3 innerExtentsReduced = m_innerExtents * m_transform.GetScale() - Vector3(0.1f, 0.1f, 0.1f);
|
||||
Matrix3x4 modelToWorldStencil = Matrix3x4::CreateFromMatrix3x3AndTranslation(Matrix3x3::CreateIdentity(), m_transform.GetTranslation()) * Matrix3x4::CreateScale(innerExtentsReduced);
|
||||
m_stencilSrg->SetConstant(m_reflectionRenderData->m_modelToWorldStencilConstantIndex, modelToWorldStencil);
|
||||
m_stencilSrg->Compile();
|
||||
|
||||
// blend weight Srg
|
||||
Matrix3x4 modelToWorldOuter = Matrix3x4::CreateFromMatrix3x3AndTranslation(Matrix3x3::CreateIdentity(), m_position) * Matrix3x4::CreateScale(m_outerExtents);
|
||||
Matrix3x4 modelToWorldOuter = Matrix3x4::CreateFromMatrix3x3AndTranslation(Matrix3x3::CreateIdentity(), m_transform.GetTranslation()) * Matrix3x4::CreateScale(m_outerExtents * m_transform.GetScale());
|
||||
m_blendWeightSrg->SetConstant(m_reflectionRenderData->m_modelToWorldRenderConstantIndex, modelToWorldOuter);
|
||||
m_blendWeightSrg->SetConstant(m_reflectionRenderData->m_aabbPosRenderConstantIndex, m_outerAabbWs.GetCenter());
|
||||
m_blendWeightSrg->SetConstant(m_reflectionRenderData->m_outerAabbMinRenderConstantIndex, m_outerAabbWs.GetMin());
|
||||
@@ -149,7 +149,7 @@ namespace AZ
|
||||
m_renderOuterSrg->Compile();
|
||||
|
||||
// render inner Srg
|
||||
Matrix3x4 modelToWorldInner = Matrix3x4::CreateFromMatrix3x3AndTranslation(Matrix3x3::CreateIdentity(), m_position) * Matrix3x4::CreateScale(m_innerExtents);
|
||||
Matrix3x4 modelToWorldInner = Matrix3x4::CreateFromMatrix3x3AndTranslation(Matrix3x3::CreateIdentity(), m_transform.GetTranslation()) * Matrix3x4::CreateScale(m_innerExtents * m_transform.GetScale());
|
||||
m_renderInnerSrg->SetConstant(m_reflectionRenderData->m_modelToWorldRenderConstantIndex, modelToWorldInner);
|
||||
m_renderInnerSrg->SetConstant(m_reflectionRenderData->m_aabbPosRenderConstantIndex, m_outerAabbWs.GetCenter());
|
||||
m_renderInnerSrg->SetConstant(m_reflectionRenderData->m_outerAabbMinRenderConstantIndex, m_outerAabbWs.GetMin());
|
||||
@@ -208,24 +208,29 @@ namespace AZ
|
||||
|
||||
void ReflectionProbe::SetTransform(const AZ::Transform& transform)
|
||||
{
|
||||
m_position = transform.GetTranslation();
|
||||
m_meshFeatureProcessor->SetTransform(m_visualizationMeshHandle, transform);
|
||||
m_outerAabbWs = Aabb::CreateCenterHalfExtents(m_position, m_outerExtents / 2.0f);
|
||||
m_innerAabbWs = Aabb::CreateCenterHalfExtents(m_position, m_innerExtents / 2.0f);
|
||||
m_transform = transform;
|
||||
|
||||
// avoid scaling the visualization sphere
|
||||
AZ::Transform visualizationTransform = m_transform;
|
||||
visualizationTransform.ExtractScale();
|
||||
m_meshFeatureProcessor->SetTransform(m_visualizationMeshHandle, visualizationTransform);
|
||||
|
||||
m_outerAabbWs = Aabb::CreateCenterHalfExtents(m_transform.GetTranslation(), m_outerExtents * m_transform.GetScale() / 2.0f);
|
||||
m_innerAabbWs = Aabb::CreateCenterHalfExtents(m_transform.GetTranslation(), m_innerExtents * m_transform.GetScale() / 2.0f);
|
||||
m_updateSrg = true;
|
||||
}
|
||||
|
||||
void ReflectionProbe::SetOuterExtents(const AZ::Vector3& outerExtents)
|
||||
{
|
||||
m_outerExtents = outerExtents;
|
||||
m_outerAabbWs = Aabb::CreateCenterHalfExtents(m_position, m_outerExtents / 2.0f);
|
||||
m_outerAabbWs = Aabb::CreateCenterHalfExtents(m_transform.GetTranslation(), m_outerExtents * m_transform.GetScale() / 2.0f);
|
||||
m_updateSrg = true;
|
||||
}
|
||||
|
||||
void ReflectionProbe::SetInnerExtents(const AZ::Vector3& innerExtents)
|
||||
{
|
||||
m_innerExtents = innerExtents;
|
||||
m_innerAabbWs = Aabb::CreateCenterHalfExtents(m_position, m_innerExtents / 2.0f);
|
||||
m_innerAabbWs = Aabb::CreateCenterHalfExtents(m_transform.GetTranslation(), m_innerExtents * m_transform.GetScale() / 2.0f);
|
||||
m_updateSrg = true;
|
||||
}
|
||||
|
||||
@@ -261,7 +266,7 @@ namespace AZ
|
||||
m_environmentCubeMapPipelineId = environmentCubeMapPipeline->GetId();
|
||||
|
||||
AZStd::shared_ptr<RPI::EnvironmentCubeMapPassData> passData = AZStd::make_shared<RPI::EnvironmentCubeMapPassData>();
|
||||
passData->m_position = m_position;
|
||||
passData->m_position = m_transform.GetTranslation();
|
||||
|
||||
RPI::PassDescriptor environmentCubeMapPassDescriptor(Name("EnvironmentCubeMapPass"));
|
||||
environmentCubeMapPassDescriptor.m_passData = passData;
|
||||
|
||||
@@ -75,13 +75,13 @@ namespace AZ
|
||||
void Init(RPI::Scene* scene, ReflectionRenderData* reflectionRenderData);
|
||||
void Simulate(uint32_t probeIndex);
|
||||
|
||||
const Vector3& GetPosition() const { return m_position; }
|
||||
const Vector3& GetPosition() const { return m_transform.GetTranslation(); }
|
||||
void SetTransform(const AZ::Transform& transform);
|
||||
|
||||
const AZ::Vector3& GetOuterExtents() const { return m_outerExtents; }
|
||||
AZ::Vector3 GetOuterExtents() const { return m_outerExtents * m_transform.GetScale(); }
|
||||
void SetOuterExtents(const AZ::Vector3& outerExtents);
|
||||
|
||||
const AZ::Vector3& GetInnerExtents() const { return m_innerExtents; }
|
||||
AZ::Vector3 GetInnerExtents() const { return m_innerExtents * m_transform.GetScale(); }
|
||||
void SetInnerExtents(const AZ::Vector3& innerExtents);
|
||||
|
||||
const Aabb& GetOuterAabbWs() const { return m_outerAabbWs; }
|
||||
@@ -122,8 +122,8 @@ namespace AZ
|
||||
// scene
|
||||
RPI::Scene* m_scene = nullptr;
|
||||
|
||||
// probe capture position
|
||||
AZ::Vector3 m_position = AZ::Vector3(0.0f, 0.0f, 0.0f);
|
||||
// probe volume transform
|
||||
AZ::Transform m_transform = AZ::Transform::CreateIdentity();
|
||||
|
||||
// extents of the probe volume
|
||||
AZ::Vector3 m_outerExtents = AZ::Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
+8
-2
@@ -172,13 +172,19 @@ namespace AZ
|
||||
AZ::Vector3 position = AZ::Vector3::CreateZero();
|
||||
AZ::TransformBus::EventResult(position, GetEntityId(), &AZ::TransformBus::Events::GetWorldTranslation);
|
||||
|
||||
AZ::Vector3 scale = AZ::Vector3::CreateOne();
|
||||
AZ::TransformBus::EventResult(scale, GetEntityId(), &AZ::TransformBus::Events::GetLocalScale);
|
||||
|
||||
// draw AABB at probe position using the inner dimensions
|
||||
Color color(0.0f, 0.0f, 1.0f, 1.0f);
|
||||
debugDisplay.SetColor(color);
|
||||
|
||||
ReflectionProbeComponentConfig& configuration = m_controller.m_configuration;
|
||||
AZ::Vector3 innerMin(position.GetX() - configuration.m_innerWidth / 2, position.GetY() - configuration.m_innerLength / 2, position.GetZ() - configuration.m_innerHeight / 2);
|
||||
AZ::Vector3 innerMax(position.GetX() + configuration.m_innerWidth / 2, position.GetY() + configuration.m_innerLength / 2, position.GetZ() + configuration.m_innerHeight / 2);
|
||||
AZ::Vector3 innerExtents(configuration.m_innerWidth, configuration.m_innerLength, configuration.m_innerHeight);
|
||||
innerExtents *= scale;
|
||||
|
||||
AZ::Vector3 innerMin(position.GetX() - innerExtents.GetX() / 2, position.GetY() - innerExtents.GetY() / 2, position.GetZ() - innerExtents.GetZ() / 2);
|
||||
AZ::Vector3 innerMax(position.GetX() + innerExtents.GetX() / 2, position.GetY() + innerExtents.GetY() / 2, position.GetZ() + innerExtents.GetZ() / 2);
|
||||
debugDisplay.DrawWireBox(innerMin, innerMax);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user