Răsfoiți Sursa

Various frontend improvements to animation editor

BearishSun 9 ani în urmă
părinte
comite
58a9f821fe
86 a modificat fișierele cu 242 adăugiri și 70 ștergeri
  1. BIN
      Data/Editor/GUISkin.asset
  2. BIN
      Data/Editor/Icons/Sprites/sprite_AnimationClipIcon.psd16.asset
  3. BIN
      Data/Editor/Icons/Sprites/sprite_AnimationClipIcon.psd32.asset
  4. BIN
      Data/Editor/Icons/Sprites/sprite_AnimationClipIcon.psd48.asset
  5. BIN
      Data/Editor/Icons/Sprites/sprite_AudioClipIcon.psd16.asset
  6. BIN
      Data/Editor/Icons/Sprites/sprite_AudioClipIcon.psd32.asset
  7. BIN
      Data/Editor/Icons/Sprites/sprite_AudioClipIcon.psd48.asset
  8. BIN
      Data/Editor/Icons/Sprites/sprite_CSharpIcon.psd16.asset
  9. BIN
      Data/Editor/Icons/Sprites/sprite_CSharpIcon.psd32.asset
  10. BIN
      Data/Editor/Icons/Sprites/sprite_CSharpIcon.psd48.asset
  11. BIN
      Data/Editor/Icons/Sprites/sprite_FolderIcon.psd16.asset
  12. BIN
      Data/Editor/Icons/Sprites/sprite_FolderIcon.psd32.asset
  13. BIN
      Data/Editor/Icons/Sprites/sprite_FolderIcon.psd48.asset
  14. BIN
      Data/Editor/Icons/Sprites/sprite_FontIcon.psd16.asset
  15. BIN
      Data/Editor/Icons/Sprites/sprite_FontIcon.psd32.asset
  16. BIN
      Data/Editor/Icons/Sprites/sprite_FontIcon.psd48.asset
  17. BIN
      Data/Editor/Icons/Sprites/sprite_GUISkinIcon.psd16.asset
  18. BIN
      Data/Editor/Icons/Sprites/sprite_GUISkinIcon.psd32.asset
  19. BIN
      Data/Editor/Icons/Sprites/sprite_GUISkinIcon.psd48.asset
  20. BIN
      Data/Editor/Icons/Sprites/sprite_MaterialIcon.psd16.asset
  21. BIN
      Data/Editor/Icons/Sprites/sprite_MaterialIcon.psd32.asset
  22. BIN
      Data/Editor/Icons/Sprites/sprite_MaterialIcon.psd48.asset
  23. BIN
      Data/Editor/Icons/Sprites/sprite_MeshIcon.psd16.asset
  24. BIN
      Data/Editor/Icons/Sprites/sprite_MeshIcon.psd32.asset
  25. BIN
      Data/Editor/Icons/Sprites/sprite_MeshIcon.psd48.asset
  26. BIN
      Data/Editor/Icons/Sprites/sprite_PhysicsMaterialIcon.psd16.asset
  27. BIN
      Data/Editor/Icons/Sprites/sprite_PhysicsMaterialIcon.psd32.asset
  28. BIN
      Data/Editor/Icons/Sprites/sprite_PhysicsMaterialIcon.psd48.asset
  29. BIN
      Data/Editor/Icons/Sprites/sprite_PhysicsMeshIcon.psd16.asset
  30. BIN
      Data/Editor/Icons/Sprites/sprite_PhysicsMeshIcon.psd32.asset
  31. BIN
      Data/Editor/Icons/Sprites/sprite_PhysicsMeshIcon.psd48.asset
  32. BIN
      Data/Editor/Icons/Sprites/sprite_PrefabIcon.psd16.asset
  33. BIN
      Data/Editor/Icons/Sprites/sprite_PrefabIcon.psd32.asset
  34. BIN
      Data/Editor/Icons/Sprites/sprite_PrefabIcon.psd48.asset
  35. BIN
      Data/Editor/Icons/Sprites/sprite_ShaderIcon.psd16.asset
  36. BIN
      Data/Editor/Icons/Sprites/sprite_ShaderIcon.psd32.asset
  37. BIN
      Data/Editor/Icons/Sprites/sprite_ShaderIcon.psd48.asset
  38. BIN
      Data/Editor/Icons/Sprites/sprite_ShaderIncludeIcon.psd16.asset
  39. BIN
      Data/Editor/Icons/Sprites/sprite_ShaderIncludeIcon.psd32.asset
  40. BIN
      Data/Editor/Icons/Sprites/sprite_ShaderIncludeIcon.psd48.asset
  41. BIN
      Data/Editor/Icons/Sprites/sprite_SpriteIcon.psd16.asset
  42. BIN
      Data/Editor/Icons/Sprites/sprite_SpriteIcon.psd32.asset
  43. BIN
      Data/Editor/Icons/Sprites/sprite_SpriteIcon.psd48.asset
  44. BIN
      Data/Editor/Icons/Sprites/sprite_TextIcon.psd16.asset
  45. BIN
      Data/Editor/Icons/Sprites/sprite_TextIcon.psd32.asset
  46. BIN
      Data/Editor/Icons/Sprites/sprite_TextIcon.psd48.asset
  47. BIN
      Data/Editor/Icons/Sprites/sprite_TextureIcon.psd16.asset
  48. BIN
      Data/Editor/Icons/Sprites/sprite_TextureIcon.psd32.asset
  49. BIN
      Data/Editor/Icons/Sprites/sprite_TextureIcon.psd48.asset
  50. BIN
      Data/Editor/ResourceManifest.asset
  51. BIN
      Data/Editor/Skin/Header.png.asset
  52. BIN
      Data/Editor/Skin/HeaderBg.png.asset
  53. BIN
      Data/Editor/Skin/Separator.png.asset
  54. BIN
      Data/Editor/Skin/Sprites/sprite_DockSliderNormal.png.asset
  55. BIN
      Data/Editor/Skin/Sprites/sprite_Header.png.asset
  56. BIN
      Data/Editor/Skin/Sprites/sprite_HeaderBg.png.asset
  57. BIN
      Data/Editor/Skin/Sprites/sprite_Separator.png.asset
  58. BIN
      Data/Editor/Skin/TitleBarBackground.png.asset
  59. BIN
      Data/Editor/Timestamp.asset
  60. BIN
      Data/Editor/arial.ttf.asset
  61. BIN
      Data/Editor/arialAA.ttf.asset
  62. BIN
      Data/Raw/Editor/Skin/Header.png
  63. 0 0
      Data/Raw/Editor/Skin/HeaderBg.png
  64. BIN
      Data/Raw/Editor/Skin/Separator.png
  65. BIN
      Data/Raw/Editor/Skin/TitleBarBackground.png
  66. 0 2
      Source/BansheeEditor/Include/BsBuiltinEditorResources.h
  67. 37 12
      Source/BansheeEditor/Source/BsBuiltinEditorResources.cpp
  68. 1 1
      Source/BansheeEditor/Source/BsDockManager.cpp
  69. 11 1
      Source/BansheeEngine/Include/BsGUILabel.h
  70. 90 7
      Source/BansheeEngine/Source/BsGUILabel.cpp
  71. 10 0
      Source/MBansheeEditor/GUI/EditorStyles.cs
  72. 2 2
      Source/MBansheeEditor/GUI/GUIDictionaryField.cs
  73. 2 2
      Source/MBansheeEditor/GUI/GUIListField.cs
  74. 2 2
      Source/MBansheeEditor/Inspectors/GUISkinInspector.cs
  75. 1 1
      Source/MBansheeEditor/Inspectors/PlainTextInspector.cs
  76. 1 1
      Source/MBansheeEditor/Inspectors/ScriptCodeInspector.cs
  77. 24 6
      Source/MBansheeEditor/Windows/Animation/GUIAnimFieldDisplay.cs
  78. 22 8
      Source/MBansheeEditor/Windows/Animation/GUICurveEditor.cs
  79. 4 0
      Source/MBansheeEditor/Windows/Animation/GUIFieldSelector.cs
  80. 21 11
      Source/MBansheeEditor/Windows/AnimationWindow.cs
  81. 6 6
      Source/MBansheeEditor/Windows/ColorPicker.cs
  82. 2 2
      Source/MBansheeEditor/Windows/Inspector/InspectableObject.cs
  83. 1 1
      Source/MBansheeEditor/Windows/Inspector/Inspector.cs
  84. 2 2
      Source/MBansheeEditor/Windows/Inspector/InspectorWindow.cs
  85. 1 1
      Source/MBansheeEditor/Windows/Library/LibraryWindow.cs
  86. 2 2
      Source/MBansheeEditor/Windows/ProjectWindow.cs

