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; |