Exemplo n.º 1
0
 public RuntimePrefabPool(RuntimePrefabRule runtimePrefabRule, VegetationItemInfoPro vegetationItemInfoPro,
                          Transform prefabParent, bool showPrefabsInHierarchy)
 {
     _vegetationItemInfoPro  = vegetationItemInfoPro;
     _prefabParent           = prefabParent;
     _showPrefabsInHierarchy = showPrefabsInHierarchy;
     _runtimePrefabRule      = runtimePrefabRule;
 }
Exemplo n.º 2
0
        public void SetupRuntimePrefabSystem()
        {
            if (!VegetationSystemPro)
            {
                return;
            }

            DisposeRuntimePrefabSystem();
            CreateRuntimePrefabParent();

            VisibleVegetationCellSelector = new VisibleVegetationCellSelector();

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

                for (int j = 0; j <= vegetationPackagePro.VegetationInfoList.Count - 1; j++)
                {
                    VegetationItemInfoPro vegetationItemInfoPro = vegetationPackagePro.VegetationInfoList[j];

                    VegetationItemRuntimePrefabInfo vegetationItemRuntimePrefabInfo =
                        new VegetationItemRuntimePrefabInfo();

                    for (int k = 0; k <= vegetationItemInfoPro.RuntimePrefabRuleList.Count - 1; k++)
                    {
                        RuntimePrefabRule    runtimePrefabRule    = vegetationItemInfoPro.RuntimePrefabRuleList[k];
                        RuntimePrefabManager runtimePrefabManager =
                            new RuntimePrefabManager(VisibleVegetationCellSelector, VegetationSystemPro,
                                                     vegetationItemInfoPro, runtimePrefabRule, _runtimePrefabParent, ShowRuntimePrefabs);
                        vegetationItemRuntimePrefabInfo.RuntimePrefabManagerList.Add(runtimePrefabManager);
                    }

                    vegetationPackageRuntimePrefabInfo.RuntimePrefabManagerList.Add(vegetationItemRuntimePrefabInfo);
                }

                PackageRuntimePrefabInfoList.Add(vegetationPackageRuntimePrefabInfo);
            }

            VisibleVegetationCellSelector.Init(VegetationSystemPro);
        }
