Exemplo n.º 1
0
            void AddObjectInternal(MeshCombiner meshCombiner, CachedGameObject cachedGO, Vector3 position, int lodParentIndex, int lodLevel, bool isChangeMode)
            {
                if (level == maxLevels)
                {
                    MaxCell thisCell = (MaxCell)this;

                    if (thisCell.lodParents == null)
                    {
                        thisCell.lodParents = new LODParent[10];
                    }
                    if (thisCell.lodParents[lodParentIndex] == null)
                    {
                        thisCell.lodParents[lodParentIndex] = new LODParent(lodParentIndex + 1);
                    }

                    LODParent lodParent = thisCell.lodParents[lodParentIndex];
                    LODLevel  lod       = lodParent.lodLevels[lodLevel];

                    lod.cachedGOs.Add(cachedGO);
                    if (isChangeMode)
                    {
                        if (SortObject(meshCombiner, lod, cachedGO))
                        {
                            if (!thisCell.hasChanged)
                            {
                                thisCell.hasChanged = true;
                                if (meshCombiner.changedCells == null)
                                {
                                    meshCombiner.changedCells = new List <MaxCell>();
                                }
                                meshCombiner.changedCells.Add(thisCell);
                            }
                            if (!lodParent.hasChanged)
                            {
                                lodParent.hasChanged = true;
                                thisCell.changedLodParents.Add(lodParent);
                            }
                        }
                    }

                    lod.objectCount++;

                    lod.vertCount += cachedGO.mesh.vertexCount;
                    return;
                }
                else
                {
                    bool maxCellCreated;
                    int  index = AddCell <Cell, MaxCell>(ref cells, position, out maxCellCreated);
                    if (maxCellCreated)
                    {
                        MaxCell.maxCellCount++;
                    }
                    cells[index].AddObjectInternal(meshCombiner, cachedGO, position, lodParentIndex, lodLevel, isChangeMode);
                }
            }
Exemplo n.º 2
0
            public void SortObjects(MeshCombiner meshCombiner)
            {
                if (level == maxLevels)
                {
                    MaxCell thisCell = (MaxCell)this;

                    LODParent[] lodParents = thisCell.lodParents;

                    for (int i = 0; i < lodParents.Length; i++)
                    {
                        LODParent lodParent = lodParents[i];
                        if (lodParent == null)
                        {
                            continue;
                        }

                        for (int j = 0; j < lodParent.lodLevels.Length; j++)
                        {
                            LODLevel lod = lodParent.lodLevels[j];

                            if (lod == null || lod.cachedGOs.Count == 0)
                            {
                                return;
                            }

                            for (int k = 0; k < lod.cachedGOs.Count; ++k)
                            {
                                CachedGameObject cachedGO = lod.cachedGOs.items[k];

                                if (!SortObject(meshCombiner, lod, cachedGO))
                                {
                                    lod.cachedGOs.RemoveAt(k--);
                                }
                            }
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < 8; ++i)
                    {
                        if (cellsUsed[i])
                        {
                            cells[i].SortObjects(meshCombiner);
                        }
                    }
                }
            }
Exemplo n.º 3
0
            public void CombineMeshes(MeshCombiner meshCombiner, int lodParentIndex)
            {
                if (level == maxLevels)
                {
                    MaxCell thisCell = (MaxCell)this;

                    LODParent lodParent = thisCell.lodParents[lodParentIndex];
                    if (lodParent == null)
                    {
                        return;
                    }

                    CombineMode combineMode = meshCombiner.combineMode;

                    if (combineMode != CombineMode.DynamicObjects)
                    {
                        lodParent.cellGO         = new GameObject(meshCombiner.combineMode == CombineMode.StaticObjects ? "Cell " + bounds.center : "Combined Objects");
                        lodParent.cellT          = lodParent.cellGO.transform;
                        lodParent.cellT.position = bounds.center;
                        lodParent.cellT.parent   = meshCombiner.lodParentHolders[lodParentIndex].t;
                    }

                    if (lodParentIndex > 0)
                    {
                        lodParent.lodGroup = lodParent.cellGO.AddComponent <LODGroup>();
                        lodParent.lodGroup.localReferencePoint = lodParent.cellT.position = bounds.center;
                    }

                    LODLevel[] lods = lodParent.lodLevels;
                    for (int i = 0; i < lods.Length; i++)
                    {
                        LODLevel lod = lodParent.lodLevels[i];
                        if (lod == null || lod.meshObjectsHoldersLookup == null)
                        {
                            return;
                        }

                        GameObject lodGO;
                        Transform  lodT = null;

                        if (lodParentIndex > 0)
                        {
                            lodGO       = new GameObject("LOD" + i);
                            lodT        = lodGO.transform;
                            lodT.parent = lodParent.cellT;
                        }

                        foreach (MeshObjectsHolder sortedMeshes in lod.meshObjectsHoldersLookup.Values)
                        {
                            sortedMeshes.lodParent = lodParent;
                            sortedMeshes.lodLevel  = i;
                            Vector3 position = (combineMode == CombineMode.DynamicObjects ? sortedMeshes.meshObjects.items[0].cachedGO.rootT.position : bounds.center);
                            MeshCombineJobManager.instance.AddJob(meshCombiner, sortedMeshes, lodParentIndex > 0 ? lodT : lodParent.cellT, position);
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < 8; ++i)
                    {
                        if (cellsUsed[i])
                        {
                            cells[i].CombineMeshes(meshCombiner, lodParentIndex);
                        }
                    }
                }
            }
Exemplo n.º 4
0
            public void CombineMeshes(MeshCombiner meshCombiner, int lodParentIndex)
            {
                if (level == maxLevels)
                {
                    MaxCell thisCell = (MaxCell)this;

                    LODParent lodParent = thisCell.lodParents[lodParentIndex];
                    if (lodParent == null)
                    {
                        return;
                    }

                    lodParent.cellGO         = new GameObject(meshCombiner.useCells ? "Cell " + bounds.center : "Combined Objects");
                    lodParent.cellT          = lodParent.cellGO.transform;
                    lodParent.cellT.position = bounds.center;
                    lodParent.cellT.parent   = meshCombiner.lodParentHolders[lodParentIndex].t;

                    if (lodParentIndex > 0)
                    {
                        lodParent.lodGroup = lodParent.cellGO.AddComponent <LODGroup>();
                        lodParent.lodGroup.localReferencePoint = lodParent.cellT.position = bounds.center;
                    }

                    LODLevel[] lods = lodParent.lodLevels;
                    for (int i = 0; i < lods.Length; i++)
                    {
                        LODLevel lod = lodParent.lodLevels[i];
                        if (lod == null || lod.meshObjectsHolders == null)
                        {
                            return;
                        }

                        GameObject lodGO;
                        Transform  lodT = null;

                        if (lodParentIndex > 0)
                        {
                            lodGO       = new GameObject("LOD" + i);
                            lodT        = lodGO.transform;
                            lodT.parent = lodParent.cellT;
                        }

                        for (int k = 0; k < lod.meshObjectsHolders.Count; ++k)
                        {
                            MeshObjectsHolder sortedMeshes = lod.meshObjectsHolders[k];
                            sortedMeshes.lodParent = lodParent;
                            sortedMeshes.lodLevel  = i;
                            MeshCombineJobManager.instance.AddJob(meshCombiner, sortedMeshes, lodParentIndex > 0 ? lodT : lodParent.cellT, bounds.center);
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < 8; ++i)
                    {
                        if (cellsUsed[i])
                        {
                            cells[i].CombineMeshes(meshCombiner, lodParentIndex);
                        }
                    }
                }
            }