#pragma once #include "Camera.hpp" #include "Material.hpp" #include "RcPtr.hpp" #include "VertexIndex.hpp" #include #include #include // TODO add optional support for OpenGL separate attrib binding & only depend on vertex format // By default, RenderObject sets a default material but not data buffers. class RenderObject { public: glm::mat4 worldMatrix; private: RcPtr mMaterial; RcPtr mIndexBuf; RcPtr mVertexFormat; BufferBindings mVertexBufBinding; GLuint mVao; public: RenderObject(); ~RenderObject(); GLuint GetGLVao() const; void RebuildIfNecessary(); Material* GetMaterial() const { return mMaterial.Get(); } void SetMaterial(Material* material); GpuIndexBuffer* GetIndexBuffer() const { return mIndexBuf.Get(); } const VertexFormat* GetVertexFormat() const { return mVertexFormat.Get(); } const BufferBindings& GetVertexBufferBindings() const { return mVertexBufBinding; } void UpdateIndexBuffer(GpuIndexBuffer* indexBuffer); void UpdateVertexFormat(VertexFormat* vertexFormat); // Assumes the fetched BufferBinding object is modified void UpdateVertexBufferBindings(BufferBindings** bindingsOut); void SetFormat(VertexFormat* vertexFormat, Tags::IndexType indexFormat); private: void DeleteGLObjects(); }; class Renderer { private: Camera* mFrame_Cam; glm::mat4 mFrame_Transform; float mFrame_Time; float mFrame_DeltaTime; bool mInsideFrame = false; public: void BeginFrame(Camera& camera, float currentTime, float deltaTime); void Draw(const RenderObject* objects, size_t count); void EndFrame(); };