public float3 GetNodePoseFromBarycentrics(float2 offset, int2 root)
    {
        float3 coords    = 0;
        int    goldenTri = -1;
        int    triCount  = parentGridTris.Length / 3;

        for (int i = 0; i < triCount; i++)
        {
            float2 a = parentGridCoords[parentGridTris[i * 3]];
            float2 b = parentGridCoords[parentGridTris[i * 3 + 1]];
            float2 c = parentGridCoords[parentGridTris[i * 3 + 2]];

            coords = ShiftPlane2ElectricBoogaloo.Barycentric(offset, a, b, c);
            if (!(coords.x < 0 || coords.y < 0 || coords.z < 0))
            {
                goldenTri = i;
                break;
            }
        }

        if (goldenTri == -1)
        {
            Debug.Log("could not triangulate. using default pos");
            return(new float3(offset.x * m_GridSpacing + root.x * m_GridSpacing, offset.y * m_GridSpacing + root.y * m_GridSpacing, 0.0f));
        }

        float3 aPose = parentGridPoses[parentGridTris[goldenTri * 3]];
        float3 bPose = parentGridPoses[parentGridTris[goldenTri * 3 + 1]];
        float3 cPose = parentGridPoses[parentGridTris[goldenTri * 3 + 2]];

        float3 pose = aPose * coords.z + bPose * coords.x + cPose * coords.y;

        return(pose);
    }
    public void UpdateAdjacentNodes(int2 root,
                                    NativeArray <float3> targetPositions,
                                    NativeArray <float3> returnPositions,
                                    NativeArray <bool> affected,
                                    NativeArray <bool> forceUpdatePos,
                                    NativeArray <float3> positions,
                                    NativeArray <float3> prevPositions,
                                    NativeArray <float3> accelerations,
                                    NativeArray <float2> childOffsets)
    {
        s_UpdateAdjacentNodes.Begin();

        for (int index = 0; index < m_RootNodeCount; index++)
        {
            parentGridPoses[index] = colliderArray[index] != null ? colliderArray[index].GetNodeTransform() : parentGridPoses[index];
        }

        var UpdateReturnPosesJob = new ShiftPlane2ElectricBoogaloo()
        {
            parentNodeOffsets = parentGridCoords,
            parentNodePoses   = parentGridPoses,
            childNodeOffsets  = childOffsets,
            triangles         = parentGridTris,
            numTriangles      = parentGridTris.Length / 3,
            targetPositions   = targetPositions,
            returnPositions   = returnPositions,
            affected          = affected,
            forceUpdatePos    = forceUpdatePos,
            positions         = positions,
            prevPositions     = prevPositions,
            accelerations     = accelerations,
            parentGridDenoms  = parentGridDenoms
        };

        UpdateReturnPosesJob.Schedule(returnPositions.Length, 32).Complete();
        s_UpdateAdjacentNodes.End();
    }