Compare commits

..

2 Commits

Author SHA1 Message Date
a62d781aa0 Updates 2025-09-21 00:05:28 +03:00
fea7c71788 Updates 2025-09-20 23:14:17 +03:00
22 changed files with 1490 additions and 17 deletions

View File

@@ -10,6 +10,9 @@
"variant": "cpp",
"tuple": "cpp",
"iostream": "cpp",
"string_view": "cpp"
"string_view": "cpp",
"atomic": "cpp",
"memory_resource": "cpp",
"stop_token": "cpp"
}
}

View File

@@ -70,6 +70,7 @@ add_subdirectory(src/characters)
add_subdirectory(src/gamedata)
add_subdirectory(src/miniaudio)
add_subdirectory(src/sound)
add_subdirectory(src/sceneloader)
add_subdirectory(audio/gui)
add_subdirectory(tests)
add_subdirectory(lua-scripts)
@@ -101,6 +102,7 @@ target_link_libraries(Game OgreBites OgreBullet OgrePaging OgreTerrain OgreMeshL
${BULLET_COLLISION_LIBRARY} ${BULLET_MATH_LIBRARY}
GameData
sound
sceneloader
flecs::flecs_static
-Wl,--as-needed
)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -6,7 +6,7 @@ class VRMDataFemale:
editfile = "modelling-vroid-normal-female.blend"
armature_name = "female"
mixamo_animation_path = basepath + "/assets/blender/mixamo/female/"
mixamo_animations = ["idle", "walking", "running", "jump", "left_turn", "right_turn", "swimming", "treading_water"]
mixamo_animations = ["idle", "walking", "running", "jump", "left_turn", "right_turn", "swimming", "treading_water", "sitting", "hanging-climb", "hanging-idle"]
fbx_scale = 0.89
class VRMDataMale:
path = "buch1.vrm"
@@ -14,7 +14,7 @@ class VRMDataMale:
editfile = "modelling-vroid-normal-male.blend"
armature_name = "male"
mixamo_animation_path = basepath + "/assets/blender/mixamo/male/"
mixamo_animations = ["idle", "walking", "running", "jump", "left_turn", "right_turn", "swimming", "treading_water"]
mixamo_animations = ["idle", "walking", "running", "jump", "left_turn", "right_turn", "swimming", "treading_water", "sitting", "hanging-climb", "hanging-idle"]
fbx_scale = 1.0
class VRMDataMaleBabyShape:
path = "buch1-chibi.vrm"

Binary file not shown.

View File

@@ -229,10 +229,12 @@ function StartGameQuest()
print('activate...')
local mc_is_free = function()
this.boat_id = ecs_vehicle_set("boat", 0, 0, -20, 1.75)
this.boat2_id = ecs_vehicle_set("boat", -10, 0, -20, 1.55)
this.trigger_id = ecs_child_character_trigger(this.boat_id, "entered_boat", 0, 0, 0, 3, 3)
this.npc_id = ecs_npc_set("normal-female.glb", 0, 2, -20, 1.75)
this.boat = true
local npc = ecs_npc_set("normal-female.glb", 0, 2, -20, 1.75)
ecs_character_physics_control(npc, false)
-- ecs_set_slot(this.boat_id, this.npc_id, "captain_seat")
-- ecs_character_physics_control(this.npc_id, false)
ecs_character_params_set("player", "gravity", true)
ecs_character_params_set("player", "buoyancy", true)
end

View File

