public JobHandle GenerateContacts(BurstSolverImpl solver, float deltaTime)
        {
            var generateParticleContactsJob = new ParticleGrid.GenerateParticleParticleContactsJob
            {
                grid       = grid,
                gridLevels = grid.populatedLevels.GetKeyArray(Allocator.TempJob),

                positions     = solver.positions,
                orientations  = solver.orientations,
                restPositions = solver.restPositions,
                velocities    = solver.velocities,
                invMasses     = solver.invMasses,
                radii         = solver.principalRadii,
                fluidRadii    = solver.smoothingRadii,
                phases        = solver.phases,

                particleMaterialIndices = solver.abstraction.collisionMaterials.AsNativeArray <int>(),
                collisionMaterials      = ObiColliderWorld.GetInstance().collisionMaterials.AsNativeArray <BurstCollisionMaterial>(),

                contactsQueue          = particleContactQueue.AsParallelWriter(),
                fluidInteractionsQueue = fluidInteractionQueue.AsParallelWriter(),
                dt = deltaTime
            };

            return(generateParticleContactsJob.Schedule(grid.CellCount, 2));
        }
Example #2
0
        /// <summary>
        /// Prepares all solvers to begin simulating a new physics step. This involves
        /// caching some particle data for interpolation, performing collision detection, among other things.
        /// </summary>
        /// <param name="stepDeltaTime"> Duration (in seconds) of the next step.</param>
        protected void BeginStep(float stepDeltaTime)
        {
            using (m_BeginStepPerfMarker.Auto())
            {
                // Update colliders right before collision detection:
                ObiColliderWorld.GetInstance().UpdateColliders();
                ObiColliderWorld.GetInstance().UpdateRigidbodies(solvers, stepDeltaTime);
                ObiColliderWorld.GetInstance().UpdateWorld(stepDeltaTime);

                List <IObiJobHandle> handles = new List <IObiJobHandle>();

                // Kick off all solver jobs:
                foreach (ObiSolver solver in solvers)
                {
                    if (solver != null)
                    {
                        handles.Add(solver.BeginStep(stepDeltaTime));
                    }
                }

                // wait for all solver jobs to complete:
                foreach (IObiJobHandle handle in handles)
                {
                    if (handle != null)
                    {
                        handle.Complete();
                    }
                }
            }
        }
Example #3
0
        public override JobHandle Evaluate(JobHandle inputDeps, float deltaTime)
        {
            var projectConstraints = new PinConstraintsBatchJob()
            {
                particleIndices = particleIndices,
                colliderIndices = colliderIndices,
                offsets         = offsets,
                stiffnesses     = stiffnesses,
                restDarboux     = restDarbouxVectors,
                lambdas         = lambdas.Reinterpret <float, float4>(),

                positions           = solverImplementation.positions,
                invMasses           = solverImplementation.invMasses,
                orientations        = solverImplementation.orientations,
                invRotationalMasses = solverImplementation.invRotationalMasses,

                shapes                 = ObiColliderWorld.GetInstance().colliderShapes.AsNativeArray <BurstColliderShape>(),
                transforms             = ObiColliderWorld.GetInstance().colliderTransforms.AsNativeArray <BurstAffineTransform>(),
                rigidbodies            = ObiColliderWorld.GetInstance().rigidbodies.AsNativeArray <BurstRigidbody>(),
                rigidbodyLinearDeltas  = solverImplementation.abstraction.rigidbodyLinearDeltas.AsNativeArray <float4>(),
                rigidbodyAngularDeltas = solverImplementation.abstraction.rigidbodyAngularDeltas.AsNativeArray <float4>(),

                deltas            = solverImplementation.positionDeltas,
                counts            = solverImplementation.positionConstraintCounts,
                orientationDeltas = solverImplementation.orientationDeltas,
                orientationCounts = solverImplementation.orientationConstraintCounts,

                inertialFrame         = ((BurstSolverImpl)constraints.solver).inertialFrame,
                deltaTime             = deltaTime,
                activeConstraintCount = m_ActiveConstraintCount
            };

            return(projectConstraints.Schedule(inputDeps));
        }
        public override JobHandle Evaluate(JobHandle inputDeps, float stepTime, float substepTime, int substeps)
        {
            var parameters = solverAbstraction.GetConstraintParameters(m_ConstraintType);

            var projectConstraints = new ParticleCollisionConstraintsBatchJob()
            {
                positions               = solverImplementation.positions,
                orientations            = solverImplementation.orientations,
                invMasses               = solverImplementation.invMasses,
                radii                   = solverImplementation.principalRadii,
                particleMaterialIndices = solverImplementation.collisionMaterials,
                collisionMaterials      = ObiColliderWorld.GetInstance().collisionMaterials.AsNativeArray <BurstCollisionMaterial>(),

                simplices     = solverImplementation.simplices,
                simplexCounts = solverImplementation.simplexCounts,

                deltas    = solverImplementation.positionDeltas,
                counts    = solverImplementation.positionConstraintCounts,
                contacts  = ((BurstSolverImpl)constraints.solver).particleContacts,
                batchData = batchData,

                constraintParameters = parameters,
                solverParameters     = solverImplementation.abstraction.parameters,
                gravity     = new float4(solverImplementation.abstraction.parameters.gravity, 0),
                substepTime = substepTime,
            };

            int batchCount = batchData.isLast ? batchData.workItemCount : 1;

            return(projectConstraints.Schedule(batchData.workItemCount, batchCount, inputDeps));
        }