BIN
Data/Editor/GUISkin.asset


BIN
Data/Editor/Icons/Sprites/sprite_AnimationClipIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_AnimationClipIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_AnimationClipIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_AudioClipIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_AudioClipIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_AudioClipIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_CSharpIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_CSharpIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_CSharpIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_FolderIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_FolderIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_FolderIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_FontIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_FontIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_FontIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_GUISkinIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_GUISkinIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_GUISkinIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_MaterialIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_MaterialIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_MaterialIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_MeshIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_MeshIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_MeshIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_PhysicsMaterialIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_PhysicsMaterialIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_PhysicsMaterialIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_PhysicsMeshIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_PhysicsMeshIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_PhysicsMeshIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_PrefabIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_PrefabIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_PrefabIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_ShaderIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_ShaderIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_ShaderIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_ShaderIncludeIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_ShaderIncludeIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_ShaderIncludeIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_SpriteIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_SpriteIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_SpriteIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_TextIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_TextIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_TextIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_TextureIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_TextureIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_TextureIcon.psd48.asset


BIN
Data/Editor/ResourceManifest.asset


BIN
Data/Editor/Skin/Header.png.asset


BIN
Data/Editor/Skin/DockSliderNormal.png.asset → Data/Editor/Skin/HeaderBg.png.asset


BIN
Data/Editor/Skin/Separator.png.asset


BIN
Data/Editor/Skin/Sprites/sprite_DockSliderNormal.png.asset


BIN
Data/Editor/Skin/Sprites/sprite_Header.png.asset


BIN
Data/Editor/Skin/Sprites/sprite_HeaderBg.png.asset


BIN
Data/Editor/Skin/Sprites/sprite_Separator.png.asset


BIN
Data/Editor/Skin/TitleBarBackground.png.asset


BIN
Data/Editor/Timestamp.asset


BIN
Data/Editor/arial.ttf.asset


BIN
Data/Editor/arialAA.ttf.asset


BIN
Data/Raw/Editor/Skin/Header.png


+ 0 - 0
Data/Raw/Editor/Skin/DockSliderNormal.png → Data/Raw/Editor/Skin/HeaderBg.png


BIN
Data/Raw/Editor/Skin/Separator.png


BIN
Data/Raw/Editor/Skin/TitleBarBackground.png


+ 0 - 2
Source/BansheeEditor/Include/BsBuiltinEditorResources.h

@@ -416,8 +416,6 @@ namespace BansheeEngine
 
 		static const WString ToolBarSeparatorTex;
 
-		static const WString DockSliderNormalTex;
-
 		static const WString TreeViewExpandButtonOffNormal;
 		static const WString TreeViewExpandButtonOffHover;
 		static const WString TreeViewExpandButtonOnNormal;

