/*
     * Creates a spring between to vertices (nodes)
     */
    private SceneEdge CreateEdge(Transform parent, int a, int b, Vector3[] vertices, bool isTraction, SceneNode[] arrayNode)
    {
        Vector3 posA = vertices [a];
        Vector3 posB = vertices [b];

        Vector3 AB        = posB - posA;
        float   magnitude = AB.magnitude;

        AB.Normalize();

        GameObject go = new GameObject();

        go.name                    = "Edge_" + a + "_" + b;
        go.transform.parent        = parent;
        go.transform.localPosition = posA + (AB * (magnitude / 2.0f));

        SceneEdge ab = go.AddComponent <SceneEdge>();

        ab.isTraction = true;
        ab.SceneNode0 = arrayNode [a];
        ab.SceneNode1 = arrayNode [b];

                #if C_DEBUG
        DrawDebugLine(transform.position + vertices [a], transform.position + vertices [b], isTraction? Color.red : Color.green);
                #endif

        return(ab);
    }
Пример #2
0
 void OnTriggerEnter2D(Collider2D collision)
 {
     if (collision.gameObject != null)
     {
         if (AlreadyFall == false)
         {
             SceneEdge edge = collision.gameObject.GetComponent <SceneEdge>();
             if (edge != null)
             {
                 SetThinkInactive();
             }
         }
     }
 }
    /**
     * Parses the mesh component into a mass-spring system
     */
    private void parseMesh()
    {
        def = transform.Find("default");
        MeshFilter mf   = def.GetComponent <MeshFilter> ();
        Mesh       mesh = mf.mesh;

        int[]     triangles = mesh.triangles;
        Vector3[] vertices  = mesh.vertices;

        List <SceneNode> nodes = new List <SceneNode> ();

        SceneNode[] arrayNode = new SceneNode[vertices.Length];

        GameObject nodesParent = new GameObject();

        nodesParent.name                    = "Nodes";
        nodesParent.transform.parent        = def;
        nodesParent.transform.localPosition = Vector3.zero;

        GameObject topLeftCorner  = null;
        GameObject topRightCorner = null;

        float lowerY     = float.PositiveInfinity;
        float higherY    = float.NegativeInfinity;
        float rightMostX = float.NegativeInfinity;

        for (int i = 0; i < vertices.Length; i++)
        {
            Vector3 v = vertices [i];

            // Create new scene node
            GameObject empty = new GameObject();

            empty.transform.parent = nodesParent.transform;

            empty.name = "Node_" + i;
            empty.transform.localPosition = v;

                        #if C_DEBUG
            GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            sphere.transform.parent        = empty.transform;
            sphere.transform.localScale    = new Vector3(0.1f, 0.1f, 0.1f);
            sphere.transform.localPosition = Vector3.zero;
                        #endif

            SceneNode sn = empty.AddComponent <SceneNode> ();
            sn.Mass    = NodeMass;
            sn.IsFixed = false;
            SceneNodeWrapper snw = empty.AddComponent <SceneNodeWrapper> ();
            snw.gObject  = def;
            snw.vertexId = i;

            nodes.Add(sn);
            arrayNode [i] = sn;

            if (v.y <= lowerY)
            {
                if (v.z >= rightMostX)
                {
                    rightMostX    = v.z;
                    lowerY        = v.y;
                    topLeftCorner = empty;
                }
            }
            if (v.y >= higherY)
            {
                if (v.z >= rightMostX)
                {
                    rightMostX     = v.z;
                    higherY        = v.y;
                    topRightCorner = empty;
                }
            }
        }

        topLeftCorner.GetComponent <SceneNode>().IsFixed  = true;
        topRightCorner.GetComponent <SceneNode>().IsFixed = true;

        GameObject edgesObj = new GameObject();
        edgesObj.name                    = "Edges";
        edgesObj.transform.parent        = def;
        edgesObj.transform.localPosition = Vector3.zero;

        SceneEdges = new List <SceneEdge> ();
        Dictionary <int[], int> sharedEdges = new Dictionary <int[], int> (new EdgeComparer(vertices.Length));
        for (int i = 0; i < triangles.Length; i = i + 3)
        {
            int a = triangles [i];
            int b = triangles [i + 1];
            int c = triangles [i + 2];

            // Flexion nodes
            int[] aEdge = new int[] { b, c };
            int[] bEdge = new int[] { c, a };
            int[] cEdge = new int[] { a, b };

            // A
            int [] key;
            if (sharedEdges.ContainsKey((key = aEdge)) || sharedEdges.ContainsKey((key = new int[] { c, b })))
            {
                int       other = sharedEdges [key];
                SceneEdge oa    = CreateEdge(edgesObj.transform, other, a, vertices, false, arrayNode);
                SceneEdges.Add(oa);
                sharedEdges.Remove(key);
            }
            else
            {
                sharedEdges.Add(aEdge, a);
                SceneEdge bc = CreateEdge(edgesObj.transform, b, c, vertices, true, arrayNode);
                SceneEdges.Add(bc);
            }

            // B
            if (sharedEdges.ContainsKey((key = bEdge)) || sharedEdges.ContainsKey((key = new int[] { a, c })))
            {
                int       other = sharedEdges [key];
                SceneEdge ob    = CreateEdge(edgesObj.transform, other, b, vertices, false, arrayNode);
                SceneEdges.Add(ob);
                sharedEdges.Remove(key);
            }
            else
            {
                sharedEdges.Add(bEdge, b);
                SceneEdge ca = CreateEdge(edgesObj.transform, c, a, vertices, true, arrayNode);
                SceneEdges.Add(ca);
            }

            // C
            if (sharedEdges.ContainsKey((key = cEdge)) || sharedEdges.ContainsKey((key = new int[] { b, a })))
            {
                int       other = sharedEdges [key];
                SceneEdge oc    = CreateEdge(edgesObj.transform, other, c, vertices, false, arrayNode);
                SceneEdges.Add(oc);
                sharedEdges.Remove(key);
            }
            else
            {
                sharedEdges.Add(cEdge, c);
                SceneEdge ab = CreateEdge(edgesObj.transform, a, b, vertices, true, arrayNode);
                SceneEdges.Add(ab);
            }
        }

        SceneNodes = new List <SceneNode>(arrayNode);
    }