protected unsafe override void OnUpdate()
        {
            var warpZoneBodies = new NativeArray <ColliderBody>(m_warpZoneQuery.CalculateEntityCount(), Allocator.TempJob, NativeArrayOptions.UninitializedMemory);

            Entities.WithAll <GravityWarpZoneTag>().WithStoreEntityQueryInField(ref m_warpZoneQuery).
            ForEach((Entity entity, int entityInQueryIndex, in LocalToWorld ltw, in GravityWarpZoneRadius radius) =>
            {
                warpZoneBodies[entityInQueryIndex] = new ColliderBody
                {
                    collider  = new SphereCollider(0f, radius.radius),
                    transform = new RigidTransform(quaternion.LookRotationSafe(ltw.Forward, ltw.Up), ltw.Position),
                    entity    = entity
                };
            }).ScheduleParallel();
        protected override void OnUpdate()
        {
            var bodies = new NativeArray <ColliderBody>(m_query.CalculateEntityCount(), Allocator.TempJob, NativeArrayOptions.UninitializedMemory);

            Entities.WithAll <ExplosionTag>().WithStoreEntityQueryInField(ref m_query).ForEach((Entity entity, int entityInQueryIndex, in Translation translation, in Scale scale) =>
            {
                var sphere = new SphereCollider(0f, scale.Value / 2f);                  //convert diameter to radius
                bodies[entityInQueryIndex] = new ColliderBody
                {
                    entity    = entity,
                    transform = new RigidTransform(quaternion.identity, translation.Value),
                    collider  = sphere
                };
            }).ScheduleParallel();
        private JobHandle BuildRadarLayer(FactionMember factionMember, out CollisionLayer layer, JobHandle inputDeps)
        {
            m_radars.SetSharedComponentFilter(factionMember);
            int count  = m_radars.CalculateEntityCount();
            var bodies = new NativeArray <ColliderBody>(count, Allocator.TempJob);
            var aabbs  = new NativeArray <Aabb>(count, Allocator.TempJob);
            var jh     = Entities.WithAll <AiRadarTag>().WithSharedComponentFilter(factionMember).WithStoreEntityQueryInField(ref m_radars)
                         .ForEach((Entity e, int entityInQueryIndex, in AiShipRadar radar, in LocalToWorld ltw) =>
            {
                var transform = new RigidTransform(quaternion.LookRotationSafe(ltw.Forward, ltw.Up), ltw.Position);
                var sphere    = new SphereCollider(0f, radar.distance);
                if (radar.cosFov < 0f)
                {
                    //Todo: Create tighter bounds here too.
                    aabbs[entityInQueryIndex] = Physics.CalculateAabb(sphere, transform);
                }
                else
                {
                    //Compute aabb of vertex and spherical cap points which are extreme points
                    float3 forward            = math.forward(transform.rot);
                    bool3 positiveOnSphereCap = forward > radar.cosFov;
                    bool3 negativeOnSphereCap = -forward > radar.cosFov;
                    float3 min = math.select(0f, -radar.distance, negativeOnSphereCap);
                    float3 max = math.select(0f, radar.distance, positiveOnSphereCap);
                    Aabb aabb  = new Aabb(min, max);

                    //Compute aabb of circle base
                    float4 cos                = new float4(forward, radar.cosFov);
                    float4 sinSq              = 1f - (cos * cos);
                    float4 sin                = math.sqrt(sinSq);
                    float3 center             = forward * radar.distance * radar.cosFov;
                    float radius              = radar.distance * sin.w;
                    float3 extents            = sin.xyz * radius;
                    min                       = center - extents;
                    max                       = center + extents;
                    aabb.min                  = math.min(aabb.min, min) + transform.pos;
                    aabb.max                  = math.max(aabb.max, max) + transform.pos;
                    aabbs[entityInQueryIndex] = aabb;
                }

                bodies[entityInQueryIndex] = new ColliderBody
                {
                    collider  = sphere,
                    entity    = e,
                    transform = transform
                };
            }).ScheduleParallel(inputDeps);
Example #4
0
        protected void ChooseEvent()
        {
            int cnt = eventCandidates.Count;
            int rdx = Randoms.getInt(0, cnt - 1);
            int id  = eventCandidates[rdx];

            Element elem = getElement(timeStep, id);

            switch (elem.type)
            {
            case ElementType.Goal:
                Goal goal = (Goal)elem;
                goal.counterTimed++;
                Position newPos = getFreePosition(ColliderBody.posRadius, goal.getPosition(),
                                                  RadialGravity.forceRadius);
                ColliderBody colliderBody = new ColliderBody(newPos, goal.color);
                elementsTimeLine[timeStep].Add(colliderBody);

                eventsTimeLine.Add(new TimeLineEvent(colliderBody.id, goal.id));

                AddGravity(newPos, goal.color);
                break;

            case ElementType.ColliderBody:
                ColliderBody coll     = (ColliderBody)elem;
                ElementColor oldColor = coll.color;
                Position     oldPos   = new Position(coll.positionX, coll.positionY);
                ColorChanger chg      = new ColorChanger(oldPos, oldColor);
                elementsTimeLine[timeStep].Add(chg);

                elementsTimeLine[timeStep].Remove(coll);
                Position     newPosColl = getFreePosition(ColliderBody.posRadius, oldPos, RadialGravity.forceRadius);
                ElementColor newColor   = Randoms.getColor(new List <ElementColor>()
                {
                    oldColor
                });
                ColliderBody newColl = new ColliderBody(newPosColl, newColor, coll.id);
                elementsTimeLine[timeStep].Add(newColl);

                eventsTimeLine.Add(new TimeLineEvent(coll.id, chg.id));

                AddGravity(newPosColl, newColor);
                break;
            }
        }
Example #5
0
            private void ProcessEntity(Entity entity, int index, Collider collider)
            {
                RigidTransform transform = rigidTranforms[index];
                Aabb           aabb      = aabbs[index];
                int            spot      = layerIndices[index];

                layer.xmins[spot]     = aabb.min.x;
                layer.xmaxs[spot]     = aabb.max.x;
                layer.yzminmaxs[spot] = new float4(aabb.min.yz, aabb.max.yz);
                ColliderBody body = new ColliderBody
                {
                    entity    = entity,
                    transform = transform,
                    collider  = collider
                };

                layer.bodies[spot] = body;
            }
Example #6
0
        /// <summary>
        /// Filters a Stream of RayCastHits for ColliderBodys with the right color
        /// </summary>
        /// <param name="raycastHits">The to filter Collider2Ds</param>
        /// <param name="color">The to filter for ElementColor</param>
        /// <returns>The Filter ColliderBodySteam</returns>
        public static ColliderBody[] filterForColorFromRaycastHits(RaycastHit2D[] raycastHits, ElementColor color)
        {
            // Bitmask of to return ColliderBodys
            int mask    = 0;
            int counter = 0;

            // Array of all casted ColliderBodys
            var allColliderBodys = new ColliderBody[raycastHits.Length];

            for (var i = 0; i < raycastHits.Length; i++)
            {
                var currentRaycastHit = raycastHits[i];
                var colliderBody      = currentRaycastHit.collider.GetComponent <ColliderBody>();
                allColliderBodys[i] = colliderBody;
                if (colliderBody == null)
                {
                    continue;
                }
                if (colliderBody.Color != color)
                {
                    continue;
                }
                counter++;

                // If colliderbody has right color enable it bits at position i
                mask |= 1 << i;
            }

            var returnColliders = new ColliderBody[counter];

            counter = 0;
            for (var i = 0; i < raycastHits.Length; i++)
            {
                // Check if bit is enabled
                if ((mask & 1 << i) == 0)
                {
                    continue;
                }
                returnColliders[counter] = allColliderBodys[i];
                counter++;
            }

            return(returnColliders);
        }
        protected override void OnUpdate()
        {
            var bodies = new NativeArray <ColliderBody>(m_query.CalculateEntityCount(), Allocator.TempJob, NativeArrayOptions.UninitializedMemory);

            Entities.WithAll <BulletTag>().WithStoreEntityQueryInField(ref m_query).ForEach((Entity entity,
                                                                                             int entityInQueryIndex,
                                                                                             in Translation translation,
                                                                                             in Rotation rotation,
                                                                                             in Collider collider,
                                                                                             in BulletPreviousPosition previousPosition) =>
            {
                CapsuleCollider capsule = collider;
                float tailLength        = math.distance(translation.Value, previousPosition.previousPosition);
                capsule.pointA          = capsule.pointB;
                capsule.pointA.z       -= math.max(tailLength, 1.1920928955078125e-7f);      //Todo: Use math version of this once released.

                bodies[entityInQueryIndex] = new ColliderBody
                {
                    collider  = capsule,
                    entity    = entity,
                    transform = new RigidTransform(rotation.Value, translation.Value)
                };
            }).ScheduleParallel();
Example #8
0
 public GameObjectTracker(GameObject target)
 {
     _colliderBody = target.GetComponent <ColliderBody>();
 }