Rigs of Rods 2023.09
Soft-body Physics Simulation
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Loading...
Searching...
No Matches
GfxWater.cpp
Go to the documentation of this file.
1/*
2 This source file is part of Rigs of Rods
3 Copyright 2005-2012 Pierre-Michel Ricordel
4 Copyright 2007-2012 Thomas Fischer
5 Copyright 2013-2020 Petr Ohlidal
6
7 For more information, see http://www.rigsofrods.org/
8
9 Rigs of Rods is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License version 3, as
11 published by the Free Software Foundation.
12
13 Rigs of Rods 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 Rigs of Rods. If not, see <http://www.gnu.org/licenses/>.
20*/
21
22#include "GfxWater.h"
23
24#include "Actor.h"
25#include "AppContext.h"
26#include "CameraManager.h"
27#include "GfxScene.h"
28#include "PlatformUtils.h" // PathCombine
29#include "Terrain.h"
30
31#include <Ogre.h>
32
33using namespace Ogre;
34using namespace RoR;
35
36static const int WAVEREZ = 100;
37
38GfxWater::GfxWater(Ogre::Vector3 terrn_size, float initial_water_height) :
39 m_map_size(terrn_size),
40 m_visual_water_height(initial_water_height)
41{
44
45 if (m_map_size.x < 1500 && m_map_size.z < 1500)
47
48 this->PrepareWater();
49}
50
52{
53 if (m_refract_cam != nullptr)
54 {
56 m_refract_cam = nullptr;
57 }
58
59 if (m_reflect_cam != nullptr)
60 {
62 m_reflect_cam = nullptr;
63 }
64
65 if (m_waterplane_entity != nullptr)
66 {
67 App::GetGfxScene()->GetSceneManager()->destroyEntity("plane");
68 m_waterplane_entity = nullptr;
69 }
70
71 if (m_waterplane_node != nullptr)
72 {
73 App::GetGfxScene()->GetSceneManager()->getRootSceneNode()->removeAndDestroyChild("WaterPlane");
74 m_waterplane_node = nullptr;
75 }
76
77 if (m_bottomplane_node != nullptr)
78 {
79 App::GetGfxScene()->GetSceneManager()->destroyEntity("bplane");
80 App::GetGfxScene()->GetSceneManager()->getRootSceneNode()->removeAndDestroyChild("BottomWaterPlane");
81 m_bottomplane_node = nullptr;
82 }
83
85 {
86 m_refract_rtt_target->removeAllListeners();
87 m_refract_rtt_target->removeAllViewports();
88 m_refract_rtt_target = nullptr;
89 }
90
91#if 0 // Doesn't cut it with Ogre 1.11
92 if (!m_refract_rtt_texture.isNull())
93 {
94 m_refract_rtt_texture->unload();
95 Ogre::TextureManager::getSingleton().remove(m_refract_rtt_texture->getHandle());
97 }
98#endif
99
101 {
102 m_reflect_rtt_target->removeAllListeners();
103 m_reflect_rtt_target->removeAllViewports();
104 m_reflect_rtt_target = nullptr;
105 }
106
107#if 0 // Doesn't cut it with Ogre 1.11
108 if (!m_reflect_rtt_texture.isNull())
109 {
110 m_reflect_rtt_texture->unload();
111 Ogre::TextureManager::getSingleton().remove(m_reflect_rtt_texture->getHandle());
112 m_reflect_rtt_texture.reset();
113 }
114#endif
115
117 {
120 }
121
122 Ogre::MeshManager::getSingleton().remove("ReflectPlane");
123 Ogre::MeshManager::getSingleton().remove("BottomPlane");
124 Ogre::MeshManager::getSingleton().remove("WaterPlane");
125}
126
128{
129 m_water_plane.normal = Vector3::UNIT_Y;
130 m_water_plane.d = 0;
131
132 const auto type = App::gfx_water_mode->getEnum<GfxWaterMode>();
133 const bool full_gfx = type == GfxWaterMode::FULL_HQ || type == GfxWaterMode::FULL_FAST;
134
135 if (full_gfx || type == GfxWaterMode::REFLECT)
136 {
137 // Check prerequisites first
138 const RenderSystemCapabilities* caps = Root::getSingleton().getRenderSystem()->getCapabilities();
139 if (!caps->hasCapability(RSC_VERTEX_PROGRAM) || !(caps->hasCapability(RSC_FRAGMENT_PROGRAM)))
140 {
141 OGRE_EXCEPT(Exception::ERR_RENDERINGAPI_ERROR, "Your card does not support vertex and fragment programs, so cannot "
142 "run Water effects. Sorry!",
143 "Water effects");
144 }
145 else
146 {
147 if (!GpuProgramManager::getSingleton().isSyntaxSupported("arbfp1") &&
148 !GpuProgramManager::getSingleton().isSyntaxSupported("ps_2_0") &&
149 !GpuProgramManager::getSingleton().isSyntaxSupported("ps_1_4")
150 )
151 {
152 OGRE_EXCEPT(Exception::ERR_RENDERINGAPI_ERROR, "Your card does not support advanced fragment programs, "
153 "so cannot run Water effects. Sorry!",
154 "Water effects");
155 }
156 }
157 // Ok
158 // Define a floor plane mesh
159 m_reflect_plane.normal = Vector3::UNIT_Y;
160 m_reflect_plane.d = - 0.15;
161 m_refract_plane.normal = -Vector3::UNIT_Y;
162 m_refract_plane.d = 0.15;
163
164 if (full_gfx)
165 {
166 TexturePtr m_refract_rtt_targetPtr = Ogre::TextureManager::getSingleton ().getByName ("Refraction");
167 m_refract_rtt_texture = m_refract_rtt_targetPtr;
168 m_refract_rtt_target = m_refract_rtt_targetPtr->getBuffer()->getRenderTarget();
169 {
170 m_refract_cam = App::GetGfxScene()->GetSceneManager()->createCamera("RefractCam");
171 m_refract_cam->setNearClipDistance(App::GetCameraManager()->GetCamera()->getNearClipDistance());
172 m_refract_cam->setFarClipDistance(App::GetCameraManager()->GetCamera()->getFarClipDistance());
173 m_refract_cam->setAspectRatio(
174 (Real)RoR::App::GetAppContext()->GetRenderWindow()->getViewport(0)->getActualWidth() /
175 (Real)RoR::App::GetAppContext()->GetRenderWindow()->getViewport(0)->getActualHeight());
176
178 m_refract_rtt_viewport->setClearEveryFrame(true);
179 m_refract_rtt_viewport->setBackgroundColour(App::GetGfxScene()->GetSceneManager()->getFogColour());
180
181 MaterialPtr mat = MaterialManager::getSingleton().getByName("Examples/FresnelReflectionRefraction");
182 mat->getTechnique(0)->getPass(0)->getTextureUnitState(2)->setTextureName("Refraction");
183
184 mat = MaterialManager::getSingleton().getByName("Examples/FresnelReflectionRefractioninverted");
185 mat->getTechnique(0)->getPass(0)->getTextureUnitState(2)->setTextureName("Refraction");
186
187 m_refract_rtt_viewport->setOverlaysEnabled(false);
188
190
191 //optimisation
192 m_refract_rtt_target->setAutoUpdated(false);
193
194 // Also clip
195 m_refract_cam->enableCustomNearClipPlane(m_refract_plane);
196 }
197 }
198
199 TexturePtr m_reflect_rtt_targetPtr = Ogre::TextureManager::getSingleton ().getByName ("Reflection");
200 m_reflect_rtt_texture = m_reflect_rtt_targetPtr;
201 m_reflect_rtt_target = m_reflect_rtt_targetPtr->getBuffer()->getRenderTarget();
202 {
203 m_reflect_cam = App::GetGfxScene()->GetSceneManager()->createCamera("ReflectCam");
204 m_reflect_cam->setNearClipDistance(App::GetCameraManager()->GetCamera()->getNearClipDistance());
205 m_reflect_cam->setFarClipDistance(App::GetCameraManager()->GetCamera()->getFarClipDistance());
206 m_reflect_cam->setAspectRatio(
207 (Real)RoR::App::GetAppContext()->GetRenderWindow()->getViewport(0)->getActualWidth() /
208 (Real)RoR::App::GetAppContext()->GetRenderWindow()->getViewport(0)->getActualHeight());
209
211 m_reflect_rtt_viewport->setClearEveryFrame(true);
212 m_reflect_rtt_viewport->setBackgroundColour(App::GetGfxScene()->GetSceneManager()->getFogColour());
213
214 MaterialPtr mat;
215 if (full_gfx)
216 {
217 mat = MaterialManager::getSingleton().getByName("Examples/FresnelReflectionRefraction");
218 mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName("Reflection");
219
220 mat = MaterialManager::getSingleton().getByName("Examples/FresnelReflectionRefractioninverted");
221 mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName("Reflection");
222 }
223 else
224 {
225 mat = MaterialManager::getSingleton().getByName("Examples/FresnelReflection");
226 mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName("Reflection");
227 }
228
229 m_reflect_rtt_viewport->setOverlaysEnabled(false);
230
232
233 //optimisation
234 m_reflect_rtt_target->setAutoUpdated(false);
235
236 // set up linked reflection
237 m_reflect_cam->enableReflection(m_water_plane);
238 // Also clip
239 m_reflect_cam->enableCustomNearClipPlane(m_reflect_plane);
240 }
241
242 m_waterplane_mesh = MeshManager::getSingleton().createPlane("ReflectPlane",
243 ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
245 m_map_size.x * m_waterplane_mesh_scale, m_map_size.z * m_waterplane_mesh_scale, WAVEREZ, WAVEREZ, true, 1, 50, 50, Vector3::UNIT_Z, HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE);
246
247 m_waterplane_entity = App::GetGfxScene()->GetSceneManager()->createEntity("plane", "ReflectPlane");
248 if (full_gfx)
249 m_waterplane_entity->setMaterialName("Examples/FresnelReflectionRefraction");
250 else
251 m_waterplane_entity->setMaterialName("Examples/FresnelReflection");
252 }
253 else
254 {
255 m_waterplane_mesh = MeshManager::getSingleton().createPlane("WaterPlane",
256 ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
258 m_map_size.x * m_waterplane_mesh_scale, m_map_size.z * m_waterplane_mesh_scale, WAVEREZ, WAVEREZ, true, 1, 50, 50, Vector3::UNIT_Z, HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE);
259 m_waterplane_entity = App::GetGfxScene()->GetSceneManager()->createEntity("plane", "WaterPlane");
260 m_waterplane_entity->setMaterialName("tracks/basicwater");
261 }
262
263 m_waterplane_entity->setCastShadows(false);
266 //position
267 m_waterplane_node = App::GetGfxScene()->GetSceneManager()->getRootSceneNode()->createChildSceneNode("WaterPlane");
270
271 //bottom
272 m_bottom_plane.normal = Vector3::UNIT_Y;
273 m_bottom_plane.d = -m_bottom_height; //30m below waterline
274 MeshManager::getSingleton().createPlane("BottomPlane",
275 ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
277 m_map_size.x * m_waterplane_mesh_scale, m_map_size.z * m_waterplane_mesh_scale, 1, 1, true, 1, 1, 1, Vector3::UNIT_Z);
278 Entity* pE = App::GetGfxScene()->GetSceneManager()->createEntity("bplane", "BottomPlane");
279 pE->setMaterialName("tracks/seabottom");
280 pE->setCastShadows(false);
281
282 //position
283 m_bottomplane_node = App::GetGfxScene()->GetSceneManager()->getRootSceneNode()->createChildSceneNode("BottomWaterPlane");
284 m_bottomplane_node->attachObject(pE);
285 m_bottomplane_node->setPosition(Vector3((m_map_size.x * m_waterplane_mesh_scale) / 2, 0, (m_map_size.z * m_waterplane_mesh_scale) / 2));
286
287 //setup for waves
288 m_waterplane_vert_buf = m_waterplane_mesh->sharedVertexData->vertexBufferBinding->getBuffer(0);
289
290 if (m_waterplane_vert_buf->getSizeInBytes() == (WAVEREZ + 1) * (WAVEREZ + 1) * 32)
291 {
292 m_waterplane_vert_buf_local = (float*)malloc(m_waterplane_vert_buf->getSizeInBytes());
294 }
295 else
297}
298
300{
301 m_water_visible = value;
303 m_waterplane_entity->setVisible(value);
305 m_waterplane_node->setVisible(value);
307 m_bottomplane_node->setVisible(value);
308}
309
311{
312 const auto type = App::gfx_water_mode->getEnum<GfxWaterMode>();
314 {
315 this->UpdateReflectionPlane(centerheight);
316 }
317}
318
319void GfxWater::ShowWave(Vector3 refpos)
320{
322 return;
323
324 float xScaled = m_map_size.x * m_waterplane_mesh_scale;
325 float zScaled = m_map_size.z * m_waterplane_mesh_scale;
326
327 for (int pz = 0; pz < WAVEREZ + 1; pz++)
328 {
329 for (int px = 0; px < WAVEREZ + 1; px++)
330 {
331 m_waterplane_vert_buf_local[(pz * (WAVEREZ + 1) + px) * 8 + 1] = App::GetGameContext()->GetTerrain()->getWater()->CalcWavesHeight(refpos + Vector3(xScaled * 0.5 - (float)px * xScaled / WAVEREZ, 0, (float)pz * zScaled / WAVEREZ - zScaled * 0.5)) - App::GetGameContext()->GetTerrain()->getWater()->GetStaticWaterHeight();
332 }
333 }
334
335 //normals
336 for (int pz = 0; pz < WAVEREZ + 1; pz++)
337 {
338 for (int px = 0; px < WAVEREZ + 1; px++)
339 {
340 int left = std::max(0, px - 1);
341 int right = std::min(px + 1, WAVEREZ);
342 int up = std::max(0, pz - 1);
343 int down = std::min(pz + 1, WAVEREZ);
344
345 Vector3 normal = (Vector3(m_waterplane_vert_buf_local + ((pz * (WAVEREZ + 1) + left) * 8)) - Vector3(m_waterplane_vert_buf_local + ((pz * (WAVEREZ + 1) + right) * 8))).crossProduct(Vector3(m_waterplane_vert_buf_local + ((up * (WAVEREZ + 1) + px) * 8)) - Vector3(m_waterplane_vert_buf_local + ((down * (WAVEREZ + 1) + px) * 8)));
346 normal.normalise();
347
348 m_waterplane_vert_buf_local[(pz * (WAVEREZ + 1) + px) * 8 + 3] = normal.x;
349 m_waterplane_vert_buf_local[(pz * (WAVEREZ + 1) + px) * 8 + 4] = normal.y;
350 m_waterplane_vert_buf_local[(pz * (WAVEREZ + 1) + px) * 8 + 5] = normal.z;
351 }
352 }
353
354 m_waterplane_vert_buf->writeData(0, (WAVEREZ + 1) * (WAVEREZ + 1) * 32, m_waterplane_vert_buf_local, true);
355}
356
358{
360 Ogre::SceneNode* camNode = App::GetCameraManager()->GetCameraNode();
361 return camNode->getPosition().y < waveField->CalcWavesHeight(camNode->getPosition());
362}
363
365{
366 if (!m_water_visible)
367 return;
368
369 const Ogre::Vector3 camera_pos = (m_cam_forced) ? m_cam_forced_position : App::GetCameraManager()->GetCameraNode()->getPosition();
370 const Ogre::Quaternion camera_rot = (m_cam_forced) ? m_cam_forced_orientation : App::GetCameraManager()->GetCameraNode()->getOrientation();
371 const Ogre::Radian camera_fov = (m_cam_forced) ? m_cam_forced_fovy : App::GetCameraManager()->GetCamera()->getFOVy();
372
374 {
375 const Vector3 water_cam_pos(camera_pos.x, m_visual_water_height, camera_pos.z);
376 Vector3 sightPos(water_cam_pos);
377 // Direction points down -Z by default (adapted from Ogre::Camera)
378 Ogre::Vector3 cameraDir = camera_rot * -Ogre::Vector3::UNIT_Z;
379
380 Ray lineOfSight(camera_pos, cameraDir);
381 Plane waterPlane(Vector3::UNIT_Y, Vector3::UNIT_Y * m_visual_water_height);
382
383 std::pair<bool, Real> intersection = lineOfSight.intersects(waterPlane);
384
385 if (intersection.first && intersection.second > 0.0f)
386 sightPos = lineOfSight.getPoint(intersection.second);
387
388 Real offset = std::min(water_cam_pos.distance(sightPos), std::min(m_map_size.x, m_map_size.z) * 0.5f);
389
390 Vector3 waterPos = water_cam_pos + (sightPos - water_cam_pos).normalisedCopy() * offset;
391 Vector3 bottomPos = Vector3(waterPos.x, m_bottom_height, waterPos.z);
392
393 if (waterPos.distance(m_waterplane_node->getPosition()) > 200.0f || m_waterplane_force_update_pos)
394 {
395 m_waterplane_node->setPosition(Vector3(waterPos.x, m_visual_water_height, waterPos.z));
396 m_bottomplane_node->setPosition(bottomPos);
397 }
398 if (RoR::App::gfx_water_waves->getBool() && RoR::App::mp_state->getEnum<MpState>() == RoR::MpState::DISABLED)
399 this->ShowWave(m_waterplane_node->getPosition());
400 }
401
403 if (App::gfx_water_mode->getEnum<GfxWaterMode>() == GfxWaterMode::FULL_FAST)
404 {
406 {
407 m_reflect_cam->setOrientation(camera_rot);
408 m_reflect_cam->setPosition(camera_pos);
409 m_reflect_cam->setFOVy(camera_fov);
410 m_reflect_rtt_target->update();
411 }
413 {
414 m_refract_cam->setOrientation(camera_rot);
415 m_refract_cam->setPosition(camera_pos);
416 m_refract_cam->setFOVy(camera_fov);
417 m_refract_rtt_target->update();
418 }
419 }
420 else if (App::gfx_water_mode->getEnum<GfxWaterMode>() == GfxWaterMode::FULL_HQ)
421 {
422 m_reflect_cam->setOrientation(camera_rot);
423 m_reflect_cam->setPosition(camera_pos);
424 m_reflect_cam->setFOVy(camera_fov);
425 m_reflect_rtt_target->update();
426
427 m_refract_cam->setOrientation(camera_rot);
428 m_refract_cam->setPosition(camera_pos);
429 m_refract_cam->setFOVy(camera_fov);
430 m_refract_rtt_target->update();
431 }
432 else if (App::gfx_water_mode->getEnum<GfxWaterMode>() == GfxWaterMode::REFLECT)
433 {
434 m_reflect_cam->setOrientation(camera_rot);
435 m_reflect_cam->setPosition(camera_pos);
436 m_reflect_cam->setFOVy(camera_fov);
437 m_reflect_rtt_target->update();
438 }
439
441}
442
450
452{
453 m_bottom_height = value;
454}
455
457{
458 if (this->IsCameraUnderWater())
459 {
460 m_water_plane.d = -h;
461 if (m_reflect_cam)
462 {
463 m_reflect_cam->disableReflection();
464 m_reflect_cam->disableCustomNearClipPlane();
465 }
466 }
467 else
468 {
469 m_reflect_plane.normal = Vector3::UNIT_Y;
470 m_refract_plane.normal = -Vector3::UNIT_Y;
471 m_reflect_plane.d = -h + 0.15;
472 m_refract_plane.d = h + 0.15;
473 m_water_plane.d = -h;
474 if (m_reflect_cam)
475 {
476 m_reflect_cam->enableReflection(m_water_plane);
477 m_reflect_cam->enableCustomNearClipPlane(m_reflect_plane);
478 }
479 }
480
481 if (m_refract_cam)
482 {
483 m_refract_cam->enableCustomNearClipPlane(m_refract_plane);
484 }
485}
486
488{
489 // Update even if game paused to account for camera movement (important for reflections).
490 // --------------------------------------------------------------------------------------
491 const float water_height = App::GetGameContext()->GetTerrain()->getWater()->GetStaticWaterHeight();
492 if (water_height != m_visual_water_height)
493 {
494 m_visual_water_height = water_height;
496 }
497 this->UpdateWater();
498}
499
500void GfxWater::SetForcedCameraTransform(Ogre::Radian fovy, Ogre::Vector3 pos, Ogre::Quaternion rot)
501{
502 m_cam_forced = true;
503 m_cam_forced_fovy = fovy;
506}
507
509{
510 m_cam_forced = false;
512 m_cam_forced_position = Ogre::Vector3::ZERO;
513 m_cam_forced_orientation = Ogre::Quaternion::IDENTITY;
514}
515
516
517// ------------------------- The listeners -------------------------
518
519
520void GfxWater::RefractionListener::preRenderTargetUpdate(const Ogre::RenderTargetEvent& evt)
521{
522 this->scene_mgr->getRenderQueue()->getQueueGroup(RENDER_QUEUE_MAIN)->setShadowsEnabled(false);
523 this->waterplane_entity->setVisible(false);
524 App::GetGfxScene()->SetParticlesVisible(false); // Hide water spray
525}
526
527void GfxWater::RefractionListener::postRenderTargetUpdate(const Ogre::RenderTargetEvent& evt)
528{
529 this->scene_mgr->getRenderQueue()->getQueueGroup(RENDER_QUEUE_MAIN)->setShadowsEnabled(true);
530 this->waterplane_entity->setVisible(true);
531 App::GetGfxScene()->SetParticlesVisible(true); // Restore water spray
532}
533
534void GfxWater::ReflectionListener::preRenderTargetUpdate(const Ogre::RenderTargetEvent& evt)
535{
536 this->scene_mgr->getRenderQueue()->getQueueGroup(RENDER_QUEUE_MAIN)->setShadowsEnabled(false);
537 this->waterplane_entity->setVisible(false);
538}
539
540void GfxWater::ReflectionListener::postRenderTargetUpdate(const Ogre::RenderTargetEvent& evt)
541{
542 this->scene_mgr->getRenderQueue()->getQueueGroup(RENDER_QUEUE_MAIN)->setShadowsEnabled(true);
543 this->waterplane_entity->setVisible(true);
544}
System integration layer; inspired by OgreBites::ApplicationContext.
static const int WAVEREZ
Definition GfxWater.cpp:36
Platform-specific utilities. We use narrow UTF-8 encoded strings as paths. Inspired by http://utf8eve...
T getEnum() const
Definition CVar.h:99
Ogre::SceneNode * GetCameraNode()
Ogre::Camera * GetCamera()
const TerrainPtr & GetTerrain()
void SetParticlesVisible(bool visible)
Definition GfxScene.cpp:269
Ogre::SceneManager * GetSceneManager()
Definition GfxScene.h:83
void ShowWave(Ogre::Vector3 refpos)
Definition GfxWater.cpp:319
void SetForcedCameraTransform(Ogre::Radian fovy, Ogre::Vector3 pos, Ogre::Quaternion rot) override
Definition GfxWater.cpp:500
Ogre::RenderTexture * m_refract_rtt_target
Definition GfxWater.h:104
Ogre::Vector3 m_cam_forced_position
Definition GfxWater.h:116
Ogre::Plane m_refract_plane
Definition GfxWater.h:99
Ogre::RenderTexture * m_reflect_rtt_target
Definition GfxWater.h:105
float * m_waterplane_vert_buf_local
Definition GfxWater.h:96
Ogre::TexturePtr m_refract_rtt_texture
Definition GfxWater.h:106
Ogre::HardwareVertexBufferSharedPtr m_waterplane_vert_buf
Definition GfxWater.h:95
void UpdateWater() override
Definition GfxWater.cpp:364
Ogre::Vector3 m_map_size
Definition GfxWater.h:90
float m_waterplane_mesh_scale
Definition GfxWater.h:88
bool m_cam_forced
Definition GfxWater.h:114
float m_visual_water_height
Definition GfxWater.h:86
GfxWater(Ogre::Vector3 terrn_size, float initial_water_height)
Definition GfxWater.cpp:38
int m_frame_counter
Definition GfxWater.h:89
Ogre::SceneNode * m_bottomplane_node
Definition GfxWater.h:110
Ogre::Radian m_cam_forced_fovy
Definition GfxWater.h:115
bool m_water_visible
Definition GfxWater.h:85
Ogre::Plane m_bottom_plane
Definition GfxWater.h:111
void SetWaterBottomHeight(float value) override
Definition GfxWater.cpp:451
Ogre::Entity * m_waterplane_entity
Definition GfxWater.h:93
ReflectionListener m_reflect_listener
Definition GfxWater.h:100
void SetReflectionPlaneHeight(float centerheight) override
Definition GfxWater.cpp:310
Ogre::Viewport * m_refract_rtt_viewport
Definition GfxWater.h:108
void PrepareWater()
Definition GfxWater.cpp:127
bool IsCameraUnderWater()
Definition GfxWater.cpp:357
Ogre::Plane m_reflect_plane
Definition GfxWater.h:98
void WaterPrepareShutdown() override
Definition GfxWater.cpp:443
RefractionListener m_refract_listener
Definition GfxWater.h:101
Ogre::Quaternion m_cam_forced_orientation
Definition GfxWater.h:117
void ClearForcedCameraTransform() override
Definition GfxWater.cpp:508
void SetWaterVisible(bool value) override
Definition GfxWater.cpp:299
void FrameStepWater(float dt) override
Definition GfxWater.cpp:487
Ogre::Plane m_water_plane
Definition GfxWater.h:91
Ogre::Camera * m_refract_cam
Definition GfxWater.h:103
bool m_waterplane_force_update_pos
Definition GfxWater.h:97
float m_bottom_height
Definition GfxWater.h:87
Ogre::Viewport * m_reflect_rtt_viewport
Definition GfxWater.h:109
void UpdateReflectionPlane(float h) override
Definition GfxWater.cpp:456
Ogre::Camera * m_reflect_cam
Definition GfxWater.h:102
Ogre::TexturePtr m_reflect_rtt_texture
Definition GfxWater.h:107
Ogre::MeshPtr m_waterplane_mesh
Definition GfxWater.h:92
Ogre::SceneNode * m_waterplane_node
Definition GfxWater.h:94
Wavefield * getWater()
Definition Terrain.h:87
< Water physics, see 'wavefield.cfg' in your config directory.
Definition Wavefield.h:33
float CalcWavesHeight(Vec3 pos, float timeshift_sec=0.f)
Definition Wavefield.cpp:90
float GetStaticWaterHeight()
Returns static water level configured in 'terrn2'.
Definition Wavefield.cpp:75
@ DISABLED
Not connected for whatever reason.
AppContext * GetAppContext()
CVar * gfx_water_mode
CameraManager * GetCameraManager()
GameContext * GetGameContext()
GfxScene * GetGfxScene()
CVar * gfx_water_waves
CVar * mp_state
GfxWaterMode
@ FULL_FAST
Reflection + refraction (speed optimized)
@ FULL_HQ
Reflection + refraction (quality optimized)
@ REFLECT
Reflection.
void postRenderTargetUpdate(const Ogre::RenderTargetEvent &evt) override
Definition GfxWater.cpp:540
Ogre::SceneManager * scene_mgr
Definition GfxWater.h:66
void preRenderTargetUpdate(const Ogre::RenderTargetEvent &evt) override
Definition GfxWater.cpp:534
void preRenderTargetUpdate(const Ogre::RenderTargetEvent &evt) override
Definition GfxWater.cpp:520
void postRenderTargetUpdate(const Ogre::RenderTargetEvent &evt) override
Definition GfxWater.cpp:527
Ogre::SceneManager * scene_mgr
Definition GfxWater.h:77