private static bool LoadTerrain(string filePath, byte[] data, TerrainLoadedCallback terrainCallback, long bytesRead, long totalBytes) { float[,] terrain = new float[256, 256]; bool loaded = false; switch (Path.GetExtension(filePath)) { case ".r32": case ".f32": // RAW32 if (data.Length == 256 * 256 * 4) { int pos = 0; for (int y = 0; y < 256; y++) { for (int x = 0; x < 256; x++) { terrain[y, x] = Utils.Clamp(Utils.BytesToFloat(data, pos), 0.0f, 255.0f); pos += 4; } } loaded = true; } else { Logger.Log("[OarFile] RAW32 terrain file " + filePath + " has the wrong number of bytes: " + data.Length, Helpers.LogLevel.Warning); } break; case ".ter": // Terragen case ".raw": // LLRAW case ".jpg": case ".jpeg": // JPG case ".bmp": // BMP case ".png": // PNG case ".gif": // GIF case ".tif": case ".tiff": // TIFF default: Logger.Log("[OarFile] Unrecognized terrain format in " + filePath, Helpers.LogLevel.Warning); break; } if (loaded) { terrainCallback(terrain, bytesRead, totalBytes); } return(loaded); }
public static void UnpackageArchive(string filename, AssetLoadedCallback assetCallback, TerrainLoadedCallback terrainCallback, SceneObjectLoadedCallback objectCallback) { int successfulAssetRestores = 0; int failedAssetRestores = 0; try { using (FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read)) { using (GZipStream loadStream = new GZipStream(fileStream, CompressionMode.Decompress)) { TarArchiveReader archive = new TarArchiveReader(loadStream); string filePath = "ERROR"; byte[] data; TarArchiveReader.TarEntryType entryType; while ((data = archive.ReadEntry(out filePath, out entryType)) != null) { if (filePath.StartsWith(ArchiveConstants.OBJECTS_PATH)) { // Deserialize the XML bytes LoadObjects(data, objectCallback, fileStream.Position, fileStream.Length); } else if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH)) { if (LoadAsset(filePath, data, assetCallback, fileStream.Position, fileStream.Length)) successfulAssetRestores++; else failedAssetRestores++; } else if (filePath.StartsWith(ArchiveConstants.TERRAINS_PATH)) { LoadTerrain(filePath, data, terrainCallback, fileStream.Position, fileStream.Length); } else if (filePath.StartsWith(ArchiveConstants.SETTINGS_PATH)) { // FIXME: Support this //LoadRegionSettings(filePath, data); } } archive.Close(); } } } catch (Exception e) { Logger.Log("[OarFile] Error loading OAR file: " + e.Message, Helpers.LogLevel.Error); return; } if (failedAssetRestores > 0) Logger.Log(String.Format("[OarFile]: Failed to load {0} assets", failedAssetRestores), Helpers.LogLevel.Warning); }
private static bool LoadTerrain(string filePath, byte[] data, TerrainLoadedCallback terrainCallback, long bytesRead, long totalBytes) { float[,] terrain = new float[256, 256]; bool loaded = false; switch (Path.GetExtension(filePath)) { case ".r32": case ".f32": // RAW32 if (data.Length == 256 * 256 * 4) { int pos = 0; for (int y = 0; y < 256; y++) { for (int x = 0; x < 256; x++) { terrain[y, x] = Utils.Clamp(Utils.BytesToFloat(data, pos), 0.0f, 255.0f); pos += 4; } } loaded = true; } else { Logger.Log("[OarFile] RAW32 terrain file " + filePath + " has the wrong number of bytes: " + data.Length, Helpers.LogLevel.Warning); } break; case ".ter": // Terragen case ".raw": // LLRAW case ".jpg": case ".jpeg": // JPG case ".bmp": // BMP case ".png": // PNG case ".gif": // GIF case ".tif": case ".tiff": // TIFF default: Logger.Log("[OarFile] Unrecognized terrain format in " + filePath, Helpers.LogLevel.Warning); break; } if (loaded) terrainCallback(terrain, bytesRead, totalBytes); return loaded; }
public static void UnpackageArchive(string filename, AssetLoadedCallback assetCallback, TerrainLoadedCallback terrainCallback, SceneObjectLoadedCallback objectCallback, SettingsLoadedCallback settingsCallback) { int successfulAssetRestores = 0; int failedAssetRestores = 0; try { using (FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read)) { using (GZipStream loadStream = new GZipStream(fileStream, CompressionMode.Decompress)) { TarArchiveReader archive = new TarArchiveReader(loadStream); string filePath; byte[] data; TarArchiveReader.TarEntryType entryType; while ((data = archive.ReadEntry(out filePath, out entryType)) != null) { if (filePath.StartsWith(ArchiveConstants.OBJECTS_PATH)) { // Deserialize the XML bytes if (objectCallback != null) { LoadObjects(data, objectCallback, fileStream.Position, fileStream.Length); } } else if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH)) { if (assetCallback != null) { if (LoadAsset(filePath, data, assetCallback, fileStream.Position, fileStream.Length)) { successfulAssetRestores++; } else { failedAssetRestores++; } } } else if (filePath.StartsWith(ArchiveConstants.TERRAINS_PATH)) { if (terrainCallback != null) { LoadTerrain(filePath, data, terrainCallback, fileStream.Position, fileStream.Length); } } else if (filePath.StartsWith(ArchiveConstants.SETTINGS_PATH)) { if (settingsCallback != null) { LoadRegionSettings(filePath, data, settingsCallback); } } } archive.Close(); } } } catch (Exception e) { Logger.Log("[OarFile] Error loading OAR file: " + e.Message, Helpers.LogLevel.Error); return; } if (failedAssetRestores > 0) { Logger.Log(String.Format("[OarFile]: Failed to load {0} assets", failedAssetRestores), Helpers.LogLevel.Warning); } }