Consistent startup
This commit is contained in:
76
Game.cpp
76
Game.cpp
@@ -295,9 +295,9 @@ public:
|
||||
};
|
||||
class App : public OgreBites::ApplicationContext {
|
||||
Ogre::SceneNode *mCameraNode, *mCameraPivot, *mCameraGoal;
|
||||
Ogre::Camera *mCamera;
|
||||
Ogre::Camera *mCamera, *mCameraInterior, *mCameraInventory;
|
||||
Ogre::Real mPivotPitch;
|
||||
Ogre::SceneManager *mScnMgr;
|
||||
Ogre::SceneManager *mScnMgr, *mScnMgrInterior, *mScnMgrInventory;
|
||||
Ogre::Viewport *mViewport;
|
||||
SkyBoxRenderer *sky;
|
||||
bool mGrab;
|
||||
@@ -313,15 +313,19 @@ public:
|
||||
virtual ~App()
|
||||
{
|
||||
}
|
||||
void setup()
|
||||
void setup() override
|
||||
{
|
||||
OgreBites::ApplicationContext::setup();
|
||||
Ogre::Root *root = getRoot();
|
||||
Ogre::SceneManager *scnMgr = root->createSceneManager();
|
||||
mScnMgr = scnMgr;
|
||||
Ogre::OverlaySystem *pOverlaySystem = getOverlaySystem();
|
||||
mScnMgrInterior = root->createSceneManager();
|
||||
mScnMgrInventory = root->createSceneManager();
|
||||
Ogre::OverlaySystem *pOverlaySystem = getOverlaySystem();
|
||||
mScnMgr->addRenderQueueListener(pOverlaySystem);
|
||||
// mTrayMgr = new OgreBites::TrayManager("AppTrays",
|
||||
mScnMgrInterior->addRenderQueueListener(pOverlaySystem);
|
||||
mScnMgrInventory->addRenderQueueListener(pOverlaySystem);
|
||||
// mTrayMgr = new OgreBites::TrayManager("AppTrays",
|
||||
// getRenderWindow());
|
||||
}
|
||||
bool isWindowGrab()
|
||||
@@ -347,7 +351,32 @@ public:
|
||||
mGrab = grab;
|
||||
ApplicationContextBase::setWindowGrab(grab);
|
||||
}
|
||||
|
||||
void initInteriorCamera()
|
||||
{
|
||||
Ogre::SceneNode *cameraNode =
|
||||
mScnMgrInterior->getRootSceneNode()
|
||||
->createChildSceneNode("InteriorCameraNode");
|
||||
cameraNode->setPosition(0, 2, 3);
|
||||
cameraNode->lookAt(Ogre::Vector3(0, 1, -1),
|
||||
Ogre::Node::TS_PARENT);
|
||||
mCameraInterior = mScnMgr->createCamera("interior_camera");
|
||||
mCameraInterior->setNearClipDistance(0.05f);
|
||||
mCameraInterior->setAutoAspectRatio(true);
|
||||
cameraNode->attachObject(mCameraInterior);
|
||||
}
|
||||
void initInventoryCamera()
|
||||
{
|
||||
Ogre::SceneNode *cameraNode =
|
||||
mScnMgrInventory->getRootSceneNode()
|
||||
->createChildSceneNode("InteriorCameraNode");
|
||||
cameraNode->setPosition(0, 2, 3);
|
||||
cameraNode->lookAt(Ogre::Vector3(0, 1, -1),
|
||||
Ogre::Node::TS_PARENT);
|
||||
mCameraInventory = mScnMgr->createCamera("inventory_camera");
|
||||
mCameraInventory->setNearClipDistance(0.05f);
|
||||
mCameraInventory->setAutoAspectRatio(true);
|
||||
cameraNode->attachObject(mCameraInventory);
|
||||
}
|
||||
void initCamera()
|
||||
{
|
||||
mCameraNode = mScnMgr->getRootSceneNode()->createChildSceneNode(
|
||||
@@ -378,12 +407,16 @@ public:
|
||||
mCamera->setNearClipDistance(0.1f);
|
||||
mCamera->setFarClipDistance(800);
|
||||
mPivotPitch = 0;
|
||||
initInteriorCamera();
|
||||
initInventoryCamera();
|
||||
}
|
||||
void configure()
|
||||
{
|
||||
std::cout << "Startup" << "\n";
|
||||
std::cout << "Startup"
|
||||
<< "\n";
|
||||
initApp();
|
||||
std::cout << "Set up RTSS" << "\n";
|
||||
std::cout << "Set up RTSS"
|
||||
<< "\n";
|
||||
Ogre::Root *root = getRoot();
|
||||
Ogre::SceneManager *scnMgr = getSceneManager();
|
||||
|
||||
@@ -392,19 +425,25 @@ public:
|
||||
Ogre::RTShader::ShaderGenerator::getSingletonPtr();
|
||||
shadergen->addSceneManager(scnMgr);
|
||||
setWindowGrab(true);
|
||||
std::cout << "Init camera" << "\n";
|
||||
std::cout << "Init camera"
|
||||
<< "\n";
|
||||
initCamera();
|
||||
std::cout << "Set up water" << "\n";
|
||||
std::cout << "Set up cursor" << "\n";
|
||||
std::cout << "Set up water"
|
||||
<< "\n";
|
||||
std::cout << "Set up cursor"
|
||||
<< "\n";
|
||||
Ogre::ResourceGroupManager::getSingleton()
|
||||
.initialiseAllResourceGroups();
|
||||
// OgreBites::ApplicationContext::loadResources();
|
||||
// setupCursor();
|
||||
std::cout << "Setup input" << "\n";
|
||||
std::cout << "Setup input"
|
||||
<< "\n";
|
||||
setupInput();
|
||||
std::cout << "Create content" << "\n";
|
||||
std::cout << "Create content"
|
||||
<< "\n";
|
||||
createContent();
|
||||
std::cout << "Setup done" << "\n";
|
||||
std::cout << "Setup done"
|
||||
<< "\n";
|
||||
#if 0
|
||||
mDbgDraw->setDebugMode(mDbgDraw->getDebugMode() |
|
||||
btIDebugDraw::DBG_DrawContactPoints);
|
||||
@@ -601,8 +640,9 @@ public:
|
||||
"Skybox/Dynamic", "General");
|
||||
OgreAssert(m, "Sky box material not found.");
|
||||
m->load();
|
||||
ECS::setup(mScnMgr, /*mDynWorld.get(), */ mCameraNode, mCamera,
|
||||
getRenderWindow());
|
||||
ECS::setupExteriorScene(mScnMgr,
|
||||
/*mDynWorld.get(), */ mCameraNode,
|
||||
mCamera, getRenderWindow());
|
||||
ECS::get().set<ECS::RenderWindow>(
|
||||
{ getRenderWindow(), getDisplayDPI() });
|
||||
ECS::get()
|
||||
@@ -736,9 +776,7 @@ public:
|
||||
}
|
||||
flecs::entity getPlayer() const
|
||||
{
|
||||
flecs::entity player =
|
||||
ECS::get().lookup("ECS::CharacterModule::player");
|
||||
return player;
|
||||
return ECS::player;
|
||||
}
|
||||
void enableDbgDraw(bool enable)
|
||||
{
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#include <iostream>
|
||||
#include <Ogre.h>
|
||||
#include <Jolt/Jolt.h>
|
||||
#include <Jolt/Physics/Body/BodyID.h>
|
||||
#include "Components.h"
|
||||
#include "GameData.h"
|
||||
#include "PhysicsModule.h"
|
||||
@@ -35,8 +37,6 @@ EditorInputModule::EditorInputModule(flecs::world &ecs)
|
||||
.kind(flecs::OnUpdate)
|
||||
.each([this](const EngineData &eng, Input &input,
|
||||
Camera &camera) {
|
||||
if (ECS::player.is_valid())
|
||||
return;
|
||||
if (!camera.configured) {
|
||||
// create a pivot at roughly the character's shoulder
|
||||
camera.mCameraPivot =
|
||||
@@ -147,10 +147,11 @@ EditorInputModule::EditorInputModule(flecs::world &ecs)
|
||||
position =
|
||||
ray.getPoint(ogreResult.second);
|
||||
Ogre::Vector3 position2;
|
||||
JPH::BodyID id;
|
||||
bool hit = PhysicsModule::raycastQuery(
|
||||
ray.getOrigin(),
|
||||
ray.getPoint(2000.0f),
|
||||
position2);
|
||||
position2, id);
|
||||
if (hit) {
|
||||
float d1 =
|
||||
ray.getOrigin()
|
||||
@@ -169,10 +170,11 @@ EditorInputModule::EditorInputModule(flecs::world &ecs)
|
||||
.sceneNode->_setDerivedPosition(
|
||||
position);
|
||||
} else {
|
||||
JPH::BodyID id;
|
||||
bool hit = PhysicsModule::raycastQuery(
|
||||
ray.getOrigin(),
|
||||
ray.getPoint(2000.0f),
|
||||
position);
|
||||
ray.getPoint(2000.0f), position,
|
||||
id);
|
||||
if (hit) {
|
||||
std::cout
|
||||
<< "HIT!: " << position
|
||||
@@ -238,4 +240,4 @@ EditorInputModule::EditorInputModule(flecs::world &ecs)
|
||||
ECS::get().modified<ECS::Input>();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -384,9 +384,11 @@ public:
|
||||
}
|
||||
void configure()
|
||||
{
|
||||
std::cout << "Startup" << "\n";
|
||||
std::cout << "Startup"
|
||||
<< "\n";
|
||||
initApp();
|
||||
std::cout << "Set up RTSS" << "\n";
|
||||
std::cout << "Set up RTSS"
|
||||
<< "\n";
|
||||
Ogre::Root *root = getRoot();
|
||||
Ogre::SceneManager *scnMgr = getSceneManager();
|
||||
|
||||
@@ -395,19 +397,25 @@ public:
|
||||
Ogre::RTShader::ShaderGenerator::getSingletonPtr();
|
||||
shadergen->addSceneManager(scnMgr);
|
||||
setWindowGrab(false);
|
||||
std::cout << "Init camera" << "\n";
|
||||
std::cout << "Init camera"
|
||||
<< "\n";
|
||||
initCamera();
|
||||
std::cout << "Set up water" << "\n";
|
||||
std::cout << "Set up cursor" << "\n";
|
||||
std::cout << "Set up water"
|
||||
<< "\n";
|
||||
std::cout << "Set up cursor"
|
||||
<< "\n";
|
||||
Ogre::ResourceGroupManager::getSingleton()
|
||||
.initialiseAllResourceGroups();
|
||||
// OgreBites::ApplicationContext::loadResources();
|
||||
// setupCursor();
|
||||
std::cout << "Setup input" << "\n";
|
||||
std::cout << "Setup input"
|
||||
<< "\n";
|
||||
setupInput();
|
||||
std::cout << "Create content" << "\n";
|
||||
std::cout << "Create content"
|
||||
<< "\n";
|
||||
createContent();
|
||||
std::cout << "Setup done" << "\n";
|
||||
std::cout << "Setup done"
|
||||
<< "\n";
|
||||
#if 0
|
||||
mDbgDraw->setDebugMode(mDbgDraw->getDebugMode() |
|
||||
btIDebugDraw::DBG_DrawContactPoints);
|
||||
@@ -721,9 +729,7 @@ public:
|
||||
}
|
||||
flecs::entity getPlayer() const
|
||||
{
|
||||
flecs::entity player =
|
||||
ECS::get().lookup("ECS::CharacterModule::player");
|
||||
return player;
|
||||
return ECS::player;
|
||||
}
|
||||
void enableDbgDraw(bool enable)
|
||||
{
|
||||
@@ -789,7 +795,7 @@ int main()
|
||||
{
|
||||
App ctx;
|
||||
ctx.configure();
|
||||
ctx.enableDbgDraw(false);
|
||||
// ctx.enableDbgDraw(false);
|
||||
ctx.getRoot()->startRendering();
|
||||
ctx.setWindowGrab(false);
|
||||
ctx.closeApp();
|
||||
|
||||
@@ -18,12 +18,19 @@ flecs::entity
|
||||
CharacterManagerModule::createPlayer(const Ogre::Vector3 &position,
|
||||
const Ogre::Quaternion &rotation)
|
||||
{
|
||||
static int count = 0;
|
||||
OgreAssert(count == 0, "overspawn");
|
||||
OgreAssert(!player.is_valid(), "Player already created");
|
||||
player = ECS::get().entity("player");
|
||||
Ogre::Vector3 playerPos(0, 0, 4);
|
||||
player.set<CharacterLocation>({ rotation, position });
|
||||
player.set<CharacterConf>({ "normal-male.glb" });
|
||||
player.add<Character>();
|
||||
player.add<Player>();
|
||||
OgreAssert(player.is_valid(), "Can't create player");
|
||||
std::cout << "Begin player create" << std::endl;
|
||||
player.set<CharacterLocation>({ rotation, position })
|
||||
.set<CharacterConf>({ "normal-male.glb" })
|
||||
.add<Character>()
|
||||
// .add<CharacterDisablePhysics>()
|
||||
.add<Player>();
|
||||
std::cout << "End player create" << std::endl;
|
||||
count++;
|
||||
return player;
|
||||
}
|
||||
flecs::entity
|
||||
@@ -39,4 +46,4 @@ CharacterManagerModule::createCharacterData(const Ogre::String model,
|
||||
.add<Character>();
|
||||
return e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace ECS
|
||||
{
|
||||
struct CharacterManagerModule {
|
||||
std::set<flecs::entity> characters;
|
||||
flecs::entity player;
|
||||
CharacterManagerModule(flecs::world &ecs);
|
||||
flecs::entity createPlayer(const Ogre::Vector3 &position,
|
||||
const Ogre::Quaternion &rotation);
|
||||
@@ -12,6 +13,10 @@ struct CharacterManagerModule {
|
||||
const Ogre::Vector3 &position,
|
||||
const Ogre::Quaternion &rotation);
|
||||
void removeCharacterData(int id);
|
||||
flecs::entity getPlayer() const
|
||||
{
|
||||
return player;
|
||||
}
|
||||
};
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include "Components.h"
|
||||
#include "PhysicsModule.h"
|
||||
#include "CharacterAnimationModule.h"
|
||||
#include "CharacterManagerModule.h"
|
||||
#include "CharacterModule.h"
|
||||
#include "goap.h"
|
||||
namespace ECS
|
||||
@@ -30,6 +31,7 @@ CharacterModule::CharacterModule(flecs::world &ecs)
|
||||
ecs.component<Male>();
|
||||
ecs.component<Female>();
|
||||
ecs.component<Planner>().add(flecs::Singleton);
|
||||
ecs.import <CharacterAnimationModule>();
|
||||
ecs.import <TerrainModule>();
|
||||
ecs.import <WaterModule>();
|
||||
|
||||
@@ -41,8 +43,10 @@ CharacterModule::CharacterModule(flecs::world &ecs)
|
||||
ecs.system<Input, Camera>("HandleInput")
|
||||
.kind(flecs::OnUpdate)
|
||||
.each([this](Input &input, Camera &camera) {
|
||||
if (!ECS::player.is_valid())
|
||||
return;
|
||||
flecs::entity player =
|
||||
ECS::get<CharacterManagerModule>().getPlayer();
|
||||
if (!player.is_valid())
|
||||
return;
|
||||
/* handle input */
|
||||
// if (input.control == input.control_prev)
|
||||
// return;
|
||||
@@ -263,38 +267,59 @@ CharacterModule::CharacterModule(flecs::world &ecs)
|
||||
}
|
||||
});
|
||||
#endif
|
||||
ecs.observer<const EngineData, const CharacterLocation,
|
||||
const CharacterConf>("SetupCharacterM")
|
||||
static int characterCount = 0;
|
||||
ecs.observer<const EngineData, const CharacterLocation,
|
||||
const CharacterConf, CharacterBase>(
|
||||
"SetupCharacterBaseObs")
|
||||
.event(flecs::OnAdd)
|
||||
.each([&](flecs::entity e, const EngineData &eng,
|
||||
const CharacterLocation &loc,
|
||||
const CharacterConf &conf, CharacterBase &ch) {
|
||||
ch.mBodyEnt = eng.mScnMgr->createEntity(conf.type);
|
||||
ch.mBodyNode = eng.mScnMgr->getRootSceneNode()
|
||||
->createChildSceneNode();
|
||||
ch.mBodyNode->setOrientation(loc.orientation);
|
||||
ch.mBodyNode->setPosition(loc.position);
|
||||
ch.mBodyNode->attachObject(ch.mBodyEnt);
|
||||
ch.mSkeleton = ch.mBodyEnt->getSkeleton();
|
||||
OgreAssert(ch.mBodyEnt->getSkeleton()->hasBone("Root"),
|
||||
"No root bone");
|
||||
OgreAssert(ch.mSkeleton->hasBone("Root"),
|
||||
"No root bone");
|
||||
ch.mRootBone = ch.mSkeleton->getBone("Root");
|
||||
OgreAssert(ch.mRootBone, "No root bone");
|
||||
ch.mBoneMotion = Ogre::Vector3::ZERO;
|
||||
ch.mBonePrevMotion = Ogre::Vector3::ZERO;
|
||||
});
|
||||
ecs.observer<AnimationControl>("SetupAnimationControlObs")
|
||||
.event(flecs::OnAdd)
|
||||
.each([](flecs::entity e, AnimationControl &anim) {
|
||||
anim.configured = false;
|
||||
});
|
||||
|
||||
ecs.observer<const CharacterLocation, const CharacterConf>(
|
||||
"SetupCharacterObs")
|
||||
.event(flecs::OnSet)
|
||||
.with<Character>()
|
||||
.without<CharacterBase>()
|
||||
.each([](flecs::entity e, const EngineData &eng,
|
||||
const CharacterLocation &loc,
|
||||
const CharacterConf &conf) {
|
||||
CharacterBase &ch = e.ensure<CharacterBase>();
|
||||
AnimationControl &anim = e.ensure<AnimationControl>();
|
||||
ch.mBodyEnt = eng.mScnMgr->createEntity(conf.type);
|
||||
ch.mBodyNode = eng.mScnMgr->getRootSceneNode()
|
||||
->createChildSceneNode();
|
||||
ch.mBodyNode->setOrientation(loc.orientation);
|
||||
ch.mBodyNode->setPosition(loc.position);
|
||||
ch.mBodyNode->attachObject(ch.mBodyEnt);
|
||||
ch.mSkeleton = ch.mBodyEnt->getSkeleton();
|
||||
OgreAssert(ch.mBodyEnt->getSkeleton()->hasBone("Root"),
|
||||
"No root bone");
|
||||
OgreAssert(ch.mSkeleton->hasBone("Root"),
|
||||
"No root bone");
|
||||
ch.mRootBone = ch.mSkeleton->getBone("Root");
|
||||
OgreAssert(ch.mRootBone, "No root bone");
|
||||
// body.mController = nullptr;
|
||||
ch.mBoneMotion = Ogre::Vector3::ZERO;
|
||||
ch.mBonePrevMotion = Ogre::Vector3::ZERO;
|
||||
.without<CharacterBase>()
|
||||
.without<AnimationControl>()
|
||||
.write<CharacterBase>()
|
||||
.write<AnimationControl>()
|
||||
.each([&](flecs::entity e, const CharacterLocation &loc,
|
||||
const CharacterConf &conf) {
|
||||
std::cout << "OBSERVER!!!"
|
||||
<< " " << e.id() << std::endl;
|
||||
if (e.has<CharacterBase>() || e.has<AnimationControl>())
|
||||
return;
|
||||
e.world().defer_begin();
|
||||
e.add<CharacterBase>();
|
||||
e.add<AnimationControl>();
|
||||
e.set<CharacterVelocity>(
|
||||
{ { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f } });
|
||||
e.add<CharacterGravity>();
|
||||
e.add<CharacterBuoyancy>();
|
||||
anim.configured = false;
|
||||
});
|
||||
e.world().defer_end();
|
||||
});
|
||||
#if 0
|
||||
ecs.system<const EngineData, const CharacterLocation,
|
||||
const CharacterConf, Body2Entity>("SetupCharacter")
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,9 @@
|
||||
#include <iostream>
|
||||
#include <Ogre.h>
|
||||
#include <OgreTerrain.h>
|
||||
#include <OgreTerrainGroup.h>
|
||||
#include <Jolt/Jolt.h>
|
||||
#include <Jolt/Physics/Body/BodyID.h>
|
||||
#include "GameData.h"
|
||||
#include "Components.h"
|
||||
#include "CharacterModule.h"
|
||||
@@ -22,7 +26,6 @@
|
||||
namespace ECS
|
||||
{
|
||||
static flecs::world ecs;
|
||||
flecs::entity player;
|
||||
void setup_minimal()
|
||||
{
|
||||
ecs.component<EngineData>().add(flecs::Singleton);
|
||||
@@ -38,8 +41,8 @@ void setup_minimal()
|
||||
/* lots of things depend on it */
|
||||
ecs.component<Body2Entity>().add(flecs::Singleton);
|
||||
}
|
||||
void setup(Ogre::SceneManager *scnMgr, Ogre::SceneNode *cameraNode,
|
||||
Ogre::Camera *camera, Ogre::RenderWindow *window)
|
||||
void setupExteriorScene(Ogre::SceneManager *scnMgr, Ogre::SceneNode *cameraNode,
|
||||
Ogre::Camera *camera, Ogre::RenderWindow *window)
|
||||
{
|
||||
std::cout << "Setup GameData\n";
|
||||
setup_minimal();
|
||||
@@ -109,12 +112,61 @@ void setup(Ogre::SceneManager *scnMgr, Ogre::SceneNode *cameraNode,
|
||||
|
||||
// ecs.set<Body2Entity>({});
|
||||
std::cout << "Setup GameData done\n";
|
||||
|
||||
/* Create player */
|
||||
player = ecs.get_mut<CharacterManagerModule>().createPlayer(
|
||||
{ 0, 0, 4 }, Ogre::Quaternion(Ogre::Radian(Ogre::Math::PI),
|
||||
Ogre::Vector3::UNIT_Y));
|
||||
ecs.system("SpawnPlayer").kind(flecs::OnUpdate).interval(0.5f).run([&](flecs::iter &it) {
|
||||
flecs::entity player =
|
||||
ECS::get<CharacterManagerModule>().getPlayer();
|
||||
if (!player.is_valid()) {
|
||||
/* Create player */
|
||||
Ogre::Vector3 position;
|
||||
JPH::BodyID id;
|
||||
long x, y;
|
||||
Ogre::TerrainGroup *tg =
|
||||
ECS::get<ECS::Terrain>().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)
|
||||
{
|
||||
@@ -200,6 +252,12 @@ flecs::world get()
|
||||
bool Vector3::zeroLength() const
|
||||
{
|
||||
float l = x * x + y * y + z * z;
|
||||
return (l < 1e-06 * 1e-06);
|
||||
return (l < 1e-06 * 1e-06);
|
||||
}
|
||||
|
||||
void setupEditorAlt(Ogre::SceneManager *scnMgr, Ogre::SceneNode *cameraNode,
|
||||
Ogre::Camera *camera, Ogre::RenderWindow *window)
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -5,10 +5,16 @@ namespace ECS
|
||||
{
|
||||
extern flecs::entity player;
|
||||
void setup_minimal();
|
||||
void setup(Ogre::SceneManager *scnMgr, Ogre::SceneNode *cameraNode,
|
||||
void setupExteriorScene(Ogre::SceneManager *scnMgr, Ogre::SceneNode *cameraNode,
|
||||
Ogre::Camera *camera, Ogre::RenderWindow *window);
|
||||
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);
|
||||
void setupEditorAlt(Ogre::SceneManager *scnMgr, Ogre::SceneNode *cameraNode,
|
||||
Ogre::Camera *camera, Ogre::RenderWindow *window);
|
||||
void update(float delta);
|
||||
flecs::world get();
|
||||
template <class T> const T &get()
|
||||
|
||||
@@ -750,10 +750,15 @@ void PhysicsModule::controlPhysics(flecs::entity e, bool enable)
|
||||
}
|
||||
bool PhysicsModule::raycastQuery(const Ogre::Vector3 &startPos,
|
||||
const Ogre::Vector3 &endPos,
|
||||
Ogre::Vector3 &position)
|
||||
Ogre::Vector3 &position, JPH::BodyID &id)
|
||||
{
|
||||
return JoltPhysicsWrapper::getSingleton().raycastQuery(startPos, endPos,
|
||||
position);
|
||||
position, id);
|
||||
}
|
||||
|
||||
void PhysicsModule::setDebugDraw(bool enable)
|
||||
{
|
||||
JoltPhysicsWrapper::getSingleton().setDebugDraw(enable);
|
||||
}
|
||||
bool WaterBody::isInWater(const JPH::BodyID &id) const
|
||||
{
|
||||
|
||||
@@ -59,7 +59,8 @@ struct PhysicsModule {
|
||||
static void controlPhysics(flecs::entity e, bool enable);
|
||||
static bool raycastQuery(const Ogre::Vector3 &startPos,
|
||||
const Ogre::Vector3 &endPos,
|
||||
Ogre::Vector3 &position);
|
||||
Ogre::Vector3 &position, JPH::BodyID &id);
|
||||
static void setDebugDraw(bool enable);
|
||||
};
|
||||
}
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,12 @@
|
||||
#ifndef _STATIC_GEOMETRY_MODULE_H_
|
||||
#define _STATIC_GEOMETRY_MODULE_H_
|
||||
#include <flecs.h>
|
||||
#include <nlohmann/json.hpp>
|
||||
#include <Ogre.h>
|
||||
namespace Ogre
|
||||
{
|
||||
struct LodConfig;
|
||||
}
|
||||
namespace ECS
|
||||
{
|
||||
struct TerrainSlotParent {
|
||||
@@ -14,6 +19,7 @@ struct TerrainItem {
|
||||
};
|
||||
struct TerrainItemNode {
|
||||
Ogre::SceneNode *itemNode;
|
||||
Ogre::StaticGeometry *geo;
|
||||
};
|
||||
|
||||
struct StaticGeometryModule {
|
||||
@@ -37,11 +43,16 @@ struct StaticGeometryModule {
|
||||
static void getItemsProperties(
|
||||
std::list<std::pair<flecs::entity, Ogre::String> > *items);
|
||||
static void createItemGeometry(flecs::entity e);
|
||||
static void destroyItemGeometry(flecs::entity e);
|
||||
static void setupLods(Ogre::LodConfig &config);
|
||||
static void createPlazza(flecs::entity e, const nlohmann::json &district, Ogre::SceneNode *sceneNode, Ogre::StaticGeometry *geo);
|
||||
static void createBridge(flecs::entity e, Ogre::SceneNode *sceneNode,
|
||||
Ogre::StaticGeometry *geo);
|
||||
static void createPier(flecs::entity e, Ogre::SceneNode *sceneNode,
|
||||
Ogre::StaticGeometry *geo);
|
||||
static void createHarbour(flecs::entity e, Ogre::SceneNode *sceneNode);
|
||||
static void createHarbour(flecs::entity e, Ogre::SceneNode *sceneNode, Ogre::StaticGeometry *geo);
|
||||
static void createBuildings(flecs::entity e, const nlohmann::json &district, Ogre::SceneNode *sceneNode, Ogre::StaticGeometry *geo);
|
||||
static void createTemple(flecs::entity e, Ogre::SceneNode *sceneNode, Ogre::StaticGeometry *geo);
|
||||
};
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -198,10 +198,12 @@ out:
|
||||
long world_grid_y = world_y + grid_center_y;
|
||||
float amplitude = 150.0f;
|
||||
if (world_grid_x < 0 || world_grid_y < 0) {
|
||||
#if 0
|
||||
std::cout << "world: " << world_x << " " << world_y
|
||||
<< " ";
|
||||
std::cout << "grid: " << world_grid_x << " ";
|
||||
std::cout << world_grid_y << std::endl;
|
||||
#endif
|
||||
return -amplitude;
|
||||
}
|
||||
OgreAssert(world_grid_x >= 0, "bad world x");
|
||||
@@ -263,7 +265,6 @@ public:
|
||||
void createTerrainChunk(Ogre::TerrainGroup *terrainGroup, long x,
|
||||
long y)
|
||||
{
|
||||
std::lock_guard<std::mutex> guard(mtx);
|
||||
Ogre::Terrain *terrain = terrainGroup->getTerrain(x, y);
|
||||
float minH = terrain->getMinHeight();
|
||||
float maxH = terrain->getMaxHeight();
|
||||
@@ -277,7 +278,7 @@ public:
|
||||
float worldSize = terrain->getWorldSize();
|
||||
float scaled = worldSize / (size - 1);
|
||||
Ogre::Vector3 bodyPosition = terrain->getPosition();
|
||||
bodyPosition.y += (maxH + minH) / 2.0f;
|
||||
// bodyPosition.y += (maxH + minH) / 2.0f;
|
||||
bodyPosition.x += worldSize / 2.0f;
|
||||
bodyPosition.z += worldSize / 2.0f;
|
||||
Ogre::Vector3 offset =
|
||||
@@ -337,18 +338,29 @@ public:
|
||||
}
|
||||
void update()
|
||||
{
|
||||
static bool created = false;
|
||||
std::deque<struct gen_collider> output;
|
||||
std::lock_guard<std::mutex> guard(mtx);
|
||||
static bool created = false;
|
||||
while (!collider_queue.empty()) {
|
||||
Ogre::TerrainGroup *group =
|
||||
Ogre::TerrainGroup *group =
|
||||
collider_queue.front().group;
|
||||
long x = collider_queue.front().x;
|
||||
if (group->isDerivedDataUpdateInProgress())
|
||||
break;
|
||||
long x = collider_queue.front().x;
|
||||
long y = collider_queue.front().y;
|
||||
std::cout << x << " " << y << " "
|
||||
<< collider_queue.size() << std::endl;
|
||||
Ogre::Terrain *terrain = group->getTerrain(x, y);
|
||||
Ogre::Vector3 worldPos;
|
||||
group->convertTerrainSlotToWorldPosition(x, y,
|
||||
&worldPos);
|
||||
if (terrain && terrain->getHeightData() &&
|
||||
std::cout << "terrain: " << terrain;
|
||||
if (terrain)
|
||||
std::cout
|
||||
<< terrain->getHeightData() << " "
|
||||
<< terrain->isLoaded() << " "
|
||||
<< terrain->isDerivedDataUpdateInProgress()
|
||||
<< std::endl;
|
||||
if (terrain && terrain->getHeightData() &&
|
||||
terrain->isLoaded() &&
|
||||
!terrain->isDerivedDataUpdateInProgress()) {
|
||||
Ogre::LogManager::getSingleton().logError(
|
||||
@@ -356,8 +368,8 @@ public:
|
||||
Ogre::StringConverter::toString(x) +
|
||||
" " +
|
||||
Ogre::StringConverter::toString(y));
|
||||
float minH = terrain->getMinHeight();
|
||||
float maxH = terrain->getMaxHeight();
|
||||
// float minH = terrain->getMinHeight();
|
||||
// float maxH = terrain->getMaxHeight();
|
||||
int size = terrain->getSize();
|
||||
float worldSize = terrain->getWorldSize();
|
||||
{
|
||||
@@ -404,8 +416,8 @@ public:
|
||||
created = true;
|
||||
}
|
||||
#endif
|
||||
collider_queue.pop_front();
|
||||
// FIXME: create entities and components instead
|
||||
#if 0
|
||||
Ogre::SceneNode *items =
|
||||
terrain->_getRootSceneNode()
|
||||
->createChildSceneNode();
|
||||
@@ -425,21 +437,25 @@ public:
|
||||
what->setOrientation(item.rotation);
|
||||
what->setPosition(item.position);
|
||||
}
|
||||
#endif
|
||||
/* Spawn items */
|
||||
StaticGeometryModule::addGeometryForSlot(x, y);
|
||||
collider_queue.pop_front();
|
||||
|
||||
} else {
|
||||
output.push_back(collider_queue.front());
|
||||
/* Terrain data not ready maybe move to next terrain */
|
||||
gen_collider m = collider_queue.front();
|
||||
collider_queue.pop_front();
|
||||
collider_queue.push_back(m);
|
||||
break; // allow system to move on
|
||||
}
|
||||
if (collider_queue.empty() &&
|
||||
!ECS::get<Terrain>().mTerrainReady) {
|
||||
ECS::get_mut<Terrain>().mTerrainReady = true;
|
||||
ECS::modified<Terrain>();
|
||||
}
|
||||
}
|
||||
collider_queue = output;
|
||||
}
|
||||
}
|
||||
if (collider_queue.empty() &&
|
||||
!ECS::get<Terrain>().mTerrainReady) {
|
||||
ECS::get_mut<Terrain>().mTerrainReady = true;
|
||||
ECS::modified<Terrain>();
|
||||
}
|
||||
}
|
||||
};
|
||||
class DummyPageProvider : public Ogre::PageProvider {
|
||||
public:
|
||||
@@ -717,11 +733,12 @@ TerrainModule::TerrainModule(flecs::world &ecs)
|
||||
ECS::get().add<CanSetPlayerPosition>();
|
||||
}
|
||||
});
|
||||
#if 0
|
||||
ecs.system<const Terrain>("SetPlayerPosition")
|
||||
.kind(flecs::OnUpdate)
|
||||
.with<CanSetPlayerPosition>()
|
||||
.each([this](const Terrain &terrain) {
|
||||
flecs::entity player = ECS::player;
|
||||
flecs::entity player = ECS::get<CharacterM;
|
||||
if (!player.is_valid())
|
||||
return;
|
||||
if (!player.has<CharacterLocation>())
|
||||
@@ -745,6 +762,7 @@ TerrainModule::TerrainModule(flecs::world &ecs)
|
||||
player.modified<CharacterLocation>();
|
||||
ECS::get().remove<CanSetPlayerPosition>();
|
||||
});
|
||||
#endif
|
||||
ecs.system<const Terrain>("UpdateTerrainGroup")
|
||||
.kind(flecs::OnUpdate)
|
||||
.interval(2.0f)
|
||||
@@ -797,4 +815,4 @@ void TerrainModule::defineTerrain(long x, long y)
|
||||
ECS::get<Terrain>().definer->define(ECS::get<Terrain>().mTerrainGroup,
|
||||
x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -283,6 +283,7 @@ public:
|
||||
Ogre::Vector3 p3 = JoltPhysics::convert(inV3);
|
||||
Ogre::ColourValue cv(color[0], color[1], color[2], color[3]);
|
||||
|
||||
#if 0
|
||||
float dproj1 = p1.dotProduct(d);
|
||||
float dproj2 = p2.dotProduct(d);
|
||||
float dproj3 = p3.dotProduct(d);
|
||||
@@ -290,6 +291,7 @@ public:
|
||||
return;
|
||||
if (dproj1 > 50 && dproj2 > 50 && dproj3 > 50)
|
||||
return;
|
||||
#endif
|
||||
mLines.push_back({ p1, p2, cv });
|
||||
#if 0
|
||||
mTriangles.push_back({ { { inV1[0], inV1[1], inV1[2] },
|
||||
@@ -414,11 +416,14 @@ DebugRenderer::DebugRenderer(Ogre::SceneManager *scnMgr,
|
||||
pass->setCullingMode(Ogre::CullingMode::CULL_NONE);
|
||||
pass->setVertexColourTracking(Ogre::TVC_AMBIENT);
|
||||
pass->setLightingEnabled(false);
|
||||
pass->setDepthWriteEnabled(false);
|
||||
pass->setDepthCheckEnabled(false);
|
||||
DebugRenderer::Initialize();
|
||||
scnMgr->getRootSceneNode()->attachObject(mObject);
|
||||
mLines.reserve(6000);
|
||||
mObject->estimateVertexCount(64000);
|
||||
mObject->estimateIndexCount(8000);
|
||||
mObject->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
|
||||
}
|
||||
DebugRenderer::~DebugRenderer()
|
||||
{
|
||||
@@ -1469,7 +1474,7 @@ public:
|
||||
}
|
||||
}
|
||||
bool raycastQuery(Ogre::Vector3 startPoint, Ogre::Vector3 endPoint,
|
||||
Ogre::Vector3 &position)
|
||||
Ogre::Vector3 &position, JPH::BodyID &id)
|
||||
{
|
||||
int i;
|
||||
Ogre::Vector3 direction = endPoint - startPoint;
|
||||
@@ -1479,9 +1484,11 @@ public:
|
||||
bool hadHit = physics_system.GetNarrowPhaseQuery().CastRay(
|
||||
ray, hit, {},
|
||||
JPH::SpecifiedObjectLayerFilter(Layers::NON_MOVING));
|
||||
if (hadHit)
|
||||
if (hadHit) {
|
||||
position = JoltPhysics::convert(
|
||||
ray.GetPointOnRay(hit.mFraction));
|
||||
id = hit.mBodyID;
|
||||
}
|
||||
return hadHit;
|
||||
}
|
||||
};
|
||||
@@ -1765,9 +1772,9 @@ void JoltPhysicsWrapper::removeContactListener(const JPH::BodyID &id)
|
||||
}
|
||||
bool JoltPhysicsWrapper::raycastQuery(Ogre::Vector3 startPoint,
|
||||
Ogre::Vector3 endPoint,
|
||||
Ogre::Vector3 &position)
|
||||
Ogre::Vector3 &position, JPH::BodyID &id)
|
||||
{
|
||||
return phys->raycastQuery(startPoint, endPoint, position);
|
||||
return phys->raycastQuery(startPoint, endPoint, position, id);
|
||||
}
|
||||
template <>
|
||||
JoltPhysicsWrapper *Ogre::Singleton<JoltPhysicsWrapper>::msSingleton = 0;
|
||||
|
||||
@@ -205,6 +205,6 @@ public:
|
||||
listener);
|
||||
void removeContactListener(const JPH::BodyID &id);
|
||||
bool raycastQuery(Ogre::Vector3 startPoint, Ogre::Vector3 endPoint,
|
||||
Ogre::Vector3 &position);
|
||||
Ogre::Vector3 &position, JPH::BodyID &id);
|
||||
};
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user