get the fillrect shader working

This commit is contained in:
Ted John 2016-06-08 21:24:39 +01:00
parent e7e92f02c1
commit c48031581b
8 changed files with 91 additions and 43 deletions

View File

@ -5,7 +5,7 @@ uniform ivec4 uClip;
uniform int uFlags;
uniform vec4 uColour;
in ivec2 fPosition;
flat in ivec2 fPosition;
layout (location = 0) out vec4 oColour;
@ -16,6 +16,6 @@ void main()
{
discard;
}
oColour = uColour;
}

View File

@ -4,17 +4,17 @@ uniform ivec2 uScreenSize;
in ivec2 vPosition;
out ivec2 fPosition;
flat out ivec2 fPosition;
void main()
{
fPosition = vPosition;
// Transform screen coordinates to viewport
vec2 pos = vPosition;
vec2 pos = vec2(vPosition);
pos.x = (pos.x * (2.0 / uScreenSize.x)) - 1.0;
pos.y = (pos.y * (2.0 / uScreenSize.y)) - 1.0;
pos.y *= -1;
gl_Position = vec4(pos, 0, 1);
gl_Position = vec4(pos, 0.0, 1.0);
}

View File

@ -26,8 +26,10 @@ FillRectShader::FillRectShader() : OpenGLShaderProgram("fillrect")
glGenVertexArrays(1, &_vao);
Use();
glVertexAttribPointer(vPosition, 2, GL_INT, GL_FALSE, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, _vbo);
glBindVertexArray(_vao);
glEnableVertexAttribArray(vPosition);
glVertexAttribIPointer(vPosition, 2, GL_INT, 0, 0);
}
FillRectShader::~FillRectShader()

View File

@ -62,6 +62,7 @@ static const char * TryLoadAllProcAddresses()
SetupOpenGLFunction(glEnable);
SetupOpenGLFunction(glEnd);
SetupOpenGLFunction(glGenTextures);
SetupOpenGLFunction(glGetError);
SetupOpenGLFunction(glLoadIdentity);
SetupOpenGLFunction(glMatrixMode);
SetupOpenGLFunction(glOrtho);
@ -76,6 +77,7 @@ static const char * TryLoadAllProcAddresses()
// 2.0+ functions
SetupOpenGLFunction(glAttachShader);
SetupOpenGLFunction(glBindBuffer);
SetupOpenGLFunction(glBindFragDataLocation);
SetupOpenGLFunction(glBindVertexArray);
SetupOpenGLFunction(glBufferData);
SetupOpenGLFunction(glCompileShader);
@ -89,6 +91,8 @@ static const char * TryLoadAllProcAddresses()
SetupOpenGLFunction(glEnableVertexAttribArray);
SetupOpenGLFunction(glGetAttribLocation);
SetupOpenGLFunction(glGenBuffers);
SetupOpenGLFunction(glGetProgramInfoLog);
SetupOpenGLFunction(glGetProgramiv);
SetupOpenGLFunction(glGetShaderInfoLog);
SetupOpenGLFunction(glGetShaderiv);
SetupOpenGLFunction(glGetUniformLocation);
@ -100,7 +104,7 @@ static const char * TryLoadAllProcAddresses()
SetupOpenGLFunction(glUniform4f);
SetupOpenGLFunction(glUniform4i);
SetupOpenGLFunction(glUseProgram);
SetupOpenGLFunction(glVertexAttribPointer);
SetupOpenGLFunction(glVertexAttribIPointer);
return nullptr;
}

View File

