# HG changeset patch # User Wolfgang Steffens # Date 1338928656 -7200 # Node ID 580cd247511e48584e9707b3e3dbeb1e809e710f # Parent 013deb83086b56d38e76082d886d75df7c540e01 Removed leftover FFP code: We should now be GL2 GLSL1.30+ forward compatible. Added a seperate shader for the gradient used for water drawing. Disabled 3D mode for GL2 codepath as this still has some FFP left. diff -r 013deb83086b -r 580cd247511e hedgewars/options.inc --- a/hedgewars/options.inc Tue Jun 05 22:17:06 2012 +0200 +++ b/hedgewars/options.inc Tue Jun 05 22:37:36 2012 +0200 @@ -53,6 +53,10 @@ {$DEFINE USE_TOUCH_INTERFACE} {$ENDIF} +{$IFDEF GL2} + {$DEFINE S3D_DISABLED} +{$ENDIF} + {$IFDEF WIN32} {$DEFINE USE_CONTEXT_RESTORE} {$ENDIF} diff -r 013deb83086b -r 580cd247511e hedgewars/uChat.pas --- a/hedgewars/uChat.pas Tue Jun 05 22:17:06 2012 +0200 +++ b/hedgewars/uChat.pas Tue Jun 05 22:37:36 2012 +0200 @@ -31,7 +31,7 @@ procedure KeyPressChat(Key: Longword); implementation -uses SDLh, uInputHandler, uTypes, uVariables, uCommands, uUtils, uTextures, uRender, uIO; +uses SDLh, uInputHandler, uTypes, uVariables, uCommands, uUtils, uTextures, uRender, uStore, uIO; const MaxStrIndex = 27; diff -r 013deb83086b -r 580cd247511e hedgewars/uGearsRender.pas --- a/hedgewars/uGearsRender.pas Tue Jun 05 22:17:06 2012 +0200 +++ b/hedgewars/uGearsRender.pas Tue Jun 05 22:37:36 2012 +0200 @@ -37,7 +37,7 @@ end; implementation -uses uRender, uUtils, uVariables, uAmmos, Math, uVisualGears; +uses uRender, uStore, uUtils, uVariables, uAmmos, Math, uVisualGears; procedure DrawRopeLinesRQ(Gear: PGear); begin @@ -62,7 +62,7 @@ Tint($C0, $C0, $C0, $FF); - glVertexPointer(2, GL_FLOAT, 0, @RopePoints.rounded[0]); + SetVertexPointer(@RopePoints.rounded[0]); glDrawArrays(GL_LINE_STRIP, 0, RopePoints.Count + 2); Tint($FF, $FF, $FF, $FF); diff -r 013deb83086b -r 580cd247511e hedgewars/uRender.pas --- a/hedgewars/uRender.pas Tue Jun 05 22:17:06 2012 +0200 +++ b/hedgewars/uRender.pas Tue Jun 05 22:37:36 2012 +0200 @@ -48,9 +48,6 @@ procedure DrawHedgehog (X, Y: LongInt; Dir: LongInt; Pos, Step: LongWord; Angle: real); procedure DrawScreenWidget (widget: POnScreenWidget); -procedure Tint (r, g, b, a: Byte); inline; -procedure Tint (c: Longword); inline; - // This is just temporary and becomes non public once everything changed to GL2 procedure UpdateModelview; procedure ResetModelview; @@ -61,8 +58,6 @@ implementation uses uVariables, uStore; -var LastTint: LongWord = 0; - const DegToRad = 0.01745329252; // 2PI / 360 procedure UpdateModelview; @@ -169,8 +164,8 @@ VertexBuffer[3].X:= X; VertexBuffer[3].Y:= rr.h + Y; -glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); -glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]); +SetVertexPointer(@VertexBuffer[0]); +SetTexCoordPointer(@TextureBuffer[0]); glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); end; @@ -188,8 +183,8 @@ glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id); -glVertexPointer(2, GL_FLOAT, 0, @Texture^.vb); -glTexCoordPointer(2, GL_FLOAT, 0, @Texture^.tb); +SetVertexPointer(@Texture^.vb); +SetTexCoordPointer(@Texture^.tb); glDrawArrays(GL_TRIANGLE_FAN, 0, Length(Texture^.vb)); ResetModelview; end; @@ -243,8 +238,8 @@ VertexBuffer[3].X:= -hw; VertexBuffer[3].Y:= w / 2; -glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); -glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]); +SetVertexPointer(@VertexBuffer[0]); +SetTexCoordPointer(@TextureBuffer[0]); glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); ResetModelview; @@ -305,8 +300,8 @@ VertexBuffer[3].X:= -hw; VertexBuffer[3].Y:= hh; -glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); -glTexCoordPointer(2, GL_FLOAT, 0, @Texture^.tb); +SetVertexPointer(@VertexBuffer[0]); +SetTexCoordPointer(@Texture^.tb); glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); ResetModelview; @@ -384,7 +379,7 @@ VertexBuffer[1].X:= X1; VertexBuffer[1].Y:= Y1; - glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); + SetVertexPointer(@VertexBuffer[0]); glDrawArrays(GL_LINES, 0, Length(VertexBuffer)); Tint($FF, $FF, $FF, $FF); @@ -420,7 +415,7 @@ VertexBuffer[3].X:= r.x; VertexBuffer[3].Y:= r.y + r.h; -glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); +SetVertexPointer(@VertexBuffer[0]); glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); Tint($FF, $FF, $FF, $FF); @@ -451,7 +446,7 @@ ResetRotation; UpdateModelview; glLineWidth(Width); - glVertexPointer(2, GL_FLOAT, 0, @CircleVertex[0]); + SetVertexPointer(@CircleVertex[0]); glDrawArrays(GL_LINE_LOOP, 0, 60); glEnable(GL_TEXTURE_2D); glDisable(GL_LINE_SMOOTH); @@ -490,10 +485,10 @@ glBindTexture(GL_TEXTURE_2D, HHTexture^.atlas^.id); if Dir = -1 then - glVertexPointer(2, GL_FLOAT, 0, @VertexBuffers[1][0]) + SetVertexPointer(@VertexBuffers[1][0]) else - glVertexPointer(2, GL_FLOAT, 0, @VertexBuffers[0][0]); - glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]); + SetVertexPointer(@VertexBuffers[0][0]); + SetTexCoordPointer(@TextureBuffer[0]); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); ResetModelview; @@ -546,31 +541,4 @@ {$ENDIF} end; -procedure Tint(r, g, b, a: Byte); inline; -var nc, tw: Longword; -begin - nc:= (a shl 24) or (b shl 16) or (g shl 8) or r; - - if nc = lastTint then - exit; - - if GrayScale then - begin - tw:= round(r * RGB_LUMINANCE_RED + g * RGB_LUMINANCE_GREEN + b * RGB_LUMINANCE_BLUE); - if tw > 255 then - tw:= 255; - r:= tw; - g:= tw; - b:= tw - end; - - glColor4ub(r, g, b, a); - lastTint:= nc; -end; - -procedure Tint(c: Longword); inline; -begin - Tint(((c shr 24) and $FF), ((c shr 16) and $FF), (c shr 8) and $FF, (c and $FF)) -end; - end. diff -r 013deb83086b -r 580cd247511e hedgewars/uStore.pas --- a/hedgewars/uStore.pas Tue Jun 05 22:17:06 2012 +0200 +++ b/hedgewars/uStore.pas Tue Jun 05 22:37:36 2012 +0200 @@ -49,6 +49,14 @@ procedure UpdateModelviewProjection; {$ENDIF} +procedure Tint(r, g, b, a: Byte); inline; +procedure Tint(c: Longword); inline; +procedure SetTexCoordPointer(p: Pointer); +procedure SetVertexPointer(p: Pointer); +procedure SetColorPointer(p: Pointer); +procedure BeginWater; +procedure EndWater; + implementation uses uMisc, uConsole, uMobile, uVariables, uUtils, uTextures, uRender, uRenderUtils, uCommands, uDebug{$IFDEF USE_CONTEXT_RESTORE}, uWorld{$ENDIF}, uMatrix; @@ -63,9 +71,26 @@ SDLPrimSurface: PSDL_Surface; {$ENDIF} {$IFDEF GL2} - Shader: GLuint; - uMVPLocation: GLint; + shaderMain: GLuint; + shaderWater: GLuint; + + // attributes +const + aVertex: GLint = 0; + aTexCoord: GLint = 1; + aColor: GLint = 2; + +var + uCurrentMVPLocation: GLint; + + uMainMVPLocation: GLint; + uMainTintLocation: GLint; + + uWaterMVPLocation: GLint; + {$ENDIF} + LastTint: LongWord = 0; + function WriteInRect(Surface: PSDL_Surface; X, Y: LongInt; Color: LongWord; Font: THWFont; s: ansistring): TSDL_Rect; var w, h: LongInt; @@ -664,7 +689,7 @@ CloseFile(f); - writeln('Compiling shader: ' + Pathz[ptShaders] + '/' + shaderFile); + WriteLnToConsole('Compiling shader: ' + Pathz[ptShaders] + '/' + shaderFile); sourceA:=PChar(source); lengthA:=Length(source); @@ -679,15 +704,15 @@ begin GetMem(log, logLength); glGetShaderInfoLog(shader, logLength, nil, log); - writeln('========== Compiler log =========='); - writeln(log); - writeln('==================================='); + WriteLnToConsole('========== Compiler log =========='); + WriteLnToConsole(log); + WriteLnToConsole('==================================='); FreeMem(log, logLength); end; if compileResult <> GL_TRUE then begin - writeln('Shader compilation failed, halting'); + WriteLnToConsole('Shader compilation failed, halting'); halt(-1); end; @@ -707,6 +732,11 @@ fs:= CompileShader(shaderName + '.fs', GL_FRAGMENT_SHADER); glAttachShader(program_, vs); glAttachShader(program_, fs); + + glBindAttribLocation(program_, aVertex, 'vertex'); + glBindAttribLocation(program_, aTexCoord, 'texcoord'); + glBindAttribLocation(program_, aColor, 'color'); + glLinkProgram(program_); glDeleteShader(vs); glDeleteShader(fs); @@ -718,20 +748,21 @@ begin GetMem(log, logLength); glGetProgramInfoLog(program_, logLength, nil, log); - writeln('========== Compiler log =========='); - writeln(log); - writeln('==================================='); + WriteLnToConsole('========== Compiler log =========='); + WriteLnToConsole(log); + WriteLnToConsole('==================================='); FreeMem(log, logLength); end; if linkResult <> GL_TRUE then begin - writeln('Linking program failed, halting'); + WriteLnToConsole('Linking program failed, halting'); halt(-1); end; CompileProgram:= program_; end; + {$ENDIF} procedure SetupOpenGL; @@ -793,11 +824,22 @@ {$IFDEF GL2} Load_GL_VERSION_2_0; - Shader:= CompileProgram('default'); - glUseProgram(Shader); - glUniform1i(glGetUniformLocation(Shader, 'tex'), 0); - uMVPLocation:= glGetUniformLocation(Shader, 'mvp'); + + shaderWater:= CompileProgram('water'); + glUseProgram(shaderWater); + glUniform1i(glGetUniformLocation(shaderWater, 'tex0'), 0); + uWaterMVPLocation:= glGetUniformLocation(shaderWater, 'mvp'); + shaderMain:= CompileProgram('default'); + glUseProgram(shaderMain); + glUniform1i(glGetUniformLocation(shaderMain, 'tex0'), 0); + uMainMVPLocation:= glGetUniformLocation(shaderMain, 'mvp'); + uMainTintLocation:= glGetUniformLocation(shaderMain, 'tint'); + + uCurrentMVPLocation:= uMainMVPLocation; + + Tint(255, 255, 255, 255); + UpdateModelviewProjection; {$ENDIF} {$IFNDEF S3D_DISABLED} @@ -858,8 +900,77 @@ glDisable(GL_DITHER); // enable common states by default as they save a lot glEnable(GL_TEXTURE_2D); + +{$IFDEF GL2} + glEnableVertexAttribArray(aVertex); + glEnableVertexAttribArray(aTexCoord); +{$ELSE} glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); +{$ENDIF} +end; + + +procedure Tint(r, g, b, a: Byte); inline; +var + nc, tw: Longword; +const + scale = 1.0/255.0; +begin + nc:= (a shl 24) or (b shl 16) or (g shl 8) or r; + + if nc = lastTint then + exit; + + if GrayScale then + begin + tw:= round(r * RGB_LUMINANCE_RED + g * RGB_LUMINANCE_GREEN + b * RGB_LUMINANCE_BLUE); + if tw > 255 then + tw:= 255; + r:= tw; + g:= tw; + b:= tw + end; + + {$IFDEF GL2} + glUniform4f(uMainTintLocation, r*scale, g*scale, b*scale, a*scale); + glColor4ub(r, g, b, a); + {$ELSE} + glColor4ub(r, g, b, a); + {$ENDIF} + lastTint:= nc; +end; + +procedure Tint(c: Longword); inline; +begin + Tint(((c shr 24) and $FF), ((c shr 16) and $FF), (c shr 8) and $FF, (c and $FF)) +end; + +procedure SetTexCoordPointer(p: Pointer); +begin + {$IFDEF GL2} + glVertexAttribPointer(aTexCoord, 2, GL_FLOAT, GL_FALSE, 0, p); + {$ELSE} + glTexCoordPointer(2, GL_FLOAT, 0, p); + {$ENDIF} +end; + +procedure SetVertexPointer(p: Pointer); +begin + {$IFDEF GL2} + glVertexAttribPointer(aVertex, 2, GL_FLOAT, GL_FALSE, 0, p); + {$ELSE} + glVertexPointer(2, GL_FLOAT, 0, p); + {$ENDIF} +end; + +procedure SetColorPointer(p: Pointer); +begin + {$IFDEF GL2} + glVertexAttribPointer(aColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, p); + {$ELSE} + glColorPointer(4, GL_UNSIGNED_BYTE, 0, p); + {$ENDIF} end; {$IFDEF GL2} @@ -868,7 +979,7 @@ mvp: TMatrix4x4f; begin MatrixMultiply(mvp, mProjection, mModelview); - glUniformMatrix4fv(uMVPLocation, 1, GL_FALSE, @mvp[0, 0]); + glUniformMatrix4fv(uCurrentMVPLocation, 1, GL_FALSE, @mvp[0, 0]); end; {$ENDIF GL2} @@ -901,6 +1012,34 @@ //end; end; +procedure BeginWater; +begin + {$IFDEF GL2} + glUseProgram(shaderWater); + uCurrentMVPLocation:=uWaterMVPLocation; + UpdateModelviewProjection; + glDisableVertexAttribArray(aTexCoord); + glEnableVertexAttribArray(aColor); + {$ELSE} + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + {$ENDIF} +end; + +procedure EndWater; +begin + {$IFDEF GL2} + glUseProgram(shaderMain); + uCurrentMVPLocation:=uMainMVPLocation; + UpdateModelviewProjection; + glDisableVertexAttribArray(aColor); + glEnableVertexAttribArray(aTexCoord); + {$ELSE} + glDisableClientState(GL_COLOR_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + {$ENDIF} +end; + //////////////////////////////////////////////////////////////////////////////// procedure AddProgress; var r: TSDL_Rect; @@ -1284,7 +1423,8 @@ procedure freeModule; begin {$IFDEF GL2} - glDeleteProgram(Shader); + glDeleteProgram(shaderMain); + glDeleteProgram(shaderWater); {$ENDIF} StoreRelease(false); TTF_Quit(); diff -r 013deb83086b -r 580cd247511e hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Tue Jun 05 22:17:06 2012 +0200 +++ b/hedgewars/uWorld.pas Tue Jun 05 22:37:36 2012 +0200 @@ -798,20 +798,20 @@ VertexBuffer[3].X:= -lw; VertexBuffer[3].Y:= lh; - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); + BeginWater; if SuddenDeathDmg then - glColorPointer(4, GL_UNSIGNED_BYTE, 0, @SDWaterColorArray[0]) + SetColorPointer(@SDWaterColorArray[0]) else - glColorPointer(4, GL_UNSIGNED_BYTE, 0, @WaterColorArray[0]); + SetColorPointer(@WaterColorArray[0]); - glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); + SetVertexPointer(@VertexBuffer[0]); glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); - glDisableClientState(GL_COLOR_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); + EndWater; + {$IFNDEF GL2} glColor4ub($FF, $FF, $FF, $FF); // must not be Tint() as color array seems to stay active and color reset is required + {$ENDIF} glEnable(GL_TEXTURE_2D); end; end; @@ -863,8 +863,8 @@ ComputeTexcoords(SpritesData[sprite].Texture, @r, @TextureBuffer); -glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); -glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]); +SetVertexPointer(@VertexBuffer[0]); +SetTexCoordPointer(@TextureBuffer[0]); glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); Tint($FF, $FF, $FF, $FF); @@ -1075,31 +1075,17 @@ procedure ChangeDepth(rm: TRenderMode; d: GLfloat); begin -{$IFDEF S3D_DISABLED} - rm:= rm; d:= d; // avoid hint - exit; -{$ELSE} d:= d / 5; - if rm = rmDefault then - exit - else if rm = rmLeftEye then + if rm = rmLeftEye then d:= -d; cStereoDepth:= cStereoDepth + d; UpdateProjection; -{$ENDIF} end; procedure ResetDepth(rm: TRenderMode); begin -{$IFDEF S3D_DISABLED} - rm:= rm; // avoid hint - exit; -{$ELSE} - if rm = rmDefault then - exit; cStereoDepth:= 0; UpdateProjection; -{$ENDIF} end; procedure DrawWorldStereo(Lag: LongInt; RM: TRenderMode); @@ -1555,7 +1541,7 @@ glDisable(GL_TEXTURE_2D); - glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); + SetVertexPointer(@VertexBuffer[0]); glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); glEnable(GL_TEXTURE_2D); diff -r 013deb83086b -r 580cd247511e share/hedgewars/Data/Shaders/default.fs --- a/share/hedgewars/Data/Shaders/default.fs Tue Jun 05 22:17:06 2012 +0200 +++ b/share/hedgewars/Data/Shaders/default.fs Tue Jun 05 22:37:36 2012 +0200 @@ -1,9 +1,13 @@ -// !!!just testing!!! -// This is not GLSL 1.3+ compatible, as its using the compatibility profile! +#version 130 + uniform sampler2D tex0; -varying vec4 tint; +uniform vec4 tint; + +in vec2 tex; + +out vec4 color; void main() { - gl_FragColor = texture2D(tex0, gl_TexCoord[0].st) * tint; + color = texture(tex0, tex) * tint; } diff -r 013deb83086b -r 580cd247511e share/hedgewars/Data/Shaders/default.vs --- a/share/hedgewars/Data/Shaders/default.vs Tue Jun 05 22:17:06 2012 +0200 +++ b/share/hedgewars/Data/Shaders/default.vs Tue Jun 05 22:37:36 2012 +0200 @@ -1,11 +1,16 @@ -// !!!just testing!!! -// This is not GLSL 1.3+ compatible, as its using the compatibility profile! +#version 130 + +in vec2 vertex; +in vec2 texcoord; +in vec4 colors; + +out vec2 tex; + uniform mat4 mvp; -varying vec4 tint; void main() { - gl_Position = mvp * gl_Vertex; - gl_TexCoord[0] = gl_MultiTexCoord0; - tint = gl_Color; + vec4 p = mvp * vec4(vertex, 0.0f, 1.0f); + gl_Position = p; + tex = texcoord; } diff -r 013deb83086b -r 580cd247511e share/hedgewars/Data/Shaders/water.fs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Shaders/water.fs Tue Jun 05 22:37:36 2012 +0200 @@ -0,0 +1,9 @@ +#version 130 + +in vec4 vcolor; +out vec4 color; + +void main() +{ + color = vcolor; +} diff -r 013deb83086b -r 580cd247511e share/hedgewars/Data/Shaders/water.vs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Shaders/water.vs Tue Jun 05 22:37:36 2012 +0200 @@ -0,0 +1,14 @@ +#version 130 + +in vec2 vertex; +in vec4 color; +out vec4 vcolor; + +uniform mat4 mvp; + +void main() +{ + vec4 p = mvp * vec4(vertex, 0.0f, 1.0f); + gl_Position = p; + vcolor = color; +}