Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/application/StarRenderer_opengl20.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/application/StarRenderer_opengl20.hpp')
-rw-r--r--source/application/StarRenderer_opengl20.hpp199
1 files changed, 199 insertions, 0 deletions
diff --git a/source/application/StarRenderer_opengl20.hpp b/source/application/StarRenderer_opengl20.hpp
new file mode 100644
index 0000000..0bdb73a
--- /dev/null
+++ b/source/application/StarRenderer_opengl20.hpp
@@ -0,0 +1,199 @@
+#ifndef STAR_RENDERER_OPENGL_HPP
+#define STAR_RENDERER_OPENGL_HPP
+
+#include "StarTextureAtlas.hpp"
+#include "StarRenderer.hpp"
+
+#include "GL/glew.h"
+
+namespace Star {
+
+STAR_CLASS(OpenGl20Renderer);
+
+// OpenGL 2.0 implementation of Renderer. OpenGL context must be created and
+// active during construction, destruction, and all method calls.
+class OpenGl20Renderer : public Renderer {
+public:
+ OpenGl20Renderer();
+ ~OpenGl20Renderer();
+
+ String rendererId() const override;
+ Vec2U screenSize() const override;
+
+ void setEffectConfig(Json const& effectConfig) override;
+ void setEffectParameter(String const& parameterName, RenderEffectParameter const& parameter) override;
+ void setEffectTexture(String const& textureName, Image const& image) override;
+
+ void setScissorRect(Maybe<RectI> const& scissorRect) override;
+
+ TexturePtr createTexture(Image const& texture, TextureAddressing addressing, TextureFiltering filtering) override;
+ void setSizeLimitEnabled(bool enabled) override;
+ void setMultiTexturingEnabled(bool enabled) override;
+ TextureGroupPtr createTextureGroup(TextureGroupSize size, TextureFiltering filtering) override;
+ RenderBufferPtr createRenderBuffer() override;
+
+ void render(RenderPrimitive primitive) override;
+ void renderBuffer(RenderBufferPtr const& renderBuffer, Mat3F const& transformation) override;
+
+ void flush() override;
+
+ void setScreenSize(Vec2U screenSize);
+
+ void startFrame();
+ void finishFrame();
+
+private:
+ struct GlTextureAtlasSet : public TextureAtlasSet<GLuint> {
+ public:
+ GlTextureAtlasSet(unsigned atlasNumCells);
+
+ GLuint createAtlasTexture(Vec2U const& size, PixelFormat pixelFormat) override;
+ void destroyAtlasTexture(GLuint const& glTexture) override;
+ void copyAtlasPixels(GLuint const& glTexture, Vec2U const& bottomLeft, Image const& image) override;
+
+ TextureFiltering textureFiltering;
+ };
+
+ struct GlTextureGroup : enable_shared_from_this<GlTextureGroup>, public TextureGroup {
+ GlTextureGroup(unsigned atlasNumCells);
+ ~GlTextureGroup();
+
+ TextureFiltering filtering() const override;
+ TexturePtr create(Image const& texture) override;
+
+ GlTextureAtlasSet textureAtlasSet;
+ };
+
+ struct GlTexture : public Texture {
+ virtual GLuint glTextureId() const = 0;
+ virtual Vec2U glTextureSize() const = 0;
+ virtual Vec2U glTextureCoordinateOffset() const = 0;
+ };
+
+ struct GlGroupedTexture : public GlTexture {
+ ~GlGroupedTexture();
+
+ Vec2U size() const override;
+ TextureFiltering filtering() const override;
+ TextureAddressing addressing() const override;
+
+ GLuint glTextureId() const override;
+ Vec2U glTextureSize() const override;
+ Vec2U glTextureCoordinateOffset() const override;
+
+ void incrementBufferUseCount();
+ void decrementBufferUseCount();
+
+ unsigned bufferUseCount = 0;
+ shared_ptr<GlTextureGroup> parentGroup;
+ GlTextureAtlasSet::TextureHandle parentAtlasTexture = nullptr;
+ };
+
+ struct GlLoneTexture : public GlTexture {
+ ~GlLoneTexture();
+
+ Vec2U size() const override;
+ TextureFiltering filtering() const override;
+ TextureAddressing addressing() const override;
+
+ GLuint glTextureId() const override;
+ Vec2U glTextureSize() const override;
+ Vec2U glTextureCoordinateOffset() const override;
+
+ GLuint textureId = 0;
+ Vec2U textureSize;
+ TextureAddressing textureAddressing = TextureAddressing::Clamp;
+ TextureFiltering textureFiltering = TextureFiltering::Nearest;
+ };
+
+ struct GlRenderVertex {
+ Vec2F screenCoordinate;
+ Vec2F textureCoordinate;
+ float textureIndex;
+ Vec4B color;
+ float param1;
+ };
+
+ struct GlRenderBuffer : public RenderBuffer {
+ struct GlVertexBufferTexture {
+ GLuint texture;
+ Vec2U size;
+ };
+
+ struct GlVertexBuffer {
+ List<GlVertexBufferTexture> textures;
+ GLuint vertexBuffer = 0;
+ size_t vertexCount = 0;
+ };
+
+ ~GlRenderBuffer();
+
+ void set(List<RenderPrimitive> primitives) override;
+
+ RefPtr<GlTexture> whiteTexture;
+ ByteArray accumulationBuffer;
+
+ HashSet<TexturePtr> usedTextures;
+ List<GlVertexBuffer> vertexBuffers;
+
+ bool useMultiTexturing;
+ };
+
+ struct EffectParameter {
+ GLint parameterUniform = -1;
+ VariantTypeIndex parameterType;
+ Maybe<RenderEffectParameter> parameterValue;
+ };
+
+ struct EffectTexture {
+ GLint textureUniform = -1;
+ unsigned textureUnit;
+ TextureAddressing textureAddressing = TextureAddressing::Clamp;
+ TextureFiltering textureFiltering = TextureFiltering::Linear;
+ GLint textureSizeUniform = -1;
+ RefPtr<GlLoneTexture> textureValue;
+ };
+
+ static void logGlErrorSummary(String prefix);
+ static void uploadTextureImage(PixelFormat pixelFormat, Vec2U size, uint8_t const* data);
+
+ static RefPtr<GlLoneTexture> createGlTexture(Image const& texture, TextureAddressing addressing, TextureFiltering filtering);
+
+ shared_ptr<GlRenderBuffer> createGlRenderBuffer();
+
+ void flushImmediatePrimitives();
+
+ void renderGlBuffer(GlRenderBuffer const& renderBuffer, Mat3F const& transformation);
+
+ Vec2U m_screenSize;
+
+ GLuint m_program = 0;
+
+ GLint m_positionAttribute = -1;
+ GLint m_texCoordAttribute = -1;
+ GLint m_texIndexAttribute = -1;
+ GLint m_colorAttribute = -1;
+ GLint m_param1Attribute = -1;
+
+ List<GLint> m_textureUniforms = {};
+ List<GLint> m_textureSizeUniforms = {};
+ GLint m_screenSizeUniform = -1;
+ GLint m_vertexTransformUniform = -1;
+
+ RefPtr<GlTexture> m_whiteTexture;
+
+ StringMap<EffectParameter> m_effectParameters;
+ StringMap<EffectTexture> m_effectTextures;
+ Maybe<RectI> m_scissorRect;
+
+ bool m_limitTextureGroupSize;
+ bool m_useMultiTexturing;
+ List<shared_ptr<GlTextureGroup>> m_liveTextureGroups;
+
+ List<RenderPrimitive> m_immediatePrimitives;
+ shared_ptr<GlRenderBuffer> m_immediateRenderBuffer;
+};
+
+}
+
+#endif