Example #1
0
        public static RigidbodyHandle GetNewRigidbody()
        {
            Span <RigidbodyState> span = editState.Span;

            for (int i = 0; i < span.Length; i++)
            {
                if (!span[i].IsAssigned)
                {
                    span[i]            = new RigidbodyState();
                    span[i].IsAssigned = true;
                    span[i].transform  = new Transform(Vector3.Zero);
                    span[i].mass       = 1;
                    span[i].inertia    = Vector3.One;
                    RigidbodyHandle handle = new RigidbodyHandle((uint)i);
                    handles.Add(handle);
                    return(handle);
                }
            }

            editState.Grow();
            oldState.Grow();
            interpolatedState.Grow();
            newState.Grow();
            return(GetNewRigidbody());
        }
Example #2
0
        private static List <ContactPoint> NarrowPhase(Memory <CollidablePair> pairs)
        {
            List <ContactPoint>   contacts = new List <ContactPoint>();
            Span <CollidablePair> pa       = pairs.Span;

            for (int i = 0; i < pa.Length; i++)
            {
                RigidbodyHandle a = (RigidbodyHandle)pa[i].a;
                RigidbodyHandle b = (RigidbodyHandle)pa[i].b;
                if (a.GetBound().IsColliding(a.state[0].transform, b.state[0].transform, b.GetBound()).Length > 0)
                {
                    contacts.AddRange(a.shape.IsColliding(a.state[0].transform, b.state[0].transform, b.shape));
                }
            }
            return(contacts);
        }
Example #3
0
        public static List <CollidablePair> SweepAndSplit(List <AABB> aABBs)
        {
            List <AABBMarker> markersx = new List <AABBMarker>(aABBs.Count * 2);

            for (int i = 0; i < aABBs.Count; i++)
            {
                AABB b = aABBs[i];
                markersx.Add(new MinAABB {
                    a = aABBs[i], position = b.WorldMin(handles[i].state[0].transform.position)
                });
                markersx.Add(new MaxAABB {
                    a = aABBs[i], position = b.WorldMax(handles[i].state[0].transform.position)
                });
            }
            List <List <AABBMarker> > start = new List <List <AABBMarker> >();

            start.Add(markersx);

            List <List <AABBMarker> > final = Split(Split(Split(start, Vector3.UnitX), Vector3.UnitY), Vector3.UnitZ);

            List <CollidablePair> pairs = new List <CollidablePair>();

            int splitChunks = 0, proccesChunks = 0;

            for (int m = 0; m < final.Count; m++)
            {
                splitChunks++;

                if (final[m].Count <= 2) //Two markers per box
                {
                    continue;            //there is only one box in this segment
                }
                proccesChunks++;

                /*
                 * final[m].Sort((x, y) => x.position.X.CompareTo(y.position.X));
                 * Prune(final[m], out var markersy);
                 *
                 * markersy.Sort((x, y) => x.position.Y.CompareTo(y.position.Y));
                 * Prune(markersy, out var markersz);
                 *
                 * markersz.Sort((x, y) => x.position.Z.CompareTo(y.position.Z));
                 * Prune(markersz, out var markersfinal);
                 */
                var markersfinal = final[m];

                AABB        last = null;
                List <AABB> open = new List <AABB>();
                for (int j = 0; j < markersfinal.Count; j++)
                {
                    if (markersfinal[j] is MinAABB)
                    {
                        last = ((MinAABB)markersfinal[j]).a;
                        open.Add(last);
                    }
                    else
                    {
                        if (markersfinal[j].a == last)
                        {
                            open.Remove(last);
                        }
                        foreach (var aa in open)
                        {
                            if (aa.root != markersfinal[j].a.root)
                            {
                                RigidbodyHandle a = (RigidbodyHandle)aa.root;
                                RigidbodyHandle b = (RigidbodyHandle)markersfinal[j].a.root;

                                pairs.Add(new CollidablePair {
                                    a = a, b = b
                                });
                            }
                        }
                        if (open.Contains(markersfinal[j].a))
                        {
                            open.Remove(markersfinal[j].a);
                        }
                    }
                }
            }


            return(pairs);
        }
Example #4
0
 internal static Span <RigidbodyState> GetRBInterpolatedState(RigidbodyHandle handle)
 {
     return(interpolatedState.GetRef(handle.handle));
 }
Example #5
0
 internal static Span <RigidbodyState> GetRBState(RigidbodyHandle handle)
 {
     return(editState.GetRef(handle.handle));
 }