Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/tutorial4/src/modules/objects/Planet.cc @ 10573

Last change on this file since 10573 was 9675, checked in by landauf, 11 years ago

merged branch 'libs' back to trunk. orxonox now compiles and runs with ogre 1.8 and it compiles (but doesn't run) with cegui 0.8

  • Property svn:eol-style set to native
File size: 6.5 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 *      Marian Runo
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "Planet.h"
30
31#include <OgreEntity.h>
32#include <OgreBillboardSet.h>
33#include <OgreProgressiveMesh.h>
34
35#include "core/CoreIncludes.h"
36#include "core/GameMode.h"
37#include "core/XMLPort.h"
38#include "Scene.h"
39#include "graphics/Camera.h"
40#include "CameraManager.h"
41
42namespace orxonox
43{
44    RegisterClass(Planet);
45
46    /**
47     * @brief Constructor
48     */
49    Planet::Planet(Context* context) : MovableEntity(context)
50    {
51        RegisterObject(Planet);
52        this->registerVariables();
53    }
54
55    /**
56     * @brief Destructor
57     */
58    Planet::~Planet()
59    {
60        if (this->isInitialized() && this->mesh_.getEntity())
61            this->detachOgreObject(this->mesh_.getEntity());
62    }
63
64    void Planet::tick(float dt)
65    {
66        if (!this->isVisible())
67            return;
68
69        if (GameMode::showsGraphics())
70        {
71            Camera* activeCamera = CameraManager::getInstance().getActiveCamera();
72            if (activeCamera && this->billboard_.getBillboardSet())
73            {
74                float distance = this->getPosition().distance( activeCamera->getWorldPosition() );
75                //             orxout(internal_warning) << distance << endl;
76                float planetRadius = this->getScale();
77
78                float newScale = 2 * distance / sqrt(distance*distance - planetRadius*planetRadius);
79                float tempTest = newScale*(1+float(this->atmosphereSize)/float(this->imageSize));
80                newScale = tempTest;
81
82                this->billboard_.getBillboardSet()->setDefaultDimensions(newScale, newScale);
83            }
84        }
85
86        SUPER(Planet, tick, dt);
87    }
88
89    void Planet::init()
90    {
91    }
92
93    void Planet::changedMesh()
94    {
95        if( GameMode::showsGraphics() )
96        {
97            if (this->mesh_.getEntity())
98                this->detachOgreObject(this->mesh_.getEntity());
99
100            this->mesh_.setMeshSource(this->getScene()->getSceneManager(), this->meshSrc_);
101
102            if (this->mesh_.getEntity())
103            {
104                this->attachOgreObject(this->mesh_.getEntity());
105                this->mesh_.getEntity()->setCastShadows(this->bCastShadows_);
106                this->mesh_.setVisible(this->isVisible());
107
108                float scaleFactor = this->getScale();
109
110#if OGRE_VERSION >= 0x010800
111                Ogre::ProgressiveMesh::LodValueList distList;
112#elif OGRE_VERSION >= 0x010700
113                Ogre::Mesh::LodValueList distList;
114#else
115                Ogre::Mesh::LodDistanceList distList;
116#endif
117
118                distList.push_back(10.0f*scaleFactor);
119                distList.push_back(19.0f*scaleFactor);
120                distList.push_back(27.0f*scaleFactor);
121                distList.push_back(34.0f*scaleFactor);
122                distList.push_back(40.0f*scaleFactor);
123                distList.push_back(45.0f*scaleFactor);
124                distList.push_back(49.0f*scaleFactor);
125                distList.push_back(52.0f*scaleFactor);
126                distList.push_back(54.0f*scaleFactor);
127                distList.push_back(55.0f*scaleFactor);
128
129                float reductionValue = 0.2f;
130
131#if OGRE_VERSION >= 0x010800
132                Ogre::ProgressiveMesh::generateLodLevels(this->mesh_.getEntity()->getMesh().get(), distList, Ogre::ProgressiveMesh::VRQ_PROPORTIONAL,
133                    reductionValue);
134#else
135                this->mesh_.getEntity()->getMesh()->generateLodLevels(distList, Ogre::ProgressiveMesh::VRQ_PROPORTIONAL, reductionValue);
136#endif
137                billboard_.setBillboardSet(this->getScene()->getSceneManager(), this->atmosphere_, Vector3(0,0,0));
138
139                this->attachOgreObject(this->billboard_.getBillboardSet());
140                this->billboard_.getBillboardSet()->setUseAccurateFacing(true);
141                this->setCastShadows(true);
142                this->billboard_.getBillboardSet()->setRenderQueueGroup(this->mesh_.getEntity()->getRenderQueueGroup());
143                this->mesh_.setCastShadows(true);
144            }
145        }
146    }
147
148    void Planet::changedShadows()
149    {
150        this->mesh_.setCastShadows(this->bCastShadows_);
151    }
152
153    void Planet::XMLPort(Element& xmlelement, XMLPort::Mode mode)
154    {
155        SUPER(Planet, XMLPort, xmlelement, mode);
156
157        XMLPortParam(Planet, "atmosphere", setAtmosphere, getAtmosphere, xmlelement, mode).defaultValues("planet/Atmosphere");
158        XMLPortParam(Planet, "atmospheresize", setAtmosphereSize, getAtmosphereSize, xmlelement,mode);
159        XMLPortParam(Planet, "imagesize", setImageSize, getImageSize, xmlelement,mode);
160        XMLPortParam(Planet, "mesh", setMeshSource, getMeshSource, xmlelement, mode);
161        XMLPortParam(Planet, "shadow", setCastShadows, getCastShadows, xmlelement, mode).defaultValues(true);
162    }
163
164    void Planet::registerVariables()
165    {
166        registerVariable(this->atmosphere_, VariableDirection::ToClient);
167        registerVariable(this->atmosphereSize, VariableDirection::ToClient);
168        registerVariable(this->imageSize, VariableDirection::ToClient);
169        // Note: the meshSrc should be synchronised after atmosphere and other values, because the meshSrc callback setts the atmosphere billboards
170        registerVariable(this->meshSrc_, VariableDirection::ToClient, new NetworkCallback<Planet>(this, &Planet::changedMesh));
171        registerVariable(this->bCastShadows_, VariableDirection::ToClient, new NetworkCallback<Planet>(this, &Planet::changedShadows));
172    }
173
174    void Planet::changedVisibility()
175    {
176        SUPER(Planet, changedVisibility);
177        if (this->isInitialized())
178        {
179            this->mesh_.setVisible(this->isVisible());
180            this->billboard_.setVisible(this->isVisible());
181        }
182    }
183}
Note: See TracBrowser for help on using the repository browser.