NazaraEngine/include/Nazara/Graphics/FramePipelinePass.hpp

102 lines
2.8 KiB
C++

// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
// This file is part of the "Nazara Engine - Graphics module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#pragma once
#ifndef NAZARA_GRAPHICS_FRAMEPIPELINEPASS_HPP
#define NAZARA_GRAPHICS_FRAMEPIPELINEPASS_HPP
#include <NazaraUtils/Prerequisites.hpp>
#include <Nazara/Graphics/Config.hpp>
#include <Nazara/Graphics/Enums.hpp>
#include <Nazara/Math/Frustum.hpp>
#include <Nazara/Math/Rect.hpp>
#include <NazaraUtils/Bitset.hpp>
#include <limits>
#include <span>
namespace Nz
{
class AbstractViewer;
class ElementRendererRegistry;
class FrameGraph;
class FramePass;
class FramePipeline;
class InstancedRenderable;
class MaterialInstance;
class RenderResources;
class SkeletonInstance;
class WorldInstance;
class NAZARA_GRAPHICS_API FramePipelinePass
{
public:
struct FrameData;
struct PassData;
struct PassInputOuputs;
struct VisibleRenderable;
inline FramePipelinePass(FramePipelineNotificationFlags notificationFlags);
FramePipelinePass(const FramePipelinePass&) = delete;
FramePipelinePass(FramePipelinePass&&) = delete;
virtual ~FramePipelinePass();
virtual void InvalidateElements();
virtual void Prepare(FrameData& frameData) = 0;
virtual void RegisterMaterialInstance(const MaterialInstance& materialInstance);
virtual FramePass& RegisterToFrameGraph(FrameGraph& frameGraph, const PassInputOuputs& inputOuputs) = 0;
inline bool ShouldNotify(FramePipelineNotification notification) const;
virtual void UnregisterMaterialInstance(const MaterialInstance& materialInstance);
FramePipelinePass& operator=(const FramePipelinePass&) = delete;
FramePipelinePass& operator=(FramePipelinePass&&) = delete;
struct FrameData
{
const Bitset<UInt64>* visibleLights;
const Frustumf& frustum;
RenderResources& renderResources;
const std::vector<VisibleRenderable>& visibleRenderables;
std::size_t visibilityHash;
};
struct PassData
{
AbstractViewer* viewer;
ElementRendererRegistry& elementRegistry;
FramePipeline& pipeline;
};
struct PassInputOuputs
{
std::span<const std::size_t> inputAttachments;
std::span<const std::size_t> outputAttachments;
std::size_t depthStencilInput = InvalidAttachmentIndex;
std::size_t depthStencilOutput = InvalidAttachmentIndex;
};
struct VisibleRenderable
{
const InstancedRenderable* instancedRenderable;
const SkeletonInstance* skeletonInstance;
const WorldInstance* worldInstance;
Recti scissorBox;
};
static constexpr std::size_t InvalidAttachmentIndex = std::numeric_limits<std::size_t>::max();
private:
FramePipelineNotificationFlags m_notificationFlags;
};
}
#include <Nazara/Graphics/FramePipelinePass.inl>
#endif // NAZARA_GRAPHICS_FRAMEPIPELINEPASS_HPP