浏览代码

Implements a Material Instance viewer to the material editor to see a feature-filtered dump of the generated shaders for a given material.

Areloch 6 年之前
父节点
当前提交
af14de2bb7

+ 2 - 1
Engine/source/materials/baseMatInstance.h

@@ -59,7 +59,7 @@ struct GFXStateBlockDesc;
 class GFXVertexFormat;
 class MatrixSet;
 class ProcessedMaterial;
-
+class GuiTreeViewCtrl;
 
 ///
 class BaseMatInstance
@@ -216,6 +216,7 @@ public:
    virtual const GFXVertexFormat* getVertexFormat() const = 0;
 
    virtual void dumpShaderInfo() const = 0;
+   virtual void getShaderInfo(GuiTreeViewCtrl* tree, U32 item) const = 0;
 
    /// Fast test for use of normal maps in this material.
    bool hasNormalMap() const { return mHasNormalMaps; }

+ 34 - 0
Engine/source/materials/matInstance.cpp

@@ -37,6 +37,8 @@
 #include "core/util/safeDelete.h"
 #include "ts/tsShape.h"
 
+#include "gui/controls/guiTreeViewCtrl.h"
+
 class MatInstParameters;
 
 class MatInstanceParameterHandle : public MaterialParameterHandle
@@ -591,3 +593,35 @@ void MatInstance::dumpShaderInfo() const
 
    mProcessedMaterial->dumpMaterialInfo();
 }
+
+void MatInstance::getShaderInfo(GuiTreeViewCtrl* tree, U32 item) const
+{
+   if (mMaterial == NULL)
+   {
+      Con::errorf("Trying to get Material information on an invalid MatInstance");
+      return;
+   }
+
+   if (mProcessedMaterial == NULL)
+   {
+      Con::printf("  [no processed material!]");
+      return;
+   }
+
+   const FeatureSet features = mProcessedMaterial->getFeatures();
+
+   String featureDesc = "";
+   for (U32 i = 0; i < features.getCount(); i++)
+   {
+      const FeatureType& ft = features.getAt(i);
+
+      featureDesc += ft.getName();
+
+      if(i+1 < features.getCount())
+         featureDesc += ", ";
+   }
+
+   U32 newItem = tree->insertItem(item, featureDesc);
+
+   mProcessedMaterial->getMaterialInfo(tree, newItem);
+}

+ 2 - 1
Engine/source/materials/matInstance.h

@@ -44,7 +44,7 @@ class ShaderFeature;
 class MatInstanceParameterHandle;
 class MatInstParameters;
 class ProcessedMaterial;
-
+class GuiTreeViewCtrl;
 
 ///
 class MatInstance : public BaseMatInstance
@@ -86,6 +86,7 @@ public:
    virtual const FeatureSet& getFeatures() const;
    virtual const FeatureSet& getRequestedFeatures() const { return mFeatureList; }
    virtual void dumpShaderInfo() const;
+   virtual void getShaderInfo(GuiTreeViewCtrl* tree, U32 item) const;
    
 
    ProcessedMaterial *getProcessedMaterial() const { return mProcessedMaterial; }

+ 14 - 1
Engine/source/materials/materialDefinition.cpp

@@ -36,7 +36,7 @@
 #include "sfx/sfxTypes.h"
 #include "core/util/safeDelete.h"
 #include "T3D/accumulationVolume.h"
-
+#include "gui/controls/guiTreeViewCtrl.h"
 
 IMPLEMENT_CONOBJECT( Material );
 
@@ -647,6 +647,12 @@ DefineEngineMethod( Material, dumpInstances, void, (),,
    MATMGR->dumpMaterialInstances( object );
 }
 
