From e3c74c5cb2ab51a7908318e2059b5d6049c456c1 Mon Sep 17 00:00:00 2001 From: Sebastian Fieber Date: Sun, 5 Jan 2025 20:22:29 +0100 Subject: [PATCH] addMesh lua calls --- apps/openmw/mwlua/animationbindings.cpp | 29 +++++++++++++++++++++++++ apps/openmw/mwrender/animation.cpp | 25 +++++++++++++++++++++ apps/openmw/mwrender/animation.hpp | 6 +++++ 3 files changed, 60 insertions(+) diff --git a/apps/openmw/mwlua/animationbindings.cpp b/apps/openmw/mwlua/animationbindings.cpp index 22ebd7e33a..21afc15ce2 100644 --- a/apps/openmw/mwlua/animationbindings.cpp +++ b/apps/openmw/mwlua/animationbindings.cpp @@ -286,6 +286,35 @@ namespace MWLua } }; + api["addMesh"] = [context](const sol::object& object, std::string_view model, std::string_view bonename, + std::string_view meshId) { + context.mLuaManager->addAction( + [object = ObjectVariant(object), model = std::string(model), bonename = std::string(bonename), + meshId = std::string(meshId)] { + MWRender::Animation* anim = getMutableAnimationOrThrow(object); + anim->addCustomMesh(model, bonename, meshId); + }, + "addMeshAction"); + }; + + api["removeMesh"] = [context](const sol::object& object, std::string_view meshId) { + context.mLuaManager->addAction( + [object = ObjectVariant(object), meshId = std::string(meshId)] { + MWRender::Animation* anim = getMutableAnimationOrThrow(object); + anim->removeCustomMesh(meshId); + }, + "removeMeshAction"); + }; + + api["removeAllMeshes"] = [context](const sol::object& object) { + context.mLuaManager->addAction( + [object = ObjectVariant(object)] { + MWRender::Animation* anim = getMutableAnimationOrThrow(object); + anim->removeCustomMeshes(); + }, + "removeAllMeshesAction"); + }; + api["removeVfx"] = [context](const sol::object& object, std::string_view effectId) { context.mLuaManager->addAction( [object = ObjectVariant(object), effectId = std::string(effectId)] { diff --git a/apps/openmw/mwrender/animation.cpp b/apps/openmw/mwrender/animation.cpp index 0a2ef7bef8..0118ca939e 100644 --- a/apps/openmw/mwrender/animation.cpp +++ b/apps/openmw/mwrender/animation.cpp @@ -1708,6 +1708,31 @@ namespace MWRender mExtraLightSource->setActorFade(mAlpha); } + void Animation::removeCustomMesh(std::string_view meshId) + { + mCustomMeshesMap.erase(std::string(meshId)); + } + + void Animation::removeCustomMeshes() + { + mCustomMeshesMap.clear(); + } + + void Animation::addCustomMesh(std::string_view model, std::string_view bonename, std::string_view meshId) + { + SceneUtil::FindByNameVisitor findVisitor(bonename); + mObjectRoot->accept(findVisitor); + osg::Group* parent = findVisitor.mFoundNode; + + if (!parent) + return; + + VFS::Path::Normalized mesh(model); + osg::ref_ptr instance = mResourceSystem->getSceneManager()->getInstance(mesh, parent); + PartHolderPtr holder = std::make_unique(instance); + mCustomMeshesMap.insert(std::pair(meshId, std::move(holder))); + } + void Animation::addEffect(std::string_view model, std::string_view effectId, bool loop, std::string_view bonename, std::string_view texture, bool useAmbientLight) { diff --git a/apps/openmw/mwrender/animation.hpp b/apps/openmw/mwrender/animation.hpp index b6cb6f333c..9fb5f96909 100644 --- a/apps/openmw/mwrender/animation.hpp +++ b/apps/openmw/mwrender/animation.hpp @@ -209,6 +209,8 @@ namespace MWRender mutable NodeMap mNodeMap; mutable bool mNodeMapCreated; + mutable std::unordered_map + mCustomMeshesMap; MWWorld::Ptr mPtr; @@ -349,6 +351,10 @@ namespace MWRender void addEffect(std::string_view model, std::string_view effectId, bool loop = false, std::string_view bonename = {}, std::string_view texture = {}, bool useAmbientLight = true); + void addCustomMesh(std::string_view model, std::string_view bonename, std::string_view meshId); + void removeCustomMesh(std::string_view meshId); + void removeCustomMeshes(); + void removeEffect(std::string_view effectId); void removeEffects(); std::vector getLoopingEffects() const;