/// <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); }
/// <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); } }
/// <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; } } }
/// <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; } }
/// <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; }
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; } }
/// <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; }
/// <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; }
/// <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)); } }
// 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); }*/ }
/// <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); }
/// <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; } } }
/// <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); } } }
/// <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); } }
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; } } }
/// <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); }