1.1 --- a/CMakeLists.txt Fri Nov 06 00:24:26 2009 +0700
1.2 +++ b/CMakeLists.txt Sat Nov 07 20:09:48 2009 +0700
1.3 @@ -10,6 +10,7 @@
1.4 src/lf/mj/Layout.cpp
1.5 src/lf/mj/Settings.cpp
1.6 src/lf/mj/GUI.cpp
1.7 + src/lf/mj/Scene.cpp
1.8 src/lf/mj/Core.cpp
1.9 src/main.cpp
1.10 )
2.1 --- a/include/lf/mj/Core.h Fri Nov 06 00:24:26 2009 +0700
2.2 +++ b/include/lf/mj/Core.h Sat Nov 07 20:09:48 2009 +0700
2.3 @@ -3,6 +3,7 @@
2.4 #define LF_MJ_CORE_H
2.5
2.6 #include <lf/mj/GUI.h>
2.7 +#include <lf/mj/Scene.h>
2.8 #include <lf/mj/Settings.h>
2.9 #include <lf/mj/TileType.h>
2.10
2.11 @@ -26,7 +27,6 @@
2.12
2.13 bool canSelect(const TileType *tile) const;
2.14 void keyPressed(input::CKeyEvent &e);
2.15 - void lighting();
2.16 bool loadField(const core::stringc &path);
2.17 void mousePressed(input::CMouseEvent &e);
2.18 void performAction(gui::CGUIActionEvent &e);
2.19 @@ -36,9 +36,7 @@
2.20 private:
2.21 render::IRenderWindow *mWin;
2.22 CResourceManager *mRMgr;
2.23 - scene::CScene *mScn;
2.24 - scene::C3DCamera *mCam;
2.25 - scene::CSceneNodeController *mCamCtrl;
2.26 + Scene *mScn;
2.27 s8 mCtrlType;
2.28 TileType *mSelectedTile;
2.29 u32 mFPS;
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
3.2 +++ b/include/lf/mj/Scene.h Sat Nov 07 20:09:48 2009 +0700
3.3 @@ -0,0 +1,45 @@
3.4 +
3.5 +#ifndef LF_MJ_SCENE_H
3.6 +#define LF_MJ_SCENE_H
3.7 +
3.8 +#include <lf/Lightfeather.h>
3.9 +
3.10 +namespace lf {
3.11 +namespace mj {
3.12 +
3.13 +enum CAMERA_CONTROLLER_TYPE {
3.14 + CCT_EDIT = 0,
3.15 + CCT_FPS
3.16 +};
3.17 +
3.18 +class Scene : public core::CRTTI,
3.19 + public CRefCounted {
3.20 + public:
3.21 + Scene();
3.22 + ~Scene();
3.23 +
3.24 + bool areShadowsEnabled() const {
3.25 + return mShadowsEnabled;
3.26 + }
3.27 + void enableShadows(bool state);
3.28 + void pick(scene::APickingResults &pickRes);
3.29 + void setCameraController(CAMERA_CONTROLLER_TYPE cct);
3.30 +
3.31 + private:
3.32 + render::IRenderWindow *mWin;
3.33 + scene::CScene *mScn;
3.34 + scene::C3DCamera *mCam;
3.35 + scene::CSceneNodeController *mCamCtrl;
3.36 + CResourceManager *mRMgr;
3.37 + bool mShadowsEnabled;
3.38 + scene::CSceneStateShadowCaster *mSSSC;
3.39 + scene::CSceneStateShadowReceiver *mSSSR;
3.40 + CAMERA_CONTROLLER_TYPE mCCT;
3.41 + scene::CLight *mLight;
3.42 +};
3.43 +
3.44 +} // namespace lf
3.45 +} // namespace mj
3.46 +
3.47 +#endif // LF_MJ_SCENE_H
3.48 +
4.1 --- a/src/lf/mj/Core.cpp Fri Nov 06 00:24:26 2009 +0700
4.2 +++ b/src/lf/mj/Core.cpp Sat Nov 07 20:09:48 2009 +0700
4.3 @@ -11,7 +11,7 @@
4.4 template<> Core *core::CSingleton<Core>::p_Singleton = 0;
4.5
4.6 Core::Core() :
4.7 - mWin(0), mRMgr(0), mScn(0), mCam(0),
4.8 + mWin(0), mRMgr(0), mScn(0),
4.9 mSelectedTile(0),
4.10 mFPS(0), mPolys(0),
4.11 mTmpl(0),
4.12 @@ -29,36 +29,11 @@
4.13 mWin->addKeyListener(this);
4.14 mWin->addMouseListener(this);
4.15 mRMgr = CResourceManager::getInstancePtr();
4.16 - mScn = mWin->getRenderLayer3D()->getScene();
4.17 CLFRender::getInstance().setAutoSleep(0);
4.18 // Stub model.
4.19 /*res::CCubeModel *stubModel = */new res::CCubeModel("stub");
4.20 // Load resources.
4.21 mRMgr->loadResources("res/lfm/tile.lfm");
4.22 - // Camera.
4.23 - mCam = new scene::C3DCamera(mWin);
4.24 - mCam->setBackgroundColor(core::CColorI(150, 170, 150, 0));
4.25 - mCam->setPosition(core::vector3df(2.0f, 75.0f, -3.0f));
4.26 - mCam->setRotationDegrees(90.0f, 0.001f, 0.0f);
4.27 - mWin->getRenderLayer3D()->addCamera(mCam);
4.28 - mCam->drop();
4.29 - // Create cam controller by faking keyPressed call
4.30 - mCtrlType--;
4.31 - input::CKeyEvent ne(mWin, 0, input::KEY_KEY_N, 'n');
4.32 - keyPressed(ne);
4.33 - lighting();
4.34 - // Ground plane.
4.35 - res::CPlaneModel *plane = new res::CPlaneModel(
4.36 - "plane",
4.37 - core::vector2df(100.0f, 100.0f),
4.38 - core::vector2dui(2, 2),
4.39 - core::vector2dui(10, 10));
4.40 - plane->getMaterial(0)->setRenderFeature(render::ERPF_DIFFUSEMAP);
4.41 - plane->getMaterial(0)->setTexture(0, mRMgr->getTexture("tile1.jpg"));
4.42 - scene::CSceneNode *node = new scene::CModelSceneNode(plane);
4.43 - mScn->addSceneNode(node);
4.44 - node->setPosition(core::vector3df(0, -10, 0));
4.45 - node->drop();
4.46 // [ID : Texture] correspondance.
4.47 mTexs.push_back("tile01.png");
4.48 mTexs.push_back("tile02.png");
4.49 @@ -66,11 +41,13 @@
4.50 mTexs.push_back("tile04.png");
4.51 mRMgr->loadResources("res/lfm/tile.lfm");
4.52 mGUI = new GUI("res/gui/clearlooks.lfgt");
4.53 + mScn = new Scene;
4.54 }
4.55
4.56 Core::~Core() {
4.57 if (mTmpl)
4.58 mTmpl->drop();
4.59 + mScn->drop();
4.60 mGUI->drop();
4.61 // Should be the last.
4.62 delete mSet;
4.63 @@ -105,6 +82,7 @@
4.64
4.65 void Core::keyPressed(input::CKeyEvent &e) {
4.66 switch (e.getKey()) {
4.67 + /*
4.68 case input::KEY_KEY_C:
4.69 {
4.70 e.consume();
4.71 @@ -118,28 +96,14 @@
4.72 << pos.Z << ")\n";
4.73 }
4.74 break;
4.75 + */
4.76 case input::KEY_KEY_N:
4.77 e.consume();
4.78 - mScn->removeSceneNodeController(mCamCtrl);
4.79 mCtrlType++;
4.80 if(mCtrlType == 2)
4.81 mCtrlType = 0;
4.82 - switch(mCtrlType) {
4.83 - case 0:
4.84 - {
4.85 - mCamCtrl = new scene::CEditorController(mWin, mCam);
4.86 - mScn->addSceneNodeController(mCamCtrl);
4.87 - mCamCtrl->drop();
4.88 - break;
4.89 - }
4.90 - case 1:
4.91 - {
4.92 - mCamCtrl = new scene::CFPSController(mWin, mCam, true);
4.93 - mScn->addSceneNodeController(mCamCtrl);
4.94 - mCamCtrl->drop();
4.95 - break;
4.96 - }
4.97 - } // switch(cControllerType)
4.98 + // Bad convertion.
4.99 + mScn->setCameraController((CAMERA_CONTROLLER_TYPE)mCtrlType);
4.100 break;
4.101 case input::KEY_ESCAPE:
4.102 mGUI->setMenuVisible(!mGUI->isMenuVisible());
4.103 @@ -149,81 +113,6 @@
4.104 }
4.105 }
4.106
4.107 -void Core::lighting() {
4.108 - // Lighting state.
4.109 - render::CRenderStateLighting *rsl =
4.110 - new render::CRenderStateLighting(true);
4.111 - mCam->replaceRenderState(rsl);
4.112 - rsl->drop();
4.113 - // No ambient.
4.114 - render::CRenderStateAmbientLight *rsal =
4.115 - new render::CRenderStateAmbientLight(core::CColorI(20, 20, 20, 255));
4.116 - mCam->replaceRenderState(rsal);
4.117 - rsal->drop();
4.118 - // Light source.
4.119 - scene::CLight *light = new scene::CLight(
4.120 - scene::ELT_SPOT,
4.121 - core::CColorF(1.0f, 1.0f, 1.0f, 1.0f),
4.122 - core::CColorF(1.0f, 1.0f, 1.0f, 1.0f),
4.123 - core::CColorF(0.0f, 0.0f, 0.0f, 0.0f),
4.124 - 20.0f,
4.125 - 1.0f,
4.126 - core::PI / 3,
4.127 - core::PI / 2,
4.128 - 0.0f,
4.129 - 0.0f,
4.130 - 1.0f / 500.0f,
4.131 - 0.0f);
4.132 - light->setPosition(core::vector3df(100, 30, 0));
4.133 - mScn->addLight(light);
4.134 - // So we can move it.
4.135 - mScn->addSceneNode(light);
4.136 - // Point down.
4.137 - light->setRotationDegrees(core::vector3df(90, 0, 0));
4.138 - light->drop();
4.139 - scene::CSceneStateLight *csl = new scene::CSceneStateLight(light, true);
4.140 - mScn->getRootSceneNode()->addSceneState(csl);
4.141 - csl->drop();
4.142 - // Light rotation.
4.143 - scene::CSceneNodeController *lrot = new scene::CFlyCircleController(
4.144 - light,
4.145 - core::vector3df(0, 30, 0),
4.146 - core::vector3df(0, 1, 0),
4.147 - 20,
4.148 - 0.1);
4.149 - mScn->addSceneNodeController(lrot);
4.150 - lrot->drop();
4.151 - // Billboard to display light source position.
4.152 - res::CBillboardModel *model = new res::CBillboardModel(
4.153 - "billboard",
4.154 - mRMgr->getTexture("particlewhite.bmp"),
4.155 - res::EBT_VIEW_PLANE,
4.156 - 1.5f,
4.157 - 1.5f);
4.158 - model->setMaterial(0, mRMgr->getMaterial("light_billboard"));
4.159 - scene::CModelSceneNode *node = new scene::CModelSceneNode(model);
4.160 - light->addChild(node);
4.161 - // Disable lighting for the billboard.
4.162 - rsl = new render::CRenderStateLighting(false);
4.163 - node->addRenderStateToMaterials(rsl);
4.164 - node->drop();
4.165 - // Shadow mapping.
4.166 - light->makeShadowProjector(
4.167 - 2048,
4.168 - 2048,
4.169 - 1.0f,
4.170 - 1000.0f,
4.171 - 0.0f, 0.0f, 0.0f, 0.0f);
4.172 - scene::CSceneStateShadowCaster *sssc =
4.173 - new scene::CSceneStateShadowCaster(light);
4.174 - mScn->getRootSceneNode()->addSceneState(sssc);
4.175 - sssc->drop();
4.176 - scene::CSceneStateShadowReceiver *sssr =
4.177 - new scene::CSceneStateShadowReceiver(light, true);
4.178 - mScn->getRootSceneNode()->addSceneState(sssr);
4.179 - sssr->drop();
4.180 -}
4.181 -
4.182 bool Core::loadField(const core::stringc &path) {
4.183 // Read in field layout.
4.184 Layout ly;
4.185 @@ -272,11 +161,7 @@
4.186 mSelectedTile->setSelected(false);
4.187 // Select
4.188 scene::APickingResults pickResults;
4.189 - core::line3df line = mCam->getPickingLine(
4.190 - mWin->getCursorControl()->getRelativePosition().X,
4.191 - mWin->getCursorControl()->getRelativePosition().Y);
4.192 - mScn->getRootSceneNode()->pick(
4.193 - line, true, true, mCam, false, pickResults);
4.194 + mScn->pick(pickResults);
4.195 TileType *newTile = 0;
4.196 // There's always only one selected node.
4.197 if (!pickResults.empty() && mHNT.find(pickResults[0]->node) != mHNT.end())
5.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
5.2 +++ b/src/lf/mj/Scene.cpp Sat Nov 07 20:09:48 2009 +0700
5.3 @@ -0,0 +1,160 @@
5.4 +
5.5 +#include <lf/mj/Scene.h>
5.6 +
5.7 +namespace lf {
5.8 +namespace mj {
5.9 +
5.10 +Scene::Scene() :
5.11 + mWin(CLFRender::getInstance().getRenderWindow(0)),
5.12 + // Because we only need single scene for now.
5.13 + mScn(mWin->getRenderLayer3D()->getScene()),
5.14 + mCam(0), mCamCtrl(0),
5.15 + mRMgr(CResourceManager::getInstancePtr()),
5.16 + mShadowsEnabled(false),
5.17 + mSSSC(0), mSSSR(0),
5.18 + mLight(0) {
5.19 + // Camera.
5.20 + mCam = new scene::C3DCamera(mWin);
5.21 + mCam->setBackgroundColor(core::CColorI(150, 170, 150, 0));
5.22 + mCam->setPosition(core::vector3df(2.0f, 75.0f, -3.0f));
5.23 + mCam->setRotationDegrees(90.0f, 0.001f, 0.0f);
5.24 + mWin->getRenderLayer3D()->addCamera(mCam);
5.25 + mCam->drop();
5.26 + setCameraController(CCT_EDIT);
5.27 + // Ground plane a.k.a. play desk.
5.28 + res::CPlaneModel *plane = new res::CPlaneModel(
5.29 + "plane",
5.30 + core::vector2df(100.0f, 100.0f),
5.31 + core::vector2dui(2, 2),
5.32 + core::vector2dui(10, 10));
5.33 + plane->getMaterial(0)->setRenderFeature(render::ERPF_DIFFUSEMAP);
5.34 + plane->getMaterial(0)->setTexture(0, mRMgr->getTexture("tile1.jpg"));
5.35 + scene::CModelSceneNode *node = new scene::CModelSceneNode(plane);
5.36 + mScn->addSceneNode(node);
5.37 + node->setPosition(core::vector3df(0, -10, 0));
5.38 + node->drop();
5.39 + // Lighting state.
5.40 + render::CRenderStateLighting *rsl =
5.41 + new render::CRenderStateLighting(true);
5.42 + mCam->replaceRenderState(rsl);
5.43 + rsl->drop();
5.44 + // Ambient.
5.45 + /*
5.46 + render::CRenderStateAmbientLight *rsal =
5.47 + new render::CRenderStateAmbientLight(core::CColorI(20, 20, 20, 255));
5.48 + mCam->replaceRenderState(rsal);
5.49 + rsal->drop();
5.50 + */
5.51 + // Light source.
5.52 + mLight = new scene::CLight(
5.53 + scene::ELT_SPOT,
5.54 + core::CColorF(1.0f, 1.0f, 1.0f, 1.0f),
5.55 + core::CColorF(1.0f, 1.0f, 1.0f, 1.0f),
5.56 + core::CColorF(0.0f, 0.0f, 0.0f, 0.0f),
5.57 + 20.0f,
5.58 + 1.0f,
5.59 + core::PI / 3,
5.60 + core::PI / 2,
5.61 + 0.0f,
5.62 + 0.0f,
5.63 + 1.0f / 500.0f,
5.64 + 0.0f);
5.65 + mLight->setPosition(core::vector3df(100, 30, 0));
5.66 + mScn->addLight(mLight);
5.67 + // So we can move it.
5.68 + mScn->addSceneNode(mLight);
5.69 + // Point down.
5.70 + mLight->setRotationDegrees(core::vector3df(90, 0, 0));
5.71 + mLight->drop();
5.72 + // All meshes should be lit.
5.73 + scene::CSceneStateLight *csl = new scene::CSceneStateLight(mLight, true);
5.74 + mScn->getRootSceneNode()->addSceneState(csl);
5.75 + csl->drop();
5.76 + // Light rotation.
5.77 + scene::CSceneNodeController *lrot = new scene::CFlyCircleController(
5.78 + mLight,
5.79 + core::vector3df(0, 30, 0),
5.80 + core::vector3df(0, 1, 0),
5.81 + 20,
5.82 + 0.1);
5.83 + mScn->addSceneNodeController(lrot);
5.84 + lrot->drop();
5.85 + // Billboard to display light source position.
5.86 + res::CBillboardModel *model = new res::CBillboardModel(
5.87 + "billboard",
5.88 + mRMgr->getTexture("particlewhite.bmp"),
5.89 + res::EBT_VIEW_PLANE,
5.90 + 1.5f,
5.91 + 1.5f);
5.92 + model->setMaterial(0, mRMgr->getMaterial("light_billboard"));
5.93 + node = new scene::CModelSceneNode(model);
5.94 + mLight->addChild(node);
5.95 + // Disable lighting for the billboard.
5.96 + rsl = new render::CRenderStateLighting(false);
5.97 + node->addRenderStateToMaterials(rsl);
5.98 + node->drop();
5.99 +}
5.100 +
5.101 +Scene::~Scene() {
5.102 +}
5.103 +
5.104 +void Scene::enableShadows(bool state) {
5.105 + if (mShadowsEnabled == state)
5.106 + return;
5.107 + mShadowsEnabled = state;
5.108 + if (state) {
5.109 + mLight->makeShadowProjector(
5.110 + 2048,
5.111 + 2048,
5.112 + 1.0f,
5.113 + 1000.0f,
5.114 + 0.0f, 0.0f, 0.0f, 0.0f);
5.115 + scene::CSceneStateShadowCaster *mSSSC =
5.116 + new scene::CSceneStateShadowCaster(mLight);
5.117 + mScn->getRootSceneNode()->addSceneState(mSSSC);
5.118 + mSSSC->drop();
5.119 + scene::CSceneStateShadowReceiver *mSSSR =
5.120 + new scene::CSceneStateShadowReceiver(mLight, true);
5.121 + mScn->getRootSceneNode()->addSceneState(mSSSR);
5.122 + mSSSR->drop();
5.123 + }
5.124 + else {
5.125 + mScn->getRootSceneNode()->removeSceneState(mSSSC);
5.126 + mScn->getRootSceneNode()->removeSceneState(mSSSR);
5.127 + mLight->setShadowMapSetup(0);
5.128 + }
5.129 +}
5.130 +
5.131 +void Scene::pick(scene::APickingResults &pickRes) {
5.132 + core::line3df line = mCam->getPickingLine(
5.133 + mWin->getCursorControl()->getRelativePosition().X,
5.134 + mWin->getCursorControl()->getRelativePosition().Y);
5.135 + mScn->getRootSceneNode()->pick(line, true, true, mCam, false, pickRes);
5.136 +}
5.137 +
5.138 +void Scene::setCameraController(CAMERA_CONTROLLER_TYPE cct) {
5.139 + if (mCCT == cct)
5.140 + return;
5.141 + mCCT = cct;
5.142 + mScn->removeSceneNodeController(mCamCtrl);
5.143 + switch(cct) {
5.144 + case CCT_EDIT:
5.145 + {
5.146 + mCamCtrl = new scene::CEditorController(mWin, mCam);
5.147 + mScn->addSceneNodeController(mCamCtrl);
5.148 + mCamCtrl->drop();
5.149 + break;
5.150 + }
5.151 + case CCT_FPS:
5.152 + {
5.153 + mCamCtrl = new scene::CFPSController(mWin, mCam, true);
5.154 + mScn->addSceneNodeController(mCamCtrl);
5.155 + mCamCtrl->drop();
5.156 + break;
5.157 + }
5.158 + } // switch(cct)
5.159 +}
5.160 +
5.161 +} // namespace lf
5.162 +} // namespace mj
5.163 +