public void PerformExplosion( TSVector2 origin, FP radius, VoltExplosionCallback callback, VoltBodyFilter targetFilter = null, VoltBodyFilter occlusionFilter = null, int ticksBehind = 0, int rayCount = 32) { if (ticksBehind < 0) { throw new ArgumentOutOfRangeException("ticksBehind"); } // Get all target bodies this.PopulateFiltered( origin, radius, targetFilter, ticksBehind, ref this.targetBodies); // Get all occluding bodies this.PopulateFiltered( origin, radius, occlusionFilter, ticksBehind, ref this.occludingBodies); VoltRayCast ray; FP rayWeight = 1.0f / rayCount; FP angleIncrement = (TSMath.Pi * 2.0f) * rayWeight; for (int i = 0; i < rayCount; i++) { TSVector2 normal = VoltMath.Polar(angleIncrement * i); ray = new VoltRayCast(origin, normal, radius); FP minDistance = this.GetOccludingDistance(ray, ticksBehind); minDistance += VoltWorld.EXPLOSION_OCCLUDER_SLOP; this.TestTargets(ray, callback, ticksBehind, minDistance, rayWeight); } }
public void PerformExplosion( Vector2 origin, float radius, VoltExplosionCallback callback, VoltBodyFilter targetFilter = null, VoltBodyFilter occlusionFilter = null, int ticksBehind = 0, int rayCount = 32) { if (ticksBehind < 0) throw new ArgumentOutOfRangeException("ticksBehind"); // Get all target bodies this.PopulateFiltered( origin, radius, targetFilter, ticksBehind, ref this.targetBodies); // Get all occluding bodies this.PopulateFiltered( origin, radius, occlusionFilter, ticksBehind, ref this.occludingBodies); VoltRayCast ray; float rayWeight = 1.0f / rayCount; float angleIncrement = (Mathf.PI * 2.0f) * rayWeight; for (int i = 0; i < rayCount; i++) { Vector2 normal = VoltMath.Polar(angleIncrement * i); ray = new VoltRayCast(origin, normal, radius); float minDistance = this.GetOccludingDistance(ray, ticksBehind); minDistance += VoltWorld.EXPLOSION_OCCLUDER_SLOP; this.TestTargets(ray, callback, ticksBehind, minDistance, rayWeight); } }
/// <summary> /// Tests all valid explosion targets for a given ray. /// </summary> private void TestTargets( VoltRayCast ray, VoltExplosionCallback callback, int ticksBehind, FP minOccluderDistance, FP rayWeight) { for (int i = 0; i < this.targetBodies.Count; i++) { VoltBody targetBody = this.targetBodies[i]; VoltRayResult result = default(VoltRayResult); if (targetBody.RayCast(ref ray, ref result, ticksBehind)) { if (result.Distance < minOccluderDistance) { callback.Invoke(ray, result, rayWeight); } } } }
/// <summary> /// Tests all valid explosion targets for a given ray. /// </summary> private void TestTargets( VoltRayCast ray, VoltExplosionCallback callback, int ticksBehind, float minOccluderDistance, float rayWeight) { for (int i = 0; i < this.targetBodies.Count; i++) { VoltBody targetBody = this.targetBodies[i]; VoltRayResult result = default(VoltRayResult); if (targetBody.RayCast(ref ray, ref result, ticksBehind)) if (result.Distance < minOccluderDistance) callback.Invoke(ray, result, rayWeight); } }