From 38ab09a52eb8d80c0da0729a916c257e60df6346 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Wed, 7 Feb 2024 07:06:24 +0300 Subject: [PATCH 1/7] Try to uncursify DebugDrawer scene representation --- apps/openmw/mwrender/renderingmanager.cpp | 5 +- apps/openmw/mwrender/renderingmanager.hpp | 2 +- components/debug/debugdraw.cpp | 79 +++++++++++------------ components/debug/debugdraw.hpp | 18 ++++-- components/sceneutil/serialize.cpp | 25 +++---- 5 files changed, 67 insertions(+), 62 deletions(-) diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 15faabb6df..978fe47f44 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -432,8 +432,9 @@ namespace MWRender mViewer->getIncrementalCompileOperation()->setTargetFrameRate(Settings::cells().mTargetFramerate); } - mDebugDraw - = std::make_unique(mResourceSystem->getSceneManager()->getShaderManager(), mRootNode); + mDebugDraw = new Debug::DebugDrawer(mResourceSystem->getSceneManager()->getShaderManager()); + mRootNode->addChild(mDebugDraw); + mResourceSystem->getSceneManager()->setIncrementalCompileOperation(mViewer->getIncrementalCompileOperation()); mEffectManager = std::make_unique(sceneRoot, mResourceSystem); diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 22ef987c01..8f85ce6a3f 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -335,7 +335,7 @@ namespace MWRender osg::ref_ptr mPlayerAnimation; osg::ref_ptr mPlayerNode; std::unique_ptr mCamera; - std::unique_ptr mDebugDraw; + osg::ref_ptr mDebugDraw; osg::ref_ptr mStateUpdater; osg::ref_ptr mSharedUniformStateUpdater; diff --git a/components/debug/debugdraw.cpp b/components/debug/debugdraw.cpp index 32f71580a8..b83829facd 100644 --- a/components/debug/debugdraw.cpp +++ b/components/debug/debugdraw.cpp @@ -215,12 +215,12 @@ static void generateCylinder(osg::Geometry& geom, float radius, float height, in geom.addPrimitiveSet(indices); } -static int getIdexBufferReadFromFrame(const long long int& nFrame) +static int getIndexBufferReadFromFrame(const unsigned int& nFrame) { return nFrame % 2; } -static int getIdexBufferWriteFromFrame(const long long int& nFrame) +static int getIndexBufferWriteFromFrame(const unsigned int& nFrame) { return (nFrame + 1) % 2; } @@ -248,6 +248,16 @@ namespace Debug makeLineInstance(*mLinesToDraw); } + DebugCustomDraw::DebugCustomDraw(const DebugCustomDraw& copy, const osg::CopyOp& copyop) + : Drawable(copy, copyop) + , mShapesToDraw(copy.mShapesToDraw) + , mLinesToDraw(copy.mLinesToDraw) + , mCubeGeometry(copy.mCubeGeometry) + , mCylinderGeometry(copy.mCylinderGeometry) + , mWireCubeGeometry(copy.mWireCubeGeometry) + { + } + void DebugCustomDraw::drawImplementation(osg::RenderInfo& renderInfo) const { auto state = renderInfo.getState(); @@ -308,43 +318,23 @@ namespace Debug static_cast(mLinesToDraw->getVertexArray())->clear(); static_cast(mLinesToDraw->getNormalArray())->clear(); } - - class DebugDrawCallback : public SceneUtil::NodeCallback - { - public: - DebugDrawCallback(Debug::DebugDrawer& debugDrawer) - : mDebugDrawer(debugDrawer) - { - } - - void operator()(osg::Node* node, osg::NodeVisitor* nv) - { - mDebugDrawer.mCurrentFrame = nv->getTraversalNumber(); - int indexRead = getIdexBufferReadFromFrame(mDebugDrawer.mCurrentFrame); - auto& lines = mDebugDrawer.mCustomDebugDrawer[indexRead]->mLinesToDraw; - lines->removePrimitiveSet(0, 1); - lines->addPrimitiveSet(new osg::DrawArrays( - osg::PrimitiveSet::LINES, 0, static_cast(lines->getVertexArray())->size())); - - nv->pushOntoNodePath(mDebugDrawer.mCustomDebugDrawer[indexRead]); - nv->apply(*mDebugDrawer.mCustomDebugDrawer[indexRead]); - nv->popFromNodePath(); - } - - Debug::DebugDrawer& mDebugDrawer; - }; } -Debug::DebugDrawer::DebugDrawer(Shader::ShaderManager& shaderManager, osg::ref_ptr parentNode) - : mParentNode(std::move(parentNode)) +Debug::DebugDrawer::DebugDrawer(const DebugDrawer& copy, const osg::CopyOp& copyop) + : Drawable(copy, copyop) + , mCurrentFrame(copy.mCurrentFrame) + , mCustomDebugDrawer(copy.mCustomDebugDrawer) +{ +} + +Debug::DebugDrawer::DebugDrawer(Shader::ShaderManager& shaderManager) { mCurrentFrame = 0; auto program = shaderManager.getProgram("debug"); - mDebugDrawSceneObjects = new osg::Group; - mDebugDrawSceneObjects->setCullingActive(false); - osg::StateSet* stateset = mDebugDrawSceneObjects->getOrCreateStateSet(); + setCullingActive(false); + osg::StateSet* stateset = getOrCreateStateSet(); stateset->addUniform(new osg::Uniform("color", osg::Vec3f(1., 1., 1.))); stateset->addUniform(new osg::Uniform("trans", osg::Vec3f(0., 0., 0.))); stateset->addUniform(new osg::Uniform("scale", osg::Vec3f(1., 1., 1.))); @@ -378,19 +368,28 @@ Debug::DebugDrawer::DebugDrawer(Shader::ShaderManager& shaderManager, osg::ref_p mCustomDebugDrawer[i]->mCubeGeometry = cubeGeometry; mCustomDebugDrawer[i]->mCylinderGeometry = cylinderGeom; } - mDebugDrawSceneObjects->addCullCallback(new DebugDrawCallback(*this)); - - mParentNode->addChild(mDebugDrawSceneObjects); } -Debug::DebugDrawer::~DebugDrawer() +void Debug::DebugDrawer::accept(osg::NodeVisitor& nv) { - mParentNode->removeChild(mDebugDrawSceneObjects); + if (!nv.validNodeMask(*this)) + return; + + mCurrentFrame = nv.getTraversalNumber(); + int indexRead = getIndexBufferReadFromFrame(mCurrentFrame); + auto& lines = mCustomDebugDrawer[indexRead]->mLinesToDraw; + lines->removePrimitiveSet(0, 1); + lines->addPrimitiveSet(new osg::DrawArrays( + osg::PrimitiveSet::LINES, 0, static_cast(lines->getVertexArray())->size())); + + nv.pushOntoNodePath(this); + mCustomDebugDrawer[indexRead]->accept(nv); + nv.popFromNodePath(); } void Debug::DebugDrawer::drawCube(osg::Vec3f mPosition, osg::Vec3f mDims, osg::Vec3f mColor) { - mCustomDebugDrawer[getIdexBufferWriteFromFrame(mCurrentFrame)]->mShapesToDraw.push_back( + mCustomDebugDrawer[getIndexBufferWriteFromFrame(mCurrentFrame)]->mShapesToDraw.push_back( { mPosition, mDims, mColor, DrawShape::Cube }); } @@ -403,12 +402,12 @@ void Debug::DebugDrawer::drawCubeMinMax(osg::Vec3f min, osg::Vec3f max, osg::Vec void Debug::DebugDrawer::addDrawCall(const DrawCall& draw) { - mCustomDebugDrawer[getIdexBufferWriteFromFrame(mCurrentFrame)]->mShapesToDraw.push_back(draw); + mCustomDebugDrawer[getIndexBufferWriteFromFrame(mCurrentFrame)]->mShapesToDraw.push_back(draw); } void Debug::DebugDrawer::addLine(const osg::Vec3& start, const osg::Vec3& end, const osg::Vec3 color) { - const int indexWrite = getIdexBufferWriteFromFrame(mCurrentFrame); + const int indexWrite = getIndexBufferWriteFromFrame(mCurrentFrame); const auto& lines = mCustomDebugDrawer[indexWrite]->mLinesToDraw; auto vertices = static_cast(lines->getVertexArray()); auto colors = static_cast(lines->getNormalArray()); diff --git a/components/debug/debugdraw.hpp b/components/debug/debugdraw.hpp index 659968d35a..610c89d656 100644 --- a/components/debug/debugdraw.hpp +++ b/components/debug/debugdraw.hpp @@ -70,6 +70,9 @@ namespace Debug { public: DebugCustomDraw(); + DebugCustomDraw(const DebugCustomDraw& copy, const osg::CopyOp& copyop); + + META_Object(Debug, DebugCustomDraw) mutable std::vector mShapesToDraw; osg::ref_ptr mLinesToDraw; @@ -81,12 +84,15 @@ namespace Debug virtual void drawImplementation(osg::RenderInfo&) const override; }; - struct DebugDrawer + struct DebugDrawer : public osg::Drawable { - friend DebugDrawCallback; + DebugDrawer() = default; + DebugDrawer(const DebugDrawer& copy, const osg::CopyOp& copyop); + DebugDrawer(Shader::ShaderManager& shaderManager); - DebugDrawer(Shader::ShaderManager& shaderManager, osg::ref_ptr parentNode); - ~DebugDrawer(); + META_Object(Debug, DebugDrawer) + + void accept(osg::NodeVisitor& nv) override; void drawCube( osg::Vec3f mPosition, osg::Vec3f mDims = osg::Vec3(50., 50., 50.), osg::Vec3f mColor = colorWhite); @@ -95,11 +101,9 @@ namespace Debug void addLine(const osg::Vec3& start, const osg::Vec3& end, const osg::Vec3 color = colorWhite); private: - long long int mCurrentFrame; + unsigned int mCurrentFrame; std::array, 2> mCustomDebugDrawer; - osg::ref_ptr mDebugDrawSceneObjects; - osg::ref_ptr mParentNode; }; } #endif // ! diff --git a/components/sceneutil/serialize.cpp b/components/sceneutil/serialize.cpp index 8d8acacae4..fa239e692f 100644 --- a/components/sceneutil/serialize.cpp +++ b/components/sceneutil/serialize.cpp @@ -175,18 +175,19 @@ namespace SceneUtil mgr->addWrapper(new GeometrySerializer); // ignore the below for now to avoid warning spam - const char* ignore[] = { "MWRender::PtrHolder", "Resource::TemplateRef", "Resource::TemplateMultiRef", - "SceneUtil::CompositeStateSetUpdater", "SceneUtil::UBOManager", "SceneUtil::LightListCallback", - "SceneUtil::LightManagerUpdateCallback", "SceneUtil::FFPLightStateAttribute", - "SceneUtil::UpdateRigBounds", "SceneUtil::UpdateRigGeometry", "SceneUtil::LightSource", - "SceneUtil::DisableLight", "SceneUtil::MWShadowTechnique", "SceneUtil::TextKeyMapHolder", - "Shader::AddedState", "Shader::RemovedAlphaFunc", "NifOsg::FlipController", - "NifOsg::KeyframeController", "NifOsg::Emitter", "NifOsg::ParticleColorAffector", - "NifOsg::ParticleSystem", "NifOsg::GravityAffector", "NifOsg::ParticleBomb", "NifOsg::GrowFadeAffector", - "NifOsg::InverseWorldMatrix", "NifOsg::StaticBoundingBoxCallback", "NifOsg::GeomMorpherController", - "NifOsg::UpdateMorphGeometry", "NifOsg::UVController", "NifOsg::VisController", "osgMyGUI::Drawable", - "osg::DrawCallback", "osg::UniformBufferObject", "osgOQ::ClearQueriesCallback", - "osgOQ::RetrieveQueriesCallback", "osg::DummyObject" }; + const char* ignore[] + = { "Debug::DebugDrawer", "MWRender::PtrHolder", "Resource::TemplateRef", "Resource::TemplateMultiRef", + "SceneUtil::CompositeStateSetUpdater", "SceneUtil::UBOManager", "SceneUtil::LightListCallback", + "SceneUtil::LightManagerUpdateCallback", "SceneUtil::FFPLightStateAttribute", + "SceneUtil::UpdateRigBounds", "SceneUtil::UpdateRigGeometry", "SceneUtil::LightSource", + "SceneUtil::DisableLight", "SceneUtil::MWShadowTechnique", "SceneUtil::TextKeyMapHolder", + "Shader::AddedState", "Shader::RemovedAlphaFunc", "NifOsg::FlipController", + "NifOsg::KeyframeController", "NifOsg::Emitter", "NifOsg::ParticleColorAffector", + "NifOsg::ParticleSystem", "NifOsg::GravityAffector", "NifOsg::ParticleBomb", + "NifOsg::GrowFadeAffector", "NifOsg::InverseWorldMatrix", "NifOsg::StaticBoundingBoxCallback", + "NifOsg::GeomMorpherController", "NifOsg::UpdateMorphGeometry", "NifOsg::UVController", + "NifOsg::VisController", "osgMyGUI::Drawable", "osg::DrawCallback", "osg::UniformBufferObject", + "osgOQ::ClearQueriesCallback", "osgOQ::RetrieveQueriesCallback", "osg::DummyObject" }; for (size_t i = 0; i < sizeof(ignore) / sizeof(ignore[0]); ++i) { mgr->addWrapper(makeDummySerializer(ignore[i])); From f9498e6ea4624b65d323c35b9a0d7513b0a98718 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Wed, 7 Feb 2024 09:14:17 +0300 Subject: [PATCH 2/7] Make DebugDrawer a LightManager child, don't use VAO for lines Fixes terrain lighting but currently breaks non-line primitive rendering in exteriors --- apps/openmw/mwrender/renderingmanager.cpp | 2 +- components/debug/debugdraw.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 978fe47f44..799e4af24d 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -433,7 +433,7 @@ namespace MWRender } mDebugDraw = new Debug::DebugDrawer(mResourceSystem->getSceneManager()->getShaderManager()); - mRootNode->addChild(mDebugDraw); + sceneRoot->addChild(mDebugDraw); mResourceSystem->getSceneManager()->setIncrementalCompileOperation(mViewer->getIncrementalCompileOperation()); diff --git a/components/debug/debugdraw.cpp b/components/debug/debugdraw.cpp index b83829facd..37584cd950 100644 --- a/components/debug/debugdraw.cpp +++ b/components/debug/debugdraw.cpp @@ -232,7 +232,7 @@ namespace Debug auto vertices = new osg::Vec3Array; auto color = new osg::Vec3Array; lines.setDataVariance(osg::Object::STATIC); - lines.setUseVertexArrayObject(true); + lines.setUseVertexBufferObjects(true); lines.setUseDisplayList(false); lines.setCullingActive(false); From 0d1da08493eb4d9cc2e6c9d5970b7ec1e66db4dc Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Fri, 9 Feb 2024 20:47:08 +0300 Subject: [PATCH 3/7] Set node mask on DebugDrawer Fixes primitive drawing in exteriors/quasiexteriors --- apps/openmw/mwrender/renderingmanager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 799e4af24d..62e910806f 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -433,6 +433,7 @@ namespace MWRender } mDebugDraw = new Debug::DebugDrawer(mResourceSystem->getSceneManager()->getShaderManager()); + mDebugDraw->setNodeMask(Mask_Debug); sceneRoot->addChild(mDebugDraw); mResourceSystem->getSceneManager()->setIncrementalCompileOperation(mViewer->getIncrementalCompileOperation()); From 9531b6983a8c3295b0db851bef52dbac6aa80d1f Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Fri, 9 Feb 2024 21:39:02 +0300 Subject: [PATCH 4/7] Don't reallocate debug line primitives --- components/debug/debugdraw.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/components/debug/debugdraw.cpp b/components/debug/debugdraw.cpp index 37584cd950..c757d4c364 100644 --- a/components/debug/debugdraw.cpp +++ b/components/debug/debugdraw.cpp @@ -317,6 +317,7 @@ namespace Debug mShapesToDraw.clear(); static_cast(mLinesToDraw->getVertexArray())->clear(); static_cast(mLinesToDraw->getNormalArray())->clear(); + static_cast(mLinesToDraw->getPrimitiveSet(0))->setCount(0); } } @@ -377,10 +378,6 @@ void Debug::DebugDrawer::accept(osg::NodeVisitor& nv) mCurrentFrame = nv.getTraversalNumber(); int indexRead = getIndexBufferReadFromFrame(mCurrentFrame); - auto& lines = mCustomDebugDrawer[indexRead]->mLinesToDraw; - lines->removePrimitiveSet(0, 1); - lines->addPrimitiveSet(new osg::DrawArrays( - osg::PrimitiveSet::LINES, 0, static_cast(lines->getVertexArray())->size())); nv.pushOntoNodePath(this); mCustomDebugDrawer[indexRead]->accept(nv); @@ -411,6 +408,7 @@ void Debug::DebugDrawer::addLine(const osg::Vec3& start, const osg::Vec3& end, c const auto& lines = mCustomDebugDrawer[indexWrite]->mLinesToDraw; auto vertices = static_cast(lines->getVertexArray()); auto colors = static_cast(lines->getNormalArray()); + auto primitive = static_cast(lines->getPrimitiveSet(0)); vertices->push_back(start); vertices->push_back(end); @@ -419,4 +417,6 @@ void Debug::DebugDrawer::addLine(const osg::Vec3& start, const osg::Vec3& end, c colors->push_back(color); colors->push_back(color); colors->dirty(); + + primitive->setCount(vertices->size()); } From 6a96cdaa313daa8f58b0f4c313a2a9277c8aaaa9 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Fri, 9 Feb 2024 21:51:58 +0300 Subject: [PATCH 5/7] Make DebugDrawer a Node --- components/debug/debugdraw.cpp | 13 +++---------- components/debug/debugdraw.hpp | 6 +++--- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/components/debug/debugdraw.cpp b/components/debug/debugdraw.cpp index c757d4c364..bbbf2c238e 100644 --- a/components/debug/debugdraw.cpp +++ b/components/debug/debugdraw.cpp @@ -322,7 +322,7 @@ namespace Debug } Debug::DebugDrawer::DebugDrawer(const DebugDrawer& copy, const osg::CopyOp& copyop) - : Drawable(copy, copyop) + : Node(copy, copyop) , mCurrentFrame(copy.mCurrentFrame) , mCustomDebugDrawer(copy.mCustomDebugDrawer) { @@ -371,17 +371,10 @@ Debug::DebugDrawer::DebugDrawer(Shader::ShaderManager& shaderManager) } } -void Debug::DebugDrawer::accept(osg::NodeVisitor& nv) +void Debug::DebugDrawer::traverse(osg::NodeVisitor& nv) { - if (!nv.validNodeMask(*this)) - return; - mCurrentFrame = nv.getTraversalNumber(); - int indexRead = getIndexBufferReadFromFrame(mCurrentFrame); - - nv.pushOntoNodePath(this); - mCustomDebugDrawer[indexRead]->accept(nv); - nv.popFromNodePath(); + mCustomDebugDrawer[getIndexBufferReadFromFrame(mCurrentFrame)]->accept(nv); } void Debug::DebugDrawer::drawCube(osg::Vec3f mPosition, osg::Vec3f mDims, osg::Vec3f mColor) diff --git a/components/debug/debugdraw.hpp b/components/debug/debugdraw.hpp index 610c89d656..7d7c975749 100644 --- a/components/debug/debugdraw.hpp +++ b/components/debug/debugdraw.hpp @@ -84,15 +84,15 @@ namespace Debug virtual void drawImplementation(osg::RenderInfo&) const override; }; - struct DebugDrawer : public osg::Drawable + struct DebugDrawer : public osg::Node { DebugDrawer() = default; DebugDrawer(const DebugDrawer& copy, const osg::CopyOp& copyop); DebugDrawer(Shader::ShaderManager& shaderManager); - META_Object(Debug, DebugDrawer) + META_Node(Debug, DebugDrawer) - void accept(osg::NodeVisitor& nv) override; + void traverse(osg::NodeVisitor& nv) override; void drawCube( osg::Vec3f mPosition, osg::Vec3f mDims = osg::Vec3(50., 50., 50.), osg::Vec3f mColor = colorWhite); From 4df62d53db442c9770c04a6f1ee634c0a2f2b438 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Sat, 10 Feb 2024 01:25:15 +0300 Subject: [PATCH 6/7] Fix OSG boilerplate macro for DebugCustomDraw --- components/debug/debugdraw.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/debug/debugdraw.hpp b/components/debug/debugdraw.hpp index 7d7c975749..2518813cad 100644 --- a/components/debug/debugdraw.hpp +++ b/components/debug/debugdraw.hpp @@ -72,7 +72,7 @@ namespace Debug DebugCustomDraw(); DebugCustomDraw(const DebugCustomDraw& copy, const osg::CopyOp& copyop); - META_Object(Debug, DebugCustomDraw) + META_Node(Debug, DebugCustomDraw) mutable std::vector mShapesToDraw; osg::ref_ptr mLinesToDraw; From d9ee54ae98a2a75cd37fd980ebd16dabe5e2f251 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Fri, 16 Feb 2024 11:33:57 +0300 Subject: [PATCH 7/7] DebugCustomDraw: Correct PerContextProgram use, clean up drawImplementation --- components/debug/debugdraw.cpp | 54 +++++++++++++--------------------- 1 file changed, 20 insertions(+), 34 deletions(-) diff --git a/components/debug/debugdraw.cpp b/components/debug/debugdraw.cpp index bbbf2c238e..e7aa7d8cce 100644 --- a/components/debug/debugdraw.cpp +++ b/components/debug/debugdraw.cpp @@ -265,59 +265,45 @@ namespace Debug const osg::StateSet* stateSet = getStateSet(); - auto program = static_cast(stateSet->getAttribute(osg::StateAttribute::PROGRAM)); - const osg::Program::PerContextProgram* pcp = program->getPCP(*state); - if (!pcp) - { - return; - } + const osg::Program::PerContextProgram& pcp = *state->getLastAppliedProgramObject(); + auto transLocation = pcp.getUniformLocation(stateSet->getUniform("trans")->getNameID()); + auto colLocation = pcp.getUniformLocation(stateSet->getUniform("color")->getNameID()); + auto scaleLocation = pcp.getUniformLocation(stateSet->getUniform("scale")->getNameID()); + auto normalAsColorLocation = pcp.getUniformLocation(stateSet->getUniform("useNormalAsColor")->getNameID()); - const osg::Uniform* uTrans = stateSet->getUniform("trans"); - const osg::Uniform* uCol = stateSet->getUniform("color"); - const osg::Uniform* uScale = stateSet->getUniform("scale"); - const osg::Uniform* uUseNormalAsColor = stateSet->getUniform("useNormalAsColor"); + auto drawPrimitive = [&](const osg::Drawable* primitive, const osg::Vec3f& pos, const osg::Vec3f& color, + const osg::Vec3f& scale, const bool normalAsColor) { + ext->glUniform3f(transLocation, pos.x(), pos.y(), pos.z()); + ext->glUniform3f(colLocation, color.x(), color.y(), color.z()); + ext->glUniform3f(scaleLocation, scale.x(), scale.y(), scale.z()); + ext->glUniform1i(normalAsColorLocation, normalAsColor); + primitive->drawImplementation(renderInfo); + }; - auto transLocation = pcp->getUniformLocation(uTrans->getNameID()); - auto colLocation = pcp->getUniformLocation(uCol->getNameID()); - auto scaleLocation = pcp->getUniformLocation(uScale->getNameID()); - auto normalAsColorLocation = pcp->getUniformLocation(uUseNormalAsColor->getNameID()); - - ext->glUniform3f(transLocation, 0., 0., 0.); - ext->glUniform3f(colLocation, 1., 1., 1.); - ext->glUniform3f(scaleLocation, 1., 1., 1.); - ext->glUniform1i(normalAsColorLocation, true); - - mLinesToDraw->drawImplementation(renderInfo); - - ext->glUniform1i(normalAsColorLocation, false); + drawPrimitive(mLinesToDraw, { 0.f, 0.f, 0.f }, { 1.f, 1.f, 1.f }, { 1.f, 1.f, 1.f }, true); for (const auto& shapeToDraw : mShapesToDraw) { - osg::Vec3f translation = shapeToDraw.mPosition; - osg::Vec3f color = shapeToDraw.mColor; - osg::Vec3f scale = shapeToDraw.mDims; - - ext->glUniform3f(transLocation, translation.x(), translation.y(), translation.z()); - ext->glUniform3f(colLocation, color.x(), color.y(), color.z()); - ext->glUniform3f(scaleLocation, scale.x(), scale.y(), scale.z()); - + const osg::Geometry* geometry = nullptr; switch (shapeToDraw.mDrawShape) { case DrawShape::Cube: - mCubeGeometry->drawImplementation(renderInfo); + geometry = mCubeGeometry; break; case DrawShape::Cylinder: - mCylinderGeometry->drawImplementation(renderInfo); + geometry = mCylinderGeometry; break; case DrawShape::WireCube: - mWireCubeGeometry->drawImplementation(renderInfo); + geometry = mWireCubeGeometry; break; } + drawPrimitive(geometry, shapeToDraw.mPosition, shapeToDraw.mColor, shapeToDraw.mDims, false); } mShapesToDraw.clear(); static_cast(mLinesToDraw->getVertexArray())->clear(); static_cast(mLinesToDraw->getNormalArray())->clear(); static_cast(mLinesToDraw->getPrimitiveSet(0))->setCount(0); + pcp.resetAppliedUniforms(); } }