Example #5
0
        public void UpdateWorld(float deltaTime)
        {
            var world = ObiColliderWorld.GetInstance();

            var identifyMoving = new IdentifyMovingColliders
            {
                movingColliders    = movingColliders.AsParallelWriter(),
                shapes             = world.colliderShapes.AsNativeArray <BurstColliderShape>(cellSpans.count),
                rigidbodies        = world.rigidbodies.AsNativeArray <BurstRigidbody>(),
                collisionMaterials = world.collisionMaterials.AsNativeArray <BurstCollisionMaterial>(),
                bounds             = world.colliderAabbs.AsNativeArray <BurstAabb>(cellSpans.count),
                cellIndices        = cellSpans.AsNativeArray <BurstCellSpan>(),
                colliderCount      = colliderCount,
                dt = deltaTime
            };
            JobHandle movingHandle = identifyMoving.Schedule(cellSpans.count, 128);

            var updateMoving = new UpdateMovingColliders
            {
                movingColliders = movingColliders,
                grid            = grid,
                colliderCount   = colliderCount
            };

            updateMoving.Schedule(movingHandle).Complete();

            // remove tail from the current spans array:
            if (colliderCount < cellSpans.count)
            {
                cellSpans.count -= cellSpans.count - colliderCount;
            }
        }
        public override bool UpdateIfNeeded()
        {
            CapsuleCollider capsule = collider as CapsuleCollider;

            // retrieve collision world and index:
            var world = ObiColliderWorld.GetInstance();
            int index = source.Handle.index;

            // update collider:
            var shape = world.colliderShapes[index];

            shape.type                  = ColliderShape.ShapeType.Capsule;
            shape.phase                 = source.Phase;
            shape.flags                 = capsule.isTrigger ? 1 : 0;
            shape.rigidbodyIndex        = source.Rigidbody != null ? source.Rigidbody.handle.index : -1;
            shape.materialIndex         = source.CollisionMaterial != null ? source.CollisionMaterial.handle.index : -1;
            shape.contactOffset         = capsule.contactOffset + source.Thickness;
            shape.center                = capsule.center;
            shape.size                  = new Vector4(capsule.radius, capsule.height, capsule.direction, 0);
            world.colliderShapes[index] = shape;

            // update bounds:
            var aabb = world.colliderAabbs[index];

            aabb.FromBounds(capsule.bounds, shape.contactOffset);
            world.colliderAabbs[index] = aabb;

            // update transform:
            var trfm = world.colliderTransforms[index];

            trfm.FromTransform(capsule.transform);
            world.colliderTransforms[index] = trfm;

            return(true);
        }
        public override JobHandle Initialize(JobHandle inputDeps, float substepTime)
        {
            var updateContacts = new UpdateParticleContactsJob()
            {
                prevPositions     = solverImplementation.prevPositions,
                prevOrientations  = solverImplementation.prevOrientations,
                velocities        = solverImplementation.velocities,
                radii             = solverImplementation.principalRadii,
                invMasses         = solverImplementation.invMasses,
                invInertiaTensors = solverImplementation.invInertiaTensors,

                simplices     = solverImplementation.simplices,
                simplexCounts = solverImplementation.simplexCounts,

                particleMaterialIndices = solverImplementation.collisionMaterials,
                collisionMaterials      = ObiColliderWorld.GetInstance().collisionMaterials.AsNativeArray <BurstCollisionMaterial>(),

                contacts  = ((BurstSolverImpl)constraints.solver).particleContacts,
                batchData = batchData
            };

            int batchCount = batchData.isLast ? batchData.workItemCount : 1;

            return(updateContacts.Schedule(batchData.workItemCount, batchCount, inputDeps));
        }
        /// <summary>
        /// Advances the simulation a given amount of time. Note that once BeginStep has been called,
        /// Substep can be called multiple times.
        /// </summary>
        /// <param name="stepDeltaTime"> Duration (in seconds) of the substep.</param>
        protected void Substep(float substepDeltaTime)
        {
            using (m_SubstepPerfMarker.Auto())
            {
                // Necessary when using multiple substeps:
                ObiColliderWorld.GetInstance().UpdateWorld();

                // Grab rigidbody info:
                ObiColliderWorld.GetInstance().UpdateRigidbodies(solvers);

                List <IObiJobHandle> handles = new List <IObiJobHandle>();

                // Kick off all solver jobs:
                foreach (ObiSolver solver in solvers)
                {
                    if (solver != null)
                    {
                        handles.Add(solver.Substep(substepDeltaTime));
                    }
                }

                // wait for all solver jobs to complete:
                foreach (IObiJobHandle handle in handles)
                {
                    if (handle != null)
                    {
                        handle.Complete();
                    }
                }


                // Update rigidbody velocities:
                ObiColliderWorld.GetInstance().UpdateRigidbodyVelocities(solvers);
            }
        }
