Example #1
0
 /// <summary>
 /// Ajoute un vertex (avec un mesh repr�sentatif) � la position indiqu�e et cr�e une arr�te avec le vertex pr�c�dent
 /// </summary>
 /// <param name="position">position du vertex � ajouter</param>
 private void addVertex(Vector3 position, bool localPosition=false)
 {
     PVertex v = new PVertex();
     v.gameObject = createVertexObject(position);
     if(m_vertices.Count>0)
         addEdge(m_vertices.Last.Value, v);
     m_vertices.AddLast(v);
 }
Example #2
0
    /// <summary>
    /// Ajoute un Vertex v0 entre v1 et v2 dans la liste et ajoute les ar�tes [v1 v0] et [v2 v0]
    /// v0 sera positionn� selon le param�tre position
    /// </summary>
    void addVertexOnEdge(PVertex v1, PVertex v2,Vector3 position)
    {
        //Si c'est l'ar�tre entre le premier et le dernier vertex ( la rouge), on fait un simple ajout
        if ((v1 == m_vertices.First.Value && v2 == m_vertices.Last.Value) || (v2 == m_vertices.First.Value && v1 == m_vertices.Last.Value))
        {
            removeEdge(m_vertices.First.Value, m_vertices.Last.Value);
            addVertex(position);
            addEdge(m_vertices.First.Value, m_vertices.Last.Value, true);
            m_vertexSelected = null;
            m_edgeSelected = null;

            //on remet le nouveau en vert
            PVertex selected = m_vertices.Last.Value;
            selected.gameObject.GetComponent<Renderer>().material.SetColor("_Color",SELECTED_COLOR);
        }
        else
        { //sinon on cr�e un nouveau vertex, ins�r� au bon endroit dans la liste
            PVertex vNew = new PVertex();
            vNew.gameObject = createVertexObject(position);
            LinkedListNode<PVertex> n1 = m_vertices.Find(v1);
            LinkedListNode<PVertex> n2 = m_vertices.Find(v2);
            if (n1.Next == n2)
            {
                m_vertices.AddAfter(n1, vNew);
            }
            else
                m_vertices.AddAfter(n2, vNew);
            addEdge(vNew, v1);
            addEdge(vNew, v2);
            removeEdge(v1, v2);
            m_vertexSelected = vNew;
            m_edgeSelected = null;

            //on remet le nouveau en vert
            m_vertexSelected.gameObject.GetComponent<Renderer>().material.SetColor("_Color",SELECTED_COLOR);
        }
    }
Example #3
0
 /// <summary>
 /// S'il existe un vertex ayant pour GameObject celui pass� en param�tre alors m_vertexSelected prend sa valeur.
 /// </summary>
 public void selectVertexFromGameObject(GameObject go)
 {
     Debug.Log("gameobject selected :" + go.ToString());
     foreach (PVertex v in m_vertices)
     {
         if (v.gameObject == go)
         {
             //on remet l'ancien vertex en bleu
             if (m_vertexSelected != null)
             {
                 m_vertexSelected.gameObject.GetComponent<Renderer>().material.SetColor("_Color",UNSELECTED_COLOR);
             }
             else if (m_vertices.Count > 0)
             {
                 PVertex selected = m_vertices.Last.Value;
                 selected.gameObject.GetComponent<Renderer>().material.SetColor("_Color",UNSELECTED_COLOR);
             }
             m_vertexSelected = v;
             //on met le nouveau en vert
             m_vertexSelected.gameObject.GetComponent<Renderer>().material.SetColor("_Color",SELECTED_COLOR);
             break;
         }
     }
 }
Example #4
0
    /// <summary>
    /// Ajoute une ar�te entre les vertex v1 et v2.
    /// � l'ar�te est associ�e un gameobject constitu� d'une mesh repr�sentative et d'une mesh tr�s haute et fine servant aux collisions
    /// </summary>
    private void addEdge(PVertex v1, PVertex v2,bool lastEdge=false,bool rendererEnabled=true)
    {
        PEdge e = new PEdge();
        e.v1 = v1;
        e.v2 = v2;

        v1.linked.Add(v2);
        v2.linked.Add(v1);
        e.gameObject = createEdgeObject();
        /*if (lastEdge)
        {
            e.gameObject.transform.FindChild("line").renderer.material = m_matLastEdge;
        }*/
        e.gameObject.transform.position = (e.v1.Position+ e.v2.Position) / 2;
        e.gameObject.transform.LookAt(v1.Position);
        e.gameObject.transform.parent = null;
        e.gameObject.transform.localScale = new Vector3( e.gameObject.transform.localScale.x, e.gameObject.transform.localScale.y, Vector3.Distance(e.v1.Position, e.v2.Position));
        e.gameObject.transform.parent = this.gameObject.transform;
        m_edges.Add(e);
        if (!rendererEnabled)
        {
            e.gameObject.GetComponentInChildren<MeshRenderer>().enabled = false;
        }
    }
