< Summary

Class:DCL.Skybox.SkyboxEditorWindow
Assembly:SkyboxEditorAssembly
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Rendering/ProceduralSkybox/ToolProceduralSkybox/Scripts/Editor/Procedural Skybox/SkyboxEditor.cs
Covered lines:0
Uncovered lines:302
Coverable lines:302
Total lines:641
Line coverage:0% (0 of 302)
Covered branches:0
Total branches:0
Covered methods:0
Total methods:25
Method coverage:0% (0 of 25)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
SkyboxEditorWindow()0%2100%
Init()0%56700%
OnDisable()0%6200%
Initialize()0%2100%
InitializeWindow()0%2100%
Update()0%20400%
OnGUI()0%6200%
RenderTopPanel()0%30500%
RenderProfileControl()0%1561200%
RenderTimePanel()0%20400%
RenderLeftPanel()0%56700%
AddToRightPanel(...)0%12300%
RenderRightPanel(...)0%12300%
RefreshPinnedPanels()0%72800%
RenderPinnedRightPanel(...)0%1561200%
RenderRightPanelHeading(...)0%20400%
EnsureDependencies()0%1561200%
TakeControlAtRuntime()0%6200%
InitializeMaterial()0%2100%
UpdateMaterial()0%2100%
AddNewConfiguration(...)0%2100%
UpdateConfigurationsList()0%56700%
ResumeTime()0%2100%
PauseTime()0%2100%
ApplyOnMaterial(...)0%20400%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Rendering/ProceduralSkybox/ToolProceduralSkybox/Scripts/Editor/Procedural Skybox/SkyboxEditor.cs

