Divide Framework 0.1
A free and open-source 3D Framework under heavy development
Loading...
Searching...
No Matches
Water.cpp
Go to the documentation of this file.
1
2
3#include "Headers/Water.h"
4
9
13
16
18
24
25namespace Divide
26{
27
28 namespace
29 {
30 // how far to offset the clipping planes for reflections in order to avoid artefacts at water/geometry intersections with high wave noise factors
32 }
33
34 WaterPlane::WaterPlane( const ResourceDescriptor<WaterPlane>& descriptor )
35 : SceneNode( descriptor,
36 GetSceneNodeType<WaterPlane>(),
38 {
39 _fogStartEnd = { 648.f, 1300.f };
40 _noiseTile = { 15.0f, 15.0f };
41 _noiseFactor = { 0.1f, 0.1f };
42 _refractionTint = { 0.f, 0.567f, 0.845f };
43 _waterDistanceFogColour = { 0.9f, 0.9f, 1.f };
44 _dimensions = { 500u, 500u, 500u };
45 // The water doesn't cast shadows, doesn't need ambient occlusion and doesn't have real "depth"
46 renderState().addToDrawExclusionMask( RenderStage::SHADOW );
47 }
48
49 WaterPlane::~WaterPlane()
50 {
51 Camera::DestroyCamera( _reflectionCam );
52 }
53
54 void WaterPlane::onEditorChange( std::string_view ) noexcept
55 {
56
57 if ( _fogStartEnd.y <= _fogStartEnd.y )
58 {
59 _fogStartEnd.y = _fogStartEnd.x + 0.1f;
60 }
61 }
62
63 bool WaterPlane::load( PlatformContext& context )
64 {
65 if ( _plane != INVALID_HANDLE<Quad3D> )
66 {
67 return false;
68 }
69
71
72 _reflectionCam = Camera::CreateCamera( resourceName() + "_reflectionCam", Camera::Mode::STATIC );
73
74 const auto name = resourceName();
75
76 ResourceDescriptor<Quad3D> waterPlane( "waterPlane" );
77 waterPlane.flag( true ); // No default material
78 waterPlane.waitForReady( true );
79
80 _plane = CreateResource( waterPlane );
81
82 SamplerDescriptor defaultSampler = {};
83 defaultSampler._wrapU = TextureWrap::REPEAT;
84 defaultSampler._wrapV = TextureWrap::REPEAT;
85 defaultSampler._wrapW = TextureWrap::REPEAT;
86 defaultSampler._anisotropyLevel = 4u;
87
88 std::atomic_uint loadTasks = 0u;
89
90 ResourceDescriptor<Texture> waterTexture( "waterTexture_" + name );
91 waterTexture.assetName( "terrain_water_NM_old.jpg" );
92 waterTexture.assetLocation( Paths::g_imagesLocation );
93 waterTexture.waitForReady( false );
94
95 TextureDescriptor& texDescriptor = waterTexture._propertyDescriptor;
97 texDescriptor._textureOptions._alphaChannelTransparency = false;
98
99 Handle<Texture> waterNM = CreateResource( waterTexture, loadTasks );
100
101 ResourceDescriptor<Material> waterMaterial( "waterMaterial_" + name );
102 Handle<Material> waterMatHandle = CreateResource( waterMaterial );
103 ResourcePtr<Material> waterMat = Get(waterMatHandle);
104
105 waterMat->updatePriorirty( Material::UpdatePriority::Medium );
106 waterMat->properties().shadingMode( ShadingMode::BLINN_PHONG );
107 waterMat->properties().bumpMethod( BumpMethod::NORMAL );
108 waterMat->properties().isStatic( true );
109 waterMat->addShaderDefine( ShaderType::COUNT, "ENABLE_TBN" );
110
111 WAIT_FOR_CONDITION( loadTasks.load() == 0u );
112
113 waterMat->setTexture( TextureSlot::NORMALMAP, waterNM, defaultSampler, TextureOperation::REPLACE );
114 waterMat->computeShaderCBK( []( [[maybe_unused]] Material* material, const RenderStagePass stagePass )
115 {
116 ShaderModuleDescriptor vertModule = {};
117 vertModule._moduleType = ShaderType::VERTEX;
118 vertModule._sourceFile = "water.glsl";
119
120 ShaderModuleDescriptor fragModule = {};
121 fragModule._moduleType = ShaderType::FRAGMENT;
122 fragModule._sourceFile = "water.glsl";
123
124 ShaderProgramDescriptor shaderDescriptor = {};
125 shaderDescriptor._name = "waterColour";
126 if ( IsDepthPass( stagePass ) )
127 {
128 if ( stagePass._stage == RenderStage::DISPLAY )
129 {
130 shaderDescriptor._name = "waterPrePass";
131 shaderDescriptor._globalDefines.emplace_back( "PRE_PASS" );
132 shaderDescriptor._modules.push_back( vertModule );
133 shaderDescriptor._modules.push_back( fragModule );
134 }
135 else
136 {
137 shaderDescriptor._name = "waterDepthPass";
138 shaderDescriptor._modules.push_back( vertModule );
139 }
140 }
141 else
142 {
143 shaderDescriptor._modules.push_back( vertModule );
144 shaderDescriptor._modules.push_back( fragModule );
145 }
146
147 shaderDescriptor._globalDefines.emplace_back( "_refractionTint PushData0[0].xyz" );
148 shaderDescriptor._globalDefines.emplace_back( "_specularShininess PushData0[0].w" );
149 shaderDescriptor._globalDefines.emplace_back( "_waterDistanceFogColour PushData0[1].xyz" );
150 shaderDescriptor._globalDefines.emplace_back( "_noiseTile PushData0[2].xy" );
151 shaderDescriptor._globalDefines.emplace_back( "_noiseFactor PushData0[2].zw)" );
152 shaderDescriptor._globalDefines.emplace_back( "_fogStartEndDistances PushData0[3].xy" );
153
154 return shaderDescriptor;
155 } );
156
157 waterMat->properties().roughness( 0.01f );
158 waterMat->setPipelineLayout( PrimitiveTopology::TRIANGLE_STRIP, Get(_plane)->geometryBuffer()->generateAttributeMap() );
159
160 setMaterialTpl( waterMatHandle );
161
162 const F32 halfWidth = _dimensions.width * 0.5f;
163 const F32 halfLength = _dimensions.height * 0.5f;
164
165 setBounds( BoundingBox( vec3<F32>( -halfWidth, -_dimensions.depth, -halfLength ), vec3<F32>( halfWidth, 0, halfLength ) ) );
166
167 return SceneNode::load( context );
168 }
169
170 void WaterPlane::postLoad( SceneGraphNode* sgn )
171 {
172 PlatformContext& pContext = sgn->context();
173 registerEditorComponent( pContext );
174 DIVIDE_ASSERT( _editorComponent != nullptr );
175
176 EditorComponentField blurReflectionField = {};
177 blurReflectionField._name = "Blur reflections";
178 blurReflectionField._data = &_blurReflections;
179 blurReflectionField._type = EditorComponentFieldType::PUSH_TYPE;
180 blurReflectionField._readOnly = false;
181 blurReflectionField._basicType = PushConstantType::BOOL;
182
183 _editorComponent->registerField( MOV( blurReflectionField ) );
184
185 EditorComponentField blurKernelSizeField = {};
186 blurKernelSizeField._name = "Blur kernel size";
187 blurKernelSizeField._data = &_blurKernelSize;
188 blurKernelSizeField._type = EditorComponentFieldType::SLIDER_TYPE;
189 blurKernelSizeField._readOnly = false;
190 blurKernelSizeField._basicType = PushConstantType::UINT;
191 blurKernelSizeField._basicTypeSize = PushConstantSize::WORD;
192 blurKernelSizeField._range = { 2.f, 20.f };
193 blurKernelSizeField._step = 1.f;
194
195 _editorComponent->registerField( MOV( blurKernelSizeField ) );
196
197 EditorComponentField reflPlaneOffsetField = {};
198 reflPlaneOffsetField._name = "Reflection Plane Offset";
199 reflPlaneOffsetField._data = &_reflPlaneOffset;
200 reflPlaneOffsetField._range = { -5.0f, 5.0f };
201 reflPlaneOffsetField._type = EditorComponentFieldType::PUSH_TYPE;
202 reflPlaneOffsetField._readOnly = false;
203 reflPlaneOffsetField._basicType = PushConstantType::FLOAT;
204
205 _editorComponent->registerField( MOV( reflPlaneOffsetField ) );
206
207 EditorComponentField refrPlaneOffsetField = {};
208 refrPlaneOffsetField._name = "Refraction Plane Offset";
209 refrPlaneOffsetField._data = &_refrPlaneOffset;
210 refrPlaneOffsetField._range = { -5.0f, 5.0f };
211 refrPlaneOffsetField._type = EditorComponentFieldType::PUSH_TYPE;
212 refrPlaneOffsetField._readOnly = false;
213 refrPlaneOffsetField._basicType = PushConstantType::FLOAT;
214
215 _editorComponent->registerField( MOV( refrPlaneOffsetField ) );
216
217 EditorComponentField fogDistanceField = {};
218 fogDistanceField._name = "Fog start/end distances";
219 fogDistanceField._data = &_fogStartEnd;
220 fogDistanceField._range = { 0.0f, 4096.0f };
221 fogDistanceField._type = EditorComponentFieldType::PUSH_TYPE;
222 fogDistanceField._readOnly = false;
223 fogDistanceField._basicType = PushConstantType::VEC2;
224
225 _editorComponent->registerField( MOV( fogDistanceField ) );
226
227 EditorComponentField waterFogField = {};
228 waterFogField._name = "Water fog colour";
229 waterFogField._data = &_waterDistanceFogColour;
230 waterFogField._type = EditorComponentFieldType::PUSH_TYPE;
231 waterFogField._readOnly = false;
232 waterFogField._basicType = PushConstantType::FCOLOUR3;
233
234 _editorComponent->registerField( MOV( waterFogField ) );
235
236 EditorComponentField noiseTileSizeField = {};
237 noiseTileSizeField._name = "Noise tile factor";
238 noiseTileSizeField._data = &_noiseTile;
239 noiseTileSizeField._range = { 0.0f, 1000.0f };
240 noiseTileSizeField._type = EditorComponentFieldType::PUSH_TYPE;
241 noiseTileSizeField._readOnly = false;
242 noiseTileSizeField._basicType = PushConstantType::VEC2;
243
244 _editorComponent->registerField( MOV( noiseTileSizeField ) );
245
246 EditorComponentField noiseFactorField = {};
247 noiseFactorField._name = "Noise factor";
248 noiseFactorField._data = &_noiseFactor;
249 noiseFactorField._range = { 0.0f, 10.0f };
250 noiseFactorField._type = EditorComponentFieldType::PUSH_TYPE;
251 noiseFactorField._readOnly = false;
252 noiseFactorField._basicType = PushConstantType::VEC2;
253
254 _editorComponent->registerField( MOV( noiseFactorField ) );
255
256 EditorComponentField refractionTintField = {};
257 refractionTintField._name = "Refraction tint";
258 refractionTintField._data = &_refractionTint;
259 refractionTintField._type = EditorComponentFieldType::PUSH_TYPE;
260 refractionTintField._readOnly = false;
261 refractionTintField._basicType = PushConstantType::FCOLOUR3;
262
263 _editorComponent->registerField( MOV( refractionTintField ) );
264
265 EditorComponentField specularShininessField = {};
266 specularShininessField._name = "Specular Shininess";
267 specularShininessField._data = &_specularShininess;
268 specularShininessField._type = EditorComponentFieldType::PUSH_TYPE;
269 specularShininessField._readOnly = false;
270 specularShininessField._range = { 0.01f, Material::MAX_SHININESS };
271 specularShininessField._basicType = PushConstantType::FLOAT;
272
273 _editorComponent->registerField( MOV( specularShininessField ) );
274
275 _editorComponent->onChangedCbk( [this]( const std::string_view field ) noexcept
276 {
277 onEditorChange( field );
278 });
279 NavigationComponent* nComp = sgn->get<NavigationComponent>();
280 if ( nComp != nullptr )
281 {
283 }
284
285 RigidBodyComponent* rComp = sgn->get<RigidBodyComponent>();
286 if ( rComp != nullptr )
287 {
288 rComp->physicsCollisionGroup( PhysicsGroup::GROUP_STATIC );
289 }
290
291 const F32 halfWidth = _dimensions.width * 0.5f;
292 const F32 halfLength = _dimensions.height * 0.5f;
293
294 Get(_plane)->setCorner( Quad3D::CornerLocation::TOP_LEFT, vec3<F32>( -halfWidth, 0, -halfLength ) );
295 Get(_plane)->setCorner( Quad3D::CornerLocation::TOP_RIGHT, vec3<F32>( halfWidth, 0, -halfLength ) );
296 Get(_plane)->setCorner( Quad3D::CornerLocation::BOTTOM_LEFT, vec3<F32>( -halfWidth, 0, halfLength ) );
297 Get(_plane)->setCorner( Quad3D::CornerLocation::BOTTOM_RIGHT, vec3<F32>( halfWidth, 0, halfLength ) );
298 Get(_plane)->setNormal( Quad3D::CornerLocation::CORNER_ALL, WORLD_Y_AXIS );
299 _boundingBox.set( vec3<F32>( -halfWidth, -_dimensions.depth, -halfLength ), vec3<F32>( halfWidth, 0, halfLength ) );
300
301 RenderingComponent* renderable = sgn->get<RenderingComponent>();
302
303 // If the reflector is reasonably sized, we should keep LoD fixed so that we always update reflections
304 if ( sgn->context().config().rendering.lodThresholds.x < std::max( halfWidth, halfLength ) )
305 {
306 renderable->lockLoD( 0u );
307 }
308
309 renderable->setReflectionCallback( [this]( RenderPassManager* passManager, RenderCbkParams& params, GFX::CommandBuffer& commandsInOut, GFX::MemoryBarrierCommand& memCmdInOut )
310 {
311 updateReflection( passManager, params, commandsInOut, memCmdInOut );
313
314 renderable->setRefractionCallback( [this]( RenderPassManager* passManager, RenderCbkParams& params, GFX::CommandBuffer& commandsInOut, GFX::MemoryBarrierCommand& memCmdInOut )
315 {
316 updateRefraction( passManager, params, commandsInOut, memCmdInOut );
318
319 renderable->toggleRenderOption( RenderingComponent::RenderOptions::CAST_SHADOWS, false );
320
321 SceneNode::postLoad( sgn );
322 }
323
324 bool WaterPlane::postLoad()
325 {
326 return SceneNode::postLoad();
327 }
328
329 bool WaterPlane::unload()
330 {
331 DestroyResource(_plane);
332 return SceneNode::unload();
333 }
334
335 void WaterPlane::sceneUpdate( const U64 deltaTimeUS, SceneGraphNode* sgn, SceneState& sceneState )
336 {
337 sceneState.waterBodies().emplace_back(WaterBodyData
338 {
339 ._positionW = sgn->get<TransformComponent>()->getWorldPosition(),
340 ._extents = { to_F32( _dimensions.width ),
341 to_F32( _dimensions.depth ),
342 to_F32( _dimensions.height ),
343 0.f}
344 });
345
346 SceneNode::sceneUpdate( deltaTimeUS, sgn, sceneState );
347 }
348
349 void WaterPlane::prepareRender( SceneGraphNode* sgn,
350 RenderingComponent& rComp,
351 RenderPackage& pkg,
352 GFX::MemoryBarrierCommand& postDrawMemCmd,
353 const RenderStagePass renderStagePass,
354 const CameraSnapshot& cameraSnapshot,
355 const bool refreshData )
356 {
357 PushConstantsStruct& fastData = pkg.pushConstantsCmd()._fastData;
358 fastData.data[0]._vec[0].set( refractionTint(), specularShininess() );
359 fastData.data[0]._vec[1].set( waterDistanceFogColour(), 0.f );
360 fastData.data[0]._vec[2].set( noiseTile(), noiseFactor() );
361 fastData.data[0]._vec[3].xy = fogStartEnd();
362
363 SceneNode::prepareRender( sgn, rComp, pkg, postDrawMemCmd, renderStagePass, cameraSnapshot, refreshData );
364 }
365
366 bool WaterPlane::PointUnderwater( const SceneGraphNode* sgn, const vec3<F32>& point ) noexcept
367 {
368 return sgn->get<BoundsComponent>()->getBoundingBox().containsPoint( point );
369 }
370
371 void WaterPlane::buildDrawCommands( SceneGraphNode* sgn, GenericDrawCommandContainer& cmdsOut )
372 {
373 GenericDrawCommand& cmd = cmdsOut.emplace_back();
375
376 cmd._cmd.indexCount = to_U32( Get(_plane)->geometryBuffer()->getIndexCount() );
377 cmd._sourceBuffer = Get(_plane)->geometryBuffer()->handle();
378
379 SceneNode::buildDrawCommands( sgn, cmdsOut );
380 }
381
383 void WaterPlane::updateRefraction( RenderPassManager* passManager, RenderCbkParams& renderParams, GFX::CommandBuffer& bufferInOut, GFX::MemoryBarrierCommand& memCmdInOut ) const
384 {
385 // If we are above water, process the plane's refraction.
386 // If we are below, we render the scene normally
387 const bool underwater = PointUnderwater( renderParams._sgn, renderParams._camera->snapshot()._eye );
388 Plane<F32> refractionPlane;
389 updatePlaneEquation( renderParams._sgn, refractionPlane, underwater, refrPlaneOffset() );
390 refractionPlane._distance += g_reflectionPlaneCorrectionHeight;
391
392 RenderPassParams params = {};
393 SetDefaultDrawDescriptor( params );
394
395 params._sourceNode = renderParams._sgn;
396 // We don't need to HiZ cull refractions
397 // We don't need to draw refracted transparents using woit
398 params._minExtents.set( 1.0f );
399 params._stagePass = { RenderStage::REFRACTION, RenderPassType::COUNT, renderParams._passIndex, RenderStagePass::VariantType::VARIANT_0 };
400 params._target = renderParams._renderTarget;
401 params._clippingPlanes.set( 0, refractionPlane );
402 params._passName = "Refraction";
403 params._clearDescriptorMainPass[RT_DEPTH_ATTACHMENT_IDX] = DEFAULT_CLEAR_ENTRY;
404 params._clearDescriptorMainPass[to_base(RTColourAttachmentSlot::SLOT_0)] = { DefaultColours::BLUE, true };
405
406 if ( !underwater )
407 {
408 params._drawMask &= ~(1u << to_base(RenderPassParams::Flags::DRAW_DYNAMIC_NODES));
409 }
410
411 passManager->doCustomPass( renderParams._camera, params, bufferInOut, memCmdInOut );
412
413 const PlatformContext& context = passManager->parent().platformContext();
414 const RenderTarget* rt = context.gfx().renderTargetPool().getRenderTarget( params._target );
415
416 GFX::ComputeMipMapsCommand computeMipMapsCommand = {};
417 computeMipMapsCommand._texture = rt->getAttachment( RTAttachmentType::COLOUR )->texture();
418 computeMipMapsCommand._usage = ImageUsage::SHADER_READ;
419 GFX::EnqueueCommand( bufferInOut, computeMipMapsCommand );
420 }
421
423 void WaterPlane::updateReflection( RenderPassManager* passManager, RenderCbkParams& renderParams, GFX::CommandBuffer& bufferInOut, GFX::MemoryBarrierCommand& memCmdInOut ) const
424 {
425 // If we are above water, process the plane's refraction.
426 // If we are below, we render the scene normally
427 const bool underwater = PointUnderwater( renderParams._sgn, renderParams._camera->snapshot()._eye );
428 if ( underwater )
429 {
430 return;
431 }
432
433 Plane<F32> reflectionPlane;
434 updatePlaneEquation( renderParams._sgn, reflectionPlane, !underwater, reflPlaneOffset() );
435
436 // Reset reflection cam
437 renderParams._camera->updateLookAt();
438 _reflectionCam->fromCamera( *renderParams._camera );
439 if ( !underwater )
440 {
441 reflectionPlane._distance += g_reflectionPlaneCorrectionHeight;
442 _reflectionCam->setReflection( reflectionPlane );
443 }
444
445 RenderPassParams params = {};
446 SetDefaultDrawDescriptor( params );
447
448 params._sourceNode = renderParams._sgn;
449 params._targetHIZ = RenderTargetNames::HI_Z_REFLECT;
450 params._targetOIT = RenderTargetNames::OIT_REFLECT;
451 params._minExtents.set( 1.5f );
452 params._stagePass = { RenderStage::REFLECTION, RenderPassType::COUNT, renderParams._passIndex, static_cast<RenderStagePass::VariantType>(ReflectorType::PLANAR) };
453 params._target = renderParams._renderTarget;
454 params._clippingPlanes.set( 0, reflectionPlane );
455 params._passName = "Reflection";
456 params._clearDescriptorMainPass[RT_DEPTH_ATTACHMENT_IDX] = DEFAULT_CLEAR_ENTRY;
457 params._clearDescriptorMainPass[to_base( RTColourAttachmentSlot::SLOT_0 )] = { DefaultColours::BLUE, true };
458
459 params._drawMask &= ~(1u << to_base(RenderPassParams::Flags::DRAW_DYNAMIC_NODES));
460
461 passManager->doCustomPass( _reflectionCam, params, bufferInOut, memCmdInOut );
462
463 if ( _blurReflections )
464 {
465 RenderTarget* reflectTarget = renderParams._context.renderTargetPool().getRenderTarget( renderParams._renderTarget );
466 RenderTargetHandle reflectionTargetHandle{
467 reflectTarget,
468 renderParams._renderTarget
469 };
470
471 RenderTarget* reflectBlurTarget = renderParams._context.renderTargetPool().getRenderTarget( RenderTargetNames::REFLECTION_PLANAR_BLUR );
472 RenderTargetHandle reflectionBlurBuffer{
473 reflectBlurTarget,
475 };
476
477 renderParams._context.blurTarget( reflectionTargetHandle,
478 reflectionBlurBuffer,
479 reflectionTargetHandle,
482 _blurKernelSize,
483 true,
484 1,
485 bufferInOut );
486 }
487
488 const PlatformContext& context = passManager->parent().platformContext();
489 const RenderTarget* rt = context.gfx().renderTargetPool().getRenderTarget( params._target );
490
491 GFX::ComputeMipMapsCommand computeMipMapsCommand = {};
492 computeMipMapsCommand._texture = rt->getAttachment( RTAttachmentType::COLOUR )->texture();
493 computeMipMapsCommand._usage = ImageUsage::SHADER_READ;
494 GFX::EnqueueCommand( bufferInOut, computeMipMapsCommand );
495 }
496
497 void WaterPlane::updatePlaneEquation( const SceneGraphNode* sgn, Plane<F32>& plane, const bool reflection, const F32 offset ) const
498 {
499 const F32 waterLevel = sgn->get<TransformComponent>()->getWorldPosition().y * (reflection ? -1.f : 1.f);
500 const Quaternion<F32>& orientation = sgn->get<TransformComponent>()->getWorldOrientation();
501
502 plane.set( Normalized( vec3<F32>( orientation * (reflection ? WORLD_Y_AXIS : WORLD_Y_NEG_AXIS) ) ), offset + waterLevel );
503 }
504
505 const vec3<U16>& WaterPlane::getDimensions() const noexcept
506 {
507 return _dimensions;
508 }
509
510 void WaterPlane::saveToXML( boost::property_tree::ptree& pt ) const
511 {
512 pt.put( "dimensions.<xmlattr>.width", _dimensions.width );
513 pt.put( "dimensions.<xmlattr>.length", _dimensions.height );
514 pt.put( "dimensions.<xmlattr>.depth", _dimensions.depth );
515
517 }
518
519 void WaterPlane::loadFromXML( const boost::property_tree::ptree& pt )
520 {
521 _dimensions.width = pt.get<U16>( "dimensions.<xmlattr>.width", _dimensions.width );
522 _dimensions.height = pt.get<U16>( "dimensions.<xmlattr>.length", _dimensions.height );
523 _dimensions.depth = pt.get<U16>( "dimensions.<xmlattr>.depth", _dimensions.depth );
524
526 }
527
528} //namespace Divide
#define WAIT_FOR_CONDITION(...)
#define MOV(...)
#define DIVIDE_ASSERT(...)
static Camera * CreateCamera(const Str< 256 > &cameraName, Mode cameraMode)
Definition: Camera.cpp:147
static bool DestroyCamera(Camera *&camera)
Definition: Camera.cpp:175
static constexpr F32 MAX_SHININESS
Definition: Material.h:129
bool unload() override
Definition: SceneNode.cpp:108
virtual void saveToXML(boost::property_tree::ptree &pt) const
Definition: SceneNode.cpp:156
virtual void sceneUpdate(U64 deltaTimeUS, SceneGraphNode *sgn, SceneState &sceneState)
Called from SceneGraph "sceneUpdate".
Definition: SceneNode.cpp:44
virtual void prepareRender(SceneGraphNode *sgn, RenderingComponent &rComp, RenderPackage &pkg, GFX::MemoryBarrierCommand &postDrawMemCmd, RenderStagePass renderStagePass, const CameraSnapshot &cameraSnapshot, bool refreshData)
Definition: SceneNode.cpp:50
bool load(PlatformContext &context) override
Loading and unloading interface.
Definition: SceneNode.cpp:98
virtual void buildDrawCommands(SceneGraphNode *sgn, GenericDrawCommandContainer &cmdsOut)
Definition: SceneNode.cpp:115
bool postLoad() override
Definition: SceneNode.cpp:103
virtual void loadFromXML(const boost::property_tree::ptree &pt)
Definition: SceneNode.cpp:164
FORCE_INLINE T * EnqueueCommand(CommandBuffer &buffer)
constexpr F32 g_reflectionPlaneCorrectionHeight
Definition: Water.cpp:31
Handle console commands that start with a forward slash.
Definition: AIProcessor.cpp:7
vec2< T > Normalized(vec2< T > vector) noexcept
Definition: MathVectors.inl:98
constexpr SceneNodeType GetSceneNodeType()
Definition: SceneNodeFwd.h:111
static constexpr bool IsDepthPass(const RenderStagePass stagePass) noexcept
constexpr U32 to_U32(const T value)
FORCE_INLINE void DestroyResource(Handle< T > &handle, const bool immediate=false)
static constexpr U32 RT_DEPTH_ATTACHMENT_IDX
Definition: RTAttachment.h:71
void SetDefaultDrawDescriptor(RenderPassParams &params)
@ RES_LOADING
The resource is loading, creating data, parsing scripts, etc.
static const vec3< F32 > WORLD_Y_NEG_AXIS
Definition: MathVectors.h:1443
void toggleOption(GenericDrawCommand &cmd, CmdRenderOptions option) noexcept
constexpr F32 to_F32(const T value)
uint16_t U16
FORCE_INLINE Handle< T > CreateResource(const ResourceDescriptor< T > &descriptor, bool &wasInCache, std::atomic_uint &taskCounter)
eastl::fixed_vector< GenericDrawCommand, 1, true > GenericDrawCommandContainer
RTClearEntry DEFAULT_CLEAR_ENTRY
PropertyDescriptor< Texture > TextureDescriptor
PropertyDescriptor< ShaderProgram > ShaderProgramDescriptor
FORCE_INLINE T * Get(const Handle< T > handle)
uint64_t U64
static const vec3< F32 > WORLD_Y_AXIS
Definition: MathVectors.h:1440
constexpr auto to_base(const Type value) -> Type
static RenderTargetID REFLECTION_PLANAR_BLUR
Definition: GFXDevice.h:206
static RenderTargetID OIT_REFLECT
Definition: GFXDevice.h:201
static RenderTargetID HI_Z_REFLECT
Definition: GFXDevice.h:205