Example #5
0
 /// <summary>
 /// chargement d'un PVertex depuis un arraylist
 /// </summary>
 /// <param name="al"></param>
 /// <param name="index">index du vertex dans l'arraylist</param>
 /// <param name="fun"></param>
 /// <returns></returns>
 public static PVertex load(ArrayList al,int index, Function_terrace fun)
 {
     PVertex v = new PVertex();
     v.gameObject = fun.createVertexObject(new Vector3((float)al[index], (float)al[index+1], (float)al[index+2]));
     return v;
 }
Example #6
0
    public void OnGUI()
    {
        if (m_showGUI)
        {
            GUISkin backup = GUI.skin;
            GUI.skin = m_skin;

            GUILayout.BeginArea(m_uiArea);
            GUILayout.FlexibleSpace();
            GUILayout.Box("", "UP", GUILayout.Width(280), GUILayout.Height(150));
            GUILayout.BeginVertical("MID");

            //m_uiRects contiens les rectangles des �l�ments du menu afin de savoir si la souris est dessus ou pas
            m_uiRects = new List<Rect>();

            //Bouton Material
            GUILayout.BeginHorizontal("", "bg", GUILayout.Height(50), GUILayout.Width(280));
            GUILayout.FlexibleSpace();
            if (GUILayout.Button(TextManager.GetText("GUIMenuConfiguration.Materials"), "Menu", GUILayout.Height(50), GUILayout.Width(280)))
            {
                //Parfois la plage deviens vert s�lectionn�e quand on change sons material, ce serait mieux pas...
                mainScene.GetComponent<GUIMenuInteraction>().isConfiguring = true;
                Camera.main.GetComponent<ObjInteraction>().setSelected(gameObject);
                Camera.main.GetComponent<ObjInteraction>().setActived(false);

                mainScene.GetComponent<GUIMenuConfiguration>().enabled = true;
                mainScene.GetComponent<GUIMenuConfiguration>().setVisibility(true);
                mainScene.GetComponent<GUIMenuConfiguration>().OpenMaterialTab();

                mainScene.GetComponent<GUIMenuLeft>().canDisplay(false);
                mainScene.GetComponent<GUIMenuRight>().canDisplay(false);
                hideGUI();
                m_editingMode = false;
                hideVertices();

                //G�n�ration de la mesh si ce n'a pas �t� fait
                if (m_plageMesh == null)
                {
                    //Les colliders sont d�sactiver apr�s la cr�ation de la mesh pour pas interf�rer avec le fonctionnement de oneshot
                    m_disableCollidersAfterCreatingMesh = true;
                    StartCoroutine(generatePolygons());
                }
                m_edgeSelected = null;
            }
            //Ajout � la liste de rectangle celui correspondant au bouton
            m_uiRects.Add(GUILayoutUtility.GetLastRect());
            GUILayout.Space(20);
            GUILayout.EndHorizontal();

            //Bouton configurer => quand on clique dessus, �a masque la gui pour revenir au menu pr�c�dent
            GUILayout.BeginHorizontal("", "bg", GUILayout.Height(50), GUILayout.Width(280));
            GUILayout.FlexibleSpace();
            if (!GUILayout.Toggle(true, TextManager.GetText("Terrasse.Configurer"), "Menu", GUILayout.Height(50), GUILayout.Width(280)))
            {
                if (m_plageMesh == null)
                {
                    m_disableCollidersAfterCreatingMesh = true;
                    StartCoroutine(generatePolygons());
                }
                exitConfigurator(true);
                hideGUI();
            }
            m_uiRects.Add(GUILayoutUtility.GetLastRect());
            GUILayout.Space(20);
            GUILayout.EndHorizontal();

            //editing_mode est activ� quand l'utilisateur �dite le contours
            if (m_editingMode)
            {
                //Bouton pour quitter l'editing mode et g�n�rer la mesh
                GUILayout.BeginHorizontal("", "bg", GUILayout.Height(50), GUILayout.Width(280));
                GUILayout.FlexibleSpace();
                if (!GUILayout.Toggle(true, TextManager.GetText("Terrasse.Edit"), "Menu", GUILayout.Height(50), GUILayout.Width(280)))
                {
                    m_editingMode = false;
                    hideVertices();
                    if(m_plageMesh==null)
                        StartCoroutine(generatePolygons());
                    m_edgeSelected = null;
                }
                GUILayout.Space(20);
                GUILayout.EndHorizontal();
                m_uiRects.Add(GUILayoutUtility.GetLastRect());

                //Bouton pour supprimer un Vertex, uniquement disponible s'il y a plus de 3 Vertices
                if (m_vertices.Count > 3)
                {
                    GUILayout.BeginHorizontal("", "bg", GUILayout.Height(50), GUILayout.Width(280));
                    GUILayout.FlexibleSpace();
                    if (GUILayout.Button(TextManager.GetText("Terrasse.Delete"), "Menu", GUILayout.Height(50), GUILayout.Width(280)))
                    {
                        Debug.Log("selected : " + m_vertexSelected);
                        PVertex todel = null;

                        //Si un Vertex est s�lection�e, on le suprime
                        if (m_vertexSelected != null)
                        {
                            todel = m_vertexSelected;
                        }
                         //Sinon on suprime le dernier vertex de la liste
                        else if (m_vertices.Count > 0)
                        {
                            todel = m_vertices.Last.Value;
                        }
                        Debug.Log("Suppression points :" + todel.ToString());
                        if (todel != null)
                        {
                            if (todel.linked.Count > 1)
                            {
                                if (todel == m_vertices.First.Value || todel == m_vertices.Last.Value)
                                    addEdge(todel.linked[0], todel.linked[1], true);
                                else
                                    addEdge(todel.linked[0], todel.linked[1]);
                                deleteEar(todel, todel.linked[0], todel.linked[1], true);
                            }
                            else if (todel.linked.Count > 0)
                                deleteEar(todel, todel.linked[0], null, true);
                            else
                                deleteEar(todel, null, null, true);
                        }
                        m_vertexSelected = null;
                        //on remet le premier en vert
                        if (m_vertices.Count > 0)
                        {
                            PVertex selected = m_vertices.Last.Value;
                            selected.gameObject.GetComponent<Renderer>().material.SetColor("_Color",SELECTED_COLOR);
                        }
                    }
                    m_uiRects.Add(GUILayoutUtility.GetLastRect());
                    GUILayout.Space(20);
                    GUILayout.EndHorizontal();
                }

                GUILayout.BeginHorizontal("", "bg", GUILayout.Height(50), GUILayout.Width(280));
                GUILayout.FlexibleSpace();
                if (GUILayout.Button(TextManager.GetText("Terrasse.Generate"), "Menu", GUILayout.Height(50), GUILayout.Width(280)))
                {
                    Debug.Log("genrere terasse clicked");
                    m_editingMode = false;
                    hideVertices();
                    StartCoroutine(generatePolygons());
                    m_edgeSelected = null;
                }
                m_uiRects.Add(GUILayoutUtility.GetLastRect());
                GUILayout.Space(20);
                GUILayout.EndHorizontal();

            }
            else
            {

                if (m_thicknessString == null)
                {
                    m_thicknessString = (Mathf.Ceil(m_thickness * 100) / 100).ToString();
                }

                GUILayout.BeginHorizontal("", "bg", GUILayout.Height(50), GUILayout.Width(280));
                GUILayout.FlexibleSpace();
                if (GUILayout.Toggle(false, TextManager.GetText("Terrasse.Edit"), "Menu", GUILayout.Height(50), GUILayout.Width(280)))
                {
                    Destroy(m_plageMesh);
                    m_editingMode = true;
                    hideGUITimer = Time.time;
                    m_thicknessMode = false;
                    showVertices();

                    //on met le dernier point en vert
                    if (m_vertexSelected != null)
                    {
                        //PVertex selected = m_vertexSelected;
                        m_vertexSelected.gameObject.GetComponent<Renderer>().material.SetColor("_Color",SELECTED_COLOR);
                    }
                    else if (m_vertices.Count > 0)
                    {
                        PVertex selected = m_vertices.Last.Value;
                        selected.gameObject.GetComponent<Renderer>().material.SetColor("_Color",SELECTED_COLOR);
                    }
                }
                GUILayout.Space(20);
                GUILayout.EndHorizontal();

            }

        //Epaisseur
          /*  bool oldthickMode = m_thicknessMode;
            GUILayout.BeginHorizontal("", "bg", GUILayout.Height(50), GUILayout.Width(280));
            GUILayout.FlexibleSpace();
            m_thicknessMode = GUILayout.Toggle(m_thicknessMode, "R�glage �paisseur", "Menu", GUILayout.Height(50), GUILayout.Width(280));
            m_uiRects.Add(GUILayoutUtility.GetLastRect());
            GUILayout.Space(20);
            GUILayout.EndHorizontal();

            if (m_thicknessMode && !oldthickMode)
            {
                m_editingMode = false;
                hideVertices();
                if(m_plageMesh==null)
                   StartCoroutine(generatePolygons());
                m_edgeSelected = null;
                // Camera.mainCamera.GetComponent<ObjInteraction>().setActived(true);
            }
            if (m_thicknessMode)
            {

                GUILayout.BeginHorizontal("", "bg", GUILayout.Height(50), GUILayout.Width(280));
                GUILayout.FlexibleSpace();
                if (GUILayout.RepeatButton("+", "btn+", GUILayout.Height(50), GUILayout.Width(50)))
                {
                    Debug.Log("Xplus pressed");
                    setPlageThickness(m_thickness + c_thicknessDelta);
                    m_thicknessString = (Mathf.Ceil(m_thickness * 100) / 100).ToString();
                }
                string tempText = GUILayout.TextField(m_thicknessString, GUILayout.Height(50), GUILayout.Width(50));
                bool minusPressed = false;
                if (GUILayout.RepeatButton("-", "btn-", GUILayout.Height(50), GUILayout.Width(50)))
                {
                    Debug.Log("Xminus pressed");
                    minusPressed = true;
                    if (m_thickness - c_thicknessDelta >= 0)
                    {
                        Debug.Log(">0");
                        setPlageThickness(m_thickness - c_thicknessDelta);
                        Debug.Log("Xminus pressed");
                        m_thicknessString = (Mathf.Ceil(m_thickness * 100) / 100).ToString();
                    }
                    else
                    {
                        setPlageThickness(0);
                        m_thicknessString = "0";
                    }

                }
                if (!tempText.Equals(m_thicknessString) && !minusPressed)
                {

                    try
                    {
                        Debug.Log("parsing newScalex");
                        float newThickness = float.Parse(tempText.Replace(',', '.'));
                        if (newThickness > 0)
                        {
                            Debug.Log("newscaleX>0");
                            setPlageThickness(newThickness);
                            m_thicknessString = tempText;
                        }
                        else
                        {

                            setPlageThickness(0);
                            if (newThickness == 0)
                            {
                                Debug.Log("newscaleX=0");
                                m_thicknessString = tempText;
                            }
                            else
                            {
                                Debug.Log("newscaleX=0");
                                m_thicknessString = "0";
                            }
                        }
                    }
                    catch (UnityException e)
                    {
                        Debug.Log("exception : " + e.ToString());
                        if (tempText.Equals(""))
                        {
                            Debug.Log("temptext=''");
                            m_thicknessString = "0";
                            setPlageThickness(0);
                        }
                        else
                        {
                            m_thicknessString = (Mathf.Ceil(m_thickness * 100) / 100).ToString();
                        }
                    }

                }
                //GUILayout.Label("Epaisseur", GUILayout.Width(60));
                GUILayout.Space(20);
                GUILayout.EndHorizontal();
            }*/

            GUILayout.EndVertical();
            GUILayout.Box("", "DWN", GUILayout.Width(280), GUILayout.Height(150));//fade en bas

            GUILayout.FlexibleSpace();

            GUILayout.EndArea();

            GUI.skin = backup;

        }
    }