+ 37 - 12
Source/BansheeEditor/Source/BsBuiltinEditorResources.cpp

@@ -230,8 +230,6 @@ namespace BansheeEngine
 
 	const WString BuiltinEditorResources::ToolBarSeparatorTex = L"ToolBarSeparator.png";
 
-	const WString BuiltinEditorResources::DockSliderNormalTex = L"DockSliderNormal.png";
-
 	const WString BuiltinEditorResources::TreeViewExpandButtonOffNormal = L"ExpandArrowNormalOff.png";
 	const WString BuiltinEditorResources::TreeViewExpandButtonOffHover = L"ExpandArrowHoverOff.png";
 	const WString BuiltinEditorResources::TreeViewExpandButtonOnNormal = L"ExpandArrowNormalOn.png";
@@ -1296,19 +1294,43 @@ namespace BansheeEngine
 		skin->setStyle(GUIMenuBar::getToolBarButtonStyleType(), toolBarBtnStyle);
 
 		/************************************************************************/
-		/* 								DOCK SLIDER	                     		*/
+		/* 								SEPARATOR	                     		*/
 		/************************************************************************/
 
-		GUIElementStyle dockSliderBtnStyle;
-		dockSliderBtnStyle.normal.texture = getGUITexture(DockSliderNormalTex);
-		dockSliderBtnStyle.hover.texture = dockSliderBtnStyle.normal.texture;
-		dockSliderBtnStyle.active.texture = dockSliderBtnStyle.normal.texture;
-		dockSliderBtnStyle.fixedHeight = false;
-		dockSliderBtnStyle.fixedWidth = false;
-		dockSliderBtnStyle.height = 2;
-		dockSliderBtnStyle.width = 2;
+		GUIElementStyle separator;
+		separator.normal.texture = getGUITexture(L"Separator.png");
+		separator.hover.texture = separator.normal.texture;
+		separator.active.texture = separator.normal.texture;
+		separator.fixedHeight = false;
+		separator.fixedWidth = false;
+		separator.height = 2;
+		separator.width = 2;
 
-		skin->setStyle("DockSliderBtn", dockSliderBtnStyle);
+		skin->setStyle("Separator", separator);
+
+		/************************************************************************/
+		/* 								HEADER	                     			*/
+		/************************************************************************/
+
+		GUIElementStyle headerBackground;
+		headerBackground.normal.texture = getGUITexture(L"HeaderBg.png");
+
+		skin->setStyle("HeaderBackground", headerBackground);
+
+		GUIElementStyle header;
+		header.normal.texture = getGUITexture(L"Header.png");
+		header.normal.textColor = TextNormalColor;
+		header.border.bottom = 2;
+		header.fixedHeight = true;
+		header.height = 21;
+		header.minWidth = 4;
+		header.minHeight = 4;
+		header.font = defaultFont;
+		header.fontSize = DefaultFontSize;
+		header.textHorzAlign = THA_Center;
+		header.textVertAlign = TVA_Center;
+
+		skin->setStyle("Header", header);
 
 		/************************************************************************/
 		/* 								TREE VIEW	                     		*/
@@ -2049,6 +2071,9 @@ namespace BansheeEngine
 
 		skin->setStyle("LibraryEntryVertLastBg", libraryEntryVertLastBg);
 
+		GUIElementStyle canvas;
+		skin->setStyle("Canvas", canvas);
+
 		return skin;
 	}
 

+ 1 - 1
Source/BansheeEditor/Source/BsDockManager.cpp

@@ -250,7 +250,7 @@ namespace BansheeEngine
 			mSlider = nullptr;
 		}
 
-		mSlider = GUIDockSlider::create(horizontal, "DockSliderBtn");
+		mSlider = GUIDockSlider::create(horizontal, "Separator");
 		mManager->_getParentWidget()->getPanel()->addElement(mSlider);
 		mSlider->onDragged.connect(std::bind(&DockManager::DockContainer::sliderDragged, this, _1));
 

+ 11 - 1
Source/BansheeEngine/Include/BsGUILabel.h

@@ -5,6 +5,7 @@
 #include "BsPrerequisites.h"
 #include "BsGUIElement.h"
 #include "BsTextSprite.h"
+#include "BsImageSprite.h"
 #include "BsGUIContent.h"
 
 namespace BansheeEngine
@@ -87,6 +88,12 @@ namespace BansheeEngine
 		/** @copydoc GUIElement::_getMeshInfo() */
 		void _getMeshInfo(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices, GUIMeshType& type) const override;
 
+		/** @copydoc GUIElement::_getRenderElementDepth */
+		UINT32 _getRenderElementDepth(UINT32 renderElementIdx) const override;
+
+		/** @copydoc GUIElement::_getRenderElementDepthRange */
+		UINT32 _getRenderElementDepthRange() const override;
+
 		/** @copydoc GUIElement::_fillBuffer */
 		void _fillBuffer(UINT8* vertices, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
 			UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 renderElementIdx) const override;
@@ -97,10 +104,13 @@ namespace BansheeEngine
 	private:
 		GUILabel(const String& styleName, const GUIContent& content, const GUIDimensions& dimensions);
 
-		TextSprite* mTextSprite;
 		GUIContent mContent;
 
+		TextSprite* mTextSprite;
+		ImageSprite* mImageSprite;
+		
 		TEXT_SPRITE_DESC mDesc;
+		IMAGE_SPRITE_DESC mImageDesc;
 	};
 
 	/** @} */

+ 90 - 7
Source/BansheeEngine/Source/BsGUILabel.cpp

@@ -3,13 +3,14 @@
 #include "BsGUILabel.h"
 #include "BsGUIElementStyle.h"
 #include "BsTextSprite.h"