+DefineEngineMethod(Material, getMaterialInstances, void, (GuiTreeViewCtrl* matTree), (nullAsType< GuiTreeViewCtrl*>()),
+   "Dumps a formatted list of the currently allocated material instances for this material to the console.")
+{
+   MATMGR->getMaterialInstances(object, matTree);
+}
+
 DefineEngineMethod( Material, getAnimFlags, const char*, (U32 id), , "" )
 {
    char * animFlags = Con::getReturnBuffer(512);
@@ -706,6 +712,13 @@ DefineEngineMethod( Material, setAutoGenerated, void, (bool isAutoGenerated), ,
    object->setAutoGenerated(isAutoGenerated);
 }
 
+DefineEngineMethod(Material, getAutogeneratedFile, const char*, (), , "Get filename of autogenerated shader file")
+{
+   SimObject *material = static_cast<SimObject *>(object);
+   return material->getFilename();
+}
+
+
 // Accumulation
 bool Material::_setAccuEnabled( void *object, const char *index, const char *data )
 {

+ 41 - 0
Engine/source/materials/materialManager.cpp

@@ -32,6 +32,7 @@
 #include "console/consoleTypes.h"
 #include "console/engineAPI.h"
 
+#include "gui/controls/guiTreeViewCtrl.h"
 
 MODULE_BEGIN( MaterialManager )
 
@@ -399,6 +400,36 @@ void MaterialManager::dumpMaterialInstances( BaseMaterialDefinition *target ) co
    Con::printf( "---------------------- Dump complete ----------------------");
 }
 
+void MaterialManager::getMaterialInstances(BaseMaterialDefinition* target, GuiTreeViewCtrl* materailInstanceTree)
+{
+   if (!mMatInstanceList.size())
+      return;
+
+   if (!target)
+   {
+      Con::errorf("Can't form a list without a specific MaterialDefinition");
+      return;
+   }
+
+   if (!materailInstanceTree)
+   {
+      Con::errorf("Requires a valid GuiTreeViewCtrl object to populate data into!");
+      return;
+   }
+
+   U32 matItem = materailInstanceTree->insertItem(0, target->getName());
+
+   for (U32 i = 0; i < mMatInstanceList.size(); i++)
+   {
+      BaseMatInstance* inst = mMatInstanceList[i];
+
+      if (target && inst->getMaterial() != target)
+         continue;
+
+      inst->getShaderInfo(materailInstanceTree, matItem);
+   }
+}
+
 void MaterialManager::_track( MatInstance *matInstance )
 {
    mMatInstanceList.push_back( matInstance );
@@ -488,6 +519,16 @@ DefineEngineFunction( dumpMaterialInstances, void, (), ,
    MATMGR->dumpMaterialInstances();
 }
 
+DefineEngineFunction(getMaterialInstances, void, (BaseMaterialDefinition* target, GuiTreeViewCtrl* tree), (nullAsType<BaseMaterialDefinition*>(), nullAsType<GuiTreeViewCtrl*>()),
+   "@brief Dumps a formatted list of currently allocated material instances to the console.\n\n"
+   "@ingroup Materials")
+{
+   if (target == nullptr || tree == nullptr)
+      return;
+
+   MATMGR->getMaterialInstances(target, tree);
+}
+
 DefineEngineFunction( getMapEntry, const char*, (const char * texName), ,
    "@hide")
 {

+ 3 - 0
Engine/source/materials/materialManager.h

@@ -37,6 +37,7 @@
 
 class SimSet;
 class MatInstance;
+class GuiTreeViewCtrl;
 
 class MaterialManager : public ManagedSingleton<MaterialManager>
 {
@@ -97,6 +98,8 @@ public:
 
    void dumpMaterialInstances( BaseMaterialDefinition *target = NULL ) const;
 
+   void getMaterialInstances(BaseMaterialDefinition* target, GuiTreeViewCtrl* tree);
+
    void updateTime();
    F32 getTotalTime() const { return mAccumTime; }
    F32 getDeltaTime() const { return mDt; }

+ 3 - 1
Engine/source/materials/processedMaterial.h

@@ -46,7 +46,7 @@ class SceneRenderState;
 class GFXVertexBufferHandleBase;
 class GFXPrimitiveBufferHandle;
 class MatrixSet;
-
+class GuiTreeViewCtrl;
 
 /// This contains the common data needed to render a pass.
 struct RenderPassData
@@ -218,6 +218,8 @@ public:
    /// Dump shader info, or FF texture info?
    virtual void dumpMaterialInfo() { }
 
+   virtual void getMaterialInfo(GuiTreeViewCtrl* tree, U32 item) {}
+
    /// Returns the source material.
    Material* getMaterial() const { return mMaterial; }
 

+ 24 - 1
Engine/source/materials/processedShaderMaterial.cpp

@@ -44,7 +44,7 @@
 // We need to include customMaterialDefinition for ShaderConstHandles::init
 #include "materials/customMaterialDefinition.h"
 
-
+#include "gui/controls/guiTreeViewCtrl.h"
 #include "ts/tsShape.h"
 
 ///
@@ -1421,3 +1421,26 @@ void ProcessedShaderMaterial::dumpMaterialInfo()
          Con::printf( "  [%i] %s", i, shader->describeSelf().c_str() );
    }
 }
+
+void ProcessedShaderMaterial::getMaterialInfo(GuiTreeViewCtrl* tree, U32 item)
+{
+   for (U32 i = 0; i < getNumPasses(); i++)
+   {
+      const ShaderRenderPassData* passData = _getRPD(i);
+
+      if (passData == NULL)
+         continue;
+
+      char passStr[64];
+      dSprintf(passStr, 64, "Pass Number: %i", i);
+
+      U32 passItem = tree->insertItem(item, passStr);
+
+      const GFXShader * shader = passData->shader;
+
+      if (shader == NULL)
+         tree->insertItem(passItem, "[NULL shader]");
+      else
+         tree->insertItem(passItem, shader->describeSelf().c_str());
+   }
+}

+ 1 - 1
Engine/source/materials/processedShaderMaterial.h

@@ -37,7 +37,6 @@ class ShaderMaterialParameterHandle;
 class ShaderFeatureConstHandles;
 class CustomMaterial;
 
-
 class ShaderConstHandles
 {
 public:
@@ -136,6 +135,7 @@ public:
    virtual void setBuffers(GFXVertexBufferHandleBase* vertBuffer, GFXPrimitiveBufferHandle* primBuffer); 
    virtual bool stepInstance();
    virtual void dumpMaterialInfo();
+   virtual void getMaterialInfo(GuiTreeViewCtrl* tree, U32 item);
    virtual MaterialParameters* allocMaterialParameters();    
    virtual MaterialParameters* getDefaultMaterialParameters() { return mDefaultParameters; }   
    virtual MaterialParameterHandle* getMaterialParameterHandle(const String& name);

+ 24 - 3
Templates/BaseGame/game/tools/materialEditor/gui/guiMaterialPropertiesWindow.ed.gui

@@ -3615,7 +3615,7 @@
             isContainer = "0";
             HorizSizing = "left";
             VertSizing = "bottom";
-            position = "86 1";
+            position = "66 1";
             Extent = "16 16";
             MinExtent = "8 2";
             canSave = "1";
@@ -3636,7 +3636,7 @@
             Profile = "ToolsGuiDefaultProfile";
             HorizSizing = "left";
             VertSizing = "bottom";
-            position = "106 1";
+            position = "86 1";
             Extent = "16 16";
             MinExtent = "8 2";
             canSave = "1";
@@ -3658,7 +3658,7 @@
             Profile = "ToolsGuiDefaultProfile";
             HorizSizing = "left";
             VertSizing = "bottom";
-            position = "123 1";
+            position = "106 1";
             Extent = "16 16";
             MinExtent = "8 2";
             canSave = "1";
@@ -3672,6 +3672,27 @@
             useMouseEvents = "0";
             bitmap = "tools/gui/images/save-icon";
          };
+         new GuiBitmapButtonCtrl() {
+            canSaveDynamicFields = "0";
+            Enabled = "1";
+            isContainer = "0";
+            Profile = "ToolsGuiDefaultProfile";
+            HorizSizing = "left";
+            VertSizing = "bottom";
+            position = "126 1";
+            Extent = "16 16";
+            MinExtent = "8 2";
+            canSave = "1";
+            Visible = "1";
+            Command = "MaterialEditorGui.lookupMaterialInstances();";
+            hovertime = "1000";
+            groupNum = "-1";
+            text ="";
+            tooltip = "Lookup Material Instances";
+            buttonType = "PushButton";
+            useMouseEvents = "0";
+            bitmap = "tools/gui/images/visible";
+         };
          new GuiBitmapCtrl(){
             position = "147 1";
             Extent = "2 16";

+ 170 - 0
Templates/BaseGame/game/tools/materialEditor/gui/materialInstancesView.ed.gui

@@ -0,0 +1,170 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GuiControl(MaterialInstanceViewCtrl) {
+   position = "0 0";
+   extent = "1024 768";
+   minExtent = "8 2";
+   horizSizing = "right";
+   vertSizing = "bottom";
+   profile = "GuiDefaultProfile";
+   visible = "1";
+   active = "1";
+   tooltipProfile = "GuiToolTipProfile";
+   hovertime = "1000";
+   isContainer = "1";
+   canSave = "1";
+   canSaveDynamicFields = "1";
+
+   new GuiWindowCtrl(MaterialInstanceViewWindow) {
+      text = "Material Instances Viewer";
+      resizeWidth = "1";
+      resizeHeight = "1";
+      canMove = "1";
+      canClose = "1";
+      canMinimize = "1";
+      canMaximize = "1";
+      canCollapse = "0";
+      closeCommand = "Canvas.popDialog(MaterialInstanceViewCtrl);";
+      edgeSnap = "1";
+      margin = "0 0 0 0";
+      padding = "0 0 0 0";
+      anchorTop = "1";
+      anchorBottom = "0";
+      anchorLeft = "1";
+      anchorRight = "0";
+      position = "429 123";
+      extent = "550 550";
+      minExtent = "8 2";
+      horizSizing = "right";
+      vertSizing = "bottom";
+      profile = "ToolsGuiWindowProfile";
+      visible = "1";
+      active = "1";
+      tooltipProfile = "GuiToolTipProfile";
+      hovertime = "1000";
+      isContainer = "1";
+      canSave = "1";
+      canSaveDynamicFields = "0";
+
+      new GuiTextEditCtrl(MaterialInstanceFilter) {
+         historySize = "0";
+         tabComplete = "0";
+         sinkAllKeyEvents = "0";
+         password = "0";
+         passwordMask = "*";
+         text = "\c2Filter...";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "11 21";
+         extent = "516 18";
+         minExtent = "8 2";
+         horizSizing = "width";
+         vertSizing = "bottom";
+         profile = "ToolsGuiTextEditProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         class = "AssetBrowserSearchFilterText";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiBitmapButtonCtrl(MaterialInstanceFilterBtn) {
+         bitmap = "tools/gui/images/delete";
+         bitmapMode = "Stretched";
+         autoFitExtents = "0";
+         useModifiers = "0";
+         useStates = "1";
+         masked = "0";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "529 22";
+         extent = "15 15";
+         minExtent = "8 2";
+         horizSizing = "left";
+         vertSizing = "bottom";
+         profile = "ToolsGuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         tooltip = "Delete Asset";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiScrollCtrl() {
+         willFirstRespond = "1";
+         hScrollBar = "dynamic";
+         vScrollBar = "dynamic";
+         lockHorizScroll = "0";
+         lockVertScroll = "0";
+         constantThumbHeight = "0";
+         childMargin = "0 0";
+         mouseWheelScrollSpeed = "-1";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "0 38";
+         extent = "550 510";
+         minExtent = "8 2";
+         horizSizing = "width";
+         vertSizing = "height";
+         profile = "ToolsGuiScrollProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+
+         new GuiTreeViewCtrl(MaterialInstanceViewTree) {
+            tabSize = "16";
+            textOffset = "2";
+            fullRowSelect = "0";
+            itemHeight = "21";
+            destroyTreeOnSleep = "1";
+            mouseDragging = "1";
+            multipleSelections = "1";
+            deleteObjectAllowed = "1";
+            dragToItemAllowed = "1";
+            clearAllOnSingleSelection = "1";
+            showRoot = "1";
+            useInspectorTooltips = "0";
+            tooltipOnWidthOnly = "0";
+            showObjectIds = "1";
+            showClassNames = "1";
+            showObjectNames = "1";
+            showInternalNames = "1";
+            showClassNameForUnnamedObjects = "0";
+            compareToObjectID = "1";
+            canRenameObjects = "1";
+            renameInternal = "0";
+            position = "1 1";
+            extent = "550 510";
+            minExtent = "8 2";
+            horizSizing = "width";
+            vertSizing = "height";
+            profile = "ToolsGuiTreeViewProfile";
+            visible = "1";
+            active = "1";
+            tooltipProfile = "GuiToolTipProfile";
+            hovertime = "1000";
+            isContainer = "1";
+            canSave = "1";
+            canSaveDynamicFields = "0";
+         };
+      };
+   };
+};
+//--- OBJECT WRITE END ---

+ 4 - 0
Templates/BaseGame/game/tools/materialEditor/main.cs

@@ -32,9 +32,13 @@ function initializeMaterialEditor()
    // Load Properties Window
    exec("~/materialEditor/gui/guiMaterialPropertiesWindow.ed.gui");
    
+   //Material Instance viewer
+   exec("~/materialEditor/gui/materialInstancesView.ed.gui");
+   
    // Load Client Scripts.
    exec("./scripts/materialEditor.ed.cs");
    exec("./scripts/materialEditorUndo.ed.cs");
+   exec("./scripts/materialInstanceView.ed.cs");
    //exec("./gui/profiles.ed.cs");
    
    MaterialEditorPreviewWindow.setVisible( false );

+ 26 - 0
Templates/BaseGame/game/tools/materialEditor/scripts/materialEditor.ed.cs

@@ -2116,6 +2116,32 @@ function MaterialEditorGui::refreshMaterial(%this)
    MaterialEditorGui.setMaterialNotDirty();
 }
 
+//==============================================================================
+// Looking up material instances/getting mat info 
+function MaterialEditorGui::lookupMaterialInstances( %this )
+{
+   if( MaterialEditorGui.currentMaterial.getName() $= "" )
+   {
+      MessageBoxOK("Cannot perform operation", "Unable to look up a material with a blank name" );
+      return;   
+   }
+   
+   MaterialInstanceViewTree.clear();
+   MaterialInstanceViewTree.setFilterChildren(false);
+   MaterialInstanceViewTree.setItemFilterException(1, true);
+   
+   MaterialEditorGui.currentMaterial.getMaterialInstances(MaterialInstanceViewTree);
+   
+   if(MaterialInstanceFilter.Text !$= "\c2Filter...")
+   {
+      MaterialInstanceViewTree.setFilterText(MaterialInstanceFilter.Text);
+   }
+   
+   MaterialInstanceViewTree.buildVisibleTree(true);
+   
+   Canvas.pushDialog(MaterialInstanceViewCtrl);
+}
+
 //==============================================================================
 // Switching and Changing Materials
 

+ 27 - 0
Templates/BaseGame/game/tools/materialEditor/scripts/materialInstanceView.ed.cs

@@ -0,0 +1,27 @@
+function MaterialInstanceFilter::onGainFirstResponder( %this )
+{
+   %this.selectAllText();
+}
+
+function MaterialInstanceFilter::onReturn( %this )
+{
+   %text = %this.getText();
+   if( %text $= "" )
+   {
+      %this.reset();
+      MaterialInstanceViewTree.clearFilterText();
+   }
+   else
+   {
+      MaterialInstanceViewTree.setFilterText(%text);
+   }
+   
+   MaterialInstanceViewTree.buildVisibleTree(true);
+}
+
+function MaterialInstanceFilterBtn::onClick(%this)
+{
+   MaterialInstanceFilter.reset();
+   MaterialInstanceViewTree.clearFilterText();
+   MaterialInstanceViewTree.buildVisibleTree(true);
+}

+ 24 - 3
Templates/Full/game/tools/materialEditor/gui/guiMaterialPropertiesWindow.ed.gui

@@ -3615,7 +3615,7 @@
             isContainer = "0";
             HorizSizing = "left";
             VertSizing = "bottom";
-            position = "86 1";
+            position = "66 1";
             Extent = "16 16";
             MinExtent = "8 2";
             canSave = "1";
@@ -3636,7 +3636,7 @@
             Profile = "ToolsGuiDefaultProfile";
             HorizSizing = "left";
             VertSizing = "bottom";
-            position = "106 1";
+            position = "86 1";
             Extent = "16 16";
             MinExtent = "8 2";
             canSave = "1";
@@ -3658,7 +3658,7 @@
             Profile = "ToolsGuiDefaultProfile";
             HorizSizing = "left";
             VertSizing = "bottom";
-            position = "123 1";
+            position = "106 1";
             Extent = "16 16";
             MinExtent = "8 2";
             canSave = "1";
@@ -3672,6 +3672,27 @@
             useMouseEvents = "0";
             bitmap = "tools/gui/images/save-icon";
          };
+         new GuiBitmapButtonCtrl() {
+            canSaveDynamicFields = "0";
+            Enabled = "1";
+            isContainer = "0";
+            Profile = "ToolsGuiDefaultProfile";
+            HorizSizing = "left";
+            VertSizing = "bottom";
+            position = "126 1";
+            Extent = "16 16";
+            MinExtent = "8 2";
+            canSave = "1";
+            Visible = "1";
+            Command = "MaterialEditorGui.lookupMaterialInstances();";
+            hovertime = "1000";
+            groupNum = "-1";
+            text ="";
+            tooltip = "Lookup Material Instances";
+            buttonType = "PushButton";
+            useMouseEvents = "0";
+            bitmap = "tools/gui/images/visible";
+         };
          new GuiBitmapCtrl(){
             position = "147 1";
             Extent = "2 16";

+ 170 - 0
Templates/Full/game/tools/materialEditor/gui/materialInstancesView.ed.gui

@@ -0,0 +1,170 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GuiControl(MaterialInstanceViewCtrl) {
+   position = "0 0";
+   extent = "1024 768";
+   minExtent = "8 2";
+   horizSizing = "right";
+   vertSizing = "bottom";
+   profile = "GuiDefaultProfile";
+   visible = "1";
+   active = "1";
+   tooltipProfile = "GuiToolTipProfile";
+   hovertime = "1000";
+   isContainer = "1";
+   canSave = "1";
+   canSaveDynamicFields = "1";
+
+   new GuiWindowCtrl(MaterialInstanceViewWindow) {
+      text = "Material Instances Viewer";
+      resizeWidth = "1";
+      resizeHeight = "1";
+      canMove = "1";
+      canClose = "1";
+      canMinimize = "1";
+      canMaximize = "1";
+      canCollapse = "0";
+      closeCommand = "Canvas.popDialog(MaterialInstanceViewCtrl);";
+      edgeSnap = "1";
+      margin = "0 0 0 0";
+      padding = "0 0 0 0";
+      anchorTop = "1";
+      anchorBottom = "0";
+      anchorLeft = "1";
+      anchorRight = "0";
+      position = "429 123";
+      extent = "550 550";
+      minExtent = "8 2";
+      horizSizing = "right";
+      vertSizing = "bottom";
+      profile = "ToolsGuiWindowProfile";
+      visible = "1";
+      active = "1";
+      tooltipProfile = "GuiToolTipProfile";
+      hovertime = "1000";
+      isContainer = "1";
+      canSave = "1";
+      canSaveDynamicFields = "0";
+
+      new GuiTextEditCtrl(MaterialInstanceFilter) {
+         historySize = "0";
+         tabComplete = "0";
+         sinkAllKeyEvents = "0";
+         password = "0";
+         passwordMask = "*";
+         text = "\c2Filter...";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "11 21";
+         extent = "516 18";
+         minExtent = "8 2";
+         horizSizing = "width";
+         vertSizing = "bottom";
+         profile = "ToolsGuiTextEditProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         class = "AssetBrowserSearchFilterText";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiBitmapButtonCtrl(MaterialInstanceFilterBtn) {
+         bitmap = "tools/gui/images/delete";
+         bitmapMode = "Stretched";
+         autoFitExtents = "0";
+         useModifiers = "0";
+         useStates = "1";
+         masked = "0";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "529 22";
+         extent = "15 15";
+         minExtent = "8 2";
+         horizSizing = "left";
+         vertSizing = "bottom";
+         profile = "ToolsGuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         tooltip = "Delete Asset";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiScrollCtrl() {
+         willFirstRespond = "1";
+         hScrollBar = "dynamic";
+         vScrollBar = "dynamic";
+         lockHorizScroll = "0";
+         lockVertScroll = "0";
+         constantThumbHeight = "0";
+         childMargin = "0 0";
+         mouseWheelScrollSpeed = "-1";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "0 38";
+         extent = "550 510";
+         minExtent = "8 2";
+         horizSizing = "width";
+         vertSizing = "height";
+         profile = "ToolsGuiScrollProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+
+         new GuiTreeViewCtrl(MaterialInstanceViewTree) {
+            tabSize = "16";
+            textOffset = "2";
+            fullRowSelect = "0";
+            itemHeight = "21";
+            destroyTreeOnSleep = "1";
+            mouseDragging = "1";
+            multipleSelections = "1";
+            deleteObjectAllowed = "1";
+            dragToItemAllowed = "1";
+            clearAllOnSingleSelection = "1";
+            showRoot = "1";
+            useInspectorTooltips = "0";
+            tooltipOnWidthOnly = "0";
+            showObjectIds = "1";
+            showClassNames = "1";
+            showObjectNames = "1";
+            showInternalNames = "1";
+            showClassNameForUnnamedObjects = "0";
+            compareToObjectID = "1";
+            canRenameObjects = "1";
+            renameInternal = "0";
+            position = "1 1";
+            extent = "550 510";
+            minExtent = "8 2";
+            horizSizing = "width";
+            vertSizing = "height";
+            profile = "ToolsGuiTreeViewProfile";
+            visible = "1";
+            active = "1";
+            tooltipProfile = "GuiToolTipProfile";
+            hovertime = "1000";
+            isContainer = "1";
+            canSave = "1";
+            canSaveDynamicFields = "0";
+         };
+      };
+   };
+};
+//--- OBJECT WRITE END ---

+ 4 - 0
Templates/Full/game/tools/materialEditor/main.cs

@@ -32,9 +32,13 @@ function initializeMaterialEditor()
    // Load Properties Window
    exec("~/materialEditor/gui/guiMaterialPropertiesWindow.ed.gui");
    
+   //Material Instance viewer
+   exec("~/materialEditor/gui/materialInstancesView.ed.gui");
+   
    // Load Client Scripts.
    exec("./scripts/materialEditor.ed.cs");
    exec("./scripts/materialEditorUndo.ed.cs");
+   exec("./scripts/materialInstanceView.ed.cs");
    //exec("./gui/profiles.ed.cs");
    
    MaterialEditorPreviewWindow.setVisible( false );

+ 26 - 0
Templates/Full/game/tools/materialEditor/scripts/materialEditor.ed.cs

@@ -2116,6 +2116,32 @@ function MaterialEditorGui::refreshMaterial(%this)
    MaterialEditorGui.setMaterialNotDirty();
 }
 
+//==============================================================================
+// Looking up material instances/getting mat info 
+function MaterialEditorGui::lookupMaterialInstances( %this )
+{
+   if( MaterialEditorGui.currentMaterial.getName() $= "" )
+   {
+      MessageBoxOK("Cannot perform operation", "Unable to look up a material with a blank name" );
+      return;   
+   }
+   
+   MaterialInstanceViewTree.clear();
+   MaterialInstanceViewTree.setFilterChildren(false);
+   MaterialInstanceViewTree.setItemFilterException(1, true);
+   
+   MaterialEditorGui.currentMaterial.getMaterialInstances(MaterialInstanceViewTree);
+   
+   if(MaterialInstanceFilter.Text !$= "\c2Filter...")
+   {
+      MaterialInstanceViewTree.setFilterText(MaterialInstanceFilter.Text);
+   }
+   
+   MaterialInstanceViewTree.buildVisibleTree(true);
+   
+   Canvas.pushDialog(MaterialInstanceViewCtrl);
+}
+
 //==============================================================================
 // Switching and Changing Materials
 

+ 27 - 0
Templates/Full/game/tools/materialEditor/scripts/materialInstanceView.ed.cs

@@ -0,0 +1,27 @@
+function MaterialInstanceFilter::onGainFirstResponder( %this )
+{
+   %this.selectAllText();
+}
+
+function MaterialInstanceFilter::onReturn( %this )
+{
+   %text = %this.getText();
+   if( %text $= "" )
+   {
+      %this.reset();
+      MaterialInstanceViewTree.clearFilterText();
+   }
+   else
+   {
+      MaterialInstanceViewTree.setFilterText(%text);
+   }
+   
+   MaterialInstanceViewTree.buildVisibleTree(true);
+}
+
+function MaterialInstanceFilterBtn::onClick(%this)
+{
+   MaterialInstanceFilter.reset();
+   MaterialInstanceViewTree.clearFilterText();
+   MaterialInstanceViewTree.buildVisibleTree(true);
+}