Added recastnavigation support
This commit is contained in:
@@ -338,15 +338,6 @@ CharacterAIModule::CharacterAIModule(flecs::world &ecs)
|
||||
.interval(0.1f)
|
||||
.each([this](flecs::entity town, ActionNodeList &alist,
|
||||
TownAI &ai, const TownNPCs &npcs) {
|
||||
for (auto it = npcs.npcs.begin(); it != npcs.npcs.end();
|
||||
it++) {
|
||||
const auto &npc = npcs.npcs.at(it->first);
|
||||
if (ai.blackboards.find(it->first) ==
|
||||
ai.blackboards.end())
|
||||
continue;
|
||||
ai.blackboards.at(it->first).setPosition(
|
||||
npc.position);
|
||||
}
|
||||
Ogre::Root::getSingleton().getWorkQueue()->addTask(
|
||||
[this, town, &alist, npcs, &ai]() {
|
||||
{
|
||||
@@ -471,6 +462,7 @@ void CharacterAIModule::buildPlans(flecs::entity town, const TownNPCs &npcs,
|
||||
const auto &npc = npcs.npcs.at(it->first);
|
||||
int index = it->first;
|
||||
ai.plans[index] = {};
|
||||
bb.query_ai();
|
||||
for (const auto &goal : ai.goals)
|
||||
plan_tasks.emplace_back(bb, goal,
|
||||
ai.planner.get());
|
||||
@@ -601,6 +593,8 @@ void CharacterAIModule::updateBlackboards(flecs::entity town,
|
||||
continue;
|
||||
ai.blackboards.at(it->first).index = it->first;
|
||||
ai.blackboards.at(it->first).town = town;
|
||||
ai.blackboards.at(it->first).setPosition(
|
||||
npcs.npcs.at(it->first).position);
|
||||
for (auto e : ai.memoryUpdates) {
|
||||
std::string key = e.name;
|
||||
auto &memory = ai.memory.at(it->first);
|
||||
@@ -613,7 +607,6 @@ void CharacterAIModule::updateBlackboards(flecs::entity town,
|
||||
}
|
||||
auto &bb = ai.blackboards.at(it->first);
|
||||
bb.updateBits(ai, ai.memory.at(it->first), it->second.props);
|
||||
bb.query_ai();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -106,17 +106,22 @@ void setupExteriorScene(Ogre::SceneManager *scnMgr, Ogre::SceneNode *cameraNode,
|
||||
ecs.set<Camera>({ cameraNode, camera, false });
|
||||
ecs.add<GameData>();
|
||||
ecs.add<Input>();
|
||||
ecs.add<WaterSurface>();
|
||||
ecs.set<Sun>({ nullptr, nullptr, nullptr, nullptr });
|
||||
ecs.set<Terrain>({ nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
false,
|
||||
{ 0, 0, 0 } });
|
||||
ecs.observer<GameState>("Game_Start_Scen_Startup")
|
||||
.event(flecs::OnAdd)
|
||||
.each([](GameState &game) {
|
||||
ECS::get().add<WaterSurface>();
|
||||
ECS::get().set<Sun>(
|
||||
{ nullptr, nullptr, nullptr, nullptr });
|
||||
ECS::get().set<Terrain>({ nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
false,
|
||||
{ 0, 0, 0 } });
|
||||
});
|
||||
if (!ecs.has<LuaBase>())
|
||||
ecs.add<LuaBase>();
|
||||
if (!ecs.has<LuaEvent>())
|
||||
|
||||
@@ -70,19 +70,6 @@ PhysicsModule::PhysicsModule(flecs::world &ecs)
|
||||
c.mCameraNode);
|
||||
ECS::modified<Physics>();
|
||||
});
|
||||
#if 0
|
||||
ecs.system<PhysicsBody>("create_body")
|
||||
.kind(flecs::OnUpdate)
|
||||
.without<JPH::BodyID>()
|
||||
.each([&](flecs::entity e, PhysicsBody &rb) {
|
||||
JPH::BodyID id =
|
||||
JoltPhysicsWrapper::getSingleton().createBody(
|
||||
rb.shape.get(), rb.node,
|
||||
(JPH::EMotionType)rb.motion,
|
||||
(JPH::ObjectLayer)rb.layer);
|
||||
e.set<JPH::BodyID>(id);
|
||||
});
|
||||
#endif
|
||||
ecs.system<EngineData, Physics>("physics_update")
|
||||
.kind(PhysicsUpdate)
|
||||
.each([&](EngineData &e, Physics &ph) {
|
||||
@@ -285,57 +272,10 @@ PhysicsModule::PhysicsModule(flecs::world &ecs)
|
||||
"_exit",
|
||||
trigger_e,
|
||||
other_e);
|
||||
#if 0
|
||||
/* do not delete triggers until exit from actuator */
|
||||
other_e.remove<InTrigger>(
|
||||
trigger_e);
|
||||
trigger_e.remove<TriggeredBy>(
|
||||
other_e);
|
||||
#endif
|
||||
}
|
||||
ECS::modified<LuaEvent>();
|
||||
});
|
||||
});
|
||||
#if 0
|
||||
ecs.system<const EngineData, const EventTrigger, const JPH::BodyID>(
|
||||
"UpdateTriggerPhysicsPre")
|
||||
.kind(PhysicsPreUpdate)
|
||||
.with<TerrainReady>()
|
||||
.with<WaterReady>()
|
||||
.with<WaterBody>()
|
||||
.each([](flecs::entity e, const EngineData &eng,
|
||||
const EventTrigger &trigger, const JPH::BodyID &id) {
|
||||
/* FIXME: update positions for triggers, probably need to move somewhere */
|
||||
JoltPhysicsWrapper::getSingleton()
|
||||
.setPositionAndRotation(
|
||||
id, trigger.node->_getDerivedPosition(),
|
||||
trigger.node->_getDerivedOrientation());
|
||||
#if 0
|
||||
std::cout << trigger.node->_getDerivedPosition() << " "
|
||||
<< trigger.node->getPosition() << " "
|
||||
<< trigger.node->getParent()->getName()
|
||||
<< ": " << trigger.node->getName()
|
||||
<< std::endl;
|
||||
// OgreAssert(false, "update triggers");
|
||||
#endif
|
||||
});
|
||||
ecs.system<const EngineData, const EventTrigger, const JPH::BodyID>(
|
||||
"UpdateTriggerPhysicsPost")
|
||||
.kind(PhysicsPostUpdate)
|
||||
.with<TerrainReady>()
|
||||
.with<WaterReady>()
|
||||
.with<WaterBody>()
|
||||
.each([](flecs::entity e, const EngineData &eng,
|
||||
const EventTrigger &trigger, const JPH::BodyID &id) {
|
||||
/* FIXME: update positions for triggers, probably need to move somewhere */
|
||||
Ogre::Vector3 position;
|
||||
Ogre::Quaternion rotation;
|
||||
JoltPhysicsWrapper::getSingleton()
|
||||
.getPositionAndRotation(id, position, rotation);
|
||||
trigger.node->_setDerivedPosition(position);
|
||||
trigger.node->_setDerivedOrientation(rotation);
|
||||
});
|
||||
#endif
|
||||
ecs.system<const EngineData>("init_water")
|
||||
.kind(PhysicsPreUpdate)
|
||||
.with<TerrainReady>()
|
||||
@@ -344,16 +284,6 @@ PhysicsModule::PhysicsModule(flecs::world &ecs)
|
||||
.each([this](const EngineData &eng) {
|
||||
ECS::get().set<WaterBody>({});
|
||||
});
|
||||
#if 0
|
||||
ecs.system<const EngineData>("DebugData")
|
||||
.kind(PhysicsPostUpdate)
|
||||
.each([this](const EngineData &eng) {
|
||||
std::cout << "TerrainReady: "
|
||||
<< ECS::get().has<TerrainReady>();
|
||||
std::cout << " WaterReady: "
|
||||
<< ECS::get().has<WaterReady>() << std::endl;
|
||||
});
|
||||
#endif
|
||||
ecs.system<const EngineData, WaterBody>("update_water")
|
||||
.kind(PhysicsPostUpdate)
|
||||
.with<TerrainReady>()
|
||||
@@ -365,57 +295,6 @@ PhysicsModule::PhysicsModule(flecs::world &ecs)
|
||||
eng.delta,
|
||||
water.mWaterNode->_getDerivedPosition(),
|
||||
body.inWater);
|
||||
#if 0
|
||||
for (JPH::BodyID inBodyID : body.inWater) {
|
||||
if (JoltPhysicsWrapper::getSingleton().isActive(
|
||||
inBodyID)) {
|
||||
float my =
|
||||
JoltPhysicsWrapper::getSingleton()
|
||||
.getPosition(inBodyID)
|
||||
.y;
|
||||
float myv =
|
||||
JoltPhysicsWrapper::getSingleton()
|
||||
.getLinearVelocity(
|
||||
inBodyID)
|
||||
.y;
|
||||
float b = 1.0f;
|
||||
float drag = 0.5f;
|
||||
float adrag = 0.05f;
|
||||
float level = -1.3f;
|
||||
float mdec = 1.0f;
|
||||
float minc = 1.0f;
|
||||
float h = -my + level;
|
||||
if (h < 0)
|
||||
h = 0;
|
||||
if (my < level - 0.1f)
|
||||
b *= 1.1f * (1.0f + 1.2f * h);
|
||||
else if (my > level + 0.1f) {
|
||||
b *= 0.8f;
|
||||
if (myv > 0.1f)
|
||||
b *= 0.9f;
|
||||
if (my > level + 0.4f)
|
||||
b *= 0.5f;
|
||||
}
|
||||
if (myv < 0.0f)
|
||||
drag = 0.7f;
|
||||
JoltPhysicsWrapper::getSingleton().applyBuoyancyImpulse(
|
||||
inBodyID,
|
||||
water.mWaterNode->_getDerivedPosition() -
|
||||
Ogre::Vector3(0, 0.1f,
|
||||
0),
|
||||
Ogre::Vector3::UNIT_Y, b, drag,
|
||||
adrag, Ogre::Vector3::ZERO,
|
||||
eng.delta);
|
||||
// std::cout << b << std::endl;
|
||||
#if 0
|
||||
std::cout << "addHit: "
|
||||
<< JoltPhysics::convert(
|
||||
body.GetPosition())
|
||||
<< std::endl;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
ECS::get().add<WaterReady>();
|
||||
});
|
||||
ecs.system<const JPH::BodyID, const WaterBody>("update_water_status1")
|
||||
@@ -507,12 +386,6 @@ PhysicsModule::PhysicsModule(flecs::world &ecs)
|
||||
float myv = JoltPhysicsWrapper::getSingleton()
|
||||
.getLinearVelocity(id)
|
||||
.y;
|
||||
#if 0
|
||||
if (my < level && myv < 0)
|
||||
b = 10.0f;
|
||||
else if (my > level && myv > 0)
|
||||
b = 0.8f;
|
||||
#endif
|
||||
/* max = 2.7; min = 1.7 */
|
||||
if (my < level)
|
||||
b = 2.2f;
|
||||
@@ -601,13 +474,6 @@ PhysicsModule::PhysicsModule(flecs::world &ecs)
|
||||
Ogre::Vector3::UNIT_Y, b, drag,
|
||||
adrag, Ogre::Vector3::ZERO,
|
||||
eng.delta);
|
||||
// std::cout << b << std::endl;
|
||||
#if 0
|
||||
std::cout << "addHit: "
|
||||
<< JoltPhysics::convert(
|
||||
body.GetPosition())
|
||||
<< std::endl;
|
||||
#endif
|
||||
}
|
||||
});
|
||||
ecs.system<const EngineData, const CharacterBody>("UpdatePhysics")
|
||||
|
||||
@@ -84,6 +84,8 @@ StaticGeometryModule::StaticGeometryModule(flecs::world &ecs)
|
||||
new Ogre::MeshLodGenerator();
|
||||
ecs.system("AddGeometryQueue").kind(flecs::OnUpdate).run([&](flecs::iter &it) {
|
||||
std::list<flecs::entity> items;
|
||||
if (!ECS::get().has<Terrain>())
|
||||
return;
|
||||
if (!ECS::get<Terrain>().mTerrainGroup)
|
||||
return;
|
||||
if (!itemsLoaded) {
|
||||
|
||||
Reference in New Issue
Block a user