コード例 #1
0
            // 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);
            }
コード例 #2
0
 // 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);
         }
     }
 }
コード例 #3
0
        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);
                }
            }
        }
コード例 #4
0
            // 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;
            }
コード例 #5
0
            // 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);
            }
コード例 #6
0
 // 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);
         }
     }
 }