public TheaterDotLxFileRecord GetElevationPostRecordByColumnAndRow(int postColumn, int postRow, uint lod) { if (_terrainDB == null || _terrainDB.TheaterDotLxFiles == null) { return(null); } var lodInfo = _terrainDB.TheaterDotLxFiles[lod]; if (lodInfo.O == null || lodInfo.L == null) { return(null); } var mapInfo = _terrainDB.TheaterDotMap; const int postsAcross = Constants.NUM_ELEVATION_POSTS_ACROSS_SINGLE_LOD_SEGMENT; _elevationPostCoordinateClamper.ClampElevationPostCoordinates(ref postColumn, ref postRow, lodInfo.LoDLevel); var blockRow = (int)Math.Floor((postRow / (float)postsAcross)); var blockCol = (int)Math.Floor((postColumn / (float)postsAcross)); var oIndex = (int)(blockRow * mapInfo.LODMapHeights[lodInfo.LoDLevel]) + blockCol; var block = lodInfo.O[oIndex]; var col = (postColumn % postsAcross); var row = (postRow % postsAcross); var lIndex = (int) (((block.LRecordStartingOffset / (lodInfo.LRecordSizeBytes * postsAcross * postsAcross)) * postsAcross * postsAcross) + ((row * postsAcross) + col)); var lRecord = lodInfo.L[lIndex]; return(lRecord); }
public void GetNearestElevationPostColumnAndRowForNorthEastCoordinates(float feetNorth, float feetEast, uint lod, out int col, out int row) { var feetBetweenElevationPosts = _distanceBetweenElevationPostsCalculator.GetNumFeetBetweenElevationPosts(lod); col = (int)Math.Floor(feetEast / feetBetweenElevationPosts); row = (int)Math.Floor(feetNorth / feetBetweenElevationPosts); _elevationPostCoordinateClamper.ClampElevationPostCoordinates(ref row, ref col, lod); }
public Bitmap GetDetailTextureForElevationPost(int postCol, int postRow, uint lod) { var col = postCol; var row = postRow; _elevationPostCoordinateClamper.ClampElevationPostCoordinates(ref col, ref row, lod); if (postCol != col || postRow != row) { col = 0; row = 0; } var lRecord = _columnAndRowElevationPostRetriever.GetElevationPostRecordByColumnAndRow(col, row, lod); if (lRecord == null) { return(null); } var textureId = lRecord.TextureId; var bigTexture = _terrainTextureByTextureIdRetriever.GetTerrainTextureByTextureId(textureId, lod); Bitmap toReturn; if (lod <= _terrainDB.TheaterDotMap.LastNearTiledLOD) { var chunksWide = 4 >> (int)lod; var thisChunkXIndex = (uint)(col % chunksWide); var thisChunkYIndex = (uint)(row % chunksWide); var leftX = (int)(thisChunkXIndex * (bigTexture.Width / chunksWide)); var rightX = (int)((thisChunkXIndex + 1) * (bigTexture.Width / chunksWide)) - 1; var topY = (int)(bigTexture.Height - (thisChunkYIndex + 1) * (bigTexture.Height / chunksWide)); var bottomY = (int)(bigTexture.Height - thisChunkYIndex * (bigTexture.Height / chunksWide)) - 1; var sourceRect = new Rectangle(leftX, topY, (rightX - leftX) + 1, (bottomY - topY) + 1); toReturn = (Bitmap)Util.CropBitmap(bigTexture, sourceRect); bigTexture.Dispose(); } else { toReturn = bigTexture; } return(toReturn); }
public void ClampElevationPostCoordinates(ref int postColumn, ref int postRow, uint lod) { _elevationPostCoordinateClamper.ClampElevationPostCoordinates(ref postColumn, ref postRow, lod); }