diff -r 8054d9d775fd -r 2759212a27de hedgewars/uRender.pas --- a/hedgewars/uRender.pas Fri Oct 11 17:43:13 2013 +0200 +++ b/hedgewars/uRender.pas Sat Jan 04 23:55:54 2014 +0400 @@ -45,6 +45,7 @@ procedure DrawCircle (X, Y, Radius, Width: LongInt); procedure DrawCircle (X, Y, Radius, Width: LongInt; r, g, b, a: Byte); +procedure DrawLine (X0, Y0, X1, Y1, Width: Single; color: LongWord); inline; procedure DrawLine (X0, Y0, X1, Y1, Width: Single; r, g, b, a: Byte); procedure DrawFillRect (r: TSDL_Rect); procedure DrawHedgehog (X, Y: LongInt; Dir: LongInt; Pos, Step: LongWord; Angle: real); @@ -52,6 +53,8 @@ procedure Tint (r, g, b, a: Byte); inline; procedure Tint (c: Longword); inline; +procedure untint(); inline; +procedure setTintAdd (f: boolean); inline; implementation uses uVariables; @@ -412,6 +415,9 @@ if (X + SpritesData[Sprite].Width > RightX) then r.w:= RightX - X + 1; +if (r.h < r.y) or (r.w < r.x) then + exit; + dec(r.h, r.y); dec(r.w, r.x); @@ -428,6 +434,11 @@ DrawTexture(X - round(Source^.w * scale) div 2, Top, Source, scale) end; +procedure DrawLine(X0, Y0, X1, Y1, Width: Single; color: LongWord); inline; +begin +DrawLine(X0, Y0, X1, Y1, Width, (color shr 24) and $FF, (color shr 16) and $FF, (color shr 8) and $FF, color and $FF) +end; + procedure DrawLine(X0, Y0, X1, Y1, Width: Single; r, g, b, a: Byte); var VertexBuffer: array [0..1] of TVertex2f; begin @@ -447,8 +458,8 @@ SetVertexPointer(@VertexBuffer[0], Length(VertexBuffer)); glDrawArrays(GL_LINES, 0, Length(VertexBuffer)); - Tint($FF, $FF, $FF, $FF); - + untint; + glPopMatrix; glEnable(GL_TEXTURE_2D); @@ -509,8 +520,7 @@ SetVertexPointer(@VertexBuffer[0], Length(VertexBuffer)); glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); -Tint($FF, $FF, $FF, $FF); - +untint; {$IFDEF GL2} EnableTexture(True); {$ELSE} @@ -522,8 +532,8 @@ procedure DrawCircle(X, Y, Radius, Width: LongInt; r, g, b, a: Byte); begin Tint(r, g, b, a); - DrawCircle(X, Y, Radius, Width); - Tint($FF, $FF, $FF, $FF); + DrawCircle(X, Y, Radius, Width); + untint; end; procedure DrawCircle(X, Y, Radius, Width: LongInt); @@ -666,7 +676,7 @@ begin Tint($FF, $FF, $FF, alpha); DrawTexture(frame.x, frame.y, spritesData[sprite].Texture, buttonScale); - Tint($FF, $FF, $FF, $FF); + untint; end; end; {$ELSE} @@ -680,7 +690,7 @@ nc, tw: Longword; scale:Real = 1.0/255.0; begin - nc:= (a shl 24) or (b shl 16) or (g shl 8) or r; + nc:= (r shl 24) or (g shl 16) or (b shl 8) or a; if nc = lastTint then exit; @@ -706,8 +716,21 @@ procedure Tint(c: Longword); inline; begin + if c = lastTint then exit; Tint(((c shr 24) and $FF), ((c shr 16) and $FF), (c shr 8) and $FF, (c and $FF)) end; +procedure untint(); inline; +begin + Tint($FF, $FF, $FF, $FF) +end; + +procedure setTintAdd(f: boolean); inline; +begin + if f then + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD) + else + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +end; end.