private void OnDrawGizmos() { if (DEBUG) { for (int i = 0; i < underwaterTriCount; i++) { BuoyTri tri = underwaterTris[i]; // Center Gizmos.color = Color.cyan; Gizmos.DrawSphere(tri.center, 0.01f); // Dynamic forces Gizmos.color = Color.red; Gizmos.DrawLine(tri.center, tri.center - tri.normal * tri.dynamicForce.magnitude * 0.15f); // Buoyant forces Gizmos.color = Color.yellow; Gizmos.DrawLine(tri.center, tri.center + Vector3.up * tri.buoyantForce.magnitude * 0.2f); // Lines Gizmos.color = Color.white; Gizmos.DrawLine(tri.p1, tri.p2); Gizmos.DrawLine(tri.p2, tri.p3); Gizmos.DrawLine(tri.p3, tri.p1); } Gizmos.color = Color.magenta; for (int i = 0; i < waterLines.Count; i++) { Vector3 p0 = waterLines[i].p0; Vector3 p1 = waterLines[i].p1; Gizmos.DrawLine(p0, p1); } } }
public WaterLine(Vector3 p0, Vector3 p1, BuoyTri tri) { this.p0 = p0; this.p1 = p1; this.tri = tri; }
private void Start() { sleep = false; // Check if the values have alread been set and assign them if not. if (originalMesh == null) { originalMesh = GetComponent <MeshFilter>().sharedMesh; } if (dummyMeshTriCount == 0) { dummyMesh = originalMesh; // Get mesh vars to prevent garbage dummyMeshTris = dummyMesh.triangles; dummyMeshVerts = dummyMesh.vertices; dummyMeshTriCount = dummyMeshTris.Length; dummyMeshVertCount = dummyMeshVerts.Length; } underwaterTris = new BuoyTri[dummyMeshTriCount]; for (int i = 0; i < underwaterTris.Length; i++) { underwaterTris[i] = new BuoyTri(); } if (rb == null) { rb = GetComponent <Rigidbody>(); } if (t == null) { t = transform; } meshSize = GetComponent <MeshRenderer>().bounds.size; wgos = GameObject.FindGameObjectsWithTag("Water") .OrderBy(x => Vector3.Distance(this.transform.position, x.transform.position)).ToList(); // No water objects found, dont simulate if (wgos.Count == 0) { simulate = false; } // Water object found else { water = wgos[0]; // Try to get Water Interface WaterInterface wi = null; if (wi = water.GetComponent <WaterInterface>()) { WaterHeightFunction = wi.GetWaterHeightAtLocation; } // No water interface, use transform position for water height else { WaterHeightFunction = GetWaterHeightFlatSurface; } } // Check for water effects script waterEffects = GetComponent <WaterFX>(); // Initial position rbSleepPosition = rb.position; rbSleepUp = rb.transform.up; // Check for dummy meshes with too large complexity if (dummyMeshVertCount > 1000) { Debug.LogWarning("No need for this large a dummy mesh (>1000 vertices). Use mesh simplification for better performance. Object: " + gameObject.name); } // Pre-generate to avoid garbage objVerticesGlobal = new Vector3[dummyMeshVertCount]; distancesToSurface = new float[dummyMeshVertCount]; // Avoid get_Item() overhead vd0 = new VertexData(); vd1 = new VertexData(); vd2 = new VertexData(); }