#LineLine coverage
 1using DCL.Providers;
 2using System;
 3using System.Collections;
 4using System.Collections.Generic;
 5using System.Linq;
 6using System.Threading.Tasks;
 7using UnityEditor;
 8using UnityEngine;
 9
 10namespace DCL.Skybox
 11{
 12    public class SkyboxEditorWindow : EditorWindow
 13    {
 14        private EditorToolMeasurements toolSize;
 15
 16        private List<SkyboxConfiguration> configurations;
 17        private List<string> configurationNames;
 18        private int selectedConfigurationIndex;
 19        private SkyboxConfiguration selectedConfiguration;
 20
 21        public bool isPaused;
 22        public float timeOfTheDay;
 023        public float lifecycleDuration = 1;
 24
 25        private Material selectedMat;
 26        private Vector2 leftPanelScrollPos;
 27        private Vector2 rightPanelScrollPos;
 28        private Vector2 topScroll;
 29        private Light directionalLight;
 30        private bool creatingNewConfig;
 31        private string newConfigName;
 32        private bool overridingController;
 33        private List<string> renderingOrderList;
 34
 35        private float leftPanelWidth;
 036        private List<RightPanelPins> rightPanelPins = new List<RightPanelPins>() { new RightPanelPins { part = SkyboxEdi
 37
 38        private CopyFunctionality copyPasteObj;
 39        private static SkyboxElements skyboxElements;
 40
 41        private static SkyboxConfiguration[] tConfigurations;
 42        private static MaterialReferenceContainer materialReferenceContainer;
 43        [MenuItem("Window/Skybox Editor")]
 44        private static async void Init()
 45        {
 046            AddressableResourceProvider addressableResourceProvider = new AddressableResourceProvider();
 047            materialReferenceContainer = await addressableResourceProvider.GetAddressable<MaterialReferenceContainer>("S
 048            IList<SkyboxConfiguration> configurations = await addressableResourceProvider.GetAddressablesList<SkyboxConf
 049            tConfigurations = configurations.ToArray();
 050            skyboxElements = new SkyboxElements();
 051            await skyboxElements.Initialize(addressableResourceProvider, materialReferenceContainer);
 52
 053            SkyboxEditorWindow window = (SkyboxEditorWindow)EditorWindow.GetWindow(typeof(SkyboxEditorWindow));
 054            window.minSize = new Vector2(500, 500);
 055            window.Initialize();
 056            window.Show();
 057            window.InitializeWindow();
 058        }
 59
 060        private void OnDisable() { skyboxElements?.Dispose(); }
 61
 062        void Initialize() { toolSize = AssetDatabase.LoadAssetAtPath<EditorToolMeasurements>(SkyboxEditorLiterals.Paths.
 63
 064        public void InitializeWindow() { EnsureDependencies(); }
 65
 66        private void Update()
 67        {
 068            if (selectedConfiguration == null || isPaused)
 69            {
 070                return;
 71            }
 72
 073            float timeNormalizationFactor = lifecycleDuration * 60 / SkyboxUtils.CYCLE_TIME;
 074            timeOfTheDay += Time.deltaTime / timeNormalizationFactor;
 075            timeOfTheDay = Mathf.Clamp(timeOfTheDay, 0.01f, SkyboxUtils.CYCLE_TIME);
 76
 077            ApplyOnMaterial(false);
 78
 079            if (timeOfTheDay >= SkyboxUtils.CYCLE_TIME)
 80            {
 081                timeOfTheDay = 0.01f;
 082                selectedConfiguration.CycleResets();
 83            }
 84
 085            Repaint();
 086        }
 87
 88        private void OnGUI()
 89        {
 090            EditorGUI.DrawRect(new Rect(toolSize.topPanelLeftStart, toolSize.topPanelTopStart, position.width - toolSize
 091            GUILayout.BeginArea(new Rect(toolSize.topPanelLeftStart, toolSize.topPanelTopStart, position.width - toolSiz
 092            RenderTopPanel();
 093            GUILayout.EndArea();
 94
 95            // Left Panel
 096            float topLeft = toolSize.topPanelLeftStart;
 097            float top = toolSize.topPanelTopStart + toolSize.topPanelHeight + toolSize.panelsPadding;
 098            float width = (position.width - toolSize.toolRightPadding) * toolSize.leftPanelWidthPercentage;
 099            float height = (position.height - top - toolSize.panelsPadding);
 0100            leftPanelWidth = width - toolSize.leftPanelPadding.xMax;
 0101            EditorGUI.DrawRect(new Rect(topLeft, top, width, height), toolSize.panelBGColor);
 0102            GUILayout.BeginArea(new Rect(topLeft + toolSize.leftPanelPadding.xMin, top + toolSize.leftPanelPadding.yMin,
 0103            RenderLeftPanel();
 0104            GUILayout.EndArea();
 105
 106            // Right Panel
 0107            topLeft = toolSize.topPanelLeftStart + width + toolSize.panelsPadding;
 0108            width = position.width - toolSize.toolRightPadding - topLeft;
 0109            GUILayout.BeginArea(new Rect(topLeft + toolSize.rightPanelPadding.xMin, top + toolSize.rightPanelPadding.yMi
 0110            RenderRightPanel(topLeft + toolSize.rightPanelPadding.xMin, top + toolSize.rightPanelPadding.yMin, width - t
 0111            GUILayout.EndArea();
 112
 0113            if (GUI.changed)
 114            {
 0115                ApplyOnMaterial(true);
 116            }
 0117        }
 118
 119        #region Top Panel
 120
 121        void RenderTopPanel()
 122        {
 0123            topScroll = EditorGUILayout.BeginScrollView(topScroll);
 0124            GUIStyle style = new GUIStyle();
 0125            style.alignment = TextAnchor.MiddleLeft;
 126
 0127            style.fixedWidth = position.width - toolSize.toolRightPadding;
 0128            EditorGUILayout.BeginHorizontal(style);
 129
 0130            style.fixedWidth = (position.width - toolSize.toolRightPadding) / 2;
 0131            EditorGUILayout.BeginVertical(style);
 0132            RenderProfileControl();
 0133            EditorGUILayout.EndVertical();
 134
 0135            EditorGUILayout.BeginVertical(style);
 0136            RenderTimePanel();
 0137            EditorGUILayout.EndVertical();
 138
 0139            EditorGUILayout.EndHorizontal();
 140
 141            // Timeline Tags
 0142            EditorGUILayout.BeginHorizontal();
 143
 0144            style = new GUIStyle();
 0145            style.alignment = TextAnchor.MiddleLeft;
 0146            style.fixedWidth = (position.width - toolSize.toolRightPadding) / 2;
 0147            EditorGUILayout.BeginVertical(style);
 0148            if (GUILayout.Button(SkyboxEditorLiterals.Labels.timeLineTags, GUILayout.Width(100)))
 149            {
 0150                AddToRightPanel(new RightPanelPins { part = SkyboxEditorToolsParts.Timeline_Tags, name = SkyboxEditorLit
 151            }
 0152            EditorGUILayout.EndVertical();
 153
 0154            style = new GUIStyle();
 0155            style.alignment = TextAnchor.MiddleRight;
 0156            style.fixedWidth = 100;
 0157            EditorGUILayout.BeginVertical(style);
 0158            if (GUILayout.Button(SkyboxEditorLiterals.Labels.config))
 159            {
 0160                Selection.activeObject = AssetDatabase.LoadAssetAtPath<EditorToolMeasurements>(SkyboxEditorLiterals.Path
 161            }
 0162            EditorGUILayout.EndVertical();
 0163            EditorGUILayout.EndHorizontal();
 164
 0165            EditorGUILayout.EndScrollView();
 0166            if (Application.isPlaying && SkyboxController.i == null)
 0167                EditorGUILayout.HelpBox("There's no SkyboxController in the scene, try this in InitialScene!", MessageTy
 0168        }
 169
 170        private void RenderProfileControl()
 171        {
 0172            if (creatingNewConfig)
 173            {
 0174                EditorGUILayout.BeginHorizontal();
 0175                GUILayout.Label(SkyboxEditorLiterals.Labels.name);
 0176                newConfigName = EditorGUILayout.TextField(newConfigName, GUILayout.Width(200));
 177
 0178                if (GUILayout.Button(SkyboxEditorLiterals.Labels.create, GUILayout.Width(50)))
 179                {
 180                    // Make new configuration
 0181                    selectedConfiguration = AddNewConfiguration(newConfigName);
 182
 183                    // Update configuration list
 0184                    UpdateConfigurationsList();
 0185                    creatingNewConfig = false;
 186
 0187                    if (Application.isPlaying && SkyboxController.i != null && overridingController)
 188                    {
 0189                        SkyboxController.i.UpdateConfigurationTimelineEvent(selectedConfiguration);
 190                    }
 191                }
 192
 0193                if (GUILayout.Button(SkyboxEditorLiterals.Labels.cancel, GUILayout.Width(50)))
 194                {
 0195                    creatingNewConfig = false;
 196                }
 0197                EditorGUILayout.EndHorizontal();
 198            }
 199            else
 200            {
 0201                EditorGUILayout.BeginHorizontal();
 202
 0203                EditorGUILayout.LabelField(SkyboxEditorLiterals.Labels.currentProfile);
 0204                selectedConfiguration = (SkyboxConfiguration)EditorGUILayout.ObjectField(selectedConfiguration, typeof(S
 205
 0206                if (selectedConfiguration != configurations[selectedConfigurationIndex])
 207                {
 0208                    configurations[selectedConfigurationIndex] = selectedConfiguration;
 209
 0210                    if (Application.isPlaying && SkyboxController.i != null && overridingController)
 211                    {
 0212                        SkyboxController.i.UpdateConfigurationTimelineEvent(selectedConfiguration);
 213                    }
 214                }
 215
 0216                if (GUILayout.Button(SkyboxEditorLiterals.Characters.sign_add, GUILayout.Width(50)))
 217                {
 0218                    creatingNewConfig = true;
 219                }
 0220                EditorGUILayout.EndHorizontal();
 221            }
 0222        }
 223
 224        private void RenderTimePanel()
 225        {
 226
 0227            EditorGUILayout.BeginVertical();
 0228            EditorGUILayout.BeginHorizontal();
 0229            EditorGUILayout.LabelField("Time : " + timeOfTheDay.ToString("f2"));
 0230            timeOfTheDay = EditorGUILayout.Slider(timeOfTheDay, 0.01f, SkyboxUtils.CYCLE_TIME);
 0231            if (isPaused)
 232            {
 0233                if (GUILayout.Button(SkyboxEditorLiterals.Labels.play))
 234                {
 0235                    ResumeTime();
 236                }
 237            }
 238            else
 239            {
 0240                if (GUILayout.Button(SkyboxEditorLiterals.Labels.pause))
 241                {
 0242                    PauseTime();
 243                }
 244            }
 0245            EditorGUILayout.EndHorizontal();
 246
 0247            EditorGUILayout.BeginHorizontal();
 0248            EditorGUILayout.LabelField(SkyboxEditorLiterals.Labels.cycle);
 0249            lifecycleDuration = EditorGUILayout.FloatField(lifecycleDuration);
 0250            EditorGUILayout.EndHorizontal();
 0251            EditorGUILayout.EndVertical();
 0252        }
 253
 254        #endregion
 255
 256        #region Left Panel
 257
 258        private void RenderLeftPanel()
 259        {
 0260            leftPanelScrollPos = EditorGUILayout.BeginScrollView(leftPanelScrollPos, true, false);
 0261            EditorGUILayout.BeginVertical();
 262            // Render BG Layer Button
 0263            if (GUILayout.Button(SkyboxEditorLiterals.Layers.backgroundLayer, EditorStyles.toolbarButton))
 264            {
 0265                AddToRightPanel(new RightPanelPins { part = SkyboxEditorToolsParts.BG_Layer, name = SkyboxEditorLiterals
 266            }
 267
 0268            EditorGUILayout.Space(toolSize.leftPanelButtonSpace);
 0269            if (GUILayout.Button(SkyboxEditorLiterals.Layers.horizonPlane, EditorStyles.toolbarButton))
 270            {
 0271                AddToRightPanel(new RightPanelPins { part = SkyboxEditorToolsParts.Horizon_Plane, name = SkyboxEditorLit
 272            }
 273
 0274            EditorGUILayout.Space(toolSize.leftPanelButtonSpace);
 0275            if (GUILayout.Button(SkyboxEditorLiterals.Layers.ambientLayer, EditorStyles.toolbarButton))
 276            {
 0277                AddToRightPanel(new RightPanelPins { part = SkyboxEditorToolsParts.Ambient_Layer, name = SkyboxEditorLit
 278            }
 279
 0280            EditorGUILayout.Space(toolSize.leftPanelButtonSpace);
 0281            if (GUILayout.Button(SkyboxEditorLiterals.Layers.avatarLayer, EditorStyles.toolbarButton))
 282            {
 0283                AddToRightPanel(new RightPanelPins { part = SkyboxEditorToolsParts.Avatar_Layer, name = SkyboxEditorLite
 284            }
 285
 0286            EditorGUILayout.Space(toolSize.leftPanelButtonSpace);
 0287            if (GUILayout.Button(SkyboxEditorLiterals.Layers.fogLayer, EditorStyles.toolbarButton))
 288            {
 0289                AddToRightPanel(new RightPanelPins { part = SkyboxEditorToolsParts.Fog_Layer, name = SkyboxEditorLiteral
 290            }
 291
 0292            EditorGUILayout.Space(toolSize.leftPanelButtonSpace);
 0293            if (GUILayout.Button(SkyboxEditorLiterals.Layers.directionalLightLayer, EditorStyles.toolbarButton))
 294            {
 0295                AddToRightPanel(new RightPanelPins { part = SkyboxEditorToolsParts.Directional_Light_Layer, name = Skybo
 296            }
 297
 0298            EditorGUILayout.Space(toolSize.leftPanelButtonSpace);
 299
 300            // Render Base 2D layers
 0301            EditorGUILayout.LabelField(SkyboxEditorLiterals.Layers.twoDLayers, EditorStyles.label, GUILayout.Width(leftP
 302
 0303            EditorGUILayout.Space(toolSize.leftPanelButtonSpace);
 304
 0305            RenderLeftPanelBaseSkyboxLayers.Render(ref timeOfTheDay, toolSize, selectedConfiguration, AddToRightPanel, r
 306
 307            // Render Domes List
 0308            EditorGUILayout.LabelField(SkyboxEditorLiterals.Layers.RenderDomeLayers, EditorStyles.label, GUILayout.Width
 309
 0310            EditorGUILayout.Space(toolSize.leftPanelButtonSpace);
 311
 0312            RenderLeftPanelDomeLayers.Render(ref timeOfTheDay, toolSize, selectedConfiguration, AddToRightPanel, copyPas
 313
 0314            EditorGUILayout.Space(toolSize.leftPanelButtonSpace);
 315
 316            // Render Satellite list
 0317            EditorGUILayout.LabelField(SkyboxEditorLiterals.Layers.RenderSatelliteLayers, EditorStyles.label, GUILayout.
 318
 0319            EditorGUILayout.Space(toolSize.leftPanelButtonSpace);
 320
 0321            RenderLeftPanelSatelliteLayers.Render(ref timeOfTheDay, toolSize, selectedConfiguration, AddToRightPanel, co
 322
 323            // Render Satellite list
 0324            EditorGUILayout.LabelField(SkyboxEditorLiterals.Layers.RenderPlanarLayers, EditorStyles.label, GUILayout.Wid
 325
 0326            EditorGUILayout.Space(toolSize.leftPanelButtonSpace);
 327
 0328            RenderLeftPanelPlanarLayers.Render(ref timeOfTheDay, toolSize, selectedConfiguration, AddToRightPanel, copyP
 329
 0330            EditorGUILayout.EndVertical();
 0331            EditorGUILayout.EndScrollView();
 0332        }
 333
 334        #endregion
 335
 336        #region Right Panel
 337
 338        private void AddToRightPanel(RightPanelPins obj)
 339        {
 0340            List<RightPanelPins> pinnedPanels = new List<RightPanelPins>();
 341            // Remove
 0342            for (int i = 0; i < rightPanelPins.Count; i++)
 343            {
 0344                if (rightPanelPins[i].pinned)
 345                {
 0346                    pinnedPanels.Add(rightPanelPins[i]);
 347                }
 348            }
 0349            pinnedPanels.Add(obj);
 350            // Add
 0351            rightPanelPins = pinnedPanels;
 0352        }
 353
 354        void RenderRightPanel(float topLeft, float top, float width, float height)
 355        {
 0356            RefreshPinnedPanels();
 357
 0358            rightPanelScrollPos = EditorGUILayout.BeginScrollView(rightPanelScrollPos);
 359
 0360            topLeft = 0;
 0361            top = 0;
 362
 0363            for (int i = 0; i < rightPanelPins.Count - 1; i++)
 364            {
 365                // Make a box for pinned panel
 0366                EditorGUI.DrawRect(new Rect(0 + toolSize.pinnedPanelBGOffset.x, top + toolSize.pinnedPanelBGOffset.y, wi
 0367                GUILayout.BeginArea(new Rect(0, top, width - toolSize.rightPanelPadding.xMax, toolSize.pinnedPanelHeight
 0368                RenderPinnedRightPanel(rightPanelPins[i]);
 0369                GUILayout.EndArea();
 370
 0371                topLeft = 0;
 0372                top = top + toolSize.pinnedPanelHeight + toolSize.pinnedPanelBGOffset.yMax + toolSize.pinnedPanelBGOffse
 373            }
 374
 375            // Make a box for pinned panel
 0376            EditorGUI.DrawRect(new Rect(0 + toolSize.pinnedPanelBGOffset.x, top + toolSize.pinnedPanelBGOffset.y, width 
 0377            GUILayout.BeginArea(new Rect(0, top, width - toolSize.rightPanelPadding.xMax, height - top));
 378
 0379            if (rightPanelPins.Count > 0)
 380            {
 0381                RenderPinnedRightPanel(rightPanelPins[rightPanelPins.Count - 1]);
 382            }
 383
 0384            GUILayout.EndArea();
 385
 0386            EditorGUILayout.EndScrollView();
 0387        }
 388
 389        private void RefreshPinnedPanels()
 390        {
 0391            List<RightPanelPins> pinnedPanels = new List<RightPanelPins>();
 392
 0393            for (int i = 0; i < rightPanelPins.Count; i++)
 394            {
 395                // Check if pinned panel object (in case of Base_Skybox and Elements3D_Dome) is deleted or not if delete
 0396                if (rightPanelPins[i].part == SkyboxEditorToolsParts.Base_Skybox)
 397                {
 0398                    if (!selectedConfiguration.layers.Contains(rightPanelPins[i].baseSkyboxTargetLayer))
 399                    {
 400                        continue;
 401                    }
 402                }
 403
 0404                if (rightPanelPins[i].part == SkyboxEditorToolsParts.Elements3D_Dome)
 405                {
 0406                    if (!selectedConfiguration.additional3Dconfig.Contains(rightPanelPins[i].targetDomeElement))
 407                    {
 408                        continue;
 409                    }
 410                }
 411
 0412                if (rightPanelPins[i].pinned)
 413                {
 0414                    pinnedPanels.Add(rightPanelPins[i]);
 415                }
 0416                else if (i == (rightPanelPins.Count - 1))
 417                {
 0418                    pinnedPanels.Add(rightPanelPins[i]);
 419                }
 420            }
 0421            rightPanelPins = pinnedPanels;
 0422        }
 423
 424        private void RenderPinnedRightPanel(RightPanelPins obj)
 425        {
 0426            RenderRightPanelHeading(obj.name, obj);
 0427            obj.scroll = EditorGUILayout.BeginScrollView(obj.scroll);
 428
 0429            EditorGUILayout.Space(5);
 0430            switch (obj.part)
 431            {
 432                case SkyboxEditorToolsParts.Timeline_Tags:
 0433                    RenderTimelineTags.RenderLayer(ref timeOfTheDay, toolSize, selectedConfiguration);
 0434                    break;
 435                case SkyboxEditorToolsParts.BG_Layer:
 0436                    RenderBackgroundColorLayer.RenderLayer(ref timeOfTheDay, toolSize, selectedConfiguration);
 0437                    break;
 438                case SkyboxEditorToolsParts.Horizon_Plane:
 0439                    RenderHorizonPlane.RenderLayer(ref timeOfTheDay, toolSize, selectedConfiguration);
 0440                    break;
 441                case SkyboxEditorToolsParts.Ambient_Layer:
 0442                    RenderAmbientLayer.RenderLayer(ref timeOfTheDay, toolSize, selectedConfiguration);
 0443                    break;
 444                case SkyboxEditorToolsParts.Avatar_Layer:
 0445                    RenderAvatarLayer.RenderLayer(ref timeOfTheDay, toolSize, selectedConfiguration);
 0446                    break;
 447                case SkyboxEditorToolsParts.Fog_Layer:
 0448                    RenderFogLayer.RenderLayer(ref timeOfTheDay, toolSize, selectedConfiguration);
 0449                    break;
 450                case SkyboxEditorToolsParts.Directional_Light_Layer:
 0451                    DirectionalLightLayer.RenderLayer(ref timeOfTheDay, toolSize, selectedConfiguration, directionalLigh
 0452                    break;
 453                case SkyboxEditorToolsParts.Base_Skybox:
 0454                    RenderTextureLayer.RenderLayer(ref timeOfTheDay, toolSize, obj.baseSkyboxTargetLayer);
 0455                    break;
 456                case SkyboxEditorToolsParts.Elements3D_Dome:
 0457                    RenderDome3DLayer.RenderLayer(ref timeOfTheDay, toolSize, obj.targetDomeElement);
 0458                    break;
 459                case SkyboxEditorToolsParts.Elements3D_Satellite:
 0460                    RenderSatellite3DLayer.RenderLayer(ref timeOfTheDay, toolSize, obj.targetSatelliteElement);
 0461                    break;
 462                case SkyboxEditorToolsParts.Elements3D_Planar:
 0463                    RenderPlanar3DLayer.RenderLayer(ref timeOfTheDay, toolSize, obj.targetPlanarElement);
 464                    break;
 465                default:
 466                    break;
 467            }
 468
 0469            EditorGUILayout.EndScrollView();
 0470        }
 471
 472        void RenderRightPanelHeading(string text, RightPanelPins obj)
 473        {
 0474            GUIStyle style = new GUIStyle(EditorStyles.miniBoldLabel);
 0475            style.normal.background = toolSize.rightPanelHeadingState.backgroundTex;
 0476            EditorGUILayout.BeginHorizontal(style);
 0477            style = new GUIStyle(EditorStyles.boldLabel);
 0478            style.normal.textColor = toolSize.rightPanelHeadingTextColor.textColor;
 0479            EditorGUILayout.LabelField(text, style, GUILayout.Width(200));
 480
 0481            string btnTxt = (obj.pinned) ? SkyboxEditorLiterals.Labels.unpin : SkyboxEditorLiterals.Labels.pin;
 0482            if (GUILayout.Button(btnTxt, GUILayout.Width(50)))
 483            {
 0484                obj.pinned = !obj.pinned;
 485            }
 0486            EditorGUILayout.EndHorizontal();
 0487        }
 488
 489        #endregion
 490
 491        private void EnsureDependencies()
 492        {
 0493            if (!Application.isPlaying)
 494            {
 0495                overridingController = false;
 496            }
 497
 0498            if (Application.isPlaying && !overridingController)
 499            {
 0500                TakeControlAtRuntime();
 501            }
 502
 0503            if (selectedConfiguration == null)
 504            {
 0505                UpdateConfigurationsList();
 506            }
 507
 0508            if (selectedMat == null)
 509            {
 0510                UpdateMaterial();
 511            }
 512
 0513            if (copyPasteObj == null)
 514            {
 0515                copyPasteObj = new CopyFunctionality();
 516            }
 517
 0518            EditorUtility.SetDirty(selectedConfiguration);
 519
 520            // Fill rendering order array
 0521            if (renderingOrderList == null)
 522            {
 0523                renderingOrderList = new List<string>();
 524
 0525                for (int i = 0; i < 5; i++)
 526                {
 0527                    renderingOrderList.Add((i + 1).ToString());
 528                }
 529            }
 530
 0531            if (directionalLight != null)
 532            {
 0533                return;
 534            }
 535
 536            // Cache directional light reference
 0537            directionalLight = GameObject.FindObjectsOfType<Light>(true).Where(s => s.type == LightType.Directional).Fir
 538
 539            // Make a directional light object if can't find
 0540            if (directionalLight == null)
 541            {
 0542                GameObject temp = new GameObject(SkyboxEditorLiterals.Labels.sunObjectName);
 543                // Add the light component
 0544                directionalLight = temp.AddComponent<Light>();
 0545                directionalLight.type = LightType.Directional;
 546            }
 0547        }
 548
 549        void TakeControlAtRuntime()
 550        {
 0551            if (SkyboxController.i != null)
 552            {
 0553                isPaused = SkyboxController.i.IsPaused();
 0554                lifecycleDuration = (float)SkyboxController.i.lifecycleDuration;
 0555                selectedConfiguration = SkyboxController.i.GetCurrentConfiguration();
 0556                overridingController = SkyboxController.i.SetOverrideController(true);
 0557                timeOfTheDay = SkyboxController.i.GetCurrentTimeOfTheDay();
 0558                skyboxElements = SkyboxController.i.GetSkyboxElements();
 0559                UpdateConfigurationsList();
 560            }
 0561        }
 562
 563        void InitializeMaterial()
 564        {
 0565            selectedMat = materialReferenceContainer.skyboxMat;
 0566            selectedConfiguration.ResetMaterial(selectedMat, materialReferenceContainer.skyboxMatSlots);
 0567            RenderSettings.skybox = selectedMat;
 0568        }
 569
 0570        private void UpdateMaterial() { InitializeMaterial(); }
 571
 572        private SkyboxConfiguration AddNewConfiguration(string name)
 573        {
 574            SkyboxConfiguration temp = null;
 0575            temp = ScriptableObject.CreateInstance<SkyboxConfiguration>();
 0576            temp.skyboxID = name;
 0577            string path = AssetDatabase.GenerateUniqueAssetPath("Assets/Rendering/ProceduralSkybox/SkyboxAddressables/Sk
 0578            AssetDatabase.CreateAsset(temp, path);
 0579            AssetDatabase.SaveAssets();
 580
 0581            return temp;
 582        }
 583
 584        private void UpdateConfigurationsList()
 585        {
 0586            configurations = new List<SkyboxConfiguration>(tConfigurations);
 0587            configurationNames = new List<string>();
 588
 589            // If no configurations exist, make and select new one.
 0590            if (configurations == null || configurations.Count < 1)
 591            {
 0592                selectedConfiguration = AddNewConfiguration(SkyboxEditorLiterals.Labels.defaultskyboxName);
 593
 0594                configurations = new List<SkyboxConfiguration>();
 0595                configurations.Add(selectedConfiguration);
 596            }
 597
 0598            if (selectedConfiguration == null)
 599            {
 0600                selectedConfiguration = configurations[0];
 601            }
 602
 0603            for (int i = 0; i < configurations.Count; i++)
 604            {
 0605                configurations[i].skyboxID = configurations[i].name;
 606
 0607                configurationNames.Add(configurations[i].skyboxID);
 0608                if (selectedConfiguration == configurations[i])
 609                {
 0610                    selectedConfigurationIndex = i;
 611                }
 612            }
 613
 0614            InitializeMaterial();
 615
 0616            if (!Application.isPlaying)
 617            {
 0618                isPaused = true;
 619            }
 0620        }
 621
 0622        void ResumeTime() { isPaused = false; }
 623
 0624        void PauseTime() { isPaused = true; }
 625
 626        private void ApplyOnMaterial(bool isEditor)
 627        {
 0628            EnsureDependencies();
 0629            float normalizedDayTime = SkyboxUtils.GetNormalizedDayTime(timeOfTheDay);
 0630            selectedConfiguration.ApplyOnMaterial(selectedMat, timeOfTheDay, normalizedDayTime, materialReferenceContain
 631
 0632            skyboxElements?.ApplyConfigTo3DElements(selectedConfiguration, timeOfTheDay, normalizedDayTime, directionalL
 633
 634            // If in play mode, call avatar color from skybox controller class
 0635            if (Application.isPlaying && SkyboxController.i != null)
 636            {
 0637                SkyboxController.i.ApplyAvatarColor(normalizedDayTime);
 638            }
 0639        }
 640    }
 641}