From 67086dd1042ce9ce18e33809d7d99a8b45ffdee6 Mon Sep 17 00:00:00 2001 From: chillywillysoft <66888046+chillywillysoft@users.noreply.github.com> Date: Sat, 20 May 2023 12:56:01 -0700 Subject: [PATCH 1/2] Main: pass entity's transform to DebugDrawer::drawBone() Allows debug bone drawing for Entities with non-identity SceneNode transforms. Maintains backwards-compatible interface by giving transform parameter default of identity. --- OgreMain/include/OgreDefaultDebugDrawer.h | 2 +- OgreMain/include/OgreSceneManager.h | 2 +- OgreMain/src/OgreDefaultDebugDrawer.cpp | 4 ++-- OgreMain/src/OgreEntity.cpp | 4 +--- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/OgreMain/include/OgreDefaultDebugDrawer.h b/OgreMain/include/OgreDefaultDebugDrawer.h index 49e8fb43ef6..1352792e7c3 100644 --- a/OgreMain/include/OgreDefaultDebugDrawer.h +++ b/OgreMain/include/OgreDefaultDebugDrawer.h @@ -31,7 +31,7 @@ class _OgreExport DefaultDebugDrawer : public DebugDrawer /// if static, the drawer contents are preserved across frames. They are cleared otherwise. void setStatic(bool enable) { mStatic = enable; } - void drawBone(const Node* node) override; + void drawBone(const Node* node, const Affine3 & transform = Affine3::IDENTITY) override; void drawSceneNode(const SceneNode* node) override; void drawFrustum(const Frustum* frust) override; /// Allows the rendering of a wireframe bounding box. diff --git a/OgreMain/include/OgreSceneManager.h b/OgreMain/include/OgreSceneManager.h index ba859e84941..f4b93c963cd 100644 --- a/OgreMain/include/OgreSceneManager.h +++ b/OgreMain/include/OgreSceneManager.h @@ -3306,7 +3306,7 @@ namespace Ogre { public: virtual ~DebugDrawer() {} virtual void drawSceneNode(const SceneNode* node) = 0; - virtual void drawBone(const Node* node) = 0; + virtual void drawBone(const Node* node, const Affine3 & transform = Affine3::IDENTITY) = 0; virtual void drawFrustum(const Frustum* frust) = 0; }; diff --git a/OgreMain/src/OgreDefaultDebugDrawer.cpp b/OgreMain/src/OgreDefaultDebugDrawer.cpp index e22b5ea8c1e..188b3f4e309 100644 --- a/OgreMain/src/OgreDefaultDebugDrawer.cpp +++ b/OgreMain/src/OgreDefaultDebugDrawer.cpp @@ -141,9 +141,9 @@ void DefaultDebugDrawer::drawAxes(const Affine3& pose, float size) mAxes.triangle(base + 4, base + 5, base + 6); } } -void DefaultDebugDrawer::drawBone(const Node* node) +void DefaultDebugDrawer::drawBone(const Node* node, const Affine3 & transform) { - drawAxes(node->_getFullTransform()); + drawAxes(transform * node->_getFullTransform()); } void DefaultDebugDrawer::drawSceneNode(const SceneNode* node) { diff --git a/OgreMain/src/OgreEntity.cpp b/OgreMain/src/OgreEntity.cpp index 94bc5e91fbe..193f8aeafc9 100644 --- a/OgreMain/src/OgreEntity.cpp +++ b/OgreMain/src/OgreEntity.cpp @@ -681,13 +681,11 @@ namespace Ogre { } // HACK to display bones - // This won't work if the entity is not centered at the origin - // TODO work out a way to allow bones to be rendered when Entity not centered if (mDisplaySkeleton && hasSkeleton() && mManager && mManager->getDebugDrawer()) { for (Bone* bone : mSkeletonInstance->getBones()) { - mManager->getDebugDrawer()->drawBone(bone); + mManager->getDebugDrawer()->drawBone(bone, mParentNode->_getFullTransform()); } } } From 85d159bb5379e3b72650d89465375e02cf3a839c Mon Sep 17 00:00:00 2001 From: chillywillysoft <66888046+chillywillysoft@users.noreply.github.com> Date: Sat, 20 May 2023 13:28:34 -0700 Subject: [PATCH 2/2] Main: DefaultDebugDrawer - add setBoneAxesSize() Allows to set size of axes for debug bone drawing. --- OgreMain/include/OgreDefaultDebugDrawer.h | 3 +++ OgreMain/src/OgreDefaultDebugDrawer.cpp | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/OgreMain/include/OgreDefaultDebugDrawer.h b/OgreMain/include/OgreDefaultDebugDrawer.h index 1352792e7c3..a6b3db5cb7f 100644 --- a/OgreMain/include/OgreDefaultDebugDrawer.h +++ b/OgreMain/include/OgreDefaultDebugDrawer.h @@ -16,6 +16,7 @@ class _OgreExport DefaultDebugDrawer : public DebugDrawer ManualObject mAxes; int mDrawType; bool mStatic; + float mBoneAxesSize; void preFindVisibleObjects(SceneManager* source, SceneManager::IlluminationRenderStage irs, Viewport* v) override; void postFindVisibleObjects(SceneManager* source, SceneManager::IlluminationRenderStage irs, Viewport* v) override; void beginLines(); @@ -38,6 +39,8 @@ class _OgreExport DefaultDebugDrawer : public DebugDrawer void drawWireBox(const AxisAlignedBox& aabb, const ColourValue& colour = ColourValue::White); /// draw coordinate axes void drawAxes(const Affine3& pose, float size = 1.0f); + /// Specifes the size of the axes drawn by drawBone() + void setBoneAxesSize(float size); }; } /* namespace Ogre */ diff --git a/OgreMain/src/OgreDefaultDebugDrawer.cpp b/OgreMain/src/OgreDefaultDebugDrawer.cpp index 188b3f4e309..06387dae090 100644 --- a/OgreMain/src/OgreDefaultDebugDrawer.cpp +++ b/OgreMain/src/OgreDefaultDebugDrawer.cpp @@ -8,7 +8,7 @@ namespace Ogre { -DefaultDebugDrawer::DefaultDebugDrawer() : mLines(""), mAxes(""), mDrawType(0), mStatic(false) {} +DefaultDebugDrawer::DefaultDebugDrawer() : mLines(""), mAxes(""), mDrawType(0), mStatic(false), mBoneAxesSize(1.0f) {} void DefaultDebugDrawer::preFindVisibleObjects(SceneManager* source, SceneManager::IlluminationRenderStage irs, Viewport* v) @@ -141,9 +141,13 @@ void DefaultDebugDrawer::drawAxes(const Affine3& pose, float size) mAxes.triangle(base + 4, base + 5, base + 6); } } +void DefaultDebugDrawer::setBoneAxesSize(float size) +{ + mBoneAxesSize = size; +} void DefaultDebugDrawer::drawBone(const Node* node, const Affine3 & transform) { - drawAxes(transform * node->_getFullTransform()); + drawAxes(transform * node->_getFullTransform(), mBoneAxesSize); } void DefaultDebugDrawer::drawSceneNode(const SceneNode* node) {