#include #include #include #include #include #include #include "GameData.h" #include "Components.h" #include "CharacterModule.h" #include "WaterModule.h" #include "TerrainModule.h" #include "SunModule.h" #include "GUIModule.h" #include "LuaData.h" #include "WorldMapModule.h" #include "BoatModule.h" #include "EventTriggerModule.h" #include "CharacterAnimationModule.h" #include "PhysicsModule.h" #include "EventModule.h" #include "CharacterManagerModule.h" #include "VehicleManagerModule.h" #include "AppModule.h" #include "world-build.h" namespace ECS { static flecs::world ecs; void setup_minimal() { ecs.component().add(flecs::Singleton); ecs.component().add(flecs::Singleton); ecs.component().add(flecs::Singleton); ecs.component().add(flecs::Singleton); ecs.import (); ecs.import (); ecs.import (); ecs.import (); ecs.import (); ecs.import (); /* lots of things depend on it */ ecs.component().add(flecs::Singleton); } void setupExteriorScene(Ogre::SceneManager *scnMgr, Ogre::SceneNode *cameraNode, Ogre::Camera *camera, Ogre::RenderWindow *window) { std::cout << "Setup GameData\n"; setup_minimal(); ecs.component().add(flecs::Singleton); ecs.import (); ecs.import (); ecs.import (); ecs.import (); ecs.import (); ecs.import (); ecs.import (); ecs.import (); ecs.import (); ecs.import (); ecs.import (); ecs.system("UpdateDelta") .kind(flecs::OnUpdate) .each([](EngineData &eng) { eng.delta = ECS::get().delta_time(); }); ecs.system("UpdateDelay") .kind(flecs::OnUpdate) .with() .with() .with() .each([](EngineData &eng) { if (eng.startupDelay >= 0.0f) eng.startupDelay -= eng.delta; #ifdef VDEBUG if (ECS::get().has()) std::cout << "ground check ready\n"; #endif }); ecs.system("CheckStatus") .kind(flecs::OnUpdate) .run([](flecs::iter &it) { #ifdef VDEBUG if (ECS::get().has()) std::cout << "water ready\n"; if (ECS::get().has()) std::cout << "terrain ready\n"; if (ECS::get().has()) std::cout << "ground check ready\n"; #endif }); ecs.set({ scnMgr, 0.0f, 5.0f, (int)window->getWidth(), (int)window->getHeight(), false }); ecs.set({ cameraNode, camera, false }); ecs.add(); ecs.add(); ecs.add(); ecs.set({ nullptr, nullptr, nullptr, nullptr }); ecs.set({ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, false, { 0, 0, 0 } }); if (!ecs.has()) ecs.add(); if (!ecs.has()) ecs.set({}); // ecs.set({}); std::cout << "Setup GameData done\n"; ecs.system("SpawnPlayer").kind(flecs::OnUpdate).interval(0.5f).run([&](flecs::iter &it) { flecs::entity player = ECS::get().getPlayer(); if (!player.is_valid()) { /* Create player */ Ogre::Vector3 position; JPH::BodyID id; long x, y; Ogre::TerrainGroup *tg = ECS::get().mTerrainGroup; if (tg->isDerivedDataUpdateInProgress()) return; tg->convertWorldPositionToTerrainSlot( Ogre::Vector3(0, 0, 4), &x, &y); Ogre::Terrain *terrain = tg->getTerrain(x, y); if (terrain && terrain->isLoaded()) { if (PhysicsModule::raycastQuery( Ogre::Vector3(0, 500, 4), Ogre::Vector3(0, -500, 4), position, id)) { if (position.y < -10.0f && position.y > -50.0f) { player = ecs.get_mut< CharacterManagerModule>() .createPlayer( { position.x, position.y, position.z }, Ogre::Quaternion( Ogre::Radian( Ogre::Math:: PI), Ogre::Vector3:: UNIT_Y)); std::cout << position << std::endl; // OgreAssert(false, "spawn"); } } } } }); } void setupInteriorScene(Ogre::SceneManager *scnMgr, Ogre::SceneNode *cameraNode, Ogre::Camera *camera, Ogre::RenderWindow *window) { } void setupInventoryScene(Ogre::SceneManager *scnMgr, Ogre::SceneNode *cameraNode, Ogre::Camera *camera, Ogre::RenderWindow *window) { } void setupEditor(Ogre::SceneManager *scnMgr, Ogre::SceneNode *cameraNode, Ogre::Camera *camera, Ogre::RenderWindow *window) { std::cout << "Setup Editor\n"; setup_minimal(); ecs.component().add(flecs::Singleton); ecs.component().add(flecs::Singleton); ecs.import (); ecs.import (); ecs.import (); ecs.import (); ecs.import (); ecs.import (); ecs.import (); ecs.import (); ecs.import (); // ecs.import (); ecs.import (); ecs.system("UpdateDelta") .kind(flecs::OnUpdate) .each([](EngineData &eng) { eng.delta = ECS::get().delta_time(); }); ecs.system("UpdateDelay") .kind(flecs::OnUpdate) .with() .with() .with() .each([](EngineData &eng) { if (eng.startupDelay >= 0.0f) eng.startupDelay -= eng.delta; #ifdef VDEBUG if (ECS::get().has()) std::cout << "ground check ready\n"; #endif }); ecs.system("CheckStatus") .kind(flecs::OnUpdate) .run([](flecs::iter &it) { #ifdef VDEBUG if (ECS::get().has()) std::cout << "water ready\n"; if (ECS::get().has()) std::cout << "terrain ready\n"; if (ECS::get().has()) std::cout << "ground check ready\n"; #endif }); ecs.set({ scnMgr, 0.0f, 5.0f, (int)window->getWidth(), (int)window->getHeight(), false }); ecs.set({ cameraNode, camera, false }); #if 0 ecs.set({ 0 }); #endif ecs.add(); ecs.add(); ecs.add(); ecs.set({ nullptr, nullptr, nullptr, nullptr }); ecs.set({ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, false, { 0, 0, 0 } }); ecs.set({ true, true, true, false, false, "", {}, -1 }); ecs.get_mut().enabled = true; ecs.get_mut().setWindowGrab(false); ecs.modified(); ecs.get_mut().setWindowGrab(true); ecs.modified(); ecs.get_mut().enabled = true; ecs.modified(); } void update(float delta) { ecs.progress(delta); } flecs::world get() { return ecs; } bool Vector3::zeroLength() const { float l = x * x + y * y + z * z; return (l < 1e-06 * 1e-06); } }