hedgewars/uLandOutline.pas
branchtransitional_engine
changeset 16065 7b8d96fc8799
parent 16064 0caa3dfb3ba2
--- a/hedgewars/uLandOutline.pas	Wed Sep 18 13:42:26 2024 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,182 +0,0 @@
-unit uLandOutline;
-
-interface
-
-uses uConsts, SDLh, uFloat;
-
-type TPixAr = record
-              Count: Longword;
-              ar: array[0..Pred(cMaxEdgePoints)] of TPoint;
-              end;
-
-procedure DrawEdge(var pa: TPixAr; value: Word);
-procedure BezierizeEdge(var pa: TPixAr; Delta: hwFloat);
-
-implementation
-
-uses uLandGraphics, uDebug, uVariables, uLandTemplates;
-
-
-var Stack: record
-           Count: Longword;
-           points: array[0..8192] of record
-                                     xl, xr, y, dir: LongInt;
-                                     end
-           end;
-
-
-procedure Push(_xl, _xr, _y, _dir: LongInt);
-begin
-    if checkFails(Stack.Count <= 8192, 'FillLand: stack overflow', true) then exit;
-    _y:= _y + _dir;
-    if (_y < 0) or (_y >= LAND_HEIGHT) then
-        exit;
-    with Stack.points[Stack.Count] do
-        begin
-        xl:= _xl;
-        xr:= _xr;
-        y:= _y;
-        dir:= _dir
-        end;
-    inc(Stack.Count)
-end;
-
-procedure Pop(var _xl, _xr, _y, _dir: LongInt);
-begin
-    dec(Stack.Count);
-    with Stack.points[Stack.Count] do
-        begin
-        _xl:= xl;
-        _xr:= xr;
-        _y:= y;
-        _dir:= dir
-        end
-end;
-
-procedure DrawEdge(var pa: TPixAr; value: Word);
-var i: LongInt;
-begin
-    i:= 0;
-    with pa do
-        while i < LongInt(Count) - 1 do
-            if (ar[i + 1].X = NTPX) then
-                inc(i, 2)
-            else
-                begin
-                DrawLine(ar[i].x, ar[i].y, ar[i + 1].x, ar[i + 1].y, value);
-                inc(i)
-                end
-end;
-
-
-procedure Vector(p1, p2, p3: TPoint; var Vx, Vy: hwFloat);
-var d1, d2, d: hwFloat;
-begin
-    Vx:= int2hwFloat(p1.X - p3.X);
-    Vy:= int2hwFloat(p1.Y - p3.Y);
-
-    d2:= Distance(Vx, Vy);
-
-    if d2.QWordValue = 0 then
-        begin
-        Vx:= _0;
-        Vy:= _0
-        end
-    else
-        begin
-        d:= DistanceI(p2.X - p1.X, p2.Y - p1.Y);
-        d1:= DistanceI(p2.X - p3.X, p2.Y - p3.Y);
-
-        if d1 < d then
-            d:= d1;
-        if d2 < d then
-            d:= d2;
-
-        d2:= d * _1div3 / d2;
-
-        Vx:= Vx * d2;
-        Vy:= Vy * d2
-        end
-end;
-
-procedure AddLoopPoints(var pa, opa: TPixAr; StartI, EndI: LongInt; Delta: hwFloat);
-var i, pi, ni: LongInt;
-    NVx, NVy, PVx, PVy: hwFloat;
-    x1, x2, y1, y2: LongInt;
-    tsq, tcb, t, r1, r2, r3, cx1, cx2, cy1, cy2: hwFloat;
-    X, Y: LongInt;
-begin
-    if pa.Count < cMaxEdgePoints - 2 then
-        begin
-        pi:= EndI;
-        i:= StartI;
-        ni:= Succ(StartI);
-        {$HINTS OFF}
-        Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy);
-        {$HINTS ON}
-        repeat
-            i:= ni;
-            inc(pi);
-            if pi > EndI then
-                pi:= StartI;
-            inc(ni);
-            if ni > EndI then
-                ni:= StartI;
-            PVx:= NVx;
-            PVy:= NVy;
-            Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy);
-
-            x1:= opa.ar[pi].x;
-            y1:= opa.ar[pi].y;
-            x2:= opa.ar[i].x;
-            y2:= opa.ar[i].y;
-
-            cx1:= int2hwFloat(x1) - PVx;
-            cy1:= int2hwFloat(y1) - PVy;
-            cx2:= int2hwFloat(x2) + NVx;
-            cy2:= int2hwFloat(y2) + NVy;
-            t:= _0;
-            while (t.Round = 0) and (pa.Count < cMaxEdgePoints-2) do
-                begin
-                tsq:= t * t;
-                tcb:= tsq * t;
-                r1:= (_1 - t*3 + tsq*3 - tcb);
-                r2:= (     t*3 - tsq*6 + tcb*3);
-                r3:= (           tsq*3 - tcb*3);
-                X:= hwRound(r1 * x1 + r2 * cx1 + r3 * cx2 + tcb * x2);
-                Y:= hwRound(r1 * y1 + r2 * cy1 + r3 * cy2 + tcb * y2);
-                t:= t + Delta;
-                pa.ar[pa.Count].x:= X;
-                pa.ar[pa.Count].y:= Y;
-                inc(pa.Count);
-                //TryDo(pa.Count <= cMaxEdgePoints, 'Edge points overflow', true)
-                end;
-        until i = StartI;
-        end;
-
-    pa.ar[pa.Count].x:= opa.ar[StartI].X;
-    pa.ar[pa.Count].y:= opa.ar[StartI].Y;
-    inc(pa.Count)
-end;
-
-procedure BezierizeEdge(var pa: TPixAr; Delta: hwFloat);
-var i, StartLoop: LongInt;
-    opa: TPixAr;
-begin
-opa:= pa;
-pa.Count:= 0;
-i:= 0;
-StartLoop:= 0;
-while (i < LongInt(opa.Count)) and (pa.Count < cMaxEdgePoints-1) do
-    if (opa.ar[i + 1].X = NTPX) then
-        begin
-        AddLoopPoints(pa, opa, StartLoop, i, Delta);
-        inc(i, 2);
-        StartLoop:= i;
-        pa.ar[pa.Count].X:= NTPX;
-        pa.ar[pa.Count].Y:= 0;
-        inc(pa.Count);
-        end else inc(i)
-end;
-
-end.