Example #7
0
 /// <summary>
 /// Chargement d'un PVertex depuis un BinaryReader
 /// </summary>
 /// <param name="buf">BinaryReader de la sauvegarde</param>
 /// <param name="fun">terrace</param>
 /// <returns></returns>
 public static PVertex load(BinaryReader buf,Function_terrace fun)
 {
     PVertex v= new PVertex();
        // vgo.transform.position = position;
     float x=(float)buf.ReadDouble();
      float y=(float)buf.ReadDouble();
      float z=(float)buf.ReadDouble();
      Debug.Log("loading vertex");
      Debug.Log("x=" + x);
      Debug.Log("y=" + y);
      Debug.Log("z=" + z);
      v.gameObject = fun.createVertexObject(new Vector3(x, y, z));
     return v;
 }
Example #8
0
    /// <summary>
    /// retourne vrai si le vertex v0 est le sommet d'une oreille
    /// </summary>
    /// <param name="nbRays">Nombre de raycast � faire sur l'arr�te oppos�e � v0</param>
    private bool isEar(PVertex v0,int nbRays)
    {
        if(v0.linked.Count<2)
            return false;
        PVertex v1 = v0.linked[0];
        PVertex v2 = v0.linked[1];
        bool isEar = true;
        RaycastHit[] hits1;
        for (int i = 0; i < nbRays; i++)
        {
            //On fait des raycast le long de l'arr�te pour voir si elle est bien � l'int�rieur du polygone
            Vector3 mid12 = ((i + 1) * v1.Position + (nbRays - i) * v2.Position) / (nbRays + 1);
            //Vector3 v1Pos = v1.Position - transform.localPosition;
            //Vector3 v2Pos = v2.Position - transform.localPosition;
            //Vector3 mid12 = ((i + 1) * v1Pos + (nbRays - i) * v2Pos) / (nbRays + 1);
            //Debug.DrawRay(mid12, Vector3.forward*200,Color.red,5f);
            //Debug.DrawRay(v2.Position, (v2.Position-v1.Position).normalized* -200,UNSELECTED_COLOR,5f);
            hits1 = Physics.RaycastAll(mid12, Vector3.forward, 200, 1 << 24/*LayerMask.NameToLayer("polyplage")*/);
            if ((hits1.Length ) % 2 == 0 || (hits1.Length )==0)
            {
                /*if ((hits1.Length )==0)
                {
                    Debug.DrawRay(mid12, Vector3.forward*200*(i+1)/10,Color.yellow,5f);
                    isEar= false;
                    break;
                }*/
            //	listGizmos.Clear();
            //	drawGizmo = true;
            //	Debug.Log ("Alert i = "+i+" hits1.Length "+hits1.Length);
            /*	Debug.DrawRay(mid12, Vector3.forward*200*(i+1)/10,SELECTED_COLOR,5f);
                foreach (RaycastHit raycasthit in hits1)
                {
                    listGizmos.Add(raycasthit.point);
                    //listColliderCenter.Add(((BoxCollider) raycasthit.collider).bounds.center);
                    //listColliderExtents.Add(((BoxCollider) raycasthit.collider).bounds.extents);

                    Renderer renderer = raycasthit.collider.renderer;
                    if (renderer) {
                        renderer.material.shader = Shader.Find("Transparent/Diffuse");
                        Color color =  renderer.material.color;
                        color.a  = 0.3F;
                        renderer.material.color=color;
                    }

                }*/
                isEar= false;
        //		Debug.Break();
        //		drawGizmo = false;
                break;
            }
            /*else if ((hits1.Length )==0)
            {
                Debug.DrawRay(mid12, Vector3.forward*200*(i+1)/10,Color.yellow,5f);
                isEar= false;
                break;
            }*/
            /*else{
                Debug.DrawRay(mid12, Vector3.forward*200*(i+1)/10,Color.red,5f);
            }*/
            /*hits1 = Physics.RaycastAll(v2.Position, (v2.Position-v1.Position).normalized, -200, 1 << LayerMask.NameToLayer("polyplage"));
            if ((hits1.Length ) % 2 == 0 || (hits1.Length )==0)
            {
                isEar= false;
                break;
            }*/
        }
        return isEar;
    }
