Explorar o código

Added gizmos and menu items for Skybox and ReflectionProbe components

BearishSun %!s(int64=8) %!d(string=hai) anos
pai
achega
d7216ba1db

+ 13 - 3
Source/BansheeEditor/Include/BsGizmoManager.h

@@ -98,6 +98,15 @@ namespace bs
 		void drawCone(const Vector3& base, const Vector3& normal, float height, float radius, 
 			const Vector2& scale = Vector2::ONE);
 
+		/**
+		 * Draws a solid disc.
+		 *
+		 * @param[in]	position	Center of the disc.
+		 * @param[in]	normal		Orientation of the disc, pointing in the direction the disc is visible in.
+		 * @param[in]	radius		Radius of the disc.
+		 */
+		void drawDisc(const Vector3& position, const Vector3& normal, float radius);
+
 		/**
 		 * Draws a wireframe axis aligned cuboid.
 		 *
@@ -311,8 +320,8 @@ namespace bs
 			Vector<Vector3> linePoints;
 		};
 
-		/**	Data required for rendering a wireframe disc gizmo. */
-		struct WireDiscData : CommonData
+		/**	Data required for rendering a disc gizmo. */
+		struct DiscData : CommonData
 		{
 			Vector3 position;
 			Vector3 normal;
@@ -463,7 +472,8 @@ namespace bs
 		Vector<ConeData> mWireConeData;
 		Vector<LineData> mLineData;
 		Vector<LineListData> mLineListData;
-		Vector<WireDiscData> mWireDiscData;
+		Vector<DiscData> mSolidDiscData;
+		Vector<DiscData> mWireDiscData;
 		Vector<WireArcData> mWireArcData;
 		Vector<WireMeshData> mWireMeshData;
 		Vector<FrustumData> mFrustumData;

+ 37 - 7
Source/BansheeEditor/Source/BsGizmoManager.cpp

@@ -174,6 +174,24 @@ namespace bs
 		mIdxToSceneObjectMap[coneData.idx] = mActiveSO;
 	}
 
+	void GizmoManager::drawDisc(const Vector3& position, const Vector3& normal, float radius)
+	{
+		mSolidDiscData.push_back(DiscData());
+		DiscData& discData = mSolidDiscData.back();
+
+		discData.idx = mCurrentIdx++;
+		discData.position = position;
+		discData.normal = normal;
+		discData.radius = radius;
+		discData.color = mColor;
+		discData.transform = mTransform;
+		discData.sceneObject = mActiveSO;
+		discData.pickable = mPickable;
+
+		mDrawHelper->disc(position, normal, radius);
+		mIdxToSceneObjectMap[discData.idx] = mActiveSO;
+	}
+
 	void GizmoManager::drawWireCube(const Vector3& position, const Vector3& extents)
 	{
 		mWireCubeData.push_back(CubeData());
@@ -297,8 +315,8 @@ namespace bs
 
 	void GizmoManager::drawWireDisc(const Vector3& position, const Vector3& normal, float radius)
 	{
-		mWireDiscData.push_back(WireDiscData());
-		WireDiscData& wireDiscData = mWireDiscData.back();
+		mWireDiscData.push_back(DiscData());
+		DiscData& wireDiscData = mWireDiscData.back();
 
 		wireDiscData.idx = mCurrentIdx++;
 		wireDiscData.position = position;
@@ -556,15 +574,26 @@ namespace bs
 			mPickingDrawHelper->lineList(lineListDataEntry.linePoints);
 		}
 
-		for (auto& wireDiscDataEntry : mWireDiscData)
+		for (auto& discDataEntry : mSolidDiscData)
+		{
+			if (!discDataEntry.pickable)
+				continue;
+
+			mPickingDrawHelper->setColor(idxToColorCallback(discDataEntry.idx));
+			mPickingDrawHelper->setTransform(discDataEntry.transform);
+
+			mPickingDrawHelper->disc(discDataEntry.position, discDataEntry.normal, discDataEntry.radius);
+		}
+
+		for (auto& discDataEntry : mWireDiscData)
 		{
-			if (!wireDiscDataEntry.pickable)
+			if (!discDataEntry.pickable)
 				continue;
 
-			mPickingDrawHelper->setColor(idxToColorCallback(wireDiscDataEntry.idx));
-			mPickingDrawHelper->setTransform(wireDiscDataEntry.transform);
+			mPickingDrawHelper->setColor(idxToColorCallback(discDataEntry.idx));
+			mPickingDrawHelper->setTransform(discDataEntry.transform);
 
-			mPickingDrawHelper->wireDisc(wireDiscDataEntry.position, wireDiscDataEntry.normal, wireDiscDataEntry.radius);
+			mPickingDrawHelper->wireDisc(discDataEntry.position, discDataEntry.normal, discDataEntry.radius);
 		}
 
 		for (auto& wireArcDataEntry : mWireArcData)
@@ -653,6 +682,7 @@ namespace bs
 		mWireConeData.clear();
 		mLineData.clear();
 		mLineListData.clear();
+		mSolidDiscData.clear();
 		mWireDiscData.clear();
 		mWireArcData.clear();
 		mWireMeshData.clear();

+ 1 - 0
Source/MBansheeEditor/MBansheeEditor.csproj

@@ -100,6 +100,7 @@
     <Compile Include="Windows\Inspector\InspectableRangedInt.cs" />
     <Compile Include="Windows\Inspector\Style\InspectableFieldStyleInfo.cs" />
     <Compile Include="Windows\LogWindow.cs" />
+    <Compile Include="Windows\Scene\Gizmos\ReflectionProbeGizmo.cs" />
     <Compile Include="Window\DefaultSize.cs" />
     <Compile Include="Windows\DialogBox.cs" />
     <Compile Include="Utility\DragDrop.cs" />

+ 58 - 0
Source/MBansheeEditor/Window/MenuItems.cs

@@ -441,6 +441,36 @@ namespace BansheeEditor
             EditorApplication.SetSceneDirty();
         }
 
