hedgewars/uRender.pas
changeset 10325 7315870716f2
parent 10324 5d90d8ca9657
child 10326 1748eed62a95
--- a/hedgewars/uRender.pas	Wed Jun 18 01:37:28 2014 +0200
+++ b/hedgewars/uRender.pas	Wed Jun 18 15:42:01 2014 +0200
@@ -54,7 +54,7 @@
 procedure DrawRect              (rect: TSDL_Rect; r, g, b, a: Byte; Fill: boolean);
 procedure DrawHedgehog          (X, Y: LongInt; Dir: LongInt; Pos, Step: LongWord; Angle: real);
 procedure DrawScreenWidget      (widget: POnScreenWidget);
-procedure DrawWaterBody         (pVertexBuffer: Pointer);
+procedure DrawWater             (Alpha: byte; OffsetY, OffsetX: LongInt);
 
 procedure RenderClear           ();
 procedure RenderSetClearColor      (r, g, b, a: real);
@@ -1290,22 +1290,137 @@
     openglUseColorOnly(false);
 end;
 
-procedure DrawWaterBody(pVertexBuffer: Pointer);
+procedure DrawWater(Alpha: byte; OffsetY, OffsetX: LongInt);
+var VertexBuffer : array [0..7] of TVertex2f;
+    watertop, lx, rx, firsti, afteri, n: LongInt;
 begin
-        UpdateModelviewProjection;
+
+// those
+firsti:= -1;
+afteri:=  0;
+
+watertop:= OffsetY + WorldDy + cWaterLine;
+
+if watertop < 0 then
+    watertop:= 0;
+
+// if no walls are needed, then bottom water surface spans full view width
+if (WorldEdge <> weSea) then
+    begin
+    lx:= ViewLeftX;
+    rx:= ViewRightX;
+    end
+else
+    begin
+    lx:= LeftX  + WorldDx - OffsetX;
+    rx:= RightX + WorldDx + OffsetX;
 
-        BeginWater;
+    if lx > ViewLeftX then
+        begin
+        VertexBuffer[0].X:= ViewLeftX;
+        VertexBuffer[0].Y:= ViewTopY;
+        VertexBuffer[1].X:= lx;
+        VertexBuffer[1].Y:= ViewTopY;
+        // shares vertices 2 and 3 with bottom water
+        firsti:= 0;
+        afteri:= 4;
+        end;
+
+    if rx < ViewRightX then
+        begin
+        VertexBuffer[6].X:= ViewRightX;
+        VertexBuffer[6].Y:= ViewTopY;
+        VertexBuffer[7].X:= rx;
+        VertexBuffer[7].Y:= ViewTopY;
+        // shares vertices 4 and 5 with bottom water
+        if firsti < 0 then
+            firsti:= 4;
+        afteri:= 8;
+        end;
+    end;
+
+if watertop < ViewBottomY then
+    begin
+    // shares vertices 2-5 with water walls
+
+    // starts at vertex 2
+    if (firsti < 0) or (firsti > 2) then
+        firsti:= 2;
+    // ends at vertex 5
+    if afteri < 6 then
+        afteri:= 6;
+    end;
+
+if firsti < 0 then
+    exit; // nothing to draw at all!
 
-        if SuddenDeathDmg then
-            SetColorPointer(@SDWaterColorArray[0], 4)
-        else
-            SetColorPointer(@WaterColorArray[0], 4);
+if firsti < 4 then
+    begin
+    VertexBuffer[2].X:= ViewLeftX;
+    VertexBuffer[2].Y:= ViewBottomY;
+    VertexBuffer[3].X:= lx;
+    VertexBuffer[3].Y:= watertop;
+    end;
+
+if afteri > 4 then
+    begin
+    VertexBuffer[4].X:= ViewRightX;
+    VertexBuffer[4].Y:= ViewBottomY;
+    VertexBuffer[5].X:= rx;
+    VertexBuffer[5].Y:= watertop;
+    end;
+
+// number of points to draw
+n:= afteri - firsti;
+
+// drawing time
+
+UpdateModelviewProjection;
+
+BeginWater;
 
-        SetVertexPointer(pVertexBuffer, 4);
+if SuddenDeathDmg then
+    begin // only set alpha if it differs from what we want
+    if SDWaterColorArray[0].a <> Alpha then
+        begin
+        SDWaterColorArray[0].a := Alpha;
+        SDWaterColorArray[1].a := Alpha;
+        SDWaterColorArray[2].a := Alpha;
+        SDWaterColorArray[3].a := Alpha;
+        SDWaterColorArray[4].a := Alpha;
+        SDWaterColorArray[5].a := Alpha;
+        SDWaterColorArray[6].a := Alpha;
+        SDWaterColorArray[7].a := Alpha;
+        end;
+    SetColorPointer(@SDWaterColorArray[0], 8);
+    end
+else
+    begin
+    if WaterColorArray[0].a <> Alpha then
+        begin
+        WaterColorArray[0].a := Alpha;
+        WaterColorArray[1].a := Alpha;
+        WaterColorArray[2].a := Alpha;
+        WaterColorArray[3].a := Alpha;
+        WaterColorArray[4].a := Alpha;
+        WaterColorArray[5].a := Alpha;
+        WaterColorArray[6].a := Alpha;
+        WaterColorArray[7].a := Alpha;
+        end;
+    SetColorPointer(@WaterColorArray[0], 8);
+    end;
 
-        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+SetVertexPointer(@VertexBuffer[0], 8);
+
+glDrawArrays(GL_TRIANGLE_STRIP, firsti, n);
+
+EndWater;
 
-        EndWater;
+
+{$IFNDEF GL2}
+// must not be Tint() as color array seems to stay active and color reset is required
+glColor4ub($FF, $FF, $FF, $FF);
+{$ENDIF}
 end;
 
 procedure openglTint(r, g, b, a: Byte); inline;