Просмотр исходного кода

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 лет назад
Родитель
Сommit
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 });