From fea7c71788cfd55b64afd633cbf79c661b968e14 Mon Sep 17 00:00:00 2001 From: Sergey Lapin Date: Sat, 20 Sep 2025 23:14:17 +0300 Subject: [PATCH] Updates --- .vscode/settings.json | 5 +- CMakeLists.txt | 2 + assets/blender/edited-normal-male.blend | 4 +- .../blender/mixamo/female/hanging-climb.fbx | 3 + assets/blender/mixamo/female/hanging-idle.fbx | 3 + assets/blender/mixamo/female/sitting.fbx | 3 + assets/blender/mixamo/male/hanging-climb.fbx | 3 + assets/blender/mixamo/male/hanging-idle.fbx | 3 + assets/blender/mixamo/male/sitting.fbx | 3 + assets/blender/scripts/settings.py | 4 +- assets/blender/vehicles/boat.blend | 4 +- lua-scripts/data.lua | 6 +- src/gamedata/BoatModule.cpp | 75 ++++++++++++++++++- src/gamedata/CMakeLists.txt | 4 +- src/gamedata/CharacterModule.cpp | 27 +++++++ src/gamedata/CharacterModule.h | 5 ++ src/gamedata/Components.h | 5 ++ src/gamedata/LuaData.cpp | 14 ++++ 18 files changed, 158 insertions(+), 15 deletions(-) create mode 100644 assets/blender/mixamo/female/hanging-climb.fbx create mode 100644 assets/blender/mixamo/female/hanging-idle.fbx create mode 100644 assets/blender/mixamo/female/sitting.fbx create mode 100644 assets/blender/mixamo/male/hanging-climb.fbx create mode 100644 assets/blender/mixamo/male/hanging-idle.fbx create mode 100644 assets/blender/mixamo/male/sitting.fbx diff --git a/.vscode/settings.json b/.vscode/settings.json index 96bd814..05d74cf 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,6 +10,9 @@ "variant": "cpp", "tuple": "cpp", "iostream": "cpp", - "string_view": "cpp" + "string_view": "cpp", + "atomic": "cpp", + "memory_resource": "cpp", + "stop_token": "cpp" } } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 7673d2f..0d3f8a0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 ) diff --git a/assets/blender/edited-normal-male.blend b/assets/blender/edited-normal-male.blend index e9e0bef..92aad87 100644 --- a/assets/blender/edited-normal-male.blend +++ b/assets/blender/edited-normal-male.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:70831d1df8a6c8ce03ec4970a502c127f06f774c042f0a59bd6b8d08cebaf2a9 -size 11628701 +oid sha256:6014b658f78ff6fe4364cdfb8e441c4008ce84beaa7ea46699f5093d90d02959 +size 11630206 diff --git a/assets/blender/mixamo/female/hanging-climb.fbx b/assets/blender/mixamo/female/hanging-climb.fbx new file mode 100644 index 0000000..955c1f3 --- /dev/null +++ b/assets/blender/mixamo/female/hanging-climb.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7efac9b10dd6a3aebcad12fb281c682cd4fdb7bb74c33fcedd9292f45eb2fe65 +size 2132496 diff --git a/assets/blender/mixamo/female/hanging-idle.fbx b/assets/blender/mixamo/female/hanging-idle.fbx new file mode 100644 index 0000000..d5660df --- /dev/null +++ b/assets/blender/mixamo/female/hanging-idle.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15705bd7fa2df50b3cc75df808f682efc977b52d9393750f6050bfead10aa160 +size 2155728 diff --git a/assets/blender/mixamo/female/sitting.fbx b/assets/blender/mixamo/female/sitting.fbx new file mode 100644 index 0000000..b31a066 --- /dev/null +++ b/assets/blender/mixamo/female/sitting.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18a3e40b24a621040657c7b672394712652287a2c241091fdb7da451f8977663 +size 1741824 diff --git a/assets/blender/mixamo/male/hanging-climb.fbx b/assets/blender/mixamo/male/hanging-climb.fbx new file mode 100644 index 0000000..955c1f3 --- /dev/null +++ b/assets/blender/mixamo/male/hanging-climb.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7efac9b10dd6a3aebcad12fb281c682cd4fdb7bb74c33fcedd9292f45eb2fe65 +size 2132496 diff --git a/assets/blender/mixamo/male/hanging-idle.fbx b/assets/blender/mixamo/male/hanging-idle.fbx new file mode 100644 index 0000000..d5660df --- /dev/null +++ b/assets/blender/mixamo/male/hanging-idle.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15705bd7fa2df50b3cc75df808f682efc977b52d9393750f6050bfead10aa160 +size 2155728 diff --git a/assets/blender/mixamo/male/sitting.fbx b/assets/blender/mixamo/male/sitting.fbx new file mode 100644 index 0000000..c4a68a0 --- /dev/null +++ b/assets/blender/mixamo/male/sitting.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e18383d2acbbf2d249668310f2bde7abcd61ceea67dc036bb25decbb20f353eb +size 1741504 diff --git a/assets/blender/scripts/settings.py b/assets/blender/scripts/settings.py index 25c693c..6ab3e01 100644 --- a/assets/blender/scripts/settings.py +++ b/assets/blender/scripts/settings.py @@ -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" diff --git a/assets/blender/vehicles/boat.blend b/assets/blender/vehicles/boat.blend index 8206a1b..b048859 100644 --- a/assets/blender/vehicles/boat.blend +++ b/assets/blender/vehicles/boat.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8792f5e4530a5e830614a6d6cfff1471b04d9cbbda2cb96711252a392bb81597 -size 375867 +oid sha256:1416cfab6c590a98fbacc2de7a27026e64dad35ba7e278f9df994d30051e28bb +size 378101 diff --git a/lua-scripts/data.lua b/lua-scripts/data.lua index 078d135..b03e032 100644 --- a/lua-scripts/data.lua +++ b/lua-scripts/data.lua @@ -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 diff --git a/src/gamedata/BoatModule.cpp b/src/gamedata/BoatModule.cpp index 4765090..bac6fd9 100644 --- a/src/gamedata/BoatModule.cpp +++ b/src/gamedata/BoatModule.cpp @@ -1,5 +1,8 @@ #include +#include #include +#include +#include "loader.h" #include "Components.h" #include "GameData.h" #include "BoatModule.h" @@ -35,7 +38,7 @@ BoatModule::BoatModule(flecs::world &ecs) ECS::get() .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 v = attachment->getChildren(); int i; @@ -69,13 +81,15 @@ BoatModule::BoatModule(flecs::world &ecs) boat.mNode->_setDerivedOrientation( type.orientation); boat.mEnt = static_cast( - boat.mNode->getAttachedObject("boat")); + boat.mNode->getAttachedObject( + std::to_string((int)e.raw_id()) + + "/boat")); BoatBody &body = e.ensure(); body.body = ECS::get() .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(); #endif + std::vector slots = + boat.mNode->getChildren(); + for (i = 0; i < slots.size(); i++) { + Ogre::Any any = + static_cast( + slots[i]) + ->getUserObjectBindings() + .getUserAny("type"); + if (!any.has_value()) + continue; + Ogre::String obj_type = + Ogre::any_cast( + any); + std::cout << "child type: " << obj_type + << std::endl; + } + if (slots.size() > 0) { + VehicleSlots &vs = + e.ensure(); + for (i = 0; i < slots.size(); i++) { + Ogre::Any any = + static_cast( + 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( + slots[i]) + }; + } + } } e.modified(); }); diff --git a/src/gamedata/CMakeLists.txt b/src/gamedata/CMakeLists.txt index f3a7a35..257dd4c 100644 --- a/src/gamedata/CMakeLists.txt +++ b/src/gamedata/CMakeLists.txt @@ -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}) \ No newline at end of file +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}) diff --git a/src/gamedata/CharacterModule.cpp b/src/gamedata/CharacterModule.cpp index 5462c06..f643b84 100644 --- a/src/gamedata/CharacterModule.cpp +++ b/src/gamedata/CharacterModule.cpp @@ -733,6 +733,33 @@ CharacterModule::CharacterModule(flecs::world &ecs) << "\n"; }); #endif + ecs.system( + "UpdatePhysics2") + .kind(flecs::OnUpdate) + .with() + .each([](flecs::entity e, const EngineData &eng, + const CharacterBase &ch, CharacterSlot &slot) { + if (slot.parent_e.has()) { + const VehicleSlots &slots = + slot.parent_e.get(); + if (slots.seats.find(slot.slot_name) == + slots.seats.end()) + // invalid setting + e.remove(); + 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("UpdatePhysics") .kind(flecs::OnUpdate) .with() diff --git a/src/gamedata/CharacterModule.h b/src/gamedata/CharacterModule.h index 6c3b57e..daa24dc 100644 --- a/src/gamedata/CharacterModule.h +++ b/src/gamedata/CharacterModule.h @@ -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; diff --git a/src/gamedata/Components.h b/src/gamedata/Components.h index ec10646..ace9917 100644 --- a/src/gamedata/Components.h +++ b/src/gamedata/Components.h @@ -76,5 +76,10 @@ struct InWater {}; struct TerrainReady {}; struct WaterReady {}; struct GroundCheckReady {}; +struct VehicleSlots { + std::unordered_map > + seats; +}; } #endif \ No newline at end of file diff --git a/src/gamedata/LuaData.cpp b/src/gamedata/LuaData.cpp index 3ccf4f7..3197839 100644 --- a/src/gamedata/LuaData.cpp +++ b/src/gamedata/LuaData.cpp @@ -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({ parent_e, slot, false }); + return 0; + }); + lua_setglobal(L, "ecs_set_slot"); } LuaData::~LuaData()