Example #9
0
 /// <summary>
 /// Ajoute le triangle de l'oreille � la liste de triangles du futur mesh de la plage
 /// </summary>
 private void saveEar(PVertex v0, PVertex v1, PVertex v2)
 {
     if (Vector3.Cross(v1.Position-v0.Position,v2.Position-v0.Position).y>0)
     {
         m_trisList.Add(v0.getIndex(m_verticesSaved));
         m_trisList.Add(v1.getIndex(m_verticesSaved));
         m_trisList.Add(v2.getIndex(m_verticesSaved));
     }
     else
     {
         m_trisList.Add(v0.getIndex(m_verticesSaved));
         m_trisList.Add(v2.getIndex(m_verticesSaved));
         m_trisList.Add(v1.getIndex(m_verticesSaved));
     }
 }
Example #10
0
    // Update is called once per frame
    void Update()
    {
        //Mode �dition
        if (m_editingMode)
        {
            bool oldShowGui = m_showGUI;

            //met � jour clickedOnUI pour voir si la souris est sur le menu
            updateOnUI();

            m_showGUI = true;

            if (PC.In.Click1Up())
            {
                _justeSelected=false;
                //Si relachement click et souris pas sur le menu, on affiche le menu
                if (clickedOnUI || PC.In.GetCursorPos().x <= Screen.width - 280)
                {
                    //Debug.Log("showing gui because click one up and not cursor on the ui position");
                    hideGUITimer = Time.time;//remettre hideGUITimer � Time.time permet d'afficher le menu pour quelque secondes
                    mainScene.GetComponent<GUIMenuConfiguration>().ShowHelpPannel = false;
                }
                else
                {
                    Debug.Log("hiding GUI because click1Up and mouse not on ui");
                    hideGUI();
                }

            }

            //Si 2 secondes se sont pass� depuis la derni�re mis � jour de hideGUITimer, on cache le menu
            if (Time.time - hideGUITimer > 2f)
            {
                hideGUI();
            }

            if (!clickedOnUI)
            {
                                //click pas sur le menu
                if (PC.In.Click1Down())
                {
                    //raycast
                    RaycastHit vHit = new RaycastHit();
                    RaycastHit vHitEdge = new RaycastHit();
                    Ray vRay = Camera.main.ScreenPointToRay(PC.In.GetCursorPos());

                    //Si on clicke pas sur un vertex
                    if (!Physics.Raycast(vRay, out vHit, 1000, 1 << LayerMask.NameToLayer("vertexplage")))
                    {
                        //Ar�te s�lectionn�e
                        if (Physics.Raycast(vRay, out vHitEdge, 1000, 1 << LayerMask.NameToLayer("edgeplage")))
                        {
                          //  Debug.Log("edge selected");
                            //on remet l'ancien vertex en bleu
                            if (m_vertexSelected != null)
                            {
                                m_vertexSelected.gameObject.GetComponent<Renderer>().material.SetColor("_Color",UNSELECTED_COLOR);
                            }
                            else if (m_vertices.Count > 0)
                            {
                                PVertex selected = m_vertices.Last.Value;
                                selected.gameObject.GetComponent<Renderer>().material.SetColor("_Color",UNSELECTED_COLOR);
                            }
                            m_vertexSelected = null;
                            selectEdgeFromGameObject(vHitEdge.collider.gameObject);
                            //ajout d'un vertex sur l'ar�te s�lectionn�e
                            addVertexOnEdge(m_edgeSelected, vHitEdge.point);
                            _justeSelected = true;
                        }
                        //Rien de s�lectionn�e -> on enleve le fonction ajout d'un point dans le vide
                        /*else if (Physics.Raycast(vRay, out vHit, 1000, 1 << LayerMask.NameToLayer("grid")))
                        {
                            //Ajout d'un Vertex, entre le premier et le dernier
                            addVertexOnEdge(m_vertices.First.Value, m_vertices.Last.Value, vHit.point);
                            m_vertexSelected = null;
                            m_edgeSelected = null;

                        }*/

                    }
                    else
                    {
                        //S�lection d'un vertex
                        Debug.Log("select a vertex");
                        GameObject vgo = vHit.collider.gameObject;
                        if (vgo != null)
                        {
                            selectVertexFromGameObject(vgo);
                            //showGUI(2f);
                        }
                        m_edgeSelected = null;
                        _justeSelected = true;
                    }

                }
                //Changement de position du vertex s�lectionn�e quand on garde le bouton de souris appliqu�
                else if (PC.In.Click1Hold())
                {
                    RaycastHit vHit = new RaycastHit();
                    Vector2 v2;

                    if (m_vertexSelected != null && _justeSelected)
                    {
                        if (PC.In.Drag1(out v2))
                        {
                            Ray vRay = Camera.main.ScreenPointToRay(PC.In.GetCursorPos());
                            if (Physics.Raycast(vRay, out vHit, 1000, 1 << LayerMask.NameToLayer("grid")))
                            {
                                moveVertex(m_vertexSelected, vHit.point);

                                //On cache le menu lors du d�placement du Vertex
                                if (Time.time - hideGUITimer > 0.2f)
                                {
                                    hideGUI();
                                    Debug.Log("hiding Gui after dragging");
                                    m_uiRects = new List<Rect>();
                                }

                            }

                        }
                    }

                }

            }
            else
            {
                //Si la souris est sur le menu, on le maintien affich�
                if (Time.time - hideGUITimer <= 2f)
                {
                    hideGUITimer = Time.time;
                }
            }
        }
        //Si le mode edition n'est pas activ�, on quitte le configurateur si l'utilisateur clique en dehors du menu.
        else
        {
            if (PC.In.Click1Down())
            {
                if (PC.In.GetCursorPos().x <Screen.width-300)
                {
                    exitConfigurator(false);
                }
            }
        }
        /*if(m_vertexSelected!=null)
        {
            m_vertexSelected.gameObject.renderer.material.SetColor("_Color",SELECTED_COLOR);
        }*/
        /*if (m_vertexSelected != null)
        {
            //PVertex selected = m_vertexSelected;
            m_vertexSelected.gameObject.renderer.material.SetColor("_Color",SELECTED_COLOR);
        }
        else if (m_vertices.Count > 0)
        {
            PVertex selected = m_vertices.Last.Value;
            selected.gameObject.renderer.material.SetColor("_Color",SELECTED_COLOR);
        }*/
    }
