Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/network/src/orxonox/objects/Scene.cc @ 2504

Last change on this file since 2504 was 2245, checked in by scheusso, 16 years ago

most coding is done, still testing now
types should get transfered in platform independent formats now

  • Property svn:eol-style set to native
File size: 5.4 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "OrxonoxStableHeaders.h"
30#include "Scene.h"
31
32#include <OgreRoot.h>
33#include <OgreSceneManagerEnumerator.h>
34#include <OgreSceneNode.h>
35#include <OgreLight.h>
36
37#include "core/CoreIncludes.h"
38#include "core/Core.h"
39#include "core/XMLPort.h"
40
41namespace orxonox
42{
43    CreateFactory(Scene);
44
45    Scene::Scene(BaseObject* creator) : BaseObject(creator), Synchronisable(creator)
46    {
47        RegisterObject(Scene);
48
49        this->setScene(this);
50        this->bShadows_ = false;
51
52        if (Core::showsGraphics())
53        {
54            if (Ogre::Root::getSingletonPtr())
55            {
56                this->sceneManager_ = Ogre::Root::getSingleton().createSceneManager(Ogre::ST_GENERIC);
57                this->rootSceneNode_ = this->sceneManager_->getRootSceneNode();
58            }
59            else
60            {
61                this->sceneManager_ = 0;
62                this->rootSceneNode_ = 0;
63            }
64        }
65        else
66        {
67            // create a dummy SceneManager of our own since we don't have Ogre::Root.
68            this->sceneManager_ = new Ogre::DefaultSceneManager("");
69            this->rootSceneNode_ = this->sceneManager_->getRootSceneNode();
70        }
71
72        // test test test
73        if (Core::showsGraphics() && this->sceneManager_)
74        {
75            Ogre::Light* light;
76            light = this->sceneManager_->createLight("Light-1");
77            light->setType(Ogre::Light::LT_DIRECTIONAL);
78            light->setDiffuseColour(ColourValue(1.0, 0.9, 0.6, 1.0));
79            light->setSpecularColour(ColourValue(1.0, 0.9, 0.6, 1.0));
80            light->setDirection(1, -0.3, 0.3);
81        }
82        // test test test
83
84        this->registerVariables();
85    }
86
87    Scene::~Scene()
88    {
89        if (this->isInitialized())
90        {
91            if (Ogre::Root::getSingletonPtr())
92            {
93//                this->sceneManager_->destroySceneNode(this->rootSceneNode_->getName()); // TODO: remove getName() for newer versions of Ogre
94                Ogre::Root::getSingleton().destroySceneManager(this->sceneManager_);
95            }
96            else if (!Core::showsGraphics())
97            {
98                delete this->sceneManager_;
99            }
100        }
101    }
102
103    void Scene::XMLPort(Element& xmlelement, XMLPort::Mode mode)
104    {
105        SUPER(Scene, XMLPort, xmlelement, mode);
106
107        XMLPortParam(Scene, "skybox", setSkybox, getSkybox, xmlelement, mode);
108        XMLPortParam(Scene, "ambientlight", setAmbientLight, getAmbientLight, xmlelement, mode).defaultValues(ColourValue(0.2, 0.2, 0.2, 1));
109        XMLPortParam(Scene, "shadow", setShadow, getShadow, xmlelement, mode).defaultValues(true);
110
111        XMLPortObjectExtended(Scene, BaseObject, "", addObject, getObject, xmlelement, mode, true, false);
112    }
113
114    void Scene::registerVariables()
115    {
116        registerVariable(this->skybox_,     variableDirection::toclient, new NetworkCallback<Scene>(this, &Scene::networkcallback_applySkybox));
117        registerVariable(this->ambientLight_, variableDirection::toclient, new NetworkCallback<Scene>(this, &Scene::networkcallback_applyAmbientLight));
118    }
119
120    void Scene::setSkybox(const std::string& skybox)
121    {
122        if (Core::showsGraphics() && this->sceneManager_)
123            this->sceneManager_->setSkyBox(true, skybox);
124
125        this->skybox_ = skybox;
126    }
127
128    void Scene::setAmbientLight(const ColourValue& colour)
129    {
130        if (Core::showsGraphics() && this->sceneManager_)
131            this->sceneManager_->setAmbientLight(colour);
132
133        this->ambientLight_ = colour;
134    }
135
136    void Scene::setShadow(bool bShadow)
137    {
138        if (Core::showsGraphics() && this->sceneManager_)
139        {
140            if (bShadow)
141                this->sceneManager_->setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE);
142            else
143                this->sceneManager_->setShadowTechnique(Ogre::SHADOWTYPE_NONE);
144        }
145
146        this->bShadows_ = bShadow;
147    }
148
149    void Scene::addObject(BaseObject* object)
150    {
151        this->objects_.push_back(object);
152        object->setScene(this);
153    }
154
155    BaseObject* Scene::getObject(unsigned int index) const
156    {
157        unsigned int i = 0;
158        for (std::list<BaseObject*>::const_iterator it = this->objects_.begin(); it != this->objects_.end(); ++it)
159        {
160            if (i == index)
161                return (*it);
162            ++i;
163        }
164        return 0;
165    }
166
167    void Scene::tick(float dt)
168    {
169        if (!Core::showsGraphics())
170        {
171            // We need to update the scene nodes if we don't render
172            this->rootSceneNode_->_update(true, false);
173        }
174    }
175}
Note: See TracBrowser for help on using the repository browser.