Exemplo n.º 1
0
    private IEnumerator LoadMeshes()
    {
        Debug.Log("LoadMeshes");
        foreach (var way in map.ways)
        {
            Debug.Log("LoadWay");
            var cpolyShape = new CPolygonShape(way.points.ToArray());
            cpolyShape.CutEar();
            var count = cpolyShape.NumberOfPolygons * 3;
            Vector3[] vertices = new Vector3[count];
            int[] triangles = new int[count];
            int ji = 0;
            for (int i = 0; i < cpolyShape.NumberOfPolygons; i++)
            {
                var p = cpolyShape.Polygons(i);
                for (int j = 0; j < p.Length; j++)
                {
                    triangles[ji] = ji; ;
                    vertices[ji] = new Vector3(0, (float)p[j].Y, (float)p[j].X);
                    ji++;
                }
            }

            var g = new GameObject();
            var f = g.AddComponent<MeshFilter>();
            

            var info = g.AddComponent<Info>();
            info.tags = way.tags;

            var mesh = f.mesh = new Mesh();

            mesh.vertices = vertices.ToArray();
            mesh.triangles = triangles.ToArray();
            mesh.RecalculateNormals();
            mesh.RecalculateBounds();

            var r = g.AddComponent<MeshRenderer>();
            r.material = mat;

            g.AddComponent<BoxCollider>();
            yield return null;
        }
        yield return null;
    }
Exemplo n.º 2
0
    private void LoadWays()
    {
        foreach (XmlNode xmlnode in prs.SelectNodes("way"))
        {
            Way way = new Way();
            List<CPoint2D> points = new List<CPoint2D>();
            foreach (XmlNode nd in xmlnode.SelectNodes("nd"))
            {
                var id = int.Parse(nd.Attributes["ref"].Value);
                var node = map.nodes[id];
                way.nodes.Add(node);
                points.Add(new CPoint2D(node.x, node.y));
            }
            way.points = points;
            var cpolyShape = new CPolygonShape(way.points.ToArray());
            cpolyShape.CutEar();

            foreach (XmlNode tg in xmlnode.SelectNodes("tag"))
                way.tags.Add(new Tag { k = tg.Attributes["k"].Value, v = tg.Attributes["v"].Value });


            map.ways.Add(way);            
        }
    }
Exemplo n.º 3
0
        /// <summary>
        /// Paint the triangles defined by the points
        /// </summary>
        /// <param name="points"></param>
        private LinkedList<Triangle> makeTriangles(LinkedList<Pair<double, double>> points)
        {
            if (points == null ||points.Count == 0)
                return null;

            CPoint2D[] vertices = new CPoint2D[points.Count];
            LinkedList<Triangle> triangles = new System.Collections.Generic.LinkedList<Triangle>();

            int index = 0;
            foreach (Pair<double, double> p in points) {
                vertices[index] = new CPoint2D(p.X, p.Y);
                index++;
            }

            CPolygonShape cutPolygon =  new CPolygonShape(vertices);
            cutPolygon.CutEar();

            debugOut("Numer of polygons: "  + cutPolygon.NumberOfPolygons);

            CPoint2D[] corners;

            for(int numPoly = 0; numPoly < cutPolygon.NumberOfPolygons; numPoly++) {
                #region find upper and lower
                corners = cutPolygon.Polygons(numPoly);

                Pair<double, double>[] corns = new Pair<double, double>[3];
                for(int cornIndex = 0; cornIndex < 3; cornIndex++) {
                    CPoint2D coern = corners[cornIndex];
                    corns[cornIndex] = new Pair<double, double>(coern.X, coern.Y);
                }

                Pair<Pair<double, double>, Pair<double, double>> pairResult = findUpperAndLower(new LinkedList<Pair<double, double>>(corns));

                Pair<double, double> upper = pairResult.X;
                Pair<double, double> lower = pairResult.Y;

                Triangle inside = new Triangle(corns, upper, lower);

                debugOut(inside.ToString());

                triangles.AddLast(inside);
                #endregion
            }
            return triangles;
        }
