Files
Fishing2/Assets/Obi/Scripts/Common/Backends/Compute/Constraints/ComputeConstraintsImpl.cs
2025-11-10 00:08:26 +08:00

127 lines
3.9 KiB
C#

using UnityEngine;
using Unity.Jobs;
using Unity.Collections;
using System.Collections;
using System.Collections.Generic;
namespace Obi
{
public interface IComputeConstraintsImpl : IConstraints
{
void Initialize(float stepTime, float substepTime, int steps, float timeLeft);
void Project(float stepTime, float substepTime, int substeps, float timeLeft);
void Dispose();
IConstraintsBatchImpl CreateConstraintsBatch();
void RemoveBatch(IConstraintsBatchImpl batch);
}
public abstract class ComputeConstraintsImpl<T> : IComputeConstraintsImpl where T : ComputeConstraintsBatchImpl
{
protected ComputeSolverImpl m_Solver;
public List<T> batches = new List<T>();
protected Oni.ConstraintType m_ConstraintType;
public Oni.ConstraintType constraintType
{
get { return m_ConstraintType; }
}
public ISolverImpl solver
{
get { return m_Solver; }
}
public ComputeConstraintsImpl(ComputeSolverImpl solver, Oni.ConstraintType constraintType)
{
this.m_ConstraintType = constraintType;
this.m_Solver = solver;
}
public virtual void Dispose()
{
}
public abstract IConstraintsBatchImpl CreateConstraintsBatch();
public abstract void RemoveBatch(IConstraintsBatchImpl batch);
public virtual int GetConstraintCount()
{
int count = 0;
if (batches == null) return count;
foreach (T batch in batches)
if (batch != null)
count += batch.GetConstraintCount();
return count;
}
public void Initialize(float stepTime, float substepTime, int steps, float timeLeft)
{
// initialize all batches in parallel:
if (batches.Count > 0)
{
for (int i = 0; i < batches.Count; ++i)
if (batches[i].enabled) batches[i].Initialize(stepTime, substepTime, steps, timeLeft);
}
}
public void Project(float stepTime, float substepTime, int substeps, float timeLeft)
{
UnityEngine.Profiling.Profiler.BeginSample("Project");
var parameters = m_Solver.abstraction.GetConstraintParameters(m_ConstraintType);
switch(parameters.evaluationOrder)
{
case Oni.ConstraintParameters.EvaluationOrder.Sequential:
EvaluateSequential(stepTime, substepTime, substeps, timeLeft);
break;
case Oni.ConstraintParameters.EvaluationOrder.Parallel:
EvaluateParallel(stepTime, substepTime, substeps, timeLeft);
break;
}
UnityEngine.Profiling.Profiler.EndSample();
}
protected virtual void EvaluateSequential(float stepTime, float substepTime, int substeps, float timeLeft)
{
// evaluate and apply all batches:
for (int i = 0; i < batches.Count; ++i)
{
if (batches[i].enabled)
{
batches[i].Evaluate(stepTime, substepTime, substeps, timeLeft);
batches[i].Apply(substepTime);
}
}
}
protected virtual void EvaluateParallel(float stepTime, float substepTime, int substeps, float timeLeft)
{
// evaluate all batches:
for (int i = 0; i < batches.Count; ++i)
if (batches[i].enabled)
{
batches[i].Evaluate(stepTime, substepTime, substeps, timeLeft);
}
// then apply them:
for (int i = 0; i < batches.Count; ++i)
if (batches[i].enabled)
{
batches[i].Apply(substepTime);
}
}
}
}