Przeglądaj źródła

Exposed skybox field on Camera to C# code and editor

BearishSun 9 lat temu
rodzic
commit
cb9b2ae6d4

+ 12 - 0
Source/MBansheeEditor/Inspectors/CameraInspector.cs

@@ -33,6 +33,7 @@ namespace BansheeEditor
         private GUIListBoxField layersField = new GUIListBoxField(Layers.Names, true, new LocEdString("Layers"));
         private GUIToggleField hdrField = new GUIToggleField(new LocEdString("HDR"));
         private GUIToggleField mainField = new GUIToggleField(new LocEdString("Main"));
+        private GUITextureField skyboxField = new GUITextureField(new LocEdString("Skybox"));
 
         private GUIToggle postProcessFoldout = new GUIToggle(new LocEdString("Post processing"), EditorStyles.Foldout);
         private PostProcessSettingsGUI postProcessGUI;
@@ -77,6 +78,7 @@ namespace BansheeEditor
             priorityField.Value = camera.Priority;
             mainField.Value = camera.Main;
             hdrField.Value = camera.HDR;
+            skyboxField.Value = camera.Skybox;
             postProcessGUI.Settings = camera.PostProcess;
 
             if (layersValue != camera.Layers)
@@ -230,6 +232,15 @@ namespace BansheeEditor
                     ConfirmModify();
                 };
 
+                skyboxField.OnChanged += x =>
+                {
+                    Texture skyboxTex = Resources.Load<Texture>(x);
+
+                    camera.Skybox = skyboxTex as TextureCube;
+                    MarkAsModified();
+                    ConfirmModify();
+                };
+
                 Layout.AddElement(projectionTypeField);
                 Layout.AddElement(fieldOfView);
                 Layout.AddElement(orthoHeight);
@@ -256,6 +267,7 @@ namespace BansheeEditor
                 Layout.AddElement(layersField);
                 Layout.AddElement(mainField);
                 Layout.AddElement(hdrField);
+                Layout.AddElement(skyboxField);
 
                 postProcessFoldout.OnToggled += x =>
                 {

+ 18 - 0
Source/MBansheeEngine/Interop/NativeCamera.cs

@@ -131,6 +131,19 @@ namespace BansheeEngine
             set { Internal_SetHDR(mCachedPtr, value); }
         }
 
+        public TextureCube skybox
+        {
+            get { return Internal_GetSkybox(mCachedPtr); }
+            set
+            {
+                IntPtr texturePtr = IntPtr.Zero;
+                if (value != null)
+                    texturePtr = value.GetCachedPtr();
+
+                Internal_SetSkybox(mCachedPtr, texturePtr);
+            }
+        }
+
         internal PostProcessSettings PostProcess
         {
             get { return Internal_GetPostProcessSettings(mCachedPtr); }
@@ -428,6 +441,11 @@ namespace BansheeEngine
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_SetHDR(IntPtr instance, bool value);
 
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        private static extern TextureCube Internal_GetSkybox(IntPtr instance);
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        private static extern void Internal_SetSkybox(IntPtr instance, IntPtr value);
+
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern PostProcessSettings Internal_GetPostProcessSettings(IntPtr instance);
         [MethodImpl(MethodImplOptions.InternalCall)]

+ 11 - 0
Source/MBansheeEngine/Rendering/Camera.cs

@@ -167,6 +167,16 @@ namespace BansheeEngine
             set { native.HDR = value; serializableData.HDR = value; }
         }
 
+        /// <summary>
+        /// Texture that will be used for rendering areas of the camera's render target not covered by any geometry. 
+        /// If not set a clear color will be used instead.
+        /// </summary>
+        public TextureCube Skybox
+        {
+            get { return serializableData.skybox; }
+            set { Native.skybox = value; serializableData.skybox = value; }
+        }
+
         /// <summary>
         /// Allows you to customize various post process operations that will be executed on the image produced by this 
         /// camera.
@@ -467,6 +477,7 @@ namespace BansheeEngine
             public PostProcessSettings postProcessSettings;
             public ulong layers = 0xFFFFFFFFFFFFFFFF;
             public bool main;
+            public TextureCube skybox;
         }
     }
 

+ 3 - 0
Source/SBansheeEngine/Include/BsScriptCamera.h

@@ -90,6 +90,9 @@ namespace bs
 		static bool internal_GetHDR(ScriptCamera* instance);
 		static void internal_SetHDR(ScriptCamera* instance, bool value);
 
+		static MonoObject* internal_GetSkybox(ScriptCamera* instance);
+		static void internal_SetSkybox(ScriptCamera* instance, ScriptTextureCube* value);
+
 		static MonoObject* internal_GetPostProcessSettings(ScriptCamera* instance);
 		static void internal_SetPostProcessSettings(ScriptCamera* instance, MonoObject* value);
 

+ 26 - 0
Source/SBansheeEngine/Source/BsScriptCamera.cpp

@@ -17,6 +17,8 @@
 #include "BsGUIManager.h"
 #include "BsStandardPostProcessSettings.h"
 #include "BsScriptPostProcessSettings.h"
+#include "BsScriptTextureCube.h"
+#include "BsScriptResourceManager.h"
 
 namespace bs
 {
@@ -76,6 +78,9 @@ namespace bs
 		metaData.scriptClass->addInternalCall("Internal_GetHDR", &ScriptCamera::internal_GetHDR);
 		metaData.scriptClass->addInternalCall("Internal_SetHDR", &ScriptCamera::internal_SetHDR);
 
+		metaData.scriptClass->addInternalCall("Internal_GetSkybox", &ScriptCamera::internal_GetSkybox);
+		metaData.scriptClass->addInternalCall("Internal_SetSkybox", &ScriptCamera::internal_SetSkybox);
+
 		metaData.scriptClass->addInternalCall("Internal_GetPostProcessSettings", &ScriptCamera::internal_GetPostProcessSettings);
 		metaData.scriptClass->addInternalCall("Internal_SetPostProcessSettings", &ScriptCamera::internal_SetPostProcessSettings);
 
@@ -301,6 +306,27 @@ namespace bs
 		instance->mCamera->setFlag(CameraFlag::HDR, value);
 	}
 
+	MonoObject* ScriptCamera::internal_GetSkybox(ScriptCamera* instance)
+	{
+		HTexture texture = instance->mCamera->getSkybox();
+		if (texture == nullptr || texture->getProperties().getTextureType() != TEX_TYPE_CUBE_MAP)
+			return nullptr;
+
+		ScriptTextureCube* scriptTexture;
+		ScriptResourceManager::instance().getScriptResource(texture, &scriptTexture, true);
+
+		return scriptTexture->getManagedInstance();
+	}
+
+	void ScriptCamera::internal_SetSkybox(ScriptCamera* instance, ScriptTextureCube* value)
+	{
+		HTexture texture;
+		if (value != nullptr)
+			texture = value->getHandle();
+
+		instance->mCamera->setSkybox(texture);
+	}
+
 	MonoObject* ScriptCamera::internal_GetPostProcessSettings(ScriptCamera* instance)
 	{
 		SPtr<PostProcessSettings> ppSettings = instance->mCamera->getPostProcessSettings();