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 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 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)); }
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)); }
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)); }
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 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)); }
/// <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); } }
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); }
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)); }
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)); }
/// <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(); } } } }
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; }
public override void Destroy() { base.Destroy(); if (handle != null && handle.Dereference()) { ObiColliderWorld.GetInstance().DestroyTriangleMesh(handle); } }
public override void Destroy() { base.Destroy(); if (handle != null && handle.Dereference()) { ObiColliderWorld.GetInstance().DestroyHeightField(handle); } }
public void OnDestroy() { ObiColliderWorld.GetInstance().UnregisterImplementation(this); grid.Dispose(); movingColliders.Dispose(); colliderContactQueue.Dispose(); cellSpans.Dispose(); }
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)); }
/// <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); }
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() { EdgeCollider2D edgeCollider = collider as EdgeCollider2D; // retrieve collision world and index: var world = ObiColliderWorld.GetInstance(); int index = source.Handle.index; // get or create the mesh: if (handle == null || !handle.isValid) { handle = world.GetOrCreateEdgeMesh(edgeCollider); handle.Reference(); } // update collider: var shape = world.colliderShapes[index]; shape.is2D = 1; shape.type = ColliderShape.ShapeType.EdgeMesh; shape.phase = source.Phase; shape.flags = edgeCollider.isTrigger ? 1 : 0; shape.rigidbodyIndex = source.Rigidbody != null ? source.Rigidbody.handle.index : -1; shape.materialIndex = source.CollisionMaterial != null ? source.CollisionMaterial.handle.index : -1; shape.center = edgeCollider.offset; shape.contactOffset = source.Thickness + edgeCollider.edgeRadius; shape.dataIndex = handle.index; world.colliderShapes[index] = shape; // update bounds: var aabb = world.colliderAabbs[index]; aabb.FromBounds(edgeCollider.bounds, shape.contactOffset, true); world.colliderAabbs[index] = aabb; // update transform: var trfm = world.colliderTransforms[index]; trfm.FromTransform(edgeCollider.transform, true); 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); }