void PropagateWaves() { float[] leftDelta = new float[nodes.Length]; float[] rightDelta = new float[nodes.Length]; int iterations = 2; for (int j = 0; j < iterations; j++) { //Propagate Outward from each node for (int i = 0; i < nodes.Length; i++) { Water2DSurfaceNode leftNode = null; Water2DSurfaceNode node = nodes[i]; Water2DSurfaceNode rightNode = null; if (i + 1 < nodes.Length) { rightNode = nodes[i + 1]; } if (i - 1 >= 0) { leftNode = nodes[i - 1]; } //Multiply height difference by a spread factor if (leftNode != null) { leftDelta[i] = spread * (node.yPos - leftNode.yPos); leftNode.velocity += leftDelta[i]; } if (rightNode != null) { rightDelta[i] = spread * (node.yPos - rightNode.yPos); rightNode.velocity += rightDelta[i]; } } } //Finally Update Positions for (int i = 0; i < nodes.Length; i++) { //Left if (i - 1 >= 0) { nodes[i - 1].yPos += leftDelta[i]; } //Right if (i + 1 < nodes.Length) { nodes[i + 1].yPos += rightDelta[i]; } } }
public void SpawnWater() { edgeCount = Mathf.RoundToInt(width) * nodeDensity; nodeCount = edgeCount + 1; float meshWidth = width / edgeCount; nodes = new Water2DSurfaceNode[nodeCount]; meshes = new Water2DMesh[edgeCount]; //Build Nodes for (int i = 0; i < nodes.Length; i++) { var node = new Water2DSurfaceNode(); nodes[i] = node; node.yPos = top; node.xPos = left + (width * i) / edgeCount; node.acceleration = 0; node.velocity = 0; } //Build Meshes for (int i = 0; i < meshes.Length; i++) { var leftNode = nodes[i]; var rightNode = nodes[i + 1]; meshes[i] = new Water2DMesh(); var edgeMesh = meshes[i]; //Build Mesh edgeMesh.mesh = new Mesh(); Vector3[] verts = new Vector3[4]; verts[0] = new Vector3(0, leftNode.yPos, zOffset); verts[1] = new Vector3(meshWidth, rightNode.yPos, zOffset); verts[2] = new Vector3(meshWidth, -height, zOffset); verts[3] = new Vector3(0, -height, zOffset); // (0) (1) // +--------+ // | | // +--------+ // (3) (2) Vector2[] uv = new Vector2[4]; uv[0] = new Vector2(0, 1); uv[1] = new Vector2(1, 1); uv[2] = new Vector2(0, 0); uv[3] = new Vector3(1, 0); int[] triangles = new int[6] { 0, 1, 3, 3, 1, 2 }; edgeMesh.mesh.vertices = verts; edgeMesh.mesh.uv = uv; edgeMesh.mesh.triangles = triangles; //Build Game Object edgeMesh.gameObject = new GameObject("Mesh " + i); edgeMesh.gameObject.transform.parent = transform; edgeMesh.gameObject.transform.localPosition = new Vector3(leftNode.xPos, 0, 0); edgeMesh.renderer = edgeMesh.gameObject.AddComponent <MeshRenderer>(); edgeMesh.filter = edgeMesh.gameObject.AddComponent <MeshFilter>(); edgeMesh.renderer.material = material; edgeMesh.filter.mesh = edgeMesh.mesh; //Build Collider if (useCollider3D) { edgeMesh.collider3D = edgeMesh.gameObject.AddComponent <BoxCollider>(); edgeMesh.collider3D.size = new Vector3(meshWidth, height, 1); edgeMesh.collider3D.center = new Vector3(meshWidth * 0.5f, height * -0.5f, 0.5f); edgeMesh.collider3D.isTrigger = true; //*/ var waterCollider = edgeMesh.collider3D.gameObject.AddComponent <Water3DCollider>(); waterCollider.waterBody = this; waterCollider.leftNode = i; waterCollider.rightNode = i + 1; } else { edgeMesh.collider = edgeMesh.gameObject.AddComponent <BoxCollider2D>(); edgeMesh.collider.size = new Vector2(meshWidth, height); edgeMesh.collider.offset = new Vector2(meshWidth * 0.5f, height * -0.5f); edgeMesh.collider.isTrigger = true; var waterCollider = edgeMesh.collider.gameObject.AddComponent <Water2DCollider>(); waterCollider.waterBody = this; waterCollider.leftNode = i; waterCollider.rightNode = i + 1; } } }