Browse Source

Merge pull request #934 from Areloch/AssetInspectorFieldExpand

Updates the behavior and layout of the ImageAsset, MaterialAsset and ShapeAsset inspector fields
Brian Roberts 2 years ago
parent
commit
2d26d35687

+ 155 - 32
Engine/source/T3D/assets/ImageAsset.cpp

@@ -477,71 +477,117 @@ GuiControl* GuiInspectorTypeImageAssetPtr::constructEditControl()
 
    retCtrl->getRenderTooltipDelegate().bind(this, &GuiInspectorTypeImageAssetPtr::renderTooltip);
 
+   // Change filespec
+   char szBuffer[512];
+
+   const char* previewImage;
+
    if (mInspector->getInspectObject() != nullptr)
    {
-      // Change filespec
-         char szBuffer[512];
       dSprintf(szBuffer, sizeof(szBuffer), "AssetBrowser.showDialog(\"ImageAsset\", \"AssetBrowser.changeAsset\", %s, %s);",
          mInspector->getIdString(), mCaption);
       mBrowseButton->setField("Command", szBuffer);
 
       setDataField(StringTable->insert("targetObject"), NULL, mInspector->getInspectObject()->getIdString());
+
+      previewImage = mInspector->getInspectObject()->getDataField(mCaption, NULL);
    }
    else
    {
       //if we don't have a target object, we'll be manipulating the desination value directly
-      char szBuffer[512];
       dSprintf(szBuffer, sizeof(szBuffer), "AssetBrowser.showDialog(\"ImageAsset\", \"AssetBrowser.changeAsset\", %s, \"%s\");",
          mInspector->getIdString(), mVariableName);
       mBrowseButton->setField("Command", szBuffer);
+
+      previewImage = Con::getVariable(mVariableName);
    }
 
-   mImageEdButton = NULL;
-   // Create "Open in ImageEditor" button
-   /*mImageEdButton = new GuiBitmapButtonCtrl();
+   mLabel = new GuiTextCtrl();
+   mLabel->registerObject();
+   mLabel->setControlProfile(mProfile);
+   mLabel->setText(mCaption);
+   addObject(mLabel);
+
+   //
+   GuiTextEditCtrl* editTextCtrl = static_cast<GuiTextEditCtrl*>(retCtrl);
+   GuiControlProfile* toolEditProfile;
+   if (Sim::findObject("ToolsGuiTextEditProfile", toolEditProfile))
+      editTextCtrl->setControlProfile(toolEditProfile);
+
+   GuiControlProfile* toolDefaultProfile = nullptr;
+   Sim::findObject("ToolsGuiDefaultProfile", toolDefaultProfile);
+
+   //
+   mPreviewImage = new GuiBitmapCtrl();
+   mPreviewImage->registerObject();
+
+   if (toolDefaultProfile)
+      mPreviewImage->setControlProfile(toolDefaultProfile);
+
+   updatePreviewImage();
+
+   addObject(mPreviewImage);
+
+   //
+   mPreviewBorderButton = new GuiBitmapButtonCtrl();
+   mPreviewBorderButton->registerObject();
+
+   if (toolDefaultProfile)
+      mPreviewBorderButton->setControlProfile(toolDefaultProfile);
+
+   mPreviewBorderButton->_setBitmap(StringTable->insert("ToolsModule:cubemapBtnBorder_n_image"));
+
+   mPreviewBorderButton->setField("Command", szBuffer); //clicking the preview does the same thing as the edit button, for simplicity
+   addObject(mPreviewBorderButton);
+
+   //
+   // Create "Open in Editor" button
+   /*mEditButton = new GuiBitmapButtonCtrl();
+
+   dSprintf(szBuffer, sizeof(szBuffer), "AssetBrowser.editAsset(%d.getText());", retCtrl->getId());
+   mEditButton->setField("Command", szBuffer);
 
-   char bitmapName[512] = "ToolsModule:GameTSCtrl_image";
-   mImageEdButton->setBitmap(StringTable->insert(bitmapName));
-   mImageEdButton->setHidden(true);
+   mEditButton->setText("Edit");
+   mEditButton->setSizing(horizResizeLeft, vertResizeAspectTop);
 
-   mImageEdButton->setDataField(StringTable->insert("Profile"), NULL, "GuiButtonProfile");
-   mImageEdButton->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile");
-   mImageEdButton->setDataField(StringTable->insert("hovertime"), NULL, "1000");
-   mImageEdButton->setDataField(StringTable->insert("tooltip"), NULL, "Open this file in the Image Editor");
+   mEditButton->setDataField(StringTable->insert("Profile"), NULL, "ToolsGuiButtonProfile");
+   mEditButton->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile");
+   mEditButton->setDataField(StringTable->insert("hovertime"), NULL, "1000");
+   mEditButton->setDataField(StringTable->insert("tooltip"), NULL, "Open this asset in the Image Editor");
 
-   mImageEdButton->registerObject();
-   addObject(mImageEdButton);*/
+   mEditButton->registerObject();
+   addObject(mEditButton);*/
+
+   //
+   mUseHeightOverride = true;
+   mHeightOverride = 72;
 
    return retCtrl;
 }
 
 bool GuiInspectorTypeImageAssetPtr::updateRects()
 {
+   S32 rowSize = 18;
    S32 dividerPos, dividerMargin;
    mInspector->getDivider(dividerPos, dividerMargin);
    Point2I fieldExtent = getExtent();
    Point2I fieldPos = getPosition();
 
-   mCaptionRect.set(0, 0, fieldExtent.x - dividerPos - dividerMargin, fieldExtent.y);
-   mEditCtrlRect.set(fieldExtent.x - dividerPos + dividerMargin, 1, dividerPos - dividerMargin - 34, fieldExtent.y);
+   mEditCtrlRect.set(0, 0, fieldExtent.x, fieldExtent.y);
+   mLabel->resize(Point2I(mProfile->mTextOffset.x, 0), Point2I(fieldExtent.x, rowSize));
 
-   bool resized = mEdit->resize(mEditCtrlRect.point, mEditCtrlRect.extent);
-   if (mImageEdButton != NULL)
-   {
-      RectI shapeEdRect(fieldExtent.x - 16, 2, 14, fieldExtent.y - 4);
-      resized |= mImageEdButton->resize(shapeEdRect.point, shapeEdRect.extent);
-   }
+   RectI previewRect = RectI(Point2I(mProfile->mTextOffset.x, rowSize), Point2I(50, 50));
+   mPreviewBorderButton->resize(previewRect.point, previewRect.extent);
+   mPreviewImage->resize(previewRect.point, previewRect.extent);
 
-   if (mBrowseButton != NULL)
-   {
-      if(mImageEdButton != NULL)
-         mBrowseRect.set(fieldExtent.x - 32, 2, 14, fieldExtent.y - 4);
-      else
-         mBrowseRect.set(fieldExtent.x - 16, 2, 14, fieldExtent.y - 4);
-      resized |= mBrowseButton->resize(mBrowseRect.point, mBrowseRect.extent);
-   }
+   S32 editPos = previewRect.point.x + previewRect.extent.x + 10;
+   mEdit->resize(Point2I(editPos, rowSize * 1.5), Point2I(fieldExtent.x - editPos - 5, rowSize));
+
+   //mEditButton->resize(Point2I(fieldExtent.x - 105, previewRect.point.y + previewRect.extent.y - rowSize), Point2I(100, rowSize));
+
+   mBrowseButton->setHidden(true);
 
-   return resized;
+   return true;
 }
 
 bool GuiInspectorTypeImageAssetPtr::renderTooltip(const Point2I& hoverPos, const Point2I& cursorPos, const char* tipText)