Example #9
0
        public override JobHandle Evaluate(JobHandle inputDeps, float deltaTime)
        {
            if (!((BurstSolverImpl)constraints.solver).particleContacts.IsCreated)
            {
                return(inputDeps);
            }

            var projectConstraints = new ParticleFrictionConstraintsBatchJob()
            {
                positions        = solverImplementation.positions,
                prevPositions    = solverImplementation.prevPositions,
                orientations     = solverImplementation.orientations,
                prevOrientations = solverImplementation.prevOrientations,

                invMasses               = solverImplementation.invMasses,
                invInertiaTensors       = solverImplementation.invInertiaTensors,
                radii                   = solverImplementation.principalRadii,
                particleMaterialIndices = solverImplementation.collisionMaterials,
                collisionMaterials      = ObiColliderWorld.GetInstance().collisionMaterials.AsNativeArray <BurstCollisionMaterial>(),

                deltas            = solverImplementation.positionDeltas,
                counts            = solverImplementation.positionConstraintCounts,
                orientationDeltas = solverImplementation.orientationDeltas,
                orientationCounts = solverImplementation.orientationConstraintCounts,
                contacts          = ((BurstSolverImpl)constraints.solver).particleContacts,

                batchData = batchData,
                maxDepenetrationVelocity = solverAbstraction.parameters.maxDepenetration,
                dt = deltaTime,
            };

            int batchCount = batchData.isLast ? batchData.workItemCount : 1;

            return(projectConstraints.Schedule(batchData.workItemCount, batchCount, inputDeps));
        }
