--- a/hedgewars/uRender.pas Sun Jan 19 00:18:28 2014 +0400
+++ b/hedgewars/uRender.pas Tue Jan 21 22:38:13 2014 +0100
@@ -17,12 +17,13 @@
*)
{$INCLUDE "options.inc"}
+{$IF GLunit = GL}{$DEFINE GLunit:=GL,GLext}{$ENDIF}
unit uRender;
interface
-uses SDLh, uTypes, GLunit, uConsts;
+uses SDLh, uTypes, GLunit, uConsts, uStore{$IFDEF GL2}, uMatrix{$ENDIF};
procedure DrawSprite (Sprite: TSprite; X, Y, Frame: LongInt);
procedure DrawSprite (Sprite: TSprite; X, Y, FrameX, FrameY: LongInt);
@@ -55,7 +56,6 @@
procedure untint(); inline;
procedure setTintAdd (f: boolean); inline;
-
implementation
uses uVariables;
@@ -78,6 +78,7 @@
begin
DrawTextureFromRectDir(X, Y, r^.w, r^.h, r, SourceTexture, 1)
end;
+
procedure DrawTextureFromRect(X, Y, W, H: LongInt; r: PSDL_Rect; SourceTexture: PTexture); inline;
begin
DrawTextureFromRectDir(X, Y, W, H, r, SourceTexture, 1)
@@ -143,7 +144,7 @@
glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]);
-glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
+glDrawArrays(GL_TRIANGLE_FAN, 0, High(VertexBuffer) - Low(VertexBuffer) + 1);
end;
procedure DrawTexture(X, Y: LongInt; Texture: PTexture); inline;
@@ -154,17 +155,30 @@
procedure DrawTexture(X, Y: LongInt; Texture: PTexture; Scale: GLfloat);
begin
+{$IFDEF GL2}
+hglPushMatrix;
+hglTranslatef(X, Y, 0);
+hglScalef(Scale, Scale, 1);
+{$ELSE}
glPushMatrix;
glTranslatef(X, Y, 0);
glScalef(Scale, Scale, 1);
+{$ENDIF}
glBindTexture(GL_TEXTURE_2D, Texture^.id);
-glVertexPointer(2, GL_FLOAT, 0, @Texture^.vb);
-glTexCoordPointer(2, GL_FLOAT, 0, @Texture^.tb);
+SetVertexPointer(@Texture^.vb, Length(Texture^.vb));
+SetTexCoordPointer(@Texture^.tb, Length(Texture^.vb));
+
+{$IFDEF GL2}
+UpdateModelviewProjection;
glDrawArrays(GL_TRIANGLE_FAN, 0, Length(Texture^.vb));
+hglPopMatrix;
+{$ELSE}
+glDrawArrays(GL_TRIANGLE_FAN, 0, Length(Texture^.vb));
+glPopMatrix;
+{$ENDIF}
-glPopMatrix
end;
procedure DrawTextureF(Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, w, h: LongInt);
@@ -183,14 +197,25 @@
if (abs(Y) > H) and ((abs(Y + OffsetY - (0.5 * cScreenHeight)) - W / 2) * cScaleFactor > cScreenHeight) then
exit;
+{$IFDEF GL2}
+hglPushMatrix;
+hglTranslatef(X, Y, 0);
+{$ELSE}
glPushMatrix;
glTranslatef(X, Y, 0);
+{$ENDIF}
+
if Dir = 0 then Dir:= 1;
+{$IFDEF GL2}
+hglRotatef(Angle, 0, 0, Dir);
+hglTranslatef(Dir*OffsetX, OffsetY, 0);
+hglScalef(Scale, Scale, 1);
+{$ELSE}
glRotatef(Angle, 0, 0, Dir);
-
glTranslatef(Dir*OffsetX, OffsetY, 0);
glScalef(Scale, Scale, 1);
+{$ENDIF}
// Any reason for this call? And why only in t direction, not s?
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
@@ -225,11 +250,21 @@
TextureBuffer[3].X:= fl;
TextureBuffer[3].Y:= fb;
-glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
-glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]);
+SetVertexPointer(@VertexBuffer[0], Length(VertexBuffer));
+SetTexCoordPointer(@TextureBuffer[0], Length(VertexBuffer));
+
+{$IFDEF GL2}
+UpdateModelviewProjection;
+{$ENDIF}
+
glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
-glPopMatrix
+{$IFDEF GL2}
+hglPopMatrix;
+{$ELSE}
+glPopMatrix;
+{$ENDIF}
+
end;
procedure DrawSpriteRotated(Sprite: TSprite; X, Y, Dir: LongInt; Angle: real);
@@ -242,19 +277,42 @@
procedure DrawSpriteRotatedF(Sprite: TSprite; X, Y, Frame, Dir: LongInt; Angle: real);
begin
+
+{$IFDEF GL2}
+hglPushMatrix;
+hglTranslatef(X, Y, 0);
+{$ELSE}
glPushMatrix;
glTranslatef(X, Y, 0);
+{$ENDIF}
if Dir < 0 then
+{$IFDEF GL2}
+ hglRotatef(Angle, 0, 0, -1)
+{$ELSE}
glRotatef(Angle, 0, 0, -1)
+{$ENDIF}
else
+{$IFDEF GL2}
+ hglRotatef(Angle, 0, 0, 1);
+{$ELSE}
glRotatef(Angle, 0, 0, 1);
+{$ENDIF}
if Dir < 0 then
+{$IFDEF GL2}
+ hglScalef(-1.0, 1.0, 1.0);
+{$ELSE}
glScalef(-1.0, 1.0, 1.0);
+{$ENDIF}
DrawSprite(Sprite, -SpritesData[Sprite].Width div 2, -SpritesData[Sprite].Height div 2, Frame);
-glPopMatrix
+{$IFDEF GL2}
+hglPopMatrix;
+{$ELSE}
+glPopMatrix;
+{$ENDIF}
+
end;
procedure DrawTextureRotated(Texture: PTexture; hw, hh, X, Y, Dir: LongInt; Angle: real);
@@ -266,17 +324,29 @@
if (abs(Y) > 2 * hh) and ((abs(Y - 0.5 * cScreenHeight) - hh) > cScreenHeight / cScaleFactor) then
exit;
+{$IFDEF GL2}
+hglPushMatrix;
+hglTranslatef(X, Y, 0);
+{$ELSE}
glPushMatrix;
glTranslatef(X, Y, 0);
+{$ENDIF}
if Dir < 0 then
begin
hw:= - hw;
+{$IFDEF GL2}
+ hglRotatef(Angle, 0, 0, -1);
+{$ELSE}
glRotatef(Angle, 0, 0, -1);
+{$ENDIF}
end
else
- glRotatef(Angle, 0, 0, 1);
-
+{$IFDEF GL2}
+ hglRotatef(Angle, 0, 0, 1);
+{$ELSE}
+ glRotatef(Angle, 0, 0, 1);
+{$ENDIF}
glBindTexture(GL_TEXTURE_2D, Texture^.id);
@@ -289,11 +359,21 @@
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], Length(VertexBuffer));
+SetTexCoordPointer(@Texture^.tb, Length(VertexBuffer));
+
+{$IFDEF GL2}
+UpdateModelviewProjection;
+{$ENDIF}
+
glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
-glPopMatrix
+{$IFDEF GL2}
+hglPopMatrix;
+{$ELSE}
+glPopMatrix;
+{$ENDIF}
+
end;
procedure DrawSprite(Sprite: TSprite; X, Y, Frame: LongInt);
@@ -335,7 +415,7 @@
if (X + SpritesData[Sprite].Width > RightX) then
r.w:= RightX - X + 1;
-if (r.h < r.y) or (r.w < r.x) then
+if (r.h < r.y) or (r.w < r.x) then
exit;
dec(r.h, r.y);
@@ -362,8 +442,9 @@
procedure DrawLine(X0, Y0, X1, Y1, Width: Single; r, g, b, a: Byte);
var VertexBuffer: array [0..1] of TVertex2f;
begin
+ glEnable(GL_LINE_SMOOTH);
+{$IFNDEF GL2}
glDisable(GL_TEXTURE_2D);
- glEnable(GL_LINE_SMOOTH);
glPushMatrix;
glTranslatef(WorldDx, WorldDy, 0);
@@ -375,13 +456,37 @@
VertexBuffer[1].X:= X1;
VertexBuffer[1].Y:= Y1;
- glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
+ SetVertexPointer(@VertexBuffer[0], Length(VertexBuffer));
glDrawArrays(GL_LINES, 0, Length(VertexBuffer));
untint;
-
+
glPopMatrix;
-
+
glEnable(GL_TEXTURE_2D);
+
+{$ELSE}
+ EnableTexture(False);
+
+ hglPushMatrix;
+ hglTranslatef(WorldDx, WorldDy, 0);
+ glLineWidth(Width);
+
+ UpdateModelviewProjection;
+
+ Tint(r, g, b, a);
+ VertexBuffer[0].X:= X0;
+ VertexBuffer[0].Y:= Y0;
+ VertexBuffer[1].X:= X1;
+ VertexBuffer[1].Y:= Y1;
+
+ SetVertexPointer(@VertexBuffer[0], Length(VertexBuffer));
+ glDrawArrays(GL_LINES, 0, Length(VertexBuffer));
+ Tint($FF, $FF, $FF, $FF);
+
+ hglPopMatrix;
+ EnableTexture(True);
+
+{$ENDIF}
glDisable(GL_LINE_SMOOTH);
end;
@@ -389,12 +494,17 @@
var VertexBuffer: array [0..3] of TVertex2f;
begin
// do not draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs)
+
if (abs(r.x) > r.w) and ((abs(r.x + r.w / 2) - r.w / 2) * cScaleFactor > cScreenWidth) then
exit;
if (abs(r.y) > r.h) and ((abs(r.y + r.h / 2 - (0.5 * cScreenHeight)) - r.h / 2) * cScaleFactor > cScreenHeight) then
exit;
+{$IFDEF GL2}
+EnableTexture(False);
+{$ELSE}
glDisable(GL_TEXTURE_2D);
+{$ENDIF}
Tint($00, $00, $00, $80);
@@ -407,21 +517,26 @@
VertexBuffer[3].X:= r.x;
VertexBuffer[3].Y:= r.y + r.h;
-glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
+SetVertexPointer(@VertexBuffer[0], Length(VertexBuffer));
glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
untint;
+{$IFDEF GL2}
+EnableTexture(True);
+{$ELSE}
glEnable(GL_TEXTURE_2D)
+{$ENDIF}
+
end;
-procedure DrawCircle(X, Y, Radius, Width: LongInt; r, g, b, a: Byte);
+procedure DrawCircle(X, Y, Radius, Width: LongInt; r, g, b, a: Byte);
begin
Tint(r, g, b, a);
- DrawCircle(X, Y, Radius, Width);
+ DrawCircle(X, Y, Radius, Width);
untint;
end;
-procedure DrawCircle(X, Y, Radius, Width: LongInt);
+procedure DrawCircle(X, Y, Radius, Width: LongInt);
var
i: LongInt;
CircleVertex: array [0..59] of TVertex2f;
@@ -430,6 +545,9 @@
CircleVertex[i].X := X + Radius*cos(i*pi/30);
CircleVertex[i].Y := Y + Radius*sin(i*pi/30);
end;
+
+{$IFNDEF GL2}
+
glDisable(GL_TEXTURE_2D);
glEnable(GL_LINE_SMOOTH);
glPushMatrix;
@@ -439,6 +557,18 @@
glPopMatrix;
glEnable(GL_TEXTURE_2D);
glDisable(GL_LINE_SMOOTH);
+
+{$ELSE}
+ EnableTexture(False);
+ glEnable(GL_LINE_SMOOTH);
+ hglPushMatrix;
+ glLineWidth(Width);
+ SetVertexPointer(@CircleVertex[0], 60);
+ glDrawArrays(GL_LINE_LOOP, 0, 60);
+ hglPopMatrix;
+ EnableTexture(True);
+ glDisable(GL_LINE_SMOOTH);
+{$ENDIF}
end;
@@ -471,10 +601,15 @@
r:= (Step + 1) * 32 / HHTexture^.w
end;
-
+{$IFDEF GL2}
+ hglPushMatrix();
+ hglTranslatef(X, Y, 0);
+ hglRotatef(Angle, 0, 0, 1);
+{$ELSE}
glPushMatrix();
glTranslatef(X, Y, 0);
glRotatef(Angle, 0, 0, 1);
+{$ENDIF}
glBindTexture(GL_TEXTURE_2D, HHTexture^.id);
@@ -487,11 +622,20 @@
TextureBuffer[3].X:= l;
TextureBuffer[3].Y:= b;
- glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
- glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]);
+ SetVertexPointer(@VertexBuffer[0], Length(VertexBuffer));
+ SetTexCoordPointer(@TextureBuffer[0], Length(VertexBuffer));
+
+{$IFDEF GL2}
+ UpdateModelviewProjection;
+{$ENDIF}
+
glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
- glPopMatrix
+{$IFDEF GL2}
+ hglPopMatrix;
+{$ELSE}
+ glPopMatrix;
+{$ENDIF}
end;
procedure DrawScreenWidget(widget: POnScreenWidget);
@@ -505,9 +649,9 @@
if RealTicks > (fadeAnimStart + FADE_ANIM_TIME) then
fadeAnimStart:= 0
else
- if show then
+ if show then
alpha:= Byte(trunc((RealTicks - fadeAnimStart)/FADE_ANIM_TIME * $FF))
- else
+ else
alpha:= Byte($FF - trunc((RealTicks - fadeAnimStart)/FADE_ANIM_TIME * $FF));
end;
@@ -542,7 +686,11 @@
end;
procedure Tint(r, g, b, a: Byte); inline;
-var nc, tw: Longword;
+var
+ nc, tw: Longword;
+ {$IFDEF GL2}
+ scale:Real = 1.0/255.0;
+ {$ENDIF}
begin
nc:= (r shl 24) or (g shl 16) or (b shl 8) or a;
@@ -559,7 +707,12 @@
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;