hedgewars/uLandOutline.pas
changeset 10483 1f58cb4aa773
parent 10197 c57798251b55
child 10485 05b771423b95
equal deleted inserted replaced
10482:b49b82351ad3 10483:1f58cb4aa773
   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 pi:= EndI;
   148 pi:= EndI;
   148 i:= StartI;
   149 i:= StartI;
   149 ni:= Succ(StartI);
   150 ni:= Succ(StartI);
   150 {$HINTS OFF}
   151 {$HINTS OFF}
   151 Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy);
   152 Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy);
   171     cx1:= int2hwFloat(x1) - PVx;
   172     cx1:= int2hwFloat(x1) - PVx;
   172     cy1:= int2hwFloat(y1) - PVy;
   173     cy1:= int2hwFloat(y1) - PVy;
   173     cx2:= int2hwFloat(x2) + NVx;
   174     cx2:= int2hwFloat(x2) + NVx;
   174     cy2:= int2hwFloat(y2) + NVy;
   175     cy2:= int2hwFloat(y2) + NVy;
   175     t:= _0;
   176     t:= _0;
   176     while t.Round = 0 do
   177     while (t.Round = 0) and (pa.Count < cMaxEdgePoints-2) do
   177         begin
   178         begin
   178         tsq:= t * t;
   179         tsq:= t * t;
   179         tcb:= tsq * t;
   180         tcb:= tsq * t;
   180         r1:= (_1 - t*3 + tsq*3 - tcb);
   181         r1:= (_1 - t*3 + tsq*3 - tcb);
   181         r2:= (     t*3 - tsq*6 + tcb*3);
   182         r2:= (     t*3 - tsq*6 + tcb*3);
   184         Y:= hwRound(r1 * y1 + r2 * cy1 + r3 * cy2 + tcb * y2);
   185         Y:= hwRound(r1 * y1 + r2 * cy1 + r3 * cy2 + tcb * y2);
   185         t:= t + Delta;
   186         t:= t + Delta;
   186         pa.ar[pa.Count].x:= X;
   187         pa.ar[pa.Count].x:= X;
   187         pa.ar[pa.Count].y:= Y;
   188         pa.ar[pa.Count].y:= Y;
   188         inc(pa.Count);
   189         inc(pa.Count);
   189         TryDo(pa.Count <= cMaxEdgePoints, 'Edge points overflow', true)
   190         //TryDo(pa.Count <= cMaxEdgePoints, 'Edge points overflow', true)
   190         end;
   191         end;
   191 until i = StartI;
   192 until i = StartI;
   192 pa.ar[pa.Count].x:= opa.ar[StartI].X;
   193 pa.ar[pa.Count].x:= opa.ar[StartI].X;
   193 pa.ar[pa.Count].y:= opa.ar[StartI].Y;
   194 pa.ar[pa.Count].y:= opa.ar[StartI].Y;
   194 inc(pa.Count)
   195 inc(pa.Count)
   200 begin
   201 begin
   201 opa:= pa;
   202 opa:= pa;
   202 pa.Count:= 0;
   203 pa.Count:= 0;
   203 i:= 0;
   204 i:= 0;
   204 StartLoop:= 0;
   205 StartLoop:= 0;
   205 while i < LongInt(opa.Count) do
   206 while (i < LongInt(opa.Count)) and (pa.Count < cMaxEdgePoints-1) do
   206     if (opa.ar[i + 1].X = NTPX) then
   207     if (opa.ar[i + 1].X = NTPX) then
   207         begin
   208         begin
   208         AddLoopPoints(pa, opa, StartLoop, i, Delta);
   209         AddLoopPoints(pa, opa, StartLoop, i, Delta);
   209         inc(i, 2);
   210         inc(i, 2);
   210         StartLoop:= i;
   211         StartLoop:= i;