void RegisterChange(ref float reflectedVariable, float newValue, FloatSliderField resyncField = null, bool updatePreview = false)
 {
     if (environment == null || environment.Equals(null))
     {
         return;
     }
     reflectedVariable = newValue;
     resyncField?.SetValueWithoutNotify(newValue);
     if (updatePreview && latlong != null && !latlong.Equals(null))
     {
         latlong.image = GetLatLongThumbnailTexture(environment, k_SkyThumbnailWidth);
     }
     EditorUtility.SetDirty(environment);
     OnChangeCallback?.Invoke();
 }
        public VisualElement GetDefaultInspector()
        {
            VisualElement inspector = new VisualElement()
            {
                name = "Inspector"
            };
            Foldout skyFoldout = new Foldout()
            {
                text = "Sky"
            };

            skyCubemapField = new ObjectField("Sky with Sun");
            skyCubemapField.allowSceneObjects = false;
            skyCubemapField.objectType        = typeof(Cubemap);
            skyCubemapField.RegisterValueChangedCallback(evt
                                                         => RegisterChange(ref environment.sky.cubemap, evt.newValue as Cubemap, updatePreview: true));
            skyFoldout.Add(skyCubemapField);

            skyRotationOffset = new FloatSliderField("Rotation", 0f, 360f, 5);
            skyRotationOffset.RegisterValueChangedCallback(evt
                                                           => RegisterChange(ref environment.sky.rotation, evt.newValue, updatePreview: true));
            skyFoldout.Add(skyRotationOffset);

            skyExposureField = new FloatField("Exposure");
            skyExposureField.RegisterValueChangedCallback(evt
                                                          => RegisterChange(ref environment.sky.exposure, evt.newValue));
            skyFoldout.Add(skyExposureField);
            var style = skyFoldout.Q <Toggle>().style;

            style.marginLeft = 3;
            style.unityFontStyleAndWeight = FontStyle.Bold;
            inspector.Add(skyFoldout);

            //[TODO: reenable when shadow composition will be finished]
            //Foldout shadowFoldout = new Foldout()
            //{
            //    text = "Shadow"
            //};
            //shadowCubemapField = new ObjectField("Sky w/o Sun");
            //shadowCubemapField.allowSceneObjects = false;
            //shadowCubemapField.objectType = typeof(Cubemap);
            //shadowCubemapField.RegisterValueChangedCallback(evt
            //    => RegisterChange(ref environment.shadow.cubemap, evt.newValue as Cubemap, updatePreview: true));
            //shadowFoldout.Add(shadowCubemapField);

            //shadowColor = new ColorField("Color");
            //shadowColor.RegisterValueChangedCallback(evt
            //    => RegisterChange(ref environment.shadow.color, evt.newValue));
            //shadowFoldout.Add(shadowColor);

            //shadowSunLatitudeField = new FloatSliderField("Sun Latitude", -90f, 90f, 5);
            //shadowSunLatitudeField.RegisterValueChangedCallback(evt
            //    => RegisterChange(ref environment.shadow.m_Latitude, Environment.Shadow.ClampLatitude(evt.newValue), shadowSunLatitudeField));
            //shadowFoldout.Add(shadowSunLatitudeField);

            //shadowSunLongitudeField = new FloatSliderField("Sun Longitude", 0f, 359.999f, 5);
            //shadowSunLongitudeField.RegisterValueChangedCallback(evt
            //    => RegisterChange(ref environment.shadow.m_Longitude, Environment.Shadow.ClampLongitude(evt.newValue), shadowSunLongitudeField));
            //shadowFoldout.Add(shadowSunLongitudeField);

            //Button sunToBrightess = new Button(()
            //    => { /* [TODO] */ })
            //{
            //    text = "Sun position to brightest"
            //};
            //shadowFoldout.Add(sunToBrightess);

            //style = shadowFoldout.Q<Toggle>().style;
            //style.marginLeft = 3;
            //style.unityFontStyleAndWeight = FontStyle.Bold;
            //inspector.Add(shadowFoldout);

            return(inspector);
        }