@@ -617,6 +663,83 @@ bool GuiInspectorTypeImageAssetPtr::renderTooltip(const Point2I& hoverPos, const
    return true;
 }
 
+void GuiInspectorTypeImageAssetPtr::updateValue()
+{
+   Parent::updateValue();
+
+   updatePreviewImage();
+}
+
+void GuiInspectorTypeImageAssetPtr::updatePreviewImage()
+{
+   const char* previewImage;
+   if (mInspector->getInspectObject() != nullptr)
+      previewImage = mInspector->getInspectObject()->getDataField(mCaption, NULL);
+   else
+      previewImage = Con::getVariable(mVariableName);
+
+   //if what we're working with isn't even a valid asset, don't present like we found a good one
+   if (!AssetDatabase.isDeclaredAsset(previewImage))
+   {
+      mPreviewImage->_setBitmap(StringTable->EmptyString());
+      return;
+   }
+
+   String imgPreviewAssetId = String(previewImage) + "_PreviewImage";
+   imgPreviewAssetId.replace(":", "_");
+   imgPreviewAssetId = "ToolsModule:" + imgPreviewAssetId;
+   if (AssetDatabase.isDeclaredAsset(imgPreviewAssetId.c_str()))
+   {
+      mPreviewImage->setBitmap(StringTable->insert(imgPreviewAssetId.c_str()));
+   }
+   else
+   {
+      if (AssetDatabase.isDeclaredAsset(previewImage))
+      {
+         ImageAsset* imgAsset = AssetDatabase.acquireAsset<ImageAsset>(previewImage);
+         if (imgAsset && imgAsset->isAssetValid())
+         {
+            mPreviewImage->_setBitmap(imgAsset->getAssetId());
+         }
+      }
+   }
+
+   if (mPreviewImage->getBitmapAsset().isNull())
+      mPreviewImage->_setBitmap(StringTable->insert("ToolsModule:genericAssetIcon_image"));
+}
+
+void GuiInspectorTypeImageAssetPtr::setPreviewImage(StringTableEntry assetId)
+{
+   //if what we're working with isn't even a valid asset, don't present like we found a good one
+   if (!AssetDatabase.isDeclaredAsset(assetId))
+   {
+      mPreviewImage->_setBitmap(StringTable->EmptyString());
+      return;
+   }
+
+   String imgPreviewAssetId = String(assetId) + "_PreviewImage";
+   imgPreviewAssetId.replace(":", "_");
+   imgPreviewAssetId = "ToolsModule:" + imgPreviewAssetId;
+   if (AssetDatabase.isDeclaredAsset(imgPreviewAssetId.c_str()))
+   {
+      mPreviewImage->setBitmap(StringTable->insert(imgPreviewAssetId.c_str()));
+   }
+   else
+   {
+      if (AssetDatabase.isDeclaredAsset(assetId))
+      {
+         ImageAsset* imgAsset = AssetDatabase.acquireAsset<ImageAsset>(assetId);
+         if (imgAsset && imgAsset->isAssetValid())
+         {
+            mPreviewImage->_setBitmap(imgAsset->getAssetId());
+         }
+      }
+   }
+
+   if (mPreviewImage->getBitmapAsset().isNull())
+      mPreviewImage->_setBitmap(StringTable->insert("ToolsModule:genericAssetIcon_image"));
+}
+
 IMPLEMENT_CONOBJECT(GuiInspectorTypeImageAssetId);
 
 ConsoleDocClass(GuiInspectorTypeImageAssetId,

+ 10 - 1
Engine/source/T3D/assets/ImageAssetInspectors.h

@@ -5,6 +5,7 @@
 #ifndef _GUI_INSPECTOR_TYPES_H_
 #include "gui/editor/guiInspectorTypes.h"
 #endif
+#include <gui/controls/guiBitmapCtrl.h>
 
 #ifdef TORQUE_TOOLS
 class GuiInspectorTypeImageAssetPtr : public GuiInspectorTypeFileName
@@ -12,7 +13,10 @@ class GuiInspectorTypeImageAssetPtr : public GuiInspectorTypeFileName
    typedef GuiInspectorTypeFileName Parent;
 public:
 
-   GuiBitmapButtonCtrl* mImageEdButton;
+   GuiTextCtrl* mLabel;
+   GuiBitmapButtonCtrl* mPreviewBorderButton;
+   GuiBitmapCtrl* mPreviewImage;
+   GuiButtonCtrl* mEditButton;
 
    DECLARE_CONOBJECT(GuiInspectorTypeImageAssetPtr);
    static void consoleInit();
@@ -20,6 +24,11 @@ public:
    virtual GuiControl* constructEditControl();
    virtual bool updateRects();
    bool renderTooltip(const Point2I& hoverPos, const Point2I& cursorPos, const char* tipText = NULL);
+
+   virtual void updateValue();
+
+   void updatePreviewImage();
+   void setPreviewImage(StringTableEntry assetId);
 };
 
 class GuiInspectorTypeImageAssetId : public GuiInspectorTypeImageAssetPtr

