protected PositionNormalTextureVertex[] CalculateVerticies(int iX,
                                                                            int iY,
                                                                            int Downsample,
                                                                            out int[] TriangleEdges)
        {
            GridVector2[] SectionTileCorners = TileHull(iX,iY,Downsample);
            List<MappingGridVector2> TileCornerMappedPoints = new List<MappingGridVector2>(4);

            bool transformSuccess = false;
            GridVector2 mappedVert;
            for(int i = 0; i < SectionTileCorners.Length; i++)
            {
                GridVector2 Vert = SectionTileCorners[i];
                transformSuccess = VolumeTransform.TryTransform(Vert, out mappedVert);
                if(transformSuccess)
                {
                    TileCornerMappedPoints.Add(new MappingGridVector2(mappedVert, Vert));
                }
            }

            GridRectangle tileBorder = TileBorder(iX,iY,Downsample);

            List<MappingGridVector2> MappedPoints = new List<MappingGridVector2>(16);

            //Add all of the points in the tiles rectangle

            MappedPoints.AddRange(VolumeTransform.IntersectingMappedRectangle(tileBorder, false));

            //            MappedPoints.Sort(new MappingGridVector2SortByMapPoints());

            if (MappedPoints.Count + TileCornerMappedPoints.Count < 3)
            {
                TriangleEdges = new int[0];
                return new PositionNormalTextureVertex[0];
            }

            /*            if (TileCornerMappedPoints.Count < 3)
            {
                TriangleEdges = new int[0];
                return new VertexPositionNormalTexture[0];
            }
            */

            /*
            for (int iPoint = 1; iPoint < MappedPoints.Count; iPoint++)
            {
                if (MappedPoints[iPoint].MappedPoint == MappedPoints[iPoint - 1].MappedPoint)
                {
                    iPoint--;
                    MappedPoints.RemoveAt(iPoint);
                }
            }
             */

            //Eliminate duplicates in case tile coordinate landed exactly on transform grid (Common for 0,0)
            for(int iPoint = 0; iPoint < MappedPoints.Count; iPoint++)
            {
                for (int iBoundPoint = 0; iBoundPoint < TileCornerMappedPoints.Count; iBoundPoint++)
                {
                    if (MappedPoints[iPoint].MappedPoint == TileCornerMappedPoints[iBoundPoint].MappedPoint)
                    {
                        MappedPoints.RemoveAt(iPoint);
                        iPoint--;
                        break;
                    }
                }
            }

            MappedPoints.AddRange(TileCornerMappedPoints);
            MappedPoints.Sort(new MappingGridVector2SortByMapPoints());

            GridVector2[] DelaunayPoints = new GridVector2[MappedPoints.Count];
            //Triangulate the points
            for(int iPoint = 0; iPoint < MappedPoints.Count; iPoint++)
            {
                DelaunayPoints[iPoint] = MappedPoints[iPoint].MappedPoint;
            }

            try
            {
                TriangleEdges = Geometry.Delaunay.Triangulate(DelaunayPoints);//, SectionTileCorners, false);
                //MappedPoints.AddRange(TileCornerMappedPoints);
            }
            catch (ArgumentException )
            {
                //This can occur if all the points are on a straight line
                TriangleEdges = new int[0];
                return new PositionNormalTextureVertex[0];
            }

            //Ok, create all the verticies
            PositionNormalTextureVertex[] verticies = new PositionNormalTextureVertex[MappedPoints.Count];
            for (int iPoint = 0; iPoint < MappedPoints.Count; iPoint++)
            {
                GridVector2 Pos = MappedPoints[iPoint].ControlPoint;
                GridVector2 TextureBasis = MappedPoints[iPoint].MappedPoint;
                GridVector2 TexturePos = new GridVector2(((TextureBasis.X - tileBorder.Left) / tileBorder.Width),
                                                 ((TextureBasis.Y - tileBorder.Bottom) / tileBorder.Height));
                verticies[iPoint] = new PositionNormalTextureVertex(new GridVector3((float)Pos.X, (float)Pos.Y, 0),
                                                                     GridVector3.UnitZ,
                                                                     TexturePos);
            }

            return verticies;
        }
Beispiel #2
0
        protected virtual PositionNormalTextureVertex[] CalculateVerticies(int iX, int iY, int roundedDownsample)
        {
            PositionNormalTextureVertex[] verticies = new PositionNormalTextureVertex[4];

            verticies[0] = new PositionNormalTextureVertex(new GridVector3(iX * this.TileSizeX * roundedDownsample, iY * this.TileSizeY * roundedDownsample, 0),
                                                               GridVector3.UnitZ,
                                                           new GridVector2(0, 0));
            verticies[1] = new PositionNormalTextureVertex(new GridVector3((iX + 1) * this.TileSizeX * roundedDownsample, iY * this.TileSizeY * roundedDownsample, 0),
                                                               GridVector3.UnitZ,
                                                           new GridVector2(1, 0));
            verticies[2] = new PositionNormalTextureVertex(new GridVector3(iX * this.TileSizeX * roundedDownsample, (iY + 1) * this.TileSizeY * roundedDownsample, 0),
                                                               GridVector3.UnitZ,
                                                           new GridVector2(0, 1));
            verticies[3] = new PositionNormalTextureVertex(new GridVector3((iX + 1) * this.TileSizeX * roundedDownsample, (iY + 1) * this.TileSizeY * roundedDownsample, 0),
                                                               GridVector3.UnitZ,
                                                           new GridVector2(1, 1));

            return verticies;
        }