@@ -1,5 +1,8 @@
#include <iostream>
#include <Ogre.h>
#include <OgreMeshManager.h>
#include <pugixml.hpp>
#include "loader.h"
#include "Components.h"
#include "GameData.h"
#include "BoatModule.h"
@@ -35,7 +38,7 @@ BoatModule::BoatModule(flecs::world &ecs)
ECS::get<EngineData>()
.mWorld->addRigidBody(
0, boat.mEnt,
Ogre::Bullet::CT_HULL,
Ogre::Bullet::CT_TRIMESH,
nullptr, 2, 0x7fffffff);
} else if (type.resourceName.find(".scene") !=
std::string::npos) {
@@ -48,7 +51,16 @@ BoatModule::BoatModule(flecs::world &ecs)
Ogre::SceneNode *attachment =
eng.mScnMgr->getRootSceneNode()
->createChildSceneNode();
attachment->loadChildren(type.resourceName);
Ogre::DataStreamPtr scene =
Ogre::ResourceGroupManager::getSingleton()
.openResource(
type.resourceName,
Ogre::ResourceGroupManager::
AUTODETECT_RESOURCE_GROUP_NAME);
SceneLoader loader;
loader.load(scene, "General", attachment,
(int)e.raw_id());
// attachment->loadChildren(type.resourceName);
std::vector<Ogre::Node *> v =
attachment->getChildren();
int i;
@@ -69,13 +81,15 @@ BoatModule::BoatModule(flecs::world &ecs)
boat.mNode->_setDerivedOrientation(
type.orientation);
boat.mEnt = static_cast<Ogre::Entity *>(
boat.mNode->getAttachedObject("boat"));
boat.mNode->getAttachedObject(
std::to_string((int)e.raw_id()) +
"/boat"));
BoatBody &body = e.ensure<BoatBody>();
body.body =
ECS::get<EngineData>()
.mWorld->addRigidBody(
0, boat.mEnt,
Ogre::Bullet::CT_HULL,
Ogre::Bullet::CT_TRIMESH,
nullptr, 2, 0x7fffffff);
#if 0
boat.mEnt = eng.mScnMgr->getEntity("boat");
@@ -84,6 +98,59 @@ BoatModule::BoatModule(flecs::world &ecs)
BoatBody &body =
e.ensure<BoatBody>();
#endif
std::vector<Ogre::Node *> slots =
boat.mNode->getChildren();
for (i = 0; i < slots.size(); i++) {
Ogre::Any any =
static_cast<Ogre::SceneNode *>(
slots[i])
->getUserObjectBindings()
.getUserAny("type");
if (!any.has_value())
continue;
Ogre::String obj_type =
Ogre::any_cast<Ogre::String>(
any);
std::cout << "child type: " << obj_type
<< std::endl;
}
if (slots.size() > 0) {
VehicleSlots &vs =
e.ensure<VehicleSlots>();
for (i = 0; i < slots.size(); i++) {
Ogre::Any any =
static_cast<Ogre::SceneNode
*>(
slots[i])
->getUserObjectBindings()
.getUserAny(
"type");
if (!any.has_value())
continue;
Ogre::String obj_type =
Ogre::any_cast<
Ogre::String>(
any);
any = static_cast<
Ogre::SceneNode *>(
slots[i])
->getUserObjectBindings()
.getUserAny(
"name");
if (!any.has_value())
continue;
Ogre::String obj_name =
Ogre::any_cast<
Ogre::String>(
any);
vs.seats[obj_name] = {
obj_type,
static_cast<Ogre::SceneNode
*>(
slots[i])
};
}
}
}
e.modified<BoatBody>();
});

View File

@@ -2,5 +2,5 @@ project(gamedata)
find_package(OGRE REQUIRED COMPONENTS Bites Bullet Paging Terrain Overlay CONFIG)
add_library(GameData STATIC GameData.cpp CharacterModule.cpp WaterModule.cpp SunModule.cpp TerrainModule.cpp GUIModule.cpp LuaData.cpp WorldMapModule.cpp
BoatModule.cpp EventTriggerModule.cpp)
target_link_libraries(GameData PUBLIC OgreMain OgreBites OgreBullet OgrePaging OgreTerrain OgreOverlay flecs::flecs_static lua)
target_include_directories(GameData PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(GameData PUBLIC OgreMain OgreBites OgreBullet OgrePaging OgreTerrain OgreOverlay flecs::flecs_static lua sceneloader)
target_include_directories(GameData PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

View File

@@ -733,6 +733,33 @@ CharacterModule::CharacterModule(flecs::world &ecs)
<< "\n";
});
#endif
ecs.system<const EngineData, const CharacterBase, CharacterSlot>(
"UpdatePhysics2")
.kind(flecs::OnUpdate)
.with<CharacterDisablePhysics>()
.each([](flecs::entity e, const EngineData &eng,
const CharacterBase &ch, CharacterSlot &slot) {
if (slot.parent_e.has<VehicleSlots>()) {
const VehicleSlots &slots =
slot.parent_e.get<VehicleSlots>();
if (slots.seats.find(slot.slot_name) ==
slots.seats.end())
// invalid setting
e.remove<CharacterSlot>();
if (slot.activated)
return;
Ogre::SceneNode *slot_base =
slots.seats.at(slot.slot_name).second;
Ogre::Vector3 position =
slot_base->_getDerivedPosition();
Ogre::Quaternion orientation =
slot_base->_getDerivedOrientation();
ch.mBodyNode->_setDerivedPosition(position);
ch.mBodyNode->_setDerivedOrientation(
orientation);
slot.activated = true;
}
});
ecs.system<const EngineData, const CharacterBody>("UpdatePhysics")
.kind(flecs::OnUpdate)
.with<CharacterUpdatePhysicsState>()

View File

