21-06-2017, 09:19 PM
(This post was last modified: 21-06-2017, 09:23 PM by davidrousal.)
for reference if anyone needs similar behaviour
Ps:
would be great if OBI API had methods like external force add to provide a list of particle indicies, would be less dll calls
Code:
public class ObiWaterBox : MonoBehaviour
{
public ObiSolver Solver;
private Collider mCollider;
private int mColliderIndex;
void Awake()
{
mCollider = GetComponent<Collider>();
for (int i = 0; i < Solver.colliderGroup.colliders.Count; ++i)
{
if (Solver.colliderGroup.colliders[i] == mCollider)
{
mColliderIndex = i;
break;
}
}
}
void OnEnable()
{
Solver.OnCollision += ObiCollision;
}
void OnDisable()
{
Solver.OnCollision -= ObiCollision;
}
void Start()
{
}
void ObiCollision(object sender, ObiSolver.ObiCollisionEventArgs eventArguments)
{
float damping = 10.0f;
float force = 20.0f;
Vector4 upForce = new Vector4(0.0f, force, 0.0f, 1.0f);
Vector4[] velocities = {new Vector4()};
foreach (Oni.Contact contact in eventArguments.contacts)
{
if(contact.other!=mColliderIndex)continue; //skip other collision
Oni.GetParticleVelocities(Solver.OniSolver, velocities, 1, contact.particle);
//force up
velocities[0] += Time.deltaTime * upForce;
//damping
velocities[0] -= Time.deltaTime * damping * velocities[0];
Oni.SetParticleVelocities(Solver.OniSolver, velocities, 1, contact.particle);
}
}
void Update()
{
}
}
Ps:
would be great if OBI API had methods like external force add to provide a list of particle indicies, would be less dll calls