SourceForge: osrpgcreation/osrpgcreation: changeset 68:69101d6c9b95
moved Scene code to Scene class
authorkornerr
Sat Nov 07 20:09:48 2009 +0700 (2 weeks ago)
changeset 6869101d6c9b95
parent 6727c889c040db
child 6983a4b6ed4c59
moved Scene code to Scene class
CMakeLists.txt
include/lf/mj/Core.h
include/lf/mj/Scene.h
src/lf/mj/Core.cpp
src/lf/mj/Scene.cpp
     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 +