Esempio n. 1
0
    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);
            }
        }
    }
Esempio n. 2
0
    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;
            }
        }
    }
Esempio n. 3
0
    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;
            }
        }
    }