public static void SphereOverlapAll(EntityManager entityManager, ref NativeList <Entity> hitColliHistoryEntityArray, int tick, int mask, Entity forceExcluded, Entity forceIncluded, sphere sphere, List <HitCollisionData.CollisionResult> results, List <Entity> hitCollisionOwners) { for (var i = 0; i < hitColliHistoryEntityArray.Length; i++) { var entity = hitColliHistoryEntityArray[i]; if (!HitCollisionData.IsRelevant(entityManager, hitColliHistoryEntityArray[i], mask, forceExcluded, forceIncluded)) { continue; } var collectionResult = new HitCollisionData.CollisionResult(); var hit = HitCollisionData.SphereOverlapSingle(entityManager, entity, tick, sphere, ref collectionResult); if (hit) { var hitCollisionData = entityManager.GetComponentData <HitCollisionData>(hitColliHistoryEntityArray[i]); results.Add(collectionResult); hitCollisionOwners.Add(hitCollisionData.hitCollisionOwner); } } }
public void Execute() { // TODO (mogensh) : find all hits and return closest for (var i = 0; i < sphereArray.Length; i++) { var prim = sphereArray[i].prim; var sourceIndex = sphereArray[i].transformIndex; prim = primlib.transform(prim, transformBuffer[sourceIndex].pos, transformBuffer[sourceIndex].rot); var dist = math.distance(sphere.center, prim.center); var hit = dist < sphere.radius + prim.radius; if (hit) { result[0] = new HitCollisionData.CollisionResult() { info = sphereArray[i].info, primCenter = prim.center, hit = 1, sphere = prim, }; return; } } for (var i = 0; i < capsuleArray.Length; i++) { var prim = capsuleArray[i].prim; var sourceIndex = capsuleArray[i].transformIndex; prim = primlib.transform(prim, transformBuffer[sourceIndex].pos, transformBuffer[sourceIndex].rot); var v = prim.p2 - prim.p1; var hit = coll.RayCast(sphere, new ray(prim.p1, math.normalize(v)), math.length(v), prim.radius); if (hit) { result[0] = new HitCollisionData.CollisionResult() { info = capsuleArray[i].info, primCenter = prim.p1 + (prim.p2 - prim.p1) * 0.5f, hit = 1, capsule = prim, }; return; } } for (var i = 0; i < boxArray.Length; i++) { var prim = boxArray[i].prim; var sourceIndex = boxArray[i].transformIndex; var primWorldSpace = primlib.transform(prim, transformBuffer[sourceIndex].pos, transformBuffer[sourceIndex].rot); var hit = true; // TODO (mogensh) SPhere Box collision if (hit) { result[0] = new HitCollisionData.CollisionResult() { info = boxArray[i].info, primCenter = primWorldSpace.center, hit = 1, box = primWorldSpace, }; return; } } }
public void Execute() { // TODO (mogensh) : find all hits and return closest var rayEnd = ray.origin + ray.direction * rayDist; for (var i = 0; i < sphereArray.Length; i++) { var prim = sphereArray[i].prim; var sourceIndex = sphereArray[i].transformIndex; prim = primlib.transform(prim, transformBuffer[sourceIndex].pos, transformBuffer[sourceIndex].rot); var hit = coll.RayCast(prim, ray, rayDist, rayRadius); if (hit) { result[0] = new HitCollisionData.CollisionResult() { info = sphereArray[i].info, primCenter = prim.center, hit = 1, sphere = prim, }; return; } } for (var i = 0; i < capsuleArray.Length; i++) { var prim = capsuleArray[i].prim; var sourceIndex = capsuleArray[i].transformIndex; prim = primlib.transform(prim, transformBuffer[sourceIndex].pos, transformBuffer[sourceIndex].rot); var rayCapsule = new capsule(ray.origin, rayEnd, rayRadius); var hit = InstersectionHelper.IntersectCapsuleCapsule(ref prim, ref rayCapsule); if (hit) { result[0] = new HitCollisionData.CollisionResult() { info = capsuleArray[i].info, primCenter = prim.p1 + (prim.p2 - prim.p1) * 0.5f, hit = 1, capsule = prim, }; return; } } for (var i = 0; i < boxArray.Length; i++) { var prim = boxArray[i].prim; var sourceIndex = boxArray[i].transformIndex; var primWorldSpace = primlib.transform(prim, transformBuffer[sourceIndex].pos, transformBuffer[sourceIndex].rot); var rayCapsule = new capsule(ray.origin, rayEnd, rayRadius); var hit = coll.OverlapCapsuleBox(rayCapsule, primWorldSpace); if (hit) { result[0] = new HitCollisionData.CollisionResult() { info = boxArray[i].info, primCenter = primWorldSpace.center, hit = 1, box = primWorldSpace, }; return; } } }