33#ifndef DVD_RENDERING_COMPONENT_H_
34#define DVD_RENDERING_COMPONENT_H_
46struct NodeMaterialData;
58class RenderPassExecutor;
59class SceneEnvironmentProbePool;
60class EnvironmentProbeComponent;
70 class RenderingCompRenderPass;
71 class RenderingCompGFXDevice;
72 class RenderingCompRenderBin;
73 class RenderingCompRenderPassExecutor;
74 class RenderingComponentSGN;
107 friend class Attorney::RenderingCompRenderPass;
108 friend class Attorney::RenderingCompGFXDevice;
109 friend class Attorney::RenderingCompRenderBin;
110 friend class Attorney::RenderingCompRenderPassExecutor;
111 friend class Attorney::RenderingComponentSGN;
114 static constexpr
U8 MAX_LOD_LEVEL = 4u;
119 RENDER_SKELETON =
toBit(3),
120 RENDER_SELECTION =
toBit(4),
121 RENDER_AXIS =
toBit(5),
122 CAST_SHADOWS =
toBit(6),
123 RECEIVE_SHADOWS =
toBit(7),
124 IS_VISIBLE =
toBit(8)
138 [[nodiscard]]
bool renderOptionEnabled(
RenderOptions option)
const noexcept;
139 void toggleRenderOption(
RenderOptions option,
bool state,
bool recursive =
true);
141 void setMinRenderRange(
F32 minRange)
noexcept;
142 void setMaxRenderRange(
F32 maxRange)
noexcept;
143 inline void setRenderRange(
const F32 minRange,
const F32 maxRange)
noexcept { setMinRenderRange(minRange); setMaxRenderRange(maxRange); }
147 inline void lockLoD(
const U8 level) { _lodLockLevels.fill({
true, level }); }
151 [[nodiscard]]
U8 getLoDLevel(
RenderStage renderStage)
const noexcept;
153 void setLoDIndexOffset(
U8 lodIndex,
size_t indexOffset,
size_t indexCount)
noexcept;
156 void rebuildMaterial();
168 void drawDebugAxis();
169 void drawSelectionGizmo();
171 void drawBounds(
bool AABB,
bool OBB,
bool Sphere);
187 void toggleBoundsDraw(
bool showAABB,
bool showBS,
bool showOBB,
bool recursive);
188 void onRenderOptionChanged(
RenderOptions option,
bool state);
190 void clearDrawPackages();
191 void updateReflectRefractDescriptors(
bool reflectState,
bool refractState);
193 [[nodiscard]]
bool hasDrawCommands() noexcept;
199 GFX::CommandBuffer& bufferInOut);
204 GFX::MemoryBarrierCommand& postDrawMemCmd,
209 [[nodiscard]]
bool updateReflection(
U16 reflectionIndex,
213 GFX::CommandBuffer& bufferInOut,
214 GFX::MemoryBarrierCommand& memCmdInOut);
216 [[nodiscard]]
bool updateRefraction(
U16 refractionIndex,
220 GFX::CommandBuffer& bufferInOut,
221 GFX::MemoryBarrierCommand& memCmdInOut);
223 void updateNearestProbes(const
vec3<
F32>& position);
226 void OnData(const
ECS::CustomEvent& data) override;
260 std::array<std::pair<size_t, size_t>, MAX_LOD_LEVEL> _lodIndexOffsets{};
268 U16 _reflectionProbeIndex{ 0u };
273 bool _selectionGizmoDirty{
true };
274 bool _drawAABB{
false };
275 bool _drawOBB{
false };
276 bool _drawBS{
false };
277 bool _updateReflection{
false };
278 bool _updateRefraction{
false };
289 const U16 reflectionIndex,
296 return renderable.
updateReflection(reflectionIndex, inBudget, camera, renderState, bufferInOut, memCmdInOut);
302 const U16 refractionIndex,
309 return renderable.
updateRefraction(refractionIndex, inBudget, camera, renderState, bufferInOut, memCmdInOut);
317 const bool refreshData)
319 return renderable.
prepareDrawPackage(cameraSnapshot, sceneRenderState, renderStagePass, postDrawMemCmd, refreshData);
323 return renderable.hasDrawCommands();
341 renderable->
postRender(sceneRenderState, renderStagePass, bufferInOut);
352 return pkg.pipelineCmd()._pipeline->stateHash();
362 renderable->_indirectionBufferEntry = indirectionBufferEntry;
366 return renderable->_indirectionBufferEntry;
#define END_COMPONENT(Name)
#define BEGIN_COMPONENT(Name, Enum)
static void postRender(RenderingComponent *renderable, const SceneRenderState &sceneRenderState, const RenderStagePass renderStagePass, GFX::CommandBuffer &bufferInOut)
static RenderPackage & getDrawPackage(RenderingComponent *renderable, const RenderStagePass renderStagePass)
static size_t getStateHash(RenderingComponent *renderable, const RenderStagePass renderStagePass)
static void getCommandBuffer(RenderingComponent *renderable, RenderPackage *const pkg, GFX::CommandBuffer &bufferInOut)
static void setIndirectionBufferEntry(RenderingComponent *renderable, const U32 indirectionBufferEntry) noexcept
static U32 getIndirectionBufferEntry(RenderingComponent *const renderable) noexcept
static void retrieveDrawCommands(RenderingComponent &renderable, const RenderStagePass stagePass, const U32 cmdOffset, DrawCommandContainer &cmdsInOut)
static bool hasDrawCommands(RenderingComponent &renderable) noexcept
static bool updateRefraction(RenderingComponent &renderable, const U16 refractionIndex, const bool inBudget, Camera *camera, const SceneRenderState &renderState, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
static bool updateReflection(RenderingComponent &renderable, const U16 reflectionIndex, const bool inBudget, Camera *camera, const SceneRenderState &renderState, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
static bool prepareDrawPackage(RenderingComponent &renderable, const CameraSnapshot &cameraSnapshot, const SceneRenderState &sceneRenderState, RenderStagePass renderStagePass, GFX::MemoryBarrierCommand &postDrawMemCmd, const bool refreshData)
static void onParentUsageChanged(const RenderingComponent &comp, const NodeUsageContext context)
Rough around the edges Adapter pattern abstracting the actual rendering API and access to the GPU.
This class contains a list of "RenderBinItem"'s and stores them sorted depending on designation.
This class manages all of the RenderBins and renders them in the correct order.
void setReflectionCallback(const RenderCallback &cbk, const ReflectorType reflectType)
void unlockLoD(const RenderStage stage) noexcept
void setRefractionCallback(const RenderCallback &cbk, const RefractorType refractType)
std::array< PackagesPerVariant, to_base(RenderPassType::COUNT)> PackagesPerPassType
PROPERTY_R(bool, showAxis, false)
IM::LineDescriptor _skeletonLinesDescriptor
PROPERTY_RW(F32, dataFlag, 1.0f)
DrawCommands _drawCommands
std::array< PackagesPerPassIndex, to_base(RenderStagePass::VariantType::COUNT)> PackagesPerVariant
PROPERTY_R_IW(bool, isInstanced, false)
DrawCommands & drawCommands() noexcept
vector< PackageEntry > PackagesPerIndex
SharedMutex _renderPackagesLock
RenderPackage & getDrawPackage(const RenderStagePass &renderStagePass)
bool updateRefraction(U16 refractionIndex, bool inBudget, Camera *camera, const SceneRenderState &renderState, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
vec2< F32 > renderRange() const noexcept
PROPERTY_RW(bool, primitiveRestartRequired, false)
IM::OBBDescriptor _selectionGizmoDescriptor
std::array< PackagesPerIndex, to_base(RenderStagePass::PassIndex::COUNT)> PackagesPerPassIndex
void setRenderRange(const F32 minRange, const F32 maxRange) noexcept
void lockLoD(const U8 level)
void retrieveDrawCommands(const RenderStagePass &stagePass, const U32 cmdOffset, DrawCommandContainer &cmdsInOut)
void getCommandBuffer(RenderPackage *const pkg, GFX::CommandBuffer &bufferInOut)
bool lodLocked(const RenderStage stage) const noexcept
PROPERTY_RW(bool, occlusionCull, true)
PROPERTY_R(bool, receiveShadows, false)
PROPERTY_R(bool, castsShadows, false)
PROPERTY_R_IW(bool, rebuildDrawCommands, false)
bool prepareDrawPackage(const CameraSnapshot &cameraSnapshot, const SceneRenderState &sceneRenderState, const RenderStagePass &renderStagePass, GFX::MemoryBarrierCommand &postDrawMemCmd, bool refreshData)
void lockLoD(const RenderStage stage, U8 level) noexcept
IM::LineDescriptor _axisGizmoLinesDescriptor
void onParentUsageChanged(NodeUsageContext context) const
Handle< Material > getMaterialInstance() const noexcept
bool updateReflection(U16 reflectionIndex, bool inBudget, Camera *camera, const SceneRenderState &renderState, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
void postRender(const SceneRenderState &sceneRenderState, const RenderStagePass &renderStagePass, GFX::CommandBuffer &bufferInOut)
Called after the parent node was rendered.
Handle console commands that start with a forward slash.
NodeUsageContext
Usage context affects lighting, navigation, physics, etc.
DELEGATE_STD< Ret, Args... > DELEGATE
void OnData(const ECS::CustomEvent &data) override
std::shared_mutex SharedMutex
eastl::vector< Type > vector
DELEGATE< void, RenderPassManager *, RenderCbkParams &, GFX::CommandBuffer &, GFX::MemoryBarrierCommand & > RenderCallback
eastl::fixed_vector< GenericDrawCommand, 1, true > GenericDrawCommandContainer
vector< EnvironmentProbeComponent * > EnvironmentProbeList
constexpr T toBit(const T X)
Converts an arbitrary positive integer value to a bitwise value used for masks.
eastl::fixed_vector< IndirectIndexedDrawCommand, Config::MAX_VISIBLE_NODES, false > DrawCommandContainer
constexpr auto to_base(const Type value) -> Type
const RenderTargetID & _renderTarget
const SceneGraphNode * _sgn
const SceneRenderState & _sceneRenderState
GenericDrawCommandContainer _data