Example #10
0
        public override bool UpdateIfNeeded()
        {
            BoxCollider2D box = collider as BoxCollider2D;

            var world = ObiColliderWorld.GetInstance();
            int index = source.Handle.index;

            // update collider:
            var shape = world.colliderShapes[index];

            shape.is2D                  = 1;
            shape.type                  = ColliderShape.ShapeType.Box;
            shape.phase                 = source.Phase;
            shape.flags                 = box.isTrigger ? 1 : 0;
            shape.rigidbodyIndex        = source.Rigidbody != null ? source.Rigidbody.handle.index : -1;
            shape.materialIndex         = source.CollisionMaterial != null ? source.CollisionMaterial.handle.index : -1;
            shape.contactOffset         = source.Thickness;
            shape.center                = box.offset;
            shape.size                  = box.size;
            world.colliderShapes[index] = shape;

            // update bounds:
            var aabb = world.colliderAabbs[index];

            aabb.FromBounds(box.bounds, shape.contactOffset, true);
            world.colliderAabbs[index] = aabb;

            // update transform:
            var trfm = world.colliderTransforms[index];

            trfm.FromTransform(box.transform, true);
            world.colliderTransforms[index] = trfm;
            return(false);
        }
Example #11
0
        public override JobHandle Evaluate(JobHandle inputDeps, float deltaTime)
        {
            var projectConstraints = new CollisionConstraintsBatchJob()
            {
                positions               = solverImplementation.positions,
                prevPositions           = solverImplementation.prevPositions,
                invMasses               = solverImplementation.invMasses,
                radii                   = solverImplementation.principalRadii,
                particleMaterialIndices = solverImplementation.collisionMaterials,

                shapes                 = ObiColliderWorld.GetInstance().colliderShapes.AsNativeArray <BurstColliderShape>(),
                transforms             = ObiColliderWorld.GetInstance().colliderTransforms.AsNativeArray <BurstAffineTransform>(),
                collisionMaterials     = ObiColliderWorld.GetInstance().collisionMaterials.AsNativeArray <BurstCollisionMaterial>(),
                rigidbodies            = ObiColliderWorld.GetInstance().rigidbodies.AsNativeArray <BurstRigidbody>(),
                rigidbodyLinearDeltas  = solverImplementation.abstraction.rigidbodyLinearDeltas.AsNativeArray <float4>(),
                rigidbodyAngularDeltas = solverImplementation.abstraction.rigidbodyAngularDeltas.AsNativeArray <float4>(),

                deltas = solverAbstraction.positionDeltas.AsNativeArray <float4>(),
                counts = solverAbstraction.positionConstraintCounts.AsNativeArray <int>(),

                contacts         = ((BurstSolverImpl)constraints.solver).colliderContacts,
                inertialFrame    = ((BurstSolverImpl)constraints.solver).inertialFrame,
                solverParameters = solverAbstraction.parameters,
                dt = deltaTime,
            };

            return(projectConstraints.Schedule(inputDeps));
        }
