public void InitializeBulkMesh(List <GNS_Model> Meshes, List <float> Percentiles, int MaxVertCount, int LODIndex, Vector3 BoundSize) { _BulkMesh = new Mesh(); // Calculate Mesh Indexes int BulkMeshVertCount = 0; List <int> MeshIndexes = new List <int> (); while (BulkMeshVertCount < MaxVertCount) // loop until mesh is full { int RandomIndex = WeightedRandom(Percentiles); // get random mesh index Mesh RandomMesh = Meshes [RandomIndex].LODMeshes[0]; // get random mesh if (BulkMeshVertCount + RandomMesh.vertexCount > MaxVertCount) { break; } // cant add cause it exceeds limit BulkMeshVertCount += RandomMesh.vertexCount; MeshIndexes.Add(RandomIndex); // add index to index list } // Generate combined mesh int BulkMeshTextureSize = Mathf.CeilToInt(Mathf.Sqrt(MeshIndexes.Count)); CombineInstance[] CombinedMeshes = new CombineInstance[MeshIndexes.Count]; for (int i = 0; i < MeshIndexes.Count; i++) { GNS_Model RandomModel = Meshes [MeshIndexes [i]]; // get random mesh Mesh RandomMesh = RandomModel.GetLODMesh(LODIndex); // get mesh Mesh TempMesh = new Mesh(); // Copy data into temp mesh TempMesh.vertices = RandomMesh.vertices; // copy verts TempMesh.triangles = RandomMesh.triangles; // copy triangles TempMesh.normals = RandomMesh.normals; // copy normals TempMesh.tangents = RandomMesh.tangents; // copy tangents TempMesh.uv = RandomMesh.uv; // copy uvs // Generate uv2 coords Vector2[] uv2 = new Vector2[TempMesh.vertexCount]; Vector2[] uv3 = new Vector2[TempMesh.vertexCount]; int Row = (int)(i / BulkMeshTextureSize); // calculate texture row int Colum = i - (Row * BulkMeshTextureSize); // calulate texture colum Vector2 InstanceUV2 = new Vector2( // generate uv2 ((float)Colum) / (float)(BulkMeshTextureSize), // calculate relative uv2 coord ((float)Row) / (float)(BulkMeshTextureSize) // calculate relative uv2 coord ); Vector2 WindInfluence = new Vector2(RandomModel.WindInfluence, (RandomModel.CustomNormals)?0f:1f); for (int x = 0; x < uv2.Length; x++) { uv2 [x] = InstanceUV2; uv3 [x] = WindInfluence; } // set all uv2 coords // Set TempMesh.uv2 = uv2; // set uv2 coords of temp mesh TempMesh.uv3 = uv3; CombinedMeshes [i].mesh = TempMesh; // set combine instance mesh CombinedMeshes [i].transform = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, Vector3.one); // set transform of combine instance } // Final combination of meshes _BulkMesh.CombineMeshes(CombinedMeshes); // combine meshes into bulk mesh _BulkMesh.bounds = new Bounds(_BulkMesh.bounds.center, BoundSize); // set bound size _TotalMeshCount = MeshIndexes.Count; // set total mesh count }