@ -32,6 +32,7 @@
#define glEnable __static__glEnable
#define glEnd __static__glEnd
#define glGenTextures __static__glGenTextures
#define glGetError __static__glGetError
#define glLoadIdentity __static__glLoadIdentity
#define glMatrixMode __static__glMatrixMode
#define glOrtho __static__glOrtho
@ -63,6 +64,7 @@
#undef glEnable
#undef glEnd
#undef glGenTextures
#undef glGetError
#undef glLoadIdentity
#undef glMatrixMode
#undef glOrtho
@ -75,29 +77,30 @@
#undef glViewport
// 1.1 function signatures
typedef void (APIENTRYP PFNGLBEGINPROC )(GLenum mode);
typedef void (APIENTRYP PFNGLBINDTEXTUREPROC )(GLenum target, GLuint texture);
typedef void (APIENTRYP PFNGLBLENDFUNCPROC )(GLenum sfactor, GLenum dfactor);
typedef void (APIENTRYP PFNGLCLEARPROC )(GLbitfield mask);
typedef void (APIENTRYP PFNGLCLEARCOLORPROC )(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
typedef void (APIENTRYP PFNGLCOLOR3FPROC )(GLfloat red, GLfloat green, GLfloat blue);
typedef void (APIENTRYP PFNGLCOLOR4FPROC )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
typedef void (APIENTRYP PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint *textures);
typedef void (APIENTRYP PFNGLDISABLEPROC )(GLenum cap);
typedef void (APIENTRYP PFNGLDRAWARRAYSPROC )(GLenum mode, GLint first, GLsizei count);
typedef void (APIENTRYP PFNGLENABLEPROC )(GLenum cap);
typedef void (APIENTRYP PFNGLENDPROC )(void);
typedef void (APIENTRYP PFNGLGENTEXTURESPROC )(GLsizei n, GLuint *textures);
typedef void (APIENTRYP PFNGLLOADIDENTITYPROC )(void);
typedef void (APIENTRYP PFNGLMATRIXMODEPROC )(GLenum mode);
typedef void (APIENTRYP PFNGLORTHOPROC )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val);
typedef void (APIENTRYP PFNGLSCALEFPROC )(GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRYP PFNGLTEXCOORD2FPROC )(GLfloat s, GLfloat t);
typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC )(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC )(GLenum target, GLenum pname, GLint param);
typedef void (APIENTRYP PFNGLTRANSLATEFPROC )(GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRYP PFNGLVERTEX2IPROC )(GLint x, GLint y);
typedef void (APIENTRYP PFNGLVIEWPORTPROC )(GLint x, GLint y, GLsizei width, GLsizei height);
typedef void (APIENTRYP PFNGLBEGINPROC )(GLenum mode);
typedef void (APIENTRYP PFNGLBINDTEXTUREPROC )(GLenum target, GLuint texture);
typedef void (APIENTRYP PFNGLBLENDFUNCPROC )(GLenum sfactor, GLenum dfactor);
typedef void (APIENTRYP PFNGLCLEARPROC )(GLbitfield mask);
typedef void (APIENTRYP PFNGLCLEARCOLORPROC )(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
typedef void (APIENTRYP PFNGLCOLOR3FPROC )(GLfloat red, GLfloat green, GLfloat blue);
typedef void (APIENTRYP PFNGLCOLOR4FPROC )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
typedef void (APIENTRYP PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint *textures);
typedef void (APIENTRYP PFNGLDISABLEPROC )(GLenum cap);
typedef void (APIENTRYP PFNGLDRAWARRAYSPROC )(GLenum mode, GLint first, GLsizei count);
typedef void (APIENTRYP PFNGLENABLEPROC )(GLenum cap);
typedef void (APIENTRYP PFNGLENDPROC )(void);
typedef GLenum (APIENTRYP PFNGLGETERRORPROC )(void);
typedef void (APIENTRYP PFNGLGENTEXTURESPROC )(GLsizei n, GLuint *textures);
typedef void (APIENTRYP PFNGLLOADIDENTITYPROC )(void);
typedef void (APIENTRYP PFNGLMATRIXMODEPROC )(GLenum mode);
typedef void (APIENTRYP PFNGLORTHOPROC )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val);
typedef void (APIENTRYP PFNGLSCALEFPROC )(GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRYP PFNGLTEXCOORD2FPROC )(GLfloat s, GLfloat t);
typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC )(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC )(GLenum target, GLenum pname, GLint param);
typedef void (APIENTRYP PFNGLTRANSLATEFPROC )(GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRYP PFNGLVERTEX2IPROC )(GLint x, GLint y);
typedef void (APIENTRYP PFNGLVIEWPORTPROC )(GLint x, GLint y, GLsizei width, GLsizei height);
#ifdef NO_EXTERN_GLAPI
// Defines the function pointers
@ -137,6 +140,7 @@ GLAPI_DECL PFNGLVIEWPORTPROC glViewport GLAP
// 2.0+ function pointers
GLAPI_DECL PFNGLATTACHSHADERPROC glAttachShader GLAPI_SET;
GLAPI_DECL PFNGLBINDBUFFERPROC glBindBuffer GLAPI_SET;
GLAPI_DECL PFNGLBINDFRAGDATALOCATIONPROC glBindFragDataLocation GLAPI_SET;
GLAPI_DECL PFNGLBINDVERTEXARRAYPROC glBindVertexArray GLAPI_SET;
GLAPI_DECL PFNGLBUFFERDATAPROC glBufferData GLAPI_SET;
GLAPI_DECL PFNGLCOMPILESHADERPROC glCompileShader GLAPI_SET;
@ -150,6 +154,9 @@ GLAPI_DECL PFNGLDETACHSHADERPROC glDetachShader GLAP
GLAPI_DECL PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray GLAPI_SET;
GLAPI_DECL PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation GLAPI_SET;
GLAPI_DECL PFNGLGENBUFFERSPROC glGenBuffers GLAPI_SET;
GLAPI_DECL PFNGLGETERRORPROC glGetError GLAPI_SET;
GLAPI_DECL PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog GLAPI_SET;
GLAPI_DECL PFNGLGETPROGRAMIVPROC glGetProgramiv GLAPI_SET;
GLAPI_DECL PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog GLAPI_SET;
GLAPI_DECL PFNGLGETSHADERIVPROC glGetShaderiv GLAPI_SET;
GLAPI_DECL PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation GLAPI_SET;
@ -161,7 +168,7 @@ GLAPI_DECL PFNGLUNIFORM2IPROC glUniform2i GLAP
GLAPI_DECL PFNGLUNIFORM4FPROC glUniform4f GLAPI_SET;
GLAPI_DECL PFNGLUNIFORM4IPROC glUniform4i GLAPI_SET;
GLAPI_DECL PFNGLUSEPROGRAMPROC glUseProgram GLAPI_SET;
GLAPI_DECL PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer GLAPI_SET;
GLAPI_DECL PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer GLAPI_SET;
#endif /* OPENGL_NO_LINK */

