Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/fps/src/modules/objects/Planet.cc @ 7306

Last change on this file since 7306 was 6501, checked in by rgrieder, 15 years ago

Ensured OGRE v1.7 "Cthugha" code compatibility. Does not yet seem to run run though.

  • Property svn:eol-style set to native
File size: 6.0 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    CreateFactory(Planet);
45
46    /**
47     * @brief Constructor
48     */
49    Planet::Planet(BaseObject* creator) : MovableEntity(creator)
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)
73            {
74                float distance = this->getPosition().distance( activeCamera->getWorldPosition() );
75                //             COUT(2) << distance << std::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        float scaleFactor = this->getScale();
92
93#if OGRE_VERSION >= 0x010700
94        Ogre::Mesh::LodValueList distList;
95#else
96        Ogre::Mesh::LodDistanceList distList;
97#endif
98
99        distList.push_back(10.0f*scaleFactor);
100        distList.push_back(19.0f*scaleFactor);
101        distList.push_back(27.0f*scaleFactor);
102        distList.push_back(34.0f*scaleFactor);
103        distList.push_back(40.0f*scaleFactor);
104        distList.push_back(45.0f*scaleFactor);
105        distList.push_back(49.0f*scaleFactor);
106        distList.push_back(52.0f*scaleFactor);
107        distList.push_back(54.0f*scaleFactor);
108        distList.push_back(55.0f*scaleFactor);
109
110        float reductionValue = 0.2f;
111
112        this->mesh_.getEntity()->getMesh()->generateLodLevels(distList, Ogre::ProgressiveMesh::VRQ_PROPORTIONAL, reductionValue);
113        billboard_.setBillboardSet(this->getScene()->getSceneManager(), this->atmosphere_, Vector3(0,0,0));
114
115        this->attachOgreObject(this->billboard_.getBillboardSet());
116        this->billboard_.getBillboardSet()->setUseAccurateFacing(true);
117        this->setCastShadows(true);
118        this->billboard_.getBillboardSet()->setRenderQueueGroup(this->mesh_.getEntity()->getRenderQueueGroup());
119        this->mesh_.setCastShadows(true);
120    }
121
122    void Planet::changedMesh()
123    {
124        if (this->mesh_.getEntity())
125            this->detachOgreObject(this->mesh_.getEntity());
126
127        this->mesh_.setMeshSource(this->getScene()->getSceneManager(), this->meshSrc_);
128
129        if (this->mesh_.getEntity())
130        {
131            this->attachOgreObject(this->mesh_.getEntity());
132            this->mesh_.getEntity()->setCastShadows(this->bCastShadows_);
133            this->mesh_.setVisible(this->isVisible());
134        }
135        this->init();
136    }
137
138    void Planet::changedShadows()
139    {
140        this->mesh_.setCastShadows(this->bCastShadows_);
141    }
142
143    /**
144        @brief XML loading and saving.
145        @param xmlelement The XML-element
146        @param loading Loading (true) or saving (false)
147        @return The XML-element
148    */
149    void Planet::XMLPort(Element& xmlelement, XMLPort::Mode mode)
150    {
151        SUPER(Planet, XMLPort, xmlelement, mode);
152
153        if (GameMode::showsGraphics())
154        {
155            XMLPortParam(Planet, "atmosphere", setAtmosphere, getAtmosphere, xmlelement, mode).defaultValues("planet/Atmosphere");
156            XMLPortParam(Planet, "atmospheresize", setAtmosphereSize, getAtmosphereSize, xmlelement,mode);
157            XMLPortParam(Planet, "imagesize", setImageSize, getImageSize, xmlelement,mode);
158            XMLPortParam(Planet, "mesh", setMeshSource, getMeshSource, xmlelement, mode);
159            XMLPortParam(Planet, "shadow", setCastShadows, getCastShadows, xmlelement, mode).defaultValues(true);
160        }
161    }
162
163    void Planet::registerVariables()
164    {
165        registerVariable(this->atmosphere_, VariableDirection::ToClient);
166        registerVariable(this->meshSrc_, VariableDirection::ToClient, new NetworkCallback<Planet>(this, &Planet::changedMesh));
167        registerVariable(this->bCastShadows_, VariableDirection::ToClient, new NetworkCallback<Planet>(this, &Planet::changedShadows));
168        registerVariable(this->atmosphereSize, VariableDirection::ToClient);
169        registerVariable(this->imageSize, VariableDirection::ToClient);
170    }
171
172    void Planet::changedVisibility()
173    {
174        SUPER(Planet, changedVisibility);
175        if (this->isInitialized())
176        {
177            this->mesh_.setVisible(this->isVisible());
178            this->billboard_.setVisible(this->isVisible());
179        }
180    }
181}
Note: See TracBrowser for help on using the repository browser.