#pragma once #include #include #include #include namespace XCEngine { namespace Rendering { enum class RendererListType : Core::uint32 { AllVisible = 0, Opaque = 1, Transparent = 2, ShadowCaster = 3, ObjectId = 4 }; enum class RendererSortMode : Core::uint32 { None = 0, FrontToBack = 1, BackToFront = 2 }; struct FilteringSettings { Core::int32 renderQueueMin = std::numeric_limits::lowest(); Core::int32 renderQueueMax = std::numeric_limits::max(); Core::uint32 renderLayerMask = std::numeric_limits::max(); bool requireShadowCasting = false; bool requireRenderObjectId = false; bool operator==(const FilteringSettings& other) const { return renderQueueMin == other.renderQueueMin && renderQueueMax == other.renderQueueMax && renderLayerMask == other.renderLayerMask && requireShadowCasting == other.requireShadowCasting && requireRenderObjectId == other.requireRenderObjectId; } }; struct SortingSettings { RendererSortMode sortMode = RendererSortMode::None; bool operator==(const SortingSettings& other) const { return sortMode == other.sortMode; } }; struct RendererListDesc { RendererListType type = RendererListType::AllVisible; FilteringSettings filtering = {}; SortingSettings sorting = {}; bool operator==(const RendererListDesc& other) const { return type == other.type && filtering == other.filtering && sorting == other.sorting; } }; struct RendererList { RendererListDesc desc = {}; std::vector visibleRenderItemIndices; bool Empty() const { return visibleRenderItemIndices.empty(); } size_t Size() const { return visibleRenderItemIndices.size(); } }; struct CullingResults { std::vector rendererLists; void Clear() { rendererLists.clear(); } RendererList* FindRendererList(RendererListType type) { for (RendererList& rendererList : rendererLists) { if (rendererList.desc.type == type) { return &rendererList; } } return nullptr; } const RendererList* FindRendererList(RendererListType type) const { for (const RendererList& rendererList : rendererLists) { if (rendererList.desc.type == type) { return &rendererList; } } return nullptr; } }; } // namespace Rendering } // namespace XCEngine