+        /// <summary>
+        /// Adds a Skybox component to the currently selected scene object.
+        /// </summary>
+        [MenuItem("Components/Skybox", 7027)]
+        private static void AddSkybox()
+        {
+            SceneObject so = Selection.SceneObject;
+            if (so == null)
+                return;
+
+            UndoRedo.RecordSO(so, false, "Added an Skybox component");
+            so.AddComponent<Skybox>();
+            EditorApplication.SetSceneDirty();
+        }
+
+        /// <summary>
+        /// Adds a ReflectionProbe component to the currently selected scene object.
+        /// </summary>
+        [MenuItem("Components/Reflection probe", 7026)]
+        private static void AddReflectionProbe()
+        {
+            SceneObject so = Selection.SceneObject;
+            if (so == null)
+                return;
+
+            UndoRedo.RecordSO(so, false, "Added an ReflectionProbe component");
+            so.AddComponent<ReflectionProbe>();
+            EditorApplication.SetSceneDirty();
+        }
+
         /// <summary>
         /// Creates a new empty scene object.
         /// </summary>
@@ -548,6 +578,34 @@ namespace BansheeEditor
             EditorApplication.SetSceneDirty();
         }
 
+        /// <summary>
+        /// Creates a new scene object with a Skybox component.
+        /// </summary>
+        [MenuItem("Scene Objects/Skybox", 8044)]
+        private static void AddSkyboxSO()
+        {
+            SceneObject so = UndoRedo.CreateSO("Skybox", "Created a Skybox");
+            so.AddComponent<Skybox>();
+
+            Selection.SceneObject = so;
+            FocusOnHierarchyOrScene();
+            EditorApplication.SetSceneDirty();
+        }
+
+        /// <summary>
+        /// Creates a new scene object with a ReflectionProbe component.
+        /// </summary>
+        [MenuItem("Scene Objects/Reflection probe", 8044)]
+        private static void AddReflectionProbeSO()
+        {
+            SceneObject so = UndoRedo.CreateSO("ReflectionProbe", "Created a ReflectionProbe");
+            so.AddComponent<ReflectionProbe>();
+
+            Selection.SceneObject = so;
+            FocusOnHierarchyOrScene();
+            EditorApplication.SetSceneDirty();
+        }
+
         /// <summary>
         /// Creates a new scene object with a box primitive.
         /// </summary>

+ 14 - 0
Source/MBansheeEditor/Windows/Scene/Gizmos/Gizmos.cs

@@ -98,6 +98,17 @@ namespace BansheeEditor
             Internal_DrawCone(ref coneBase, ref normal, height, radius, ref scale);
         }
 
+        /// <summary>
+        /// Draws a solid disc.
+        /// </summary>
+        /// <param name="position">Center of the disc.</param>
+        /// <param name="normal">Normal towards which to orient the disc.</param>
+        /// <param name="radius">Radius of the disc.</param>
+        public static void DrawDisc(Vector3 position, Vector3 normal, float radius)
+        {
+            Internal_DrawDisc(ref position, ref normal, radius);
+        }
+
         /// <summary>
         /// Draws an axis aligned wireframe cube.
         /// </summary>
@@ -273,6 +284,9 @@ namespace BansheeEditor
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_DrawCone(ref Vector3 coneBase, ref Vector3 normal, float height, float radius, ref Vector2 scale);
 
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        private static extern void Internal_DrawDisc(ref Vector3 position, ref Vector3 normal, float radius);
+
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_DrawWireCube(ref Vector3 position, ref Vector3 extents);
 

+ 13 - 1
Source/MBansheeEditor/Windows/Scene/Gizmos/LightGizmos.cs

@@ -50,6 +50,12 @@ namespace BansheeEditor
                 case LightType.Radial:
                     Gizmos.DrawWireSphere(position, light.AttenuationRadius);
 
