/// <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> /// 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 ITerrainTexturing implementation class to use.</param> /// <returns>JobHandle of the scheduled jobs</returns> public JobHandle BeginMapPixelDataUpdate(ITerrainTexturing 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); if (!dfUnity.TerrainSampler.IsLocationTerrainBlended()) { // Schedule job to blend and flatten location heights. (depends on SetLocationTiles being done first) blendLocationTerrainJobHandle = TerrainHelper.ScheduleBlendLocationTerrainJob(ref MapData, calcAvgMaxHeightJobHandle); } else { blendLocationTerrainJobHandle = 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); } }