Example #11
0
 /// <summary>
 /// Supprime l'ar�te ayant pour extr�mit�s les vertices pass�s en param�tre
 /// </summary>
 private void removeEdge(PVertex v0, PVertex v1)
 {
     deleteEar(v0, v1, null, false, false);
 }
Example #12
0
 /// <summary>
 /// change la position d'un vertex et met � jour les gameObject des edges voisins
 /// </summary>
 /// <param name="v">vertex � bouger</param>
 /// <param name="position">nouvelle position</param>
 private void moveVertex(PVertex v, Vector3 position)
 {
     v.Position = position;
     int counter = 0;
     //v.gameObject.transform.position = position;
     foreach (PEdge e in m_edges)
     {
         if (e.v1 == v || e.v2 == v)
         {
             e.gameObject.transform.position = (e.v1.Position + e.v2.Position) / 2;
             e.gameObject.transform.LookAt(e.v1.Position);
             e.gameObject.transform.parent = null;
             e.gameObject.transform.localScale = new Vector3(e.gameObject.transform.localScale.x, e.gameObject.transform.localScale.y, Vector3.Distance(e.v1.Position, e.v2.Position));
             e.gameObject.transform.parent = this.gameObject.transform;
             counter++;
         }
         if (counter > 1)
         {
             break;
         }
     }
 }