+                    if (light.SourceRadius > 0.0f)
+                    {
+                        Gizmos.Color = light.Color;
+                        Gizmos.DrawSphere(position, light.SourceRadius);
+                    }
+
                     break;
                 case LightType.Spot:
                 {
@@ -57,7 +63,7 @@ namespace BansheeEditor
                     Vector3 up = light.SceneObject.Rotation.Rotate(Vector3.YAxis);
                     Vector3 forward = light.SceneObject.Forward;
 
-                    float discRadius = light.AttenuationRadius * MathEx.Tan(light.SpotAngle*0.5f);
+                    float discRadius = light.AttenuationRadius * MathEx.Tan(light.SpotAngle * 0.5f);
 
                     Gizmos.DrawLine(position, position + forward * light.AttenuationRadius + up * discRadius);
                     Gizmos.DrawLine(position, position + forward * light.AttenuationRadius - up * discRadius);
@@ -68,6 +74,12 @@ namespace BansheeEditor
 
                     Gizmos.DrawWireDisc(position + forward * light.AttenuationRadius, forward, discRadius);
                     Gizmos.DrawWireDisc(position + forward * light.AttenuationRadius, forward, falloffDiscRadius);
+
+                    if (light.SourceRadius > 0.0f)
+                    {
+                        Gizmos.Color = light.Color;
+                        Gizmos.DrawDisc(position, forward, light.SourceRadius);
+                    }
                 }
                     break;
             }

+ 44 - 0
Source/MBansheeEditor/Windows/Scene/Gizmos/ReflectionProbeGizmo.cs

@@ -0,0 +1,44 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+using BansheeEngine;
+
+namespace BansheeEditor
+{
+    /** @addtogroup Gizmos
+     *  @{
+     */
+
+    /// <summary>
+    /// Handles drawing of gizmos for the <see cref="ReflectionProbe"/> component.
+    /// </summary>
+    internal class ReflectionProbeGizmos
+    {
+        /// <summary>
+        /// Method called by the runtime when gizmos are meant to be drawn.
+        /// </summary>
+        /// <param name="reflProbe">Reflection probe to draw gizmos for.</param>
+        [DrawGizmo(DrawGizmoFlags.Selected)]
+        private static void Draw(ReflectionProbe reflProbe)
+        {
+            Vector3 position = reflProbe.SceneObject.Position;
+
+            Gizmos.Color = Color.Yellow;
+            switch (reflProbe.Type)
+            {
+                case ReflectionProbeType.Box:
+                    SceneObject so = reflProbe.SceneObject;
+
+                    Gizmos.Transform = Matrix4.TRS(so.Position, so.Rotation, Vector3.One);
+
+                    Vector3 scaledExtents = reflProbe.Extents * so.Scale;
+                    Gizmos.DrawWireCube(Vector3.Zero, scaledExtents);
+                    break;
+                case ReflectionProbeType.Sphere:
+                    Gizmos.DrawWireSphere(position, reflProbe.Radius);
+                    break;
+            }
+        }
+    }
+
+    /** @} */
+}

+ 1 - 0
Source/SBansheeEditor/Include/BsScriptGizmos.h

@@ -31,6 +31,7 @@ namespace bs
 		static void internal_DrawCube(Vector3* position, Vector3* extents);
 		static void internal_DrawSphere(Vector3* position, float radius);
 		static void internal_DrawCone(Vector3* base, Vector3* normal, float height, float radius, Vector2* scale);
+		static void internal_DrawDisc(Vector3* position, Vector3* normal, float radius);
 		static void internal_DrawWireCube(Vector3* position, Vector3* extents);
 		static void internal_DrawWireSphere(Vector3* position, float radius);
 		static void internal_DrawWireCapsule(Vector3* position, float height, float radius);

+ 6 - 0
Source/SBansheeEditor/Source/BsScriptGizmos.cpp

@@ -20,6 +20,7 @@ namespace bs
 		metaData.scriptClass->addInternalCall("Internal_DrawCube", &ScriptGizmos::internal_DrawCube);
 		metaData.scriptClass->addInternalCall("Internal_DrawSphere", &ScriptGizmos::internal_DrawSphere);
 		metaData.scriptClass->addInternalCall("Internal_DrawCone", &ScriptGizmos::internal_DrawCone);
+		metaData.scriptClass->addInternalCall("Internal_DrawDisc", &ScriptGizmos::internal_DrawDisc);
 		metaData.scriptClass->addInternalCall("Internal_DrawWireCube", &ScriptGizmos::internal_DrawWireCube);
 		metaData.scriptClass->addInternalCall("Internal_DrawWireSphere", &ScriptGizmos::internal_DrawWireSphere);
 		metaData.scriptClass->addInternalCall("Internal_DrawWireCapsule", &ScriptGizmos::internal_DrawWireCapsule);
@@ -69,6 +70,11 @@ namespace bs
 		GizmoManager::instance().drawCone(*base, *normal, height, radius, *scale);
 	}
 
+	void ScriptGizmos::internal_DrawDisc(Vector3* position, Vector3* normal, float radius)
+	{
+		GizmoManager::instance().drawDisc(*position, *normal, radius);
+	}
+
 	void ScriptGizmos::internal_DrawWireCube(Vector3* position, Vector3* extents)
 	{
 		GizmoManager::instance().drawWireCube(*position, *extents);