diff --git a/src/client/refresh/gl3/gl3_draw.c b/src/client/refresh/gl3/gl3_draw.c index 6d39644d..b8eee177 100644 --- a/src/client/refresh/gl3/gl3_draw.c +++ b/src/client/refresh/gl3/gl3_draw.c @@ -257,7 +257,6 @@ GL3_Draw_Fill(int x, int y, int w, int h, int c) byte v[4]; } color; int i; - float cf[3]; if ((unsigned)c > 255) { @@ -276,8 +275,9 @@ GL3_Draw_Fill(int x, int y, int w, int h, int c) for(i=0; i<3; ++i) { - gl3state.uniCommonData.color[i] = color.v[i] * (1.0f/255.0f); + gl3state.uniCommonData.color.Elements[i] = color.v[i] * (1.0f/255.0f); } + gl3state.uniCommonData.color.A = 1.0f; GL3_UpdateUBOCommon(); @@ -295,7 +295,6 @@ GL3_Draw_FadeScreen(void) { float w = vid.width; float h = vid.height; - int i=0; GLfloat vBuf[8] = { // X, Y @@ -307,15 +306,9 @@ GL3_Draw_FadeScreen(void) glEnable(GL_BLEND); - for(i=0; i<3; ++i) - { - gl3state.uniCommonData.color[i] = 0.0f; - } - gl3state.uniCommonData.color[3] = 0.6f; - + gl3state.uniCommonData.color = HMM_Vec4(0, 0, 0, 0.6f); GL3_UpdateUBOCommon(); - GL3_UseProgram(gl3state.si2Dcolor.shaderProgram); GL3_BindVAO(vao2Dcolor); @@ -323,11 +316,6 @@ GL3_Draw_FadeScreen(void) glBindBuffer(GL_ARRAY_BUFFER, vbo2D); glBufferData(GL_ARRAY_BUFFER, sizeof(vBuf), vBuf, GL_STREAM_DRAW); - //glEnableVertexAttribArray(gl3state.si2Dcolor.attribPosition); - //qglVertexAttribPointer(gl3state.si2Dcolor.attribPosition, 2, GL_FLOAT, GL_FALSE, 4*sizeof(float), 0); - //glEnableVertexAttribArray(gl3state.si2Dcolor.attribColor); - //qglVertexAttribPointer(gl3state.si2Dcolor.attribColor, 2, GL_FLOAT, GL_FALSE, 6*sizeof(float), 2*sizeof(float)); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisable(GL_BLEND); diff --git a/src/client/refresh/gl3/gl3_main.c b/src/client/refresh/gl3/gl3_main.c index 7280b709..1889b8a1 100644 --- a/src/client/refresh/gl3/gl3_main.c +++ b/src/client/refresh/gl3/gl3_main.c @@ -440,6 +440,15 @@ GL3_Init(void) R_Printf(PRINT_ALL, "Refresh: " REF_VERSION "\n"); + if(sizeof(float) != sizeof(GLfloat)) + { + // if this ever happens, things would explode because we feed vertex arrays and UBO data + // using floats to OpenGL, which expects GLfloat (can't easily change, those floats are from HMM etc) + // (but to be honest I very much doubt this will ever happen.) + R_Printf(PRINT_ALL, "ref_gl3: sizeof(float) != sizeof(GLfloat) - we're in real trouble here.\n"); + return false; + } + GL3_Draw_GetPalette(); GL3_Register(); @@ -826,17 +835,7 @@ GL3_SetGL2D(void) hmm_mat4 transMatr = HMM_Orthographic(0, vid.width, vid.height, 0, -99999, 99999); - /* - glUseProgram(gl3state.si2Dcolor.shaderProgram); - glUniformMatrix4fv(gl3state.si2Dcolor.uniProjMatrix , 1, GL_FALSE, transMatr.Elements[0]); - glUseProgram(gl3state.si2D.shaderProgram); - glUniformMatrix4fv(gl3state.si2D.uniProjMatrix , 1, GL_FALSE, transMatr.Elements[0]); - */ - - //memcpy(gl3state.uni2DData.transMat4, transMatr.Elements, 4*4*sizeof(GLfloat)); - for(int i=0; i<4; ++i) - for(int j=0; j<4; ++j) - gl3state.uni2DData.transMat4[i][j] = transMatr.Elements[i][j]; + gl3state.uni2DData.transMat4 = transMatr; GL3_UpdateUBO2D(); @@ -940,8 +939,8 @@ SetupGL(void) gl3_world_matrix = viewMat; } - memcpy(gl3state.uni3DData.transProjMat4, gl3_projectionMatrix.Elements, sizeof(gl3state.uni3DData.transProjMat4)); - memcpy(gl3state.uni3DData.transModelViewMat4, gl3_world_matrix.Elements, sizeof(gl3state.uni3DData.transProjMat4)); + gl3state.uni3DData.transProjMat4 = gl3_projectionMatrix; + gl3state.uni3DData.transModelViewMat4 = gl3_world_matrix; gl3state.uni3DData.time = gl3_newrefdef.time; diff --git a/src/client/refresh/gl3/gl3_shaders.c b/src/client/refresh/gl3/gl3_shaders.c index d31c4448..89bf332e 100644 --- a/src/client/refresh/gl3/gl3_shaders.c +++ b/src/client/refresh/gl3/gl3_shaders.c @@ -413,35 +413,10 @@ initShader2D(gl3ShaderInfo_t* shaderInfo, const char* vertSrc, const char* fragS R_Printf(PRINT_ALL, "WARNING: OpenGL driver disagrees with us about UBO size of 'uniCommon': %i vs %i\n", blockSize, (int)sizeof(gl3state.uniCommonData)); - // TODO: clean up? - return false; + goto err_cleanup; } - const GLchar *names[] = { "gamma", "intensity", "color" }; - - GLuint indices[3]; - glGetUniformIndices(prog, 3, names, indices); - - GLint offset[3]; - glGetActiveUniformsiv(prog, 3, indices, GL_UNIFORM_OFFSET, offset); - - printf("## uniCommon offsets in shader:"); - for(int i=0; i<3; ++i) - { - printf(" offset of '%s' is %d", names[i], offset[i]); - } - printf("\n"); - - printf("## offsets in C: gamma: %zd intensity: %zd color: %zd\n", - offsetof(gl3UniCommon_t, gamma), - offsetof(gl3UniCommon_t, intensity), - offsetof(gl3UniCommon_t, color)); - - - glUniformBlockBinding(prog, blockIndex, GL3_BINDINGPOINT_UNICOMMON); - - // TODO: something with glUniformBlockBinding() ! } else { @@ -457,8 +432,7 @@ initShader2D(gl3ShaderInfo_t* shaderInfo, const char* vertSrc, const char* fragS if(blockSize != sizeof(gl3state.uni2DData)) { R_Printf(PRINT_ALL, "WARNING: OpenGL driver disagrees with us about UBO size of 'uni2D'\n"); - // TODO: clean up? - return false; + goto err_cleanup; } glUniformBlockBinding(prog, blockIndex, GL3_BINDINGPOINT_UNI2D); @@ -466,11 +440,18 @@ initShader2D(gl3ShaderInfo_t* shaderInfo, const char* vertSrc, const char* fragS else { R_Printf(PRINT_ALL, "WARNING: Couldn't find uniform block index 'uni2D'\n"); - // TODO: clean up? - return false; + goto err_cleanup; } return true; + +err_cleanup: + if(shaders2D[0] != 0) glDeleteShader(shaders2D[0]); + if(shaders2D[1] != 0) glDeleteShader(shaders2D[1]); + + if(prog != 0) glDeleteProgram(prog); + + return false; } static qboolean @@ -485,7 +466,6 @@ initShader3D(gl3ShaderInfo_t* shaderInfo, const char* vertSrc, const char* fragS glDeleteProgram(shaderInfo->shaderProgram); } - //shaderInfo->uniColor = shaderInfo->uniProjMatrix = shaderInfo->uniModelViewMatrix = -1; shaderInfo->shaderProgram = 0; shaders3D[0] = CompileShader(GL_VERTEX_SHADER, vertexCommon3D, vertSrc); @@ -571,8 +551,7 @@ static void initUBOs(void) { gl3state.uniCommonData.gamma = 1.0f/vid_gamma->value; gl3state.uniCommonData.intensity = intensity->value; - GLfloat color[4] = {1, 1, 1, 1}; - memcpy(gl3state.uniCommonData.color, color, sizeof(color)); + gl3state.uniCommonData.color = HMM_Vec4(1, 1, 1, 1); glGenBuffers(1, &gl3state.uniCommonUBO); glBindBuffer(GL_UNIFORM_BUFFER, gl3state.uniCommonUBO); @@ -580,16 +559,16 @@ static void initUBOs(void) glBufferData(GL_UNIFORM_BUFFER, sizeof(gl3state.uniCommonData), &gl3state.uniCommonData, GL_DYNAMIC_DRAW); // the matrix will be set to something more useful later, before being used - memset(gl3state.uni2DData.transMat4, 0, sizeof(gl3state.uni2DData.transMat4)); + gl3state.uni2DData.transMat4 = HMM_Mat4(); glGenBuffers(1, &gl3state.uni2DUBO); glBindBuffer(GL_UNIFORM_BUFFER, gl3state.uni2DUBO); glBindBufferBase(GL_UNIFORM_BUFFER, GL3_BINDINGPOINT_UNI2D, gl3state.uni2DUBO); glBufferData(GL_UNIFORM_BUFFER, sizeof(gl3state.uni2DData), &gl3state.uni2DData, GL_DYNAMIC_DRAW); - - memset(&gl3state.uni3DData, 0, sizeof(gl3state.uni3DData)); // the matrices will be set to something more useful later, before being used + gl3state.uni3DData.transProjMat4 = HMM_Mat4(); + gl3state.uni3DData.transModelViewMat4 = HMM_Mat4(); gl3state.uni3DData.scroll = 0.0f; gl3state.uni3DData.time = 0.0f; gl3state.uni3DData.alpha = 1.0f; diff --git a/src/client/refresh/gl3/gl3_surf.c b/src/client/refresh/gl3/gl3_surf.c index 7c0ff425..dccfb656 100644 --- a/src/client/refresh/gl3/gl3_surf.c +++ b/src/client/refresh/gl3/gl3_surf.c @@ -624,8 +624,7 @@ GL3_DrawAlphaSurfaces(void) float intens; /* go back to the world matrix */ - //glLoadMatrixf(r_world_matrix); - memcpy(gl3state.uni3DData.transModelViewMat4, gl3_world_matrix.Elements, 16*sizeof(float)); + gl3state.uni3DData.transModelViewMat4 = gl3_world_matrix; GL3_UpdateUBO3D(); glEnable(GL_BLEND); diff --git a/src/client/refresh/gl3/header/local.h b/src/client/refresh/gl3/header/local.h index 5b1fb637..cc8c7410 100644 --- a/src/client/refresh/gl3/header/local.h +++ b/src/client/refresh/gl3/header/local.h @@ -118,21 +118,21 @@ typedef struct GLfloat intensity; // entries of std140 UBOs are aligned to multiples of their own size - // so we'll need to pad accordingly + // so we'll need to pad accordingly for following vec4 GLfloat _padding[2]; - GLfloat color[4]; + hmm_vec4 color; } gl3UniCommon_t; typedef struct { - GLfloat transMat4[4][4]; + hmm_mat4 transMat4; } gl3Uni2D_t; typedef struct { - GLfloat transProjMat4[4][4]; - GLfloat transModelViewMat4[4][4]; + hmm_mat4 transProjMat4; + hmm_mat4 transModelViewMat4; GLfloat scroll; // for SURF_FLOWING GLfloat time; // for warping surfaces like water & possibly other things