Exemple #1
0
    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;
 }
Exemple #3
0
    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();
    }