// Token: 0x0600307F RID: 12415 RVA: 0x000CDF0C File Offset: 0x000CC10C public bool SortObject(MeshCombiner meshCombiner, ObjectOctree.LODLevel lod, CachedGameObject cachedGO, bool isChangeMode = false) { if (cachedGO.mr == null) { return(false); } if (lod.meshObjectsHoldersLookup == null) { lod.meshObjectsHoldersLookup = new Dictionary <CombineCondition, MeshObjectsHolder>(); } CombineConditionSettings combineConditionSettings = meshCombiner.combineConditionSettings; Material[] sharedMaterials = cachedGO.mr.sharedMaterials; int num = Mathf.Min(cachedGO.mesh.subMeshCount, sharedMaterials.Length); int i = 0; while (i < num) { Material material; if (!combineConditionSettings.sameMaterial) { material = combineConditionSettings.material; goto IL_75; } material = sharedMaterials[i]; if (!(material == null)) { goto IL_75; } IL_119: i++; continue; IL_75: CombineCondition combineCondition = default(CombineCondition); combineCondition.ReadFromGameObject(combineConditionSettings, meshCombiner.copyBakedLighting && meshCombiner.validCopyBakedLighting, cachedGO.go, cachedGO.mr, material); MeshObjectsHolder meshObjectsHolder; if (!lod.meshObjectsHoldersLookup.TryGetValue(combineCondition, out meshObjectsHolder)) { meshCombiner.foundCombineConditions.combineConditions.Add(combineCondition); meshObjectsHolder = new MeshObjectsHolder(ref combineCondition, material); lod.meshObjectsHoldersLookup.Add(combineCondition, meshObjectsHolder); } meshObjectsHolder.meshObjects.Add(new MeshObject(cachedGO, i)); if (isChangeMode && !meshObjectsHolder.hasChanged) { meshObjectsHolder.hasChanged = true; lod.changedMeshObjectsHolders.Add(meshObjectsHolder); goto IL_119; } goto IL_119; } return(true); }
// Token: 0x06003080 RID: 12416 RVA: 0x000CE040 File Offset: 0x000CC240 public void CombineMeshes(MeshCombiner meshCombiner, int lodParentIndex) { if (this.level != this.maxLevels) { for (int i = 0; i < 8; i++) { if (this.cellsUsed[i]) { this.cells[i].CombineMeshes(meshCombiner, lodParentIndex); } } return; } ObjectOctree.LODParent lodparent = ((ObjectOctree.MaxCell) this).lodParents[lodParentIndex]; if (lodparent == null) { return; } lodparent.cellGO = new GameObject(meshCombiner.useCells ? ("Cell " + this.bounds.center) : "Combined Objects"); lodparent.cellT = lodparent.cellGO.transform; lodparent.cellT.position = this.bounds.center; lodparent.cellT.parent = meshCombiner.lodParentHolders[lodParentIndex].t; if (lodParentIndex > 0) { lodparent.lodGroup = lodparent.cellGO.AddComponent <LODGroup>(); lodparent.lodGroup.localReferencePoint = (lodparent.cellT.position = this.bounds.center); } ObjectOctree.LODLevel[] lodLevels = lodparent.lodLevels; for (int j = 0; j < lodLevels.Length; j++) { ObjectOctree.LODLevel lodlevel = lodparent.lodLevels[j]; if (lodlevel == null || lodlevel.meshObjectsHoldersLookup == null) { return; } Transform transform = null; if (lodParentIndex > 0) { transform = new GameObject("LOD" + j).transform; transform.parent = lodparent.cellT; } foreach (MeshObjectsHolder meshObjectsHolder in lodlevel.meshObjectsHoldersLookup.Values) { meshObjectsHolder.lodParent = lodparent; meshObjectsHolder.lodLevel = j; MeshCombineJobManager.instance.AddJob(meshCombiner, meshObjectsHolder, (lodParentIndex > 0) ? transform : lodparent.cellT, this.bounds.center); } } }
void SelectOrDeselect(Vector3 position, MeshRenderer mr, Material mat, bool select) { var octree = meshCombiner.octree; if (octree == null) { return; } ObjectOctree.MaxCell cell = octree.GetCell(position); if (cell == null) { return; } mr.sharedMaterial = mat; if (meshCombiner.activeOriginal) { return; } ObjectOctree.LODParent[] lodParents = cell.lodParents; for (int i = 0; i < lodParents.Length; i++) { ObjectOctree.LODParent lodParent = lodParents[i]; if (lodParent == null) { continue; } ObjectOctree.LODLevel[] lodLevels = lodParent.lodLevels; for (int j = 0; j < lodLevels.Length; j++) { ObjectOctree.LODLevel lodLevel = lodLevels[j]; if (lodLevel == null) { continue; } Methods.SetMeshRenderersActive(lodLevel.newMeshRenderers, !select); Methods.SetCachedGOSActive(lodLevel.cachedGOs, select); } } }
// Token: 0x06003074 RID: 12404 RVA: 0x000CDB5C File Offset: 0x000CBD5C public void AssignLODGroup(MeshCombiner meshCombiner) { LOD[] array = new LOD[this.lodLevels.Length]; int num = array.Length - 1; for (int i = 0; i < this.lodLevels.Length; i++) { ObjectOctree.LODLevel lodlevel = this.lodLevels[i]; LOD[] array2 = array; int num2 = i; float screenRelativeTransitionHeight = meshCombiner.lodGroupsSettings[num].lodSettings[i].screenRelativeTransitionHeight; Renderer[] renderers = lodlevel.newMeshRenderers.ToArray(); array2[num2] = new LOD(screenRelativeTransitionHeight, renderers); } this.lodGroup.SetLODs(array); this.lodGroup.size = (float)meshCombiner.cellSize; }
// Token: 0x0600307D RID: 12413 RVA: 0x000CDCEC File Offset: 0x000CBEEC private void AddObjectInternal(MeshCombiner meshCombiner, CachedGameObject cachedGO, Vector3 position, int lodParentIndex, int lodLevel, bool isChangeMode) { if (this.level == this.maxLevels) { ObjectOctree.MaxCell maxCell = (ObjectOctree.MaxCell) this; if (maxCell.lodParents == null) { maxCell.lodParents = new ObjectOctree.LODParent[10]; } if (maxCell.lodParents[lodParentIndex] == null) { maxCell.lodParents[lodParentIndex] = new ObjectOctree.LODParent(lodParentIndex + 1); } ObjectOctree.LODParent lodparent = maxCell.lodParents[lodParentIndex]; ObjectOctree.LODLevel lodlevel = lodparent.lodLevels[lodLevel]; lodlevel.cachedGOs.Add(cachedGO); if (isChangeMode && this.SortObject(meshCombiner, lodlevel, cachedGO, false)) { if (!maxCell.hasChanged) { maxCell.hasChanged = true; if (meshCombiner.changedCells == null) { meshCombiner.changedCells = new List <ObjectOctree.MaxCell>(); } meshCombiner.changedCells.Add(maxCell); } if (!lodparent.hasChanged) { lodparent.hasChanged = true; maxCell.changedLodParents.Add(lodparent); } } lodlevel.objectCount++; lodlevel.vertCount += cachedGO.mesh.vertexCount; return; } bool flag; int num = base.AddCell <ObjectOctree.Cell, ObjectOctree.MaxCell>(ref this.cells, position, out flag); if (flag) { ObjectOctree.MaxCell.maxCellCount++; } this.cells[num].AddObjectInternal(meshCombiner, cachedGO, position, lodParentIndex, lodLevel, isChangeMode); }
// Token: 0x0600307E RID: 12414 RVA: 0x000CDE1C File Offset: 0x000CC01C public void SortObjects(MeshCombiner meshCombiner) { if (this.level == this.maxLevels) { foreach (ObjectOctree.LODParent lodparent in ((ObjectOctree.MaxCell) this).lodParents) { if (lodparent != null) { for (int j = 0; j < lodparent.lodLevels.Length; j++) { ObjectOctree.LODLevel lodlevel = lodparent.lodLevels[j]; if (lodlevel == null || lodlevel.cachedGOs.Count == 0) { return; } for (int k = 0; k < lodlevel.cachedGOs.Count; k++) { CachedGameObject cachedGO = lodlevel.cachedGOs.items[k]; if (!this.SortObject(meshCombiner, lodlevel, cachedGO, false)) { lodlevel.cachedGOs.RemoveAt(k--); } } } } } return; } for (int l = 0; l < 8; l++) { if (this.cellsUsed[l]) { this.cells[l].SortObjects(meshCombiner); } } }