+ 138 - 13
Engine/source/T3D/assets/MaterialAsset.cpp

@@ -480,6 +480,8 @@ GuiControl* GuiInspectorTypeMaterialAssetPtr::constructEditControl()
    // Change filespec
    char szBuffer[512];
 
+   const char* previewImage;
+
    if (mInspector->getInspectObject() != nullptr)
    {
       dSprintf(szBuffer, sizeof(szBuffer), "AssetBrowser.showDialog(\"MaterialAsset\", \"AssetBrowser.changeAsset\", %s, %s);",
@@ -487,6 +489,8 @@ GuiControl* GuiInspectorTypeMaterialAssetPtr::constructEditControl()
       mBrowseButton->setField("Command", szBuffer);
 
       setDataField(StringTable->insert("targetObject"), NULL, mInspector->getInspectObject()->getIdString());
+
+      previewImage = mInspector->getInspectObject()->getDataField(mCaption, NULL);
    }
    else
    {
@@ -494,18 +498,59 @@ GuiControl* GuiInspectorTypeMaterialAssetPtr::constructEditControl()
       dSprintf(szBuffer, sizeof(szBuffer), "AssetBrowser.showDialog(\"MaterialAsset\", \"AssetBrowser.changeAsset\", %s, \"%s\");",
          mInspector->getIdString(), mVariableName);
       mBrowseButton->setField("Command", szBuffer);
+
+      previewImage = Con::getVariable(mVariableName);
    }
 
+   mLabel = new GuiTextCtrl();
+   mLabel->registerObject();
+   mLabel->setControlProfile(mProfile);
+   mLabel->setText(mCaption);
+   addObject(mLabel);
+
+   //
+   GuiTextEditCtrl* editTextCtrl = static_cast<GuiTextEditCtrl*>(retCtrl);
+   GuiControlProfile* toolEditProfile;
+   if (Sim::findObject("ToolsGuiTextEditProfile", toolEditProfile))
+      editTextCtrl->setControlProfile(toolEditProfile);
+
+   GuiControlProfile* toolDefaultProfile = nullptr;
+   Sim::findObject("ToolsGuiDefaultProfile", toolDefaultProfile);
+
+   //
+   mPreviewImage = new GuiBitmapCtrl();
+   mPreviewImage->registerObject();
+
+   if(toolDefaultProfile)
+      mPreviewImage->setControlProfile(toolDefaultProfile);
+
+   updatePreviewImage();
+
+   addObject(mPreviewImage);
+
+   //
+   mPreviewBorderButton = new GuiBitmapButtonCtrl();
+   mPreviewBorderButton->registerObject();
+
+   if(toolDefaultProfile)
+      mPreviewBorderButton->setControlProfile(toolDefaultProfile);
+
+   mPreviewBorderButton->_setBitmap(StringTable->insert("ToolsModule:cubemapBtnBorder_n_image"));
+
+   mPreviewBorderButton->setField("Command", szBuffer); //clicking the preview does the same thing as the edit button, for simplicity
+   addObject(mPreviewBorderButton);
+
+   //
    // Create "Open in Editor" button
    mEditButton = new GuiBitmapButtonCtrl();
 
    dSprintf(szBuffer, sizeof(szBuffer), "AssetBrowser.editAsset(%d.getText());", retCtrl->getId());
    mEditButton->setField("Command", szBuffer);
 
-   char bitmapName[512] = "ToolsModule:material_editor_n_image";
-   mEditButton->setBitmap(StringTable->insert(bitmapName));
+   mEditButton->setText("Edit");
+   mEditButton->setSizing(horizResizeLeft, vertResizeAspectTop);
 
-   mEditButton->setDataField(StringTable->insert("Profile"), NULL, "GuiButtonProfile");
+   mEditButton->setDataField(StringTable->insert("Profile"), NULL, "ToolsGuiButtonProfile");
    mEditButton->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile");
    mEditButton->setDataField(StringTable->insert("hovertime"), NULL, "1000");
    mEditButton->setDataField(StringTable->insert("tooltip"), NULL, "Open this asset in the Material Editor");
@@ -513,33 +558,113 @@ GuiControl* GuiInspectorTypeMaterialAssetPtr::constructEditControl()
    mEditButton->registerObject();
    addObject(mEditButton);
 
+   //
+   mUseHeightOverride = true;
+   mHeightOverride = 72;
+
    return retCtrl;
 }
 
 bool GuiInspectorTypeMaterialAssetPtr::updateRects()
 {
+   S32 rowSize = 18;
    S32 dividerPos, dividerMargin;
    mInspector->getDivider(dividerPos, dividerMargin);
    Point2I fieldExtent = getExtent();
    Point2I fieldPos = getPosition();
 
-   mCaptionRect.set(0, 0, fieldExtent.x - dividerPos - dividerMargin, fieldExtent.y);
-   mEditCtrlRect.set(fieldExtent.x - dividerPos + dividerMargin, 1, dividerPos - dividerMargin - 34, fieldExtent.y);
+   mEditCtrlRect.set(0, 0, fieldExtent.x, fieldExtent.y);
+   mLabel->resize(Point2I(mProfile->mTextOffset.x, 0), Point2I(fieldExtent.x, rowSize));
+
+   RectI previewRect = RectI(Point2I(mProfile->mTextOffset.x, rowSize), Point2I(50, 50));
+   mPreviewBorderButton->resize(previewRect.point, previewRect.extent);
+   mPreviewImage->resize(previewRect.point, previewRect.extent);
+
+   S32 editPos = previewRect.point.x + previewRect.extent.x + 10;
+   mEdit->resize(Point2I(editPos, rowSize * 1.5), Point2I(fieldExtent.x - editPos - 5, rowSize));
+
+   mEditButton->resize(Point2I(fieldExtent.x - 105, previewRect.point.y + previewRect.extent.y - rowSize), Point2I(100, rowSize));
+
+   mBrowseButton->setHidden(true);
+
+   return true;
+}
+
+void GuiInspectorTypeMaterialAssetPtr::updateValue()
+{
+   Parent::updateValue();
+
+   updatePreviewImage();
+}
+
+void GuiInspectorTypeMaterialAssetPtr::updatePreviewImage()
+{
+   const char* previewImage;
+   if (mInspector->getInspectObject() != nullptr)
+      previewImage = mInspector->getInspectObject()->getDataField(mCaption, NULL);
+   else
+      previewImage = Con::getVariable(mVariableName);
+
+   //if what we're working with isn't even a valid asset, don't present like we found a good one
+   if (!AssetDatabase.isDeclaredAsset(previewImage))
+   {
+      mPreviewImage->_setBitmap(StringTable->EmptyString());
+      return;
+   }
 
-   bool resized = mEdit->resize(mEditCtrlRect.point, mEditCtrlRect.extent);
-   if (mBrowseButton != NULL)
+   String matPreviewAssetId = String(previewImage) + "_PreviewImage";
+   matPreviewAssetId.replace(":", "_");
+   matPreviewAssetId = "ToolsModule:" + matPreviewAssetId;
+   if (AssetDatabase.isDeclaredAsset(matPreviewAssetId.c_str()))
+   {
+      mPreviewImage->setBitmap(StringTable->insert(matPreviewAssetId.c_str()));
+   }
+   else
    {
-      mBrowseRect.set(fieldExtent.x - 32, 2, 14, fieldExtent.y - 4);
-      resized |= mBrowseButton->resize(mBrowseRect.point, mBrowseRect.extent);
+      if (AssetDatabase.isDeclaredAsset(previewImage))
+      {
+         MaterialAsset* matAsset = AssetDatabase.acquireAsset<MaterialAsset>(previewImage);
+         if (matAsset && matAsset->getMaterialDefinition())
+         {
+            mPreviewImage->_setBitmap(matAsset->getMaterialDefinition()->mDiffuseMapAssetId[0]);
+         }
+      }
    }
 
-   if (mEditButton != NULL)
+   if (mPreviewImage->getBitmapAsset().isNull())
+      mPreviewImage->_setBitmap(StringTable->insert("ToolsModule:genericAssetIcon_image"));
+}
+
+void GuiInspectorTypeMaterialAssetPtr::setPreviewImage(StringTableEntry assetId)
+{
+   //if what we're working with isn't even a valid asset, don't present like we found a good one
+   if (!AssetDatabase.isDeclaredAsset(assetId))
    {
-      RectI shapeEdRect(fieldExtent.x - 16, 2, 14, fieldExtent.y - 4);
-      resized |= mEditButton->resize(shapeEdRect.point, shapeEdRect.extent);
+      mPreviewImage->_setBitmap(StringTable->EmptyString());
+      return;
+   }
+
+   String matPreviewAssetId = String(assetId) + "_PreviewImage";
+   matPreviewAssetId.replace(":", "_");
+   matPreviewAssetId = "ToolsModule:" + matPreviewAssetId;
+   if (AssetDatabase.isDeclaredAsset(matPreviewAssetId.c_str()))
+   {
+      mPreviewImage->setBitmap(StringTable->insert(matPreviewAssetId.c_str()));
+   }
+   else
+   {
+      if (AssetDatabase.isDeclaredAsset(assetId))
+      {
+         MaterialAsset* matAsset = AssetDatabase.acquireAsset<MaterialAsset>(assetId);
+         if (matAsset && matAsset->getMaterialDefinition())
+         {
+            mPreviewImage->_setBitmap(matAsset->getMaterialDefinition()->mDiffuseMapAssetId[0]);
+         }
+      }
    }
 
-   return resized;
+   if (mPreviewImage->getBitmapAsset().isNull())
+      mPreviewImage->_setBitmap(StringTable->insert("ToolsModule:genericAssetIcon_image"));
 }
 
 IMPLEMENT_CONOBJECT(GuiInspectorTypeMaterialAssetId);

