93 lines
6.6 KiB
C#
93 lines
6.6 KiB
C#
|
|
using UnityEngine;
|
|
|
|
namespace Obi
|
|
{
|
|
public class ComputeDensityConstraintsBatch : ComputeConstraintsBatchImpl, IDensityConstraintsBatchImpl
|
|
{
|
|
|
|
public ComputeDensityConstraintsBatch(ComputeDensityConstraints constraints)
|
|
{
|
|
m_Constraints = constraints;
|
|
m_ConstraintType = Oni.ConstraintType.Density;
|
|
}
|
|
|
|
public override void Evaluate(float stepTime, float substepTime, int steps, float timeLeft)
|
|
{
|
|
if (solverImplementation.particleGrid.sortedFluidIndices != null && solverImplementation.cellCoordsBuffer != null)
|
|
{
|
|
var shader = ((ComputeDensityConstraints)m_Constraints).constraintsShader;
|
|
int densitiesKernel = ((ComputeDensityConstraints)m_Constraints).updateDensitiesKernel;
|
|
|
|
// Need to do this at least every simulation step, since fluid meshing reuses sorted arrays.
|
|
((ComputeDensityConstraints)m_Constraints).CopyDataInSortedOrder();
|
|
|
|
shader.SetInt("maxNeighbors", solverImplementation.particleGrid.maxParticleNeighbors);
|
|
shader.SetInt("mode", (int)solverImplementation.abstraction.parameters.mode);
|
|
shader.SetFloat("deltaTime", substepTime);
|
|
shader.SetVector("diffusionMask", solverAbstraction.parameters.diffusionMask);
|
|
|
|
// calculate densities:
|
|
shader.SetBuffer(densitiesKernel, "neighborCounts", this.solverImplementation.particleGrid.neighborCounts);
|
|
shader.SetBuffer(densitiesKernel, "neighbors", this.solverImplementation.particleGrid.neighbors);
|
|
|
|
shader.SetBuffer(densitiesKernel, "invMasses", solverImplementation.invMassesBuffer);
|
|
shader.SetBuffer(densitiesKernel, "sortedFluidData", solverImplementation.particleGrid.sortedFluidData);
|
|
shader.SetBuffer(densitiesKernel, "sortedPositions", solverImplementation.particleGrid.sortedPositions);
|
|
shader.SetBuffer(densitiesKernel, "sortedPrevPositions", solverImplementation.particleGrid.sortedPrevPosOrientations);
|
|
shader.SetBuffer(densitiesKernel, "sortedFluidMaterials", solverImplementation.particleGrid.sortedFluidMaterials);
|
|
shader.SetBuffer(densitiesKernel, "sortedPrincipalRadii", solverImplementation.particleGrid.sortedPrincipalRadii);
|
|
shader.SetBuffer(densitiesKernel, "renderableOrientations", solverImplementation.orientationDeltasIntBuffer);
|
|
shader.SetBuffer(densitiesKernel, "prevPositions", solverImplementation.prevPositionsBuffer);
|
|
shader.SetBuffer(densitiesKernel, "massCenters", solverImplementation.normalsBuffer);
|
|
shader.SetBuffer(densitiesKernel, "prevMassCenters", solverImplementation.renderablePositionsBuffer);
|
|
shader.SetBuffer(densitiesKernel, "dispatchBuffer", solverImplementation.fluidDispatchBuffer);
|
|
|
|
shader.DispatchIndirect(densitiesKernel, solverImplementation.fluidDispatchBuffer);
|
|
}
|
|
}
|
|
|
|
public override void Apply(float substepTime)
|
|
{
|
|
if (solverImplementation.particleGrid.sortedFluidIndices != null && solverImplementation.cellCoordsBuffer != null)
|
|
{
|
|
var shader = ((ComputeDensityConstraints)m_Constraints).constraintsShader;
|
|
var applyPositionDeltaKernel = ((ComputeDensityConstraints)m_Constraints).applyPositionDeltaKernel;
|
|
var applyKernel = ((ComputeDensityConstraints)m_Constraints).applyKernel;
|
|
|
|
// calculate deltas:
|
|
shader.SetBuffer(applyKernel, "neighborCounts", this.solverImplementation.particleGrid.neighborCounts);
|
|
shader.SetBuffer(applyKernel, "neighbors", this.solverImplementation.particleGrid.neighbors);
|
|
|
|
shader.SetBuffer(applyKernel, "invMasses", solverImplementation.invMassesBuffer);
|
|
shader.SetBuffer(applyKernel, "sortedPositions", solverImplementation.particleGrid.sortedPositions);
|
|
shader.SetBuffer(applyKernel, "sortedPrevPositions", solverImplementation.particleGrid.sortedPrevPosOrientations);
|
|
shader.SetBuffer(applyKernel, "sortedFluidMaterials", solverImplementation.particleGrid.sortedFluidMaterials);
|
|
shader.SetBuffer(applyKernel, "sortedPrincipalRadii", solverImplementation.particleGrid.sortedPrincipalRadii);
|
|
shader.SetBuffer(applyKernel, "renderableOrientations", solverImplementation.orientationDeltasIntBuffer);
|
|
shader.SetBuffer(applyKernel, "prevPositions", solverImplementation.prevPositionsBuffer);
|
|
shader.SetBuffer(applyKernel, "massCenters", solverImplementation.normalsBuffer);
|
|
shader.SetBuffer(applyKernel, "prevMassCenters", solverImplementation.renderablePositionsBuffer);
|
|
shader.SetBuffer(applyKernel, "sortedFluidData", solverImplementation.particleGrid.sortedFluidData);
|
|
shader.SetBuffer(applyKernel, "deltasAsInt", solverImplementation.positionDeltasIntBuffer);
|
|
shader.SetBuffer(applyKernel, "positionConstraintCounts", solverImplementation.positionConstraintCountBuffer);
|
|
shader.SetBuffer(applyKernel, "sortedToOriginal", solverImplementation.particleGrid.sortedFluidIndices);
|
|
shader.SetBuffer(applyKernel, "dispatchBuffer", solverImplementation.fluidDispatchBuffer);
|
|
|
|
shader.DispatchIndirect(applyKernel, solverImplementation.fluidDispatchBuffer);
|
|
|
|
// apply position deltas
|
|
shader.SetBuffer(applyPositionDeltaKernel, "positions", solverImplementation.positionsBuffer);
|
|
shader.SetBuffer(applyPositionDeltaKernel, "fluidData", solverImplementation.fluidDataBuffer);
|
|
shader.SetBuffer(applyPositionDeltaKernel, "sortedFluidData", solverImplementation.particleGrid.sortedFluidData);
|
|
shader.SetBuffer(applyPositionDeltaKernel, "renderableOrientations", solverImplementation.orientationDeltasIntBuffer);
|
|
shader.SetBuffer(applyPositionDeltaKernel, "deltasAsInt", solverImplementation.positionDeltasIntBuffer);
|
|
shader.SetBuffer(applyPositionDeltaKernel, "positionConstraintCounts", solverImplementation.positionConstraintCountBuffer);
|
|
shader.SetBuffer(applyPositionDeltaKernel, "sortedToOriginal", solverImplementation.particleGrid.sortedFluidIndices);
|
|
shader.SetBuffer(applyPositionDeltaKernel, "dispatchBuffer", solverImplementation.fluidDispatchBuffer);
|
|
|
|
shader.DispatchIndirect(applyPositionDeltaKernel, solverImplementation.fluidDispatchBuffer);
|
|
}
|
|
}
|
|
}
|
|
} |