Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/questsystem5/src/orxonox/objects/worldentities/Planet.cc @ 2988

Last change on this file since 2988 was 2908, checked in by dafrick, 16 years ago

Reverted to revision 2906 (because I'm too stupid to merge correctly, 2nd try will follow shortly. ;))

  • Property svn:eol-style set to native
File size: 5.8 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 "OrxonoxStableHeaders.h"
30#include "Planet.h"
31
32#include <math.h>
33
34#include <OgreEntity.h>
35#include <OgreBillboardSet.h>
36#include <OgreHardwareVertexBuffer.h>
37#include <OgreMeshManager.h>
38
39#include "core/CoreIncludes.h"
40#include "core/XMLPort.h"
41#include "objects/Scene.h"
42#include "CameraManager.h"
43#include "Camera.h"
44#include "GraphicsEngine.h"
45
46namespace orxonox
47{
48    CreateFactory(Planet);   
49
50    /**
51     * @brief Constructor
52     */
53    Planet::Planet(BaseObject* creator): MovableEntity(creator)
54    {
55        RegisterObject(Planet);
56        this->registerVariables();
57    }
58
59    /**
60     * @brief Destructor
61     */
62    Planet::~Planet()
63    {
64        if (this->isInitialized() && this->mesh_.getEntity())
65            this->detachOgreObject(this->mesh_.getEntity());
66    }   
67
68    void Planet::tick(float dt)
69    {
70        if(!this->isVisible())
71            return;
72
73        Camera* activeCamera = CameraManager::getInstance().getActiveCamera();
74        if(activeCamera)
75        {
76            float distance = this->getPosition().distance( activeCamera->getWorldPosition() );
77            //             COUT(2) << distance << std::endl;
78            float planetRadius = this->getScale();
79
80            float newScale = 2 * distance / sqrt(distance*distance - planetRadius*planetRadius);
81            float tempTest = newScale*(1+float(this->atmosphereSize)/float(this->imageSize));
82            newScale = tempTest;
83
84            this->billboard_.getBillboardSet()->setDefaultDimensions(newScale, newScale);
85        }
86
87        SUPER(Planet, tick, dt);
88    }
89
90    void Planet::init()
91    {
92        float scaleFactor = this->getScale();
93
94        this->distList.push_back(10.0*scaleFactor);
95        this->distList.push_back(19.0*scaleFactor);
96        this->distList.push_back(27.0*scaleFactor);
97        this->distList.push_back(34.0*scaleFactor);
98        this->distList.push_back(40.0*scaleFactor);
99        this->distList.push_back(45.0*scaleFactor);
100        this->distList.push_back(49.0*scaleFactor);
101        this->distList.push_back(52.0*scaleFactor);
102        this->distList.push_back(54.0*scaleFactor);
103        this->distList.push_back(55.0*scaleFactor);
104
105        float reductionValue = 0.2;
106
107        this->mesh_.getEntity()->getMesh()->generateLodLevels(distList, Ogre::ProgressiveMesh::VRQ_PROPORTIONAL, reductionValue);
108        billboard_.setBillboardSet(this->getScene()->getSceneManager(), this->atmosphere_, Vector3(0,0,0));
109
110        this->attachOgreObject(this->billboard_.getBillboardSet());   
111        this->billboard_.getBillboardSet()->setUseAccurateFacing(true);
112        this->setCastShadows(true);
113        this->billboard_.getBillboardSet()->setRenderQueueGroup(this->mesh_.getEntity()->getRenderQueueGroup());
114        this->mesh_.setCastShadows(true);
115    }
116
117    void Planet::changedMesh()
118    {
119        if (this->mesh_.getEntity())
120            this->detachOgreObject(this->mesh_.getEntity());
121
122        this->mesh_.setMeshSource(this->getScene()->getSceneManager(), this->meshSrc_);
123
124        if (this->mesh_.getEntity())
125        {
126            this->attachOgreObject(this->mesh_.getEntity());
127            this->mesh_.getEntity()->setCastShadows(this->bCastShadows_);
128            this->mesh_.setVisible(this->isVisible());
129        }
130        this->init();
131    }
132
133    void Planet::changedShadows()
134    {
135        this->mesh_.setCastShadows(this->bCastShadows_);
136    }
137
138    /**
139        @brief XML loading and saving.
140        @param xmlelement The XML-element
141        @param loading Loading (true) or saving (false)
142        @return The XML-element
143    */
144    void Planet::XMLPort(Element& xmlelement, XMLPort::Mode mode)
145    {
146        SUPER(Planet, XMLPort, xmlelement, mode);
147
148        XMLPortParam(Planet, "atmosphere", setAtmosphere, getAtmosphere, xmlelement, mode).defaultValues("planet/Atmosphere");
149        XMLPortParam(Planet, "atmospheresize", setAtmosphereSize, getAtmosphereSize, xmlelement,mode);     
150        XMLPortParam(Planet, "imagesize", setImageSize, getImageSize, xmlelement,mode);         
151        XMLPortParam(Planet, "mesh", setMeshSource, getMeshSource, xmlelement, mode);
152        XMLPortParam(Planet, "shadow", setCastShadows, getCastShadows, xmlelement, mode).defaultValues(true);
153    }
154
155    void Planet::registerVariables()
156    {
157        registerVariable(this->atmosphere_, variableDirection::toclient);
158        registerVariable(this->meshSrc_, variableDirection::toclient, new NetworkCallback<Planet>(this, &Planet::changedMesh));
159        registerVariable(this->bCastShadows_, variableDirection::toclient, new NetworkCallback<Planet>(this, &Planet::changedShadows));
160        registerVariable(this->atmosphereSize, variableDirection::toclient);
161        registerVariable(this->imageSize, variableDirection::toclient);
162    }
163
164    void Planet::changedVisibility()
165    {
166        SUPER(Planet, changedVisibility);
167        if (this->isInitialized())
168        {
169            this->mesh_.setVisible(this->isVisible());
170            this->billboard_.setVisible(this->isVisible());
171        }
172    }
173}
Note: See TracBrowser for help on using the repository browser.