diff --git a/Assets/Scripts/Terrain/TerrainNature.cs b/Assets/Scripts/Terrain/TerrainNature.cs index 5570cf2b15..b08d9aeab2 100644 --- a/Assets/Scripts/Terrain/TerrainNature.cs +++ b/Assets/Scripts/Terrain/TerrainNature.cs @@ -13,6 +13,7 @@ using DaggerfallConnect.Arena2; using DaggerfallConnect; using DaggerfallWorkshop.Utility.AssetInjection; +using System.Collections.Generic; namespace DaggerfallWorkshop { @@ -109,6 +110,7 @@ public virtual void LayoutNature(DaggerfallTerrain dfTerrain, DaggerfallBillboar float maxTerrainHeight = DaggerfallUnity.Instance.TerrainSampler.MaxTerrainHeight; float beachLine = DaggerfallUnity.Instance.TerrainSampler.BeachElevation; + List basicItems = new List(tDim * tDim); for (int y = 0; y < tDim; y++) { for (int x = 0; x < tDim; x++) @@ -162,15 +164,24 @@ public virtual void LayoutNature(DaggerfallTerrain dfTerrain, DaggerfallBillboar // Add to batch unless a mesh replacement is found int record = Random.Range(1, 32); if (terrainDist > 1 || !MeshReplacement.ImportNatureGameObject(dfBillboardBatch.TextureArchive, record, terrain, x, y)) - dfBillboardBatch.AddItem(record, pos); + { + basicItems.Add(new DaggerfallBillboardBatch.BasicInfo + { + textureRecord = record, + localPosition = new Unity.Mathematics.float3(pos.x, pos.y, pos.z) + }); + } else if (!NatureMeshUsed) NatureMeshUsed = true; // Signal that nature mesh has been used to initiate extra terrain updates } } - + if (basicItems.Count > 0) + { + dfBillboardBatch.AddItemsAsync(basicItems.ToArray()).Complete(); + } // Apply new batch dfBillboardBatch.Apply(); } } -} \ No newline at end of file +} diff --git a/Assets/Scripts/Utility/RMBLayout.cs b/Assets/Scripts/Utility/RMBLayout.cs index d5a21913e7..3a47ca82e5 100644 --- a/Assets/Scripts/Utility/RMBLayout.cs +++ b/Assets/Scripts/Utility/RMBLayout.cs @@ -231,6 +231,7 @@ public static void AddNatureFlats( if (!dfUnity.IsReady) return; + List basicItems = new List(); for (int y = 0; y < 16; y++) { for (int x = 0; x < 16; x++) @@ -256,7 +257,11 @@ public static void AddNatureFlats( // Add billboard to batch or standalone if (billboardBatch != null) { - billboardBatch.AddItem(scenery.TextureRecord, billboardPosition); + basicItems.Add(new DaggerfallBillboardBatch.BasicInfo + { + textureRecord = scenery.TextureRecord, + localPosition = new Unity.Mathematics.float3(billboardPosition.x, billboardPosition.y, billboardPosition.z) + }); } else { @@ -266,6 +271,10 @@ public static void AddNatureFlats( } } } + if (billboardBatch != null && basicItems.Count > 0) + { + billboardBatch.AddItemsAsync(basicItems.ToArray()).Complete(); + } } /// @@ -285,6 +294,7 @@ public static void AddLights( if (!dfUnity.Option_ImportLightPrefabs || dfUnity.Option_CityLightPrefab == null) return; + List basicItems = new List(); // Iterate block flats for lights foreach (DFBlock.RmbBlockFlatObjectRecord obj in blockData.RmbBlock.MiscFlatObjectRecords) { @@ -304,7 +314,11 @@ public static void AddLights( // Add billboard to batch or standalone if (billboardBatch != null) { - billboardBatch.AddItem(obj.TextureRecord, billboardPosition); + basicItems.Add(new DaggerfallBillboardBatch.BasicInfo + { + textureRecord = obj.TextureRecord, + localPosition = new Unity.Mathematics.float3(billboardPosition.x, billboardPosition.y, billboardPosition.z) + }); } else { @@ -317,6 +331,10 @@ public static void AddLights( AddLight(dfUnity, obj, lightsParent); } } + if (billboardBatch != null && basicItems.Count > 0) + { + billboardBatch.AddItemsAsync(basicItems.ToArray()).Complete(); + } } ///