#pragma once #include "RE/B/BSTArray.h" #include "RE/B/BSTSmallIndexScatterTable.h" #include "RE/P/PersistentPassList.h" namespace RE { class BSRenderPass; class BSBatchRenderer { public: static constexpr auto RTTI{ RTTI::BSBatchRenderer }; static constexpr auto VTABLE{ VTABLE::BSBatchRenderer }; enum class GEOMETRY_GROUP_ENUM : std::uint32_t { kNone = static_cast>(-1), kLODLand = 0x0, kLODObjects = 0x1, kMultiIndexDecal = 0x2, kOpaqueDecal = 0x3, kBlendedDecal = 0x4, kRefrActive = 0x5, k1stPersonNonRefractive = 0x6, kFading = 0x7, kNoShadow = 0x8, kLowAniso = 0x9, kUnderwaterFog = 0xA, kSSLR = 0xB, kZOnly = 0xC, kPostZOnly = 0xD, kSkyClouds = 0xE, kSmoothAlphaTest = 0xF, kVATSMaskDepthOnly = 0x10, kVATSMask = 0x11, kSunGlare = 0x12, kBloodSpatter = 0x13, kZPrepass = 0x14, kWaterStencil = 0x15, kWaterDepth = 0x16, kTotal = 0x17 }; class CommandBufferPassesMapAccess; class RenderPassMapAccess; class CommandBufferPassesData { public: // members std::byte* buffer[1u << 13]; // 00000 std::byte** currentBuffer; // 10000 CommandBufferPassesData* next; // 10008 std::uint32_t frame; // 10010 std::uint32_t ownerIndex; // 10014 }; static_assert(sizeof(CommandBufferPassesData) == 0x10018); class CommandBufferPassesDataEntry { public: // members CommandBufferPassesData* data; // 00 std::uint64_t groupAndPass; // 08 }; static_assert(sizeof(CommandBufferPassesDataEntry) == 0x10); class GeometryGroup { public: // members BSBatchRenderer* batchRenderer; // 00 PersistentPassList passList; // 08 float depth; // 18 std::uint32_t count; // 1C std::uint8_t flags; // 20 std::int8_t group; // 21 }; static_assert(sizeof(GeometryGroup) == 0x28); class PassGroup { public: // members BSRenderPass* passHead; // 00 std::uint32_t passEnum; // 08 std::uint16_t nextPassGroup; // 0C std::uint16_t commandBufferPasses; // 0E }; static_assert(sizeof(PassGroup) == 0x10); virtual ~BSBatchRenderer(); // 00 BSTArray renderPasses[13]; // 008 BSTSmallIndexScatterTable, RenderPassMapAccess> renderPassMap[13]; // 140 std::uint32_t activePassIndexLists[13][2]; // 2E0 std::uint32_t currentFirstPass; // 348 std::uint32_t currentLastPass; // 34C bool autoClearPasses; // 350 GeometryGroup* geometryGroups[std::to_underlying(GEOMETRY_GROUP_ENUM::kTotal)]; // 358 GeometryGroup* alphaGroup; // 410 std::uint32_t groupingAlphasGroupCount; // 418 GeometryGroup* groupingAlphasGroup; // 420 BSTArray commandBufferPasses; // 428 BSTSmallIndexScatterTable, CommandBufferPassesMapAccess> commandBufferPassMap; // 440 CommandBufferPassesData* bufferPassesCurr; // 460 CommandBufferPassesData* bufferPassesHead; // 468 CommandBufferPassesData** bufferPassesTail; // 470 std::uint32_t bufferPassesCurrAllocFrame; // 478 }; static_assert(sizeof(BSBatchRenderer) == 0x480); }