Example #12
0
        public override JobHandle Initialize(JobHandle inputDeps, float deltaTime)
        {
            var updateContacts = new UpdateContactsJob()
            {
                prevPositions           = solverImplementation.prevPositions,
                prevOrientations        = solverImplementation.prevOrientations,
                velocities              = solverImplementation.velocities,
                radii                   = solverImplementation.principalRadii,
                invMasses               = solverImplementation.invMasses,
                invInertiaTensors       = solverImplementation.invInertiaTensors,
                particleMaterialIndices = solverImplementation.collisionMaterials,
                collisionMaterials      = ObiColliderWorld.GetInstance().collisionMaterials.AsNativeArray <BurstCollisionMaterial>(),

                shapes                 = ObiColliderWorld.GetInstance().colliderShapes.AsNativeArray <BurstColliderShape>(),
                transforms             = ObiColliderWorld.GetInstance().colliderTransforms.AsNativeArray <BurstAffineTransform>(),
                rigidbodies            = ObiColliderWorld.GetInstance().rigidbodies.AsNativeArray <BurstRigidbody>(),
                rigidbodyLinearDeltas  = solverImplementation.abstraction.rigidbodyLinearDeltas.AsNativeArray <float4>(),
                rigidbodyAngularDeltas = solverImplementation.abstraction.rigidbodyAngularDeltas.AsNativeArray <float4>(),

                contacts      = ((BurstSolverImpl)constraints.solver).colliderContacts,
                inertialFrame = ((BurstSolverImpl)constraints.solver).inertialFrame,
            };

            return(updateContacts.Schedule(((BurstSolverImpl)constraints.solver).colliderContacts.Length, 128, inputDeps));
        }
        public override bool UpdateIfNeeded()
        {
            bool trigger = false;

            if (collider is Collider)
            {
                trigger = ((Collider)collider).isTrigger;
            }
            else if (collider is Collider2D)
            {
                trigger = ((Collider2D)collider).isTrigger;
            }

            // retrieve collision world and index:
            var world = ObiColliderWorld.GetInstance();
            int index = source.Handle.index;

            // decrease reference count of current handle if the df data it points to is different
            // than the df used by the collider:
            if (handle != null && handle.owner != distanceField)
            {
                if (handle.Dereference())
                {
                    world.DestroyDistanceField(handle);
                }
            }

            if (handle == null || !handle.isValid)
            {
                handle = world.GetOrCreateDistanceField(distanceField);
                handle.Reference();
            }

            // update collider:
            var shape = world.colliderShapes[index];

            shape.type                  = ColliderShape.ShapeType.SignedDistanceField;
            shape.phase                 = source.Phase;
            shape.flags                 = trigger ? 1 : 0;
            shape.rigidbodyIndex        = source.Rigidbody != null ? source.Rigidbody.handle.index : -1;
            shape.materialIndex         = source.CollisionMaterial != null ? source.CollisionMaterial.handle.index : -1;
            shape.contactOffset         = source.Thickness;
            shape.dataIndex             = handle.index;
            world.colliderShapes[index] = shape;

            // update bounds:
            var aabb = world.colliderAabbs[index];

            aabb.FromBounds(distanceField.FieldBounds.Transform(source.transform.localToWorldMatrix), shape.contactOffset);
            world.colliderAabbs[index] = aabb;

            // update transform:
            var trfm = world.colliderTransforms[index];

            trfm.FromTransform(source.transform);
            world.colliderTransforms[index] = trfm;

            return(true);
        }
        public void UpdateMaterial()
        {
            var world = ObiColliderWorld.GetInstance();
            var mat   = world.collisionMaterials[handle.index];

            mat.FromObiCollisionMaterial(this);
            world.collisionMaterials[handle.index] = mat;
        }
        public override void UpdateIfNeeded(float stepTime)
        {
            UpdateKinematicVelocities(stepTime);

            var rb = ObiColliderWorld.GetInstance().rigidbodies[handle.index];

            rb.FromRigidbody(unityRigidbody, kinematicForParticles);
            ObiColliderWorld.GetInstance().rigidbodies[handle.index] = rb;
        }
Example #16
0
        public void OnDestroy()
        {
            ObiColliderWorld.GetInstance().UnregisterImplementation(this);

            grid.Dispose();
            movingColliders.Dispose();
            colliderContactQueue.Dispose();
            cellSpans.Dispose();
        }
        public override void Destroy()
        {
            base.Destroy();

            if (handle != null && handle.Dereference())
            {
                ObiColliderWorld.GetInstance().DestroyTriangleMesh(handle);
            }
        }
Example #18
0
        public override void Destroy()
        {
            base.Destroy();

            if (handle != null && handle.Dereference())
            {
                ObiColliderWorld.GetInstance().DestroyHeightField(handle);
            }
        }
 public static ObiColliderWorld GetInstance()
 {
     if (instance == null)
     {
         instance = new ObiColliderWorld();
         instance.Initialize();
     }
     return(instance);
 }