@@ -11,6 +11,11 @@ struct CharacterGravity {};
struct CharacterBuoyancy {};
struct CharacterDisablePhysics {};
struct CharacterUpdatePhysicsState {};
struct CharacterSlot {
flecs::entity parent_e;
Ogre::String slot_name;
bool activated;
};
struct CharacterBase {
Ogre::String type;
float mTimer;

View File

@@ -76,5 +76,10 @@ struct InWater {};
struct TerrainReady {};
struct WaterReady {};
struct GroundCheckReady {};
struct VehicleSlots {
std::unordered_map<Ogre::String,
std::pair<Ogre::String, Ogre::SceneNode *> >
seats;
};
}
#endif

View File

@@ -399,6 +399,20 @@ LuaData::LuaData()
return 0;
});
lua_setglobal(L, "ecs_character_physics_control");
lua_pushcfunction(L, [](lua_State *L) -> int {
OgreAssert(lua_gettop(L) == 3, "Bad parameters");
luaL_checktype(L, 1, LUA_TNUMBER); // parent
luaL_checktype(L, 2, LUA_TNUMBER); // object
luaL_checktype(L, 3, LUA_TSTRING); // slot
int parent = lua_tointeger(L, 1);
int object = lua_tointeger(L, 2);
Ogre::String slot = lua_tostring(L, 3);
flecs::entity parent_e = idmap.get_entity(parent);
flecs::entity object_e = idmap.get_entity(object);
object_e.set<CharacterSlot>({ parent_e, slot, false });
return 0;
});
lua_setglobal(L, "ecs_set_slot");
}
LuaData::~LuaData()

View File

@@ -0,0 +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 OgreTerrain)

1245
src/sceneloader/loader.cpp Normal file

File diff suppressed because it is too large Load Diff

79
src/sceneloader/loader.h Normal file
View File

@@ -0,0 +1,79 @@
#ifndef LOADER_H_
#define LOADER_H_
#include <OgreColourValue.h>
#include <OgreQuaternion.h>
#include <OgreResourceGroupManager.h>
#include <OgreString.h>
#include <OgrePlugin.h>
#include <OgreCodec.h>
class SceneLoader {
public:
SceneLoader();
virtual ~SceneLoader();
void load(Ogre::DataStreamPtr &stream, const Ogre::String &groupName,
Ogre::SceneNode *rootNode, int counter);
void exportScene(Ogre::SceneNode *rootNode,
const Ogre::String &outFileName);
const Ogre::ColourValue &getBackgroundColour()
{
return mBackgroundColour;
}
protected:
void writeNode(pugi::xml_node &parentXML, const Ogre::SceneNode *node);
void processScene(pugi::xml_node &XMLRoot);
void processNodes(pugi::xml_node &XMLNode);
void processExternals(pugi::xml_node &XMLNode);
void processEnvironment(pugi::xml_node &XMLNode);
void processTerrainGroup(pugi::xml_node &XMLNode);
void processBlendmaps(pugi::xml_node &XMLNode);
void processUserData(pugi::xml_node &XMLNode,
Ogre::UserObjectBindings &userData);
void processLight(pugi::xml_node &XMLNode,
Ogre::SceneNode *pParent = 0);
void processCamera(pugi::xml_node &XMLNode,
Ogre::SceneNode *pParent = 0);
void processNode(pugi::xml_node &XMLNode, Ogre::SceneNode *pParent = 0);
void processLookTarget(pugi::xml_node &XMLNode,
Ogre::SceneNode *pParent);
void processTrackTarget(pugi::xml_node &XMLNode,
Ogre::SceneNode *pParent);
void processEntity(pugi::xml_node &XMLNode, Ogre::SceneNode *pParent);
void processParticleSystem(pugi::xml_node &XMLNode,
Ogre::SceneNode *pParent);
void processBillboardSet(pugi::xml_node &XMLNode,
Ogre::SceneNode *pParent);
void processPlane(pugi::xml_node &XMLNode, Ogre::SceneNode *pParent);
void processNodeAnimations(pugi::xml_node &XMLNode,
Ogre::SceneNode *pParent);
void processNodeAnimation(pugi::xml_node &XMLNode,
Ogre::SceneNode *pParent);
void processKeyframe(pugi::xml_node &XMLNode,
Ogre::NodeAnimationTrack *pTrack);
void processFog(pugi::xml_node &XMLNode);
void processSkyBox(pugi::xml_node &XMLNode);
void processSkyDome(pugi::xml_node &XMLNode);
void processSkyPlane(pugi::xml_node &XMLNode);
void processLightRange(pugi::xml_node &XMLNode, Ogre::Light *pLight);
void processLightAttenuation(pugi::xml_node &XMLNode,
Ogre::Light *pLight);
void processLightSourceSize(pugi::xml_node &XMLNode,
Ogre::Light *pLight);
Ogre::SceneManager *mSceneMgr;
Ogre::SceneNode *mAttachNode;
Ogre::String m_sGroupName;
Ogre::ColourValue mBackgroundColour;
Ogre::String mNamePrefix;
int counter;
};
#endif