Example #13
0
    /// <summary>
    /// Restaure l'�tat des Vertices et ar�tes sauvegard�
    /// </summary>
    private void loadEdgesAndVertices(bool rendererEnabled=true)
    {
        m_vertexSelected = null;
           // Debug.Log("loading Edges");

        foreach (PEdge e in m_edges)
        {
            if (e.gameObject != null)
            {
                Destroy(e.gameObject);
            }
        }
        m_edges = new List<PEdge>();
         m_vertices=new LinkedList<PVertex>();
        foreach (PVertex v in m_verticesSaved)
        {
            v.linked = new List<PVertex>();
            m_vertices.AddLast(v);
            if(!rendererEnabled)
                v.gameObject.GetComponent<Renderer>().enabled=false;
        }
        Debug.Log("Vertices Loaded :" + m_vertices.Count);
        foreach (PEdge e in m_edgesSaved)
        {
            if (e.v1 == m_vertices.Last.Value && e.v2 == m_vertices.First.Value || e.v2 == m_vertices.Last.Value && e.v1 == m_vertices.First.Value)
            {
                if (rendererEnabled)
                    addEdge(e.v1, e.v2, true);
                else
                    addEdge(e.v1, e.v2, true, false);
            }
            else
            {
                if (rendererEnabled)
                    addEdge(e.v1, e.v2);
                else
                    addEdge(e.v1, e.v2, false);
            }
        }
    }