Example #20
0
        public void Awake()
        {
            this.grid                 = new NativeMultilevelGrid <int>(1000, Allocator.Persistent);
            this.movingColliders      = new NativeQueue <MovingCollider>(Allocator.Persistent);
            this.colliderContactQueue = new NativeQueue <BurstContact>(Allocator.Persistent);

            this.cellSpans = new ObiNativeCellSpanList();

            ObiColliderWorld.GetInstance().RegisterImplementation(this);
        }
        protected void RemoveCollider()
        {
            ObiColliderWorld.GetInstance().DestroyCollider(shapeHandle);

            // Destroy shape tracker:
            if (tracker != null)
            {
                tracker.Destroy();
                tracker = null;
            }
        }
        public override void UpdateIfNeeded()
        {
            var rb = ObiColliderWorld.GetInstance().rigidbodies[handle.index];

            velocity        = rb.velocity = unityRigidbody.velocity;
            angularVelocity = rb.angularVelocity = unityRigidbody.angularVelocity;

            rb.FromRigidbody(unityRigidbody, false);

            ObiColliderWorld.GetInstance().rigidbodies[handle.index] = rb;
        }
        public override bool UpdateIfNeeded()
        {
            SphereCollider sphere = collider as SphereCollider;

            // TODO: testing for changes here is not needed? all we do is set variables...
            //if (sphere != null && (sphere.radius != radius || sphere.center != center))
            {
                //radius = sphere.radius;
                //center = sphere.center;

                // retrieve collision world and index:
                var world = ObiColliderWorld.GetInstance();
                int index = source.Handle.index;

                // update collider:
                var shape = world.colliderShapes[index];
                shape.type                  = ColliderShape.ShapeType.Sphere;
                shape.phase                 = source.Phase;
                shape.flags                 = sphere.isTrigger ? 1 : 0;
                shape.rigidbodyIndex        = source.Rigidbody != null ? source.Rigidbody.handle.index : -1;
                shape.materialIndex         = source.CollisionMaterial != null ? source.CollisionMaterial.handle.index : -1;
                shape.contactOffset         = source.Thickness;
                shape.center                = sphere.center;
                shape.size                  = Vector3.one * sphere.radius;
                world.colliderShapes[index] = shape;

                // update bounds:
                var aabb = world.colliderAabbs[index];
                aabb.FromBounds(sphere.bounds, shape.contactOffset);
                world.colliderAabbs[index] = aabb;

                // update transform:
                var trfm = world.colliderTransforms[index];
                trfm.FromTransform(sphere.transform);
                world.colliderTransforms[index] = trfm;


                /*var shape = source.colliderWorld.colliderShapes[source.shapeHandle.index];
                 *
                 * // update the transform
                 * shape.Set(collider as Collider, source.Phase, source.Thickness);
                 *
                 * // update the shape:
                 * shape.SetSphere(sphere.center, sphere.radius);
                 *
                 * source.colliderWorld.colliderShapes[source.shapeHandle.index] = shape;*/

                //adaptor.Set(center, radius);
                //Oni.UpdateShape(oniShape,ref adaptor);
                return(true);
            }
            //return false;
        }
        public override bool UpdateIfNeeded()
        {
            MeshCollider meshCollider = collider as MeshCollider;

            // retrieve collision world and index:
            var world = ObiColliderWorld.GetInstance();
            int index = source.Handle.index;

            // decrease reference count of current handle if the mesh data it points to is different
            // than the mesh used by the collider:
            if (handle != null && handle.owner != meshCollider.sharedMesh)
            {
                if (handle.Dereference())
                {
                    world.DestroyTriangleMesh(handle);
                }
            }

            // get or create the mesh:
            if (handle == null || !handle.isValid)
            {
                handle = world.GetOrCreateTriangleMesh(meshCollider.sharedMesh);
                handle.Reference();
            }

            // update collider:
            var shape = world.colliderShapes[index];

            shape.type                  = ColliderShape.ShapeType.TriangleMesh;
            shape.phase                 = source.Phase;
            shape.flags                 = meshCollider.isTrigger ? 1 : 0;
            shape.rigidbodyIndex        = source.Rigidbody != null ? source.Rigidbody.handle.index : -1;
            shape.materialIndex         = source.CollisionMaterial != null ? source.CollisionMaterial.handle.index : -1;
            shape.contactOffset         = source.Thickness;
            shape.dataIndex             = handle.index;
            world.colliderShapes[index] = shape;

            // update bounds:
            var aabb = world.colliderAabbs[index];

            aabb.FromBounds(meshCollider.bounds, shape.contactOffset);
            world.colliderAabbs[index] = aabb;

            // update transform:
            var trfm = world.colliderTransforms[index];

            trfm.FromTransform(meshCollider.transform);
            world.colliderTransforms[index] = trfm;

            return(true);
        }
        protected void AddCollider()
        {
            Component unityCollider = GetUnityCollider(ref wasUnityColliderEnabled);

            if (unityCollider != null && (shapeHandle == null || !shapeHandle.isValid))
            {
                shapeHandle       = ObiColliderWorld.GetInstance().CreateCollider();
                shapeHandle.owner = this;

                // Create shape tracker:
                CreateTracker();

                // Create rigidbody if necessary, and link ourselves to it:
                CreateRigidbody();
            }
        }
        protected void CreateMaterialIfNeeded()
        {
            if (materialHandle == null || !materialHandle.isValid)
            {
                var world = ObiColliderWorld.GetInstance();

                // create the material:
                materialHandle       = world.CreateCollisionMaterial();
                materialHandle.owner = this;

                // copy material data from this material (use materialHandle instead of handle, to not retrigger CreateMaterialIfNeeded)
                var mat = world.collisionMaterials[materialHandle.index];
                mat.FromObiCollisionMaterial(this);
                world.collisionMaterials[materialHandle.index] = mat;
            }
        }
        public JobHandle GenerateContacts(BurstSolverImpl solver, float deltaTime)
        {
            var world = ObiColliderWorld.GetInstance();

            var generateColliderContactsJob = new GenerateContactsJob
            {
                particleGrid            = solver.particleGrid.grid,
                colliderGrid            = grid,
                gridLevels              = grid.populatedLevels.GetKeyArray(Allocator.TempJob),
                positions               = solver.positions,
                orientations            = solver.orientations,
                velocities              = solver.velocities,
                invMasses               = solver.invMasses,
                radii                   = solver.principalRadii,
                phases                  = solver.phases,
                particleMaterialIndices = solver.collisionMaterials,

                transforms         = world.colliderTransforms.AsNativeArray <BurstAffineTransform>(),
                shapes             = world.colliderShapes.AsNativeArray <BurstColliderShape>(),
                bounds             = world.colliderAabbs.AsNativeArray <BurstAabb>(),
                collisionMaterials = world.collisionMaterials.AsNativeArray <BurstCollisionMaterial>(),

                triangleMeshHeaders = world.triangleMeshContainer.headers.AsNativeArray <TriangleMeshHeader>(),
                bihNodes            = world.triangleMeshContainer.bihNodes.AsNativeArray <BIHNode>(),
                triangles           = world.triangleMeshContainer.triangles.AsNativeArray <Triangle>(),
                vertices            = world.triangleMeshContainer.vertices.AsNativeArray <float3>(),

                edgeMeshHeaders = world.edgeMeshContainer.headers.AsNativeArray <EdgeMeshHeader>(),
                edgeBihNodes    = world.edgeMeshContainer.bihNodes.AsNativeArray <BIHNode>(),
                edges           = world.edgeMeshContainer.edges.AsNativeArray <Edge>(),
                edgeVertices    = world.edgeMeshContainer.vertices.AsNativeArray <float2>(),

                distanceFieldHeaders = world.distanceFieldContainer.headers.AsNativeArray <DistanceFieldHeader>(),
                dfNodes = world.distanceFieldContainer.dfNodes.AsNativeArray <BurstDFNode>(),

                heightFieldHeaders = world.heightFieldContainer.headers.AsNativeArray <HeightFieldHeader>(),
                heightFieldSamples = world.heightFieldContainer.samples.AsNativeArray <float>(),

                contactsQueue = colliderContactQueue.AsParallelWriter(),
                solverToWorld = solver.solverToWorld,
                worldToSolver = solver.worldToSolver,
                is2D          = solver.abstraction.parameters.mode == Oni.SolverParameters.Mode.Mode2D,
                deltaTime     = deltaTime
            };

            return(generateColliderContactsJob.Schedule(solver.particleGrid.grid.CellCount, 16));
        }
