22#ifndef WINTERMUTE_BASE_RENDER_OPENGL3D_H
23#define WINTERMUTE_BASE_RENDER_OPENGL3D_H
25#include "engines/wintermute/base/gfx/base_renderer3d.h"
26#include "engines/wintermute/dctypes.h"
28#include "graphics/opengl/system_headers.h"
29#include "graphics/transform_struct.h"
31#if defined(USE_OPENGL_SHADERS)
33#include "graphics/opengl/shader.h"
37class BaseSurfaceOpenGL3D;
39class BaseRenderOpenGL3DShader :
public BaseRenderer3D {
40 friend class BaseSurfaceOpenGL3DShader;
41 friend class Mesh3DSOpenGLShader;
42 friend class XMeshOpenGLShader;
43 friend class ShadowVolumeOpenGLShader;
57 struct RectangleVertex {
63 struct SimpleShadowVertex {
76 BaseRenderOpenGL3DShader(BaseGame *inGame =
nullptr);
77 ~BaseRenderOpenGL3DShader()
override;
79 bool invalidateTexture(BaseSurface *texture)
override;
81 bool invalidateDeviceObjects()
override;
82 bool restoreDeviceObjects()
override;
84 bool resetDevice()
override;
86 void setSpriteBlendMode(Graphics::TSpriteBlendMode blendMode,
bool forceChange =
false)
override;
88 void setAmbientLightRenderState()
override;
90 int getMaxActiveLights()
override;
91 void lightEnable(
int index,
bool enable)
override;
92 void setLightParameters(
int index,
const DXVector3 &position,
const DXVector3 &direction,
const DXVector4 &diffuse,
bool spotlight)
override;
94 void enableCulling()
override;
95 void disableCulling()
override;
97 bool enableShadows()
override;
98 bool disableShadows()
override;
99 bool shadowVolumeSupported()
override;
101 BaseImage *takeScreenshot(
int newWidth = 0,
int newHeight = 0)
override;
102 bool fadeToColor(
byte r,
byte g,
byte b,
byte a)
override;
103 bool flip()
override;
104 bool clear()
override;
106 bool setViewport(
int left,
int top,
int right,
int bottom)
override;
107 bool drawLine(
int x1,
int y1,
int x2,
int y2, uint32 color)
override;
108 bool fillRect(
int x,
int y,
int w,
int h, uint32 color)
override;
110 DXMatrix *buildMatrix(DXMatrix* out,
const DXVector2 *centre,
const DXVector2 *scaling,
float angle);
111 void transformVertices(
struct SpriteVertex *vertices,
const DXVector2 *centre,
const DXVector2 *scaling,
float angle);
113 bool setProjection()
override;
115 bool setWorldTransform(
const DXMatrix &transform)
override;
116 bool setViewTransform(
const DXMatrix &transform)
override;
117 bool setProjectionTransform(
const DXMatrix &transform)
override;
119 bool initRenderer(
int width,
int height,
bool windowed)
override;
120 bool setup2D(
bool force =
false)
override;
121 bool setup3D(Camera3D *camera,
bool force =
false)
override;
124 return "OpenGL 3D renderer";
126 bool displayDebugInfo()
override {
127 return STATUS_FAILED;
129 bool drawShaderQuad()
override {
130 return STATUS_FAILED;
133 float getScaleRatioX()
const override {
136 float getScaleRatioY()
const override {
140 BaseSurface *createSurface()
override;
142 bool startSpriteBatch()
override;
143 bool endSpriteBatch()
override;
144 bool commitSpriteBatch()
override;
146 bool drawSpriteEx(BaseSurface *texture,
const Common::Rect32 &rect,
const DXVector2 &pos,
const DXVector2 &rot,
const DXVector2 &scale,
147 float angle, uint32 color,
bool alphaDisable, Graphics::TSpriteBlendMode blendMode,
bool mirrorX,
bool mirrorY)
override;
149 void renderSceneGeometry(
const BaseArray<AdWalkplane *> &planes,
const BaseArray<AdBlock *> &blocks,
150 const BaseArray<AdGeneric *> &generics,
const BaseArray<Light3D *> &lights, Camera3D *camera)
override;
151 void renderShadowGeometry(
const BaseArray<AdWalkplane *> &planes,
const BaseArray<AdBlock *> &blocks,
const BaseArray<AdGeneric *> &generics, Camera3D *camera)
override;
153 Mesh3DS *createMesh3DS()
override;
154 XMesh *createXMesh()
override;
155 ShadowVolume *createShadowVolume()
override;
157 bool setViewport3D(DXViewport *viewport)
override;
159 void postfilter()
override;
160 void setPostfilter(PostFilter postFilter)
override { _postFilterMode = postFilter; };
166 void displaySimpleShadow(BaseObject *
object)
override;
168 SimpleShadowVertex _simpleShadow[4];
170 Graphics::TSpriteBlendMode _blendMode;
172 DXMatrix _glProjectionMatrix;
177 Math::Vector4d _flatShadowColor;
181 GLuint _rectangleVBO{};
182 GLuint _simpleShadowVBO{};
183 GLuint _postfilterVBO{};
184 GLuint _brightnessVBO{};
196 GLuint _postfilterTexture;