hedgewars/uLandOutline.pas
changeset 10485 05b771423b95
parent 10483 1f58cb4aa773
child 10510 9329dab04490
equal deleted inserted replaced
10484:2dea4070904a 10485:05b771423b95
   142     NVx, NVy, PVx, PVy: hwFloat;
   142     NVx, NVy, PVx, PVy: hwFloat;
   143     x1, x2, y1, y2: LongInt;
   143     x1, x2, y1, y2: LongInt;
   144     tsq, tcb, t, r1, r2, r3, cx1, cx2, cy1, cy2: hwFloat;
   144     tsq, tcb, t, r1, r2, r3, cx1, cx2, cy1, cy2: hwFloat;
   145     X, Y: LongInt;
   145     X, Y: LongInt;
   146 begin
   146 begin
   147 if pa.Count >= cMaxEdgePoints-1 then exit;
   147     if pa.Count < cMaxEdgePoints - 2 then
   148 pi:= EndI;
   148         begin
   149 i:= StartI;
   149         pi:= EndI;
   150 ni:= Succ(StartI);
       
   151 {$HINTS OFF}
       
   152 Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy);
       
   153 {$HINTS ON}
       
   154 repeat
       
   155     inc(pi);
       
   156     if pi > EndI then
       
   157         pi:= StartI;
       
   158     inc(i);
       
   159     if i > EndI then
       
   160         i:= StartI;
   150         i:= StartI;
   161     inc(ni);
   151         ni:= Succ(StartI);
   162     if ni > EndI then
   152         {$HINTS OFF}
   163         ni:= StartI;
   153         Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy);
   164     PVx:= NVx;
   154         {$HINTS ON}
   165     PVy:= NVy;
   155         repeat
   166     Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy);
   156             i:= ni;
   167 
   157             inc(pi);
   168     x1:= opa.ar[pi].x;
   158             if pi > EndI then
   169     y1:= opa.ar[pi].y;
   159                 pi:= StartI;
   170     x2:= opa.ar[i].x;
   160             inc(ni);
   171     y2:= opa.ar[i].y;
   161             if ni > EndI then
   172     cx1:= int2hwFloat(x1) - PVx;
   162                 ni:= StartI;
   173     cy1:= int2hwFloat(y1) - PVy;
   163             PVx:= NVx;
   174     cx2:= int2hwFloat(x2) + NVx;
   164             PVy:= NVy;
   175     cy2:= int2hwFloat(y2) + NVy;
   165             Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy);
   176     t:= _0;
   166 
   177     while (t.Round = 0) and (pa.Count < cMaxEdgePoints-2) do
   167             x1:= opa.ar[pi].x;
   178         begin
   168             y1:= opa.ar[pi].y;
   179         tsq:= t * t;
   169             x2:= opa.ar[i].x;
   180         tcb:= tsq * t;
   170             y2:= opa.ar[i].y;
   181         r1:= (_1 - t*3 + tsq*3 - tcb);
   171 
   182         r2:= (     t*3 - tsq*6 + tcb*3);
   172             cx1:= int2hwFloat(x1) - PVx;
   183         r3:= (           tsq*3 - tcb*3);
   173             cy1:= int2hwFloat(y1) - PVy;
   184         X:= hwRound(r1 * x1 + r2 * cx1 + r3 * cx2 + tcb * x2);
   174             cx2:= int2hwFloat(x2) + NVx;
   185         Y:= hwRound(r1 * y1 + r2 * cy1 + r3 * cy2 + tcb * y2);
   175             cy2:= int2hwFloat(y2) + NVy;
   186         t:= t + Delta;
   176             t:= _0;
   187         pa.ar[pa.Count].x:= X;
   177             while (t.Round = 0) and (pa.Count < cMaxEdgePoints-2) do
   188         pa.ar[pa.Count].y:= Y;
   178                 begin
   189         inc(pa.Count);
   179                 tsq:= t * t;
   190         //TryDo(pa.Count <= cMaxEdgePoints, 'Edge points overflow', true)
   180                 tcb:= tsq * t;
       
   181                 r1:= (_1 - t*3 + tsq*3 - tcb);
       
   182                 r2:= (     t*3 - tsq*6 + tcb*3);
       
   183                 r3:= (           tsq*3 - tcb*3);
       
   184                 X:= hwRound(r1 * x1 + r2 * cx1 + r3 * cx2 + tcb * x2);
       
   185                 Y:= hwRound(r1 * y1 + r2 * cy1 + r3 * cy2 + tcb * y2);
       
   186                 t:= t + Delta;
       
   187                 pa.ar[pa.Count].x:= X;
       
   188                 pa.ar[pa.Count].y:= Y;
       
   189                 inc(pa.Count);
       
   190                 //TryDo(pa.Count <= cMaxEdgePoints, 'Edge points overflow', true)
       
   191                 end;
       
   192         until i = StartI;
   191         end;
   193         end;
   192 until i = StartI;
   194 
   193 pa.ar[pa.Count].x:= opa.ar[StartI].X;
   195     pa.ar[pa.Count].x:= opa.ar[StartI].X;
   194 pa.ar[pa.Count].y:= opa.ar[StartI].Y;
   196     pa.ar[pa.Count].y:= opa.ar[StartI].Y;
   195 inc(pa.Count)
   197     inc(pa.Count)
   196 end;
   198 end;
   197 
   199 
   198 procedure BezierizeEdge(var pa: TPixAr; Delta: hwFloat);
   200 procedure BezierizeEdge(var pa: TPixAr; Delta: hwFloat);
   199 var i, StartLoop: LongInt;
   201 var i, StartLoop: LongInt;
   200     opa: TPixAr;
   202     opa: TPixAr;