/// <summary> /// Updates map pixel data based on current coordinates. /// Must be called before other data update methods. /// </summary> public void UpdateMapPixelData(TerrainTexturing terrainTexturing = null) { if (!ReadyCheck()) { return; } //System.Diagnostics.Stopwatch stopwatch = System.Diagnostics.Stopwatch.StartNew(); //long startTime = stopwatch.ElapsedMilliseconds; // Get basic terrain data MapData = TerrainHelper.GetMapPixelData(dfUnity.ContentReader, MapPixelX, MapPixelY); dfUnity.TerrainSampler.GenerateSamples(ref MapData); // Handle terrain with location if (MapData.hasLocation) { TerrainHelper.SetLocationTiles(ref MapData); TerrainHelper.BlendLocationTerrain(ref MapData); } // Set textures if (terrainTexturing != null) { terrainTexturing.AssignTiles(dfUnity.TerrainSampler, ref MapData); } //long totalTime = stopwatch.ElapsedMilliseconds - startTime; //DaggerfallUnity.LogMessage(string.Format("Time to update map pixel data: {0}ms", totalTime), true); }
/// <summary> /// Complete terrain data update using jobs system. (second of a two stage process) /// </summary> /// <param name="terrainTexturing">Instance of TerrainTexturing class to use.</param> public void CompleteMapPixelDataUpdate(TerrainTexturing terrainTexturing = null) { // Convert heightmap data back to standard managed 2d array. MapData.heightmapSamples = new float[heightmapDim, heightmapDim]; for (int i = 0; i < MapData.heightmapData.Length; i++) { MapData.heightmapSamples[JobA.Row(i, heightmapDim), JobA.Col(i, heightmapDim)] = MapData.heightmapData[i]; } // Convert tilemap data back to standard managed 2d array. // (Still needed for nature layout so it can be called again without requiring terrain data generation) MapData.tilemapSamples = new byte[tilemapDim, tilemapDim]; for (int i = 0; i < MapData.tilemapData.Length; i++) { byte tile = MapData.tilemapData[i]; if (tile == byte.MaxValue) { tile = 0; } MapData.tilemapSamples[JobA.Row(i, tilemapDim), JobA.Col(i, tilemapDim)] = tile; } // Create tileMap array or resize if needed and copy native array. if (TileMap == null || TileMap.Length != MapData.tileMap.Length) { TileMap = new Color32[MapData.tileMap.Length]; } MapData.tileMap.CopyTo(TileMap); // Copy max and avg heights. (TODO: Are these needed? Seem to not be used anywhere) MapData.averageHeight = MapData.avgMaxHeight[TerrainHelper.avgHeightIdx]; MapData.maxHeight = MapData.avgMaxHeight[TerrainHelper.maxHeightIdx]; DisposeNativeMemory(); }
/// <summary> /// Update map pixel data based on current coordinates. (first of a two stage process) /// /// 1) BeginMapPixelDataUpdate - Schedules terrain data update using jobs system. /// 2) CompleteMapPixelDataUpdate - Completes terrain data update using jobs system. /// </summary> /// <param name="terrainTexturing">Instance of TerrainTexturing class to use.</param> /// <returns>JobHandle of the scheduled jobs</returns> public JobHandle BeginMapPixelDataUpdate(TerrainTexturing terrainTexturing = null) { // Get basic terrain data. MapData = TerrainHelper.GetMapPixelData(dfUnity.ContentReader, MapPixelX, MapPixelY); // Create data array for heightmap. MapData.heightmapData = new NativeArray <float>(heightmapDim * heightmapDim, Allocator.TempJob); // Create data array for tilemap data. MapData.tilemapData = new NativeArray <byte>(tilemapDim * tilemapDim, Allocator.TempJob); // Create data array for shader tile map data. MapData.tileMap = new NativeArray <Color32>(tilemapDim * tilemapDim, Allocator.TempJob); // Create data array for average & max heights. MapData.avgMaxHeight = new NativeArray <float>(new float[] { 0, float.MinValue }, Allocator.TempJob); // Create list for recording native arrays that need disposal after jobs complete. MapData.nativeArrayList = new List <IDisposable>(); // Generate heightmap samples. (returns when complete) JobHandle generateHeightmapSamplesJobHandle = dfUnity.TerrainSampler.ScheduleGenerateSamplesJob(ref MapData); // Handle location if one is present on terrain. JobHandle blendLocationTerrainJobHandle; if (MapData.hasLocation) { // Schedule job to calc average & max heights. JobHandle calcAvgMaxHeightJobHandle = TerrainHelper.ScheduleCalcAvgMaxHeightJob(ref MapData, generateHeightmapSamplesJobHandle); JobHandle.ScheduleBatchedJobs(); // Set location tiles. TerrainHelper.SetLocationTiles(ref MapData); // Schedule job to blend and flatten location heights. (depends on SetLocationTiles being done first) blendLocationTerrainJobHandle = TerrainHelper.ScheduleBlendLocationTerrainJob(ref MapData, calcAvgMaxHeightJobHandle); } else { blendLocationTerrainJobHandle = generateHeightmapSamplesJobHandle; } // Assign tiles for terrain texturing. JobHandle assignTilesJobHandle = (terrainTexturing == null) ? blendLocationTerrainJobHandle : terrainTexturing.ScheduleAssignTilesJob(dfUnity.TerrainSampler, ref MapData, blendLocationTerrainJobHandle); // Update tile map for shader. JobHandle updateTileMapJobHandle = TerrainHelper.ScheduleUpdateTileMapDataJob(ref MapData, assignTilesJobHandle); JobHandle.ScheduleBatchedJobs(); return(updateTileMapJobHandle); }
/// <summary> /// Updates map pixel data based on current coordinates. /// Must be called before other data update methods. /// </summary> public void UpdateMapPixelData(TerrainTexturing terrainTexturing = null) { if (!ReadyCheck()) { return; } // Get basic terrain data MapData = TerrainHelper.GetMapPixelData(dfUnity.ContentReader, MapPixelX, MapPixelY); TerrainHelper.GenerateSamples(dfUnity.ContentReader, ref MapData); // Handle terrain with location if (MapData.hasLocation) { TerrainHelper.SetLocationTiles(dfUnity.ContentReader, ref MapData); TerrainHelper.FlattenLocationTerrain(dfUnity.ContentReader, ref MapData); } // Set textures if (terrainTexturing != null) { terrainTexturing.AssignTiles(ref MapData); } }
/// <summary> /// Updates map pixel data based on current coordinates. /// Must be called before other data update methods. /// </summary> public void UpdateMapPixelData(TerrainTexturing terrainTexturing = null) { if (!ReadyCheck()) return; // Get basic terrain data MapData = TerrainHelper.GetMapPixelData(dfUnity.ContentReader, MapPixelX, MapPixelY); TerrainHelper.GenerateSamples(dfUnity.ContentReader, ref MapData); // Handle terrain with location if (MapData.hasLocation) { TerrainHelper.SetLocationTiles(dfUnity.ContentReader, ref MapData); TerrainHelper.FlattenLocationTerrain(dfUnity.ContentReader, ref MapData); } // Set textures if (terrainTexturing != null) { terrainTexturing.AssignTiles(ref MapData); } }
/// <summary> /// Updates map pixel data based on current coordinates. /// Must be called before other data update methods. /// </summary> public void UpdateMapPixelData(TerrainTexturing terrainTexturing = null) { if (!ReadyCheck()) return; //System.Diagnostics.Stopwatch stopwatch = System.Diagnostics.Stopwatch.StartNew(); //long startTime = stopwatch.ElapsedMilliseconds; // Get basic terrain data MapData = TerrainHelper.GetMapPixelData(dfUnity.ContentReader, MapPixelX, MapPixelY); dfUnity.TerrainSampler.GenerateSamples(ref MapData); // Handle terrain with location if (MapData.hasLocation) { TerrainHelper.SetLocationTiles(ref MapData); TerrainHelper.BlendLocationTerrain(ref MapData); } // Set textures if (terrainTexturing != null) { terrainTexturing.AssignTiles(dfUnity.TerrainSampler, ref MapData); } //long totalTime = stopwatch.ElapsedMilliseconds - startTime; //DaggerfallUnity.LogMessage(string.Format("Time to update map pixel data: {0}ms", totalTime), true); }