Exemplo n.º 3
0
        public RuntimePrefabManager(VisibleVegetationCellSelector visibleVegetationCellSelector,
                                    VegetationSystemPro vegetationSystemPro, VegetationItemInfoPro vegetationItemInfoPro, RuntimePrefabRule runtimePrefabRule,
                                    Transform prefabParent, bool showPrefabsInHierarchy)
        {
            _showPrefabsInHierarchy = showPrefabsInHierarchy;
            _vegetationSystemPro    = vegetationSystemPro;
            _runtimePrefabRule      = runtimePrefabRule;

            float cullingDistance = vegetationSystemPro.VegetationSettings.GetVegetationDistance() * runtimePrefabRule.DistanceFactor;

            VegetationItemSelector = new VegetationItemSelector(visibleVegetationCellSelector, vegetationSystemPro,
                                                                vegetationItemInfoPro, true, _runtimePrefabRule.SpawnFrequency, _runtimePrefabRule.Seed)
            {
                CullingDistance = cullingDistance
            };

            VegetationItemSelector.OnVegetationItemVisibleDelegate   += OnVegetationItemVisible;
            VegetationItemSelector.OnVegetationItemInvisibleDelegate += OnVegetationItemInvisible;
            VegetationItemSelector.OnVegetationCellInvisibleDelegate += OnVegetationCellInvisible;

            RuntimePrefabPool    = new RuntimePrefabPool(_runtimePrefabRule, vegetationItemInfoPro, prefabParent, _showPrefabsInHierarchy);
            RuntimePrefabStorage = new RuntimePrefabStorage(RuntimePrefabPool);
        }
        private void DrawSettingsInspector()
        {
            VegetationSystemPro vegetationSystemPro = _runtimePrefabSpawner.VegetationSystemPro;

            if (vegetationSystemPro.VegetationPackageProList.Count == 0)
            {
                EditorGUILayout.HelpBox(
                    "There is no vegetation package/biome in the vegetation system",
                    MessageType.Warning);
                return;
            }



            GUILayout.BeginVertical("box");
            EditorGUILayout.LabelField("Select biome/vegetation package", LabelStyle);
            string[] packageNameList = new string[vegetationSystemPro.VegetationPackageProList.Count];
            for (int i = 0; i <= vegetationSystemPro.VegetationPackageProList.Count - 1; i++)
            {
                if (vegetationSystemPro.VegetationPackageProList[i])
                {
                    packageNameList[i] = (i + 1).ToString() + " " +
                                         vegetationSystemPro.VegetationPackageProList[i].PackageName;
                }
                else
                {
                    packageNameList[i] = "Not found";
                }
            }

            EditorGUI.BeginChangeCheck();
            _runtimePrefabSpawner.VegetationPackageIndex = EditorGUILayout.Popup("Selected vegetation package",
                                                                                 _runtimePrefabSpawner.VegetationPackageIndex, packageNameList);
            if (EditorGUI.EndChangeCheck())
            {
                SetSceneDirty();
            }

            GUILayout.EndVertical();

            VegetationPackagePro vegetationPackagePro =
                vegetationSystemPro.VegetationPackageProList[_runtimePrefabSpawner.VegetationPackageIndex];

            if (vegetationPackagePro == null)
            {
                return;
            }
            if (vegetationPackagePro.VegetationInfoList.Count == 0)
            {
                return;
            }


            GUILayout.BeginVertical("box");
            EditorGUILayout.LabelField("Select Vegetation Item", LabelStyle);

            EditorGUI.BeginChangeCheck();
            _selectedVegetationTypeIndex = GUILayout.SelectionGrid(_selectedVegetationTypeIndex, VegetationTypeNames, 3,
                                                                   EditorStyles.toolbarButton);
            if (EditorGUI.EndChangeCheck())
            {
                _selectedGridIndex = 0;
            }

            VegetationPackageEditorTools.VegetationItemTypeSelection vegetationItemTypeSelection =
                VegetationPackageEditorTools.GetVegetationItemTypeSelection(_selectedVegetationTypeIndex);

            int selectionCount = 0;

            VegetationPackageEditorTools.DrawVegetationItemSelector(vegetationSystemPro, vegetationPackagePro,
                                                                    ref _selectedGridIndex, ref _vegIndex, ref selectionCount, vegetationItemTypeSelection, 70);

            if (_lastVegIndex != _vegIndex)
            {
                GUI.FocusControl(null);
            }
            _lastVegIndex = _vegIndex;

            GUILayout.EndVertical();

            VegetationItemInfoPro vegetationItemInfoPro = vegetationPackagePro.VegetationInfoList[_vegIndex];

            if (vegetationItemInfoPro == null)
            {
                return;
            }

            GUILayout.BeginVertical("box");
            EditorGUILayout.LabelField("Selected item", vegetationItemInfoPro.Name);


            if (GUILayout.Button("Add run-time prefab rule"))
            {
                RuntimePrefabRule newRuntimePrefabRule = new RuntimePrefabRule();
                newRuntimePrefabRule.SetSeed();

                vegetationItemInfoPro.RuntimePrefabRuleList.Add(newRuntimePrefabRule);
                _runtimePrefabSpawner.RefreshRuntimePrefabs();
                EditorUtility.SetDirty(vegetationPackagePro);
                SetSceneDirty();
            }
            GUILayout.EndVertical();

            for (int i = 0; i <= vegetationItemInfoPro.RuntimePrefabRuleList.Count - 1; i++)
            {
                RuntimePrefabRule runtimePrefabRule = vegetationItemInfoPro.RuntimePrefabRuleList[i];
                EditorGUI.BeginChangeCheck();
                GUILayout.BeginVertical("box");

                runtimePrefabRule.RuntimePrefab = EditorGUILayout.ObjectField("Runtime prefab", runtimePrefabRule.RuntimePrefab, typeof(GameObject), true) as GameObject;

                var       prefabTexture          = AssetPreview.GetAssetPreview(runtimePrefabRule.RuntimePrefab);
                Texture2D convertedPrefabTexture = new Texture2D(2, 2, TextureFormat.ARGB32, true, true);
                if (Application.isPlaying)
                {
                    convertedPrefabTexture = prefabTexture;
                }
                else
                {
                    if (prefabTexture)
                    {
                        convertedPrefabTexture.LoadImage(prefabTexture.EncodeToPNG());
                    }
                }

                if (convertedPrefabTexture)
                {
                    Rect  space = GUILayoutUtility.GetRect(GUIContent.none, GUIStyle.none, GUILayout.Height(convertedPrefabTexture.height));
                    float width = space.width;

                    space.xMin = (width - convertedPrefabTexture.width);
                    if (space.xMin < 0)
                    {
                        space.xMin = 0;
                    }

                    space.width  = convertedPrefabTexture.width;
                    space.height = convertedPrefabTexture.height;
                    EditorGUI.DrawPreviewTexture(space, convertedPrefabTexture);
                }
                runtimePrefabRule.SpawnFrequency         = EditorGUILayout.Slider("Spawn frequency", runtimePrefabRule.SpawnFrequency, 0, 1f);
                runtimePrefabRule.PrefabScale            = EditorGUILayout.Vector3Field("Scale", runtimePrefabRule.PrefabScale);
                runtimePrefabRule.UseVegetationItemScale = EditorGUILayout.Toggle("Add vegetation item scale", runtimePrefabRule.UseVegetationItemScale);
                runtimePrefabRule.PrefabRotation         = EditorGUILayout.Vector3Field("Rotation", runtimePrefabRule.PrefabRotation);
                runtimePrefabRule.PrefabOffset           = EditorGUILayout.Vector3Field("Offset", runtimePrefabRule.PrefabOffset);
                runtimePrefabRule.PrefabLayer            = EditorGUILayout.LayerField("Prefab layer", runtimePrefabRule.PrefabLayer);
                runtimePrefabRule.Seed    = EditorGUILayout.IntSlider("Seed", runtimePrefabRule.Seed, 0, 99);
                runtimePrefabRule.UsePool = EditorGUILayout.Toggle("Use pooling system", runtimePrefabRule.UsePool);

                runtimePrefabRule.DistanceFactor = EditorGUILayout.Slider("Distance factor", runtimePrefabRule.DistanceFactor, 0, 1f);
                float currentDistance = vegetationSystemPro.VegetationSettings.GetVegetationDistance() * runtimePrefabRule.DistanceFactor;
                EditorGUILayout.LabelField("Current distance: " + currentDistance.ToString("F2") + " meters", LabelStyle);

                EditorGUILayout.HelpBox(
                    "The distance from the camera where prefabs are instantiated. Distance is a factor of the current vegetation item draw distance.",
                    MessageType.Info);

                if (EditorGUI.EndChangeCheck())
                {
                    EditorUtility.SetDirty(vegetationPackagePro);
                    _runtimePrefabSpawner.RefreshRuntimePrefabs();
                    SetSceneDirty();
                }

                if (GUILayout.Button("Remove run-time prefab rule"))
                {
                    vegetationItemInfoPro.RuntimePrefabRuleList.Remove(runtimePrefabRule);
                    _runtimePrefabSpawner.RefreshRuntimePrefabs();
                    GUILayout.EndVertical();
                    return;
                }

                GUILayout.EndVertical();
            }
        }