hedgewars/uGearsRender.pas
changeset 15035 a315927a44b2
parent 15024 af2f6f4074de
child 15036 7328f16bd299
equal deleted inserted replaced
15034:981f16edea02 15035:a315927a44b2
    93     EnableTexture(true);
    93     EnableTexture(true);
    94     end
    94     end
    95 end;
    95 end;
    96 
    96 
    97 
    97 
    98 function DrawRopeLine(X1, Y1, X2, Y2, roplen: LongInt; LayerIndex: Longword): LongInt;
    98 procedure DrawRopeLine(X1, Y1, X2, Y2: Real; LayerIndex: Longword; var linesLength, ropeLength: Real);
    99 var  eX, eY, dX, dY: LongInt;
    99 var dX, dY, angle, length: Real;
   100     i, sX, sY, x, y, d: LongInt;
   100     FrameIndex: LongWord;
   101     b: boolean;
       
   102     angle: real;
       
   103 begin
   101 begin
   104     if (X1 = X2) and (Y1 = Y2) then
   102     if (X1 = X2) and (Y1 = Y2) then
   105         begin
   103         exit;
   106         //OutError('WARNING: zero length rope line!', false);
   104 
   107         DrawRopeLine:= 0;
       
   108         exit
       
   109         end;
       
   110     eX:= 0;
       
   111     eY:= 0;
       
   112     dX:= X2 - X1;
   105     dX:= X2 - X1;
   113     dY:= Y2 - Y1;
   106     dY:= Y2 - Y1;
       
   107     length:= sqrt(sqr(dX) + sqr(dY));
   114     angle:= arctan2(dY, dX) * 180 / PI - 90;
   108     angle:= arctan2(dY, dX) * 180 / PI - 90;
   115 
   109 
   116     if (dX > 0) then
   110     dX:= dX / length;
   117         sX:= 1
   111     dY:= dY / length;
   118     else
   112 
   119         if (dX < 0) then
   113     while (ropeLength - linesLength) <= length do
   120             begin
   114     begin
   121             sX:= -1;
   115         FrameIndex:= round(ropeLength / cRopeNodeStep);
   122             dX:= -dX
   116         if (FrameIndex mod cRopeLayers) = LayerIndex then
   123             end
   117             DrawSpriteRotatedFReal(sprRopeNode,
   124         else sX:= dX;
   118                 X1 + (ropeLength - linesLength) * dX,
   125 
   119                 Y1 + (ropeLength - linesLength) * dY,
   126     if (dY > 0) then
   120                 FrameIndex, 1, angle);
   127         sY:= 1
   121         ropeLength:= ropeLength + cRopeNodeStep;
   128     else
       
   129         if (dY < 0) then
       
   130             begin
       
   131             sY:= -1;
       
   132             dY:= -dY
       
   133             end
       
   134         else
       
   135             sY:= dY;
       
   136 
       
   137     if (dX > dY) then
       
   138         d:= dX
       
   139     else
       
   140         d:= dY;
       
   141 
       
   142     x:= X1;
       
   143     y:= Y1;
       
   144 
       
   145     for i:= 0 to d do
       
   146         begin
       
   147         inc(eX, dX);
       
   148         inc(eY, dY);
       
   149         b:= false;
       
   150         if (eX > d) then
       
   151             begin
       
   152             dec(eX, d);
       
   153             inc(x, sX);
       
   154             b:= true
       
   155             end;
       
   156         if (eY > d) then
       
   157             begin
       
   158             dec(eY, d);
       
   159             inc(y, sY);
       
   160             b:= true
       
   161             end;
       
   162         if b then
       
   163             begin
       
   164             inc(roplen);
       
   165             if (roplen mod (cRopeNodeStep * cRopeLayers)) = (cRopeNodeStep * LayerIndex) then
       
   166                 DrawSpriteRotatedF(sprRopeNode, x, y, roplen div cRopeNodeStep, 1, angle);
       
   167             end
       
   168     end;
   122     end;
   169     DrawRopeLine:= roplen;
   123     linesLength:= linesLength + length
   170 end;
   124 end;
   171 
   125 
   172 procedure DrawRopeLayer(Gear: PGear; LayerIndex: LongWord);
   126 procedure DrawRopeLayer(Gear: PGear; LayerIndex: LongWord);
   173 var roplen, i: LongInt;
   127 var i: LongInt;
       
   128     linesLength, ropeLength: Real;
   174 begin
   129 begin
   175     roplen:= 0;
   130     linesLength:= 0;
       
   131     ropeLength:= cRopeNodeStep;
   176     if RopePoints.Count > 0 then
   132     if RopePoints.Count > 0 then
   177     begin
   133     begin
   178         i:= 0;
   134         i:= 0;
   179         while i < Pred(RopePoints.Count) do
   135         while i < Pred(RopePoints.Count) do
   180         begin
   136         begin
   181             roplen:= DrawRopeLine(hwRound(RopePoints.ar[i].X) + WorldDx, hwRound(RopePoints.ar[i].Y) + WorldDy,
   137             DrawRopeLine(hwFloat2Float(RopePoints.ar[i].X) + WorldDx, hwFloat2Float(RopePoints.ar[i].Y) + WorldDy,
   182                                   hwRound(RopePoints.ar[Succ(i)].X) + WorldDx, hwRound(RopePoints.ar[Succ(i)].Y) + WorldDy, roplen, LayerIndex);
   138                          hwFloat2Float(RopePoints.ar[Succ(i)].X) + WorldDx, hwFloat2Float(RopePoints.ar[Succ(i)].Y) + WorldDy,
       
   139                          LayerIndex, linesLength, ropeLength);
   183             inc(i)
   140             inc(i)
   184         end;
   141         end;
   185         roplen:= DrawRopeLine(hwRound(RopePoints.ar[i].X) + WorldDx, hwRound(RopePoints.ar[i].Y) + WorldDy,
   142 
   186                               hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, roplen, LayerIndex);
   143         DrawRopeLine(hwFloat2Float(RopePoints.ar[i].X) + WorldDx, hwFloat2Float(RopePoints.ar[i].Y) + WorldDy,
   187         roplen:= DrawRopeLine(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy,
   144                      hwFloat2Float(Gear^.X) + WorldDx, hwFloat2Float(Gear^.Y) + WorldDy,
   188                               hwRound(Gear^.Hedgehog^.Gear^.X) + WorldDx, hwRound(Gear^.Hedgehog^.Gear^.Y) + WorldDy, roplen, LayerIndex);
   145                      LayerIndex, linesLength, ropeLength);
       
   146 
       
   147         DrawRopeLine(hwFloat2Float(Gear^.X) + WorldDx, hwFloat2Float(Gear^.Y) + WorldDy,
       
   148                      hwFloat2Float(Gear^.Hedgehog^.Gear^.X) + WorldDx, hwFloat2Float(Gear^.Hedgehog^.Gear^.Y) + WorldDy,
       
   149                      LayerIndex, linesLength, ropeLength);
   189     end
   150     end
   190     else
   151     else
   191         if Gear^.Elasticity.QWordValue > 0 then
   152         if Gear^.Elasticity.QWordValue > 0 then
   192             roplen:= DrawRopeLine(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy,
   153             DrawRopeLine(hwFloat2Float(Gear^.X) + WorldDx, hwFloat2Float(Gear^.Y) + WorldDy,
   193                                   hwRound(Gear^.Hedgehog^.Gear^.X) + WorldDx, hwRound(Gear^.Hedgehog^.Gear^.Y) + WorldDy, roplen, LayerIndex);
   154                          hwFloat2Float(Gear^.Hedgehog^.Gear^.X) + WorldDx, hwFloat2Float(Gear^.Hedgehog^.Gear^.Y) + WorldDy,
       
   155                          LayerIndex, linesLength, ropeLength);
   194 end;
   156 end;
   195 
   157 
   196 procedure DrawRope(Gear: PGear);
   158 procedure DrawRope(Gear: PGear);
   197 var i: LongInt;
   159 var i: LongInt;
   198 begin
   160 begin