Animation tree implemented

This commit is contained in:
2025-09-22 20:34:12 +03:00
parent a62d781aa0
commit 9e5d08bfc6
13 changed files with 1088 additions and 400 deletions

View File

@@ -1,6 +1,6 @@
project(sceneloader)
add_library(sceneloader loader.cpp)
target_include_directories(sceneloader PUBLIC .)
target_link_libraries(sceneloader PUBLIC OgreMain PRIVATE pugixml)
target_link_libraries(sceneloader PUBLIC OgreMain PRIVATE pugixml GameData)
target_link_libraries(sceneloader PUBLIC OgreTerrain)

View File

@@ -3,6 +3,8 @@
#include <OgreTerrain.h>
#include <OgreTerrainGroup.h>
#include <pugixml.hpp>
#include "GameData.h"
#include "EventTriggerModule.h"
#include "loader.h"
using namespace Ogre;
@@ -120,35 +122,6 @@ static ColourValue parseColour(pugi::xml_node &XMLNode)
1);
}
struct SceneCodec : public Codec {
String magicNumberToFileExt(const char *magicNumberPtr,
size_t maxbytes) const override
{
return "";
}
String getType() const override
{
return "scene";
}
void decode(const DataStreamPtr &stream,
const Any &output) const override
{
DataStreamPtr _stream(stream);
SceneLoader loader;
loader.load(_stream,
ResourceGroupManager::getSingleton()
.getWorldResourceGroupName(),
any_cast<SceneNode *>(output), 0);
}
void encodeToFile(const Any &input,
const String &outFileName) const override
{
SceneLoader loader;
loader.exportScene(any_cast<SceneNode *>(input), outFileName);
}
};
SceneLoader::SceneLoader()
: mSceneMgr(0)
, mBackgroundColour(ColourValue::Black)
@@ -160,12 +133,12 @@ SceneLoader::~SceneLoader()
}
void SceneLoader::load(DataStreamPtr &stream, const String &groupName,
SceneNode *rootNode, int counter)
SceneNode *rootNode, flecs::entity e)
{
m_sGroupName = groupName;
mSceneMgr = rootNode->getCreator();
mNamePrefix = rootNode->getName();
this->counter = counter;
this->counter = (int)e.raw_id();
if (counter >= 0) {
if (mNamePrefix.length() > 0)
mNamePrefix += "/";
@@ -173,6 +146,7 @@ void SceneLoader::load(DataStreamPtr &stream, const String &groupName,
}
if (mNamePrefix.length() > 0)
mNamePrefix += "/";
base_e = e;
pugi::xml_document XMLDoc; // character type defaults to char
@@ -571,6 +545,23 @@ void SceneLoader::processNode(pugi::xml_node &XMLNode, SceneNode *pParent)
// Process node animations (?)
if (auto pElement = XMLNode.child("animations"))
processNodeAnimations(pElement, pNode);
Ogre::Any triggerAny =
pNode->getUserObjectBindings().getUserAny("trigger");
if (triggerAny.has_value()) {
flecs::entity e = ECS::get().entity().child_of(base_e);
Ogre::String event = Ogre::any_cast<Ogre::String>(triggerAny);
float h = 2.0f, r = 3.0f;
Ogre::Any anyh = pNode->getUserObjectBindings().getUserAny(
"trigger_height");
if (anyh.has_value())
h = Ogre::any_cast<float>(anyh);
Ogre::Any anyr = pNode->getUserObjectBindings().getUserAny(
"trigger_radius");
if (anyr.has_value())
r = Ogre::any_cast<float>(anyr);
e.set<ECS::EventTrigger>(
{ pNode, Ogre::Vector3(0, 0, 0), h, r, event });
}
}
void SceneLoader::processLookTarget(pugi::xml_node &XMLNode, SceneNode *pParent)

View File

@@ -6,6 +6,7 @@
#include <OgreString.h>
#include <OgrePlugin.h>
#include <OgreCodec.h>
#include <flecs.h>
class SceneLoader {
public:
@@ -13,7 +14,7 @@ public:
virtual ~SceneLoader();
void load(Ogre::DataStreamPtr &stream, const Ogre::String &groupName,
Ogre::SceneNode *rootNode, int counter);
Ogre::SceneNode *rootNode, flecs::entity e);
void exportScene(Ogre::SceneNode *rootNode,
const Ogre::String &outFileName);
@@ -74,6 +75,7 @@ protected:
Ogre::ColourValue mBackgroundColour;
Ogre::String mNamePrefix;
int counter;
flecs::entity base_e;
};
#endif