diff --git a/assets/blender/buildings/parts/edit-firniture-props.py b/assets/blender/buildings/parts/edit-firniture-props.py index e3b41ad..669ee90 100644 --- a/assets/blender/buildings/parts/edit-firniture-props.py +++ b/assets/blender/buildings/parts/edit-firniture-props.py @@ -1,4 +1,5 @@ import bpy +import mathutils ACTION_PROPS = ["name", "action", "action_text", "height", "radius", "tags"] FURNITURE_PROPS = ["name", "furniture_tags"] @@ -25,8 +26,9 @@ class TEST_OT_LinkAndPlay(bpy.types.Operator): # 2. Add to scene and create Override rig_obj = None for obj in data_to.objects: + offset = mathutils.Matrix.Translation((0, -0.1, 0)) bpy.context.collection.objects.link(obj) - obj.matrix_world = target.matrix_world + obj.matrix_world = target.matrix_world @ offset if obj.type == 'ARMATURE': rig_obj = obj if obj.library: diff --git a/assets/blender/buildings/parts/export_furniture_parts.py b/assets/blender/buildings/parts/export_furniture_parts.py index 70520a2..f4e7def 100644 --- a/assets/blender/buildings/parts/export_furniture_parts.py +++ b/assets/blender/buildings/parts/export_furniture_parts.py @@ -116,8 +116,8 @@ def export_root_objects_to_gltf(output_dir): if "type" in schild: position["type"] = schild["type"] position["position_x"] = local_pos[0] - position["position_y"] = local_pos[2] - position["position_z"] = local_pos[1] + position["position_y"] = local_pos[1] + position["position_z"] = local_pos[2] position["rotation_w"] = local_rot[0] position["rotation_x"] = local_rot[1] position["rotation_y"] = local_rot[2] @@ -137,8 +137,8 @@ def export_root_objects_to_gltf(output_dir): if "type" in child: position["type"] = child["type"] position["position_x"] = local_pos[0] - position["position_y"] = local_pos[2] - position["position_z"] = local_pos[1] + position["position_y"] = local_pos[1] + position["position_z"] = local_pos[2] position["rotation_w"] = local_rot[0] position["rotation_x"] = local_rot[1] position["rotation_y"] = local_rot[2] diff --git a/assets/blender/buildings/parts/furniture.blend b/assets/blender/buildings/parts/furniture.blend index ad819e7..81c8b6c 100644 --- a/assets/blender/buildings/parts/furniture.blend +++ b/assets/blender/buildings/parts/furniture.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:36d5375c2163be7df868529629bc4fefd69e298c6ec113c5108274ced98af218 -size 2098522 +oid sha256:7dcaec00f89d0129233e64f24b89090cdb5ab95e3a43a2ea3abcd1c978609bb3 +size 2091917 diff --git a/assets/blender/edited-normal-male.blend b/assets/blender/edited-normal-male.blend index 943fdfc..e689b52 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:79830f989bb019636a3edbd4c635687d5c99652ac89cf5d51f82cd34f2532434 -size 13213685 +oid sha256:aad4c8333b7a058aa600e278ed6728801325b3c83917b137734d3e9385d1af1f +size 13203455 diff --git a/src/gamedata/CharacterAIModule.cpp b/src/gamedata/CharacterAIModule.cpp index 7c844cb..3da68bb 100644 --- a/src/gamedata/CharacterAIModule.cpp +++ b/src/gamedata/CharacterAIModule.cpp @@ -375,9 +375,10 @@ CharacterAIModule::CharacterAIModule(flecs::world &ecs) }); }); }); +#if 1 ecs.system("PlanAI") .kind(flecs::OnUpdate) - .interval(1.0f) + .interval(0.5f) .each([&](flecs::entity town, TownAI &ai, const TownNPCs &npcs) { Ogre::Root::getSingleton().getWorkQueue()->addTask( @@ -393,6 +394,7 @@ CharacterAIModule::CharacterAIModule(flecs::world &ecs) }); }); }); +#endif } void CharacterAIModule::createAI(flecs::entity town) @@ -413,10 +415,14 @@ void CharacterAIModule::buildPlans(flecs::entity town, const TownNPCs &npcs, if (ai.plans.find(it->first) != ai.plans.end() && ai.plans.at(it->first).size() > 0) continue; - ai.plans[it->first] = {}; + const auto &npc = npcs.npcs.at(it->first); + int index = it->first; + ai.plans[index] = {}; for (const auto &goal : ai.goals) { if (goal.is_reached(bb)) continue; + struct TownAI::Plan plan; + plan.goal = &goal; #if 0 std::cout << "blackboard: " << bb.stats.dump(4) @@ -477,12 +483,14 @@ void CharacterAIModule::buildPlans(flecs::entity town, const TownNPCs &npcs, // "planning"); #endif if (path_length > 0) { - struct TownAI::Plan plan; plan.goal = &goal; plan.plan.insert(plan.plan.end(), path.begin(), path.begin() + path_length); ai.plans[it->first].push_back(plan); + break; } + if (path_length > 0) + OgreAssert(false, "plan"); } } } diff --git a/src/gamedata/GUIModule.cpp b/src/gamedata/GUIModule.cpp index 4a83917..c51e71a 100644 --- a/src/gamedata/GUIModule.cpp +++ b/src/gamedata/GUIModule.cpp @@ -89,7 +89,8 @@ struct GUIListener : public Ogre::RenderTargetListener { } void buttons_panel() { - ImVec2 size = ImGui::GetMainViewport()->Size; + bool enableDebugRender = ECS::get().enableDbgDraw; + ImVec2 size = ImGui::GetMainViewport()->Size; float window_width = size.x * 0.2f; if (window_width > panel_width) window_width = panel_width; @@ -115,7 +116,14 @@ struct GUIListener : public Ogre::RenderTargetListener { if (enableMapEditor) enableEditor = false; } - ImGui::Text("Text message..."); + if (ImGui::Checkbox("Enable physics debug", + &enableDebugRender)) { + ECS::get_mut().enableDbgDraw = + enableDebugRender; + ECS::modified(); + PhysicsModule::setDebugDraw(enableDebugRender); + } + ImGui::Text("Text message..."); ImGui::End(); } void create_entity_node(const Ogre::String &name, int key) diff --git a/src/gamedata/PlayerActionModule.cpp b/src/gamedata/PlayerActionModule.cpp index 0bce026..705b8e8 100644 --- a/src/gamedata/PlayerActionModule.cpp +++ b/src/gamedata/PlayerActionModule.cpp @@ -452,10 +452,14 @@ out:; { if (placeLocalOffset.find(place) == placeLocalOffset.end()) return; + std::cout << "local offset: " << placeLocalOffset[place] + << std::endl; + std::cout << "parent offset: " << anode.position << std::endl; Ogre::Quaternion newRotation = anode.rotation * placeLocalRotation[place]; Ogre::Vector3 newPosition = - anode.position + newRotation * placeLocalOffset[place]; + anode.position + + anode.rotation * placeLocalOffset[place]; if (ch.is_valid() && ch.has()) { ch.get() .mBodyNode->_setDerivedOrientation(newRotation); @@ -478,38 +482,57 @@ out:; delay += delta; // activate anly after delay if (ECS::get().act == 0 && delay > 0.2f) { + delay = 0.0f; + state = 10; // Yay!!! std::cout << "Node data: " << std::endl; std::cout << anode.props.dump(4) << std::endl; - if (ch.is_valid()) { - PhysicsModule::controlPhysics(ch, - false); - // no control by player or ai - ch.add(); - if (word == "sit") - ch.set( - { "sitting-chair", - { 0, 0, 0 } }); - // else - // ch.set( - // { "idle", { 0, 0, 0 } }); - } - teleport("enter"); - delay = 0.0f; - state = 5; } else if (ECS::get().act == 0 && delay <= 0.2f) { delay = 0.0f; - state = 10; + state = 100; } break; - case 5: + case 10: + if (ch.is_valid()) { + PhysicsModule::controlPhysics(ch, false); + // no control by player or ai + ch.add(); + // else + // ch.set( + // { "idle", { 0, 0, 0 } }); + } + delay = 0.0f; + state++; + break; + case 11: + teleport("enter"); + delay = 0.0f; + state++; + break; + case 12: + if (ch.is_valid()) { + if (word == "sit") + ch.set( + { "sitting-chair", + { 0, 0, 0 } }); + } + teleport("enter"); + delay = 0.0f; + state++; + break; + case 13: + teleport("enter"); + delay = 0.0f; + state = 50; + break; + case 50: // teleport again to handle possible problems caused by root motion delay = 0.0f; teleport("enter"); state++; break; - case 6: + case 51: // do not move anywhere until we depress key and wait a bit if (ECS::get().act == 0) delay += delta; @@ -518,7 +541,7 @@ out:; state++; } break; - case 7: + case 52: // if the key is pressed for a second move to next state if (ECS::get().act) delay += delta; @@ -527,15 +550,15 @@ out:; state++; } break; - case 8: + case 53: delay = 0.0; - state = 10; + state = 100; break; - case 10: + case 100: delay = 0.0; state++; break; - case 11: + case 101: // wait until key is depressed for a second if (ECS::get().act == 0) delay += delta; @@ -544,7 +567,7 @@ out:; state++; } break; - case 12: + case 102: delay = 0.0f; state = 0; return OK;