View File

@ -142,8 +142,8 @@ public:
_drawingContext->Initialise();
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// glEnable(GL_BLEND);
// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
void Resize(uint32 width, uint32 height) override
@ -175,15 +175,15 @@ public:
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION_MATRIX);
glLoadIdentity();
glOrtho(0, _width, _height, 0, -1.0, 1.0);
// glMatrixMode(GL_PROJECTION_MATRIX);
// glLoadIdentity();
// glOrtho(0, _width, _height, 0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW_MATRIX);
glLoadIdentity();
glScalef(1, -1.0f, 0);
glTranslatef(-1.0f, -1.0f, 0);
glScalef(2.0f / _width, 2.0f / _height, 0);
// glMatrixMode(GL_MODELVIEW_MATRIX);
// glLoadIdentity();
// glScalef(1, -1.0f, 0);
// glTranslatef(-1.0f, -1.0f, 0);
// glScalef(2.0f / _width, 2.0f / _height, 0);
if (gIntroState != INTRO_STATE_NONE) {
intro_draw(&_bitsDPI);
@ -328,6 +328,14 @@ void OpenGLDrawingContext::FillRect(uint32 colour, sint32 left, sint32 top, sint
{
vec4f paletteColour = _engine->GLPalette[colour & 0xFF];
_fillRectShader->Use();
_fillRectShader->SetScreenSize(gScreenWidth, gScreenHeight);
_fillRectShader->SetColour(paletteColour);
_fillRectShader->SetClip(_clipLeft, _clipTop, _clipRight, _clipBottom);
_fillRectShader->Draw(left, top, right, bottom);
return;
if (left > right)
{
left ^= right;
@ -377,6 +385,8 @@ void OpenGLDrawingContext::FillRect(uint32 colour, sint32 left, sint32 top, sint
void OpenGLDrawingContext::DrawLine(uint32 colour, sint32 x1, sint32 y1, sint32 x2, sint32 y2)
{
return;
vec4f paletteColour = _engine->GLPalette[colour & 0xFF];
glColor3f(paletteColour.r, paletteColour.g, paletteColour.b);
glBegin(GL_LINES);
@ -387,6 +397,8 @@ void OpenGLDrawingContext::DrawLine(uint32 colour, sint32 x1, sint32 y1, sint32
void OpenGLDrawingContext::DrawSprite(uint32 image, sint32 x, sint32 y, uint32 tertiaryColour)
{
return;
int g1Id = image & 0x7FFFF;
rct_g1_element * g1Element = gfx_get_g1_element(g1Id);

View File

@ -103,11 +103,22 @@ OpenGLShaderProgram::OpenGLShaderProgram(const char * name)
{
_vertexShader = new OpenGLShader(name, GL_VERTEX_SHADER);
_fragmentShader = new OpenGLShader(name, GL_FRAGMENT_SHADER);
_id = glCreateProgram();
_id = glCreateProgram();
glAttachShader(_id, _vertexShader->GetShaderId());
glAttachShader(_id, _fragmentShader->GetShaderId());
glLinkProgram(_id);
if (!Link())
{
char buffer[512];
GLsizei length;
glGetProgramInfoLog(_id, sizeof(buffer), &length, buffer);
Console::Error::WriteFormat("Error linking %s\n", name);
Console::Error::WriteLine(buffer);
throw Exception("Failed to link OpenGL shader.");
}
}
OpenGLShaderProgram::~OpenGLShaderProgram()
@ -140,4 +151,13 @@ void OpenGLShaderProgram::Use()
glUseProgram(_id);
}
bool OpenGLShaderProgram::Link()
{
glLinkProgram(_id);
GLint linkStatus;
glGetProgramiv(_id, GL_LINK_STATUS, &linkStatus);
return linkStatus == GL_TRUE;
}
#endif /* DISABLE_OPENGL */

View File

@ -52,5 +52,8 @@ public:
GLuint GetAttributeLocation(const char * name);
GLuint GetUniformLocation(const char * name);
void Use();
private:
bool Link();
};