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; }
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; }