Exemplo n.º 1
0
        public void DisposeColliderSystem()
        {
            if (JobHandleList.IsCreated)
            {
                JobHandleList.Dispose();
            }

            for (int i = 0; i <= PackageColliderInfoList.Count - 1; i++)
            {
                VegetationPackageColliderInfo vegetationPackageColliderInfo = PackageColliderInfoList[i];
                for (int j = 0; j <= vegetationPackageColliderInfo.ColliderManagerList.Count - 1; j++)
                {
                    ColliderManager colliderManager = vegetationPackageColliderInfo.ColliderManagerList[j];
                    if (colliderManager != null)
                    {
                        colliderManager.OnCreateColliderDelegate        -= OnCreateCollider;
                        colliderManager.OnBeforeDestroyColliderDelegate -= OnBeforeDestroyCollider;
                    }
                    colliderManager?.Dispose();
                }

                vegetationPackageColliderInfo.ColliderManagerList.Clear();
            }
            PackageColliderInfoList.Clear();
            VisibleVegetationCellSelector?.Dispose();
            VisibleVegetationCellSelector = null;
            DestroyColliderParent();
        }
Exemplo n.º 2
0
 void UpdateFloatingOrigin(Vector3 deltaFloatingOriginOffset)
 {
     for (int i = 0; i <= PackageColliderInfoList.Count - 1; i++)
     {
         VegetationPackageColliderInfo vegetationPackageColliderInfo = PackageColliderInfoList[i];
         for (int j = 0; j <= vegetationPackageColliderInfo.ColliderManagerList.Count - 1; j++)
         {
             ColliderManager colliderManager = vegetationPackageColliderInfo.ColliderManagerList[j];
             colliderManager?.RuntimePrefabStorage.UpdateFloatingOrigin(deltaFloatingOriginOffset);
         }
     }
 }
Exemplo n.º 3
0
 public void UpdateCullingDistance()
 {
     for (int i = 0; i <= PackageColliderInfoList.Count - 1; i++)
     {
         VegetationPackageColliderInfo vegetationPackageColliderInfo = PackageColliderInfoList[i];
         for (int j = 0; j <= vegetationPackageColliderInfo.ColliderManagerList.Count - 1; j++)
         {
             ColliderManager colliderManager = vegetationPackageColliderInfo.ColliderManagerList[j];
             colliderManager?.UpdateColliderDistance();
         }
     }
 }
Exemplo n.º 4
0
 private void OnClearCacheVegetationCell(VegetationSystemPro vegetationSystemPro, VegetationCell vegetationCell)
 {
     for (int i = 0; i <= PackageColliderInfoList.Count - 1; i++)
     {
         VegetationPackageColliderInfo vegetationPackageColliderInfo = PackageColliderInfoList[i];
         for (int j = 0; j <= vegetationPackageColliderInfo.ColliderManagerList.Count - 1; j++)
         {
             ColliderManager colliderManager = vegetationPackageColliderInfo.ColliderManagerList[j];
             colliderManager?.VegetationItemSelector.RefreshVegetationCell(vegetationCell);
         }
     }
 }
Exemplo n.º 5
0
 public void SetColliderVisibility(bool value)
 {
     for (int i = 0; i <= PackageColliderInfoList.Count - 1; i++)
     {
         VegetationPackageColliderInfo vegetationPackageColliderInfo = PackageColliderInfoList[i];
         for (int j = 0; j <= vegetationPackageColliderInfo.ColliderManagerList.Count - 1; j++)
         {
             ColliderManager colliderManager = vegetationPackageColliderInfo.ColliderManagerList[j];
             colliderManager?.SetColliderVisibility(value);
         }
     }
 }
