00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00035 #include "SO3Scene.h"
00036 #include "SO3Environment.h"
00037 #include "SO3Sun.h"
00038 #include "SO3Moon.h"
00039 #include "../SO3SceneGraph/SO3Camera.h"
00040 #include "../SO3Renderer/SO3Viewport.h"
00041 #include "../SO3Utils/SO3UniversalClock.h"
00042 #include "../SO3Utils/SO3DateTime.h"
00043
00044 namespace SO3
00045 {
00046
00047 SEnvironment::SEnvironment(SScene* parent, std::string environmentName) : SData(environmentName)
00048 {
00049 scene = parent;
00050 viewport = 0;
00051 camera = 0;
00052 water = 0;
00053 sky = 0;
00054 paused = false;
00055 viewportListenerAdded = false;
00056
00057
00058 observerLatitude = 45.0f;
00059 observerLongitude = 0.0f;
00060
00061
00062 windSpeed = 1.0f;
00063 windDirection = Ogre::Vector2::UNIT_X;
00064 humidityFactor = 0.25f;
00065
00066
00067 universalClock = new SUniversalClock();
00068
00069
00070
00071
00072 universalClock->SetGregorianDateTime(2000, 1, 1, 3, 0, 0);
00073
00074
00075
00076
00077
00078
00079 sun = new SSun(this, "SO3/Internal/Environment/"+ name +"/Sun");
00080 moon = new SMoon(this, "SO3/Internal/Environment/"+ name +"/Moon");
00081
00082
00083 Ogre::Root::getSingleton().addFrameListener(this);
00084
00085
00086
00087 SetTimeSpeedFactor(60);
00088
00089 }
00090
00091 SEnvironment::SEnvironment() : SData("")
00092 {
00093
00094 }
00095
00096 SEnvironment::~SEnvironment()
00097 {
00098
00099 Ogre::Root::getSingleton().removeFrameListener(this);
00100
00101 SetViewport(0);
00102 SAFE_DELETE(water);
00103 SAFE_DELETE(sky);
00104 SAFE_DELETE(moon);
00105 SAFE_DELETE(sun);
00106 SAFE_DELETE(universalClock);
00107 }
00108
00109 SScene* SEnvironment::GetScene()
00110 {
00111 return scene;
00112 }
00113
00114 SViewPort* SEnvironment::GetViewport()
00115 {
00116 return viewport;
00117 }
00118
00119 void SEnvironment::SetViewport(SViewPort* targetViewport)
00120 {
00121 if(viewportListenerAdded)
00122 {
00123 viewport->GetOgreViewPortPointer()->getTarget()->removeListener(this);
00124 viewportListenerAdded = false;
00125 }
00126
00127 viewport = targetViewport;
00128
00129
00130 if(viewport == 0)
00131 {
00132 SetWaterEnable(false);
00133 SetSkyEnable(false);
00134 camera = 0;
00135 }
00136 else
00137 {
00138
00139 camera = targetViewport->GetCamera();
00140 }
00141 }
00142
00143 SUniversalClock* SEnvironment::GetUniversalClock()
00144 {
00145 return universalClock;
00146 }
00147
00148 SWater* SEnvironment::GetWater()
00149 {
00150 return water;
00151 }
00152
00153 SSky* SEnvironment::GetSky()
00154 {
00155 return sky;
00156 }
00157
00158 SSun* SEnvironment::GetSun()
00159 {
00160 return sun;
00161 }
00162
00163 SMoon* SEnvironment::GetMoon()
00164 {
00165 return moon;
00166 }
00167
00168 bool SEnvironment::GetWaterEnable()
00169 {
00170 return (water!=0);
00171 }
00172
00173 void SEnvironment::SetWaterEnable(bool enableWater)
00174 {
00175 if(enableWater)
00176 {
00177 if(water == 0)
00178 {
00179 if(viewport)
00180 {
00181 if(camera != 0)
00182 {
00183 water = new SWater(this, "SO3/Internal/Environment/"+ name +"/Water", viewport, camera);
00184
00185
00186 viewport->GetOgreViewPortPointer()->getTarget()->addListener(this);
00187 viewportListenerAdded = true;
00188 }
00189 }
00190 }
00191 }
00192 else
00193 {
00194 if(water != 0)
00195 SAFE_DELETE(water);
00196 }
00197 }
00198
00199 bool SEnvironment::GetSkyEnable()
00200 {
00201 return (sky!=0);
00202 }
00203
00204 void SEnvironment::SetSkyEnable(bool enableSky)
00205 {
00206 if(enableSky)
00207 {
00208 if(sky == 0)
00209 {
00210 if(viewport != 0)
00211 {
00212 sky = new SSky(this, "SO3/Internal/Environment/"+ name +"Sky");
00213 sky->RegisterViewport(viewport);
00214 }
00215 }
00216 }
00217 else
00218 {
00219 if(sky != 0)
00220 SAFE_DELETE(sky);
00221 }
00222 }
00223
00224 float SEnvironment::GetWindSpeed()
00225 {
00226 return windSpeed;
00227 }
00228
00229 void SEnvironment::SetWindSpeed(float newWindSpeed)
00230 {
00231 windSpeed = newWindSpeed;
00232 }
00233
00234 Ogre::Vector2 SEnvironment::GetWindDirection()
00235 {
00236 return windDirection;
00237 }
00238
00239 void SEnvironment::SetWindDirection(Ogre::Vector2 newWindDirection)
00240 {
00241 windDirection = newWindDirection;
00242 }
00243
00244 float SEnvironment::GetHumidity()
00245 {
00246 return humidityFactor;
00247 }
00248
00249 void SEnvironment::SetHumidity(float newHumidity)
00250 {
00251 humidityFactor = newHumidity;
00252 }
00253
00254 float SEnvironment::GetTimeSpeedFactor()
00255 {
00256 return universalClock->GetTimeScale();
00257 }
00258
00259 void SEnvironment::SetTimeSpeedFactor(float newTimeSpeedFactor)
00260 {
00261 universalClock->SetTimeScale(newTimeSpeedFactor);
00262 }
00263
00264 bool SEnvironment::GetPaused()
00265 {
00266 return paused;
00267 }
00268
00269 void SEnvironment::SetPaused(bool pauseSimulation)
00270 {
00271 paused = pauseSimulation;
00272 }
00273
00274 SDateTime SEnvironment::GetDateTime()
00275 {
00276 SDateTime tempDateTime;
00277 double second;
00278
00279 universalClock->GetGregorianDateTime(tempDateTime.year, tempDateTime.month, tempDateTime.day, tempDateTime.hour, tempDateTime.minute, second);
00280 tempDateTime.second = static_cast<int> (second);
00281 return tempDateTime;
00282 }
00283
00284 void SEnvironment::SetDateTime(SDateTime dateTime)
00285 {
00286 double second = static_cast<double> (dateTime.second);
00287 universalClock->SetGregorianDateTime(dateTime.year, dateTime.month, dateTime.day, dateTime.hour, dateTime.minute, second);
00288 }
00289
00290 Ogre::Degree SEnvironment::GetLongitude()
00291 {
00292 return observerLongitude;
00293 }
00294
00295 void SEnvironment::SetLongitude(Ogre::Degree newLongitude)
00296 {
00297 observerLongitude = newLongitude;
00298 }
00299
00300 Ogre::Degree SEnvironment::GetLatitude()
00301 {
00302 return observerLatitude;
00303 }
00304
00305 void SEnvironment::SetLatitude(Ogre::Degree newLatitude)
00306 {
00307 observerLatitude = newLatitude;
00308 }
00309
00310 bool SEnvironment::frameStarted(const Ogre::FrameEvent& evt)
00311 {
00312 if(!paused)
00313 {
00314 Ogre::Real updateTime = 0.0f;
00315 if(universalClock->GetTimeScale() != 0.0f)
00316 universalClock->Update(evt.timeSinceLastFrame);
00317
00318
00319 sun->Update();
00320
00321
00322 moon->Update();
00323
00324
00325 if(water != 0)
00326 water->Update(evt.timeSinceLastFrame);
00327
00328
00329 if(sky != 0)
00330 sky->Update(evt.timeSinceLastFrame);
00331 }
00332 return true;
00333 }
00334
00335 void SEnvironment::viewportRemoved(const Ogre::RenderTargetViewportEvent& evt)
00336 {
00337 if(viewport != 0)
00338 {
00339 if(evt.source == viewport->GetOgreViewPortPointer())
00340 {
00341
00342 SetViewport(0);
00343 }
00344 }
00345 }
00346
00347 void NotifyCameraChanged(SCamera* targetCamera)
00348 {
00349
00350 }
00351
00352 }