+#include "BsSpriteTexture.h"
 #include "BsGUIDimensions.h"
 #include "BsGUIHelper.h"
 
 namespace BansheeEngine
 {
 	GUILabel::GUILabel(const String& styleName, const GUIContent& content, const GUIDimensions& dimensions)
-		:GUIElement(styleName, dimensions), mContent(content)
+		:GUIElement(styleName, dimensions), mImageSprite(nullptr), mContent(content)
 	{
 		mTextSprite = bs_new<TextSprite>();
 	}
@@ -17,30 +18,102 @@ namespace BansheeEngine
 	GUILabel::~GUILabel()
 	{
 		bs_delete(mTextSprite);
+
+		if (mImageSprite != nullptr)
+			bs_delete(mImageSprite);
 	}
 
 	UINT32 GUILabel::_getNumRenderElements() const
 	{
-		return mTextSprite->getNumRenderElements();
+		UINT32 numElements = mTextSprite->getNumRenderElements();
+
+		if(mImageSprite != nullptr)
+			numElements += mImageSprite->getNumRenderElements();
+
+		return numElements;
 	}
 
 	const SpriteMaterialInfo& GUILabel::_getMaterial(UINT32 renderElementIdx, SpriteMaterial** material) const
 	{
-		*material = mTextSprite->getMaterial(renderElementIdx);
-		return mTextSprite->getMaterialInfo(renderElementIdx);
+		UINT32 imageSpriteIdx = mTextSprite->getNumRenderElements();
+
+		if(renderElementIdx >= imageSpriteIdx)
+		{
+			*material = mImageSprite->getMaterial(imageSpriteIdx - renderElementIdx);
+			return mImageSprite->getMaterialInfo(imageSpriteIdx - renderElementIdx);
+		}
+		else
+		{
+			*material = mTextSprite->getMaterial(renderElementIdx);
+			return mTextSprite->getMaterialInfo(renderElementIdx);
+		}
 	}
 
 	void GUILabel::_getMeshInfo(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices, GUIMeshType& type) const
 	{
-		UINT32 numQuads = mTextSprite->getNumQuads(renderElementIdx);
+		UINT32 imageSpriteIdx = mTextSprite->getNumRenderElements();
+
+		UINT32 numQuads;
+		if (renderElementIdx >= imageSpriteIdx)
+			numQuads = mImageSprite->getNumQuads(imageSpriteIdx - renderElementIdx);
+		else
+			numQuads = mTextSprite->getNumQuads(renderElementIdx);
 
 		numVertices = numQuads * 4;
 		numIndices = numQuads * 6;
 		type = GUIMeshType::Triangle;
 	}
 
+	UINT32 GUILabel::_getRenderElementDepth(UINT32 renderElementIdx) const
+	{
+		UINT32 imageSpriteIdx = mTextSprite->getNumRenderElements();
+
+		if (renderElementIdx >= imageSpriteIdx)
+			return _getDepth() + 1;
+		else
+			return _getDepth();
+	}
+
+	UINT32 GUILabel::_getRenderElementDepthRange() const
+	{
+		return 2;
+	}
+
 	void GUILabel::updateRenderElementsInternal()
 	{		
+		const HSpriteTexture& activeTex = _getStyle()->normal.texture;
+		if (SpriteTexture::checkIsLoaded(activeTex))
+		{
+			mImageDesc.texture = activeTex.getInternalPtr();
+
+			if (mImageSprite == nullptr)
+				mImageSprite = bs_new<ImageSprite>();
+		}
+		else
+		{
+			mImageDesc.texture = nullptr;
+
+			if (mImageSprite != nullptr)
+			{
+				bs_delete(mImageSprite);
+				mImageSprite = nullptr;
+			}
+		}
+
+		if (mImageSprite != nullptr)
+		{
+			mImageDesc.width = mLayoutData.area.width;
+			mImageDesc.height = mLayoutData.area.height;
+
+			mImageDesc.borderLeft = _getStyle()->border.left;
+			mImageDesc.borderRight = _getStyle()->border.right;
+			mImageDesc.borderTop = _getStyle()->border.top;
+			mImageDesc.borderBottom = _getStyle()->border.bottom;
+			mImageDesc.color = getTint();
+
+			mImageSprite->update(mImageDesc, (UINT64)_getParentWidget());
+		}
+
 		mDesc.font = _getStyle()->font;
 		mDesc.fontSize = _getStyle()->fontSize;
 		mDesc.wordWrap = _getStyle()->wordWrap;
@@ -69,8 +142,18 @@ namespace BansheeEngine
 		UINT32 indexStride = sizeof(UINT32);
 		Vector2I offset(mLayoutData.area.x, mLayoutData.area.y);
 
-		mTextSprite->fillBuffer(vertices, uvs, indices, vertexOffset, indexOffset, maxNumVerts, maxNumIndices, vertexStride,
-			indexStride, renderElementIdx, offset, mLayoutData.getLocalClipRect());
+		UINT32 imageSpriteIdx = mTextSprite->getNumRenderElements();
+
+		if (renderElementIdx < imageSpriteIdx)
+		{
+			mTextSprite->fillBuffer(vertices, uvs, indices, vertexOffset, indexOffset, maxNumVerts, maxNumIndices, vertexStride,
+				indexStride, renderElementIdx, offset, mLayoutData.getLocalClipRect());
+
+			return;
+		}
+
+		mImageSprite->fillBuffer(vertices, uvs, indices, vertexOffset, indexOffset, maxNumVerts, maxNumIndices,
+			vertexStride, indexStride, imageSpriteIdx - renderElementIdx, offset, mLayoutData.getLocalClipRect());
 	}
 
 	void GUILabel::setContent(const GUIContent& content)

+ 10 - 0
Source/MBansheeEditor/GUI/EditorStyles.cs

@@ -26,6 +26,16 @@ namespace BansheeEditor
         public const string InputBox = "InputBox";
         public const string Foldout = "Foldout";
         public const string Expand = "Expand";
+        public const string Separator = "Separator";
+        public const string Header = "Header";
+        public const string HeaderBackground = "HeaderBackground";
+    }
+
+    /// <summary>
+    /// Editor GUI styles similar to <see cref="EditorStyles"/> but with a more specific use.
+    /// </summary>
+    internal static class EditorStylesInternal
+    {
         public const string ColorSliderHorz = "ColorSliderHorz";
         public const string ColorSliderVert = "ColorSliderVert";
         public const string ColorSlider2DHandle = "ColorSlider2DHandle";

+ 2 - 2
Source/MBansheeEditor/GUI/GUIDictionaryField.cs

@@ -171,8 +171,8 @@ namespace BansheeEditor
 
                 short backgroundDepth = (short)(Inspector.START_BACKGROUND_DEPTH - depth - 1);
                 string bgPanelStyle = depth % 2 == 0
-                    ? EditorStyles.InspectorContentBgAlternate
-                    : EditorStyles.InspectorContentBg;
+                    ? EditorStylesInternal.InspectorContentBgAlternate
+                    : EditorStylesInternal.InspectorContentBg;
 
                 GUIPanel backgroundPanel = guiContentPanel.AddPanel(backgroundDepth);
                 GUITexture inspectorContentBg = new GUITexture(null, bgPanelStyle);

+ 2 - 2
Source/MBansheeEditor/GUI/GUIListField.cs

@@ -171,8 +171,8 @@ namespace BansheeEditor
 
                 short backgroundDepth = (short)(Inspector.START_BACKGROUND_DEPTH - depth - 1);
                 string bgPanelStyle = depth % 2 == 0
-                    ? EditorStyles.InspectorContentBgAlternate
-                    : EditorStyles.InspectorContentBg;
+                    ? EditorStylesInternal.InspectorContentBgAlternate
+                    : EditorStylesInternal.InspectorContentBg;
 
                 GUIPanel backgroundPanel = guiContentPanel.AddPanel(backgroundDepth);
                 GUITexture inspectorContentBg = new GUITexture(null, bgPanelStyle);

+ 2 - 2
Source/MBansheeEditor/Inspectors/GUISkinInspector.cs

@@ -214,8 +214,8 @@ namespace BansheeEditor
             {
                 short backgroundDepth = (short)(Inspector.START_BACKGROUND_DEPTH - depth - 1);
                 string bgPanelStyle = depth % 2 == 0
-                    ? EditorStyles.InspectorContentBgAlternate
-                    : EditorStyles.InspectorContentBg;
+                    ? EditorStylesInternal.InspectorContentBgAlternate
+                    : EditorStylesInternal.InspectorContentBg;
 
                 GUIToggle foldout = new GUIToggle(new LocEdString("Style"), EditorStyles.Foldout);
                 GUITexture inspectorContentBg = new GUITexture(null, bgPanelStyle);

+ 1 - 1
Source/MBansheeEditor/Inspectors/PlainTextInspector.cs

@@ -18,7 +18,7 @@ namespace BansheeEditor
         private const int MAX_SHOWN_CHARACTERS = 3000;
 
         private GUILabel textLabel = new GUILabel("", EditorStyles.MultiLineLabel, GUIOption.FixedHeight(500));
-        private GUITexture textBg = new GUITexture(null, EditorStyles.ScrollAreaBg);
+        private GUITexture textBg = new GUITexture(null, EditorStylesInternal.ScrollAreaBg);
 
         private string shownText = "";
 

+ 1 - 1
Source/MBansheeEditor/Inspectors/ScriptCodeInspector.cs

@@ -18,7 +18,7 @@ namespace BansheeEditor
         private const int MAX_SHOWN_CHARACTERS = 3000;
 
         private GUILabel textLabel = new GUILabel("", EditorStyles.MultiLineLabel, GUIOption.FixedHeight(500));
-        private GUITexture textBg = new GUITexture(null, EditorStyles.ScrollAreaBg);
+        private GUITexture textBg = new GUITexture(null, EditorStylesInternal.ScrollAreaBg);
         private GUIToggleField isEditorField = new GUIToggleField(new LocEdString("Is editor script"));
 
         private string shownText = "";

+ 24 - 6
Source/MBansheeEditor/Windows/Animation/GUIAnimFieldDisplay.cs

@@ -123,6 +123,9 @@ namespace BansheeEditor
             if (fieldInfos == null || root == null)
                 return;
 
+            GUILabel header = new GUILabel(new LocEdString("Properties"), EditorStyles.Header);
+            scrollArea.Layout.AddElement(header);
+
             layouts = new GUIAnimFieldLayouts();
             GUIPanel rootPanel = scrollArea.Layout.AddPanel();
             GUIPanel mainPanel = rootPanel.AddPanel();
@@ -136,7 +139,7 @@ namespace BansheeEditor
             layouts.background = backgroundPanel.AddLayoutY();
 
             GUIButton catchAll = new GUIButton("", EditorStyles.Blank);
-            catchAll.Bounds = new Rect2I(0, 0, width, height);
+            catchAll.Bounds = new Rect2I(0, 0, width, height - header.Bounds.height);
             catchAll.OnClick += () => OnEntrySelected(null);
 
             underlayPanel.AddElement(catchAll);
@@ -206,6 +209,20 @@ namespace BansheeEditor
                     fields[i].OnEntrySelected += OnEntrySelected;
             }
 
+            if (fieldInfos.Count == 0)
+            {
+                GUILabel warningLbl = new GUILabel(new LocEdString("No properties. Add a new property to begin animating."));
+
+                GUILayoutY vertLayout = layouts.main.AddLayoutY();
+                vertLayout.AddFlexibleSpace();
+                GUILayoutX horzLayout = vertLayout.AddLayoutX();
+                vertLayout.AddFlexibleSpace();
+
+                horzLayout.AddFlexibleSpace();
+                horzLayout.AddElement(warningLbl);
+                horzLayout.AddFlexibleSpace();
+            }
+
             layouts.main.AddSpace(5);
             layouts.underlay.AddSpace(5);
             layouts.overlay.AddSpace(5);
@@ -247,12 +264,12 @@ namespace BansheeEditor
 
         public string Path { get { return path; } }
 
-        public GUIAnimFieldEntry(GUIAnimFieldLayouts layouts, string path, bool child)
+        public GUIAnimFieldEntry(GUIAnimFieldLayouts layouts, string path, bool child, int indentAmount)
         {
             this.path = path;
 
             GUILayoutX toggleLayout = layouts.main.AddLayoutX();
-            toggleLayout.AddSpace(child ? 45 : 30);
+            toggleLayout.AddSpace(indentAmount);
 
             selectionBtn = new GUIButton(GetDisplayName(path, child), EditorStyles.Label, GUIOption.FlexibleWidth());
             selectionBtn.OnClick += () =>
@@ -422,7 +439,7 @@ namespace BansheeEditor
         private GUILabel overlaySpacing;
 
         public GUIAnimSimpleEntry(GUIAnimFieldLayouts layouts, string path, Color color, bool child = false)
-            : base(layouts, path, child)
+            : base(layouts, path, child, child ? 45 : 30)
         {
             valueDisplay = new GUILabel("", GUIOption.FixedHeight(GetEntryHeight()));
             underlayLayout = layouts.underlay.AddLayoutX();
@@ -468,7 +485,7 @@ namespace BansheeEditor
         protected GUIAnimSimpleEntry[] children;
 
         public GUIAnimComplexEntry(GUIAnimFieldLayouts layouts, string path, string[] childEntries, Color[] colors)
-            : base(layouts, path, false)
+            : base(layouts, path, false, 20)
         {
             foldout = new GUIToggle("", EditorStyles.Expand);
             foldout.OnToggled += Toggle;
@@ -477,6 +494,7 @@ namespace BansheeEditor
 
             foldoutLayout = layouts.overlay.AddLayoutX();
 
+            foldoutLayout.AddSpace(5);
             foldoutLayout.AddElement(foldout);
             foldoutLayout.AddElement(spacer);
             foldoutLayout.AddFlexibleSpace();
@@ -592,7 +610,7 @@ namespace BansheeEditor
         private GUILabel overlaySpacing;
 
         public GUIAnimMissingEntry(GUIAnimFieldLayouts layouts, string path)
-            : base(layouts, path, false)
+            : base(layouts, path, false, 15)
         {
             missingLabel = new GUILabel("Missing property!", GUIOption.FixedHeight(GetEntryHeight()));
             underlayLayout = layouts.underlay.AddLayoutX();

+ 22 - 8
Source/MBansheeEditor/Windows/Animation/GUICurveEditor.cs

@@ -59,7 +59,8 @@ namespace BansheeEditor
         }
 
         private const int TIMELINE_HEIGHT = 20;
-        private const int EVENTS_HEIGHT = 10;
+        private const int VERT_PADDING = 2;
+        private const int EVENTS_HEIGHT = 15;
         private const int SIDEBAR_WIDTH = 30;
         private const int DRAG_START_DISTANCE = 3;
 
@@ -264,22 +265,35 @@ namespace BansheeEditor
             eventContextMenu.AddItem("Delete", DeleteSelectedEvents);
             eventContextMenu.AddItem("Edit", EditSelectedEvent);
 
-            guiTimeline = new GUIGraphTime(gui, width, TIMELINE_HEIGHT);
+            GUIPanel timelinePanel = gui.AddPanel();
+            guiTimeline = new GUIGraphTime(timelinePanel, width, TIMELINE_HEIGHT);
+
+            GUIPanel timelineBgPanel = gui.AddPanel(1);
+
+            GUITexture timelineBackground = new GUITexture(null, EditorStyles.Header);
+            timelineBackground.Bounds = new Rect2I(0, 0, width, TIMELINE_HEIGHT + VERT_PADDING);
+            timelineBgPanel.AddElement(timelineBackground);
 
             eventsPanel = gui.AddPanel();
-            eventsPanel.SetPosition(0, TIMELINE_HEIGHT);
+            eventsPanel.SetPosition(0, TIMELINE_HEIGHT + VERT_PADDING);
             guiEvents = new GUIAnimEvents(eventsPanel, width, EVENTS_HEIGHT);
-            
+
+            GUIPanel eventsBgPanel = eventsPanel.AddPanel(1);
+
+            GUITexture eventsBackground = new GUITexture(null, EditorStyles.Header);
+            eventsBackground.Bounds = new Rect2I(0, 0, width, EVENTS_HEIGHT + VERT_PADDING);
+            eventsBgPanel.AddElement(eventsBackground);
+
             drawingPanel = gui.AddPanel();
-            drawingPanel.SetPosition(0, TIMELINE_HEIGHT + EVENTS_HEIGHT);
+            drawingPanel.SetPosition(0, TIMELINE_HEIGHT + EVENTS_HEIGHT + VERT_PADDING);
 
-            guiCurveDrawing = new GUICurveDrawing(drawingPanel, width, height - TIMELINE_HEIGHT - EVENTS_HEIGHT, curveInfos);
+            guiCurveDrawing = new GUICurveDrawing(drawingPanel, width, height - TIMELINE_HEIGHT - EVENTS_HEIGHT - VERT_PADDING * 2, curveInfos);
             guiCurveDrawing.SetRange(60.0f, 20.0f);
 
             GUIPanel sidebarPanel = gui.AddPanel(-10);
-            sidebarPanel.SetPosition(0, TIMELINE_HEIGHT + EVENTS_HEIGHT);
+            sidebarPanel.SetPosition(0, TIMELINE_HEIGHT + EVENTS_HEIGHT + VERT_PADDING);
 
-            guiSidebar = new GUIGraphValues(sidebarPanel, SIDEBAR_WIDTH, height - TIMELINE_HEIGHT - EVENTS_HEIGHT);
+            guiSidebar = new GUIGraphValues(sidebarPanel, SIDEBAR_WIDTH, height - TIMELINE_HEIGHT - EVENTS_HEIGHT - VERT_PADDING * 2);
             guiSidebar.SetRange(-10.0f, 10.0f);
         }
 

+ 4 - 0
Source/MBansheeEditor/Windows/Animation/GUIFieldSelector.cs

@@ -104,6 +104,9 @@ namespace BansheeEditor
             rootElement.childLayout = scrollArea.Layout;
             rootElement.indentLayout = null;
 
+            GUILabel header = new GUILabel(new LocEdString("Select a property"), EditorStyles.Header);
+            scrollArea.Layout.AddElement(header);
+
             scrollArea.Layout.AddSpace(5);
             AddSceneObjectRows(rootElement);
             scrollArea.Layout.AddSpace(5);
@@ -224,6 +227,7 @@ namespace BansheeEditor
 
             elementLayout.AddFlexibleSpace();
             elementLayout.AddElement(selectBtn);
+            elementLayout.AddSpace(5);
 
             element.path = path;
 

+ 21 - 11
Source/MBansheeEditor/Windows/AnimationWindow.cs

@@ -303,7 +303,10 @@ namespace BansheeEditor
                 }
             };
 
-            GUILayout mainLayout = GUI.AddLayoutY();
+            GUIPanel mainPanel = GUI.AddPanel();
+            GUIPanel backgroundPanel = GUI.AddPanel(1);
+
+            GUILayout mainLayout = mainPanel.AddLayoutY();
 
             buttonLayout = mainLayout.AddLayoutX();
             buttonLayout.AddSpace(5);
@@ -322,6 +325,10 @@ namespace BansheeEditor
 
             buttonLayoutHeight = playButton.Bounds.height;
 
+            GUITexture buttonBackground = new GUITexture(null, EditorStyles.HeaderBackground);
+            buttonBackground.Bounds = new Rect2I(0, 0, Width, buttonLayoutHeight);
+            backgroundPanel.AddElement(buttonBackground);
+
             GUILayout contentLayout = mainLayout.AddLayoutX();
             GUILayout fieldDisplayLayout = contentLayout.AddLayoutY(GUIOption.FixedWidth(FIELD_DISPLAY_WIDTH));
 
@@ -339,6 +346,9 @@ namespace BansheeEditor
             vertScrollBar = new GUIResizeableScrollBarV();
             vertScrollBar.OnScrollOrResize += OnVertScrollOrResize;
 
+            GUITexture separator = new GUITexture(null, EditorStyles.Separator, GUIOption.FixedWidth(3));
+            contentLayout.AddElement(separator);
+
             GUILayout curveLayout = contentLayout.AddLayoutY();
             GUILayout curveLayoutHorz = curveLayout.AddLayoutX();
             GUILayout horzScrollBarLayout = curveLayout.AddLayoutX();
@@ -720,9 +730,9 @@ namespace BansheeEditor
             {
                 for (int i = 0; i < selectedFields.Count; i++)
                 {
-                    CurveDrawInfo curveInfo;
-                    if (TryGetCurve(selectedFields[i], out curveInfo))
-                        curvesToDisplay.Add(curveInfo);
+                    CurveDrawInfo[] curveInfos;
+                    if (TryGetCurve(selectedFields[i], out curveInfos))
+                        curvesToDisplay.AddRange(curveInfos);
                 }
             }
 
@@ -947,7 +957,7 @@ namespace BansheeEditor
             }
         }
 
-        private bool TryGetCurve(string path, out CurveDrawInfo curveInfo)
+        private bool TryGetCurve(string path, out CurveDrawInfo[] curveInfos)
         {
             int index = path.LastIndexOf(".");
             string parentPath;
@@ -969,33 +979,33 @@ namespace BansheeEditor
                 {
                     if (subPathSuffix == ".x" || subPathSuffix == ".r")
                     {
-                        curveInfo = fieldCurves.curveInfos[0];
+                        curveInfos = new [] { fieldCurves.curveInfos[0] };
                         return true;
                     }
                     else if (subPathSuffix == ".y" || subPathSuffix == ".g")
                     {
-                        curveInfo = fieldCurves.curveInfos[1];
+                        curveInfos = new[] { fieldCurves.curveInfos[1] };
                         return true;
                     }
                     else if (subPathSuffix == ".z" || subPathSuffix == ".b")
                     {
-                        curveInfo = fieldCurves.curveInfos[2];
+                        curveInfos = new[] { fieldCurves.curveInfos[2] };
                         return true;
                     }
                     else if (subPathSuffix == ".w" || subPathSuffix == ".a")
                     {
-                        curveInfo = fieldCurves.curveInfos[3];
+                        curveInfos = new[] { fieldCurves.curveInfos[3] };
                         return true;
                     }
                 }
                 else
                 {
-                    curveInfo = fieldCurves.curveInfos[0];
+                    curveInfos = fieldCurves.curveInfos;
                     return true;
                 }
             }
 
-            curveInfo = new CurveDrawInfo();
+            curveInfos = new CurveDrawInfo[0];
             return false;
         }
 

+ 6 - 6
Source/MBansheeEditor/Windows/ColorPicker.cs

@@ -161,12 +161,12 @@ namespace BansheeEditor
             guiColorBoxBtn = new GUIButton(colorBoxMode.ToString());
             guiColorModeBtn = new GUIButton(sliderMode.ToString());
 
-            guiSliderVert = new GUISliderV(EditorStyles.ColorSliderVert);
-            guiSliderRHorz = new GUISliderH(EditorStyles.ColorSliderHorz);
-            guiSliderGHorz = new GUISliderH(EditorStyles.ColorSliderHorz);
-            guiSliderBHorz = new GUISliderH(EditorStyles.ColorSliderHorz);
-            guiSliderAHorz = new GUISliderH(EditorStyles.ColorSliderHorz);
-            guiSlider2DHandle = new GUITexture(null, EditorStyles.ColorSlider2DHandle);
+            guiSliderVert = new GUISliderV(EditorStylesInternal.ColorSliderVert);
+            guiSliderRHorz = new GUISliderH(EditorStylesInternal.ColorSliderHorz);
+            guiSliderGHorz = new GUISliderH(EditorStylesInternal.ColorSliderHorz);
+            guiSliderBHorz = new GUISliderH(EditorStylesInternal.ColorSliderHorz);
+            guiSliderAHorz = new GUISliderH(EditorStylesInternal.ColorSliderHorz);
+            guiSlider2DHandle = new GUITexture(null, EditorStylesInternal.ColorSlider2DHandle);
 
             guiLabelR = new GUILabel(new LocEdString("R"));
             guiLabelG = new GUILabel(new LocEdString("G"));

