hedgewars/uCollisions.pas
changeset 15655 116307c752f6
parent 15646 c2a1a34d1841
child 15656 c34cad72cd85
equal deleted inserted replaced
15654:c1d0ada72cc8 15655:116307c752f6
    68 function  CheckCacheCollision(SourceGear: PGear): PGearArray;
    68 function  CheckCacheCollision(SourceGear: PGear): PGearArray;
    69 
    69 
    70 function  CheckGearsLineCollision(Gear: PGear; oX, oY, tX, tY: hwFloat): PGearArray;
    70 function  CheckGearsLineCollision(Gear: PGear; oX, oY, tX, tY: hwFloat): PGearArray;
    71 function  CheckAllGearsLineCollision(SourceGear: PGear; oX, oY, tX, tY: hwFloat): PGearArray;
    71 function  CheckAllGearsLineCollision(SourceGear: PGear; oX, oY, tX, tY: hwFloat): PGearArray;
    72 
    72 
    73 function  UpdateHitOrder(Gear: PGear; Order: LongInt): boolean;
    73 function  UpdateHitOrder(Gear: PGear; Order: LongInt): boolean; inline;
    74 procedure ClearHitOrderLeq(MinOrder: LongInt);
    74 function  UpdateGlobalHitOrder(Gear: PGear; Order: LongInt): boolean; inline;
       
    75 procedure ClearHitOrderLeq(MinOrder: LongInt); inline;
       
    76 procedure ClearGlobalHitOrderLeq(MinOrder: LongInt); inline;
    75 procedure ClearHitOrder();
    77 procedure ClearHitOrder();
    76 
    78 
    77 procedure RefillProximityCache(SourceGear: PGear; radius: LongInt);
    79 procedure RefillProximityCache(SourceGear: PGear; radius: LongInt);
    78 procedure RemoveFromProximityCache(Gear: PGear);
    80 procedure RemoveFromProximityCache(Gear: PGear);
    79 procedure ClearProximityCache();
    81 procedure ClearProximityCache();
   120 const MAXRECTSINDEX = 1023;
   122 const MAXRECTSINDEX = 1023;
   121 var Count: Longword;
   123 var Count: Longword;
   122     cinfos: array[0..MAXRECTSINDEX] of TCollisionEntry;
   124     cinfos: array[0..MAXRECTSINDEX] of TCollisionEntry;
   123     ga: TGearArray;
   125     ga: TGearArray;
   124     ordera: TGearHitOrder;
   126     ordera: TGearHitOrder;
       
   127     globalordera: TGearHitOrder;
   125     proximitya: TGearProximityCache;
   128     proximitya: TGearProximityCache;
   126 
   129 
   127 procedure AddCI(Gear: PGear);
   130 procedure AddCI(Gear: PGear);
   128 begin
   131 begin
   129 if (Gear^.CollisionIndex >= 0) or (Count > MAXRECTSINDEX) or
   132 if (Gear^.CollisionIndex >= 0) or (Count > MAXRECTSINDEX) or
   338             inc(ga.Count)
   341             inc(ga.Count)
   339         end;
   342         end;
   340     end;
   343     end;
   341 end;
   344 end;
   342 
   345 
   343 function UpdateHitOrder(Gear: PGear; Order: LongInt): boolean;
   346 function UpdateHitOrderImpl(HitOrder: PGearHitOrder; Gear: PGear; Order: LongInt): boolean;
   344 var i: LongInt;
   347 var i: LongInt;
   345 begin
   348 begin
   346 UpdateHitOrder:= true;
   349     UpdateHitOrderImpl:= true;
   347 for i:= 0 to ordera.Count - 1 do
   350     for i := 0 to HitOrder^.Count - 1 do
   348     if ordera.ar[i] = Gear then
   351         if HitOrder^.ar[i] = Gear then
   349         begin
   352         begin
   350         if Order <= ordera.order[i] then UpdateHitOrder:= false;
   353             if Order <= HitOrder^.order[i] then
   351         ordera.order[i]:= Max(ordera.order[i], order);
   354                 UpdateHitOrderImpl := false;
   352         exit;
   355             HitOrder^.order[i] := Max(HitOrder^.order[i], Order);
   353         end;
   356             exit;
   354 
   357         end;
   355 if ordera.Count > cMaxGearHitOrderInd then
   358 
   356     UpdateHitOrder:= false
   359     if HitOrder^.Count > cMaxGearHitOrderInd then
   357 else
   360         UpdateHitOrderImpl := false
   358     begin
   361     else
   359     ordera.ar[ordera.Count]:= Gear;
   362     begin
   360     ordera.order[ordera.Count]:= Order;
   363         HitOrder^.ar[HitOrder^.Count] := Gear;
   361     Inc(ordera.Count);
   364         HitOrder^.order[HitOrder^.Count] := Order;
       
   365         Inc(HitOrder^.Count);
   362     end
   366     end
   363 end;
   367 end;
   364 
   368 
   365 procedure ClearHitOrderLeq(MinOrder: LongInt);
   369 function UpdateHitOrder(Gear: PGear; Order: LongInt): boolean; inline;
       
   370 begin
       
   371     UpdateHitOrder := UpdateHitOrderImpl(@ordera, Gear, Order);
       
   372 end;
       
   373 
       
   374 function UpdateGlobalHitOrder(Gear: PGear; Order: LongInt): boolean; inline;
       
   375 begin
       
   376     UpdateGlobalHitOrder := UpdateHitOrderImpl(@globalordera, Gear, Order);
       
   377 end;
       
   378 
       
   379 procedure ClearHitOrderLeqImpl(HitOrder: PGearHitOrder; MinOrder: LongInt);
   366 var i, freeIndex: LongInt;
   380 var i, freeIndex: LongInt;
   367 begin;
   381 begin;
   368 freeIndex:= 0;
   382     freeIndex:= 0;
   369 i:= 0;
   383     i:= 0;
   370 
   384 
   371 while i < ordera.Count do
   385     while i < ordera.Count do
   372     begin
   386     begin
   373         if ordera.order[i] <= MinOrder then
   387         if HitOrder^.order[i] <= MinOrder then
   374             Dec(ordera.Count)
   388             Dec(HitOrder^.Count)
   375         else
   389         else
   376             begin
   390         begin
   377                 if freeIndex < i then
   391             if freeIndex < i then
   378                 begin
   392             begin
   379                 ordera.ar[freeIndex]:= ordera.ar[i];
   393                 HitOrder^.ar[freeIndex]:= HitOrder^.ar[i];
   380                 ordera.order[freeIndex]:= ordera.order[i];
   394                 HitOrder^.order[freeIndex]:= HitOrder^.order[i];
   381                 end;
   395             end;
   382             Inc(freeIndex);
   396             Inc(freeIndex);
   383             end;
   397         end;
   384         Inc(i)
   398         Inc(i)
   385     end
   399     end
       
   400 end;
       
   401 
       
   402 procedure ClearHitOrderLeq(MinOrder: LongInt); inline;
       
   403 begin
       
   404     ClearHitOrderLeqImpl(@ordera, MinOrder);
       
   405 end;
       
   406 
       
   407 procedure ClearGlobalHitOrderLeq(MinOrder: LongInt); inline;
       
   408 begin
       
   409     ClearHitOrderLeqImpl(@globalordera, MinOrder);
   386 end;
   410 end;
   387 
   411 
   388 procedure ClearHitOrder();
   412 procedure ClearHitOrder();
   389 begin
   413 begin
   390     ordera.Count:= 0;
   414     ordera.Count:= 0;