void CollectVertices() { // Collect all gameobjects, with tag Wall GameObject[] gos = GameObject.FindGameObjectsWithTag("Wall"); // Get all vertices from those gameobjects // WARNING: Should only use 2D objects, like unity Quads for now.. foreach (GameObject go in gos) { Mesh goMesh = go.GetComponent <MeshFilter>().mesh; int[] tris = goMesh.triangles; List <int> uniqueTris = new List <int>(); uniqueTris.Clear(); // Collect unique tri's for (int i = 0; i < tris.Length; i++) { if (!uniqueTris.Contains(tris[i])) { uniqueTris.Add(tris[i]); } } // for tris // Sort by pseudoangle List <pseudoObj> all = new List <pseudoObj>(); for (int n = 0; n < uniqueTris.Count; n++) { float x = goMesh.vertices[uniqueTris[n]].x; float y = goMesh.vertices[uniqueTris[n]].y; float a = copysign(1 - x / (Mathf.Abs(x) + Mathf.Abs(y)), y); pseudoObj o = new pseudoObj(); o.pAngle = a; o.point = goMesh.vertices[uniqueTris[n]]; all.Add(o); } // Actual sorting all.Sort(delegate(pseudoObj c1, pseudoObj c2) { return(c1.pAngle.CompareTo(c2.pAngle)); }); // Get unique vertices to list List <Vector3> uniqueVerts = new List <Vector3>(); uniqueTris.Clear(); for (int n = 0; n < all.Count; n++) { uniqueVerts.Add(all[n].point); } // Add world borders int tempRange = 990; Camera cam = Camera.main; Vector3 b1 = cam.ScreenToWorldPoint(new Vector3(-tempRange, -tempRange, Camera.main.nearClipPlane + 0.1f + tempRange)); // bottom left Vector3 b2 = cam.ScreenToWorldPoint(new Vector3(-tempRange, cam.pixelHeight + tempRange, cam.nearClipPlane + 0.1f + tempRange)); // top left Vector3 b3 = cam.ScreenToWorldPoint(new Vector3(cam.pixelWidth + tempRange, cam.pixelHeight, cam.nearClipPlane + 0.1f + tempRange)); // top right Vector3 b4 = cam.ScreenToWorldPoint(new Vector3(cam.pixelWidth + tempRange, -tempRange, cam.nearClipPlane + 0.1f + tempRange)); // bottom right // Get world borders as vertices Segment2D seg1 = new Segment2D(); seg1.a = new Vector2(b1.x, b1.y); seg1.b = new Vector2(b2.x, b2.y); segments.Add(seg1); seg1.a = new Vector2(b2.x, b2.y); seg1.b = new Vector2(b3.x, b3.y); segments.Add(seg1); seg1.a = new Vector2(b3.x, b3.y); seg1.b = new Vector2(b4.x, b4.y); segments.Add(seg1); seg1.a = new Vector2(b4.x, b4.y); seg1.b = new Vector2(b1.x, b1.y); segments.Add(seg1); // Get segments from unique vertices for (int n = 0; n < uniqueVerts.Count; n++) { // Segment start Vector3 wPos1 = go.transform.TransformPoint(uniqueVerts[n]); // Segment end Vector3 wPos2 = go.transform.TransformPoint(uniqueVerts[(n + 1) % uniqueVerts.Count]); // TODO: duplicate of unique verts? uniquePoints.Add(wPos1); Segment2D seg = new Segment2D(); seg.a = new Vector2(wPos1.x, wPos1.y); seg.b = new Vector2(wPos2.x, wPos2.y); segments.Add(seg); //GLDebug.DrawLine(wPos1, wPos2,Color.white,10); } } // foreach gameobject } // CollectVertices
void CollectVertices () { // Collect all gameobjects, with tag Wall GameObject[] gos = GameObject.FindGameObjectsWithTag("Wall"); // Get all vertices from those gameobjects // WARNING: Should only use 2D objects, like unity Quads for now.. foreach (GameObject go in gos) { Mesh goMesh = go.GetComponent<MeshFilter>().mesh; int[] tris = goMesh.triangles; List<int> uniqueTris = new List<int>(); uniqueTris.Clear(); // Collect unique tri's for (int i = 0; i < tris.Length; i++) { if (!uniqueTris.Contains(tris[i])) { uniqueTris.Add(tris[i]); } } // for tris // Sort by pseudoangle List<pseudoObj> all = new List<pseudoObj>(); for (int n=0;n<uniqueTris.Count;n++) { float x= goMesh.vertices[uniqueTris[n]].x; float y= goMesh.vertices[uniqueTris[n]].y; float a = copysign(1-x/(Mathf.Abs (x)+Mathf.Abs(y)),y); pseudoObj o = new pseudoObj(); o.pAngle = a; o.point = goMesh.vertices[uniqueTris[n]]; all.Add(o); } // Actual sorting all.Sort(delegate(pseudoObj c1, pseudoObj c2) { return c1.pAngle.CompareTo(c2.pAngle); }); // Get unique vertices to list List<Vector3> uniqueVerts = new List<Vector3>(); uniqueTris.Clear(); for (int n=0;n<all.Count;n++) { uniqueVerts.Add(all[n].point); } // Add world borders int tempRange = 990; Camera cam = Camera.main; Vector3 b1 = cam.ScreenToWorldPoint(new Vector3(-tempRange, -tempRange, Camera.main.nearClipPlane + 0.1f+tempRange)); // bottom left Vector3 b2 = cam.ScreenToWorldPoint(new Vector3(-tempRange, cam.pixelHeight+tempRange, cam.nearClipPlane + 0.1f+tempRange)); // top left Vector3 b3 = cam.ScreenToWorldPoint(new Vector3(cam.pixelWidth+tempRange, cam.pixelHeight, cam.nearClipPlane + 0.1f+tempRange)); // top right Vector3 b4 = cam.ScreenToWorldPoint(new Vector3(cam.pixelWidth+tempRange, -tempRange, cam.nearClipPlane + 0.1f+tempRange)); // bottom right // Get world borders as vertices Segment2D seg1 = new Segment2D(); seg1.a = new Vector2(b1.x,b1.y); seg1.b = new Vector2(b2.x,b2.y); segments.Add(seg1); seg1.a = new Vector2(b2.x,b2.y); seg1.b = new Vector2(b3.x,b3.y); segments.Add(seg1); seg1.a = new Vector2(b3.x,b3.y); seg1.b = new Vector2(b4.x,b4.y); segments.Add(seg1); seg1.a = new Vector2(b4.x,b4.y); seg1.b = new Vector2(b1.x,b1.y); segments.Add(seg1); // Get segments from unique vertices for (int n=0;n<uniqueVerts.Count;n++) { // Segment start Vector3 wPos1 = go.transform.TransformPoint(uniqueVerts[n]); // Segment end Vector3 wPos2 = go.transform.TransformPoint(uniqueVerts[(n+1) % uniqueVerts.Count]); // TODO: duplicate of unique verts? uniquePoints.Add(wPos1); Segment2D seg = new Segment2D(); seg.a = new Vector2(wPos1.x,wPos1.y); seg.b = new Vector2(wPos2.x, wPos2.y); segments.Add(seg); //GLDebug.DrawLine(wPos1, wPos2,Color.white,10); } } // foreach gameobject } // CollectVertices