+ 10 - 1
Engine/source/T3D/assets/MaterialAsset.h

@@ -57,6 +57,7 @@
 #include "materials/customMaterialDefinition.h"
 #include "materials/materialManager.h"
 #include "assetMacroHelpers.h"
+#include <gui/controls/guiBitmapCtrl.h>
 
 //-----------------------------------------------------------------------------
 class MaterialAsset : public AssetBase
@@ -140,13 +141,21 @@ class GuiInspectorTypeMaterialAssetPtr : public GuiInspectorTypeFileName
    typedef GuiInspectorTypeFileName Parent;
 public:
 
-   GuiBitmapButtonCtrl* mEditButton;
+   GuiTextCtrl* mLabel;
+   GuiBitmapButtonCtrl* mPreviewBorderButton;
+   GuiBitmapCtrl* mPreviewImage;
+   GuiButtonCtrl* mEditButton;
 
    DECLARE_CONOBJECT(GuiInspectorTypeMaterialAssetPtr);
    static void consoleInit();
 
    virtual GuiControl* constructEditControl();
    virtual bool updateRects();
+
+   virtual void updateValue();
+
+   void updatePreviewImage();
+   void setPreviewImage(StringTableEntry assetId);
 };
 
 class GuiInspectorTypeMaterialAssetId : public GuiInspectorTypeMaterialAssetPtr