+ 2 - 2
Source/MBansheeEditor/Windows/Inspector/InspectableObject.cs

@@ -147,8 +147,8 @@ namespace BansheeEditor
 
                        short backgroundDepth = (short) (Inspector.START_BACKGROUND_DEPTH - depth - 1);
                        string bgPanelStyle = depth%2 == 0
-                           ? EditorStyles.InspectorContentBgAlternate
-                           : EditorStyles.InspectorContentBg;
+                           ? EditorStylesInternal.InspectorContentBgAlternate
+                           : EditorStylesInternal.InspectorContentBg;
                        GUIPanel backgroundPanel = guiContentPanel.AddPanel(backgroundDepth);
                        GUITexture inspectorContentBg = new GUITexture(null, bgPanelStyle);
                        backgroundPanel.AddElement(inspectorContentBg);

+ 1 - 1
Source/MBansheeEditor/Windows/Inspector/Inspector.cs

@@ -76,7 +76,7 @@ namespace BansheeEditor
             contentLayoutX.AddSpace(5);
 
             GUIPanel backgroundPanel = gui.AddPanel(START_BACKGROUND_DEPTH);
-            GUITexture inspectorContentBg = new GUITexture(null, EditorStyles.InspectorContentBg);
+            GUITexture inspectorContentBg = new GUITexture(null, EditorStylesInternal.InspectorContentBg);
             backgroundPanel.AddElement(inspectorContentBg);
 
             mainPanel = contentPanel;

