From 45055ab3cc29bce1a2a31ee8847e3ddfb36fbee7 Mon Sep 17 00:00:00 2001 From: greerdv Date: Mon, 10 May 2021 22:01:41 +0100 Subject: [PATCH 1/3] applying debug draw transform stack to DrawLines and DrawTriangles --- .../AtomDebugDisplayViewportInterface.cpp | 31 +++++++++++++++---- .../AtomDebugDisplayViewportInterface.h | 6 ++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp index 8a063cd7a7..7a8d6b7494 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp +++ b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp @@ -506,9 +506,10 @@ namespace AZ::AtomBridge { if (m_auxGeomPtr) { + AZStd::vector transformedVertices = ToWorldSpacePosition(vertices); AZ::RPI::AuxGeomDraw::AuxGeomDynamicDrawArguments drawArgs; - drawArgs.m_verts = vertices.data(); - drawArgs.m_vertCount = aznumeric_cast(vertices.size()); + drawArgs.m_verts = transformedVertices.data(); + drawArgs.m_vertCount = aznumeric_cast(transformedVertices.size()); drawArgs.m_colors = &color; drawArgs.m_colorCount = 1; drawArgs.m_opacityType = m_rendState.m_opacityType; @@ -526,9 +527,10 @@ namespace AZ::AtomBridge { if (m_auxGeomPtr) { + AZStd::vector transformedVertices = ToWorldSpacePosition(vertices); AZ::RPI::AuxGeomDraw::AuxGeomDynamicIndexedDrawArguments drawArgs; - drawArgs.m_verts = vertices.data(); - drawArgs.m_vertCount = aznumeric_cast(vertices.size()); + drawArgs.m_verts = transformedVertices.data(); + drawArgs.m_vertCount = aznumeric_cast(transformedVertices.size()); drawArgs.m_indices = indices.data(); drawArgs.m_indexCount = aznumeric_cast(indices.size()); drawArgs.m_colors = &color; @@ -659,9 +661,10 @@ namespace AZ::AtomBridge { if (m_auxGeomPtr) { + AZStd::vector transformedLines = ToWorldSpacePosition(lines); AZ::RPI::AuxGeomDraw::AuxGeomDynamicDrawArguments drawArgs; - drawArgs.m_verts = lines.data(); - drawArgs.m_vertCount = aznumeric_cast(lines.size()); + drawArgs.m_verts = transformedLines.data(); + drawArgs.m_vertCount = aznumeric_cast(transformedLines.size()); drawArgs.m_colors = &color; drawArgs.m_colorCount = 1; drawArgs.m_size = m_rendState.m_lineWidth; @@ -1513,6 +1516,22 @@ namespace AZ::AtomBridge return m_rendState.m_transformStack[m_rendState.m_currentTransform]; } + AZStd::vector AtomDebugDisplayViewportInterface::ToWorldSpacePosition(const AZStd::vector& positions) const + { + AZStd::vector transformedPositions; + transformedPositions.resize_no_construct(positions.size()); + AZStd::transform(positions.begin(), positions.end(), transformedPositions.begin(), [this](const AZ::Vector3& position){ return ToWorldSpacePosition(position); }); + return transformedPositions; + } + + AZStd::vector AtomDebugDisplayViewportInterface::ToWorldSpaceVector(const AZStd::vector& vectors) const + { + AZStd::vector transformedVectors; + transformedVectors.resize_no_construct(vectors.size()); + AZStd::transform(vectors.begin(), vectors.end(), transformedVectors.begin(), [this](const AZ::Vector3& vector) { return ToWorldSpaceVector(vector); }); + return transformedVectors; + } + AZ::RPI::ViewportContextPtr AtomDebugDisplayViewportInterface::GetViewportContext() const { auto viewContextManager = AZ::Interface::Get(); diff --git a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h index c872e2b81e..5edd1f0a02 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h +++ b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h @@ -249,6 +249,12 @@ namespace AZ::AtomBridge //! Convert direction to world space (translation is not considered) AZ::Vector3 ToWorldSpaceVector(const AZ::Vector3& v) const { return m_rendState.m_transformStack[m_rendState.m_currentTransform].Multiply3x3(v); } + //! Convert position to world space. + AZStd::vector ToWorldSpacePosition(const AZStd::vector& positions) const; + + //! Convert direction to world space (translation is not considered) + AZStd::vector ToWorldSpaceVector(const AZStd::vector& vectors) const; + void CalcBasisVectors(const AZ::Vector3& n, AZ::Vector3& b1, AZ::Vector3& b2) const; const AZ::Matrix3x4& GetCurrentTransform() const; From 619f71cc19880c1a18a46975db5cc415898dbd09 Mon Sep 17 00:00:00 2001 From: greerdv Date: Tue, 11 May 2021 11:39:14 +0100 Subject: [PATCH 2/3] fixing some bugs with debug draw not taking entity scale into account --- .../AtomDebugDisplayViewportInterface.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp index 7a8d6b7494..1039a12622 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp +++ b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp @@ -931,13 +931,14 @@ namespace AZ::AtomBridge { if (m_auxGeomPtr) { + const float scale = GetCurrentTransform().RetrieveScale().GetMaxElement(); const AZ::Vector3 worldCenter = ToWorldSpacePosition(center); const AZ::Vector3 worldAxis = ToWorldSpaceVector(axis); m_auxGeomPtr->DrawCylinder( worldCenter, worldAxis, - radius, - height, + scale * radius, + scale * height, m_rendState.m_color, AZ::RPI::AuxGeomDraw::DrawStyle::Line, m_rendState.m_depthTest, @@ -957,13 +958,14 @@ namespace AZ::AtomBridge { if (m_auxGeomPtr) { + const float scale = GetCurrentTransform().RetrieveScale().GetMaxElement(); const AZ::Vector3 worldCenter = ToWorldSpacePosition(center); const AZ::Vector3 worldAxis = ToWorldSpaceVector(axis); m_auxGeomPtr->DrawCylinder( worldCenter, worldAxis, - radius, - height, + scale * radius, + scale * height, m_rendState.m_color, drawShaded ? AZ::RPI::AuxGeomDraw::DrawStyle::Shaded : AZ::RPI::AuxGeomDraw::DrawStyle::Solid, m_rendState.m_depthTest, @@ -1067,10 +1069,10 @@ namespace AZ::AtomBridge { if (m_auxGeomPtr) { - + const float scale = GetCurrentTransform().RetrieveScale().GetMaxElement(); m_auxGeomPtr->DrawSphere( ToWorldSpacePosition(pos), - radius, + scale * radius, m_rendState.m_color, AZ::RPI::AuxGeomDraw::DrawStyle::Line, m_rendState.m_depthTest, @@ -1161,12 +1163,13 @@ namespace AZ::AtomBridge { if (m_auxGeomPtr) { + const float scale = GetCurrentTransform().RetrieveScale().GetMaxElement(); const AZ::Vector3 worldPos = ToWorldSpacePosition(pos); const AZ::Vector3 worldDir = ToWorldSpaceVector(dir); m_auxGeomPtr->DrawDisk( worldPos, worldDir, - radius, + scale * radius, m_rendState.m_color, AZ::RPI::AuxGeomDraw::DrawStyle::Shaded, m_rendState.m_depthTest, From 27d6e5b8489bea7a02b8ff655e7f8fd48b16af30 Mon Sep 17 00:00:00 2001 From: greerdv Date: Tue, 11 May 2021 11:41:33 +0100 Subject: [PATCH 3/3] formatting tidy up --- .../Code/Source/AtomDebugDisplayViewportInterface.cpp | 8 ++++++-- .../Code/Source/AtomDebugDisplayViewportInterface.h | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp index 1039a12622..482bd21972 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp +++ b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp @@ -1523,7 +1523,9 @@ namespace AZ::AtomBridge { AZStd::vector transformedPositions; transformedPositions.resize_no_construct(positions.size()); - AZStd::transform(positions.begin(), positions.end(), transformedPositions.begin(), [this](const AZ::Vector3& position){ return ToWorldSpacePosition(position); }); + AZStd::transform(positions.begin(), positions.end(), transformedPositions.begin(), [this](const AZ::Vector3& position) { + return ToWorldSpacePosition(position); + }); return transformedPositions; } @@ -1531,7 +1533,9 @@ namespace AZ::AtomBridge { AZStd::vector transformedVectors; transformedVectors.resize_no_construct(vectors.size()); - AZStd::transform(vectors.begin(), vectors.end(), transformedVectors.begin(), [this](const AZ::Vector3& vector) { return ToWorldSpaceVector(vector); }); + AZStd::transform(vectors.begin(), vectors.end(), transformedVectors.begin(), [this](const AZ::Vector3& vector) { + return ToWorldSpaceVector(vector); + }); return transformedVectors; } diff --git a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h index 5edd1f0a02..18d280ef88 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h +++ b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h @@ -249,10 +249,10 @@ namespace AZ::AtomBridge //! Convert direction to world space (translation is not considered) AZ::Vector3 ToWorldSpaceVector(const AZ::Vector3& v) const { return m_rendState.m_transformStack[m_rendState.m_currentTransform].Multiply3x3(v); } - //! Convert position to world space. + //! Convert positions to world space. AZStd::vector ToWorldSpacePosition(const AZStd::vector& positions) const; - //! Convert direction to world space (translation is not considered) + //! Convert directions to world space (translation is not considered) AZStd::vector ToWorldSpaceVector(const AZStd::vector& vectors) const; void CalcBasisVectors(const AZ::Vector3& n, AZ::Vector3& b1, AZ::Vector3& b2) const;