修改水

This commit is contained in:
2026-01-01 22:00:33 +08:00
parent 040a222bd6
commit 9ceffccd39
1800 changed files with 103929 additions and 139495 deletions

View File

@@ -1,42 +0,0 @@
using UnityEngine;
namespace Obi
{
public class ComputeBox
{
private ComputeShader shader;
private int kernel;
public ComputeBox()
{
shader = GameObject.Instantiate(Resources.Load<ComputeShader>("Compute/BoxShape"));
kernel = shader.FindKernel("GenerateContacts");
}
public void GenerateContacts(ComputeSolverImpl solver, ComputeColliderWorld world)
{
shader.SetInt("maxContacts", ComputeColliderWorld.maxContacts);
shader.SetInt("pointCount", solver.simplexCounts.pointCount);
shader.SetInt("edgeCount", solver.simplexCounts.edgeCount);
shader.SetInt("triangleCount", solver.simplexCounts.triangleCount);
shader.SetInt("surfaceCollisionIterations", solver.abstraction.parameters.surfaceCollisionIterations);
shader.SetFloat("surfaceCollisionTolerance", solver.abstraction.parameters.surfaceCollisionTolerance);
shader.SetFloat("collisionMargin", solver.abstraction.parameters.collisionMargin);
shader.SetBuffer(kernel, "worldToSolver", solver.worldToSolverBuffer);
shader.SetBuffer(kernel, "simplices", solver.simplices);
shader.SetBuffer(kernel, "positions", solver.positionsBuffer);
shader.SetBuffer(kernel, "orientations", solver.orientationsBuffer);
shader.SetBuffer(kernel, "velocities", solver.velocitiesBuffer);
shader.SetBuffer(kernel, "principalRadii", solver.principalRadiiBuffer);
shader.SetBuffer(kernel, "transforms", world.transformsBuffer);
shader.SetBuffer(kernel, "shapes", world.shapesBuffer);
shader.SetBuffer(kernel, "contactPairs", world.contactPairs);
shader.SetBuffer(kernel, "contactOffsetsPerType", world.contactOffsetsPerType);
shader.SetBuffer(kernel, "contacts", solver.abstraction.colliderContacts.computeBuffer);
shader.SetBuffer(kernel, "dispatchBuffer", world.dispatchBuffer);
shader.DispatchIndirect(kernel, world.dispatchBuffer, 32 + 16 * (int)Oni.ShapeType.Box);
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 669f5cb47192b4a08864250bd4ba3872
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,42 +0,0 @@
using UnityEngine;
namespace Obi
{
public class ComputeCapsule
{
private ComputeShader shader;
private int kernel;
public ComputeCapsule()
{
shader = GameObject.Instantiate(Resources.Load<ComputeShader>("Compute/CapsuleShape"));
kernel = shader.FindKernel("GenerateContacts");
}
public void GenerateContacts(ComputeSolverImpl solver, ComputeColliderWorld world)
{
shader.SetInt("maxContacts", ComputeColliderWorld.maxContacts);
shader.SetInt("pointCount", solver.simplexCounts.pointCount);
shader.SetInt("edgeCount", solver.simplexCounts.edgeCount);
shader.SetInt("triangleCount", solver.simplexCounts.triangleCount);
shader.SetInt("surfaceCollisionIterations", solver.abstraction.parameters.surfaceCollisionIterations);
shader.SetFloat("surfaceCollisionTolerance", solver.abstraction.parameters.surfaceCollisionTolerance);
shader.SetFloat("collisionMargin", solver.abstraction.parameters.collisionMargin);
shader.SetBuffer(kernel, "worldToSolver", solver.worldToSolverBuffer);
shader.SetBuffer(kernel, "simplices", solver.simplices);
shader.SetBuffer(kernel, "positions", solver.positionsBuffer);
shader.SetBuffer(kernel, "orientations", solver.orientationsBuffer);
shader.SetBuffer(kernel, "velocities", solver.velocitiesBuffer);
shader.SetBuffer(kernel, "principalRadii", solver.principalRadiiBuffer);
shader.SetBuffer(kernel, "transforms", world.transformsBuffer);
shader.SetBuffer(kernel, "shapes", world.shapesBuffer);
shader.SetBuffer(kernel, "contactPairs", world.contactPairs);
shader.SetBuffer(kernel, "contactOffsetsPerType", world.contactOffsetsPerType);
shader.SetBuffer(kernel, "contacts", solver.abstraction.colliderContacts.computeBuffer);
shader.SetBuffer(kernel, "dispatchBuffer", world.dispatchBuffer);
shader.DispatchIndirect(kernel, world.dispatchBuffer, 32 + 16 * (int)Oni.ShapeType.Capsule);
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: b8577fc7696f14a5bad666ce7bdbd424
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,479 +0,0 @@
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Obi
{
public class ComputeColliderWorld : MonoBehaviour, IColliderWorldImpl
{
public int referenceCount { get; private set; } = 0;
public int colliderCount { get; private set; } = 0;
public int rigidbodyCount { get; private set; } = -1; // make sure the buffer is created even if there's 0.
public int forceZoneCount { get; private set; } = -1; // make sure the buffer is created even if there's 0.
public int materialCount { get; private set; } = -1; // make sure the buffer is created even if there's 0.
public int triangleMeshCount { get; private set; } = -1;
public int edgeMeshCount { get; private set; } = -1;
public int distanceFieldCount { get; private set; } = -1;
public int heightFieldCount { get; private set; } = -1;
private ComputePrefixSum prefixSum;
private ComputeShader gridShader;
private int buildKernel;
private int gridPopulationKernel;
private int sortKernel;
private int contactsKernel;
private int clearKernel;
private int prefixSumPairsKernel;
private int sortPairsKernel;
private int applyForceZonesKernel;
private int writeForceZoneResultsKernel;
public GraphicsBuffer materialsBuffer;
public GraphicsBuffer aabbsBuffer;
public GraphicsBuffer transformsBuffer;
public GraphicsBuffer shapesBuffer;
public GraphicsBuffer forceZonesBuffer;
public GraphicsBuffer rigidbodiesBuffer;
public GraphicsBuffer sortedColliderIndicesBuffer;
public GraphicsBuffer cellIndicesBuffer; //for each collider, the IDs of the 8 cells it covers.
public GraphicsBuffer cellOffsetsBuffer; //for each cell, start offset in the sorted span indices buffer.
public GraphicsBuffer cellCountsBuffer; // for each cell, how many colliders in it.
public GraphicsBuffer offsetInCells; // for each collider, its offset in each of the 8 cells.
public GraphicsBuffer levelPopulation; // buffer storing amount of entries in each grid level
private GraphicsBuffer colliderTypeCounts; // amount of contacts against each collider type.
public GraphicsBuffer unsortedContactPairs; // unsorted contact pairs.
public GraphicsBuffer contactPairs; // list of contact pairs.
public GraphicsBuffer contactOffsetsPerType; // offset in the contact pairs array for each collider type.
public GraphicsBuffer dispatchBuffer; // dispatch info for iterating trough contacts.
public GraphicsBuffer heightFieldHeaders;
public GraphicsBuffer heightFieldSamples;
public GraphicsBuffer distanceFieldHeaders;
public GraphicsBuffer dfNodes;
public GraphicsBuffer edgeMeshHeaders;
public GraphicsBuffer edgeBihNodes;
public GraphicsBuffer edges;
public GraphicsBuffer edgeVertices;
public GraphicsBuffer triangleMeshHeaders;
public GraphicsBuffer bihNodes;
public GraphicsBuffer triangles;
public GraphicsBuffer vertices;
public const int maxContacts = 512 * 512;
public const int maxCells = 512 * 512;
public const int cellsPerCollider = 8;
private const int maxGridLevels = 24;
private uint[] colliderCountClear = new uint[Oni.ColliderShapeTypeCount];
private uint[] dispatchClear = { 0, 1, 1, 0, // contacts
0, 1, 1, 0, // pairs
0, 1, 1, 0, // spheres
0, 1, 1, 0, // boxes
0, 1, 1, 0, // capsules
0, 1, 1, 0, // heighmaps
0, 1, 1, 0, // tri mesh
0, 1, 1, 0, // edge mesh
0, 1, 1, 0, // distance field
};
private ComputeSphere spheres;
private ComputeBox boxes;
private ComputeCapsule capsules;
private ComputeTriangleMesh triangleMeshes;
private ComputeEdgeMesh edgeMeshes;
private ComputeDistanceField distanceFields;
private ComputeHeightField heightFields;
// for each particle in parallel:
// determine its cell span in the collider grid.
// iterate over all of them, generating contacts.
// we just need to get collider indices from each cell.
// sort by cell, store offset for each cell.
// each collider keeps track of 8 uints: IDs of the cells it overlaps. unused are invalid.
// each collider must know offset within each cell: another 8 units per collider.
// we can keep using the same system as we did with particles.
public void Awake()
{
ObiColliderWorld.GetInstance().RegisterImplementation(this);
prefixSum = new ComputePrefixSum(maxCells);
gridShader = Resources.Load<ComputeShader>("Compute/ColliderGrid");
buildKernel = gridShader.FindKernel("BuildUnsortedList");
gridPopulationKernel = gridShader.FindKernel("FindPopulatedLevels");
sortKernel = gridShader.FindKernel("SortList");
contactsKernel = gridShader.FindKernel("BuildContactList");
clearKernel = gridShader.FindKernel("Clear");
prefixSumPairsKernel = gridShader.FindKernel("PrefixSumColliderCounts");
sortPairsKernel = gridShader.FindKernel("SortContactPairs");
applyForceZonesKernel = gridShader.FindKernel("ApplyForceZones");
writeForceZoneResultsKernel = gridShader.FindKernel("WriteForceZoneResults");
gridShader.SetInt("shapeTypeCount", Oni.ColliderShapeTypeCount);
gridShader.SetInt("maxContacts", maxContacts);
gridShader.SetInt("colliderCount", colliderCount);
gridShader.SetInt("cellsPerCollider", cellsPerCollider);
gridShader.SetInt("maxCells", maxCells);
cellOffsetsBuffer = new GraphicsBuffer(GraphicsBuffer.Target.Structured, maxCells, 4);
cellCountsBuffer = new GraphicsBuffer(GraphicsBuffer.Target.Structured, maxCells, 4);
// first entry is amount of non-empty levels in the grid.
// next maxGridLevels entries hold the indices of the non-empty levels.
// final maxGridLevels entries hold the population of each level.
levelPopulation = new GraphicsBuffer(GraphicsBuffer.Target.Structured, maxGridLevels + 1, 4);
colliderTypeCounts = new GraphicsBuffer(GraphicsBuffer.Target.Structured, Oni.ColliderShapeTypeCount, 4);
contactOffsetsPerType = new GraphicsBuffer(GraphicsBuffer.Target.Structured, Oni.ColliderShapeTypeCount + 1, 4);
unsortedContactPairs = new GraphicsBuffer(GraphicsBuffer.Target.Structured, maxContacts, 8);
contactPairs = new GraphicsBuffer(GraphicsBuffer.Target.Structured, maxContacts, 8);
dispatchBuffer = new GraphicsBuffer(GraphicsBuffer.Target.IndirectArguments, dispatchClear.Length, sizeof(uint));
spheres = new ComputeSphere();
boxes = new ComputeBox();
capsules = new ComputeCapsule();
triangleMeshes = new ComputeTriangleMesh();
edgeMeshes = new ComputeEdgeMesh();
distanceFields = new ComputeDistanceField();
heightFields = new ComputeHeightField();
}
public void OnDestroy()
{
ObiColliderWorld.GetInstance().UnregisterImplementation(this);
prefixSum.Dispose();
cellOffsetsBuffer.Dispose();
cellCountsBuffer.Dispose();
levelPopulation.Dispose();
contactPairs.Dispose();
dispatchBuffer.Dispose();
colliderTypeCounts.Dispose();
contactOffsetsPerType.Dispose();
unsortedContactPairs.Dispose();
if (cellIndicesBuffer != null)
cellIndicesBuffer.Dispose();
if (offsetInCells != null)
offsetInCells.Dispose();
if (sortedColliderIndicesBuffer != null)
sortedColliderIndicesBuffer.Dispose();
}
public void IncreaseReferenceCount()
{
referenceCount++;
}
public void DecreaseReferenceCount()
{
if (--referenceCount <= 0 && gameObject != null)
DestroyImmediate(gameObject);
}
public void SetColliders(ObiNativeColliderShapeList shapes, ObiNativeAabbList bounds, ObiNativeAffineTransformList transforms)
{
if (colliderCount != shapes.count || aabbsBuffer == null || !aabbsBuffer.IsValid())
aabbsBuffer = bounds.AsComputeBuffer<Aabb>();
else
bounds.Upload();
if (colliderCount != shapes.count || shapesBuffer == null || !shapesBuffer.IsValid())
shapesBuffer = shapes.AsComputeBuffer<ColliderShape>();
else
shapes.Upload();
if (colliderCount != shapes.count || transformsBuffer == null || !transformsBuffer.IsValid())
transformsBuffer = transforms.AsComputeBuffer<AffineTransform>();
else
transforms.Upload();
// Only update in case the amount of colliders has changed:
if (colliderCount != shapes.count)
{
colliderCount = shapes.count;
gridShader.SetInt("colliderCount", colliderCount);
if (cellIndicesBuffer != null)
{
cellIndicesBuffer.Release();
cellIndicesBuffer = null;
}
if (offsetInCells != null)
{
offsetInCells.Release();
offsetInCells = null;
}
if (sortedColliderIndicesBuffer != null)
{
sortedColliderIndicesBuffer.Release();
sortedColliderIndicesBuffer = null;
}
if (colliderCount > 0)
{
cellIndicesBuffer = new GraphicsBuffer(GraphicsBuffer.Target.Structured, colliderCount * cellsPerCollider, 4);
offsetInCells = new GraphicsBuffer(GraphicsBuffer.Target.Structured, colliderCount * cellsPerCollider, 4);
sortedColliderIndicesBuffer = new GraphicsBuffer(GraphicsBuffer.Target.Structured, colliderCount * cellsPerCollider, 4);
}
}
}
public void SetForceZones(ObiNativeForceZoneList forceZones)
{
// Changing the count of a NativeList should not invalidate compute buffer. Only need to invalidate if *capacity* changes, it's up to the user to
// regenerate the compute buffer in case it is needed, or Uplodad() the new data in case it is not (because our compute buffer maps full capacity, instead of only up to count)
if (forceZoneCount != forceZones.count || forceZonesBuffer == null || !forceZonesBuffer.IsValid())
{
forceZoneCount = forceZones.count;
forceZonesBuffer = forceZones.SafeAsComputeBuffer<ForceZone>();
}
else
forceZones.Upload();
}
public void SetRigidbodies(ObiNativeRigidbodyList rigidbody)
{
if (rigidbodyCount != rigidbody.count || rigidbodiesBuffer == null || !rigidbodiesBuffer.IsValid())
{
rigidbodyCount = rigidbody.count;
rigidbodiesBuffer = rigidbody.SafeAsComputeBuffer<ColliderRigidbody>();
}
else
rigidbody.Upload();
}
public void SetCollisionMaterials(ObiNativeCollisionMaterialList materials)
{
if (materialCount != materials.count || materialsBuffer == null || !materialsBuffer.IsValid())
{
materialCount = materials.count;
materialsBuffer = materials.SafeAsComputeBuffer<CollisionMaterial>();
}
else
materials.Upload();
}
public void SetTriangleMeshData(ObiNativeTriangleMeshHeaderList headers, ObiNativeBIHNodeList nodes, ObiNativeTriangleList triangles, ObiNativeVector3List vertices)
{
if (triangleMeshCount != headers.count || triangleMeshHeaders == null || !triangleMeshHeaders.IsValid())
{
triangleMeshCount = headers.count;
triangleMeshHeaders = headers.SafeAsComputeBuffer<TriangleMeshHeader>();
bihNodes = nodes.SafeAsComputeBuffer<BIHNode>();
this.triangles = triangles.SafeAsComputeBuffer<Triangle>();
this.vertices = vertices.SafeAsComputeBuffer<Vector3>();
}
}
public void SetEdgeMeshData(ObiNativeEdgeMeshHeaderList headers, ObiNativeBIHNodeList nodes, ObiNativeEdgeList edges, ObiNativeVector2List vertices)
{
if (edgeMeshCount != headers.count || edgeMeshHeaders == null || !edgeMeshHeaders.IsValid())
{
edgeMeshCount = headers.count;
edgeMeshHeaders = headers.SafeAsComputeBuffer<EdgeMeshHeader>();
edgeBihNodes = nodes.SafeAsComputeBuffer<BIHNode>();
this.edges = edges.SafeAsComputeBuffer<Edge>();
edgeVertices = vertices.SafeAsComputeBuffer<Vector2>();
}
}
public void SetDistanceFieldData(ObiNativeDistanceFieldHeaderList headers, ObiNativeDFNodeList nodes)
{
if (distanceFieldCount != headers.count || distanceFieldHeaders == null || !distanceFieldHeaders.IsValid())
{
distanceFieldCount = headers.count;
distanceFieldHeaders = headers.SafeAsComputeBuffer<DistanceFieldHeader>();
dfNodes = nodes.SafeAsComputeBuffer<DFNode>();
}
}
public void SetHeightFieldData(ObiNativeHeightFieldHeaderList headers, ObiNativeFloatList samples)
{
if (heightFieldCount != headers.count || heightFieldHeaders == null || !heightFieldHeaders.IsValid())
{
heightFieldCount = headers.count;
heightFieldHeaders = headers.SafeAsComputeBuffer<HeightFieldHeader>();
heightFieldSamples = samples.SafeAsComputeBuffer<float>();
}
}
public void UpdateWorld(float deltaTime)
{
if (colliderCount > 0)
{
int colliderThreadGroups = ComputeMath.ThreadGroupCount(colliderCount, 128);
int capacityThreadGroups = ComputeMath.ThreadGroupCount(colliderCount * 8, 128);
int cellThreadGroups = ComputeMath.ThreadGroupCount(maxCells, 128);
// clear grid:
gridShader.SetBuffer(clearKernel, "cellOffsets", cellOffsetsBuffer);
gridShader.SetBuffer(clearKernel, "cellIndices", cellIndicesBuffer);
gridShader.SetBuffer(clearKernel, "cellCounts", cellCountsBuffer);
gridShader.SetBuffer(clearKernel, "levelPopulation", levelPopulation);
gridShader.Dispatch(clearKernel, Mathf.Max(cellThreadGroups, capacityThreadGroups), 1, 1);
// build cell list:
gridShader.SetBuffer(buildKernel, "aabbs", aabbsBuffer);
gridShader.SetBuffer(buildKernel, "shapes", shapesBuffer);
gridShader.SetBuffer(buildKernel, "rigidbodies", rigidbodiesBuffer);
gridShader.SetBuffer(buildKernel, "collisionMaterials", materialsBuffer);
gridShader.SetBuffer(buildKernel, "cellIndices", cellIndicesBuffer);
gridShader.SetBuffer(buildKernel, "cellCounts", cellCountsBuffer);
gridShader.SetBuffer(buildKernel, "offsetInCells", offsetInCells);
gridShader.SetBuffer(buildKernel, "levelPopulation", levelPopulation);
gridShader.Dispatch(buildKernel, colliderThreadGroups, 1, 1);
// find populated grid levels:
gridShader.SetBuffer(gridPopulationKernel, "levelPopulation", levelPopulation);
gridShader.Dispatch(gridPopulationKernel, 1, 1, 1);
// prefix sum:
prefixSum.Sum(cellCountsBuffer, cellOffsetsBuffer);
// sort particle indices:
gridShader.SetBuffer(sortKernel, "sortedColliderIndices", sortedColliderIndicesBuffer);
gridShader.SetBuffer(sortKernel, "offsetInCells", offsetInCells);
gridShader.SetBuffer(sortKernel, "cellIndices", cellIndicesBuffer);
gridShader.SetBuffer(sortKernel, "cellOffsets", cellOffsetsBuffer);
gridShader.Dispatch(sortKernel, capacityThreadGroups, 1, 1);
}
}
public void ApplyForceZones(ComputeSolverImpl solver, float deltaTime)
{
if (colliderCount > 0)
{
if (solver.activeParticlesBuffer != null && solver.simplices != null && forceZonesBuffer != null)
{
gridShader.SetInt("pointCount", solver.simplexCounts.pointCount);
gridShader.SetInt("edgeCount", solver.simplexCounts.edgeCount);
gridShader.SetInt("triangleCount", solver.simplexCounts.triangleCount);
gridShader.SetFloat("deltaTime", deltaTime);
gridShader.SetBuffer(applyForceZonesKernel, "contacts", solver.abstraction.colliderContacts.computeBuffer);
gridShader.SetBuffer(applyForceZonesKernel, "dispatchBuffer", dispatchBuffer);
gridShader.SetBuffer(applyForceZonesKernel, "simplices", solver.simplices);
gridShader.SetBuffer(applyForceZonesKernel, "positions", solver.positionsBuffer);
gridShader.SetBuffer(applyForceZonesKernel, "velocities", solver.velocitiesBuffer);
gridShader.SetBuffer(applyForceZonesKernel, "colors", solver.colorsBuffer);
gridShader.SetBuffer(applyForceZonesKernel, "invMasses", solver.invMassesBuffer);
gridShader.SetBuffer(applyForceZonesKernel, "transforms", transformsBuffer);
gridShader.SetBuffer(applyForceZonesKernel, "shapes", shapesBuffer);
gridShader.SetBuffer(applyForceZonesKernel, "forceZones", forceZonesBuffer);
gridShader.SetBuffer(applyForceZonesKernel, "deltasAsInt", solver.positionDeltasIntBuffer);
gridShader.SetBuffer(applyForceZonesKernel, "orientationDeltasAsInt", solver.orientationDeltasIntBuffer);
gridShader.SetBuffer(applyForceZonesKernel, "worldToSolver", solver.worldToSolverBuffer);
gridShader.DispatchIndirect(applyForceZonesKernel, dispatchBuffer);
int threadGroups = ComputeMath.ThreadGroupCount(solver.activeParticleCount, 128);
gridShader.SetInt("particleCount", solver.activeParticleCount);
gridShader.SetBuffer(writeForceZoneResultsKernel, "activeParticles", solver.activeParticlesBuffer);
gridShader.SetBuffer(writeForceZoneResultsKernel, "externalForces", solver.externalForcesBuffer);
gridShader.SetBuffer(writeForceZoneResultsKernel, "life", solver.lifeBuffer);
gridShader.SetBuffer(writeForceZoneResultsKernel, "wind", solver.windBuffer);
gridShader.SetBuffer(writeForceZoneResultsKernel, "deltasAsInt", solver.positionDeltasIntBuffer);
gridShader.SetBuffer(writeForceZoneResultsKernel, "orientationDeltasAsInt", solver.orientationDeltasIntBuffer);
gridShader.Dispatch(writeForceZoneResultsKernel, threadGroups, 1, 1);
}
}
}
public void GenerateContacts(ComputeSolverImpl solver, float deltaTime)
{
if (colliderCount > 0)
{
int particleThreadGroups = ComputeMath.ThreadGroupCount(solver.simplexCounts.simplexCount, 128);
colliderTypeCounts.SetData(colliderCountClear);
dispatchBuffer.SetData(dispatchClear);
if (solver.activeParticlesBuffer != null && solver.simplices != null)
{
solver.abstraction.colliderContacts.computeBuffer.SetCounterValue(0);
gridShader.SetInt("pointCount", solver.simplexCounts.pointCount);
gridShader.SetInt("edgeCount", solver.simplexCounts.edgeCount);
gridShader.SetInt("triangleCount", solver.simplexCounts.triangleCount);
gridShader.SetFloat("colliderCCD", solver.abstraction.parameters.colliderCCD);
gridShader.SetInt("surfaceCollisionIterations", solver.abstraction.parameters.surfaceCollisionIterations);
gridShader.SetFloat("surfaceCollisionTolerance", solver.abstraction.parameters.surfaceCollisionTolerance);
gridShader.SetInt("mode", (int)solver.abstraction.parameters.mode);
gridShader.SetFloat("deltaTime", deltaTime);
gridShader.SetBuffer(contactsKernel, "simplices", solver.simplices);
gridShader.SetBuffer(contactsKernel, "simplexBounds", solver.simplexBounds);
gridShader.SetBuffer(contactsKernel, "positions", solver.positionsBuffer);
gridShader.SetBuffer(contactsKernel, "orientations", solver.orientationsBuffer);
gridShader.SetBuffer(contactsKernel, "principalRadii", solver.principalRadiiBuffer);
gridShader.SetBuffer(contactsKernel, "filters", solver.filtersBuffer);
gridShader.SetBuffer(contactsKernel, "sortedColliderIndices", sortedColliderIndicesBuffer);
gridShader.SetBuffer(contactsKernel, "aabbs", aabbsBuffer);
gridShader.SetBuffer(contactsKernel, "transforms", transformsBuffer);
gridShader.SetBuffer(contactsKernel, "shapes", shapesBuffer);
gridShader.SetBuffer(contactsKernel, "rigidbodies", rigidbodiesBuffer);
gridShader.SetBuffer(contactsKernel, "collisionMaterials", materialsBuffer);
gridShader.SetBuffer(contactsKernel, "collisionMaterialIndices", solver.collisionMaterialIndexBuffer);
gridShader.SetBuffer(contactsKernel, "cellIndices", cellIndicesBuffer);
gridShader.SetBuffer(contactsKernel, "cellOffsets", cellOffsetsBuffer);
gridShader.SetBuffer(contactsKernel, "cellCounts", cellCountsBuffer);
gridShader.SetBuffer(contactsKernel, "levelPopulation", levelPopulation);
gridShader.SetBuffer(contactsKernel, "solverToWorld", solver.solverToWorldBuffer);
gridShader.SetBuffer(contactsKernel, "colliderTypeCounts", colliderTypeCounts);
gridShader.SetBuffer(contactsKernel, "unsortedContactPairs", unsortedContactPairs);
gridShader.SetBuffer(contactsKernel, "dispatchBuffer", dispatchBuffer);
gridShader.Dispatch(contactsKernel, particleThreadGroups, 1, 1);
gridShader.SetBuffer(prefixSumPairsKernel, "colliderTypeCounts", colliderTypeCounts);
gridShader.SetBuffer(prefixSumPairsKernel, "contactOffsetsPerType", contactOffsetsPerType);
gridShader.SetBuffer(prefixSumPairsKernel, "dispatchBuffer", dispatchBuffer);
gridShader.Dispatch(prefixSumPairsKernel, 1, 1, 1);
gridShader.SetBuffer(sortPairsKernel, "shapes", shapesBuffer);
gridShader.SetBuffer(sortPairsKernel, "unsortedContactPairs", unsortedContactPairs);
gridShader.SetBuffer(sortPairsKernel, "contactPairs", contactPairs);
gridShader.SetBuffer(sortPairsKernel, "colliderTypeCounts", colliderTypeCounts);
gridShader.SetBuffer(sortPairsKernel, "contactOffsetsPerType", contactOffsetsPerType);
gridShader.SetBuffer(sortPairsKernel, "dispatchBuffer", dispatchBuffer);
gridShader.DispatchIndirect(sortPairsKernel, dispatchBuffer, 16);
boxes.GenerateContacts(solver, this);
spheres.GenerateContacts(solver, this);
capsules.GenerateContacts(solver, this);
triangleMeshes.GenerateContacts(solver, this, deltaTime);
edgeMeshes.GenerateContacts(solver, this, deltaTime);
distanceFields.GenerateContacts(solver, this, deltaTime);
heightFields.GenerateContacts(solver, this, deltaTime);
}
}
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: ce0ddc77554954cd78643d83b0505396
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,50 +0,0 @@
using UnityEngine;
namespace Obi
{
public class ComputeDistanceField
{
private ComputeShader shader;
private int kernel;
public ComputeDistanceField()
{
shader = GameObject.Instantiate(Resources.Load<ComputeShader>("Compute/DistanceFieldShape"));
kernel = shader.FindKernel("GenerateContacts");
}
public void GenerateContacts(ComputeSolverImpl solver, ComputeColliderWorld world, float deltaTime)
{
if (world.distanceFieldHeaders != null)
{
shader.SetInt("maxContacts", ComputeColliderWorld.maxContacts);
shader.SetInt("pointCount", solver.simplexCounts.pointCount);
shader.SetInt("edgeCount", solver.simplexCounts.edgeCount);
shader.SetInt("triangleCount", solver.simplexCounts.triangleCount);
shader.SetInt("surfaceCollisionIterations", solver.abstraction.parameters.surfaceCollisionIterations);
shader.SetFloat("surfaceCollisionTolerance", solver.abstraction.parameters.surfaceCollisionTolerance);
shader.SetFloat("collisionMargin", solver.abstraction.parameters.collisionMargin);
shader.SetFloat("deltaTime", deltaTime);
shader.SetBuffer(kernel, "worldToSolver", solver.worldToSolverBuffer);
shader.SetBuffer(kernel, "simplices", solver.simplices);
shader.SetBuffer(kernel, "positions", solver.positionsBuffer);
shader.SetBuffer(kernel, "orientations", solver.orientationsBuffer);
shader.SetBuffer(kernel, "velocities", solver.velocitiesBuffer);
shader.SetBuffer(kernel, "principalRadii", solver.principalRadiiBuffer);
shader.SetBuffer(kernel, "transforms", world.transformsBuffer);
shader.SetBuffer(kernel, "shapes", world.shapesBuffer);
shader.SetBuffer(kernel, "contactPairs", world.contactPairs);
shader.SetBuffer(kernel, "contactOffsetsPerType", world.contactOffsetsPerType);
shader.SetBuffer(kernel, "contacts", solver.abstraction.colliderContacts.computeBuffer);
shader.SetBuffer(kernel, "dispatchBuffer", world.dispatchBuffer);
shader.SetBuffer(kernel, "distanceFieldHeaders", world.distanceFieldHeaders);
shader.SetBuffer(kernel, "dfNodes", world.dfNodes);
shader.DispatchIndirect(kernel, world.dispatchBuffer, 32 + 16 * (int)Oni.ShapeType.SignedDistanceField);
}
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: e43826d84a91b447c88f6d65a6e329ac
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,53 +0,0 @@
using UnityEngine;
namespace Obi
{
public class ComputeEdgeMesh
{
private ComputeShader shader;
private int kernel;
public ComputeEdgeMesh()
{
shader = GameObject.Instantiate(Resources.Load<ComputeShader>("Compute/EdgeMeshShape"));
kernel = shader.FindKernel("GenerateContacts");
}
public void GenerateContacts(ComputeSolverImpl solver, ComputeColliderWorld world, float deltaTime)
{
if (world.edgeMeshHeaders != null)
{
shader.SetInt("maxContacts", ComputeColliderWorld.maxContacts);
shader.SetInt("pointCount", solver.simplexCounts.pointCount);
shader.SetInt("edgeCount", solver.simplexCounts.edgeCount);
shader.SetInt("triangleCount", solver.simplexCounts.triangleCount);
shader.SetInt("surfaceCollisionIterations", solver.abstraction.parameters.surfaceCollisionIterations);
shader.SetFloat("surfaceCollisionTolerance", solver.abstraction.parameters.surfaceCollisionTolerance);
shader.SetFloat("collisionMargin", solver.abstraction.parameters.collisionMargin);
shader.SetFloat("deltaTime", deltaTime);
shader.SetBuffer(kernel, "worldToSolver", solver.worldToSolverBuffer);
shader.SetBuffer(kernel, "simplices", solver.simplices);
shader.SetBuffer(kernel, "simplexBounds", solver.simplexBounds);
shader.SetBuffer(kernel, "positions", solver.positionsBuffer);
shader.SetBuffer(kernel, "orientations", solver.orientationsBuffer);
shader.SetBuffer(kernel, "velocities", solver.velocitiesBuffer);
shader.SetBuffer(kernel, "principalRadii", solver.principalRadiiBuffer);
shader.SetBuffer(kernel, "transforms", world.transformsBuffer);
shader.SetBuffer(kernel, "shapes", world.shapesBuffer);
shader.SetBuffer(kernel, "contactPairs", world.contactPairs);
shader.SetBuffer(kernel, "contactOffsetsPerType", world.contactOffsetsPerType);
shader.SetBuffer(kernel, "contacts", solver.abstraction.colliderContacts.computeBuffer);
shader.SetBuffer(kernel, "dispatchBuffer", world.dispatchBuffer);
shader.SetBuffer(kernel, "edgeMeshHeaders", world.edgeMeshHeaders);
shader.SetBuffer(kernel, "edgeBihNodes", world.edgeBihNodes);
shader.SetBuffer(kernel, "edges", world.edges);
shader.SetBuffer(kernel, "edgeVertices", world.edgeVertices);
shader.DispatchIndirect(kernel, world.dispatchBuffer, 32 + 16 * (int)Oni.ShapeType.EdgeMesh);
}
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 6191dad6170694a7c8f9eca0cd733e7a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,51 +0,0 @@
using UnityEngine;
namespace Obi
{
public class ComputeHeightField
{
private ComputeShader shader;
private int kernel;
public ComputeHeightField()
{
shader = GameObject.Instantiate(Resources.Load<ComputeShader>("Compute/HeightfieldShape"));
kernel = shader.FindKernel("GenerateContacts");
}
public void GenerateContacts(ComputeSolverImpl solver, ComputeColliderWorld world, float deltaTime)
{
if (world.heightFieldHeaders != null)
{
shader.SetInt("maxContacts", ComputeColliderWorld.maxContacts);
shader.SetInt("pointCount", solver.simplexCounts.pointCount);
shader.SetInt("edgeCount", solver.simplexCounts.edgeCount);
shader.SetInt("triangleCount", solver.simplexCounts.triangleCount);
shader.SetInt("surfaceCollisionIterations", solver.abstraction.parameters.surfaceCollisionIterations);
shader.SetFloat("surfaceCollisionTolerance", solver.abstraction.parameters.surfaceCollisionTolerance);
shader.SetFloat("collisionMargin", solver.abstraction.parameters.collisionMargin);
shader.SetFloat("deltaTime", deltaTime);
shader.SetBuffer(kernel, "worldToSolver", solver.worldToSolverBuffer);
shader.SetBuffer(kernel, "simplices", solver.simplices);
shader.SetBuffer(kernel, "simplexBounds", solver.simplexBounds);
shader.SetBuffer(kernel, "positions", solver.positionsBuffer);
shader.SetBuffer(kernel, "orientations", solver.orientationsBuffer);
shader.SetBuffer(kernel, "velocities", solver.velocitiesBuffer);
shader.SetBuffer(kernel, "principalRadii", solver.principalRadiiBuffer);
shader.SetBuffer(kernel, "transforms", world.transformsBuffer);
shader.SetBuffer(kernel, "shapes", world.shapesBuffer);
shader.SetBuffer(kernel, "contactPairs", world.contactPairs);
shader.SetBuffer(kernel, "contactOffsetsPerType", world.contactOffsetsPerType);
shader.SetBuffer(kernel, "contacts", solver.abstraction.colliderContacts.computeBuffer);
shader.SetBuffer(kernel, "dispatchBuffer", world.dispatchBuffer);
shader.SetBuffer(kernel, "heightFieldHeaders", world.heightFieldHeaders);
shader.SetBuffer(kernel, "heightFieldSamples", world.heightFieldSamples);
shader.DispatchIndirect(kernel, world.dispatchBuffer, 32 + 16 * (int)Oni.ShapeType.Heightmap);
}
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: c209374faec0f47adacedb911e8582fd
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,42 +0,0 @@
using UnityEngine;
namespace Obi
{
public class ComputeSphere
{
private ComputeShader shader;
private int kernel;
public ComputeSphere()
{
shader = GameObject.Instantiate(Resources.Load<ComputeShader>("Compute/SphereShape"));
kernel = shader.FindKernel("GenerateContacts");
}
public void GenerateContacts(ComputeSolverImpl solver, ComputeColliderWorld world)
{
shader.SetInt("maxContacts", ComputeColliderWorld.maxContacts);
shader.SetInt("pointCount", solver.simplexCounts.pointCount);
shader.SetInt("edgeCount", solver.simplexCounts.edgeCount);
shader.SetInt("triangleCount", solver.simplexCounts.triangleCount);
shader.SetInt("surfaceCollisionIterations", solver.abstraction.parameters.surfaceCollisionIterations);
shader.SetFloat("surfaceCollisionTolerance", solver.abstraction.parameters.surfaceCollisionTolerance);
shader.SetFloat("collisionMargin", solver.abstraction.parameters.collisionMargin);
shader.SetBuffer(kernel, "worldToSolver", solver.worldToSolverBuffer);
shader.SetBuffer(kernel, "simplices", solver.simplices);
shader.SetBuffer(kernel, "positions", solver.positionsBuffer);
shader.SetBuffer(kernel, "orientations", solver.orientationsBuffer);
shader.SetBuffer(kernel, "velocities", solver.velocitiesBuffer);
shader.SetBuffer(kernel, "principalRadii", solver.principalRadiiBuffer);
shader.SetBuffer(kernel, "transforms", world.transformsBuffer);
shader.SetBuffer(kernel, "shapes", world.shapesBuffer);
shader.SetBuffer(kernel, "contactPairs", world.contactPairs);
shader.SetBuffer(kernel, "contactOffsetsPerType", world.contactOffsetsPerType);
shader.SetBuffer(kernel, "contacts", solver.abstraction.colliderContacts.computeBuffer);
shader.SetBuffer(kernel, "dispatchBuffer", world.dispatchBuffer);
shader.DispatchIndirect(kernel, world.dispatchBuffer, 32 + 16 * (int)Oni.ShapeType.Sphere);
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 8994093c1331f405b92c10a6401791d3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,53 +0,0 @@
using UnityEngine;
namespace Obi
{
public class ComputeTriangleMesh
{
private ComputeShader shader;
private int kernel;
public ComputeTriangleMesh()
{
shader = GameObject.Instantiate(Resources.Load<ComputeShader>("Compute/TriangleMeshShape"));
kernel = shader.FindKernel("GenerateContacts");
}
public void GenerateContacts(ComputeSolverImpl solver, ComputeColliderWorld world, float deltaTime)
{
if (world.triangleMeshHeaders != null)
{
shader.SetInt("maxContacts", ComputeColliderWorld.maxContacts);
shader.SetInt("pointCount", solver.simplexCounts.pointCount);
shader.SetInt("edgeCount", solver.simplexCounts.edgeCount);
shader.SetInt("triangleCount", solver.simplexCounts.triangleCount);
shader.SetInt("surfaceCollisionIterations", solver.abstraction.parameters.surfaceCollisionIterations);
shader.SetFloat("surfaceCollisionTolerance", solver.abstraction.parameters.surfaceCollisionTolerance);
shader.SetFloat("collisionMargin", solver.abstraction.parameters.collisionMargin);
shader.SetFloat("deltaTime", deltaTime);
shader.SetBuffer(kernel, "worldToSolver", solver.worldToSolverBuffer);
shader.SetBuffer(kernel, "simplices", solver.simplices);
shader.SetBuffer(kernel, "simplexBounds", solver.simplexBounds);
shader.SetBuffer(kernel, "positions", solver.positionsBuffer);
shader.SetBuffer(kernel, "orientations", solver.orientationsBuffer);
shader.SetBuffer(kernel, "velocities", solver.velocitiesBuffer);
shader.SetBuffer(kernel, "principalRadii", solver.principalRadiiBuffer);
shader.SetBuffer(kernel, "transforms", world.transformsBuffer);
shader.SetBuffer(kernel, "shapes", world.shapesBuffer);
shader.SetBuffer(kernel, "contactPairs", world.contactPairs);
shader.SetBuffer(kernel, "contactOffsetsPerType", world.contactOffsetsPerType);
shader.SetBuffer(kernel, "contacts", solver.abstraction.colliderContacts.computeBuffer);
shader.SetBuffer(kernel, "dispatchBuffer", world.dispatchBuffer);
shader.SetBuffer(kernel, "triangleMeshHeaders", world.triangleMeshHeaders);
shader.SetBuffer(kernel, "bihNodes", world.bihNodes);
shader.SetBuffer(kernel, "triangles", world.triangles);
shader.SetBuffer(kernel, "vertices", world.vertices);
shader.DispatchIndirect(kernel, world.dispatchBuffer, 32 + 16 * (int)Oni.ShapeType.TriangleMesh);
}
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: f52cda7e406964ef4bf980e6ff1f91ec
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,245 +0,0 @@
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Obi
{
public class SpatialQueries
{
private ComputePrefixSum prefixSum;
private ComputeShader gridShader;
private int buildKernel;
private int gridPopulationKernel;
private int sortKernel;
private int contactsKernel;
private int clearKernel;
private int prefixSumPairsKernel;
private int sortPairsKernel;
public GraphicsBuffer sortedShapeIndicesBuffer;
public GraphicsBuffer cellIndicesBuffer; //for each collider, the IDs of the 8 cells it covers.
public GraphicsBuffer cellOffsetsBuffer; //for each cell, start offset in the sorted span indices buffer.
public GraphicsBuffer cellCountsBuffer; // for each cell, how many colliders in it.
public GraphicsBuffer offsetInCells; // for each collider, its offset in each of the 8 cells.
public GraphicsBuffer levelPopulation; // buffer storing the lowest and highest populated level.
private GraphicsBuffer queryTypeCounts; // amount of contacts against each collider type.
public GraphicsBuffer unsortedContactPairs; // unsorted contact pairs.
public GraphicsBuffer contactPairs; // list of contact pairs.
public GraphicsBuffer contactOffsetsPerType; // offset in the contact pairs array for each collider type.
public GraphicsBuffer dispatchBuffer; // dispatch info for iterating trough contacts.
private const int maxCells = 512 * 512;
private const int cellsPerShape = 8;
private const int maxGridLevels = 24;
private uint[] queryCountClear = new uint[Oni.QueryTypeCount];
private uint[] dispatchClear = { 0, 1, 1, 0, // contacts
0, 1, 1, 0, // pairs
0, 1, 1, 0, // spheres
0, 1, 1, 0, // boxes
0, 1, 1, 0 // rays
};
private ComputeSphereQuery spheres;
private ComputeBoxQuery boxes;
private ComputeRayQuery rays;
public SpatialQueries(uint capacity)
{
gridShader = Resources.Load<ComputeShader>("Compute/SpatialQueries");
buildKernel = gridShader.FindKernel("BuildUnsortedList");
gridPopulationKernel = gridShader.FindKernel("FindPopulatedLevels");
sortKernel = gridShader.FindKernel("SortList");
contactsKernel = gridShader.FindKernel("BuildContactList");
clearKernel = gridShader.FindKernel("Clear");
prefixSumPairsKernel = gridShader.FindKernel("PrefixSumColliderCounts");
sortPairsKernel = gridShader.FindKernel("SortContactPairs");
gridShader.SetInt("shapeTypeCount", Oni.QueryTypeCount);
gridShader.SetInt("cellsPerShape", cellsPerShape);
gridShader.SetInt("maxCells", (int)maxCells);
cellOffsetsBuffer = new GraphicsBuffer(GraphicsBuffer.Target.Structured, maxCells, 4);
cellCountsBuffer = new GraphicsBuffer(GraphicsBuffer.Target.Structured, maxCells, 4);
levelPopulation = new GraphicsBuffer(GraphicsBuffer.Target.Structured, maxGridLevels + 1, 4);
dispatchBuffer = new GraphicsBuffer(GraphicsBuffer.Target.IndirectArguments, dispatchClear.Length, sizeof(uint));
queryTypeCounts = new GraphicsBuffer(GraphicsBuffer.Target.Structured, Oni.QueryTypeCount, 4);
contactOffsetsPerType = new GraphicsBuffer(GraphicsBuffer.Target.Structured, Oni.QueryTypeCount + 1, 4);
prefixSum = new ComputePrefixSum(maxCells);
spheres = new ComputeSphereQuery();
boxes = new ComputeBoxQuery();
rays = new ComputeRayQuery();
SetCapacity(capacity);
}
public void Dispose()
{
prefixSum?.Dispose();
cellOffsetsBuffer?.Dispose();
cellCountsBuffer?.Dispose();
levelPopulation?.Dispose();
dispatchBuffer?.Dispose();
queryTypeCounts?.Dispose();
contactOffsetsPerType?.Dispose();
DisposeOfResultsData();
DisposeOfQueryData();
}
private void DisposeOfResultsData()
{
contactPairs?.Dispose();
unsortedContactPairs?.Dispose();
}
private void DisposeOfQueryData()
{
cellIndicesBuffer?.Dispose();
offsetInCells?.Dispose();
sortedShapeIndicesBuffer?.Dispose();
}
private void SetCapacity(uint capacity)
{
DisposeOfResultsData();
gridShader.SetInt("maxResults", (int)capacity);
if (capacity > 0)
{
unsortedContactPairs = new GraphicsBuffer(GraphicsBuffer.Target.Structured, (int)capacity, 8);
contactPairs = new GraphicsBuffer(GraphicsBuffer.Target.Structured, (int)capacity, 8);
}
}
public void SpatialQuery(ComputeSolverImpl solver,
GraphicsBuffer shapes,
GraphicsBuffer transforms,
GraphicsBuffer results)
{
results.SetCounterValue(0);
if (solver.activeParticlesBuffer == null || solver.simplices == null)
return;
// If the maximum amount of query results has changed, set capacity:
if (contactPairs == null || !contactPairs.IsValid() || contactPairs.count != solver.abstraction.maxQueryResults)
SetCapacity(solver.abstraction.maxQueryResults);
// In case we still have zero capacity, just bail out.
if (contactPairs == null || !contactPairs.IsValid())
return;
// Check whether we need to reallocate space for queries:
if (cellIndicesBuffer == null || !cellIndicesBuffer.IsValid() || shapes.count * cellsPerShape >= cellIndicesBuffer.count)
{
DisposeOfQueryData();
cellIndicesBuffer = new GraphicsBuffer(GraphicsBuffer.Target.Structured, shapes.count * cellsPerShape * 2, 4);
offsetInCells = new GraphicsBuffer(GraphicsBuffer.Target.Structured, shapes.count * cellsPerShape * 2, 4);
sortedShapeIndicesBuffer = new GraphicsBuffer(GraphicsBuffer.Target.Structured, shapes.count * cellsPerShape * 2, 4);
}
gridShader.SetInt("queryCount", shapes.count);
int particleThreadGroups = ComputeMath.ThreadGroupCount(solver.simplexCounts.simplexCount, 128);
int shapeThreadGroups = ComputeMath.ThreadGroupCount(shapes.count, 128);
int capacityThreadGroups = ComputeMath.ThreadGroupCount(shapes.count * 8, 128);
int cellThreadGroups = ComputeMath.ThreadGroupCount(maxCells, 128);
queryTypeCounts.SetData(queryCountClear);
dispatchBuffer.SetData(dispatchClear);
// clear grid:
gridShader.SetBuffer(clearKernel, "cellOffsets", cellOffsetsBuffer);
gridShader.SetBuffer(clearKernel, "cellIndices", cellIndicesBuffer);
gridShader.SetBuffer(clearKernel, "cellCounts", cellCountsBuffer);
gridShader.SetBuffer(clearKernel, "levelPopulation", levelPopulation);
gridShader.Dispatch(clearKernel, Mathf.Max(cellThreadGroups, capacityThreadGroups), 1, 1);
// build cell list:
gridShader.SetBuffer(buildKernel, "shapes", shapes);
gridShader.SetBuffer(buildKernel, "transforms", transforms);
gridShader.SetBuffer(buildKernel, "cellIndices", cellIndicesBuffer);
gridShader.SetBuffer(buildKernel, "cellCounts", cellCountsBuffer);
gridShader.SetBuffer(buildKernel, "offsetInCells", offsetInCells);
gridShader.SetBuffer(buildKernel, "levelPopulation", levelPopulation);
gridShader.SetBuffer(buildKernel, "worldToSolver", solver.worldToSolverBuffer);
gridShader.Dispatch(buildKernel, shapeThreadGroups, 1, 1);
// find populated grid levels:
gridShader.SetBuffer(gridPopulationKernel, "levelPopulation", levelPopulation);
gridShader.Dispatch(gridPopulationKernel, 1, 1, 1);
// prefix sum:
prefixSum.Sum(cellCountsBuffer, cellOffsetsBuffer);
// sort query indices:
gridShader.SetBuffer(sortKernel, "sortedColliderIndices", sortedShapeIndicesBuffer);
gridShader.SetBuffer(sortKernel, "offsetInCells", offsetInCells);
gridShader.SetBuffer(sortKernel, "cellIndices", cellIndicesBuffer);
gridShader.SetBuffer(sortKernel, "cellOffsets", cellOffsetsBuffer);
gridShader.Dispatch(sortKernel, capacityThreadGroups, 1, 1);
gridShader.SetInt("pointCount", solver.simplexCounts.pointCount);
gridShader.SetInt("edgeCount", solver.simplexCounts.edgeCount);
gridShader.SetInt("triangleCount", solver.simplexCounts.triangleCount);
gridShader.SetInt("surfaceCollisionIterations", solver.abstraction.parameters.surfaceCollisionIterations);
gridShader.SetFloat("surfaceCollisionTolerance", solver.abstraction.parameters.surfaceCollisionTolerance);
gridShader.SetInt("mode", (int)solver.abstraction.parameters.mode);
gridShader.SetBuffer(contactsKernel, "simplices", solver.simplices);
gridShader.SetBuffer(contactsKernel, "simplexBounds", solver.simplexBounds);
gridShader.SetBuffer(contactsKernel, "positions", solver.positionsBuffer);
gridShader.SetBuffer(contactsKernel, "orientations", solver.orientationsBuffer);
gridShader.SetBuffer(contactsKernel, "principalRadii", solver.principalRadiiBuffer);
gridShader.SetBuffer(contactsKernel, "filters", solver.filtersBuffer);
gridShader.SetBuffer(contactsKernel, "sortedColliderIndices", sortedShapeIndicesBuffer);
gridShader.SetBuffer(contactsKernel, "transforms", transforms);
gridShader.SetBuffer(contactsKernel, "shapes", shapes);
gridShader.SetBuffer(contactsKernel, "collisionMaterialIndices", solver.collisionMaterialIndexBuffer);
gridShader.SetBuffer(contactsKernel, "cellIndices", cellIndicesBuffer);
gridShader.SetBuffer(contactsKernel, "cellOffsets", cellOffsetsBuffer);
gridShader.SetBuffer(contactsKernel, "cellCounts", cellCountsBuffer);
gridShader.SetBuffer(contactsKernel, "levelPopulation", levelPopulation);
gridShader.SetBuffer(contactsKernel, "solverToWorld", solver.solverToWorldBuffer);
gridShader.SetBuffer(contactsKernel, "worldToSolver", solver.worldToSolverBuffer);
gridShader.SetBuffer(contactsKernel, "colliderTypeCounts", queryTypeCounts);
gridShader.SetBuffer(contactsKernel, "unsortedContactPairs", unsortedContactPairs);
gridShader.SetBuffer(contactsKernel, "dispatchBuffer", dispatchBuffer);
gridShader.Dispatch(contactsKernel, particleThreadGroups, 1, 1);
gridShader.SetBuffer(prefixSumPairsKernel, "colliderTypeCounts", queryTypeCounts);
gridShader.SetBuffer(prefixSumPairsKernel, "contactOffsetsPerType", contactOffsetsPerType);
gridShader.SetBuffer(prefixSumPairsKernel, "dispatchBuffer", dispatchBuffer);
gridShader.Dispatch(prefixSumPairsKernel, 1, 1, 1);
gridShader.SetBuffer(sortPairsKernel, "shapes", shapes);
gridShader.SetBuffer(sortPairsKernel, "unsortedContactPairs", unsortedContactPairs);
gridShader.SetBuffer(sortPairsKernel, "contactPairs", contactPairs);
gridShader.SetBuffer(sortPairsKernel, "colliderTypeCounts", queryTypeCounts);
gridShader.SetBuffer(sortPairsKernel, "contactOffsetsPerType", contactOffsetsPerType);
gridShader.SetBuffer(sortPairsKernel, "dispatchBuffer", dispatchBuffer);
gridShader.DispatchIndirect(sortPairsKernel, dispatchBuffer, 16);
boxes.GetResults(solver, this, transforms, shapes, results);
spheres.GetResults(solver, this, transforms, shapes, results);
rays.GetResults(solver, this, transforms, shapes, results);
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 01c4905e2f6964e7b91a3262bbd54229
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: