Переглянути джерело

GUI now properly handles depth ordering between line and triangle meshes

BearishSun 9 роки тому
батько
коміт
3b535198cc

+ 3 - 5
Source/BansheeEngine/Include/BsGUIManager.h

@@ -32,11 +32,9 @@ namespace BansheeEngine
 	 * @par
 	 * This ensures that GUIElements don't recursively modify GUIManager while GUIManager is still using that data.
 	 * @par
-	 * for example setFocus() usually gets called from within GUIElements, however we don't want elements in focus be 
+	 * For example setFocus() usually gets called from within GUIElements, however we don't want elements in focus be 
 	 * modified immediately since that setFocus() call could have originated in sendCommandEvent and elements in focus array
 	 * would be modified while still being iterated upon.
-	 * @note
-	 * Internal class. Unless modifying internal engine systems you should have no need to access this class.
 	 */
 	class BS_EXPORT GUIManager : public Module<GUIManager>
 	{
@@ -55,6 +53,7 @@ namespace BansheeEngine
 			SpriteMaterial* material;
 			SpriteMaterialInfo matInfo;
 			GUIWidget* widget;
+			bool isLine;
 		};
 
 		/**	GUI render data for a single viewport. */
@@ -64,8 +63,7 @@ namespace BansheeEngine
 				:isDirty(true)
 			{ }
 
-			Vector<GUIMeshData> cachedTriangleMeshes;
-			Vector<GUIMeshData> cachedLineMeshes;
+			Vector<GUIMeshData> cachedMeshes;
 			Vector<GUIWidget*> widgets;
 			bool isDirty;
 		};

+ 45 - 82
Source/BansheeEngine/Source/BsGUIManager.cpp

@@ -221,15 +221,14 @@ namespace BansheeEngine
 
 		if(renderData.widgets.size() == 0)
 		{
-			for (auto& entry : renderData.cachedTriangleMeshes)
+			for (auto& entry : renderData.cachedMeshes)
 			{
-				if (entry.mesh != nullptr)
-					mTriangleMeshHeap->dealloc(entry.mesh);
-			}
+				if (entry.mesh == nullptr)
+					continue;
 
-			for (auto& entry : renderData.cachedLineMeshes)
-			{
-				if (entry.mesh != nullptr)
+				if(!entry.isLine)
+					mTriangleMeshHeap->dealloc(entry.mesh);
+				else
 					mLineMeshHeap->dealloc(entry.mesh);
 			}
 
@@ -397,38 +396,26 @@ namespace BansheeEngine
 				auto insertedData = corePerCameraData.insert(std::make_pair(camera->getCore(), Vector<GUICoreRenderData>()));
 				Vector<GUICoreRenderData>& cameraData = insertedData.first->second;
 
-				const Vector<GUIMeshData>* cachedMeshSets[2] = { &renderData.cachedTriangleMeshes, &renderData.cachedLineMeshes };
-
-				UINT32 meshIdx = 0;
-				for (auto& meshSet : cachedMeshSets)
+				for (auto& entry : renderData.cachedMeshes)
 				{
-					const Vector<GUIMeshData>& cachedMeshes = *meshSet;
-					for (auto& entry : cachedMeshes)
-					{
-						if (entry.mesh == nullptr)
-						{
-							meshIdx++;
-							continue;
-						}
-
-						cameraData.push_back(GUICoreRenderData());
-						GUICoreRenderData& newEntry = cameraData.back();
-
-						SPtr<TextureCore> textureCore;
-						if (entry.matInfo.texture.isLoaded())
-							textureCore = entry.matInfo.texture->getCore();
-						else
-							textureCore = nullptr;
+					if (entry.mesh == nullptr)
+						continue;
 
-						newEntry.material = entry.material;
-						newEntry.texture = textureCore;
-						newEntry.tint = entry.matInfo.tint;
-						newEntry.mesh = entry.mesh->getCore();
-						newEntry.worldTransform = entry.widget->getWorldTfrm();
-						newEntry.additionalData = entry.matInfo.additionalData;
+					cameraData.push_back(GUICoreRenderData());
+					GUICoreRenderData& newEntry = cameraData.back();
 
-						meshIdx++;
-					}
+					SPtr<TextureCore> textureCore;
+					if (entry.matInfo.texture.isLoaded())
+						textureCore = entry.matInfo.texture->getCore();
+					else
+						textureCore = nullptr;
+
+					newEntry.material = entry.material;
+					newEntry.texture = textureCore;
+					newEntry.tint = entry.matInfo.tint;
+					newEntry.mesh = entry.mesh->getCore();
+					newEntry.worldTransform = entry.widget->getWorldTfrm();
+					newEntry.additionalData = entry.matInfo.additionalData;
 				}
 			}
 
@@ -618,37 +605,30 @@ namespace BansheeEngine
 					// requires all elements to be unique
 				};
 
-				UINT32 numTriangleMeshes = 0;
-				UINT32 numLineMeshes = 0;
+				UINT32 numMeshes = 0;
 				FrameSet<GUIMaterialGroup*, std::function<bool(GUIMaterialGroup*, GUIMaterialGroup*)>> sortedGroups(groupComp);
 				for(auto& material : materialGroups)
 				{
 					for(auto& group : material.second)
 					{
 						sortedGroups.insert(&group);
-
-						if (group.meshType == GUIMeshType::Triangle)
-							numTriangleMeshes++;
-						else // Line
-							numLineMeshes++;
+						numMeshes++;
 					}
 				}
 
-				UINT32 oldNumTriangleMeshes = (UINT32)renderData.cachedTriangleMeshes.size();
-				for (UINT32 i = numTriangleMeshes; i < oldNumTriangleMeshes; i++)
-					mTriangleMeshHeap->dealloc(renderData.cachedTriangleMeshes[i].mesh);
-
-				renderData.cachedTriangleMeshes.resize(numTriangleMeshes);
-
-				UINT32 oldNumLineMeshes = (UINT32)renderData.cachedLineMeshes.size();
-				for (UINT32 i = numLineMeshes; i < oldNumLineMeshes; i++)
-					mLineMeshHeap->dealloc(renderData.cachedLineMeshes[i].mesh);
-
-				renderData.cachedLineMeshes.resize(numLineMeshes);
+				UINT32 oldNumMeshes = (UINT32)renderData.cachedMeshes.size();
+				for (UINT32 i = 0; i < oldNumMeshes; i++)
+				{
+					if(!renderData.cachedMeshes[i].isLine)
+						mTriangleMeshHeap->dealloc(renderData.cachedMeshes[i].mesh);
+					else
+						mLineMeshHeap->dealloc(renderData.cachedMeshes[i].mesh);
+				}
 
+				renderData.cachedMeshes.resize(numMeshes);
+				
 				// Fill buffers for each group and update their meshes
-				UINT32 triangleMeshIdx = 0;
-				UINT32 lineMeshIdx = 0;
+				UINT32 meshIdx = 0;
 				for(auto& group : sortedGroups)
 				{
 					SPtr<MeshData> meshData;
@@ -662,23 +642,20 @@ namespace BansheeEngine
 						widget = elem->_getParentWidget();
 					}
 
+					GUIMeshData& guiMeshData = renderData.cachedMeshes[meshIdx];
+					guiMeshData.matInfo = group->matInfo;
+					guiMeshData.material = group->material;
+					guiMeshData.widget = widget;
+
 					if (group->meshType == GUIMeshType::Triangle)
 					{
 						meshData = bs_shared_ptr_new<MeshData>(group->numVertices, group->numIndices, mTriangleVertexDesc);
-
-						GUIMeshData& guiMeshData = renderData.cachedTriangleMeshes[triangleMeshIdx];
-						guiMeshData.matInfo = group->matInfo;
-						guiMeshData.material = group->material;
-						guiMeshData.widget = widget;
+						guiMeshData.isLine = false;
 					}
 					else // Line
 					{
 						meshData = bs_shared_ptr_new<MeshData>(group->numVertices, group->numIndices, mLineVertexDesc);
-
-						GUIMeshData& guiMeshData = renderData.cachedLineMeshes[lineMeshIdx];
-						guiMeshData.matInfo = group->matInfo;
-						guiMeshData.material = group->material;
-						guiMeshData.widget = widget;
+						guiMeshData.isLine = true;
 					}
 
 					UINT8* vertices = meshData->getElementData(VES_POSITION);
@@ -707,25 +684,11 @@ namespace BansheeEngine
 					}
 
 					if (group->meshType == GUIMeshType::Triangle)
-					{
-						GUIMeshData& guiMeshData = renderData.cachedTriangleMeshes[triangleMeshIdx];
-
-						if(guiMeshData.mesh != nullptr)
-							mTriangleMeshHeap->dealloc(guiMeshData.mesh);
-
 						guiMeshData.mesh = mTriangleMeshHeap->alloc(meshData);
-						triangleMeshIdx++;
-					}
 					else // Line
-					{
-						GUIMeshData& guiMeshData = renderData.cachedLineMeshes[lineMeshIdx];
-
-						if (guiMeshData.mesh != nullptr)
-							mLineMeshHeap->dealloc(guiMeshData.mesh);
-
 						guiMeshData.mesh = mLineMeshHeap->alloc(meshData, DOT_LINE_LIST);
-						lineMeshIdx++;
-					}
+
+					meshIdx++;
 				}
 			}