Browse Source

Objects with no material can now be picked in scene
Managed Renderable objects will now properly render the selection overlay
Better default shader for objects with no material/shader
Reordered/added some buttons on the toolbar
Fixed UndoRedo popCommand so it doesn't corrupt the undo/redo stacks
Fixed solid quad mesh normals
Fixed sphere mesh generation & improved quality of the builtin sphere mesh
Fixed an issue where OpenGL shaders would sometimes not transpose matrices properly

BearishSun 10 years ago
parent
commit
6befb8663f

+ 1 - 1
BansheeCore/Source/BsGpuProgram.cpp

@@ -43,7 +43,7 @@ namespace BansheeEngine
 
 	SPtr<GpuParamsCore> GpuProgramCore::createParameters()
 	{
-		return GpuParamsCore::create(mParametersDesc, false);
+		return GpuParamsCore::create(mParametersDesc, hasColumnMajorMatrices());
 	}
 
 	SPtr<GpuProgramCore> GpuProgramCore::create(const String& source, const String& entryPoint, const String& language, GpuProgramType gptype,

+ 3 - 2
BansheeEditor/Include/BsBuiltinEditorResources.h

@@ -20,8 +20,9 @@ namespace BansheeEngine
 	 */
 	enum class ToolbarIcon
 	{
-		NewCamera, NewRenderable, NewPointLight, NewDirLight, NewSpotLight, NewCube, NewSphere, NewCone, NewQuad,
-		NewMat, NewCSScript, NewShader, NewSpriteTex, Pause, Play, Step, Undo, Redo, OpenProject, SaveProject, SaveScene
+		NewCamera, NewRenderable, NewPointLight, NewDirLight, NewSpotLight, NewSceneObject, NewCube, NewSphere, NewCone, 
+		NewQuad, NewMat, NewCSScript, NewShader, NewSpriteTex, Pause, Play, Step, Undo, Redo, OpenProject, SaveProject, 
+		SaveScene
 	};
 
 	/**

+ 2 - 0
BansheeEditor/Source/BsBuiltinEditorResources.cpp

@@ -1917,6 +1917,8 @@ namespace BansheeEngine
 			return getGUIIcon(L"ToolbarNewDirectionalLightIcon.png");
 		case ToolbarIcon::NewSpotLight:
 			return getGUIIcon(L"ToolbarNewSpotLightIcon.png");
+		case ToolbarIcon::NewSceneObject:
+			return getGUIIcon(L"ToolbarNewSceneObjectIcon.png");
 		case ToolbarIcon::NewCube:
 			return getGUIIcon(L"ToolbarNewCubeIcon.png");
 		case ToolbarIcon::NewSphere:

+ 13 - 13
BansheeEditor/Source/BsScenePicking.cpp

@@ -110,22 +110,22 @@ namespace BansheeEngine
 					{
 						UINT32 idx = (UINT32)pickData.size();
 
-						HMaterial originalMat = renderable->getMaterial(i);
-						if (!originalMat)
-							continue;
+						bool useAlphaShader = false;
+						RasterizerStatePtr rasterizerState;
 
-						PassPtr firstPass;
-						if (originalMat->getNumPasses() == 0)
-							continue;
+						HMaterial originalMat = renderable->getMaterial(i);
+						if (originalMat != nullptr && originalMat->getNumPasses() > 0)
+						{
+							PassPtr firstPass = originalMat->getPass(0); // Note: We only ever check the first pass, problem?
+							useAlphaShader = firstPass->hasBlending();
 
-						firstPass = originalMat->getPass(0); // Note: We only ever check the first pass, problem?
-						bool useAlphaShader = firstPass->hasBlending();
-						
-						RasterizerStatePtr rasterizerState;
-						if (firstPass->getRasterizerState() == nullptr)
-							rasterizerState = RasterizerState::getDefault();
+							if (firstPass->getRasterizerState() == nullptr)
+								rasterizerState = RasterizerState::getDefault();
+							else
+								rasterizerState = firstPass->getRasterizerState();
+						}
 						else
-							rasterizerState = firstPass->getRasterizerState();
+							rasterizerState = RasterizerState::getDefault();
 
 						CullingMode cullMode = rasterizerState->getProperties().getCullMode();
 

+ 16 - 7
BansheeEditor/Source/BsSelectionRenderer.cpp

@@ -12,6 +12,8 @@
 #include "BsSelection.h"
 #include "BsSceneObject.h"
 #include "BsCRenderable.h"
+#include "BsRenderable.h"
+#include "BsSceneManager.h"
 
 using namespace std::placeholders;
 
@@ -47,16 +49,23 @@ namespace BansheeEngine
 		Vector<ObjectData> objects;
 
 		const Vector<HSceneObject>& sceneObjects = Selection::instance().getSceneObjects();
-		for (auto& so : sceneObjects)
+		const Map<Renderable*, SceneRenderableData>& renderables = SceneManager::instance().getAllRenderables();
+
+		for (auto& renderable : renderables)
 		{
-			HRenderable renderable = so->getComponent<CRenderable>();
-			if (renderable != nullptr && renderable->getMesh() != nullptr)
+			for (auto& so : sceneObjects)
 			{
-				objects.push_back(ObjectData());
+				if (renderable.second.sceneObject != so)
+					continue;
+
+				if (renderable.first->getMesh() != nullptr)
+				{
+					objects.push_back(ObjectData());
 
-				ObjectData& newObjData = objects.back();
-				newObjData.worldTfrm = so->getWorldTfrm();
-				newObjData.mesh = renderable->getMesh()->getCore();
+					ObjectData& newObjData = objects.back();
+					newObjData.worldTfrm = so->getWorldTfrm();
+					newObjData.mesh = renderable.first->getMesh()->getCore();
+				}
 			}
 		}
 

+ 4 - 4
BansheeEditor/Source/BsUndoRedo.cpp

@@ -105,7 +105,7 @@ namespace BansheeEngine
 		{
 			if (mUndoStack[undoPtr]->mId == id)
 			{
-				for (UINT32 j = i; j < (mUndoNumElements - 1); j++)
+				for (UINT32 j = mUndoNumElements - i; j < (mUndoNumElements - 1); j++)
 				{
 					UINT32 nextUndoPtr = (undoPtr + 1) % MAX_STACK_ELEMENTS;
 
@@ -118,7 +118,7 @@ namespace BansheeEngine
 				break;
 			}
 
-			undoPtr = (undoPtr + 1) % MAX_STACK_ELEMENTS;
+			undoPtr = (undoPtr - 1) % MAX_STACK_ELEMENTS;
 		}
 
 		UINT32 redoPtr = mRedoStackPtr;
@@ -126,7 +126,7 @@ namespace BansheeEngine
 		{
 			if (mRedoStack[redoPtr]->mId == id)
 			{
-				for (UINT32 j = i; j < (mRedoNumElements - 1); j++)
+				for (UINT32 j = mRedoNumElements - i; j < (mRedoNumElements - 1); j++)
 				{
 					UINT32 nextRedoPtr = (redoPtr + 1) % MAX_STACK_ELEMENTS;
 
@@ -139,7 +139,7 @@ namespace BansheeEngine
 				break;
 			}
 
-			redoPtr = (redoPtr + 1) % MAX_STACK_ELEMENTS;
+			redoPtr = (redoPtr - 1) % MAX_STACK_ELEMENTS;
 		}
 	}
 

+ 2 - 2
BansheeEngine/Source/BsBuiltinResources.cpp

@@ -730,10 +730,10 @@ namespace BansheeEngine
 
 		UINT32 sphereNumVertices = 0;
 		UINT32 sphereNumIndices = 0;
-		ShapeMeshes3D::getNumElementsSphere(1, sphereNumVertices, sphereNumIndices);
+		ShapeMeshes3D::getNumElementsSphere(3, sphereNumVertices, sphereNumIndices);
 		MeshDataPtr sphereMeshData = bs_shared_ptr_new<MeshData>(sphereNumVertices, sphereNumIndices, vertexDesc);
 
-		ShapeMeshes3D::solidSphere(Sphere(Vector3::ZERO, 0.0f), sphereMeshData, 0, 0);
+		ShapeMeshes3D::solidSphere(Sphere(Vector3::ZERO, 1.0f), sphereMeshData, 0, 0, 3);
 		HMesh sphereMesh = Mesh::create(sphereMeshData);
 
 		UINT32 coneNumVertices = 0;

+ 8 - 8
BansheeEngine/Source/BsShapeMeshes3D.cpp

@@ -268,7 +268,7 @@ namespace BansheeEngine
 
 	void ShapeMeshes3D::getNumElementsSphere(UINT32 quality, UINT32& numVertices, UINT32& numIndices)
 	{
-		numVertices = 20 * (4 * ((UINT32)std::pow(3, quality)));
+		numVertices = 20 * (3 * ((UINT32)std::pow(4, quality)));
 		numIndices = numVertices;
 	}
 
@@ -494,7 +494,7 @@ namespace BansheeEngine
 		// Create indices
 		outIndices += indexOffset;
 
-		UINT32 numIndices = 20 * (3 * ((UINT32)std::pow(4L, (long)quality)));
+		UINT32 numIndices = 20 * (3 * (UINT32)std::pow(4, quality));
 		for (UINT32 i = 0; i < numIndices; i += 3)
 		{
 			outIndices[i] = vertexOffset + i + 2;
@@ -766,13 +766,13 @@ namespace BansheeEngine
 		outIndices[4] = vertexOffset + 2;
 		outIndices[5] = vertexOffset + 3;
 
-		outIndices[6] = vertexOffset;
-		outIndices[7] = vertexOffset + 2;
-		outIndices[8] = vertexOffset + 1;
+		outIndices[6] = vertexOffset + 4;
+		outIndices[7] = vertexOffset + 6;
+		outIndices[8] = vertexOffset + 5;
 
-		outIndices[9] = vertexOffset;
-		outIndices[10] = vertexOffset + 3;
-		outIndices[11] = vertexOffset + 2;
+		outIndices[9] = vertexOffset + 4;
+		outIndices[10] = vertexOffset + 7;
+		outIndices[11] = vertexOffset + 6;
 	}
 
 	Vector3 ShapeMeshes3D::calcCenter(UINT8* vertices, UINT32 numVertices, UINT32 vertexStride)

+ 3 - 2
MBansheeEditor/EditorBuiltin.cs

@@ -8,8 +8,9 @@ namespace BansheeEditor
     /// </summary>
     public enum ToolbarIcon // Note: Must match C++ enum ToolbarIcon
 	{
-		NewCamera, NewRenderable, NewPointLight, NewDirLight, NewSpotLight, NewCube, NewSphere, NewCone, NewQuad,
-		NewMat, NewCSScript, NewShader, NewSpriteTex, Pause, Play, Step, Undo, Redo, OpenProject, SaveProject, SaveScene
+        NewCamera, NewRenderable, NewPointLight, NewDirLight, NewSpotLight, NewSceneObject, NewCube, NewSphere, NewCone, 
+        NewQuad, NewMat, NewCSScript, NewShader, NewSpriteTex, Pause, Play, Step, Undo, Redo, OpenProject, SaveProject, 
+        SaveScene
 	};
 
     /// <summary>

+ 2 - 2
MBansheeEditor/Library/LibraryMenu.cs

@@ -60,7 +60,7 @@ namespace BansheeEditor
         /// Creates a new material with the default shader in the currently selected project library folder.
         /// </summary>
         [MenuItem("Resources/Create/Material", 9050, false, "IsLibraryWindowActive")]
-        [ToolbarItem("Material", ToolbarIcon.NewMat, "", 1499)]
+        [ToolbarItem("Material", ToolbarIcon.NewMat, "", 1498)]
         internal static void CreateEmptyMaterial()
         {
             LibraryWindow win = EditorWindow.GetWindow<LibraryWindow>();
@@ -74,7 +74,7 @@ namespace BansheeEditor
         /// Creates a new shader containing a rough code outline in the currently selected project library folder.
         /// </summary>
         [MenuItem("Resources/Create/Shader", 9049, false, "IsLibraryWindowActive")]
-        [ToolbarItem("Shader", ToolbarIcon.NewShader, "", 1498)]
+        [ToolbarItem("Shader", ToolbarIcon.NewShader, "", 1499)]
         internal static void CreateEmptyShader()
         {
             LibraryWindow win = EditorWindow.GetWindow<LibraryWindow>();

+ 14 - 1
MBansheeEditor/MenuItems.cs

@@ -90,11 +90,24 @@ namespace BansheeEditor
             EditorApplication.SetSceneDirty();
         }
 
+        /// <summary>
+        /// Creates a new empty scene object.
+        /// </summary>
+        [MenuItem("Scene Objects/Scene Object", 8051)]
+        [ToolbarItem("SceneObject", ToolbarIcon.NewSceneObject, "", 1601, true)]
+        private static void AddEmptySO()
+        {
+            SceneObject so = UndoRedo.CreateSO("SceneObject", "Created an empty SceneObject");
+
+            Selection.SceneObject = so;
+            EditorApplication.SetSceneDirty();
+        }
+
         /// <summary>
         /// Creates a new scene object with a camera component.
         /// </summary>
         [MenuItem("Scene Objects/Camera", 8050)]
-        [ToolbarItem("Camera", ToolbarIcon.NewCamera, "", 1600, true)]
+        [ToolbarItem("Camera", ToolbarIcon.NewCamera, "", 1600, false)]
         private static void AddCameraSO()
         {
             SceneObject so = UndoRedo.CreateSO("Camera", "Created a Camera");

+ 0 - 2
MBansheeEditor/Scene/SceneWindow.cs

@@ -341,11 +341,9 @@ namespace BansheeEditor
 
                             draggedSO = new SceneObject(meshName);
                             Mesh mesh = ProjectLibrary.Load<Mesh>(draggedMeshPath);
-                            Material material = new Material(Builtin.DiffuseShader);
 
                             Renderable renderable = draggedSO.AddComponent<Renderable>();
                             renderable.Mesh = mesh;
-                            renderable.SetMaterial(material);
 
                             EditorApplication.SetSceneDirty();
                         }

+ 47 - 9
RenderBeast/Source/BsRenderBeast.cpp

@@ -944,16 +944,29 @@ namespace BansheeEngine
 				}
 
 				void vs_main(
-				in float3 inPos : POSITION,
-				out float4 oPosition : SV_Position)
+					in float3 inPos : POSITION,
+					in float3 inNormal : NORMAL,
+					out float4 oPosition : SV_Position,
+					out float3 oNormal : NORMAL)
 				{
 					oPosition = mul(matWorldViewProj, float4(inPos.xyz, 1));
+					oNormal = inNormal;
 				})";
 
 			String psCode = R"(
-				float4 ps_main() : SV_Target
+				cbuffer PerCamera
 				{
-					return float4(0.3f, 0.9f, 0.3f, 1.0f);
+					float4 viewDir;
+				}
+
+				float4 ps_main(
+					in float4 inPos : SV_Position,
+					in float3 normal : NORMAL) : SV_Target
+				{
+					float4 outColor = float4(0.3f, 0.3f, 0.3f, 1.0f) * clamp(dot(normalize(normal), -viewDir.xyz), 0.5f, 1.0);
+					outColor.a = 1.0f;
+				
+					return outColor;
 				})";
 
 			vsProgram = GpuProgramCore::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
@@ -966,16 +979,27 @@ namespace BansheeEngine
 				 float4x4 matWorldViewProj;
 
 				 void vs_main(
-				 in float3 inPos : POSITION,
-				 out float4 oPosition : POSITION)
+					in float3 inPos : POSITION,
+					in float3 inNormal : NORMAL,
+					out float4 oPosition : POSITION,
+					out float3 oNormal : TEXCOORD0)
 				 {
 					 oPosition = mul(matWorldViewProj, float4(inPos.xyz, 1));
+					 oNormal = inNormal;
 				 })";
 
 			String psCode = R"(
-				float4 ps_main() : COLOR0
+				 BS_PARAM_BLOCK PerCamera { viewDir }
+				 float4 viewDir;
+
+				float4 ps_main(
+					in float3 inPos : POSITION,
+					in float3 inNormal : TEXCOORD0) : COLOR0
 				{
-					return float4(0.3f, 0.9f, 0.3f, 1.0f);
+					float4 outColor = float4(0.3f, 0.3f, 0.3f, 1.0f) * clamp(dot(normalize(inNormal), -viewDir.xyz), 0.5f, 1.0);
+					outColor.a = 1.0f;
+				
+					return outColor;
 				})";
 
 			vsProgram = GpuProgramCore::create(vsCode, "vs_main", "hlsl9", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
@@ -990,6 +1014,8 @@ namespace BansheeEngine
 				};
 
 				in vec3 bs_position;
+				in vec3 bs_normal;
+				out vec3 normal;
 
 				out gl_PerVertex
 				{
@@ -999,14 +1025,24 @@ namespace BansheeEngine
 				void main()
 				{
 					gl_Position = matWorldViewProj * vec4(bs_position.xyz, 1);
+					normal = bs_normal;
 				})";
 
 			String psCode = R"(
+				uniform PerCamera
+				{
+					vec4 viewDir;
+				};
+
+				in vec3 normal;
 				out vec4 fragColor;
 
 				void main()
 				{
-					fragColor = vec4(0.3f, 0.9f, 0.3f, 1.0f);
+					vec4 outColor = vec4(0.3f, 0.3f, 0.3f, 1.0f) * clamp(dot(normalize(normal), -viewDir.xyz), 0.5f, 1.0);
+					outColor.a = 1.0f;
+				
+					fragColor = outColor;
 				})";
 
 			vsProgram = GpuProgramCore::create(vsCode, "main", "glsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
@@ -1022,7 +1058,9 @@ namespace BansheeEngine
 
 		SHADER_DESC_CORE shaderDesc;
 		shaderDesc.setParamBlockAttribs("PerObject", true, GPBU_DYNAMIC, RBS_PerObject);
+		shaderDesc.setParamBlockAttribs("PerCamera", true, GPBU_DYNAMIC, RBS_PerCamera);
 		shaderDesc.addParameter("matWorldViewProj", "matWorldViewProj", GPDT_MATRIX_4X4, RPS_WorldViewProjTfrm);
+		shaderDesc.addParameter("viewDir", "viewDir", GPDT_FLOAT4, RPS_ViewDir);
 
 		SPtr<ShaderCore> defaultShader = ShaderCore::create("DummyShader", shaderDesc, { newTechnique });