Pioneer
VertexBufferGL.h
Go to the documentation of this file.
1 // Copyright © 2008-2023 Pioneer Developers. See AUTHORS.txt for details
2 // Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3 
4 #pragma once
5 
6 #include "graphics/Types.h"
9 
10 #include <memory>
11 
12 namespace Graphics {
13  class RendererOGL;
14 
15  namespace OGL {
16 
18  public:
19  VertexBuffer(const VertexBufferDesc &, size_t stateHash);
20  ~VertexBuffer();
21 
22  virtual void Unmap() override;
23 
24  // copies the contents of the VertexArray into the buffer
25  virtual bool Populate(const VertexArray &) override;
26 
27  // change the buffer data without mapping
28  virtual void BufferData(const size_t, void *) override final;
29 
30  virtual void Bind() override final;
31  virtual void Release() override final;
32 
33  size_t GetVertexFormatHash() const { return m_vertexStateHash; }
34 
35  protected:
36  virtual Uint8 *MapInternal(BufferMapMode) override;
37  Uint8 *m_data;
39  };
40 
42  public:
43  CachedVertexBuffer(const VertexBufferDesc &, size_t stateHash);
44 
45  virtual bool Populate(const VertexArray &) override final;
46  uint32_t GetOffset() { return m_size * m_desc.stride; }
47 
48  bool Flush();
49  void Reset();
50 
51  protected:
53  using VertexBuffer::Map;
54  using VertexBuffer::Unmap;
55 
56  private:
57  uint32_t m_lastFlushed;
58  };
59 
61  public:
63  ~IndexBuffer();
64 
65  virtual Uint32 *Map(BufferMapMode) override final;
66  virtual Uint16 *Map16(BufferMapMode) override final;
67  virtual void Unmap() override final;
68 
69  // change the buffer data without mapping
70  virtual void BufferData(const size_t, void *) override final;
71 
72  virtual void Bind() override final;
73  virtual void Release() override final;
74 
75  private:
76  Uint32 *m_data;
77  Uint16 *m_data16;
78  };
79 
80  // Instance buffer
81  class InstanceBuffer final : public Graphics::InstanceBuffer, public GLBufferBase {
82  public:
83  InstanceBuffer(Uint32 size, BufferUsage);
84  virtual ~InstanceBuffer() override final;
85  virtual matrix4x4f *Map(BufferMapMode) override final;
86  virtual void Unmap() override final;
87 
88  virtual void Bind() override final;
89  virtual void Release() override final;
90 
91  enum InstOffs {
92  INSTOFFS_MAT0 = 6, // these value must match those of a_transform within data/shaders/opengl/attributes.glsl
95  INSTOFFS_MAT3 = 9
96  };
97 
98  protected:
99  friend class MeshObject; // need access to InstOffs enum
100  std::unique_ptr<matrix4x4f[]> m_data;
101  };
102 
103  class MeshObject final : public Graphics::MeshObject {
104  public:
106  ~MeshObject() override;
107 
108  void Bind() override;
109  void Release() override;
110 
111  Graphics::VertexBuffer *GetVertexBuffer() const override { return m_vtxBuffer.Get(); };
112  Graphics::IndexBuffer *GetIndexBuffer() const override { return m_idxBuffer.Get(); };
113 
114  protected:
115  friend class Graphics::RendererOGL;
116 
117  GLuint GetVertexArrayObject() const { return m_vao; }
120  GLuint m_vao = 0;
121  };
122 
123  GLuint BuildVAOFromDesc(const Graphics::VertexBufferDesc desc);
124 
125  } // namespace OGL
126 } // namespace Graphics
Definition: VertexBuffer.h:102
Definition: VertexBuffer.h:127
uint32_t m_size
Definition: BufferCommon.h:32
Definition: VertexBuffer.h:156
Definition: VertexBufferGL.h:41
CachedVertexBuffer(const VertexBufferDesc &, size_t stateHash)
Definition: VertexBufferGL.cpp:329
void Reset()
Definition: VertexBufferGL.cpp:395
bool Flush()
Definition: VertexBufferGL.cpp:380
uint32_t GetOffset()
Definition: VertexBufferGL.h:46
virtual bool Populate(const VertexArray &) override final
Definition: VertexBufferGL.cpp:337
Definition: GLBufferBase.h:12
Definition: VertexBufferGL.h:60
virtual Uint16 * Map16(BufferMapMode) override final
Definition: VertexBufferGL.cpp:456
IndexBuffer(Uint32 size, BufferUsage, IndexBufferSize)
Definition: VertexBufferGL.cpp:408
virtual void Release() override final
Definition: VertexBufferGL.cpp:513
virtual Uint32 * Map(BufferMapMode) override final
Definition: VertexBufferGL.cpp:440
~IndexBuffer()
Definition: VertexBufferGL.cpp:431
virtual void BufferData(const size_t, void *) override final
Definition: VertexBufferGL.cpp:497
virtual void Bind() override final
Definition: VertexBufferGL.cpp:507
virtual void Unmap() override final
Definition: VertexBufferGL.cpp:472
Definition: VertexBufferGL.h:81
virtual void Unmap() override final
Definition: VertexBufferGL.cpp:557
std::unique_ptr< matrix4x4f[]> m_data
Definition: VertexBufferGL.h:100
virtual ~InstanceBuffer() override final
Definition: VertexBufferGL.cpp:536
InstanceBuffer(Uint32 size, BufferUsage)
Definition: VertexBufferGL.cpp:519
InstOffs
Definition: VertexBufferGL.h:91
@ INSTOFFS_MAT2
Definition: VertexBufferGL.h:94
@ INSTOFFS_MAT0
Definition: VertexBufferGL.h:92
@ INSTOFFS_MAT3
Definition: VertexBufferGL.h:95
@ INSTOFFS_MAT1
Definition: VertexBufferGL.h:93
virtual void Release() override final
Definition: VertexBufferGL.cpp:590
virtual matrix4x4f * Map(BufferMapMode) override final
Definition: VertexBufferGL.cpp:541
virtual void Bind() override final
Definition: VertexBufferGL.cpp:577
Definition: VertexBufferGL.h:103
void Release() override
Definition: VertexBufferGL.cpp:627
Graphics::VertexBuffer * GetVertexBuffer() const override
Definition: VertexBufferGL.h:111
GLuint GetVertexArrayObject() const
Definition: VertexBufferGL.h:117
GLuint m_vao
Definition: VertexBufferGL.h:120
MeshObject(Graphics::VertexBuffer *vtx, Graphics::IndexBuffer *idx)
Definition: VertexBufferGL.cpp:601
Graphics::IndexBuffer * GetIndexBuffer() const override
Definition: VertexBufferGL.h:112
~MeshObject() override
Definition: VertexBufferGL.cpp:617
RefCountedPtr< VertexBuffer > m_vtxBuffer
Definition: VertexBufferGL.h:118
RefCountedPtr< IndexBuffer > m_idxBuffer
Definition: VertexBufferGL.h:119
void Bind() override
Definition: VertexBufferGL.cpp:622
Definition: VertexBufferGL.h:17
VertexBuffer(const VertexBufferDesc &, size_t stateHash)
Definition: VertexBufferGL.cpp:77
size_t GetVertexFormatHash() const
Definition: VertexBufferGL.h:33
virtual void Unmap() override
Definition: VertexBufferGL.cpp:125
Uint8 * m_data
Definition: VertexBufferGL.h:37
virtual void Bind() override final
Definition: VertexBufferGL.cpp:317
size_t m_vertexStateHash
Definition: VertexBufferGL.h:38
virtual Uint8 * MapInternal(BufferMapMode) override
Definition: VertexBufferGL.cpp:108
virtual void BufferData(const size_t, void *) override final
Definition: VertexBufferGL.cpp:307
virtual bool Populate(const VertexArray &) override
Definition: VertexBufferGL.cpp:266
virtual void Release() override final
Definition: VertexBufferGL.cpp:323
~VertexBuffer()
Definition: VertexBufferGL.cpp:102
Definition: RendererGL.h:37
Definition: VertexArray.h:19
Definition: VertexBuffer.h:65
T * Map(BufferMapMode mode)
Definition: VertexBuffer.h:74
VertexBufferDesc m_desc
Definition: VertexBuffer.h:98
Definition: RefCounted.h:36
GLuint BuildVAOFromDesc(const Graphics::VertexBufferDesc desc)
Definition: VertexBufferGL.cpp:632
Definition: Background.h:14
IndexBufferSize
Definition: Types.h:76
BufferUsage
Definition: Types.h:65
BufferMapMode
Definition: Types.h:70
Definition: VertexBuffer.h:43
Uint32 stride
Definition: VertexBuffer.h:61