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);
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; } }
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; }
/// <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();
public GameObjectTracker(GameObject target) { _colliderBody = target.GetComponent <ColliderBody>(); }