Exemplo n.º 6
0
        private void OnRenderComplete(VegetationSystemPro vegetationSystemPro)
        {
            if (PackageColliderInfoList.Count == 0)
            {
                return;
            }

            TestFloatingOrigin();

            Profiler.BeginSample("Collider system processing");
            JobHandleList.Clear();
            JobHandle cullingJobHandle = default(JobHandle);

            for (int i = 0; i <= PackageColliderInfoList.Count - 1; i++)
            {
                VegetationPackageColliderInfo vegetationPackageColliderInfo = PackageColliderInfoList[i];
                for (int j = 0; j <= vegetationPackageColliderInfo.ColliderManagerList.Count - 1; j++)
                {
                    ColliderManager colliderManager = vegetationPackageColliderInfo.ColliderManagerList[j];
                    if (colliderManager == null)
                    {
                        continue;
                    }

                    JobHandle itemCullingHandle = cullingJobHandle;

                    itemCullingHandle = colliderManager.VegetationItemSelector.ProcessInvisibleCells(itemCullingHandle);
                    itemCullingHandle = colliderManager.VegetationItemSelector.ProcessVisibleCells(itemCullingHandle);
                    itemCullingHandle = colliderManager.VegetationItemSelector.ProcessCulling(itemCullingHandle);
                    JobHandleList.Add(itemCullingHandle);
                }
            }

            JobHandle mergedHandle = JobHandle.CombineDependencies(JobHandleList);

            mergedHandle.Complete();

            for (int i = 0; i <= PackageColliderInfoList.Count - 1; i++)
            {
                VegetationPackageColliderInfo vegetationPackageColliderInfo = PackageColliderInfoList[i];
                for (int j = 0; j <= vegetationPackageColliderInfo.ColliderManagerList.Count - 1; j++)
                {
                    ColliderManager colliderManager = vegetationPackageColliderInfo.ColliderManagerList[j];
                    colliderManager?.VegetationItemSelector.ProcessEvents();
                }
            }
            Profiler.EndSample();
        }
Exemplo n.º 7
0
 private void OnClearCacheVegetationItem(VegetationSystemPro vegetationSystemPro, int vegetationPackageIndex,
                                         int vegetationItemIndex)
 {
     for (int i = 0; i <= PackageColliderInfoList.Count - 1; i++)
     {
         VegetationPackageColliderInfo vegetationPackageColliderInfo = PackageColliderInfoList[i];
         for (int j = 0; j <= vegetationPackageColliderInfo.ColliderManagerList.Count - 1; j++)
         {
             if (i == vegetationPackageIndex && j == vegetationItemIndex)
             {
                 ColliderManager colliderManager = vegetationPackageColliderInfo.ColliderManagerList[j];
                 colliderManager?.VegetationItemSelector.RefreshAllVegetationCells();
             }
         }
     }
 }
Exemplo n.º 8
0
        public int GetVisibleColliders()
        {
            int instanceCount = 0;

            for (int i = 0; i <= PackageColliderInfoList.Count - 1; i++)
            {
                VegetationPackageColliderInfo vegetationPackageColliderInfo = PackageColliderInfoList[i];
                for (int j = 0; j <= vegetationPackageColliderInfo.ColliderManagerList.Count - 1; j++)
                {
                    ColliderManager colliderManager = vegetationPackageColliderInfo.ColliderManagerList[j];
                    if (colliderManager != null)
                    {
                        instanceCount += colliderManager.RuntimePrefabStorage.RuntimePrefabInfoList.Count;
                    }
                }
            }
            return(instanceCount);
        }
Exemplo n.º 9
0
        public int GetLoadedInstanceCount()
        {
            int instanceCount = 0;

            for (int i = 0; i <= PackageColliderInfoList.Count - 1; i++)
            {
                VegetationPackageColliderInfo vegetationPackageColliderInfo = PackageColliderInfoList[i];
                for (int j = 0; j <= vegetationPackageColliderInfo.ColliderManagerList.Count - 1; j++)
                {
                    ColliderManager colliderManager = vegetationPackageColliderInfo.ColliderManagerList[j];
                    if (colliderManager != null)
                    {
                        instanceCount += colliderManager.VegetationItemSelector.InstanceList.Length;
                    }
                }
            }
            return(instanceCount);
        }
Exemplo n.º 10
0
        public void SetupColliderSystem()
        {
            if (!VegetationSystemPro)
            {
                return;
            }

            DisposeColliderSystem();

            JobHandleList = new NativeList <JobHandle>(64, Allocator.Persistent);

            CreateColliderParent();

            VisibleVegetationCellSelector = new VisibleVegetationCellSelector();

            for (int i = 0; i <= VegetationSystemPro.VegetationPackageProList.Count - 1; i++)
            {
                VegetationPackagePro          vegetationPackagePro          = VegetationSystemPro.VegetationPackageProList[i];
                VegetationPackageColliderInfo vegetationPackageColliderInfo = new VegetationPackageColliderInfo();

                for (int j = 0; j <= vegetationPackagePro.VegetationInfoList.Count - 1; j++)
                {
                    VegetationItemInfoPro vegetationItemInfoPro = vegetationPackagePro.VegetationInfoList[j];
                    if (vegetationItemInfoPro.ColliderType != ColliderType.Disabled)
                    {
                        ColliderManager tmpColliderManager = new ColliderManager(VisibleVegetationCellSelector, VegetationSystemPro, vegetationItemInfoPro, _colliderParent, ShowColliders);
                        tmpColliderManager.OnCreateColliderDelegate        += OnCreateCollider;
                        tmpColliderManager.OnBeforeDestroyColliderDelegate += OnBeforeDestroyCollider;

                        vegetationPackageColliderInfo.ColliderManagerList.Add(tmpColliderManager);
                    }
                    else
                    {
                        vegetationPackageColliderInfo.ColliderManagerList.Add(null);
                    }
                }

                PackageColliderInfoList.Add(vegetationPackageColliderInfo);
            }
            VisibleVegetationCellSelector.Init(VegetationSystemPro);
        }