Example #14
0
    /// <summary>
    /// Useless and not working
    /// </summary>
    private void checkVerticesInList()
    {
        LinkedList<PVertex[]> vv = new LinkedList<PVertex[]>();
        foreach (PEdge e in m_edges)
        {
            if (!m_vertices.Contains(e.v1))
            {
                Debug.Log("Vertex alone !!!");
                vv.AddLast(new PVertex[] { e.v1, e.v2 });
            }
            if (!m_vertices.Contains(e.v2))
            {
                Debug.Log("Vertex alone !!!");
                vv.AddLast(new PVertex[] { e.v2, e.v1 });
            }
        }
        foreach (PVertex[] e1 in vv)
        {
            PVertex[] voisins = new PVertex[2];
            int counte1 = 0;
            foreach (PVertex[] e2 in vv)
            {
                if (e2[0] == e1[0])
                {
                    voisins[counte1] = e2[1];
                    counte1++;
                }
            }
            LinkedListNode<PVertex> v0 = m_vertices.Find(voisins[0]);
            LinkedListNode<PVertex> v1 = m_vertices.Find(voisins[1]);
            if (v0.Previous == v1)
            {
                m_vertices.AddBefore(v0, e1[0]);
            }
            else
            {
                m_vertices.AddAfter(v0, e1[0]);
            }

            for (int j = 0; j < v0.Value.linked.Count; j++)
            {
                if (v0.Value.linked[j] == v1.Value)
                {
                    v0.Value.linked.RemoveAt(j);
                    v0.Value.linked.Add(e1[0]);
                }
            }
            for (int j = 0; j < v1.Value.linked.Count; j++)
            {
                if (v1.Value.linked[j] == v1.Value)
                {
                    v1.Value.linked.RemoveAt(j);
                    v1.Value.linked.Add(e1[0]);
                }
            }
            e1[0].linked = new List<PVertex>();
            e1[0].linked.Add(v0.Value);
            e1[0].linked.Add(v1.Value);
        }
    }