+ 126 - 22
Engine/source/T3D/assets/ShapeAsset.cpp

@@ -745,12 +745,15 @@ void GuiInspectorTypeShapeAssetPtr::consoleInit()
 GuiControl* GuiInspectorTypeShapeAssetPtr::constructEditControl()
 {
    // Create base filename edit controls
-   GuiControl *retCtrl = Parent::constructEditControl();
+   GuiControl* retCtrl = Parent::constructEditControl();
    if (retCtrl == NULL)
       return retCtrl;
 
    // Change filespec
    char szBuffer[512];
+
+   const char* previewImage;
+
    if (mInspector->getInspectObject() != nullptr)
    {
       dSprintf(szBuffer, sizeof(szBuffer), "AssetBrowser.showDialog(\"ShapeAsset\", \"AssetBrowser.changeAsset\", %s, %s);",
@@ -758,6 +761,8 @@ GuiControl* GuiInspectorTypeShapeAssetPtr::constructEditControl()
       mBrowseButton->setField("Command", szBuffer);
 
       setDataField(StringTable->insert("targetObject"), NULL, mInspector->getInspectObject()->getIdString());
+
+      previewImage = mInspector->getInspectObject()->getDataField(mCaption, NULL);
    }
    else
    {
@@ -765,52 +770,151 @@ GuiControl* GuiInspectorTypeShapeAssetPtr::constructEditControl()
       dSprintf(szBuffer, sizeof(szBuffer), "AssetBrowser.showDialog(\"ShapeAsset\", \"AssetBrowser.changeAsset\", %s, \"%s\");",
          mInspector->getIdString(), mVariableName);
       mBrowseButton->setField("Command", szBuffer);
+
+      previewImage = Con::getVariable(mVariableName);
    }
 
-   // Create "Open in ShapeEditor" button
-   mShapeEdButton = new GuiBitmapButtonCtrl();
+   mLabel = new GuiTextCtrl();
+   mLabel->registerObject();
+   mLabel->setControlProfile(mProfile);
+   mLabel->setText(mCaption);
+   addObject(mLabel);
+
+   //
+   GuiTextEditCtrl* editTextCtrl = static_cast<GuiTextEditCtrl*>(retCtrl);
+   GuiControlProfile* toolEditProfile;
+   if (Sim::findObject("ToolsGuiTextEditProfile", toolEditProfile))
+      editTextCtrl->setControlProfile(toolEditProfile);
+
+   GuiControlProfile* toolDefaultProfile = nullptr;
+   Sim::findObject("ToolsGuiDefaultProfile", toolDefaultProfile);
+
+   //
+   mPreviewImage = new GuiBitmapCtrl();
+   mPreviewImage->registerObject();
+
+   if (toolDefaultProfile)
+      mPreviewImage->setControlProfile(toolDefaultProfile);
+
+   updatePreviewImage();
+
+   addObject(mPreviewImage);
+
+   //
+   mPreviewBorderButton = new GuiBitmapButtonCtrl();
+   mPreviewBorderButton->registerObject();
+
+   if (toolDefaultProfile)
+      mPreviewBorderButton->setControlProfile(toolDefaultProfile);
+
+   mPreviewBorderButton->_setBitmap(StringTable->insert("ToolsModule:cubemapBtnBorder_n_image"));
+
+   mPreviewBorderButton->setField("Command", szBuffer); //clicking the preview does the same thing as the edit button, for simplicity
+   addObject(mPreviewBorderButton);
+
+   //
+   // Create "Open in Editor" button
+   mEditButton = new GuiBitmapButtonCtrl();
 
    dSprintf(szBuffer, sizeof(szBuffer), "ShapeEditorPlugin.openShapeAssetId(%d.getText());", retCtrl->getId());
-   mShapeEdButton->setField("Command", szBuffer);
+   mEditButton->setField("Command", szBuffer);
+
+   mEditButton->setText("Edit");
+   mEditButton->setSizing(horizResizeLeft, vertResizeAspectTop);
 
-   char bitmapName[512] = "ToolsModule:shape_editor_n_image";
-   mShapeEdButton->setBitmap(StringTable->insert(bitmapName));
+   mEditButton->setDataField(StringTable->insert("Profile"), NULL, "ToolsGuiButtonProfile");
+   mEditButton->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile");
+   mEditButton->setDataField(StringTable->insert("hovertime"), NULL, "1000");
+   mEditButton->setDataField(StringTable->insert("tooltip"), NULL, "Open this asset in the Shape Editor");
 
-   mShapeEdButton->setDataField(StringTable->insert("Profile"), NULL, "GuiButtonProfile");
-   mShapeEdButton->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile");
-   mShapeEdButton->setDataField(StringTable->insert("hovertime"), NULL, "1000");
-   mShapeEdButton->setDataField(StringTable->insert("tooltip"), NULL, "Open this file in the Shape Editor");
+   mEditButton->registerObject();
+   addObject(mEditButton);
 
-   mShapeEdButton->registerObject();
-   addObject(mShapeEdButton);
+   //
+   mUseHeightOverride = true;
+   mHeightOverride = 72;
 
    return retCtrl;
 }
 
 bool GuiInspectorTypeShapeAssetPtr::updateRects()
 {
+   S32 rowSize = 18;
    S32 dividerPos, dividerMargin;
    mInspector->getDivider(dividerPos, dividerMargin);
    Point2I fieldExtent = getExtent();
    Point2I fieldPos = getPosition();
 
-   mCaptionRect.set(0, 0, fieldExtent.x - dividerPos - dividerMargin, fieldExtent.y);
-   mEditCtrlRect.set(fieldExtent.x - dividerPos + dividerMargin, 1, dividerPos - dividerMargin - 34, fieldExtent.y);
+   mEditCtrlRect.set(0, 0, fieldExtent.x, fieldExtent.y);
+   mLabel->resize(Point2I(mProfile->mTextOffset.x, 0), Point2I(fieldExtent.x, rowSize));
+
+   RectI previewRect = RectI(Point2I(mProfile->mTextOffset.x, rowSize), Point2I(50, 50));
+   mPreviewBorderButton->resize(previewRect.point, previewRect.extent);
+   mPreviewImage->resize(previewRect.point, previewRect.extent);
+
+   S32 editPos = previewRect.point.x + previewRect.extent.x + 10;
+   mEdit->resize(Point2I(editPos, rowSize * 1.5), Point2I(fieldExtent.x - editPos - 5, rowSize));
+
+   mEditButton->resize(Point2I(fieldExtent.x - 105, previewRect.point.y + previewRect.extent.y - rowSize), Point2I(100, rowSize));
+
+   mBrowseButton->setHidden(true);
+
+   return true;
+}
+
+void GuiInspectorTypeShapeAssetPtr::updateValue()
+{
+   Parent::updateValue();
+
+   updatePreviewImage();
+}
 
-   bool resized = mEdit->resize(mEditCtrlRect.point, mEditCtrlRect.extent);
-   if (mBrowseButton != NULL)
+void GuiInspectorTypeShapeAssetPtr::updatePreviewImage()
+{
+   const char* previewImage;
+   if (mInspector->getInspectObject() != nullptr)
+      previewImage = mInspector->getInspectObject()->getDataField(mCaption, NULL);
+   else
+      previewImage = Con::getVariable(mVariableName);
+
+   //if what we're working with isn't even a valid asset, don't present like we found a good one
+   if (!AssetDatabase.isDeclaredAsset(previewImage))
    {
-      mBrowseRect.set(fieldExtent.x - 32, 2, 14, fieldExtent.y - 4);
-      resized |= mBrowseButton->resize(mBrowseRect.point, mBrowseRect.extent);
+      mPreviewImage->_setBitmap(StringTable->EmptyString());
+      return;
+   }
+
+   String shpPreviewAssetId = String(previewImage) + "_PreviewImage";
+   shpPreviewAssetId.replace(":", "_");
+   shpPreviewAssetId = "ToolsModule:" + shpPreviewAssetId;
+   if (AssetDatabase.isDeclaredAsset(shpPreviewAssetId.c_str()))
+   {
+      mPreviewImage->setBitmap(StringTable->insert(shpPreviewAssetId.c_str()));
+   }
+
+   if (mPreviewImage->getBitmapAsset().isNull())
+      mPreviewImage->_setBitmap(StringTable->insert("ToolsModule:genericAssetIcon_image"));
+}
+
+void GuiInspectorTypeShapeAssetPtr::setPreviewImage(StringTableEntry assetId)
+{
+   //if what we're working with isn't even a valid asset, don't present like we found a good one
+   if (!AssetDatabase.isDeclaredAsset(assetId))
+   {
+      mPreviewImage->_setBitmap(StringTable->EmptyString());
+      return;
    }
 
-   if (mShapeEdButton != NULL)
+   String shpPreviewAssetId = String(assetId) + "_PreviewImage";
+   shpPreviewAssetId.replace(":", "_");
+   shpPreviewAssetId = "ToolsModule:" + shpPreviewAssetId;
+   if (AssetDatabase.isDeclaredAsset(shpPreviewAssetId.c_str()))
    {
-      RectI shapeEdRect(fieldExtent.x - 16, 2, 14, fieldExtent.y - 4);
-      resized |= mShapeEdButton->resize(shapeEdRect.point, shapeEdRect.extent);
+      mPreviewImage->setBitmap(StringTable->insert(shpPreviewAssetId.c_str()));
    }
 
-   return resized;
+   if (mPreviewImage->getBitmapAsset().isNull())
+      mPreviewImage->_setBitmap(StringTable->insert("ToolsModule:genericAssetIcon_image"));
 }
 
 IMPLEMENT_CONOBJECT(GuiInspectorTypeShapeAssetId);

+ 9 - 1
Engine/source/T3D/assets/ShapeAsset.h

@@ -221,13 +221,21 @@ class GuiInspectorTypeShapeAssetPtr : public GuiInspectorTypeFileName
    typedef GuiInspectorTypeFileName Parent;
 public:
 
-   GuiBitmapButtonCtrl* mShapeEdButton;
+   GuiTextCtrl* mLabel;
+   GuiBitmapButtonCtrl* mPreviewBorderButton;
+   GuiBitmapCtrl* mPreviewImage;
+   GuiButtonCtrl* mEditButton;
 
    DECLARE_CONOBJECT(GuiInspectorTypeShapeAssetPtr);
    static void consoleInit();
 
    virtual GuiControl* constructEditControl();
    virtual bool updateRects();
+
+   virtual void updateValue();
+
+   void updatePreviewImage();
+   void setPreviewImage(StringTableEntry assetId);
 };
 
 class GuiInspectorTypeShapeAssetId : public GuiInspectorTypeShapeAssetPtr

