public void BuildRuntimeData() { m_TreeLODInfos = new NativeArray <float>(tree.lODInfos.Length, Allocator.Persistent); m_ViewElements = new NativeArray <int>(m_TreeElements.Length, Allocator.Persistent); for (int i = 0; i < tree.lODInfos.Length; ++i) { Mesh mesh = tree.meshes[i]; ref FMeshLODInfo meshLODInfo = ref tree.lODInfos[i]; m_TreeLODInfos[i] = meshLODInfo.screenSize; FTreeSubSector subSector = new FTreeSubSector(); subSector.meshIndex = i; subSector.sectionIndexs = new int[mesh.subMeshCount]; subSector.materialIndexs = new int[mesh.subMeshCount]; for (int j = 0; j < mesh.subMeshCount; ++j) { subSector.sectionIndexs[j] = j; subSector.materialIndexs[j] = meshLODInfo.materialSlot[j]; } m_SubSectors.Add(subSector); }
public static void BuildTerrainTree(MenuCommand menuCommand) { GameObject[] SelectObjects = Selection.gameObjects; foreach (GameObject SelectObject in SelectObjects) { Terrain terrain = SelectObject.GetComponent <Terrain>(); if (!terrain) { Debug.LogWarning("select GameObject doesn't have terrain component"); continue; } TerrainData terrainData = terrain.terrainData; TreeComponent treeComponent = SelectObject.GetComponent <TreeComponent>(); if (treeComponent == null) { treeComponent = SelectObject.AddComponent <TreeComponent>(); } treeComponent.terrain = terrain; treeComponent.terrainData = terrainData; treeComponent.OnSave(); treeComponent.treeSectors = new FTreeSector[terrainData.treePrototypes.Length]; for (int index = 0; index < terrainData.treePrototypes.Length; ++index) { treeComponent.treeSectors[index] = new FTreeSector(); treeComponent.treeSectors[index].treeIndex = index; TreePrototype treePrototype = terrainData.treePrototypes[index]; List <Mesh> meshes = new List <Mesh>(); List <Material> materials = new List <Material>(); GameObject treePrefab = treePrototype.prefab; LODGroup lodGroup = treePrefab.GetComponent <LODGroup>(); LOD[] lods = lodGroup.GetLODs(); //Collector Meshes&Materials for (int j = 0; j < lods.Length; ++j) { ref LOD lod = ref lods[j]; Renderer renderer = lod.renderers[0]; MeshFilter meshFilter = renderer.gameObject.GetComponent <MeshFilter>(); meshes.AddUnique(meshFilter.sharedMesh); for (int k = 0; k < renderer.sharedMaterials.Length; ++k) { materials.AddUnique(renderer.sharedMaterials[k]); } } //Build LODInfo FMeshLODInfo[] lodInfos = new FMeshLODInfo[lods.Length]; for (int l = 0; l < lods.Length; ++l) { ref LOD lod = ref lods[l]; ref FMeshLODInfo lodInfo = ref lodInfos[l]; Renderer renderer = lod.renderers[0]; lodInfo.screenSize = 1 - (l * 0.03125f); lodInfo.materialSlot = new int[renderer.sharedMaterials.Length]; for (int m = 0; m < renderer.sharedMaterials.Length; ++m) { ref int materialSlot = ref lodInfo.materialSlot[m]; materialSlot = materials.IndexOf(renderer.sharedMaterials[m]); }