23-08-2019, 10:35 AM
Here, I wrote this for you. Add it to the cloth component, and set it to update after the solver in ScriptExecutionOrder. This way it is 100% sure it will be done after all simulation is completed.
Works fine, collisions with colliders and all. Still, doing this in the vertex shader would be far more performant.
The solver is set up in local space mode, and all colliders, cloth, etc are parented under it. Note that none of the colliders has negative scale, only the solver does. I'm also attaching a video of the results:
Code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Obi;
[RequireComponent(typeof (ObiCloth))]
public class FlipNormals : MonoBehaviour {
private ObiCloth actor;
// Update is called once per frame
void Awake ()
{
actor = GetComponent<ObiCloth>();
}
private void LateUpdate()
{
Vector3 solverScale = actor.Solver.transform.localScale;
if (solverScale.x < 0 || solverScale.y < 0 || solverScale.z < 0)
{
Vector3[] normals = actor.clothMesh.normals;
for (int i = 0; i < normals.Length; i++)
normals[i] *= -1;
actor.clothMesh.normals = normals;
}
}
}
Works fine, collisions with colliders and all. Still, doing this in the vertex shader would be far more performant.
The solver is set up in local space mode, and all colliders, cloth, etc are parented under it. Note that none of the colliders has negative scale, only the solver does. I'm also attaching a video of the results: