diff --git a/apps/openmw/mwrender/actorspaths.cpp b/apps/openmw/mwrender/actorspaths.cpp index 68cf73fb52..b48da306c8 100644 --- a/apps/openmw/mwrender/actorspaths.cpp +++ b/apps/openmw/mwrender/actorspaths.cpp @@ -1,12 +1,16 @@ #include "actorspaths.hpp" + #include "vismask.hpp" #include #include #include #include +#include +#include #include +#include #include "../mwbase/environment.hpp" #include "../mwbase/world.hpp" @@ -15,9 +19,24 @@ namespace MWRender { + namespace + { + osg::ref_ptr makeGroupStateSet() + { + osg::ref_ptr material = new osg::Material; + material->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE); + + osg::ref_ptr stateSet = new osg::StateSet; + stateSet->setAttribute(material); + return stateSet; + } + } + ActorsPaths::ActorsPaths(const osg::ref_ptr& root, bool enabled) : mRootNode(root) , mEnabled(enabled) + , mGroupStateSet(makeGroupStateSet()) + , mDebugDrawStateSet(SceneUtil::DebugDraw::makeStateSet()) { } @@ -48,14 +67,15 @@ namespace MWRender if (group != mGroups.end()) mRootNode->removeChild(group->second.mNode); - auto newGroup = SceneUtil::createAgentPathGroup(path, agentBounds, start, end, settings.mRecast); - if (newGroup) - { - MWBase::Environment::get().getResourceSystem()->getSceneManager()->recreateShaders(newGroup, "debug"); - newGroup->setNodeMask(Mask_Debug); - mRootNode->addChild(newGroup); - mGroups[actor.mRef] = Group{ actor.mCell, std::move(newGroup) }; - } + osg::ref_ptr newGroup + = SceneUtil::createAgentPathGroup(path, agentBounds, start, end, settings.mRecast, mDebugDrawStateSet); + newGroup->setNodeMask(Mask_Debug); + newGroup->setStateSet(mGroupStateSet); + + MWBase::Environment::get().getResourceSystem()->getSceneManager()->recreateShaders(newGroup, "debug"); + + mRootNode->addChild(newGroup); + mGroups.insert_or_assign(group, actor.mRef, Group{ actor.mCell, std::move(newGroup) }); } void ActorsPaths::remove(const MWWorld::ConstPtr& actor) diff --git a/apps/openmw/mwrender/actorspaths.hpp b/apps/openmw/mwrender/actorspaths.hpp index 239806576f..61f246c777 100644 --- a/apps/openmw/mwrender/actorspaths.hpp +++ b/apps/openmw/mwrender/actorspaths.hpp @@ -7,11 +7,11 @@ #include #include -#include namespace osg { class Group; + class StateSet; } namespace DetourNavigator @@ -56,6 +56,8 @@ namespace MWRender osg::ref_ptr mRootNode; Groups mGroups; bool mEnabled; + osg::ref_ptr mGroupStateSet; + osg::ref_ptr mDebugDrawStateSet; }; } diff --git a/apps/openmw/mwrender/navmesh.cpp b/apps/openmw/mwrender/navmesh.cpp index df3cd22699..e1ab0fbc37 100644 --- a/apps/openmw/mwrender/navmesh.cpp +++ b/apps/openmw/mwrender/navmesh.cpp @@ -1,4 +1,5 @@ #include "navmesh.hpp" + #include "vismask.hpp" #include @@ -129,16 +130,17 @@ namespace MWRender if (mAborted.load(std::memory_order_acquire)) return; - group = SceneUtil::createNavMeshTileGroup(navMesh->getImpl(), *meshTile, mSettings, mGroupStateSet, - mDebugDrawStateSet, flags, minSalt, maxSalt); + group = SceneUtil::createNavMeshTileGroup( + navMesh->getImpl(), *meshTile, mSettings, mDebugDrawStateSet, flags, minSalt, maxSalt); } if (group == nullptr) { removedTiles.push_back(position); continue; } - MWBase::Environment::get().getResourceSystem()->getSceneManager()->recreateShaders(group, "debug"); group->setNodeMask(Mask_Debug); + group->setStateSet(mGroupStateSet); + MWBase::Environment::get().getResourceSystem()->getSceneManager()->recreateShaders(group, "debug"); updatedTiles.emplace_back(position, Tile{ version, std::move(group) }); } @@ -166,7 +168,7 @@ namespace MWRender bool enabled, Settings::NavMeshRenderMode mode) : mRootNode(root) , mWorkQueue(workQueue) - , mGroupStateSet(SceneUtil::makeNavMeshTileStateSet()) + , mGroupStateSet(SceneUtil::makeDetourGroupStateSet()) , mDebugDrawStateSet(SceneUtil::DebugDraw::makeStateSet()) , mEnabled(enabled) , mMode(mode) diff --git a/apps/openmw/mwrender/navmesh.hpp b/apps/openmw/mwrender/navmesh.hpp index 193a474ec4..8ac93e095f 100644 --- a/apps/openmw/mwrender/navmesh.hpp +++ b/apps/openmw/mwrender/navmesh.hpp @@ -11,7 +11,6 @@ #include #include #include -#include #include class dtNavMesh; diff --git a/apps/openmw/mwrender/recastmesh.cpp b/apps/openmw/mwrender/recastmesh.cpp index 65e7c344d8..36a56a1eda 100644 --- a/apps/openmw/mwrender/recastmesh.cpp +++ b/apps/openmw/mwrender/recastmesh.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -19,6 +20,8 @@ namespace MWRender RecastMesh::RecastMesh(const osg::ref_ptr& root, bool enabled) : mRootNode(root) , mEnabled(enabled) + , mGroupStateSet(SceneUtil::makeDetourGroupStateSet()) + , mDebugDrawStateSet(SceneUtil::DebugDraw::makeStateSet()) { } @@ -55,11 +58,16 @@ namespace MWRender if (it->second.mVersion != tile->second->getVersion()) { - const auto group = SceneUtil::createRecastMeshGroup(*tile->second, settings.mRecast); - MWBase::Environment::get().getResourceSystem()->getSceneManager()->recreateShaders(group, "debug"); + const osg::ref_ptr group + = SceneUtil::createRecastMeshGroup(*tile->second, settings.mRecast, mDebugDrawStateSet); group->setNodeMask(Mask_Debug); + group->setStateSet(mGroupStateSet); + + MWBase::Environment::get().getResourceSystem()->getSceneManager()->recreateShaders(group, "debug"); + mRootNode->removeChild(it->second.mValue); mRootNode->addChild(group); + it->second.mValue = group; it->second.mVersion = tile->second->getVersion(); } @@ -79,9 +87,13 @@ namespace MWRender mRootNode->removeChild(it->second.mValue); } - const auto group = SceneUtil::createRecastMeshGroup(*mesh, settings.mRecast); - MWBase::Environment::get().getResourceSystem()->getSceneManager()->recreateShaders(group, "debug"); + const osg::ref_ptr group + = SceneUtil::createRecastMeshGroup(*mesh, settings.mRecast, mDebugDrawStateSet); group->setNodeMask(Mask_Debug); + group->setStateSet(mGroupStateSet); + + MWBase::Environment::get().getResourceSystem()->getSceneManager()->recreateShaders(group, "debug"); + mGroups.insert_or_assign(it, position, Group{ mesh->getVersion(), group }); mRootNode->addChild(group); } diff --git a/apps/openmw/mwrender/recastmesh.hpp b/apps/openmw/mwrender/recastmesh.hpp index 271f209684..5fadd0b76a 100644 --- a/apps/openmw/mwrender/recastmesh.hpp +++ b/apps/openmw/mwrender/recastmesh.hpp @@ -10,6 +10,7 @@ namespace osg { class Group; class Geometry; + class StateSet; } namespace DetourNavigator @@ -47,6 +48,8 @@ namespace MWRender osg::ref_ptr mRootNode; bool mEnabled; std::map mGroups; + osg::ref_ptr mGroupStateSet; + osg::ref_ptr mDebugDrawStateSet; }; } diff --git a/components/sceneutil/agentpath.cpp b/components/sceneutil/agentpath.cpp index 4e8f177e55..84afaa11f7 100644 --- a/components/sceneutil/agentpath.cpp +++ b/components/sceneutil/agentpath.cpp @@ -1,4 +1,5 @@ #include "agentpath.hpp" + #include "detourdebugdraw.hpp" #include @@ -38,13 +39,13 @@ namespace SceneUtil { osg::ref_ptr createAgentPathGroup(const std::deque& path, const DetourNavigator::AgentBounds& agentBounds, const osg::Vec3f& start, const osg::Vec3f& end, - const DetourNavigator::RecastSettings& settings) + const DetourNavigator::RecastSettings& settings, const osg::ref_ptr& debugDrawStateSet) { using namespace DetourNavigator; - const osg::ref_ptr group(new osg::Group); + osg::ref_ptr group(new osg::Group); - DebugDraw debugDraw(*group, DebugDraw::makeStateSet(), osg::Vec3f(0, 0, 0), 1); + DebugDraw debugDraw(*group, debugDrawStateSet, osg::Vec3f(0, 0, 0), 1); const auto agentRadius = DetourNavigator::getAgentRadius(agentBounds); const auto agentHeight = DetourNavigator::getAgentHeight(agentBounds); @@ -69,10 +70,6 @@ namespace SceneUtil debugDraw.depthMask(true); - osg::ref_ptr material = new osg::Material; - material->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE); - group->getOrCreateStateSet()->setAttribute(material); - return group; } } diff --git a/components/sceneutil/agentpath.hpp b/components/sceneutil/agentpath.hpp index af4e9cca71..0e420d0d63 100644 --- a/components/sceneutil/agentpath.hpp +++ b/components/sceneutil/agentpath.hpp @@ -9,6 +9,7 @@ namespace osg { class Group; class Vec3f; + class StateSet; } namespace DetourNavigator @@ -21,7 +22,7 @@ namespace SceneUtil { osg::ref_ptr createAgentPathGroup(const std::deque& path, const DetourNavigator::AgentBounds& agentBounds, const osg::Vec3f& start, const osg::Vec3f& end, - const DetourNavigator::RecastSettings& settings); + const DetourNavigator::RecastSettings& settings, const osg::ref_ptr& debugDrawStateSet); } #endif diff --git a/components/sceneutil/detourdebugdraw.cpp b/components/sceneutil/detourdebugdraw.cpp index 3e07d17a23..d6bba027eb 100644 --- a/components/sceneutil/detourdebugdraw.cpp +++ b/components/sceneutil/detourdebugdraw.cpp @@ -1,9 +1,15 @@ #include "detourdebugdraw.hpp" + +#include "depth.hpp" #include "util.hpp" #include #include #include +#include +#include + +#include namespace { @@ -113,4 +119,20 @@ namespace SceneUtil stateSet->setAttributeAndModes(new osg::BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); return stateSet; } + + osg::ref_ptr makeDetourGroupStateSet() + { + osg::ref_ptr material = new osg::Material; + material->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE); + + const float polygonOffsetFactor = SceneUtil::AutoDepth::isReversed() ? 1.0 : -1.0; + const float polygonOffsetUnits = SceneUtil::AutoDepth::isReversed() ? 1.0 : -1.0; + osg::ref_ptr polygonOffset + = new osg::PolygonOffset(polygonOffsetFactor, polygonOffsetUnits); + + osg::ref_ptr stateSet = new osg::StateSet; + stateSet->setAttribute(material); + stateSet->setAttributeAndModes(polygonOffset); + return stateSet; + } } diff --git a/components/sceneutil/detourdebugdraw.hpp b/components/sceneutil/detourdebugdraw.hpp index 1da68db73b..e8606fd792 100644 --- a/components/sceneutil/detourdebugdraw.hpp +++ b/components/sceneutil/detourdebugdraw.hpp @@ -53,6 +53,8 @@ namespace SceneUtil void addColor(osg::Vec4f&& value); }; + + osg::ref_ptr makeDetourGroupStateSet(); } #endif \ No newline at end of file diff --git a/components/sceneutil/navmesh.cpp b/components/sceneutil/navmesh.cpp index 2254150a53..9298afe760 100644 --- a/components/sceneutil/navmesh.cpp +++ b/components/sceneutil/navmesh.cpp @@ -1,5 +1,5 @@ #include "navmesh.hpp" -#include "depth.hpp" + #include "detourdebugdraw.hpp" #include @@ -7,10 +7,6 @@ #include #include -#include -#include - -#include namespace { @@ -270,31 +266,14 @@ namespace namespace SceneUtil { - osg::ref_ptr makeNavMeshTileStateSet() - { - osg::ref_ptr material = new osg::Material; - material->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE); - - const float polygonOffsetFactor = SceneUtil::AutoDepth::isReversed() ? 1.0 : -1.0; - const float polygonOffsetUnits = SceneUtil::AutoDepth::isReversed() ? 1.0 : -1.0; - osg::ref_ptr polygonOffset - = new osg::PolygonOffset(polygonOffsetFactor, polygonOffsetUnits); - - osg::ref_ptr stateSet = new osg::StateSet; - stateSet->setAttribute(material); - stateSet->setAttributeAndModes(polygonOffset); - return stateSet; - } - osg::ref_ptr createNavMeshTileGroup(const dtNavMesh& navMesh, const dtMeshTile& meshTile, - const DetourNavigator::Settings& settings, const osg::ref_ptr& groupStateSet, - const osg::ref_ptr& debugDrawStateSet, unsigned char flags, unsigned minSalt, unsigned maxSalt) + const DetourNavigator::Settings& settings, const osg::ref_ptr& debugDrawStateSet, + unsigned char flags, unsigned minSalt, unsigned maxSalt) { if (meshTile.header == nullptr) return nullptr; osg::ref_ptr group(new osg::Group); - group->setStateSet(groupStateSet); constexpr float shift = 10.0f; DebugDraw debugDraw( *group, debugDrawStateSet, osg::Vec3f(0, 0, shift), 1.0f / settings.mRecast.mRecastScaleFactor); diff --git a/components/sceneutil/navmesh.hpp b/components/sceneutil/navmesh.hpp index 95d79ea4de..da9012ba7b 100644 --- a/components/sceneutil/navmesh.hpp +++ b/components/sceneutil/navmesh.hpp @@ -27,11 +27,9 @@ namespace SceneUtil NavMeshTileDrawFlagsHeat = 1 << 3, }; - osg::ref_ptr makeNavMeshTileStateSet(); - osg::ref_ptr createNavMeshTileGroup(const dtNavMesh& navMesh, const dtMeshTile& meshTile, - const DetourNavigator::Settings& settings, const osg::ref_ptr& groupStateSet, - const osg::ref_ptr& debugDrawStateSet, unsigned char flags, unsigned minSalt, unsigned maxSalt); + const DetourNavigator::Settings& settings, const osg::ref_ptr& debugDrawStateSet, + unsigned char flags, unsigned minSalt, unsigned maxSalt); } #endif diff --git a/components/sceneutil/recastmesh.cpp b/components/sceneutil/recastmesh.cpp index cdb2025d1d..7491eb7c95 100644 --- a/components/sceneutil/recastmesh.cpp +++ b/components/sceneutil/recastmesh.cpp @@ -1,5 +1,5 @@ #include "recastmesh.hpp" -#include "depth.hpp" + #include "detourdebugdraw.hpp" #include @@ -41,13 +41,14 @@ namespace namespace SceneUtil { - osg::ref_ptr createRecastMeshGroup( - const DetourNavigator::RecastMesh& recastMesh, const DetourNavigator::RecastSettings& settings) + osg::ref_ptr createRecastMeshGroup(const DetourNavigator::RecastMesh& recastMesh, + const DetourNavigator::RecastSettings& settings, const osg::ref_ptr& debugDrawStateSet) { using namespace DetourNavigator; const osg::ref_ptr group(new osg::Group); - DebugDraw debugDraw(*group, DebugDraw::makeStateSet(), osg::Vec3f(0, 0, 0), 1.0f); + + DebugDraw debugDraw(*group, debugDrawStateSet, osg::Vec3f(0, 0, 0), 1.0f); const DetourNavigator::Mesh& mesh = recastMesh.getMesh(); std::vector indices = mesh.getIndices(); std::vector vertices = mesh.getVertices(); @@ -70,18 +71,6 @@ namespace SceneUtil duDebugDrawTriMeshSlope(&debugDraw, vertices.data(), static_cast(vertices.size() / 3), indices.data(), normals.data(), static_cast(indices.size() / 3), settings.mMaxSlope, texScale); - osg::ref_ptr material = new osg::Material; - material->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE); - - const float polygonOffsetFactor = SceneUtil::AutoDepth::isReversed() ? 1.0 : -1.0; - const float polygonOffsetUnits = SceneUtil::AutoDepth::isReversed() ? 1.0 : -1.0; - osg::ref_ptr polygonOffset - = new osg::PolygonOffset(polygonOffsetFactor, polygonOffsetUnits); - - osg::ref_ptr stateSet = group->getOrCreateStateSet(); - stateSet->setAttribute(material); - stateSet->setAttributeAndModes(polygonOffset); - return group; } } diff --git a/components/sceneutil/recastmesh.hpp b/components/sceneutil/recastmesh.hpp index bc9fb1c3ea..a1b199c6bb 100644 --- a/components/sceneutil/recastmesh.hpp +++ b/components/sceneutil/recastmesh.hpp @@ -6,6 +6,7 @@ namespace osg { class Group; + class StateSet; } namespace DetourNavigator @@ -16,8 +17,8 @@ namespace DetourNavigator namespace SceneUtil { - osg::ref_ptr createRecastMeshGroup( - const DetourNavigator::RecastMesh& recastMesh, const DetourNavigator::RecastSettings& settings); + osg::ref_ptr createRecastMeshGroup(const DetourNavigator::RecastMesh& recastMesh, + const DetourNavigator::RecastSettings& settings, const osg::ref_ptr& debugDrawStateSet); } #endif