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
示例#2
0
		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