Exemplo n.º 11
0
        public void BakeCollidersToScene()
        {
            for (int i = 0; i <= PackageColliderInfoList.Count - 1; i++)
            {
                VegetationPackageColliderInfo vegetationPackageColliderInfo = PackageColliderInfoList[i];
                VegetationPackagePro          vegetationPackagePro          = VegetationSystemPro.VegetationPackageProList[i];
                for (int j = 0; j <= vegetationPackageColliderInfo.ColliderManagerList.Count - 1; j++)
                {
                    VegetationItemInfoPro vegetationItemInfoPro = vegetationPackagePro.VegetationInfoList[j];
                    if (!vegetationItemInfoPro.ColliderUseForBake)
                    {
                        continue;
                    }

                    ColliderManager colliderManager = vegetationPackageColliderInfo.ColliderManagerList[j];
                    if (colliderManager != null)
                    {
                        BakeVegetationItemColliders(colliderManager, vegetationItemInfoPro);
                    }
                }
            }
        }
Exemplo n.º 12
0
        void BakeVegetationItemColliders(ColliderManager colliderManager, VegetationItemInfoPro vegetationItemInfoPro)
        {
            GC.Collect();

            GameObject rootItem = new GameObject("Baked colliders_" + vegetationItemInfoPro.Name + "_" + vegetationItemInfoPro.VegetationItemID);

#if UNITY_EDITOR
            if (!Application.isPlaying)
            {
                EditorUtility.DisplayProgressBar("Bake Collider: " + vegetationItemInfoPro.Name, "Bake cell", 0);
            }
#endif
            int colliderCount = 0;

            for (int i = 0; i <= VegetationSystemPro.VegetationCellList.Count - 1; i++)
            {
                VegetationCell vegetationCell = VegetationSystemPro.VegetationCellList[i];

#if UNITY_EDITOR
                if (i % 10 == 0)
                {
                    if (!Application.isPlaying)
                    {
                        EditorUtility.DisplayProgressBar("Bake Collider: " + vegetationItemInfoPro.Name, "Bake cell " + i + "/" + (VegetationSystemPro.VegetationCellList.Count - 1), i / ((float)VegetationSystemPro.VegetationCellList.Count - 1));
                    }
                }
#endif

                VegetationSystemPro.SpawnVegetationCell(vegetationCell, vegetationItemInfoPro.VegetationItemID);
                NativeList <MatrixInstance> vegetationInstanceList =
                    VegetationSystemPro.GetVegetationItemInstances(vegetationCell, vegetationItemInfoPro.VegetationItemID);

                for (int j = 0; j <= vegetationInstanceList.Length - 1; j++)
                {
                    Matrix4x4  vegetationItemMatrix = vegetationInstanceList[j].Matrix;
                    Vector3    position             = MatrixTools.ExtractTranslationFromMatrix(vegetationItemMatrix);
                    Vector3    scale    = MatrixTools.ExtractScaleFromMatrix(vegetationItemMatrix);
                    Quaternion rotation = MatrixTools.ExtractRotationFromMatrix(vegetationItemMatrix);

                    ItemSelectorInstanceInfo itemSelectorInstanceInfo = new ItemSelectorInstanceInfo
                    {
                        Position = position, Scale = scale, Rotation = rotation
                    };

                    GameObject newCollider = colliderManager.ColliderPool.GetObject(itemSelectorInstanceInfo);
                    newCollider.hideFlags = HideFlags.None;
                    newCollider.transform.SetParent(rootItem.transform, true);
                    SetNavmeshArea(newCollider, vegetationItemInfoPro.NavMeshArea);

                    if (SetBakedCollidersStatic)
                    {
                        SetStatic(newCollider);
                    }

                    if (ConvertBakedCollidersToMesh)
                    {
                        CreateNavMeshColliderMeshes(newCollider);
                    }


                    colliderCount++;
                }

                vegetationCell.ClearCache();
            }

            VegetationSystemPro.ClearCache(vegetationItemInfoPro.VegetationItemID);

#if UNITY_EDITOR
            if (!Application.isPlaying)
            {
                EditorUtility.ClearProgressBar();
            }
#endif

            if (colliderCount == 0)
            {
                DestroyImmediate(rootItem);
            }
        }