Exemplo n.º 4
0
        public static List<List<Vector>> KonvexPolygons(List<Vector> input)
        {
            List<List<Vector>> result = new List<List<Vector>>();
            List<Vector> NoDoubles = new List<Vector>();
            foreach (Vector v in input)
            {
                if (!(NoDoubles.Count(p => p.Equals(v)) > 0))
                {
                    NoDoubles.Add(v);
                }
            }
            List<Vector> list = NoDoubles;

            int nVertices = list.Count;

            CPoint2D[] vertices = new CPoint2D[nVertices];
            for (int i = 0; i < nVertices; i++)
            {
                vertices[i] = new CPoint2D(list[i].X,
                    list[i].Y);
            }
            CPolygonShape cutPolygon = new CPolygonShape(vertices);
            cutPolygon.CutEar();

            for (int i = 0; i < cutPolygon.NumberOfPolygons; i++)
            {
                int nPoints = cutPolygon.Polygons(i).Length;
                List<Vector> polygon = new List<Vector>();
                for (int j = 0; j < nPoints; j++)
                {
                    polygon.Add(new Vector(cutPolygon.Polygons(i)[j].X,cutPolygon.Polygons(i)[j].Y,0));
                }
                result.Add(polygon);
            }
            return result;
        }
Exemplo n.º 5
0
        public List<BodyElement> getTriangulatedShapes(CPolygonShape polygonShapes)
        {
            if (polygonShapes != null)
            {
                //Creer une liste de body elements
                List<BodyElement> elements = new List<BodyElement>();

                bool res = (bool)polygonShapes.CutEar();
                if (res == false) return null;

                //Recuperer le nombre d'elem deja present
                int nbElemExistants = this.coronaObject.PhysicsBody.BodyElements.Count;
                for (int i = 0; i < polygonShapes.NumberOfPolygons; i++)
                {
                    //Recuperer les polygons
                    CPoint2D[] tabCps = polygonShapes.Polygons(i);

                    //Recuperer le tableau de point associé
                    List<Point> pointsConverted = this.convertCPoint2DToPoint(tabCps);

                    //Creer un body elem
                    int indexElem = nbElemExistants;
                    nbElemExistants++;
                    string name = "AUTO_SHAPE";
                    BodyElement elem = new BodyElement(indexElem, name, 0, 0, 0, pointsConverted);
                    elements.Add(elem);
                }

                return elements;
            }

            return null;
        }
Exemplo n.º 6
0
        public List<BodyElement> getTriangulatedShapes()
        {
            if(this.shapeBuilding != null)
            {
                //Creer une liste de body elements
                if (this.shapeBuilding.Count < 3) return null;

                List<BodyElement> elements = new List<BodyElement>();

                //Create a Cpolygon
                CPoint2D[] tabCpoint2D = getCPoint2D(this.shapeBuilding);

                CPolygonShape polygonShapes = new CPolygonShape(tabCpoint2D);
                //Generated
                bool res = (bool)polygonShapes.CutEar();
                if (res == false) return null;

                //Recuperer le nombre d'elem deja present
                int nbElemExistants = this.coronaObject.PhysicsBody.BodyElements.Count;
                for(int i = 0;i<polygonShapes.NumberOfPolygons;i++)
                {
                    //Recuperer les polygons
                    CPoint2D[] tabCps = polygonShapes.Polygons(i);

                    //Recuperer le tableau de point associé
                    List<Point> pointsConverted = this.convertCPoint2DToPoint(tabCps);

                    //Diviser les points en groupe de 8
                    List<List<Point>> listPolygones = new List<List<Point>>();
                    List<Point> currentList = new List<Point>();
                    for (int j = 0; j < pointsConverted.Count; j++)
                    {
                        if (currentList.Count == 8)
                        {
                            listPolygones.Add(currentList);
                            currentList = new List<Point>();
                            currentList.Add(pointsConverted[0]);
                            currentList.Add(pointsConverted[j - 1]);

                        }

                        currentList.Add(pointsConverted[j]);

                        if (j == pointsConverted.Count - 1)
                        {
                            listPolygones.Add(currentList);
                        }

                    }

                    //Creer un body elem par polygone
                    for (int j = 0; j < listPolygones.Count; j++)
                    {
                        int indexElem = nbElemExistants;
                        nbElemExistants++;
                        string name = "AUTO_SHAPE";
                        BodyElement elem = new BodyElement(indexElem, name, 0, 0, 0, listPolygones[j]);
                        elements.Add(elem);
                    }

                }

                return elements;
            }

            return null;
        }