Pioneer
RendererGL.h
Go to the documentation of this file.
1 // Copyright © 2008-2021 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 #ifndef _RENDERER_OGL_H
7 #define _RENDERER_OGL_H
8 /*
9  * OpenGL 2.X renderer (2.0, GLSL 1.10 at the moment)
10  * - no fixed function support (shaders for everything)
11  * The plan is: make this more like GL3/ES2
12  * - try to stick to bufferobjects
13  * - use glvertexattribpointer instead of glvertexpointer etc
14  * - get rid of built-in glMaterial, glMatrix use
15  */
16 #include "OpenGLLibs.h"
17 #include "graphics/Renderer.h"
18 #include <stack>
19 #include <unordered_map>
20 
21 namespace Graphics {
22 
23  class Texture;
24  struct Settings;
25 
26  namespace OGL {
27  class GasGiantSurfaceMaterial;
28  class GeoSphereSkyMaterial;
29  class GeoSphereStarMaterial;
30  class GeoSphereSurfaceMaterial;
31  class GenGasGiantColourMaterial;
32  class Material;
33  class MultiMaterial;
34  class LitMultiMaterial;
35  class Program;
36  class RenderState;
37  class RenderTarget;
38  class RingMaterial;
39  class FresnelColourMaterial;
40  class ShieldMaterial;
41  class UIMaterial;
42  class BillboardMaterial;
43  } // namespace OGL
44 
45  class RendererOGL final : public Renderer {
46  public:
47  static void RegisterRenderer();
48 
49  RendererOGL(SDL_Window *window, const Graphics::Settings &vs, SDL_GLContext &glContext);
50  virtual ~RendererOGL() override final;
51 
52  virtual const char *GetName() const override final { return "OpenGL 3.1, with extensions, renderer"; }
53  virtual RendererType GetRendererType() const override final { return RENDERER_OPENGL_3x; }
54 
55  virtual void WriteRendererInfo(std::ostream &out) const override final;
56 
57  virtual void CheckRenderErrors(const char *func = nullptr, const int line = -1) const override final { CheckErrors(func, line); }
58  static void CheckErrors(const char *func = nullptr, const int line = -1);
59 
60  virtual bool SupportsInstancing() override final { return true; }
61 
62  virtual int GetMaximumNumberAASamples() const override final;
63  virtual bool GetNearFarRange(float &near_, float &far_) const override final;
64 
65  virtual bool BeginFrame() override final;
66  virtual bool EndFrame() override final;
67  virtual bool SwapBuffers() override final;
68 
69  virtual bool SetRenderState(RenderState *) override final;
70  virtual bool SetRenderTarget(RenderTarget *) override final;
71 
72  virtual bool SetDepthRange(double znear, double zfar) override final;
73  virtual bool ResetDepthRange() override final;
74 
75  virtual bool ClearScreen() override final;
76  virtual bool ClearDepthBuffer() override final;
77  virtual bool SetClearColor(const Color &c) override final;
78 
79  virtual bool SetViewport(Viewport v) override final;
80  virtual Viewport GetViewport() const override final;
81 
82  virtual bool SetTransform(const matrix4x4f &m) override final;
83  virtual matrix4x4f GetTransform() const override final;
84 
85  virtual bool SetPerspectiveProjection(float fov, float aspect, float near_, float far_) override final;
86  virtual bool SetOrthographicProjection(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax) override final;
87  virtual bool SetProjection(const matrix4x4f &m) override final;
88  virtual matrix4x4f GetProjection() const override final;
89 
90  virtual bool SetWireFrameMode(bool enabled) override final;
91 
92  virtual bool SetLights(Uint32 numlights, const Light *l) override final;
93  virtual Uint32 GetNumLights() const override final { return m_numLights; }
94  virtual bool SetAmbientColor(const Color &c) override final;
95 
96  virtual bool SetScissor(bool enabled, const vector2f &pos = vector2f(0.0f), const vector2f &size = vector2f(0.0f)) override final;
97 
98  virtual bool DrawTriangles(const VertexArray *vertices, RenderState *state, Material *material, PrimitiveType type = TRIANGLES) override final;
99  virtual bool DrawPointSprites(const Uint32 count, const vector3f *positions, RenderState *rs, Material *material, float size) override final;
100  virtual bool DrawPointSprites(const Uint32 count, const vector3f *positions, const vector2f *offsets, const float *sizes, RenderState *rs, Material *material) override final;
101  virtual bool DrawBuffer(VertexBuffer *, RenderState *, Material *, PrimitiveType) override final;
102  virtual bool DrawBufferIndexed(VertexBuffer *, IndexBuffer *, RenderState *, Material *, PrimitiveType) override final;
103  virtual bool DrawBufferInstanced(VertexBuffer *, RenderState *, Material *, InstanceBuffer *, PrimitiveType type = TRIANGLES) override final;
105 
106  virtual Material *CreateMaterial(const MaterialDescriptor &descriptor) override final;
107  virtual Texture *CreateTexture(const TextureDescriptor &descriptor) override final;
108  virtual RenderState *CreateRenderState(const RenderStateDesc &) override final;
109  virtual RenderTarget *CreateRenderTarget(const RenderTargetDesc &) override final;
110  virtual VertexBuffer *CreateVertexBuffer(const VertexBufferDesc &) override final;
111  virtual IndexBuffer *CreateIndexBuffer(Uint32 size, BufferUsage) override final;
112  virtual InstanceBuffer *CreateInstanceBuffer(Uint32 size, BufferUsage) override final;
113 
114  virtual bool ReloadShaders() override final;
115 
116  virtual bool Screendump(ScreendumpState &sd) override final;
117  virtual bool FrameGrab(ScreendumpState &sd) override final;
118 
119  protected:
120  virtual void PushState() override final;
121  virtual void PopState() override final;
122 
123  Uint32 m_numLights;
125  std::vector<GLuint> m_vertexAttribsSet;
126  float m_minZNear;
127  float m_maxZFar;
130 
132 
135 
137  friend class OGL::Material;
143  friend class OGL::MultiMaterial;
144  friend class OGL::LitMultiMaterial;
145  friend class OGL::RingMaterial;
147  friend class OGL::ShieldMaterial;
149  std::vector<std::pair<MaterialDescriptor, OGL::Program *>> m_programs;
150  std::unordered_map<Uint32, OGL::RenderState *> m_renderStates;
156 
160 
161  private:
162  static bool initted;
163 
164  typedef std::map<std::pair<AttributeSet, size_t>, RefCountedPtr<VertexBuffer>> AttribBufferMap;
165  typedef AttribBufferMap::iterator AttribBufferIter;
166  static AttribBufferMap s_AttribBufferMap;
167 
168  SDL_GLContext m_glContext;
169  };
170 #define CHECKERRORS() RendererOGL::CheckErrors(__FUNCTION__, __LINE__)
171 
172 } // namespace Graphics
173 
174 #endif
Definition: VertexBuffer.h:114
Definition: VertexBuffer.h:136
Definition: Light.h:14
Definition: Material.h:57
Definition: Material.h:81
Definition: BillboardMaterial.h:27
Definition: FresnelColourMaterial.h:22
Definition: GasGiantMaterial.h:38
Definition: GenGasGiantColourMaterial.h:54
Definition: GeoSphereMaterial.h:58
Definition: GeoSphereMaterial.h:65
Definition: GeoSphereMaterial.h:41
Definition: MultiMaterial.h:33
Definition: MaterialGL.h:26
Definition: MultiMaterial.h:22
Definition: Program.h:23
Definition: RenderTargetGL.h:20
Definition: RingMaterial.h:16
Definition: ShieldMaterial.h:32
Definition: RenderState.h:25
Definition: RenderTarget.h:38
Definition: RendererGL.h:45
RenderState * m_activeRenderState
Definition: RendererGL.h:155
virtual bool SetAmbientColor(const Color &c) override final
Definition: RendererGL.cpp:739
virtual bool BeginFrame() override final
Definition: RendererGL.cpp:449
OGL::RenderTarget * m_windowRenderTarget
Definition: RendererGL.h:154
virtual bool SetWireFrameMode(bool enabled) override final
Definition: RendererGL.cpp:706
virtual bool SetViewport(Viewport v) override final
Definition: RendererGL.cpp:652
virtual bool SetDepthRange(double znear, double zfar) override final
Definition: RendererGL.cpp:607
virtual bool DrawBufferInstanced(VertexBuffer *, RenderState *, Material *, InstanceBuffer *, PrimitiveType type=TRIANGLES) override final
Definition: RendererGL.cpp:972
virtual RenderTarget * CreateRenderTarget(const RenderTargetDesc &) override final
Definition: RendererGL.cpp:1162
virtual bool DrawBuffer(VertexBuffer *, RenderState *, Material *, PrimitiveType) override final
Definition: RendererGL.cpp:934
virtual bool ReloadShaders() override final
Definition: RendererGL.cpp:1091
virtual Material * CreateMaterial(const MaterialDescriptor &descriptor) override final
Definition: RendererGL.cpp:1014
virtual ~RendererOGL() override final
Definition: RendererGL.cpp:265
virtual int GetMaximumNumberAASamples() const override final
Definition: RendererGL.cpp:435
virtual bool SupportsInstancing() override final
Definition: RendererGL.h:60
bool m_useNVDepthRanged
Definition: RendererGL.h:151
virtual matrix4x4f GetTransform() const override final
Definition: RendererGL.cpp:670
virtual bool EndFrame() override final
Definition: RendererGL.cpp:457
virtual bool DrawPointSprites(const Uint32 count, const vector3f *positions, RenderState *rs, Material *material, float size) override final
Definition: RendererGL.cpp:826
virtual bool SetScissor(bool enabled, const vector2f &pos=vector2f(0.0f), const vector2f &size=vector2f(0.0f)) override final
Definition: RendererGL.cpp:745
static void RegisterRenderer()
Definition: RendererGL.cpp:127
virtual bool SetLights(Uint32 numlights, const Light *l) override final
Definition: RendererGL.cpp:712
RendererOGL(SDL_Window *window, const Graphics::Settings &vs, SDL_GLContext &glContext)
Definition: RendererGL.cpp:140
Viewport m_viewport
Definition: RendererGL.h:159
virtual InstanceBuffer * CreateInstanceBuffer(Uint32 size, BufferUsage) override final
Definition: RendererGL.cpp:1224
bool m_useAnisotropicFiltering
Definition: RendererGL.h:129
virtual bool Screendump(ScreendumpState &sd) override final
Definition: RendererGL.cpp:1243
virtual Viewport GetViewport() const override final
Definition: RendererGL.cpp:659
Uint32 m_numLights
Definition: RendererGL.h:123
virtual bool SetProjection(const matrix4x4f &m) override final
Definition: RendererGL.cpp:695
virtual void PushState() override final
Definition: RendererGL.cpp:1233
virtual const char * GetName() const override final
Definition: RendererGL.h:52
Uint32 m_numDirLights
Definition: RendererGL.h:124
std::vector< GLuint > m_vertexAttribsSet
Definition: RendererGL.h:125
virtual bool SetPerspectiveProjection(float fov, float aspect, float near_, float far_) override final
Definition: RendererGL.cpp:675
matrix4x4f m_projectionMat
Definition: RendererGL.h:158
virtual VertexBuffer * CreateVertexBuffer(const VertexBufferDesc &) override final
Definition: RendererGL.cpp:1212
virtual bool DrawBufferIndexedInstanced(VertexBuffer *, IndexBuffer *, RenderState *, Material *, InstanceBuffer *, PrimitiveType=TRIANGLES) override final
Definition: RendererGL.cpp:992
virtual bool ClearDepthBuffer() override final
Definition: RendererGL.cpp:635
virtual bool SwapBuffers() override final
Definition: RendererGL.cpp:555
virtual bool SetClearColor(const Color &c) override final
Definition: RendererGL.cpp:646
bool m_useCompressedTextures
Definition: RendererGL.h:128
virtual bool SetOrthographicProjection(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax) override final
Definition: RendererGL.cpp:687
virtual bool DrawTriangles(const VertexArray *vertices, RenderState *state, Material *material, PrimitiveType type=TRIANGLES) override final
Definition: RendererGL.cpp:762
virtual void PopState() override final
Definition: RendererGL.cpp:1238
virtual bool ClearScreen() override final
Definition: RendererGL.cpp:624
float m_minZNear
Definition: RendererGL.h:126
virtual bool FrameGrab(ScreendumpState &sd) override final
Definition: RendererGL.cpp:1265
matrix4x4f m_modelViewMat
Definition: RendererGL.h:157
virtual RenderState * CreateRenderState(const RenderStateDesc &) override final
Definition: RendererGL.cpp:1147
virtual bool SetRenderState(RenderState *) override final
Definition: RendererGL.cpp:574
static void CheckErrors(const char *func=nullptr, const int line=-1)
Definition: RendererGL.cpp:516
virtual void WriteRendererInfo(std::ostream &out) const override final
Definition: RendererGL.cpp:349
virtual Texture * CreateTexture(const TextureDescriptor &descriptor) override final
Definition: RendererGL.cpp:1126
virtual bool SetTransform(const matrix4x4f &m) override final
Definition: RendererGL.cpp:664
OGL::RenderTarget * m_activeRenderTarget
Definition: RendererGL.h:153
virtual bool DrawBufferIndexed(VertexBuffer *, IndexBuffer *, RenderState *, Material *, PrimitiveType) override final
Definition: RendererGL.cpp:952
virtual void CheckRenderErrors(const char *func=nullptr, const int line=-1) const override final
Definition: RendererGL.h:57
float m_maxZFar
Definition: RendererGL.h:127
OGL::Program * GetOrCreateProgram(OGL::Material *)
Definition: RendererGL.cpp:1102
virtual RendererType GetRendererType() const override final
Definition: RendererGL.h:53
virtual bool SetRenderTarget(RenderTarget *) override final
Definition: RendererGL.cpp:584
matrix4x4f & GetCurrentTransform()
Definition: RendererGL.h:133
matrix4x4f m_currentTransform
Definition: RendererGL.h:134
void SetMaterialShaderTransforms(Material *)
Definition: RendererGL.cpp:756
float m_invLogZfarPlus1
Definition: RendererGL.h:152
virtual matrix4x4f GetProjection() const override final
Definition: RendererGL.cpp:701
std::vector< std::pair< MaterialDescriptor, OGL::Program * > > m_programs
Definition: RendererGL.h:149
virtual IndexBuffer * CreateIndexBuffer(Uint32 size, BufferUsage) override final
Definition: RendererGL.cpp:1218
virtual Uint32 GetNumLights() const override final
Definition: RendererGL.h:93
std::unordered_map< Uint32, OGL::RenderState * > m_renderStates
Definition: RendererGL.h:150
virtual bool GetNearFarRange(float &near_, float &far_) const override final
Definition: RendererGL.cpp:442
virtual bool ResetDepthRange() override final
Definition: RendererGL.cpp:614
Definition: Renderer.h:39
Definition: Texture.h:54
Definition: Texture.h:106
Definition: VertexArray.h:19
Definition: VertexBuffer.h:80
Definition: RefCounted.h:36
Definition: Background.h:13
RendererType
Definition: Graphics.h:17
@ RENDERER_OPENGL_3x
Definition: Graphics.h:19
PrimitiveType
Definition: Types.h:46
@ TRIANGLES
Definition: Types.h:51
BufferUsage
Definition: Types.h:34
Definition: Color.h:66
Definition: RenderState.h:10
Definition: RenderTarget.h:20
Definition: Graphics.h:95
Definition: Graphics.h:26
Definition: VertexBuffer.h:41
Definition: Graphics.h:58
vector2< float > vector2f
Definition: vector2.h:126