private void Initialize() { timeStamp = Time.time; SubmergedTriangles.Clear(); TriangleBufferIndices.Clear(); }
private float CuttingAlgorithmHorizontal(VertexInfo top, VertexInfo mid, VertexInfo bottom, int triangleIndex) { if (top.height - mid.height < epsilon) { int triangleType = (mid.height - bottom.height < epsilon) ? 2 : 1; TriangleInfo triangle; if ((top.clockwiseOrder + 1) % 3 == mid.clockwiseOrder) { triangle = new TriangleInfo(top, mid, bottom, triangleType, Rigidbody3d, timeStamp); } else { triangle = new TriangleInfo(mid, top, bottom, triangleType, Rigidbody3d, timeStamp); } TriangleBufferIndices.Add(triangleIndex); SubmergedTriangles.Add(triangle); return(triangle.area); } else if (mid.height - bottom.height < epsilon) { TriangleInfo triangle; if ((top.clockwiseOrder + 1) % 3 == mid.clockwiseOrder) { triangle = new TriangleInfo(top, mid, bottom, 0, Rigidbody3d, timeStamp); } else { triangle = new TriangleInfo(top, bottom, mid, 0, Rigidbody3d, timeStamp); } TriangleBufferIndices.Add(triangleIndex); SubmergedTriangles.Add(triangle); return(triangle.area); } float tPointCutTB = (mid.height - bottom.height) / (top.height - bottom.height); Vector3 pointCutTB = bottom.globalVertex + (top.globalVertex - bottom.globalVertex) * tPointCutTB; VertexInfo cutTB = new VertexInfo { clockwiseOrder = -1, // no more use globalVertex = pointCutTB, height = WaterPatch.instance.DistanceToWater(pointCutTB, timeStamp), }; TriangleInfo upside, downside; if ((top.clockwiseOrder + 1) % 3 == mid.clockwiseOrder) { // downLeft: bottom, downRight: mid upside = new TriangleInfo(top, mid, cutTB, 0, Rigidbody3d, timeStamp); downside = new TriangleInfo(cutTB, mid, bottom, 1, Rigidbody3d, timeStamp); } else { // downLeft: mid, downRight: bottom upside = new TriangleInfo(top, cutTB, mid, 0, Rigidbody3d, timeStamp); downside = new TriangleInfo(mid, cutTB, bottom, 1, Rigidbody3d, timeStamp); } TriangleBufferIndices.Add(triangleIndex); TriangleBufferIndices.Add(triangleIndex); SubmergedTriangles.Add(upside); SubmergedTriangles.Add(downside); return(upside.area + downside.area); }