Example #28
0
        /// <summary>
        /// Wraps up the current simulation step. This will trigger contact callbacks.
        /// </summary>
        protected void EndStep(float substepDeltaTime)
        {
            using (m_EndStepPerfMarker.Auto())
            {
                // End step: Invokes collision callbacks and notifies actors that the solver step has ended.
                foreach (ObiSolver solver in solvers)
                {
                    if (solver != null)
                    {
                        solver.EndStep(substepDeltaTime);
                    }
                }
            }

            // Write back rigidbody velocity deltas:
            ObiColliderWorld.GetInstance().UpdateRigidbodyVelocities(solvers);
        }
Example #29
0
        public override bool UpdateIfNeeded()
        {
            TerrainCollider terrain = collider as TerrainCollider;

            // retrieve collision world and index:
            var world = ObiColliderWorld.GetInstance();
            int index = source.Handle.index;

            int resolution = terrain.terrainData.heightmapResolution;

            // get or create the heightfield:
            if (handle == null || !handle.isValid)
            {
                handle = world.GetOrCreateHeightField(terrain.terrainData);
                handle.Reference();
            }

            // update collider:
            var shape = world.colliderShapes[index];

            shape.type                  = ColliderShape.ShapeType.Heightmap;
            shape.phase                 = source.Phase;
            shape.flags                 = terrain.isTrigger ? 1 : 0;
            shape.rigidbodyIndex        = source.Rigidbody != null ? source.Rigidbody.handle.index : -1;
            shape.materialIndex         = source.CollisionMaterial != null ? source.CollisionMaterial.handle.index : -1;
            shape.contactOffset         = terrain.contactOffset + source.Thickness;
            shape.dataIndex             = handle.index;
            shape.size                  = terrain.terrainData.size;
            shape.center                = new Vector4(resolution, resolution, resolution, resolution);
            world.colliderShapes[index] = shape;

            // update bounds:
            var aabb = world.colliderAabbs[index];

            aabb.FromBounds(terrain.bounds, shape.contactOffset);
            world.colliderAabbs[index] = aabb;

            // update transform:
            var trfm = world.colliderTransforms[index];

            trfm.FromTransform(terrain.transform);
            world.colliderTransforms[index] = trfm;

            return(true);
        }
        public override bool UpdateIfNeeded()
        {
            BoxCollider box = collider as BoxCollider;

            /*if (box != null && (box.size != size || box.center != center)){
             *                  size = box.size;
             *                  center = box.center;
             *                  adaptor.Set(center, size);
             *                  Oni.UpdateShape(oniShape,ref adaptor);
             *                  return true;
             *          }*/

            // retrieve collision world and index:
            var world = ObiColliderWorld.GetInstance();
            int index = source.Handle.index;

            // update collider:
            var shape = world.colliderShapes[index];

            shape.type                  = ColliderShape.ShapeType.Box;
            shape.phase                 = source.Phase;
            shape.flags                 = box.isTrigger ? 1 : 0;
            shape.rigidbodyIndex        = source.Rigidbody != null ? source.Rigidbody.handle.index         : -1;
            shape.materialIndex         = source.CollisionMaterial != null ? source.CollisionMaterial.handle.index : -1;
            shape.contactOffset         = box.contactOffset + source.Thickness;
            shape.center                = box.center;
            shape.size                  = box.size;
            world.colliderShapes[index] = shape;

            // update bounds:
            var aabb = world.colliderAabbs[index];

            aabb.FromBounds(box.bounds, shape.contactOffset);
            world.colliderAabbs[index] = aabb;

            // update transform:
            var trfm = world.colliderTransforms[index];

            trfm.FromTransform(box.transform);
            world.colliderTransforms[index] = trfm;

            return(true);
        }