#pragma once #include "MG_Util/Types.h" #include #include namespace MobileGL { enum class FramebufferTarget { Draw, Read, FramebufferTargetCount, Unknown = -1 }; enum class FramebufferAttachmentType { Color0, Color1, Color2, Color3, Color4, Color5, Color6, Color7, Color8, Color9, Color10, Color11, Color12, Color13, Color14, Color15, Color16, Color17, Color18, Color19, Color20, Color21, Color22, Color23, Color24, Color25, Color26, Color27, Color28, Color29, Color30, Color31, Depth, Stencil, FramebufferAttachmentTypeCount, Unknown = -1 }; namespace MG_State { namespace GLState { class RenderbufferObjectStub {}; // TODO class FramebufferAttachment { public: // TODO: add Renderbuffer when it is implemented explicit FramebufferAttachment(SharedPtr texture, Int level = 0); explicit FramebufferAttachment(SharedPtr renderbuffer); explicit FramebufferAttachment(Bool IsValid = true); Bool IsTexture() const; Bool IsRenderbuffer() const; Bool IsEmpty(); SharedPtr GetTexture() const; SharedPtr GetRenderbuffer() const; Int GetTextureLevel() const; Bool IsComplete() const; IntVec3 GetSize() const; Bool IsValid() const; private: SharedPtr m_texture = nullptr; SharedPtr m_renderbuffer = nullptr; Int m_textureLevel = 0; Bool m_isValid = true; }; class FramebufferObject { public: using TargetEnum = FramebufferTarget; FramebufferObject(Uint externalIndex); void AttachTexture(FramebufferAttachmentType type, SharedPtr texture, int level = 0); void AttachRenderbuffer(FramebufferAttachmentType type, std::shared_ptr renderbuffer); void Detach(FramebufferAttachmentType type); const FramebufferAttachment& GetAttachment(FramebufferAttachmentType type) const; const Array(FramebufferAttachmentType::FramebufferAttachmentTypeCount)>& GetAllAttachments() const; Bool CheckCompleteness() const; void SetDrawBuffers(const std::vector& buffers); const Vector& GetDrawBuffers() const; Uint GetExternalIndex() const; private: const Uint m_externalIndex = 0; Array(FramebufferAttachmentType::FramebufferAttachmentTypeCount)> m_attachments; Bool m_drawBuffersDirty = true; Vector m_drawBuffers; }; } // namespace GLState } // namespace MG_State } // namespace MobileGL