Example #15
0
 public static PVertex load(Vector3 vert, Function_terrace fun)
 {
     PVertex v= new PVertex();
        // vgo.transform.position = position;
      Debug.Log("loading vertex");
      Debug.Log("x=" + vert.x);
      Debug.Log("y=" + vert.y);
      Debug.Log("z=" + vert.z);
      v.gameObject = fun.createVertexObject(vert);
     return v;
 }
    private void PaintVertex(BrushMode mode, RaycastHit hit)
    {
        if (hit.collider.name == vp.name)
        {
            Mesh mesh  = sharedMesh;
            int  index = hit.triangleIndex * 3;
            matrix = trans.localToWorldMatrix;



            PVertex[] hits = new PVertex[3];
            hits[0].p = matrix.MultiplyPoint(mesh.vertices[mesh.triangles[index]]);
            hits[1].p = matrix.MultiplyPoint(mesh.vertices[mesh.triangles[index + 1]]);
            hits[2].p = matrix.MultiplyPoint(mesh.vertices[mesh.triangles[index + 2]]);

            hits[0].i = mesh.triangles[index];
            hits[1].i = mesh.triangles[index + 1];
            hits[2].i = mesh.triangles[index + 2];

            Vector3 pt       = hit.point;
            float   shortest = 999.0f;
            int     vtx      = 0;

            for (int i = 0; i < 3; i++)
            {
                float d = Vector3.Distance(pt, hits[i].p);
                if (d < shortest)
                {
                    vtx      = hits[i].i;
                    shortest = d;
                }
            }



            if (mode == BrushMode.Painting)
            {
                colors[vtx] = brush.color;

                mesh.colors = colors;
            }
            else if (mode == BrushMode.Animating)
            {
                uvs[vtx].x = brush.anim;

                mesh.uv = uvs;
            }
            else if (mode == BrushMode.ErasingPaint)
            {
                colors[vtx] = Color.clear;

                mesh.colors = colors;
            }
            else if (mode == BrushMode.ErasingAnimation)
            {
                uvs[vtx].x = 0.0f;

                mesh.uv = uvs;
            }
        }
    }
Example #17
0
 /// <summary>
 /// Suppression d'une oreille (on enl�ve les supprime [v1 v0] et [v2 v0] et le sommet v0)
 /// </summary>
 /// <param name="delMesh">Supprime le gameObject de v0</param>
 /// <param name="fromList">Supprime d�finitivement v0 de m_list></param>
 private void deleteEar(PVertex v0,PVertex v1,PVertex v2,bool delMesh=false,bool fromList=true)
 {
     List<PEdge> toremove = new List<PEdge>();
     foreach(PEdge e in m_edges){
         if((e.v1==v0&&e.v2==v1) ||(e.v1==v1&&e.v2==v0)
             ||(e.v1==v0&&e.v2==v2) ||(e.v1==v2&&e.v2==v0)){
             Destroy(e.gameObject);
             toremove.Add(e);
         }
     }
     foreach (PEdge r in toremove)
     {
         m_edges.Remove(r);
     }
     if (v1 != null)
     {
         v1.linked.Remove(v0);
         v0.linked.Remove(v1);
     }
     if(v2!=null){
          v2.linked.Remove(v0);
         v0.linked.Remove(v1);
     }
     if (delMesh)
     {
         Destroy(v0.gameObject);
     }
     if (fromList)
         m_vertices.Remove(v0);
 }