+ 2 - 2
Source/MBansheeEditor/Windows/Inspector/InspectorWindow.cs

@@ -140,7 +140,7 @@ namespace BansheeEditor
 
             GUIPanel titleBgPanel = titlePanel.AddPanel(1);
 
-            GUITexture titleBg = new GUITexture(null, EditorStyles.InspectorTitleBg);
+            GUITexture titleBg = new GUITexture(null, EditorStylesInternal.InspectorTitleBg);
             titleBgPanel.AddElement(titleBg);
 
             inspectorLayout.AddSpace(COMPONENT_SPACING);
@@ -344,7 +344,7 @@ namespace BansheeEditor
 
             sceneObjectLayout.AddFlexibleSpace();
 
-            GUITexture titleBg = new GUITexture(null, EditorStyles.InspectorTitleBg);
+            GUITexture titleBg = new GUITexture(null, EditorStylesInternal.InspectorTitleBg);
             sceneObjectBgPanel.AddElement(titleBg);
         }
 

+ 1 - 1
Source/MBansheeEditor/Windows/Library/LibraryWindow.cs

@@ -917,7 +917,7 @@ namespace BansheeEditor
 
             if (dragSelection == null)
             {
-                dragSelection = new GUITexture(null, true, EditorStyles.SelectionArea);
+                dragSelection = new GUITexture(null, true, EditorStylesInternal.SelectionArea);
                 content.Overlay.AddElement(dragSelection);
             }
 

+ 2 - 2
Source/MBansheeEditor/Windows/ProjectWindow.cs

@@ -98,7 +98,7 @@ namespace BansheeEditor
             recentProjectsLayout.AddFlexibleSpace();
 
             GUIPanel scrollAreaBgPanel = recentProjectsPanel.AddPanel(1);
-            GUITexture scrollAreaBgTex = new GUITexture(null, true, EditorStyles.ScrollAreaBg);
+            GUITexture scrollAreaBgTex = new GUITexture(null, true, EditorStylesInternal.ScrollAreaBg);
             scrollAreaBgPanel.AddElement(scrollAreaBgTex);
 
             autoLoadToggle = new GUIToggle("");
@@ -235,7 +235,7 @@ namespace BansheeEditor
             {
                 string projectPath = recentProjects[i].path;
 
-                GUIToggle entryBtn = new GUIToggle(projectPath, grp, EditorStyles.SelectableLabel);
+                GUIToggle entryBtn = new GUIToggle(projectPath, grp, EditorStylesInternal.SelectableLabel);
                 entryBtn.OnClick += () => OnEntryClicked(projectPath);
                 entryBtn.OnDoubleClick += () => OnEntryDoubleClicked(projectPath);