+ 10 - 17
Engine/source/T3D/tsStatic.cpp

@@ -411,8 +411,8 @@ bool TSStatic::_createShape()
    resetWorldBox();
 
    mShapeInstance = new TSShapeInstance(mShape, isClientObject());
-   if (isClientObject())
-      mShapeInstance->cloneMaterialList();
+   mShapeInstance->resetMaterialList();
+   mShapeInstance->cloneMaterialList();
 
    if (isGhost())
    {
@@ -1638,7 +1638,7 @@ void TSStatic::getUtilizedAssets(Vector<StringTableEntry>* usedAssetsList)
 #ifdef TORQUE_TOOLS
 void TSStatic::onInspect(GuiInspector* inspector)
 {
-   if (mShapeAsset == nullptr)
+   //if (mShapeAsset == nullptr)
       return;
 
    //Put the GameObject group before everything that'd be gameobject-effecting, for orginazational purposes
@@ -1649,28 +1649,18 @@ void TSStatic::onInspect(GuiInspector* inspector)
    GuiControl* stack = dynamic_cast<GuiControl*>(materialGroup->findObjectByInternalName(StringTable->insert("Stack")));
 
    //Do this on both the server and client
-   S32 materialCount = mShapeAsset->getShape()->materialList->getMaterialNameList().size(); //mMeshAsset->getMaterialCount();
+   TSMaterialList* matList = mShapeInstance->getMaterialList();
+   Vector<String> matListNames = matList->getMaterialNameList();
+   S32 materialCount = matListNames.size();
 
    if (isServerObject())
    {
-      //we need to update the editor
-      /*for (U32 i = 0; i < mFields.size(); i++)
-      {
-         //find any with the materialslot title and clear them out
-         if (FindMatch::isMatch("MaterialSlot*", mFields[i].mFieldName, false))
-         {
-            setDataField(mFields[i].mFieldName, NULL, "");
-            mFields.erase(i);
-            continue;
-         }
-      }*/
-
       //next, get a listing of our materials in the shape, and build our field list for them
       char matFieldName[128];
 
       for (U32 i = 0; i < materialCount; i++)
       {
-         StringTableEntry materialname = StringTable->insert(mShapeAsset->getShape()->materialList->getMaterialName(i).c_str());
+         StringTableEntry materialname = StringTable->insert(mShapeInstance->getMaterialList()->getMaterialName(i).c_str());
 
          AssetPtr<MaterialAsset> matAsset;
          if(MaterialAsset::getAssetByMaterialName(materialname, &matAsset) == MaterialAsset::Ok)
@@ -1694,6 +1684,9 @@ void TSStatic::onInspect(GuiInspector* inspector)
             {
                StringTableEntry fieldValue = matAsset->getAssetId();
 
+               GuiInspectorTypeMaterialAssetPtr* matFieldPtr = dynamic_cast<GuiInspectorTypeMaterialAssetPtr*>(fieldGui);
+               matFieldPtr->setPreviewImage(fieldValue);
+
                //Check if we'd already actually changed it, and display the modified value
                for (U32 c = 0; c < mChangingMaterials.size(); c++)
                {

+ 0 - 3
Engine/source/gui/controls/guiBitmapCtrl.cpp

@@ -126,9 +126,6 @@ void GuiBitmapCtrl::inspectPostApply()
 
 void GuiBitmapCtrl::setBitmap( const char *name, bool resize )
 {
-   if ( !isAwake() )
-      return;
-
    _setBitmap(StringTable->insert(name));
 
    if (mBitmap && resize)

+ 4 - 8
Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.tscript

@@ -336,17 +336,13 @@ function GuiInspectorTypeImageAssetPtr::onControlDropped( %this, %payload, %posi
       return;
 
    %assetType = %payload.assetType;
+   %module = %payload.moduleName;
+   %assetName = %payload.assetName;
    
    if(%assetType $= "ImageAsset")
    {
-      %module = %payload.moduleName;
-      %asset = %payload.assetName;
-      
-      %oldValue = %this.targetObject.bitmapAsset;
-      %arrayIndex = "";
-      
-      %targetObject = %this.targetObject;
-      %targetObject.bitmapAsset = %module @ ":" @ %asset; 
+      %cmd = %this @ ".apply(\""@ %module @ ":" @ %assetName @ "\");";
+      eval(%cmd);
    }
    
    EWorldEditor.isDirty = true;

+ 0 - 1
Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/material.tscript

@@ -595,7 +595,6 @@ function GuiInspectorTypeMaterialAssetPtr::onControlDropped( %this, %payload, %p
    if(%assetType $= "MaterialAsset")
    {
       %cmd = %this @ ".apply(\""@ %module @ ":" @ %assetName @ "\");";
-      echo("Changing asset via the " @ %cmd @ " command");
       eval(%cmd);
    }
    

+ 4 - 9
Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.tscript

@@ -411,18 +411,13 @@ function GuiInspectorTypeShapeAssetPtr::onControlDropped( %this, %payload, %posi
       return;
 
    %assetType = %payload.assetType;
+   %module = %payload.moduleName;
+   %assetName = %payload.assetName;
    
    if(%assetType $= "ShapeAsset")
    {
-      %module = %payload.moduleName;
-      %asset = %payload.assetName;
-      
-      %oldValue = %this.targetObject.shapeAsset;
-      %arrayIndex = "";
-      
-      %targetObject = %this.targetObject;
-      %targetObject.shapeAsset = %module @ ":" @ %asset;
-
+      %cmd = %this @ ".apply(\""@ %module @ ":" @ %assetName @ "\");";
+      eval(%cmd);
    }
    
    EWorldEditor.isDirty = true;

+ 1 - 1
Templates/BaseGame/game/tools/gui/profiles.ed.tscript

@@ -305,7 +305,7 @@ new GuiControlProfile( ToolsGuiTextEditProfile )
    border = -2; // fix to display textEdit img
    //borderWidth = "1";  // fix to display textEdit img
    //borderColor = "100 100 100";
-   fillColor = EditorSettings.value("Theme/fieldBGColor");
+   fillColor = EditorSettings.value("Theme/dividerDarkColor");
    fillColorHL = "75 75 75 255";
    fillColorSEL = EditorSettings.value("Theme/fieldBGSELColor");