Browse Source

Merge branch 'Preview4_0' of https://github.com/Areloch/Torque3D into alph40_pbrConfig_BREAKINGWip

AzaezelX 5 years ago
parent
commit
062e6f3364
95 changed files with 4024 additions and 1545 deletions
  1. 13 0
      Engine/source/T3D/assets/LevelAsset.cpp
  2. 12 0
      Engine/source/T3D/assets/LevelAsset.h
  3. 67 33
      Engine/source/T3D/assets/TerrainAsset.cpp
  4. 22 7
      Engine/source/T3D/assets/TerrainAsset.h
  5. 1 0
      Engine/source/T3D/assets/TerrainMaterialAsset.h
  6. 25 14
      Engine/source/T3D/fx/lightning.cpp
  7. 2 1
      Engine/source/T3D/lighting/reflectionProbe.cpp
  8. 72 0
      Engine/source/assets/assetBase.cpp
  9. 6 0
      Engine/source/assets/assetBase.h
  10. 29 1
      Engine/source/assets/assetBase_ScriptBinding.h
  11. 1 1
      Engine/source/console/engineFunctions.h
  12. 7 13
      Engine/source/environment/VolumetricFogRTManager.cpp
  13. 1 2
      Engine/source/environment/VolumetricFogRTManager.h
  14. 5 2
      Engine/source/gfx/bitmap/gBitmap.cpp
  15. 36 0
      Engine/source/gui/controls/guiTreeViewCtrl.cpp
  16. 3 0
      Engine/source/gui/controls/guiTreeViewCtrl.h
  17. 0 4
      Engine/source/lighting/advanced/advancedLightBinManager.cpp
  18. 1 1
      Engine/source/materials/materialDefinition.cpp
  19. 28 1
      Engine/source/module/moduleManager.cpp
  20. 73 0
      Engine/source/postFx/postEffectManager.cpp
  21. 3 1
      Engine/source/postFx/postEffectManager.h
  22. 19 1
      Engine/source/renderInstance/renderProbeMgr.cpp
  23. 129 20
      Engine/source/terrain/terrData.cpp
  24. 13 1
      Engine/source/terrain/terrData.h
  25. 1 1
      Engine/source/terrain/terrMaterial.cpp
  26. 1 1
      Engine/source/windowManager/sdl/sdlWindowMgr.cpp
  27. 2 2
      Engine/source/windowManager/win32/win32Window.cpp
  28. 118 2
      Templates/BaseGame/game/core/clientServer/scripts/client/levelDownload.cs
  29. 0 2
      Templates/BaseGame/game/core/clientServer/scripts/server/defaults.cs
  30. 48 9
      Templates/BaseGame/game/core/clientServer/scripts/server/levelDownload.cs
  31. 6 2
      Templates/BaseGame/game/core/clientServer/scripts/server/server.cs
  32. 2 2
      Templates/BaseGame/game/core/gameObjects/materials/materials.cs
  33. BIN
      Templates/BaseGame/game/core/gui/scripts/fonts/Arial 14 (ansi).uft
  34. 15 17
      Templates/BaseGame/game/core/lighting/scripts/advancedLighting_Shaders.cs
  35. 2 2
      Templates/BaseGame/game/core/lighting/scripts/deferredShading.cs
  36. 1 1
      Templates/BaseGame/game/core/lighting/scripts/shadowMaps_Init.cs
  37. 1 1
      Templates/BaseGame/game/core/postFX/scripts/glow.cs
  38. 1 1
      Templates/BaseGame/game/core/postFX/scripts/hdr.cs
  39. 0 2
      Templates/BaseGame/game/core/postFX/scripts/postFx.cs
  40. 4 4
      Templates/BaseGame/game/core/rendering/scripts/gfxData/commonMaterialData.cs
  41. 1 1
      Templates/BaseGame/game/core/rendering/scripts/gfxData/scatterSky.cs
  42. 3 3
      Templates/BaseGame/game/core/rendering/scripts/gfxData/shaders.cs
  43. 1 1
      Templates/BaseGame/game/core/rendering/scripts/gfxData/water.cs
  44. 18 14
      Templates/BaseGame/game/core/rendering/shaders/gl/lighting.glsl
  45. 20 15
      Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl
  46. 21 11
      Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeArrayP.glsl
  47. 0 9
      Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/vectorLightP.glsl
  48. 23 14
      Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl
  49. 1 1
      Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/softShadow.hlsl
  50. 2 11
      Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/vectorLightP.hlsl
  51. 190 4
      Templates/BaseGame/game/core/utility/scripts/module.cs
  52. 2 2
      Templates/BaseGame/game/data/ExampleModule/components/ExampleComponent.cs
  53. 1 1
      Templates/BaseGame/game/data/ui/guis/optionsMenu.cs
  54. 8 1
      Templates/BaseGame/game/data/ui/scripts/displayMenu.cs
  55. 29 29
      Templates/BaseGame/game/tools/assetBrowser/assetImportConfigs.xml
  56. 224 246
      Templates/BaseGame/game/tools/assetBrowser/guis/assetBrowser.gui
  57. 1 1
      Templates/BaseGame/game/tools/assetBrowser/guis/assetImport.gui
  58. 29 0
      Templates/BaseGame/game/tools/assetBrowser/main.cs
  59. 693 137
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.cs
  60. 37 131
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetImport.cs
  61. 6 3
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetImportConfig.cs
  62. 1 1
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/component.cs
  63. 95 0
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/folder.cs
  64. 5 3
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/gui.cs
  65. 1 1
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.cs
  66. 12 2
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/level.cs
  67. 4 4
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/material.cs
  68. 5 3
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/script.cs
  69. 4 2
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.cs
  70. 33 0
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/terrain.cs
  71. 61 0
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/terrainMaterial.cs
  72. 82 33
      Templates/BaseGame/game/tools/assetBrowser/scripts/editAsset.cs
  73. 12 0
      Templates/BaseGame/game/tools/assetBrowser/scripts/newAsset.cs
  74. 100 31
      Templates/BaseGame/game/tools/assetBrowser/scripts/popupMenus.cs
  75. 24 0
      Templates/BaseGame/game/tools/assetBrowser/scripts/templateFiles/terrainMaterial.cs.template
  76. BIN
      Templates/BaseGame/game/tools/base/images/512_forestgreen.png
  77. BIN
      Templates/BaseGame/game/tools/base/images/512_forestgreen_lines.png
  78. 1 1
      Templates/BaseGame/game/tools/gui/EditorLoadingGui.gui
  79. 38 1
      Templates/BaseGame/game/tools/gui/editorSettingsWindow.ed.cs
  80. BIN
      Templates/BaseGame/game/tools/gui/images/folderDown.png
  81. BIN
      Templates/BaseGame/game/tools/gui/images/rightArrowWhite.png
  82. 5 3
      Templates/BaseGame/game/tools/gui/profiles.ed.cs
  83. 174 144
      Templates/BaseGame/game/tools/settings.xml
  84. 16 2
      Templates/BaseGame/game/tools/worldEditor/gui/guiCreateNewTerrainGui.gui
  85. 1095 499
      Templates/BaseGame/game/tools/worldEditor/gui/guiTerrainMaterialDlg.ed.gui
  86. 75 0
      Templates/BaseGame/game/tools/worldEditor/gui/objectBuilderGui.ed.gui
  87. 3 0
      Templates/BaseGame/game/tools/worldEditor/scripts/EditorGui.ed.cs
  88. 1 1
      Templates/BaseGame/game/tools/worldEditor/scripts/editor.ed.cs
  89. 6 0
      Templates/BaseGame/game/tools/worldEditor/scripts/editorPrefs.ed.cs
  90. 61 8
      Templates/BaseGame/game/tools/worldEditor/scripts/interfaces/terrainMaterialDlg.ed.cs
  91. 11 1
      Templates/BaseGame/game/tools/worldEditor/scripts/menuHandlers.ed.cs
  92. 9 9
      Templates/BaseGame/game/tools/worldEditor/scripts/visibility/lightViz.cs
  93. 5 5
      Templates/BaseGame/game/tools/worldEditor/scripts/visibility/miscViz.cs
  94. 1 1
      Templates/BaseGame/game/tools/worldEditor/scripts/visibility/shadowViz.cs
  95. 4 3
      Tools/CMake/cleanup-win.bat.in

+ 13 - 0
Engine/source/T3D/assets/LevelAsset.cpp

@@ -87,6 +87,10 @@ LevelAsset::LevelAsset() : AssetBase(), mIsSubLevel(false)
    mLevelName = StringTable->EmptyString();
    mLevelName = StringTable->EmptyString();
    mLevelFile = StringTable->EmptyString();
    mLevelFile = StringTable->EmptyString();
    mPreviewImage = StringTable->EmptyString();
    mPreviewImage = StringTable->EmptyString();
+   mPostFXPresetFile = StringTable->EmptyString();
+   mDecalsFile = StringTable->EmptyString();
+   mForestFile = StringTable->EmptyString();
+   mNavmeshFile = StringTable->EmptyString();
 
 
    mGamemodeName = StringTable->EmptyString();
    mGamemodeName = StringTable->EmptyString();
    mMainLevelAsset = StringTable->EmptyString();
    mMainLevelAsset = StringTable->EmptyString();
@@ -115,6 +119,15 @@ void LevelAsset::initPersistFields()
    addProtectedField("PreviewImage", TypeAssetLooseFilePath, Offset(mPreviewImage, LevelAsset),
    addProtectedField("PreviewImage", TypeAssetLooseFilePath, Offset(mPreviewImage, LevelAsset),
       &setPreviewImageFile, &getPreviewImageFile, "Path to the image used for selection preview.");
       &setPreviewImageFile, &getPreviewImageFile, "Path to the image used for selection preview.");
 
 
+   addProtectedField("PostFXPresetFile", TypeAssetLooseFilePath, Offset(mPostFXPresetFile, LevelAsset),
+      &setLevelFile, &getLevelFile, "Path to the level's postFXPreset.");
+   addProtectedField("DecalsFile", TypeAssetLooseFilePath, Offset(mDecalsFile, LevelAsset),
+      &setLevelFile, &getLevelFile, "Path to the decals cache file.");
+   addProtectedField("ForestFile", TypeAssetLooseFilePath, Offset(mForestFile, LevelAsset),
+      &setLevelFile, &getLevelFile, "Path to the Forest cache file.");
+   addProtectedField("NavmeshFile", TypeAssetLooseFilePath, Offset(mNavmeshFile, LevelAsset),
+      &setLevelFile, &getLevelFile, "Path to the navmesh file.");
+
    addField("isSubScene", TypeBool, Offset(mIsSubLevel, LevelAsset), "Is this a sublevel to another Scene");
    addField("isSubScene", TypeBool, Offset(mIsSubLevel, LevelAsset), "Is this a sublevel to another Scene");
    addField("gameModeName", TypeString, Offset(mGamemodeName, LevelAsset), "Name of the Game Mode to be used with this level");
    addField("gameModeName", TypeString, Offset(mGamemodeName, LevelAsset), "Name of the Game Mode to be used with this level");
 }
 }

+ 12 - 0
Engine/source/T3D/assets/LevelAsset.h

@@ -46,6 +46,10 @@ class LevelAsset : public AssetBase
 
 
    StringTableEntry        mLevelName;
    StringTableEntry        mLevelName;
    StringTableEntry        mLevelFile;
    StringTableEntry        mLevelFile;
+   StringTableEntry        mPostFXPresetFile;
+   StringTableEntry        mDecalsFile;
+   StringTableEntry        mForestFile;
+   StringTableEntry        mNavmeshFile;
    StringTableEntry        mPreviewImage;
    StringTableEntry        mPreviewImage;
 
 
    bool                    mIsSubLevel;
    bool                    mIsSubLevel;
@@ -66,6 +70,14 @@ public:
 
 
    void                    setLevelFile(const char* pImageFile);
    void                    setLevelFile(const char* pImageFile);
    inline StringTableEntry getLevelFile(void) const { return mLevelFile; };
    inline StringTableEntry getLevelFile(void) const { return mLevelFile; };
+   void                    setPostFXPresetFile(const char* pPostFXPresetFile);
+   inline StringTableEntry getPostFXPresetFile(void) const { return mPostFXPresetFile; };
+   void                    setDecalsFile(const char* pDecalsFile);
+   inline StringTableEntry getDecalsFile(void) const { return mDecalsFile; };
+   void                    setForestFile(const char* pForestFile);
+   inline StringTableEntry getForestFile(void) const { return mForestFile; };
+   void                    setNavmeshFile(const char* pNavmeshFile);
+   inline StringTableEntry getNavmeshFile(void) const { return mNavmeshFile; };
    void                    setImageFile(const char* pImageFile);
    void                    setImageFile(const char* pImageFile);
    inline StringTableEntry getImageFile(void) const { return mPreviewImage; };
    inline StringTableEntry getImageFile(void) const { return mPreviewImage; };
 
 

+ 67 - 33
Engine/source/T3D/assets/TerrainAsset.cpp

@@ -40,6 +40,8 @@
 #include "assets/assetPtr.h"
 #include "assets/assetPtr.h"
 #endif
 #endif
 
 
+#include "T3D/assets/TerrainMaterialAsset.h"
+
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 
 
 IMPLEMENT_CONOBJECT(TerrainAsset);
 IMPLEMENT_CONOBJECT(TerrainAsset);
@@ -89,7 +91,7 @@ ConsoleSetType(TypeTerrainAssetPtr)
 
 
 TerrainAsset::TerrainAsset()
 TerrainAsset::TerrainAsset()
 {
 {
-   mTerrainFile = StringTable->EmptyString();
+   mTerrainFilePath = StringTable->EmptyString();
 }
 }
 
 
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
@@ -106,8 +108,22 @@ void TerrainAsset::initPersistFields()
    Parent::initPersistFields();
    Parent::initPersistFields();
 
 
    //addField("shaderGraph", TypeRealString, Offset(mShaderGraphFile, TerrainAsset), "");
    //addField("shaderGraph", TypeRealString, Offset(mShaderGraphFile, TerrainAsset), "");
-   addProtectedField("terrainFile", TypeAssetLooseFilePath, Offset(mTerrainFile, TerrainAsset),
-      &setTerrainFile, &getTerrainFile, "Path to the file containing the terrain data.");
+   addProtectedField("terrainFile", TypeAssetLooseFilePath, Offset(mTerrainFilePath, TerrainAsset),
+      &setTerrainFilePath, &getTerrainFilePath, "Path to the file containing the terrain data.");
+}
+
+void TerrainAsset::setDataField(StringTableEntry slotName, const char* array, const char* value)
+{
+   Parent::setDataField(slotName, array, value);
+
+   //Now, if it's a material slot of some fashion, set it up
+   StringTableEntry matSlotName = StringTable->insert("terrainMaterialAsset");
+   if (String(slotName).startsWith(matSlotName))
+   {
+      StringTableEntry matId = StringTable->insert(value);
+
+      mTerrMaterialAssetIds.push_back(matId);
+   }
 }
 }
 
 
 void TerrainAsset::initializeAsset()
 void TerrainAsset::initializeAsset()
@@ -115,22 +131,20 @@ void TerrainAsset::initializeAsset()
    // Call parent.
    // Call parent.
    Parent::initializeAsset();
    Parent::initializeAsset();
 
 
-   if (!Platform::isFullPath(mTerrainFile))
-      mTerrainFile = getOwned() ? expandAssetFilePath(mTerrainFile) : mTerrainFile;
+   if (!Platform::isFullPath(mTerrainFilePath))
+      mTerrainFilePath = getOwned() ? expandAssetFilePath(mTerrainFilePath) : mTerrainFilePath;
 
 
-   //if (Platform::isFile(mTerrainFile))
-   //   Con::executeFile(mScriptFile, false, false);
+   loadTerrain();
 }
 }
 
 
 void TerrainAsset::onAssetRefresh()
 void TerrainAsset::onAssetRefresh()
 {
 {
-   mTerrainFile = expandAssetFilePath(mTerrainFile);
+   mTerrainFilePath = expandAssetFilePath(mTerrainFilePath);
 
 
-   //if (Platform::isFile(mScriptFile))
-   //   Con::executeFile(mScriptFile, false, false);
+   loadTerrain();
 }
 }
 
 
-void TerrainAsset::setTerrainFile(const char* pScriptFile)
+void TerrainAsset::setTerrainFilePath(const char* pScriptFile)
 {
 {
    // Sanity!
    // Sanity!
    AssertFatal(pScriptFile != NULL, "Cannot use a NULL script file.");
    AssertFatal(pScriptFile != NULL, "Cannot use a NULL script file.");
@@ -139,12 +153,52 @@ void TerrainAsset::setTerrainFile(const char* pScriptFile)
    pScriptFile = StringTable->insert(pScriptFile);
    pScriptFile = StringTable->insert(pScriptFile);
 
 
    // Update.
    // Update.
-   mTerrainFile = getOwned() ? expandAssetFilePath(pScriptFile) : pScriptFile;
+   mTerrainFilePath = getOwned() ? expandAssetFilePath(pScriptFile) : pScriptFile;
 
 
    // Refresh the asset.
    // Refresh the asset.
    refreshAsset();
    refreshAsset();
 }
 }
 
 
+bool TerrainAsset::loadTerrain()
+{
+   mTerrMaterialAssets.clear();
+   mTerrMaterialAssetIds.clear();
+
+   //First, load any material, animation, etc assets we may be referencing in our asset
+   // Find any asset dependencies.
+   AssetManager::typeAssetDependsOnHash::Iterator assetDependenciesItr = mpOwningAssetManager->getDependedOnAssets()->find(mpAssetDefinition->mAssetId);
+
+   // Does the asset have any dependencies?
+   if (assetDependenciesItr != mpOwningAssetManager->getDependedOnAssets()->end())
+   {
+      // Iterate all dependencies.
+      while (assetDependenciesItr != mpOwningAssetManager->getDependedOnAssets()->end() && assetDependenciesItr->key == mpAssetDefinition->mAssetId)
+      {
+         StringTableEntry assetType = mpOwningAssetManager->getAssetType(assetDependenciesItr->value);
+
+         if (assetType == StringTable->insert("TerrainMaterialAsset"))
+         {
+            mTerrMaterialAssetIds.push_front(assetDependenciesItr->value);
+
+            //Force the asset to become initialized if it hasn't been already
+            AssetPtr<TerrainMaterialAsset> matAsset = assetDependenciesItr->value;
+
+            mTerrMaterialAssets.push_front(matAsset);
+         }
+
+         // Next dependency.
+         assetDependenciesItr++;
+      }
+   }
+
+   mTerrainFile = ResourceManager::get().load(mTerrainFilePath);
+
+   if (mTerrainFile)
+      return true;
+
+   return false;
+}
+
 //------------------------------------------------------------------------------
 //------------------------------------------------------------------------------
 
 
 void TerrainAsset::copyTo(SimObject* object)
 void TerrainAsset::copyTo(SimObject* object)
@@ -190,7 +244,7 @@ GuiControl* GuiInspectorTypeTerrainAssetPtr::constructEditControl()
 
 
    TerrainAsset* matAsset = AssetDatabase.acquireAsset< TerrainAsset>(matAssetId);
    TerrainAsset* matAsset = AssetDatabase.acquireAsset< TerrainAsset>(matAssetId);
 
 
-   TerrainMaterial* materialDef = nullptr;
+   //TerrainMaterial* materialDef = nullptr;
 
 
    char bitmapName[512] = "tools/worldEditor/images/toolbar/shape-editor";
    char bitmapName[512] = "tools/worldEditor/images/toolbar/shape-editor";
 
 
@@ -268,23 +322,3 @@ bool GuiInspectorTypeTerrainAssetPtr::updateRects()
 
 
    return resized;
    return resized;
 }
 }
-
-void GuiInspectorTypeTerrainAssetPtr::setMaterialAsset(String assetId)
-{
-   mTargetObject->setDataField(mCaption, "", assetId);
-
-   //force a refresh
-   SimObject* obj = mInspector->getInspectObject();
-   mInspector->inspectObject(obj);
-}
-
-DefineEngineMethod(GuiInspectorTypeTerrainAssetPtr, setMaterialAsset, void, (String assetId), (""),
-   "Gets a particular shape animation asset for this shape.\n"
-   "@param animation asset index.\n"
-   "@return Shape Animation Asset.\n")
-{
-   if (assetId == String::EmptyString)
-      return;
-
-   return object->setMaterialAsset(assetId);
-}

+ 22 - 7
Engine/source/T3D/assets/TerrainAsset.h

@@ -19,6 +19,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 // IN THE SOFTWARE.
 // IN THE SOFTWARE.
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
+#pragma once
 #ifndef TERRAINASSET_H
 #ifndef TERRAINASSET_H
 #define TERRAINASSET_H
 #define TERRAINASSET_H
 
 
@@ -46,14 +47,23 @@
 #include "gui/editor/guiInspectorTypes.h"
 #include "gui/editor/guiInspectorTypes.h"
 #endif
 #endif
 
 
-#include "terrain/terrData.h"
+//#include "terrain/terrData.h"
+#include "assets/assetPtr.h"
+#include "terrain/terrFile.h"
+
+class TerrainMaterialAsset;
 
 
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 class TerrainAsset : public AssetBase
 class TerrainAsset : public AssetBase
 {
 {
    typedef AssetBase Parent;
    typedef AssetBase Parent;
 
 
-   StringTableEntry        mTerrainFile;
+   StringTableEntry        mTerrainFilePath;
+   Resource<TerrainFile>   mTerrainFile;
+
+   //Material assets we're dependent on and use
+   Vector<StringTableEntry> mTerrMaterialAssetIds;
+   Vector<AssetPtr<TerrainMaterialAsset>> mTerrMaterialAssets;
 
 
 public:
 public:
    TerrainAsset();
    TerrainAsset();
@@ -63,8 +73,14 @@ public:
    static void initPersistFields();
    static void initPersistFields();
    virtual void copyTo(SimObject* object);
    virtual void copyTo(SimObject* object);
 
 
-   void                    setTerrainFile(const char* pTerrainFile);
-   inline StringTableEntry getTerrainFile(void) const { return mTerrainFile; };
+   virtual void setDataField(StringTableEntry slotName, const char* array, const char* value);
+
+   void                    setTerrainFilePath(const char* pTerrainFile);
+   inline StringTableEntry getTerrainFilePath(void) const { return mTerrainFilePath; };
+
+   inline Resource<TerrainFile> getTerrainResource(void) const { return mTerrainFile; };
+
+   bool loadTerrain();
 
 
    /// Declare Console Object.
    /// Declare Console Object.
    DECLARE_CONOBJECT(TerrainAsset);
    DECLARE_CONOBJECT(TerrainAsset);
@@ -73,8 +89,8 @@ protected:
    virtual void initializeAsset();
    virtual void initializeAsset();
    virtual void onAssetRefresh(void);
    virtual void onAssetRefresh(void);
 
 
-   static bool setTerrainFile(void *obj, const char *index, const char *data) { static_cast<TerrainAsset*>(obj)->setTerrainFile(data); return false; }
-   static const char* getTerrainFile(void* obj, const char* data) { return static_cast<TerrainAsset*>(obj)->getTerrainFile(); }
+   static bool setTerrainFilePath(void *obj, const char *index, const char *data) { static_cast<TerrainAsset*>(obj)->setTerrainFilePath(data); return false; }
+   static const char* getTerrainFilePath(void* obj, const char* data) { return static_cast<TerrainAsset*>(obj)->getTerrainFilePath(); }
 };
 };
 
 
 DefineConsoleType(TypeTerrainAssetPtr, TerrainAsset)
 DefineConsoleType(TypeTerrainAssetPtr, TerrainAsset)
@@ -96,7 +112,6 @@ public:
 
 
    virtual GuiControl* constructEditControl();
    virtual GuiControl* constructEditControl();
    virtual bool updateRects();
    virtual bool updateRects();
-   void setMaterialAsset(String assetId);
 };
 };
 
 
 #endif // _ASSET_BASE_H_
 #endif // _ASSET_BASE_H_

+ 1 - 0
Engine/source/T3D/assets/TerrainMaterialAsset.h

@@ -19,6 +19,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 // IN THE SOFTWARE.
 // IN THE SOFTWARE.
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
+#pragma once
 #ifndef TERRAINMATERIALASSET_H
 #ifndef TERRAINMATERIALASSET_H
 #define TERRAINMATERIALASSET_H
 #define TERRAINMATERIALASSET_H
 
 

+ 25 - 14
Engine/source/T3D/fx/lightning.cpp

@@ -240,9 +240,15 @@ LightningData::LightningData()
 {
 {
    strikeSound = NULL;
    strikeSound = NULL;
 
 
-   dMemset( strikeTextureNames, 0, sizeof( strikeTextureNames ) );
-   dMemset( strikeTextures, 0, sizeof( strikeTextures ) );
-   dMemset( thunderSounds, 0, sizeof( thunderSounds ) );
+   for (S32 i = 0; i < MaxThunders; i++)
+      thunderSounds[i] = NULL;
+
+   for (S32 i = 0; i < MaxTextures; i++)
+   {
+      strikeTextureNames[i] = NULL;
+      strikeTextures[i] = NULL;
+   }
+
    mNumStrikeTextures = 0;
    mNumStrikeTextures = 0;
 }
 }
 
 
@@ -282,9 +288,10 @@ bool LightningData::preload(bool server, String &errorStr)
    if (Parent::preload(server, errorStr) == false)
    if (Parent::preload(server, errorStr) == false)
       return false;
       return false;
 
 
-   dQsort(thunderSounds, MaxThunders, sizeof(SFXTrack*), cmpSounds);
-   for (numThunders = 0; numThunders < MaxThunders && thunderSounds[numThunders] != NULL; numThunders++) {
-      //
+   //dQsort(thunderSounds, MaxThunders, sizeof(SFXTrack*), cmpSounds);
+
+   for (S32 i = 0; i < MaxThunders; i++) {
+	   if (thunderSounds[i]!= NULL) numThunders++;
    }
    }
 
 
    if (server == false) 
    if (server == false) 
@@ -321,14 +328,15 @@ void LightningData::packData(BitStream* stream)
 
 
    U32 i;
    U32 i;
    for (i = 0; i < MaxThunders; i++)
    for (i = 0; i < MaxThunders; i++)
-      sfxWrite( stream, thunderSounds[ i ] );
+   {
+      if (stream->writeFlag(thunderSounds[i]))
+         sfxWrite(stream, thunderSounds[i]);
+   }
 
 
    stream->writeInt(mNumStrikeTextures, 4);
    stream->writeInt(mNumStrikeTextures, 4);
 
 
-   for (i = 0; i < MaxTextures; i++) 
-   {
+   for (i = 0; i < MaxTextures; i++)
       stream->writeString(strikeTextureNames[i]);
       stream->writeString(strikeTextureNames[i]);
-   }
 
 
    sfxWrite( stream, strikeSound );
    sfxWrite( stream, strikeSound );
 }
 }
@@ -339,14 +347,17 @@ void LightningData::unpackData(BitStream* stream)
 
 
    U32 i;
    U32 i;
    for (i = 0; i < MaxThunders; i++)
    for (i = 0; i < MaxThunders; i++)
-      sfxRead( stream, &thunderSounds[ i ] );
+   {
+      if (stream->readFlag())
+         sfxRead(stream, &thunderSounds[i]);
+      else
+         thunderSounds[i] = NULL;
+   }
 
 
    mNumStrikeTextures = stream->readInt(4);
    mNumStrikeTextures = stream->readInt(4);
 
 
-   for (i = 0; i < MaxTextures; i++) 
-   {
+   for (i = 0; i < MaxTextures; i++)
       strikeTextureNames[i] = stream->readSTString();
       strikeTextureNames[i] = stream->readSTString();
-   }
 
 
    sfxRead( stream, &strikeSound );
    sfxRead( stream, &strikeSound );
 }
 }

+ 2 - 1
Engine/source/T3D/lighting/reflectionProbe.cpp

@@ -963,7 +963,8 @@ void ReflectionProbe::_onRenderViz(ObjectRenderInst *ri,
    desc.setZReadWrite(true, false);
    desc.setZReadWrite(true, false);
    desc.setCullMode(GFXCullNone);
    desc.setCullMode(GFXCullNone);
    desc.setBlend(true);
    desc.setBlend(true);
-   desc.fillMode = GFXFillWireframe;
+   //desc.fillMode = GFXFillWireframe;
+
    // Base the sphere color on the light color.
    // Base the sphere color on the light color.
    ColorI color = ColorI(255, 0, 255, 63);
    ColorI color = ColorI(255, 0, 255, 63);
 
 

+ 72 - 0
Engine/source/assets/assetBase.cpp

@@ -284,6 +284,78 @@ void AssetBase::refreshAsset(void)
 
 
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 
 
+S32 AssetBase::getAssetDependencyFieldCount(const char* pFieldName)
+{
+   S32 matchedFieldCount = 0;
+   SimFieldDictionary* fieldDictionary = getFieldDictionary();
+   for (SimFieldDictionaryIterator itr(fieldDictionary); *itr; ++itr)
+   {
+      SimFieldDictionary::Entry* entry = *itr;
+
+      if (String(entry->slotName).startsWith(pFieldName))
+      {
+         matchedFieldCount++;
+      }
+   }
+
+   return matchedFieldCount;
+}
+
+//-----------------------------------------------------------------------------
+
+void AssetBase::clearAssetDependencyFields(const char* pFieldName)
+{
+   SimFieldDictionary* fieldDictionary = getFieldDictionary();
+   for (SimFieldDictionaryIterator itr(fieldDictionary); *itr; ++itr)
+   {
+      SimFieldDictionary::Entry* entry = *itr;
+
+      if (String(entry->slotName).startsWith(pFieldName))
+      {
+         setDataField(entry->slotName, NULL, "");
+      }
+   }
+}
+
+//-----------------------------------------------------------------------------
+
+void AssetBase::addAssetDependencyField(const char* pFieldName, const char* pAssetId)
+{
+   U32 existingFieldCount = getAssetDependencyFieldCount(pFieldName);
+
+   //we have a match!
+   char depSlotName[50];
+   dSprintf(depSlotName, sizeof(depSlotName), "%s%d", pFieldName, existingFieldCount);
+
+   char depValue[255];
+   dSprintf(depValue, sizeof(depValue), "@Asset=%s", pAssetId);
+
+   setDataField(StringTable->insert(depSlotName), NULL, StringTable->insert(depValue));
+}
+
+//-----------------------------------------------------------------------------
+bool AssetBase::saveAsset()
+{
+   // Set the format mode.
+   Taml taml;
+
+   // Yes, so set it.
+   taml.setFormatMode(Taml::getFormatModeEnum("xml"));
+
+   // Turn-off auto-formatting.
+   taml.setAutoFormat(false);
+
+   // Read object.
+   bool success = taml.write(this, AssetDatabase.getAssetFilePath(getAssetId()));
+
+   if (!success)
+      return false;
+
+   return true;
+}
+
+//-----------------------------------------------------------------------------
+
 void AssetBase::acquireAssetReference(void)
 void AssetBase::acquireAssetReference(void)
 {
 {
    // Acquired the acquired reference count.
    // Acquired the acquired reference count.

+ 6 - 0
Engine/source/assets/assetBase.h

@@ -104,6 +104,12 @@ public:
 
 
    void                    refreshAsset(void);
    void                    refreshAsset(void);
 
 
+   S32 getAssetDependencyFieldCount(const char* pFieldName);
+   void clearAssetDependencyFields(const char* pFieldName);
+   void addAssetDependencyField(const char* pFieldName, const char* pAssetId);
+
+   bool saveAsset();
+
    /// Declare Console Object.
    /// Declare Console Object.
    DECLARE_CONOBJECT(AssetBase);
    DECLARE_CONOBJECT(AssetBase);
 
 

+ 29 - 1
Engine/source/assets/assetBase_ScriptBinding.h

@@ -1,4 +1,4 @@
-//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 // Copyright (c) 2013 GarageGames, LLC
 // Copyright (c) 2013 GarageGames, LLC
 //
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -39,3 +39,31 @@ DefineEngineMethod(AssetBase, getAssetId, String, (), ,
 {
 {
     return object->getAssetId();
     return object->getAssetId();
 }
 }
+
+DefineEngineMethod(AssetBase, getAssetDependencyFieldCount, S32, (const char* pFieldName), (""),
+   "Gets the assets' Asset Id.  This is only available if the asset was acquired from the asset manager.\n"
+   "@return The assets' Asset Id.\n")
+{
+   return object->getAssetDependencyFieldCount(pFieldName);
+}
+
+DefineEngineMethod(AssetBase, clearAssetDependencyFields, void, (const char* pFieldName), (""),
+   "Gets the assets' Asset Id.  This is only available if the asset was acquired from the asset manager.\n"
+   "@return The assets' Asset Id.\n")
+{
+   object->clearAssetDependencyFields(pFieldName);
+}
+
+DefineEngineMethod(AssetBase, addAssetDependencyField, void, (const char* pFieldName, const char* pAssetId), ("", ""),
+   "Gets the assets' Asset Id.  This is only available if the asset was acquired from the asset manager.\n"
+   "@return The assets' Asset Id.\n")
+{
+   object->addAssetDependencyField(pFieldName, pAssetId);
+}
+
+DefineEngineMethod(AssetBase, saveAsset, bool, (), ,
+   "Gets the assets' Asset Id.  This is only available if the asset was acquired from the asset manager.\n"
+   "@return The assets' Asset Id.\n")
+{
+   return object->saveAsset();
+}

+ 1 - 1
Engine/source/console/engineFunctions.h

@@ -113,7 +113,7 @@ private:
       std::tie(std::get<I + (sizeof...(ArgTs) - sizeof...(TailTs))>(args)...) = defaultArgs;
       std::tie(std::get<I + (sizeof...(ArgTs) - sizeof...(TailTs))>(args)...) = defaultArgs;
    }
    }
    
    
-#if defined(_MSC_VER) && (_MSC_VER >= 1910)
+#if defined(_MSC_VER) && (_MSC_VER >= 1910) && (_MSC_VER < 1920)
    template<typename ...TailTs>
    template<typename ...TailTs>
    struct DodgyVCHelper
    struct DodgyVCHelper
    {
    {

+ 7 - 13
Engine/source/environment/VolumetricFogRTManager.cpp

@@ -109,7 +109,7 @@ VolumetricFogRTManager::~VolumetricFogRTManager()
 void VolumetricFogRTManager::onSceneRemove()
 void VolumetricFogRTManager::onSceneRemove()
 {
 {
    if (mIsInitialized)
    if (mIsInitialized)
-      mPlatformWindow->getScreenResChangeSignal().remove(this, &VolumetricFogRTManager::ResizeRT);
+      mPlatformWindow->resizeEvent.remove(this, &VolumetricFogRTManager::ResizeRT);
 }
 }
    
    
 void VolumetricFogRTManager::onRemove()
 void VolumetricFogRTManager::onRemove()
@@ -148,7 +148,7 @@ bool VolumetricFogRTManager::Init()
    }
    }
    
    
    mPlatformWindow = cv->getPlatformWindow();
    mPlatformWindow = cv->getPlatformWindow();
-   mPlatformWindow->getScreenResChangeSignal().notify(this,&VolumetricFogRTManager::ResizeRT);
+   mPlatformWindow->resizeEvent.notify(this,&VolumetricFogRTManager::ResizeRT);
    
    
    if (mTargetScale < 1 || GFX->getAdapterType() == Direct3D11)
    if (mTargetScale < 1 || GFX->getAdapterType() == Direct3D11)
       mTargetScale = 1;
       mTargetScale = 1;
@@ -205,22 +205,17 @@ U32 VolumetricFogRTManager::DecFogObjects()
    return mNumFogObjects;
    return mNumFogObjects;
 }
 }
    
    
-void VolumetricFogRTManager::ResizeRT(PlatformWindow* win,bool resize)
+void VolumetricFogRTManager::ResizeRT( WindowId did, S32 width, S32 height )
 {
 {
-   mFogHasAnswered = 0;
    smVolumetricFogRTMResizeSignal.trigger(this, true);
    smVolumetricFogRTMResizeSignal.trigger(this, true);
 }
 }
    
    
 void VolumetricFogRTManager::FogAnswered()
 void VolumetricFogRTManager::FogAnswered()
 {
 {
-   mFogHasAnswered++;
-   if (mFogHasAnswered == mNumFogObjects)
-   {
-      if (Resize())
-         smVolumetricFogRTMResizeSignal.trigger(this, false);
-      else
-         Con::errorf("VolumetricFogRTManager::FogAnswered - Error resizing rendertargets!");
-   }
+   if (Resize())
+      smVolumetricFogRTMResizeSignal.trigger(this, false);
+   else
+      Con::errorf("VolumetricFogRTManager::FogAnswered - Error resizing rendertargets!");
 }
 }
    
    
 bool VolumetricFogRTManager::Resize()
 bool VolumetricFogRTManager::Resize()
@@ -279,7 +274,6 @@ S32 VolumetricFogRTManager::setQuality(U32 Quality)
    
    
    mTargetScale = Quality;
    mTargetScale = Quality;
    
    
-   mFogHasAnswered = 0;
    smVolumetricFogRTMResizeSignal.trigger(this, true);
    smVolumetricFogRTMResizeSignal.trigger(this, true);
    
    
    return mTargetScale;
    return mTargetScale;

+ 1 - 2
Engine/source/environment/VolumetricFogRTManager.h

@@ -59,13 +59,12 @@ class VolumetricFogRTManager : public SceneObject
       static S32 mTargetScale;
       static S32 mTargetScale;
       bool mIsInitialized;
       bool mIsInitialized;
       U32 mNumFogObjects;
       U32 mNumFogObjects;
-      U32 mFogHasAnswered;
       U32 mWidth;
       U32 mWidth;
       U32 mHeight;
       U32 mHeight;
    
    
       void onRemove();
       void onRemove();
       void onSceneRemove();
       void onSceneRemove();
-      void ResizeRT(PlatformWindow *win, bool resize);
+      void ResizeRT(WindowId did, S32 width, S32 height);
    
    
       static VolumetricFogRTMResizeSignal smVolumetricFogRTMResizeSignal;
       static VolumetricFogRTMResizeSignal smVolumetricFogRTMResizeSignal;
 
 

+ 5 - 2
Engine/source/gfx/bitmap/gBitmap.cpp

@@ -862,7 +862,10 @@ U8 GBitmap::getChanelValueAt(U32 x, U32 y, U32 chan)
 {
 {
    ColorI pixelColor = ColorI(255,255,255,255);
    ColorI pixelColor = ColorI(255,255,255,255);
    getColor(x, y, pixelColor);
    getColor(x, y, pixelColor);
-
+   if (mInternalFormat == GFXFormatL16)
+   {
+      chan = 0;
+   }
    switch (chan) {
    switch (chan) {
    case 0: return pixelColor.red;
    case 0: return pixelColor.red;
    case 1: return pixelColor.green;
    case 1: return pixelColor.green;
@@ -1323,7 +1326,7 @@ U32 GBitmap::getSurfaceSize(const U32 mipLevel) const
    if (mInternalFormat >= GFXFormatBC1 && mInternalFormat <= GFXFormatBC3)
    if (mInternalFormat >= GFXFormatBC1 && mInternalFormat <= GFXFormatBC3)
    {
    {
       // From the directX docs:
       // From the directX docs:
-      // max(1, width ÷ 4) x max(1, height ÷ 4) x 8(DXT1) or 16(DXT2-5)
+      // max(1, width ÷ 4) x max(1, height ÷ 4) x 8(DXT1) or 16(DXT2-5)
 
 
       U32 sizeMultiple = 0;
       U32 sizeMultiple = 0;
 
 

+ 36 - 0
Engine/source/gui/controls/guiTreeViewCtrl.cpp

@@ -1176,6 +1176,10 @@ void GuiTreeViewCtrl::_buildItem( Item* item, U32 tabLevel, bool bForceFullUpdat
    else
    else
       item->mState.clear( Item::Filtered );
       item->mState.clear( Item::Filtered );
 
 
+   //If the item should be hidden from view, check now
+   if (mHiddenItemsList.contains(item->mId))
+      item->mState.set(Item::Filtered);
+
    // Is this the root item?
    // Is this the root item?
    const bool isRoot = item == mRoot;
    const bool isRoot = item == mRoot;
 
 
@@ -4477,6 +4481,18 @@ void GuiTreeViewCtrl::setItemFilterException(U32 item, bool isExempted)
    }
    }
 }
 }
 
 
+void GuiTreeViewCtrl::setItemHidden(U32 item, bool isHidden)
+{
+   if (isHidden)
+   {
+      mHiddenItemsList.push_back(item);
+   }
+   else
+   {
+      mHiddenItemsList.remove(item);
+   }
+}
+
 void GuiTreeViewCtrl::reparentItems(Vector<Item*> selectedItems, Item* newParent)
 void GuiTreeViewCtrl::reparentItems(Vector<Item*> selectedItems, Item* newParent)
 {
 {
    for (S32 i = 0; i < selectedItems.size(); i++)
    for (S32 i = 0; i < selectedItems.size(); i++)
@@ -5651,6 +5667,26 @@ DefineEngineMethod(GuiTreeViewCtrl, setItemFilterException, void, (U32 item, boo
 {
 {
    object->setItemFilterException(item, isExempt);
    object->setItemFilterException(item, isExempt);
 }
 }
+
+DefineEngineMethod(GuiTreeViewCtrl, setItemHidden, void, (U32 item, bool hidden), (0, true),
+   "Set the pattern by which to filter items in the tree.  Only items in the tree whose text "
+   "matches this pattern are displayed.\n\n"
+   "@param pattern New pattern based on which visible items in the tree should be filtered.  If empty, all items become visible.\n\n"
+   "@see getFilterText\n"
+   "@see clearFilterText")
+{
+   object->setItemHidden(item, hidden);
+}
+
+DefineEngineMethod(GuiTreeViewCtrl, clearHiddenItems, void, (),,
+   "Set the pattern by which to filter items in the tree.  Only items in the tree whose text "
+   "matches this pattern are displayed.\n\n"
+   "@param pattern New pattern based on which visible items in the tree should be filtered.  If empty, all items become visible.\n\n"
+   "@see getFilterText\n"
+   "@see clearFilterText")
+{
+   object->clearHiddenItems();
+}
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 
 
 DefineEngineMethod( GuiTreeViewCtrl, clearFilterText, void, (),,
 DefineEngineMethod( GuiTreeViewCtrl, clearFilterText, void, (),,

+ 3 - 0
Engine/source/gui/controls/guiTreeViewCtrl.h

@@ -360,6 +360,7 @@ class GuiTreeViewCtrl : public GuiArrayCtrl
       bool mDoFilterChildren;
       bool mDoFilterChildren;
 
 
       Vector<U32> mItemFilterExceptionList;
       Vector<U32> mItemFilterExceptionList;
+      Vector<U32> mHiddenItemsList;
 
 
       /// If true, a trace of actions taken by the control is logged to the console.  Can
       /// If true, a trace of actions taken by the control is logged to the console.  Can
       /// be turned on with the setDebug() script method.
       /// be turned on with the setDebug() script method.
@@ -578,6 +579,8 @@ class GuiTreeViewCtrl : public GuiArrayCtrl
 
 
       void setFilterChildren(bool doFilter) { mDoFilterChildren = doFilter; }
       void setFilterChildren(bool doFilter) { mDoFilterChildren = doFilter; }
       void setItemFilterException(U32 item, bool isExempt);
       void setItemFilterException(U32 item, bool isExempt);
+      void setItemHidden(U32 item, bool isHidden);
+      void clearHiddenItems() { mHiddenItemsList.clear(); }
 
 
       /// Clear the current item filtering pattern.
       /// Clear the current item filtering pattern.
       void clearFilterText() { setFilterText( String::EmptyString ); }
       void clearFilterText() { setFilterText( String::EmptyString ); }

+ 0 - 4
Engine/source/lighting/advanced/advancedLightBinManager.cpp

@@ -447,10 +447,6 @@ AdvancedLightBinManager::LightMaterialInfo* AdvancedLightBinManager::_getLightMa
       if ( smPSSMDebugRender )
       if ( smPSSMDebugRender )
          shadowMacros.push_back( GFXShaderMacro( "PSSM_DEBUG_RENDER" ) );
          shadowMacros.push_back( GFXShaderMacro( "PSSM_DEBUG_RENDER" ) );
 
 
-      // If its a vector light see if we can enable SSAO.
-      if ( lightType == LightInfo::Vector && smUseSSAOMask )
-         shadowMacros.push_back( GFXShaderMacro( "USE_SSAO_MASK" ) );
-
       // Now create the material info object.
       // Now create the material info object.
       info = new LightMaterialInfo( lightMatName, smLightMatVertex[ lightType ], shadowMacros );
       info = new LightMaterialInfo( lightMatName, smLightMatVertex[ lightType ], shadowMacros );
    }
    }

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

@@ -187,7 +187,7 @@ Material::Material()
    dMemset(mCellLayout, 0, sizeof(mCellLayout));
    dMemset(mCellLayout, 0, sizeof(mCellLayout));
    dMemset(mCellSize, 0, sizeof(mCellSize));
    dMemset(mCellSize, 0, sizeof(mCellSize));
    dMemset(mNormalMapAtlas, 0, sizeof(mNormalMapAtlas));
    dMemset(mNormalMapAtlas, 0, sizeof(mNormalMapAtlas));
-   dMemset(mUseAnisotropic, 0, sizeof(mUseAnisotropic));
+   dMemset(mUseAnisotropic, 1, sizeof(mUseAnisotropic));
 
 
    mImposterLimits = Point4F::Zero;
    mImposterLimits = Point4F::Zero;
 
 

+ 28 - 1
Engine/source/module/moduleManager.cpp

@@ -38,9 +38,16 @@
 #include "console/consoleTypes.h"
 #include "console/consoleTypes.h"
 #endif
 #endif
 
 
+#ifndef _MODULE_DEFINITION_H
+#include "module/moduleDefinition.h"
+#endif
+
+#ifndef _STRINGFUNCTIONS_H_
+#include "core/strings/stringFunctions.h"
+#endif
+
 // Script bindings.
 // Script bindings.
 #include "moduleManager_ScriptBinding.h"
 #include "moduleManager_ScriptBinding.h"
-
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 
 
 IMPLEMENT_CONOBJECT( ModuleManager );
 IMPLEMENT_CONOBJECT( ModuleManager );
@@ -65,6 +72,25 @@ S32 QSORT_CALLBACK moduleDefinitionVersionIdSort( const void* a, const void* b )
    return versionId1 > versionId2 ? -1 : versionId1 < versionId2 ? 1 : 0;
    return versionId1 > versionId2 ? -1 : versionId1 < versionId2 ? 1 : 0;
 }
 }
 
 
+S32 QSORT_CALLBACK moduleDependencySort(const void* a, const void* b)
+{
+   // Fetch module definitions.
+   ModuleDefinition* pDefinition1 = *(ModuleDefinition * *)a;
+   ModuleDefinition* pDefinition2 = *(ModuleDefinition * *)b;
+
+   // Fetch version Ids.
+   ModuleDefinition::typeModuleDependencyVector moduleDependencies = pDefinition1->getDependencies();
+   bool foundDependant = false;
+   for (ModuleDefinition::typeModuleDependencyVector::const_iterator dependencyItr = moduleDependencies.begin(); dependencyItr != moduleDependencies.end(); ++dependencyItr)
+   {
+      if (dStrcmp(dependencyItr->mModuleId, pDefinition2->getModuleId())
+         && (dependencyItr->mVersionId == pDefinition2->getVersionId()))
+            foundDependant = true;
+   }
+
+   return foundDependant ? 1 : -1;
+}
+
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 
 
 ModuleManager::ModuleManager() :
 ModuleManager::ModuleManager() :
@@ -1087,6 +1113,7 @@ void ModuleManager::findModules( const bool loadedOnly, typeConstModuleDefinitio
             moduleDefinitions.push_back( pModuleDefinition );
             moduleDefinitions.push_back( pModuleDefinition );
         }
         }
     }
     }
+    dQsort(moduleDefinitions.address(), moduleDefinitions.size(), sizeof(ModuleDefinition*), moduleDependencySort);
 }
 }
 
 
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------

+ 73 - 0
Engine/source/postFx/postEffectManager.cpp

@@ -314,3 +314,76 @@ S32 PostEffectManager::_effectPrioritySort( PostEffect* const *e1, PostEffect* c
 
 
    return 0;
    return 0;
 }
 }
+
+void PostEffectManager::dumpActivePostFX()
+{
+   EffectVector effects;
+
+   for (U32 i = 0; i < mEndOfFrameList.size(); i++)
+   {
+      PostEffect* effect = mEndOfFrameList[i];
+
+      if(effect->isEnabled())
+         effects.push_back(effect);
+   }
+
+   for (U32 i = 0; i < mAfterDiffuseList.size(); i++)
+   {
+      PostEffect* effect = mAfterDiffuseList[i];
+
+      if (effect->isEnabled())
+         effects.push_back(effect);
+   }
+
+
+   // Now check the bin maps.
+   EffectMap::Iterator mapIter = mAfterBinMap.begin();
+   for (; mapIter != mAfterBinMap.end(); mapIter++)
+   {
+      EffectVector& ef = mapIter->value;
+
+      for (U32 i = 0; i < ef.size(); i++)
+      {
+         PostEffect* effect = ef[i];
+
+         if (effect->isEnabled())
+            effects.push_back(effect);
+      }
+   }
+
+   mapIter = mBeforeBinMap.begin();
+   for (; mapIter != mBeforeBinMap.end(); mapIter++)
+   {
+      EffectVector& ef = mapIter->value;
+
+      for (U32 i = 0; i < ef.size(); i++)
+      {
+         PostEffect* effect = ef[i];
+
+         if (effect->isEnabled())
+            effects.push_back(effect);
+      }
+   }
+
+   // Resort the effects by priority.
+   effects.sort(&_effectPrioritySort);
+
+   Con::printf("PostEffectManager::dumpActivePostFX() - Beginning Dump");
+
+   for (U32 i = 0; i < effects.size(); i++)
+   {
+      PostEffect* effect = effects[i];
+
+      if (effect->isEnabled())
+      {
+         Con::printf("%s", effect->getName());
+      }
+   }
+
+   Con::printf("PostEffectManager::dumpActivePostFX() - Ending Dump");
+}
+
+DefineEngineFunction(dumpActivePostFX, void, (),, "")
+{
+   PFXMGR->dumpActivePostFX();
+}

+ 3 - 1
Engine/source/postFx/postEffectManager.h

@@ -132,9 +132,11 @@ public:
    
    
    // For ManagedSingleton.
    // For ManagedSingleton.
    static const char* getSingletonName() { return "PostEffectManager"; }
    static const char* getSingletonName() { return "PostEffectManager"; }
+
+   void dumpActivePostFX();
 };
 };
 
 
 /// Returns the PostEffectManager singleton.
 /// Returns the PostEffectManager singleton.
 #define PFXMGR ManagedSingleton<PostEffectManager>::instance()
 #define PFXMGR ManagedSingleton<PostEffectManager>::instance()
 
 
-#endif // _POSTEFFECTMANAGER_H_
+#endif // _POSTEFFECTMANAGER_H_

+ 19 - 1
Engine/source/renderInstance/renderProbeMgr.cpp

@@ -30,7 +30,7 @@
 #include "renderInstance/renderDeferredMgr.h"
 #include "renderInstance/renderDeferredMgr.h"
 #include "math/mPolyhedron.impl.h"
 #include "math/mPolyhedron.impl.h"
 #include "gfx/gfxTransformSaver.h"
 #include "gfx/gfxTransformSaver.h"
-
+#include "lighting/advanced/advancedLightBinManager.h" //for ssao
 #include "gfx/gfxDebugEvent.h"
 #include "gfx/gfxDebugEvent.h"
 #include "shaderGen/shaderGenVars.h"
 #include "shaderGen/shaderGenVars.h"
 #include "materials/shaderData.h"
 #include "materials/shaderData.h"
@@ -752,6 +752,24 @@ void RenderProbeMgr::render( SceneRenderState *state )
       mProbeArrayEffect->setShaderMacro("SKYLIGHT_ONLY", "1");
       mProbeArrayEffect->setShaderMacro("SKYLIGHT_ONLY", "1");
    else
    else
       mProbeArrayEffect->setShaderMacro("SKYLIGHT_ONLY", "0");
       mProbeArrayEffect->setShaderMacro("SKYLIGHT_ONLY", "0");
+
+   //ssao mask
+   if (AdvancedLightBinManager::smUseSSAOMask)
+   {
+      //find ssaoMask
+      NamedTexTargetRef ssaoTarget = NamedTexTarget::find("ssaoMask");
+      GFXTextureObject* pTexObj = ssaoTarget->getTexture();
+      if (pTexObj)
+      {
+         mProbeArrayEffect->setShaderMacro("USE_SSAO_MASK");
+         mProbeArrayEffect->setTexture(6, pTexObj);
+         
+      }
+   }
+   else
+   {
+      mProbeArrayEffect->setTexture(6, NULL);
+   }
    
    
    mProbeArrayEffect->setTexture(3, mBRDFTexture);
    mProbeArrayEffect->setTexture(3, mBRDFTexture);
    mProbeArrayEffect->setCubemapArrayTexture(4, mPrefilterArray);
    mProbeArrayEffect->setCubemapArrayTexture(4, mPrefilterArray);

+ 129 - 20
Engine/source/terrain/terrData.cpp

@@ -53,7 +53,7 @@
 #include "T3D/physics/physicsCollision.h"
 #include "T3D/physics/physicsCollision.h"
 #include "console/engineAPI.h"
 #include "console/engineAPI.h"
 
 
-#include "console/engineAPI.h"
+#include "T3D/assets/TerrainMaterialAsset.h"
 using namespace Torque;
 using namespace Torque;
 
 
 IMPLEMENT_CO_NETOBJECT_V1(TerrainBlock);
 IMPLEMENT_CO_NETOBJECT_V1(TerrainBlock);
@@ -207,6 +207,9 @@ TerrainBlock::TerrainBlock()
    mNetFlags.set(Ghostable | ScopeAlways);
    mNetFlags.set(Ghostable | ScopeAlways);
    mIgnoreZodiacs = false;
    mIgnoreZodiacs = false;
    zode_primBuffer = 0;
    zode_primBuffer = 0;
+
+   mTerrainAsset = StringTable->EmptyString();
+   mTerrainAssetId = StringTable->EmptyString();
 }
 }
 
 
 
 
@@ -352,17 +355,90 @@ void TerrainBlock::setFile(const Resource<TerrainFile>& terr)
    mTerrFileName = terr.getPath();
    mTerrFileName = terr.getPath();
 }
 }
 
 
+bool TerrainBlock::setTerrainAsset(const StringTableEntry terrainAssetId)
+{
+   mTerrainAssetId = terrainAssetId;
+   mTerrainAsset = mTerrainAssetId;
+
+   if (mTerrainAsset.isNull())
+   {
+      Con::errorf("[TerrainBlock] Failed to load terrain asset.");
+      return false;
+   }
+
+   Resource<TerrainFile> file = mTerrainAsset->getTerrainResource();
+   if (!file)
+      return false;
+
+   setFile(file);
+   return true;
+}
+
 bool TerrainBlock::save(const char *filename)
 bool TerrainBlock::save(const char *filename)
 {
 {
    return mFile->save(filename);
    return mFile->save(filename);
 }
 }
 
 
+bool TerrainBlock::saveAsset()
+{
+   if (!mTerrainAsset.isNull() && mTerrainAsset->isAssetValid())
+   {
+      mTerrainAsset->clearAssetDependencyFields("terrainMaterailAsset");
+
+      AssetQuery* pAssetQuery = new AssetQuery();
+      AssetDatabase.findAssetType(pAssetQuery, "TerrainMaterialAsset");
+
+      TerrainBlock* clientTerr = static_cast<TerrainBlock*>(getClientObject());
+
+      for (U32 i = 0; i < pAssetQuery->mAssetList.size(); i++)
+      {
+         //Acquire it so we can check it for matches
+         AssetPtr<TerrainMaterialAsset> terrMatAsset = pAssetQuery->mAssetList[i];
+
+         for (U32 m = 0; m < clientTerr->mFile->mMaterials.size(); m++)
+         {
+            StringTableEntry intMatName = clientTerr->mFile->mMaterials[m]->getInternalName();
+
+            StringTableEntry assetMatDefName = terrMatAsset->getMaterialDefinitionName();
+            if (assetMatDefName == intMatName)
+            {
+               mTerrainAsset->addAssetDependencyField("terrainMaterailAsset", terrMatAsset.getAssetId());
+            }
+         }
+
+         terrMatAsset.clear();
+      }
+
+      pAssetQuery->destroySelf();
+
+      bool saveAssetSuccess = mTerrainAsset->saveAsset();
+
+      if (!saveAssetSuccess)
+         return false;
+
+      return mFile->save(mTerrainAsset->getTerrainFilePath());
+   }
+
+   return false;
+}
+
 bool TerrainBlock::_setTerrainFile( void *obj, const char *index, const char *data )
 bool TerrainBlock::_setTerrainFile( void *obj, const char *index, const char *data )
 {
 {
    static_cast<TerrainBlock*>( obj )->setFile( FileName( data ) );
    static_cast<TerrainBlock*>( obj )->setFile( FileName( data ) );
    return false;
    return false;
 }
 }
 
 
+bool TerrainBlock::_setTerrainAsset(void* obj, const char* index, const char* data)
+{
+   TerrainBlock* terr = static_cast<TerrainBlock*>(obj);// ->setFile(FileName(data));
+
+   terr->setTerrainAsset(StringTable->insert(data));
+   
+   terr->setMaskBits(FileMask | HeightMapChangeMask);
+
+   return false;
+}
+
 void TerrainBlock::_updateBounds()
 void TerrainBlock::_updateBounds()
 {
 {
    if ( !mFile )
    if ( !mFile )
@@ -901,31 +977,50 @@ bool TerrainBlock::onAdd()
    if(!Parent::onAdd())
    if(!Parent::onAdd())
       return false;
       return false;
 
 
-   if ( mTerrFileName.isEmpty() )
+   Resource<TerrainFile> terr;
+
+   if (!mTerrainAsset.isNull())
    {
    {
-      mTerrFileName = Con::getVariable( "$Client::MissionFile" );
-      String terrainDirectory( Con::getVariable( "$pref::Directories::Terrain" ) );
-      if ( terrainDirectory.isEmpty() )
+      terr = mTerrainAsset->getTerrainResource();
+
+      if (terr == NULL)
       {
       {
-         terrainDirectory = "art/terrains/";
+         if (isClientObject())
+            NetConnection::setLastError("Unable to load terrain asset: %s", mTerrainAsset.getAssetId());
+         return false;
       }
       }
-      mTerrFileName.replace("tools/levels/", terrainDirectory);
-      mTerrFileName.replace("levels/", terrainDirectory);
 
 
-      Vector<String> materials;
-      materials.push_back( "warning_material" );
-      TerrainFile::create( &mTerrFileName, 256, materials );
+      mFile = terr;
    }
    }
-
-   Resource<TerrainFile> terr = ResourceManager::get().load( mTerrFileName );
-   if(terr == NULL)
+   else
    {
    {
-      if(isClientObject())
-         NetConnection::setLastError("You are missing a file needed to play this mission: %s", mTerrFileName.c_str());
-      return false;
-   }
+      if (mTerrFileName.isEmpty())
+      {
+         mTerrFileName = Con::getVariable("$Client::MissionFile");
+         String terrainDirectory(Con::getVariable("$pref::Directories::Terrain"));
+         if (terrainDirectory.isEmpty())
+         {
+            terrainDirectory = "art/terrains/";
+         }
+         mTerrFileName.replace("tools/levels/", terrainDirectory);
+         mTerrFileName.replace("levels/", terrainDirectory);
+
+         Vector<String> materials;
+         materials.push_back("warning_material");
+         TerrainFile::create(&mTerrFileName, 256, materials);
+      }
 
 
-   setFile( terr );
+      terr = ResourceManager::get().load(mTerrFileName);
+
+      if (terr == NULL)
+      {
+         if (isClientObject())
+            NetConnection::setLastError("You are missing a file needed to play this mission: %s", mTerrFileName.c_str());
+         return false;
+      }
+
+      setFile(terr);
+   }
 
 
    if ( terr->mNeedsResaving )
    if ( terr->mNeedsResaving )
    {
    {
@@ -1125,7 +1220,11 @@ void TerrainBlock::setScale( const VectorF &scale )
 void TerrainBlock::initPersistFields()
 void TerrainBlock::initPersistFields()
 {
 {
    addGroup( "Media" );
    addGroup( "Media" );
-      
+
+      addProtectedField("terrainAsset", TypeTerrainAssetPtr, Offset(mTerrainAsset, TerrainBlock),
+         &TerrainBlock::_setTerrainAsset, &defaultProtectedGetFn,
+         "The source terrain data asset.");
+
       addProtectedField( "terrainFile", TypeStringFilename, Offset( mTerrFileName, TerrainBlock ), 
       addProtectedField( "terrainFile", TypeStringFilename, Offset( mTerrFileName, TerrainBlock ), 
          &TerrainBlock::_setTerrainFile, &defaultProtectedGetFn,
          &TerrainBlock::_setTerrainFile, &defaultProtectedGetFn,
          "The source terrain data file." );
          "The source terrain data file." );
@@ -1310,6 +1409,16 @@ DefineEngineMethod( TerrainBlock, save, bool, ( const char* fileName),,
    return static_cast<TerrainBlock*>(object)->save(filename);
    return static_cast<TerrainBlock*>(object)->save(filename);
 }
 }
 
 
+DefineEngineMethod(TerrainBlock, saveAsset, bool, (), ,
+   "@brief Saves the terrain block's terrain file to the specified file name.\n\n"
+
+   "@param fileName Name and path of file to save terrain data to.\n\n"
+
+   "@return True if file save was successful, false otherwise")
+{
+   return static_cast<TerrainBlock*>(object)->saveAsset();
+}
+
 //ConsoleMethod(TerrainBlock, save, bool, 3, 3, "(string fileName) - saves the terrain block's terrain file to the specified file name.")
 //ConsoleMethod(TerrainBlock, save, bool, 3, 3, "(string fileName) - saves the terrain block's terrain file to the specified file name.")
 //{
 //{
 //   char filename[256];
 //   char filename[256];

+ 13 - 1
Engine/source/terrain/terrData.h

@@ -50,7 +50,12 @@
 #include "gfx/gfxPrimitiveBuffer.h"
 #include "gfx/gfxPrimitiveBuffer.h"
 #endif
 #endif
 
 
-
+#ifndef _ASSET_PTR_H_
+#include "assets/assetPtr.h"
+#endif 
+#ifndef TERRAINASSET_H
+#include "T3D/assets/TerrainAsset.h"
+#endif 
 
 
 class GBitmap;
 class GBitmap;
 class TerrainBlock;
 class TerrainBlock;
@@ -120,6 +125,9 @@ protected:
 
 
    ///
    ///
    FileName mTerrFileName;
    FileName mTerrFileName;
+
+   AssetPtr<TerrainAsset> mTerrainAsset;
+   StringTableEntry mTerrainAssetId;
    
    
    /// The maximum detail distance found in the material list.
    /// The maximum detail distance found in the material list.
    F32 mMaxDetailDistance;
    F32 mMaxDetailDistance;
@@ -241,6 +249,7 @@ protected:
 
 
    // Protected fields
    // Protected fields
    static bool _setTerrainFile( void *obj, const char *index, const char *data );
    static bool _setTerrainFile( void *obj, const char *index, const char *data );
+   static bool _setTerrainAsset(void* obj, const char* index, const char* data);
    static bool _setSquareSize( void *obj, const char *index, const char *data );
    static bool _setSquareSize( void *obj, const char *index, const char *data );
    static bool _setBaseTexSize(void *obj, const char *index, const char *data);
    static bool _setBaseTexSize(void *obj, const char *index, const char *data);
    static bool _setBaseTexFormat(void *obj, const char *index, const char *data);
    static bool _setBaseTexFormat(void *obj, const char *index, const char *data);
@@ -418,7 +427,10 @@ public:
 
 
    void setFile(const Resource<TerrainFile>& file);
    void setFile(const Resource<TerrainFile>& file);
 
 
+   bool setTerrainAsset(const StringTableEntry terrainAssetId);
+
    bool save(const char* filename);
    bool save(const char* filename);
+   bool saveAsset();
 
 
    F32 getSquareSize() const { return mSquareSize; }
    F32 getSquareSize() const { return mSquareSize; }
 
 

+ 1 - 1
Engine/source/terrain/terrMaterial.cpp

@@ -97,7 +97,7 @@ void TerrainMaterial::initPersistFields()
    addField( "parallaxScale", TypeF32, Offset( mParallaxScale, TerrainMaterial ), "Used to scale the height from the normal map to give some self "
    addField( "parallaxScale", TypeF32, Offset( mParallaxScale, TerrainMaterial ), "Used to scale the height from the normal map to give some self "
 	   "occlusion effect (aka parallax) to the terrain material" );
 	   "occlusion effect (aka parallax) to the terrain material" );
 
 
-   addField("compositeMap", TypeStringFilename, Offset(mCompositeMap, TerrainMaterial), "Composite map for the material");
+   addField("pbrConfigMap", TypeStringFilename, Offset(mCompositeMap, TerrainMaterial), "Composite map for the material");
    Parent::initPersistFields();
    Parent::initPersistFields();
 
 
    // Gotta call this at least once or it won't get created!
    // Gotta call this at least once or it won't get created!

+ 1 - 1
Engine/source/windowManager/sdl/sdlWindowMgr.cpp

@@ -353,7 +353,7 @@ void PlatformWindowManagerSDL::_process()
 
 
             char* fileName = evt.drop.file;
             char* fileName = evt.drop.file;
 
 
-            if (!Platform::isFile(fileName))
+            if (!Platform::isDirectory(fileName) && !Platform::isFile(fileName))
                break;
                break;
 
 
             Con::executef("onDropFile", StringTable->insert(fileName));
             Con::executef("onDropFile", StringTable->insert(fileName));

+ 2 - 2
Engine/source/windowManager/win32/win32Window.cpp

@@ -277,7 +277,7 @@ void Win32Window::setVideoMode( const GFXVideoMode &mode )
       mOwningManager->raiseCurtain();
       mOwningManager->raiseCurtain();
 
 
    SetForegroundWindow( getHWND() );
    SetForegroundWindow( getHWND() );
-   getScreenResChangeSignal().trigger( this, true );
+   resizeEvent.trigger( this, true );
 }
 }
 
 
 bool Win32Window::clearFullscreen()
 bool Win32Window::clearFullscreen()
@@ -806,7 +806,7 @@ LRESULT PASCAL Win32Window::WindowProc( HWND hWnd, UINT message, WPARAM wParam,
 				window->getGFXTarget()->resetMode();
 				window->getGFXTarget()->resetMode();
 			}
 			}
 
 
-         window->getScreenResChangeSignal().trigger(window, true);
+         window->resizeEvent.trigger(window, true);
 		}
 		}
 		return 0;
 		return 0;
 
 

+ 118 - 2
Templates/BaseGame/game/core/clientServer/scripts/client/levelDownload.cs

@@ -38,7 +38,73 @@
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
 // Phase 1 
 // Phase 1 
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
-function clientCmdMissionStartPhase1(%seq, %missionName)
+$pref::Client::EnableDatablockCache = true;
+$pref::Client::DatablockCacheFilename = "data/cache/client/datablock_cache_c.dbc";
+
+function clientCmdMissionStartPhase1_LoadCache(%seq, %missionName)
+{
+  if ($pref::Client::EnableDatablockCache && $loadFromDatablockCache)
+  {
+    if (!$pref::Video::disableVerticalSync)
+    {
+      warn("Disabling Vertical Sync during datablock cache load to avoid significant slowdown.");
+      $AFX_tempDisableVSync = true;
+
+      $pref::Video::disableVerticalSync = true;
+      Canvas.resetVideoMode();
+    }
+
+    echo("<<<< Loading Datablocks From Cache >>>>");
+    if (ServerConnection.loadDatablockCache_Begin())
+    {
+      schedule(10, 0, "updateLoadDatablockCacheProgress", %seq, %missionName);
+    }
+  }
+}
+
+function updateLoadDatablockCacheProgress(%seq, %missionName)
+{
+   if (ServerConnection.loadDatablockCache_Continue())
+   {
+      $loadDatablockCacheProgressThread = schedule(10, 0, "updateLoadDatablockCacheProgress", %seq, %missionName);
+      return;
+   }
+ 
+   if ($AFX_tempDisableVSync)
+   {
+     warn("Restoring Vertical Sync setting.");
+     $AFX_tempDisableVSync = false;
+
+     $pref::Video::disableVerticalSync = false;
+     Canvas.resetVideoMode();
+   }
+
+   echo("<<<< Finished Loading Datablocks From Cache >>>>");
+   clientCmdMissionStartPhase2(%seq,%missionName);
+}
+
+function updateLoadDatablockCacheProgress(%seq, %missionName)
+{
+   if (ServerConnection.loadDatablockCache_Continue())
+   {
+      $loadDatablockCacheProgressThread = schedule(10, 0, "updateLoadDatablockCacheProgress", %seq, %missionName);
+      return;
+   }
+ 
+   if ($AFX_tempDisableVSync)
+   {
+     warn("Restoring Vertical Sync setting.");
+     $AFX_tempDisableVSync = false;
+
+     $pref::Video::disableVerticalSync = false;
+     Canvas.resetVideoMode();
+   }
+
+   echo("<<<< Finished Loading Datablocks From Cache >>>>");
+   clientCmdMissionStartPhase2(%seq,%missionName);
+}
+
+function clientCmdMissionStartPhase1(%seq, %missionName, %cache_crc)
 {
 {
    // These need to come after the cls.
    // These need to come after the cls.
    echo ("*** New Mission: " @ %missionName);
    echo ("*** New Mission: " @ %missionName);
@@ -61,6 +127,56 @@ function clientCmdMissionStartPhase1(%seq, %missionName)
       PostFXManager::settingsApplyDefaultPreset();
       PostFXManager::settingsApplyDefaultPreset();
    }
    }
    
    
+  $loadFromDatablockCache = false;
+  if ($pref::Client::EnableDatablockCache)
+  {
+    %cache_filename = $pref::Client::DatablockCacheFilename;
+
+    // if cache CRC is provided, check for validity
+    if (%cache_crc !$= "")
+    {
+      // check for existence of cache file
+      if (isFile(%cache_filename))
+      { 
+        // here we are not comparing the CRC of the cache itself, but the CRC of
+        // the server cache (stored in the header) when these datablocks were
+        // transmitted.
+        %my_cache_crc = extractDatablockCacheCRC(%cache_filename);
+        echo("<<<< client cache CRC:" SPC %my_cache_crc SPC ">>>>");
+        echo("<<<< comparing CRC codes:" SPC "s:" @ %cache_crc SPC "c:" @ %my_cache_crc SPC ">>>>");
+        if (%my_cache_crc == %cache_crc)
+        {
+          echo("<<<< cache CRC codes match, datablocks will be loaded from local cache. >>>>");
+          $loadFromDatablockCache = true;
+        }
+        else
+        {
+          echo("<<<< cache CRC codes differ, datablocks will be transmitted and cached. >>>>" SPC %cache_crc);
+          setDatablockCacheCRC(%cache_crc);
+        }
+      }
+      else
+      {
+        echo("<<<< client datablock cache does not exist, datablocks will be transmitted and cached. >>>>");
+        setDatablockCacheCRC(%cache_crc);
+      }
+    }
+    else
+    {
+      echo("<<<< server datablock caching is disabled, datablocks will be transmitted. >>>>");
+    }
+    if ($loadFromDatablockCache)
+    {
+      // skip datablock transmission and initiate a cache load
+      commandToServer('MissionStartPhase1Ack_UseCache', %seq);
+      return;
+    }
+  }
+  else if (%cache_crc !$= "")
+  {
+    echo("<<<< client datablock caching is disabled, datablocks will be transmitted. >>>>");
+  }
+  
    onMissionDownloadPhase("LOADING DATABLOCKS");
    onMissionDownloadPhase("LOADING DATABLOCKS");
    
    
    commandToServer('MissionStartPhase1Ack', %seq);
    commandToServer('MissionStartPhase1Ack', %seq);
@@ -164,7 +280,7 @@ function connect(%server)
 {
 {
    %conn = new GameConnection(ServerConnection);
    %conn = new GameConnection(ServerConnection);
    RootGroup.add(ServerConnection);
    RootGroup.add(ServerConnection);
-   %conn.setConnectArgs($pref::Player::Name);
+   %conn.setConnectArgs($pref::Player::Name, $ConncetInfoKey);
    %conn.setJoinPassword($Client::Password);
    %conn.setJoinPassword($Client::Password);
    %conn.connect(%server);
    %conn.connect(%server);
 }
 }

+ 0 - 2
Templates/BaseGame/game/core/clientServer/scripts/server/defaults.cs

@@ -46,8 +46,6 @@ $Pref::Server::ConnectionError =
 // overrides pref::net::port for dedicated servers
 // overrides pref::net::port for dedicated servers
 $Pref::Server::Port = 28000;
 $Pref::Server::Port = 28000;
 
 
-$Pref::Server::EnableDatablockCache = true;
-$Pref::Server::DatablockCacheFilename = "core/clientServer/scripts/server/afx/cache/afx_datablock_cache.dbc";
 
 
 // If the password is set, clients must provide it in order
 // If the password is set, clients must provide it in order
 // to connect to the server
 // to connect to the server

+ 48 - 9
Templates/BaseGame/game/core/clientServer/scripts/server/levelDownload.cs

@@ -38,8 +38,26 @@
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
 // Phase 1 
 // Phase 1 
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
+$Pref::Server::EnableDatablockCache = true;
+$pref::Server::DatablockCacheFilename = "data/cache/server/datablock_cache_c.dbc";
 function GameConnection::loadMission(%this)
 function GameConnection::loadMission(%this)
 {
 {
+  %cache_crc = "";
+
+  if ($Pref::Server::EnableDatablockCache)
+  {
+    if (!isDatablockCacheSaved())
+    {
+      echo("<<<< saving server datablock cache >>>>");
+      %this.saveDatablockCache();
+    }
+
+    if (isFile($Pref::Server::DatablockCacheFilename))
+    {
+      %cache_crc = getDatablockCacheCRC();
+      echo("    <<<< sending CRC to client:" SPC %cache_crc SPC ">>>>");
+    }
+  }
    // Send over the information that will display the server info
    // Send over the information that will display the server info
    // when we learn it got there, we'll send the data blocks
    // when we learn it got there, we'll send the data blocks
    %this.currentPhase = 0;
    %this.currentPhase = 0;
@@ -50,12 +68,41 @@ function GameConnection::loadMission(%this)
    }
    }
    else
    else
    {
    {
-      commandToClient(%this, 'MissionStartPhase1', $missionSequence, $Server::MissionFile);
+      commandToClient(%this, 'MissionStartPhase1', $missionSequence, $Server::MissionFile, %cache_crc);
          
          
       echo("*** Sending mission load to client: " @ $Server::MissionFile);
       echo("*** Sending mission load to client: " @ $Server::MissionFile);
    }
    }
 }
 }
 
 
+function serverCmdMissionStartPhase1Ack_UseCache(%client, %seq)
+{
+  echo("<<<< client will load datablocks from a cache >>>>");
+  echo("    <<<< skipping datablock transmission >>>>");
+
+  // Make sure to ignore calls from a previous mission load
+  if (%seq != $missionSequence || !$MissionRunning)
+    return;
+  if (%client.currentPhase != 0)
+    return;
+  %client.currentPhase = 1;
+
+  // Start with the CRC
+  %client.setMissionCRC( $missionCRC );
+
+  %client.onBeginDatablockCacheLoad($missionSequence);
+}
+
+function GameConnection::onBeginDatablockCacheLoad( %this, %missionSequence )
+{
+   // Make sure to ignore calls from a previous mission load
+   if (%missionSequence != $missionSequence)
+      return;
+   if (%this.currentPhase != 1)
+      return;
+   %this.currentPhase = 1.5;
+   commandToClient(%this, 'MissionStartPhase1_LoadCache', $missionSequence, $Server::MissionFile);
+}
+
 function serverCmdMissionStartPhase1Ack(%client, %seq)
 function serverCmdMissionStartPhase1Ack(%client, %seq)
 {
 {
    // Make sure to ignore calls from a previous mission load
    // Make sure to ignore calls from a previous mission load
@@ -157,14 +204,6 @@ function serverCmdMissionStartPhase3Ack(%client, %seq)
       // Set the control object to the default camera
       // Set the control object to the default camera
       if (!isObject(%client.camera))
       if (!isObject(%client.camera))
       {
       {
-         if(!isObject(Observer))
-         {
-            datablock CameraData(Observer)
-            {
-               mode = "Observer";
-            };  
-         }
-         
          //if (isDefined("$Game::DefaultCameraClass"))
          //if (isDefined("$Game::DefaultCameraClass"))
             %client.camera = spawnObject("Camera", Observer);
             %client.camera = spawnObject("Camera", Observer);
       }
       }

+ 6 - 2
Templates/BaseGame/game/core/clientServer/scripts/server/server.cs

@@ -204,10 +204,11 @@ function onServerCreated()
    
    
    loadDatablockFiles( DatablockFilesList, true );
    loadDatablockFiles( DatablockFilesList, true );
    
    
+   callOnModules("onServerScriptExec", "Core");
+   callOnModules("onServerScriptExec", "Game");   
+   
    // Keep track of when the game started
    // Keep track of when the game started
    $Game::StartTime = $Sim::Time;
    $Game::StartTime = $Sim::Time;
-
-   onServerCreatedAFX();
 }
 }
 
 
 /// Shut down the server
 /// Shut down the server
@@ -283,6 +284,9 @@ function onServerDestroyed()
    MissionCleanup.delete();
    MissionCleanup.delete();
    
    
    clearServerPaths();
    clearServerPaths();
+   
+  if ($Pref::Server::EnableDatablockCache)
+    resetDatablockCache();
 }
 }
 
 
 /// Guid list maintenance functions
 /// Guid list maintenance functions

+ 2 - 2
Templates/BaseGame/game/core/gameObjects/materials/materials.cs

@@ -1,4 +1,4 @@
-new ShaderData( BasicRibbonShader )
+singleton ShaderData( BasicRibbonShader )
 {
 {
    DXVertexShaderFile   = $Core::CommonShaderPath @ "/ribbons/basicRibbonShaderV.hlsl";
    DXVertexShaderFile   = $Core::CommonShaderPath @ "/ribbons/basicRibbonShaderV.hlsl";
    DXPixelShaderFile    = $Core::CommonShaderPath @ "/ribbons/basicRibbonShaderP.hlsl";
    DXPixelShaderFile    = $Core::CommonShaderPath @ "/ribbons/basicRibbonShaderP.hlsl";
@@ -26,7 +26,7 @@ singleton CustomMaterial( BasicRibbonMat )
    preload = true;
    preload = true;
 };
 };
 
 
-new ShaderData( TexturedRibbonShader )
+singleton ShaderData( TexturedRibbonShader )
 {
 {
    DXVertexShaderFile   = $Core::CommonShaderPath @ "/ribbons/texRibbonShaderV.hlsl";
    DXVertexShaderFile   = $Core::CommonShaderPath @ "/ribbons/texRibbonShaderV.hlsl";
    DXPixelShaderFile    = $Core::CommonShaderPath @ "/ribbons/texRibbonShaderP.hlsl";
    DXPixelShaderFile    = $Core::CommonShaderPath @ "/ribbons/texRibbonShaderP.hlsl";

BIN
Templates/BaseGame/game/core/gui/scripts/fonts/Arial 14 (ansi).uft


+ 15 - 17
Templates/BaseGame/game/core/lighting/scripts/advancedLighting_Shaders.cs

@@ -22,7 +22,7 @@
 
 
 
 
 // Vector Light State
 // Vector Light State
-new GFXStateBlockData( AL_VectorLightState )
+singleton GFXStateBlockData( AL_VectorLightState )
 {
 {
    blendDefined = true;
    blendDefined = true;
    blendEnable = true;
    blendEnable = true;
@@ -48,9 +48,7 @@ new GFXStateBlockData( AL_VectorLightState )
    mSamplerNames[1] = "shadowMap";
    mSamplerNames[1] = "shadowMap";
    samplerStates[2] = SamplerClampPoint;  // Shadow Map (Do not change this to linear, as all cards can not filter equally.)
    samplerStates[2] = SamplerClampPoint;  // Shadow Map (Do not change this to linear, as all cards can not filter equally.)
    mSamplerNames[2] = "dynamicShadowMap";
    mSamplerNames[2] = "dynamicShadowMap";
-   samplerStates[3] = SamplerClampLinear;  // SSAO Mask
-   mSamplerNames[3] = "ssaoMask";
-   samplerStates[4] = SamplerWrapPoint;   // Random Direction Map
+   samplerStates[3] = SamplerWrapPoint;   // Random Direction Map
    
    
    cullDefined = true;
    cullDefined = true;
    cullMode = GFXCullNone;
    cullMode = GFXCullNone;
@@ -61,7 +59,7 @@ new GFXStateBlockData( AL_VectorLightState )
 };
 };
 
 
 // Vector Light Material
 // Vector Light Material
-new ShaderData( AL_VectorLightShader )
+singleton shaderData( AL_VectorLightShader )
 {
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/advanced/farFrustumQuadV.hlsl";
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/advanced/farFrustumQuadV.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/vectorLightP.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/vectorLightP.hlsl";
@@ -72,11 +70,10 @@ new ShaderData( AL_VectorLightShader )
    samplerNames[0] = "$deferredBuffer";
    samplerNames[0] = "$deferredBuffer";
    samplerNames[1] = "$shadowMap";
    samplerNames[1] = "$shadowMap";
    samplerNames[2] = "$dynamicShadowMap";
    samplerNames[2] = "$dynamicShadowMap";
-   samplerNames[3] = "$ssaoMask";
-   samplerNames[4] = "$gTapRotationTex";
-   samplerNames[5] = "$lightBuffer";
-   samplerNames[6] = "$colorBuffer";
-   samplerNames[7] = "$matInfoBuffer";  
+   samplerNames[3] = "$gTapRotationTex";
+   samplerNames[4] = "$lightBuffer";
+   samplerNames[5] = "$colorBuffer";
+   samplerNames[6] = "$matInfoBuffer";  
    
    
    pixVersion = 3.0;
    pixVersion = 3.0;
 };
 };
@@ -89,7 +86,6 @@ new CustomMaterial( AL_VectorLightMaterial )
    sampler["deferredBuffer"] = "#deferred";
    sampler["deferredBuffer"] = "#deferred";
    sampler["shadowMap"] = "$dynamiclight";
    sampler["shadowMap"] = "$dynamiclight";
    sampler["dynamicShadowMap"] = "$dynamicShadowMap";
    sampler["dynamicShadowMap"] = "$dynamicShadowMap";
-   sampler["ssaoMask"] = "#ssaoMask";  
    sampler["lightBuffer"] = "#specularLighting";
    sampler["lightBuffer"] = "#specularLighting";
    sampler["colorBuffer"] = "#color";
    sampler["colorBuffer"] = "#color";
    sampler["matInfoBuffer"] = "#matinfo";
    sampler["matInfoBuffer"] = "#matinfo";
@@ -102,7 +98,7 @@ new CustomMaterial( AL_VectorLightMaterial )
 //------------------------------------------------------------------------------
 //------------------------------------------------------------------------------
 
 
 // Convex-geometry light states
 // Convex-geometry light states
-new GFXStateBlockData( AL_ConvexLightState )
+singleton GFXStateBlockData( AL_ConvexLightState )
 {
 {
    blendDefined = true;
    blendDefined = true;
    blendEnable = true;
    blendEnable = true;
@@ -140,7 +136,7 @@ new GFXStateBlockData( AL_ConvexLightState )
 };
 };
 
 
 // Point Light Material
 // Point Light Material
-new ShaderData( AL_PointLightShader )
+singleton shaderData( AL_PointLightShader )
 {
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/advanced/convexGeometryV.hlsl";
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/advanced/convexGeometryV.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/pointLightP.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/pointLightP.hlsl";
@@ -179,7 +175,7 @@ new CustomMaterial( AL_PointLightMaterial )
 };
 };
 
 
 // Spot Light Material
 // Spot Light Material
-new ShaderData( AL_SpotLightShader )
+singleton shaderData( AL_SpotLightShader )
 {
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/advanced/convexGeometryV.hlsl";
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/advanced/convexGeometryV.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/spotLightP.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/spotLightP.hlsl";
@@ -256,7 +252,7 @@ new Material( AL_DefaultShadowMaterial )
 };
 };
 
 
 // Particle System Point Light Material
 // Particle System Point Light Material
-new ShaderData( AL_ParticlePointLightShader )
+singleton shaderData( AL_ParticlePointLightShader )
 {
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/advanced/particlePointLightV.hlsl";
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/advanced/particlePointLightV.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/particlePointLightP.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/particlePointLightP.hlsl";
@@ -281,7 +277,7 @@ new CustomMaterial( AL_ParticlePointLightMaterial )
 };
 };
 
 
 //Probe Processing
 //Probe Processing
-new ShaderData( IrradianceShader )
+singleton shaderData( IrradianceShader )
 {
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/advanced/cubemapV.hlsl";
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/advanced/cubemapV.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/irradianceP.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/irradianceP.hlsl";
@@ -294,7 +290,7 @@ new ShaderData( IrradianceShader )
    pixVersion = 3.0;
    pixVersion = 3.0;
 };
 };
 
 
-new ShaderData( PrefiterCubemapShader )
+singleton shaderData( PrefiterCubemapShader )
 {
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/advanced/cubemapV.hlsl";
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/advanced/cubemapV.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/prefilterP.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/prefilterP.hlsl";
@@ -322,6 +318,7 @@ singleton ShaderData( PFX_ReflectionProbeArray )
    samplerNames[3] = "$BRDFTexture";
    samplerNames[3] = "$BRDFTexture";
    samplerNames[4] = "$specularCubemapAR";
    samplerNames[4] = "$specularCubemapAR";
    samplerNames[5] = "$irradianceCubemapAR";
    samplerNames[5] = "$irradianceCubemapAR";
+   samplerNames[6] = "$ssaoMask";
 
 
    pixVersion = 2.0;
    pixVersion = 2.0;
 };  
 };  
@@ -350,4 +347,5 @@ singleton GFXStateBlockData( PFX_ReflectionProbeArrayStateBlock )
    samplerStates[3] = SamplerClampPoint;
    samplerStates[3] = SamplerClampPoint;
    samplerStates[4] = SamplerClampLinear;
    samplerStates[4] = SamplerClampLinear;
    samplerStates[5] = SamplerClampLinear;
    samplerStates[5] = SamplerClampLinear;
+   samplerStates[6] = SamplerClampPoint;
 };
 };

+ 2 - 2
Templates/BaseGame/game/core/lighting/scripts/deferredShading.cs

@@ -9,7 +9,7 @@ singleton ShaderData( DeferredColorShader )
    pixVersion = 2.0;   
    pixVersion = 2.0;   
 };
 };
 
 
-new GFXStateBlockData( AL_DeferredCaptureState : PFX_DefaultStateBlock )
+singleton GFXStateBlockData( AL_DeferredCaptureState : PFX_DefaultStateBlock )
 {        
 {        
    blendEnable = false; 
    blendEnable = false; 
    
    
@@ -27,7 +27,7 @@ new GFXStateBlockData( AL_DeferredCaptureState : PFX_DefaultStateBlock )
    samplerStates[4] = SamplerWrapLinear;
    samplerStates[4] = SamplerWrapLinear;
 };
 };
 
 
-new ShaderData( AL_ProbeShader )
+singleton shaderData( AL_ProbeShader )
 {
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/probeShadingP.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/probeShadingP.hlsl";

+ 1 - 1
Templates/BaseGame/game/core/lighting/scripts/shadowMaps_Init.cs

@@ -21,7 +21,7 @@
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 
 
 
 
-new ShaderData(BlurDepthShader)
+singleton shaderData(BlurDepthShader)
 {
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/shadowMap/boxFilterV.hlsl";
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/shadowMap/boxFilterV.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/shadowMap/boxFilterP.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/shadowMap/boxFilterP.hlsl";

+ 1 - 1
Templates/BaseGame/game/core/postFX/scripts/glow.cs

@@ -146,7 +146,7 @@ singleton PostEffect( VolFogGlowPostFx )
 	texture[0] = "$backbuffer";
 	texture[0] = "$backbuffer";
 	target = "$outTex";
 	target = "$outTex";
 	targetScale = "0.5 0.5";
 	targetScale = "0.5 0.5";
-	isEnabled = true;
+	isEnabled = false;
 	// Blur vertically
 	// Blur vertically
 	new PostEffect()
 	new PostEffect()
 	{
 	{

+ 1 - 1
Templates/BaseGame/game/core/postFX/scripts/hdr.cs

@@ -328,7 +328,7 @@ function HDRPostFX::onAdd( %this )
    PostFXManager.registerPostEffect(%this);
    PostFXManager.registerPostEffect(%this);
    
    
    //HDR should really be on at all times
    //HDR should really be on at all times
-   %this.enable();
+   //%this.enable();
    
    
    $HDRPostFX::enableToneMapping = 1;
    $HDRPostFX::enableToneMapping = 1;
 }
 }

+ 0 - 2
Templates/BaseGame/game/core/postFX/scripts/postFx.cs

@@ -35,8 +35,6 @@ singleton ShaderData( PFX_PassthruShader )
 
 
 function postFXInit()
 function postFXInit()
 {
 {
-   exec("core/postFX/guis/postFxManager.gui");
-   
    //Load the core postFX files themselves
    //Load the core postFX files themselves
    if (!$Server::Dedicated)
    if (!$Server::Dedicated)
    {
    {

+ 4 - 4
Templates/BaseGame/game/core/rendering/scripts/gfxData/commonMaterialData.cs

@@ -34,7 +34,7 @@ $sequence = 16;
 
 
 
 
 // Common stateblock definitions
 // Common stateblock definitions
-new GFXSamplerStateData(SamplerClampLinear)
+singleton GFXSamplerStateData(SamplerClampLinear)
 {
 {
    textureColorOp = GFXTOPModulate;
    textureColorOp = GFXTOPModulate;
    addressModeU = GFXAddressClamp;
    addressModeU = GFXAddressClamp;
@@ -45,7 +45,7 @@ new GFXSamplerStateData(SamplerClampLinear)
    mipFilter = GFXTextureFilterLinear;
    mipFilter = GFXTextureFilterLinear;
 };
 };
 
 
-new GFXSamplerStateData(SamplerClampPoint)
+singleton GFXSamplerStateData(SamplerClampPoint)
 {
 {
    textureColorOp = GFXTOPModulate;
    textureColorOp = GFXTOPModulate;
    addressModeU = GFXAddressClamp;
    addressModeU = GFXAddressClamp;
@@ -56,7 +56,7 @@ new GFXSamplerStateData(SamplerClampPoint)
    mipFilter = GFXTextureFilterPoint;
    mipFilter = GFXTextureFilterPoint;
 };
 };
 
 
-new GFXSamplerStateData(SamplerWrapLinear)
+singleton GFXSamplerStateData(SamplerWrapLinear)
 {
 {
    textureColorOp = GFXTOPModulate;
    textureColorOp = GFXTOPModulate;
    addressModeU = GFXTextureAddressWrap;
    addressModeU = GFXTextureAddressWrap;
@@ -67,7 +67,7 @@ new GFXSamplerStateData(SamplerWrapLinear)
    mipFilter = GFXTextureFilterLinear;
    mipFilter = GFXTextureFilterLinear;
 };
 };
 
 
-new GFXSamplerStateData(SamplerWrapPoint)
+singleton GFXSamplerStateData(SamplerWrapPoint)
 {
 {
    textureColorOp = GFXTOPModulate;
    textureColorOp = GFXTOPModulate;
    addressModeU = GFXTextureAddressWrap;
    addressModeU = GFXTextureAddressWrap;

+ 1 - 1
Templates/BaseGame/game/core/rendering/scripts/gfxData/scatterSky.cs

@@ -20,7 +20,7 @@
 // IN THE SOFTWARE.
 // IN THE SOFTWARE.
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 
 
-new GFXStateBlockData( ScatterSkySBData )
+singleton GFXStateBlockData( ScatterSkySBData )
 {
 {
    cullMode = "GFXCullNone";
    cullMode = "GFXCullNone";
    
    

+ 3 - 3
Templates/BaseGame/game/core/rendering/scripts/gfxData/shaders.cs

@@ -57,7 +57,7 @@ singleton ShaderData( OffscreenParticleCompositeShaderData )
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 // Planar Reflection
 // Planar Reflection
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
-new ShaderData( ReflectBump )
+singleton shaderData( ReflectBump )
 {
 {
    DXVertexShaderFile 	= $Core::CommonShaderPath @ "/planarReflectBumpV.hlsl";
    DXVertexShaderFile 	= $Core::CommonShaderPath @ "/planarReflectBumpV.hlsl";
    DXPixelShaderFile 	= $Core::CommonShaderPath @ "/planarReflectBumpP.hlsl";
    DXPixelShaderFile 	= $Core::CommonShaderPath @ "/planarReflectBumpP.hlsl";
@@ -72,7 +72,7 @@ new ShaderData( ReflectBump )
    pixVersion = 2.0;
    pixVersion = 2.0;
 };
 };
 
 
-new ShaderData( Reflect )
+singleton shaderData( Reflect )
 {
 {
    DXVertexShaderFile 	= $Core::CommonShaderPath @ "/planarReflectV.hlsl";
    DXVertexShaderFile 	= $Core::CommonShaderPath @ "/planarReflectV.hlsl";
    DXPixelShaderFile 	= $Core::CommonShaderPath @ "/planarReflectP.hlsl";
    DXPixelShaderFile 	= $Core::CommonShaderPath @ "/planarReflectP.hlsl";
@@ -89,7 +89,7 @@ new ShaderData( Reflect )
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 // fxFoliageReplicator
 // fxFoliageReplicator
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
-new ShaderData( fxFoliageReplicatorShader )
+singleton shaderData( fxFoliageReplicatorShader )
 {
 {
    DXVertexShaderFile 	= $Core::CommonShaderPath @ "/fxFoliageReplicatorV.hlsl";
    DXVertexShaderFile 	= $Core::CommonShaderPath @ "/fxFoliageReplicatorV.hlsl";
    DXPixelShaderFile 	= $Core::CommonShaderPath @ "/fxFoliageReplicatorP.hlsl";
    DXPixelShaderFile 	= $Core::CommonShaderPath @ "/fxFoliageReplicatorP.hlsl";

+ 1 - 1
Templates/BaseGame/game/core/rendering/scripts/gfxData/water.cs

@@ -45,7 +45,7 @@ singleton ShaderData( WaterShader )
    pixVersion = 3.0;
    pixVersion = 3.0;
 };
 };
 
 
-new GFXSamplerStateData(WaterSampler)
+singleton GFXSamplerStateData(WaterSampler)
 {
 {
    textureColorOp = GFXTOPModulate;
    textureColorOp = GFXTOPModulate;
    addressModeU = GFXAddressWrap;
    addressModeU = GFXAddressWrap;

+ 18 - 14
Templates/BaseGame/game/core/rendering/shaders/gl/lighting.glsl

@@ -81,6 +81,7 @@ struct Surface
 
 
 	float NdotV;			// cos(angle between normal and view vector)
 	float NdotV;			// cos(angle between normal and view vector)
 	vec3 f0;				// fresnel value (rgb)
 	vec3 f0;				// fresnel value (rgb)
+    float f90;
 	vec3 albedo;			// diffuse light absorbtion value (rgb)
 	vec3 albedo;			// diffuse light absorbtion value (rgb)
 	vec3 R;				// reflection vector
 	vec3 R;				// reflection vector
 	vec3 F;				// fresnel term computed from f0, N and V
 	vec3 F;				// fresnel term computed from f0, N and V
@@ -93,8 +94,8 @@ void updateSurface(inout Surface surface)
 	surface.albedo = surface.baseColor.rgb * (1.0 - surface.metalness);
 	surface.albedo = surface.baseColor.rgb * (1.0 - surface.metalness);
 	surface.f0 = lerp(vec3(0.04f), surface.baseColor.rgb, surface.metalness);
 	surface.f0 = lerp(vec3(0.04f), surface.baseColor.rgb, surface.metalness);
 	surface.R = -reflect(surface.V, surface.N);
 	surface.R = -reflect(surface.V, surface.N);
-	float f90 = saturate(50.0 * dot(surface.f0, vec3(0.33,0.33,0.33)));
-	surface.F = F_Schlick(surface.f0, f90, surface.NdotV);
+	surface.f90 = saturate(50.0 * dot(surface.f0, vec3(0.33,0.33,0.33)));
+	surface.F = F_Schlick(surface.f0, surface.f90, surface.NdotV);
 }
 }
 
 
 Surface createSurface(vec4 normDepth, sampler2D colorBuffer, sampler2D matInfoBuffer, in vec2 uv, in vec3 wsEyePos, in vec3 wsEyeRay, in mat4 invView)
 Surface createSurface(vec4 normDepth, sampler2D colorBuffer, sampler2D matInfoBuffer, in vec2 uv, in vec3 wsEyePos, in vec3 wsEyeRay, in mat4 invView)
@@ -229,6 +230,11 @@ vec3 getPunctualLight(in Surface surface, in SurfaceToLight surfaceToLight, vec3
    return final;
    return final;
 }
 }
 
 
+float computeSpecOcclusion( float NdotV , float AO , float roughness )
+{
+   return saturate (pow( abs(NdotV + AO) , exp2 ( -16.0f * roughness - 1.0f )) - 1.0f + AO );
+}
+
 vec4 compute4Lights( Surface surface,
 vec4 compute4Lights( Surface surface,
                      vec4 shadowMask,
                      vec4 shadowMask,
                      vec4 inLightPos[4],
                      vec4 inLightPos[4],
@@ -421,20 +427,18 @@ vec4 computeForwardProbes(Surface surface,
       specular = mix(specular,textureLod(specularCubemapAR, vec4(surface.R, skylightCubemapIdx), lod).xyz, alpha);
       specular = mix(specular,textureLod(specularCubemapAR, vec4(surface.R, skylightCubemapIdx), lod).xyz, alpha);
    }
    }
 
 
-   vec3 F = FresnelSchlickRoughness(surface.NdotV, surface.f0, surface.roughness);
-
    //energy conservation
    //energy conservation
-   vec3 kD = vec3(1.0,1.0,1.0) - F;
-   kD *= 1.0 - surface.metalness;
+   vec3 kD = 1.0f - surface.F;
+   kD *= 1.0f - surface.metalness;
 
 
-   //apply brdf
-   //Do it once to save on texture samples
-   vec2 brdf = textureLod(BRDFTexture, vec2(surface.roughness, 1.0-surface.NdotV),0).xy;
-   specular *= brdf.x * F + brdf.y;
+   float dfgNdotV = max( surface.NdotV , 0.0009765625f ); //0.5f/512.0f (512 is size of dfg/brdf lookup tex)
+   vec2 envBRDF = textureLod(BRDFTexture, vec2(dfgNdotV, surface.roughness),0).rg;
+   specular *= surface.F * envBRDF.x + surface.f90 * envBRDF.y;
+   irradiance *= kD * surface.baseColor.rgb;
 
 
-   //final diffuse color
-   vec3 diffuse = kD * irradiance * surface.baseColor.rgb;
-   vec4 finalColor = vec4(diffuse + specular * surface.ao, 1.0);
+   //AO
+   irradiance *= surface.ao;
+   specular *= computeSpecOcclusion(surface.NdotV, surface.ao, surface.roughness);
 
 
-   return finalColor;
+   return vec4(irradiance + specular, 0);//alpha writes disabled
 }
 }

+ 20 - 15
Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl

@@ -85,6 +85,7 @@ struct Surface
 	float3 albedo;			// diffuse light absorbtion value (rgb)
 	float3 albedo;			// diffuse light absorbtion value (rgb)
 	float3 R;				// reflection vector
 	float3 R;				// reflection vector
 	float3 F;				// fresnel term computed from f0, N and V
 	float3 F;				// fresnel term computed from f0, N and V
+   float f90;
 
 
 	inline void Update()
 	inline void Update()
 	{
 	{
@@ -94,7 +95,7 @@ struct Surface
 		f0 = lerp(0.04.xxx, baseColor.rgb, metalness);
 		f0 = lerp(0.04.xxx, baseColor.rgb, metalness);
 
 
 		R = -reflect(V, N);
 		R = -reflect(V, N);
-		float f90 = saturate(50.0 * dot(f0, 0.33));
+		f90 = saturate(50.0 * dot(f0, 0.33));
 		F = F_Schlick(f0, f90, NdotV);
 		F = F_Schlick(f0, f90, NdotV);
 	}
 	}
 };
 };
@@ -235,6 +236,11 @@ inline float3 getPunctualLight(in Surface surface, in SurfaceToLight surfaceToLi
    return final;
    return final;
 }
 }
 
 
+float computeSpecOcclusion( float NdotV , float AO , float roughness )
+{
+   return saturate (pow( abs(NdotV + AO) , exp2 ( -16.0f * roughness - 1.0f )) - 1.0f + AO );
+}
+
 float4 compute4Lights( Surface surface,
 float4 compute4Lights( Surface surface,
                      float4 shadowMask,
                      float4 shadowMask,
                      float4 inLightPos[4],
                      float4 inLightPos[4],
@@ -462,19 +468,18 @@ float4 computeForwardProbes(Surface surface,
       specular = lerp(specular,TORQUE_TEXCUBEARRAYLOD(specularCubemapAR, surface.R, skylightCubemapIdx, lod).xyz,alpha);
       specular = lerp(specular,TORQUE_TEXCUBEARRAYLOD(specularCubemapAR, surface.R, skylightCubemapIdx, lod).xyz,alpha);
    }
    }
 
 
-   float3 F = FresnelSchlickRoughness(surface.NdotV, surface.f0, surface.roughness);
-
    //energy conservation
    //energy conservation
-   float3 kD = 1.0.xxx - F;
-   kD *= 1.0 - surface.metalness;
-
-   //apply brdf
-   //Do it once to save on texture samples
-   float2 brdf = TORQUE_TEX2DLOD(BRDFTexture,float4(surface.roughness, 1.0-surface.NdotV, 0.0, 0.0)).xy;
-   specular *= brdf.x * F + brdf.y;
-
-   //final diffuse color
-   float3 diffuse = kD * irradiance * surface.baseColor.rgb;
-   float4 finalColor = float4(diffuse* surface.ao + specular * surface.ao, 1.0);
-   return finalColor;
+   float3 kD = 1.0f - surface.F;
+   kD *= 1.0f - surface.metalness;
+
+   float dfgNdotV = max( surface.NdotV , 0.0009765625f ); //0.5f/512.0f (512 is size of dfg/brdf lookup tex)
+   float2 envBRDF = TORQUE_TEX2DLOD(BRDFTexture, float4(dfgNdotV, surface.roughness,0,0)).rg;
+   specular *= surface.F * envBRDF.x + surface.f90 * envBRDF.y;
+   irradiance *= kD * surface.baseColor.rgb;
+
+   //AO
+   irradiance *= surface.ao;
+   specular *= computeSpecOcclusion(surface.NdotV, surface.ao, surface.roughness);
+
+   return float4(irradiance + specular, 0);//alpha writes disabled
 }
 }

+ 21 - 11
Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeArrayP.glsl

@@ -24,6 +24,11 @@ uniform int numProbes;
 uniform samplerCubeArray specularCubemapAR;
 uniform samplerCubeArray specularCubemapAR;
 uniform samplerCubeArray irradianceCubemapAR;
 uniform samplerCubeArray irradianceCubemapAR;
 
 
+#ifdef USE_SSAO_MASK
+uniform sampler2D ssaoMask;
+uniform vec4 rtParams6;
+#endif
+
 uniform vec4    inProbePosArray[MAX_PROBES];
 uniform vec4    inProbePosArray[MAX_PROBES];
 uniform vec4    inRefPosArray[MAX_PROBES];
 uniform vec4    inRefPosArray[MAX_PROBES];
 uniform mat4    worldToObjArray[MAX_PROBES];
 uniform mat4    worldToObjArray[MAX_PROBES];
@@ -52,6 +57,12 @@ void main()
    {
    {
       discard;
       discard;
    }
    }
+   
+   #ifdef USE_SSAO_MASK
+      float ssao = 1.0 - texture( ssaoMask, viewportCoordToRenderTarget( uv0.xy, rtParams6 ) ).r;
+      surface.ao = min(surface.ao, ssao);  
+   #endif
+
 
 
    float alpha = 1;
    float alpha = 1;
 
 
@@ -190,20 +201,19 @@ void main()
    return;
    return;
 #endif
 #endif
 
 
-   vec3 F = FresnelSchlickRoughness(surface.NdotV, surface.f0, surface.roughness);
 
 
    //energy conservation
    //energy conservation
-   vec3 kD = vec3(1,1,1) - F;
-   kD *= 1.0 - surface.metalness;
+   vec3 kD = 1.0f - surface.F;
+   kD *= 1.0f - surface.metalness;
 
 
-   //apply brdf
-   //Do it once to save on texture samples
-   vec2 brdf = textureLod(BRDFTexture, vec2(surface.roughness, surface.NdotV),0).xy;
-   specular *= brdf.x * F + brdf.y;
+   float dfgNdotV = max( surface.NdotV , 0.0009765625f ); //0.5f/512.0f (512 is size of dfg/brdf lookup tex)
+   vec2 envBRDF = textureLod(BRDFTexture, vec2(dfgNdotV, surface.roughness),0).rg;
+   specular *= surface.F * envBRDF.x + surface.f90 * envBRDF.y;
+   irradiance *= kD * surface.baseColor.rgb;
 
 
-   //final diffuse color
-   vec3 diffuse = kD * irradiance * surface.baseColor.rgb;
-   vec4 finalColor = vec4(diffuse + specular * surface.ao, 1.0);
+   //AO
+   irradiance *= surface.ao;
+   specular *= computeSpecOcclusion(surface.NdotV, surface.ao, surface.roughness);
 
 
-   OUT_col = finalColor;
+   OUT_col = vec4(irradiance + specular, 0);//alpha writes disabled
 }
 }

+ 0 - 9
Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/vectorLightP.glsl

@@ -37,11 +37,6 @@ uniform sampler2D deferredBuffer;
 uniform sampler2D shadowMap;
 uniform sampler2D shadowMap;
 uniform sampler2D dynamicShadowMap;
 uniform sampler2D dynamicShadowMap;
 
 
-#ifdef USE_SSAO_MASK
-uniform sampler2D ssaoMask ;
-uniform vec4 rtParams3;
-#endif
-
 uniform sampler2D colorBuffer;
 uniform sampler2D colorBuffer;
 uniform sampler2D matInfoBuffer;             
 uniform sampler2D matInfoBuffer;             
 uniform float  lightBrightness;
 uniform float  lightBrightness;
@@ -245,10 +240,6 @@ void main()
       #endif
       #endif
 
 
    #endif //NO_SHADOW
    #endif //NO_SHADOW
-   // Sample the AO texture.      
-   #ifdef USE_SSAO_MASK
-      surface.ao *= 1.0 - texture( ssaoMask, viewportCoordToRenderTarget( uv0.xy, rtParams3 ) ).r;
-   #endif
 
 
    //get directional light contribution   
    //get directional light contribution   
    vec3 lighting = getDirectionalLight(surface, surfaceToLight, lightingColor.rgb, lightBrightness, shadow);
    vec3 lighting = getDirectionalLight(surface, surfaceToLight, lightingColor.rgb, lightBrightness, shadow);

+ 23 - 14
Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl

@@ -21,6 +21,11 @@ uniform int numProbes;
 TORQUE_UNIFORM_SAMPLERCUBEARRAY(specularCubemapAR, 4);
 TORQUE_UNIFORM_SAMPLERCUBEARRAY(specularCubemapAR, 4);
 TORQUE_UNIFORM_SAMPLERCUBEARRAY(irradianceCubemapAR, 5);
 TORQUE_UNIFORM_SAMPLERCUBEARRAY(irradianceCubemapAR, 5);
 
 
+#ifdef USE_SSAO_MASK
+TORQUE_UNIFORM_SAMPLER2D(ssaoMask, 6);
+uniform float4 rtParams6;
+#endif
+
 uniform float4    inProbePosArray[MAX_PROBES];
 uniform float4    inProbePosArray[MAX_PROBES];
 uniform float4    inRefPosArray[MAX_PROBES];
 uniform float4    inRefPosArray[MAX_PROBES];
 uniform float4x4  worldToObjArray[MAX_PROBES];
 uniform float4x4  worldToObjArray[MAX_PROBES];
@@ -49,6 +54,11 @@ float4 main(PFXVertToPix IN) : SV_TARGET
       return TORQUE_TEX2D(colorBuffer, IN.uv0.xy);
       return TORQUE_TEX2D(colorBuffer, IN.uv0.xy);
    }
    }
 
 
+   #ifdef USE_SSAO_MASK
+      float ssao =  1.0 - TORQUE_TEX2D( ssaoMask, viewportCoordToRenderTarget( IN.uv0.xy, rtParams6 ) ).r;
+      surface.ao = min(surface.ao, ssao);  
+   #endif
+
    float alpha = 1;
    float alpha = 1;
 
 
 #if SKYLIGHT_ONLY == 0
 #if SKYLIGHT_ONLY == 0
@@ -182,19 +192,18 @@ float4 main(PFXVertToPix IN) : SV_TARGET
    return float4(irradiance, 1);
    return float4(irradiance, 1);
 #endif
 #endif
 
 
-   float3 F = FresnelSchlickRoughness(surface.NdotV, surface.f0, surface.roughness);
-
    //energy conservation
    //energy conservation
-   float3 kD = 1.0.xxx - F;
-   kD *= 1.0 - surface.metalness;
-
-   //apply brdf
-   //Do it once to save on texture samples
-   float2 brdf = TORQUE_TEX2DLOD(BRDFTexture, float4(surface.roughness, 1.0-surface.NdotV, 0.0, 0.0)).xy;
-   specular *= brdf.x * F + brdf.y;
-
-   //final diffuse color
-   float3 diffuse = kD * irradiance * surface.baseColor.rgb;
-   float4 finalColor = float4(diffuse* surface.ao + specular * surface.ao, 1.0);
-   return finalColor;
+   float3 kD = 1.0f - surface.F;
+   kD *= 1.0f - surface.metalness;
+
+   float dfgNdotV = max( surface.NdotV , 0.0009765625f ); //0.5f/512.0f (512 is size of dfg/brdf lookup tex)
+   float2 envBRDF = TORQUE_TEX2DLOD(BRDFTexture, float4(dfgNdotV, surface.roughness,0,0)).rg;
+   specular *= surface.F * envBRDF.x + surface.f90 * envBRDF.y;
+   irradiance *= kD * surface.baseColor.rgb;
+
+   //AO
+   irradiance *= surface.ao;
+   specular *= computeSpecOcclusion(surface.NdotV, surface.ao, surface.roughness);
+
+   return float4(irradiance + specular, 0);//alpha writes disabled
 }
 }

+ 1 - 1
Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/softShadow.hlsl

@@ -70,7 +70,7 @@ static float2 sNonUniformTaps[NUM_PRE_TAPS] =
 
 
 /// The texture used to do per-pixel pseudorandom
 /// The texture used to do per-pixel pseudorandom
 /// rotations of the filter taps.
 /// rotations of the filter taps.
-TORQUE_UNIFORM_SAMPLER2D(gTapRotationTex, 4);
+TORQUE_UNIFORM_SAMPLER2D(gTapRotationTex, 3);
 
 
 float softShadow_sampleTaps(  TORQUE_SAMPLER2D(shadowMap1),
 float softShadow_sampleTaps(  TORQUE_SAMPLER2D(shadowMap1),
                               float2 sinCos,
                               float2 sinCos,

+ 2 - 11
Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/vectorLightP.hlsl

@@ -33,13 +33,8 @@ TORQUE_UNIFORM_SAMPLER2D(deferredBuffer, 0);
 TORQUE_UNIFORM_SAMPLER2D(shadowMap, 1);
 TORQUE_UNIFORM_SAMPLER2D(shadowMap, 1);
 TORQUE_UNIFORM_SAMPLER2D(dynamicShadowMap, 2);
 TORQUE_UNIFORM_SAMPLER2D(dynamicShadowMap, 2);
 
 
-#ifdef USE_SSAO_MASK
-TORQUE_UNIFORM_SAMPLER2D(ssaoMask, 3);
-uniform float4 rtParams3;
-#endif
-
-TORQUE_UNIFORM_SAMPLER2D(colorBuffer, 6);
-TORQUE_UNIFORM_SAMPLER2D(matInfoBuffer, 7);
+TORQUE_UNIFORM_SAMPLER2D(colorBuffer, 5);
+TORQUE_UNIFORM_SAMPLER2D(matInfoBuffer, 6);
 
 
 uniform float  lightBrightness;
 uniform float  lightBrightness;
 uniform float3 lightDirection;
 uniform float3 lightDirection;
@@ -234,10 +229,6 @@ float4 main(FarFrustumQuadConnectP IN) : SV_TARGET
       #endif
       #endif
 
 
    #endif //NO_SHADOW
    #endif //NO_SHADOW
-   // Sample the AO texture.
-   #ifdef USE_SSAO_MASK
-      surface.ao *= 1.0 - TORQUE_TEX2D( ssaoMask, viewportCoordToRenderTarget( IN.uv0.xy, rtParams3 ) ).r;
-   #endif
    
    
    //get directional light contribution   
    //get directional light contribution   
    float3 lighting = getDirectionalLight(surface, surfaceToLight, lightingColor.rgb, lightBrightness, shadow);
    float3 lighting = getDirectionalLight(surface, surfaceToLight, lightingColor.rgb, lightBrightness, shadow);

+ 190 - 4
Templates/BaseGame/game/core/utility/scripts/module.cs

@@ -1,5 +1,12 @@
+$traceModuleCalls=false;
+$reportModuleFileConflicts=true;
+if (!isObject(ExecFilesList))
+   new ArrayObject(ExecFilesList);
+  
 function callOnModules(%functionName, %moduleGroup)
 function callOnModules(%functionName, %moduleGroup)
 {
 {
+   //clear per module group file execution chain
+   ExecFilesList.empty();
    //Get our modules so we can exec any specific client-side loading/handling
    //Get our modules so we can exec any specific client-side loading/handling
    %modulesList = ModuleDatabase.findModules(false);
    %modulesList = ModuleDatabase.findModules(false);
    for(%i=0; %i < getWordCount(%modulesList); %i++)
    for(%i=0; %i < getWordCount(%modulesList); %i++)
@@ -16,7 +23,14 @@ function callOnModules(%functionName, %moduleGroup)
       {
       {
          eval(%module.scopeSet @ "." @ %functionName @ "();");
          eval(%module.scopeSet @ "." @ %functionName @ "();");
       }
       }
-   }   
+   }
+   
+   %execFilecount = ExecFilesList.count();
+   for (%i=0;%i<%execFilecount;%i++)
+   {
+        %filename = ExecFilesList.getKey(%i);
+        exec(%filename);
+   }
 }
 }
 
 
 function loadModuleMaterials(%moduleGroup)
 function loadModuleMaterials(%moduleGroup)
@@ -69,10 +83,12 @@ function SimSet::getModulePath(%scopeSet)
    return "";
    return "";
 }
 }
 
 
-function SimSet::registerDatablock(%scopeSet, %datablockFilePath)
+function SimSet::registerDatablock(%scopeSet, %datablockFilePath, %isExclusive)
 {
 {
+   if ($traceModuleCalls)
+      warn("SimSet::registerDatablock");
    %name = %scopeSet.getName();
    %name = %scopeSet.getName();
-   %moduleDef = ModuleDatabase.findModule(%name);
+   %moduleDef = ModuleDatabase.findModule(%name, 1);
      
      
    if(!isObject(%moduleDef))
    if(!isObject(%moduleDef))
    {
    {
@@ -89,6 +105,176 @@ function SimSet::registerDatablock(%scopeSet, %datablockFilePath)
    %relativePath = makeRelativePath(%datablockFilePath);
    %relativePath = makeRelativePath(%datablockFilePath);
    
    
    %fullPath = pathConcat(%moduleDef.ModulePath, %relativePath);
    %fullPath = pathConcat(%moduleDef.ModulePath, %relativePath);
+   ///go through all entries
+   %locked = false;
+   %dbFilecount = DatablockFilesList.count();
+   for (%i=0;%i<%dbFilecount;%i++)
+   {
+        %check = DatablockFilesList.getKey(%i);
+        //look for a substring match
+        %isMatch = strIsMatchExpr("*"@ %datablockFilePath,%check );
+        if (%isMatch)
+        {
+            //check if we're already locked in
+            //and kill off any duplicates
+            //do note that doing it in this order means setting exclusive twice
+            //allows one to override exclusive with exclusive
+            %locked = DatablockFilesList.getValue(%i);
+
+            if ((!%locked && !%isExclusive)&&($reportModuleFileConflicts))
+                error("found" SPC %datablockFilePath SPC "duplicate file!");
+            if (!%locked || (%locked && %isExclusive))
+            {
+                DatablockFilesList.erase(%i);
+            }
+        }
+   }
+   //if we're not locked, or we are exclusive, go ahead and add it to the pile
+   //(ensures exclusives get re-added after that erasure)
+   if (!%locked || %isExclusive)
+       DatablockFilesList.add(%fullPath,%isExclusive);
+   if ($traceModuleCalls)
+      DatablockFilesList.echo();
+}
+
+function SimSet::unRegisterDatablock(%scopeSet, %datablockFilePath)
+{
+   if ($traceModuleCalls)
+      warn("SimSet::unRegisterDatablock");
+   %name = %scopeSet.getName();
+   %moduleDef = ModuleDatabase.findModule(%name, 1);
+     
+   if(!isObject(%moduleDef))
+   {
+      error("Module::unRegisterDatablock() - unable to find a module with the moduleID of " @ %name);
+      return;
+   }
+   
+   if(!isObject(DatablockFilesList))
+   {
+      error("Module::unRegisterDatablock() - DatablockFilesList array object doesn't exist!");
+      return;
+   }
+   
+   %relativePath = makeRelativePath(%datablockFilePath);
    
    
-   DatablockFilesList.add(%fullPath);
+   %fullPath = pathConcat(%moduleDef.ModulePath, %relativePath);
+   ///go through all entries
+   %locked = false;
+   %dbFilecount = DatablockFilesList.count();
+   for (%i=0;%i<%dbFilecount;%i++)
+   {
+        %check = DatablockFilesList.getKey(%i);
+        //look for a substring match
+        %isMatch = strIsMatchExpr("*"@ %datablockFilePath,%check );
+        if (%isMatch)
+        {
+            //check if we're already locked in. if not, kill it.
+            %locked = DatablockFilesList.getValue(%i);
+            if (!%locked)
+            {
+                DatablockFilesList.erase(%i);
+            }
+        }
+   }
+   if ($traceModuleCalls)
+      DatablockFilesList.echo();
+}
+
+function SimSet::queueExec(%scopeSet, %execFilePath, %isExclusive)
+{
+   if ($traceModuleCalls)
+      warn("SimSet::queueExec");
+   %name = %scopeSet.getName();
+   %moduleDef = ModuleDatabase.findModule(%name, 1);
+     
+   if(!isObject(%moduleDef))
+   {
+      error("Module::queueExec() - unable to find a module with the moduleID of " @ %name);
+      return;
+   }
+   
+   if(!isObject(ExecFilesList))
+   {
+      error("Module::queueExec() - ExecFilesList array object doesn't exist!");
+      return;
+   }
+   
+   if ($traceModuleCalls)
+      warn("module root path="@ makeRelativePath(%moduleDef.ModulePath));
+  
+   %fullPath = makeRelativePath(%moduleDef.ModulePath) @ %execFilePath;
+   ///go through all entries
+   %locked = false;
+   %execFilecount = ExecFilesList.count();
+   for (%i=0;%i<%execFilecount;%i++)
+   {
+        %check = ExecFilesList.getKey(%i);
+        //look for a substring match
+        %isMatch = strIsMatchExpr("*"@ %execFilePath,%check );
+        if (%isMatch)
+        {
+            //check if we're already locked in
+            //and kill off any duplicates
+            //do note that doing it in this order means setting exclusive twice
+            //allows one to override exclusive with exclusive
+            %locked = ExecFilesList.getValue(%i);
+            if ((!%locked && !%isExclusive)&&($reportModuleFileConflicts))
+                error("found" SPC %execFilePath SPC "duplicate file!");
+            if (!%locked || (%locked && %isExclusive))
+            {
+                ExecFilesList.erase(%i);
+            }
+        }
+   }
+   //if we're not locked, or we are exclusive, go ahead and add it to the pile
+   //(ensures exclusives get re-added after that erasure)
+   if (!%locked || %isExclusive)
+       ExecFilesList.add(%fullPath,%isExclusive);
+   if ($traceModuleCalls)       
+      ExecFilesList.echo();
+}
+
+function SimSet::unQueueExec(%scopeSet, %execFilePath)
+{
+   if ($traceModuleCalls)
+      warn("SimSet::unRegisterDatablock");
+   %name = %scopeSet.getName();
+   %moduleDef = ModuleDatabase.findModule(%name, 1);
+     
+   if(!isObject(%moduleDef))
+   {
+      error("Module::unRegisterDatablock() - unable to find a module with the moduleID of " @ %name);
+      return;
+   }
+   
+   if(!isObject(ExecFilesList))
+   {
+      error("Module::unRegisterDatablock() - ExecFilesList array object doesn't exist!");
+      return;
+   }
+   
+   %relativePath = makeRelativePath(%execFilePath);
+   
+   %fullPath = pathConcat(%moduleDef.ModulePath, %relativePath);
+   ///go through all entries
+   %locked = false;
+   %execFilecount = ExecFilesList.count();
+   for (%i=0;%i<%execFilecount;%i++)
+   {
+        %check = ExecFilesList.getKey(%i);
+        //look for a substring match
+        %isMatch = strIsMatchExpr("*"@ %execFilePath,%check );
+        if (%isMatch)
+        {
+            //check if we're already locked in. if not, kill it.
+            %locked = ExecFilesList.getValue(%i);
+            if (!%locked)
+            {
+                ExecFilesList.erase(%i);
+            }
+        }
+   }
+   if ($traceModuleCalls)
+      ExecFilesList.echo();
 }
 }

+ 2 - 2
Templates/BaseGame/game/data/ExampleModule/components/ExampleComponent.cs

@@ -4,7 +4,7 @@ function ExampleComponent::onAdd(%this)
 {
 {
     
     
 }
 }
-//onAdd is called when the component is removed and deleted from it's owner entity.
+//onRemove is called when the component is removed and deleted from it's owner entity.
 function ExampleComponent::onRemove(%this)
 function ExampleComponent::onRemove(%this)
 {
 {
     
     
@@ -15,7 +15,7 @@ function ExampleComponent::onClientConnect(%this, %client)
     
     
 }
 }
 //onClientDisconnect is called any time a client disconnects from the server.
 //onClientDisconnect is called any time a client disconnects from the server.
-function ExampleComponent::onClientDisonnect(%this, %client)
+function ExampleComponent::onClientDisconnect(%this, %client)
 {
 {
 
 
 }
 }

+ 1 - 1
Templates/BaseGame/game/data/ui/guis/optionsMenu.cs

@@ -367,7 +367,7 @@ function OptionsMenuBackSetting::onClick(%this)
       
       
       //advance by one
       //advance by one
       %newSetting = getToken(%settingsList, ",", %currentSettingIdx);
       %newSetting = getToken(%settingsList, ",", %currentSettingIdx);
-      eval(%settingCtrl.qualitySettingGroup@"::set("@%newSetting@");");
+      eval(%settingCtrl.qualitySettingGroup@"::set(\""@%newSetting@"\");");
       %settingCtrl-->SettingText.setText( %newSetting );
       %settingCtrl-->SettingText.setText( %newSetting );
       
       
       if(%currentSettingIdx == %settingsListCount)
       if(%currentSettingIdx == %settingsListCount)

+ 8 - 1
Templates/BaseGame/game/data/ui/scripts/displayMenu.cs

@@ -38,7 +38,14 @@ function DisplayMenu::apply(%this)
    }
    }
       
       
    //Update the display settings now
    //Update the display settings now
-   $pref::Video::Resolution = getWord( $pref::Video::Resolution, 0 ) SPC getWord( $pref::Video::Resolution, 2 );
+   if (getWord( $pref::Video::Resolution, 2) == "")
+   {
+      $pref::Video::Resolution = getWord( $pref::Video::Resolution, 0 ) SPC getWord( $pref::Video::Resolution, 1 );
+   }
+   else
+   {
+      $pref::Video::Resolution = getWord( $pref::Video::Resolution, 0 ) SPC getWord( $pref::Video::Resolution, 2 );
+   }
 	
 	
    /*if ( %newFullScreen $= "false" )
    /*if ( %newFullScreen $= "false" )
 	{
 	{

+ 29 - 29
Templates/BaseGame/game/tools/assetBrowser/assetImportConfigs.xml

@@ -1,56 +1,56 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <AssetImportSettings>
 <AssetImportSettings>
     <Group name="TestConfig">
     <Group name="TestConfig">
+        <Group name="Animations">
+            <Setting name="SeparateAnimations">1</Setting>
+            <Setting name="ImportAnimations">1</Setting>
+        </Group>
+        <Group name="Materials">
+            <Setting name="IgnoreMaterials">ColorEffect*,</Setting>
+            <Setting name="UseExistingMaterials">1</Setting>
+            <Setting name="UseDiffuseSuffixOnOriginImage">1</Setting>
+            <Setting name="CreateComposites">1</Setting>
+            <Setting name="ImportMaterials">1</Setting>
+        </Group>
         <Group name="Meshes">
         <Group name="Meshes">
-            <Setting name="DoUpAxisOverride">0</Setting>
-            <Setting name="IgnoreNodeScale">0</Setting>
-            <Setting name="ScaleOverride">1</Setting>
-            <Setting name="CollapseSubmeshes">0</Setting>
-            <Setting name="AdjustCenter">0</Setting>
             <Setting name="AdjustFloor">0</Setting>
             <Setting name="AdjustFloor">0</Setting>
+            <Setting name="CollapseSubmeshes">0</Setting>
+            <Setting name="IgnoreNodeScale">0</Setting>
             <Setting name="UpAxisOverride">Z_AXIS</Setting>
             <Setting name="UpAxisOverride">Z_AXIS</Setting>
+            <Setting name="ScaleOverride">1</Setting>
             <Setting name="LODType">TrailingNumber</Setting>
             <Setting name="LODType">TrailingNumber</Setting>
-        </Group>
-        <Group name="Materials">
-            <Setting name="ImportMaterials">1</Setting>
-            <Setting name="CreateComposites">1</Setting>
-            <Setting name="UseDiffuseSuffixOnOriginImage">1</Setting>
-            <Setting name="UseExistingMaterials">1</Setting>
-            <Setting name="IgnoreMaterials">ColorEffect*,</Setting>
+            <Setting name="AdjustCenter">0</Setting>
+            <Setting name="DoUpAxisOverride">0</Setting>
         </Group>
         </Group>
         <Group name="Images">
         <Group name="Images">
-            <Setting name="AOTypeSuffixes">_AO,_AMBIENT,_AMBIENTOCCLUSION</Setting>
-            <Setting name="MetalnessTypeSuffixes">_METAL,_MET,_METALNESS,_METALLIC</Setting>
-            <Setting name="PopulateMaterialMaps">1</Setting>
+            <Setting name="Scaling">1.0</Setting>
             <Setting name="UseMips">1</Setting>
             <Setting name="UseMips">1</Setting>
-            <Setting name="Compressed">1</Setting>
             <Setting name="TextureFilteringMode">Bilinear</Setting>
             <Setting name="TextureFilteringMode">Bilinear</Setting>
-            <Setting name="GenerateMaterialOnImport">1</Setting>
-            <Setting name="RoughnessTypeSuffixes">_ROUGH,_ROUGHNESS</Setting>
             <Setting name="IsHDR">0</Setting>
             <Setting name="IsHDR">0</Setting>
-            <Setting name="Scaling">1.0</Setting>
-            <Setting name="DiffuseTypeSuffixes">_ALBEDO,_DIFFUSE,_ALB,_DIF,_COLOR,_COL,_baseColor,</Setting>
-            <Setting name="CompositeTypeSuffixes">_COMP,_COMPOSITE</Setting>
+            <Setting name="MetalnessTypeSuffixes">_METAL,_MET,_METALNESS,_METALLIC</Setting>
+            <Setting name="NormalTypeSuffixes">_NORMAL,_NORM</Setting>
+            <Setting name="AOTypeSuffixes">_AO,_AMBIENT,_AMBIENTOCCLUSION</Setting>
             <Setting name="ImageType">N/A</Setting>
             <Setting name="ImageType">N/A</Setting>
+            <Setting name="Compressed">1</Setting>
+            <Setting name="RoughnessTypeSuffixes">_ROUGH,_ROUGHNESS</Setting>
             <Setting name="SmoothnessTypeSuffixes">_SMOOTH,_SMOOTHNESS</Setting>
             <Setting name="SmoothnessTypeSuffixes">_SMOOTH,_SMOOTHNESS</Setting>
-            <Setting name="NormalTypeSuffixes">_NORMAL,_NORM</Setting>
+            <Setting name="DiffuseTypeSuffixes">_ALBEDO,_DIFFUSE,_ALB,_DIF,_COLOR,_COL,_baseColor,_a,</Setting>
+            <Setting name="PopulateMaterialMaps">1</Setting>
+            <Setting name="GenerateMaterialOnImport">1</Setting>
+            <Setting name="CompositeTypeSuffixes">_COMP,_COMPOSITE</Setting>
         </Group>
         </Group>
         <Group name="Collision">
         <Group name="Collision">
             <Setting name="GenerateLOSCollisions">1</Setting>
             <Setting name="GenerateLOSCollisions">1</Setting>
-            <Setting name="GenerateCollisions">1</Setting>
-            <Setting name="LOSCollisionMeshPrefix">LOS</Setting>
             <Setting name="CollisionMeshPrefix">Col</Setting>
             <Setting name="CollisionMeshPrefix">Col</Setting>
             <Setting name="GenCollisionType">CollisionMesh</Setting>
             <Setting name="GenCollisionType">CollisionMesh</Setting>
+            <Setting name="GenerateCollisions">1</Setting>
+            <Setting name="LOSCollisionMeshPrefix">LOS</Setting>
             <Setting name="GenLOSCollisionType">CollisionMesh</Setting>
             <Setting name="GenLOSCollisionType">CollisionMesh</Setting>
         </Group>
         </Group>
-        <Group name="Animations">
-            <Setting name="ImportAnimations">1</Setting>
-            <Setting name="SeparateAnimations">1</Setting>
-        </Group>
         <Group name="Sounds">
         <Group name="Sounds">
             <Setting name="PitchAdjust">1.0</Setting>
             <Setting name="PitchAdjust">1.0</Setting>
-            <Setting name="Compressed">0</Setting>
             <Setting name="VolumeAdjust">1.0</Setting>
             <Setting name="VolumeAdjust">1.0</Setting>
+            <Setting name="Compressed">0</Setting>
         </Group>
         </Group>
         <Group name="General">
         <Group name="General">
             <Setting name="DuplicatAutoResolution">AutoPrune</Setting>
             <Setting name="DuplicatAutoResolution">AutoPrune</Setting>

+ 224 - 246
Templates/BaseGame/game/tools/assetBrowser/guis/assetBrowser.gui

@@ -13,13 +13,23 @@
    isContainer = "1";
    isContainer = "1";
    canSave = "1";
    canSave = "1";
    canSaveDynamicFields = "1";
    canSaveDynamicFields = "1";
-      AddNewArtAssetPopup = "18222";
-      AddNewAssetPopup = "18223";
-      AddNewScriptAssetPopup = "18221";
+      AddNewArtAssetPopup = "18110";
+      AddNewAssetPopup = "18112";
+      AddNewCppAssetPopup = "18111";
+      AddNewScriptAssetPopup = "18109";
       coreModulesFilter = "0";
       coreModulesFilter = "0";
       currentPreviewPage = "0";
       currentPreviewPage = "0";
-      enabled = "1";
+      Enabled = "1";
+      importAssetFinalListArray = "20689";
+      ImportAssetResolutionsPopup = "18119";
+      importAssetUnprocessedListArray = "20688";
+      importingFilesArray = "20687";
       isReImportingAsset = "0";
       isReImportingAsset = "0";
+      navigationHistoryIdx = "0";
+      onlyShowModulesWithAssets = "0";
+      previewData = "19953";
+      previewSize = "80";
+      templateFilesPath = "tools/assetBrowser/scripts/templateFiles/";
       totalPages = "1";
       totalPages = "1";
       treeFilterMode = "list";
       treeFilterMode = "list";
 
 
@@ -201,7 +211,7 @@
          groupNum = "-1";
          groupNum = "-1";
          buttonType = "PushButton";
          buttonType = "PushButton";
          useMouseEvents = "0";
          useMouseEvents = "0";
-         position = "50 22";
+         position = "52 22";
          extent = "45 19";
          extent = "45 19";
          minExtent = "8 2";
          minExtent = "8 2";
          horizSizing = "right";
          horizSizing = "right";
@@ -215,97 +225,107 @@
          canSave = "1";
          canSave = "1";
          canSaveDynamicFields = "0";
          canSaveDynamicFields = "0";
       };
       };
-      new GuiWindowCtrl(TagFilterWindow) {
-         text = "New Window";
-         resizeWidth = "1";
-         resizeHeight = "1";
-         canMove = "1";
-         canClose = "0";
-         canMinimize = "0";
-         canMaximize = "0";
-         canCollapse = "0";
-         edgeSnap = "1";
-         docking = "None";
-         margin = "4 4 4 4";
-         padding = "0 0 0 0";
-         anchorTop = "0";
-         anchorBottom = "0";
-         anchorLeft = "0";
-         anchorRight = "0";
-         position = "129 62";
-         extent = "161 250";
-         minExtent = "161 86";
-         horizSizing = "windowRelative";
-         vertSizing = "windowRelative";
-         profile = "ToolsGuiToolbarWindowProfile";
-         visible = "0";
+      new GuiBitmapButtonCtrl(AssetBrowser_NavigateBackBtn) {
+         bitmap = "tools/gui/images/folderUp.png";
+         bitmapMode = "Centered";
+         autoFitExtents = "0";
+         useModifiers = "0";
+         useStates = "1";
+         masked = "0";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "98 21";
+         extent = "22 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         command = "AssetBrowser.navigateHistoryBack();";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiBitmapButtonCtrl(AssetBrowser_NavigateForwardBtn) {
+         bitmap = "tools/gui/images/folderDown.png";
+         bitmapMode = "Centered";
+         autoFitExtents = "0";
+         useModifiers = "0";
+         useStates = "1";
+         masked = "0";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "120 21";
+         extent = "22 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         command = "AssetBrowser.navigateHistoryForward();";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiStackControl(AssetBrowser_BreadcrumbBar) {
+         stackingType = "Horizontal";
+         horizStacking = "Left to Right";
+         vertStacking = "Top to Bottom";
+         padding = "0";
+         dynamicSize = "0";
+         dynamicNonStackExtent = "0";
+         dynamicPos = "0";
+         changeChildSizeToFit = "0";
+         changeChildPosition = "1";
+         position = "156 21";
+         extent = "326 23";
+         minExtent = "16 16";
+         horizSizing = "width";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
          active = "1";
          active = "1";
          tooltipProfile = "GuiToolTipProfile";
          tooltipProfile = "GuiToolTipProfile";
          hovertime = "1000";
          hovertime = "1000";
          isContainer = "1";
          isContainer = "1";
-         internalName = "VisibilityLayerWindow";
-         hidden = "1";
          canSave = "1";
          canSave = "1";
          canSaveDynamicFields = "0";
          canSaveDynamicFields = "0";
-
-         new GuiScrollCtrl() {
-            willFirstRespond = "1";
-            hScrollBar = "alwaysOff";
-            vScrollBar = "dynamic";
-            lockHorizScroll = "1";
-            lockVertScroll = "0";
-            constantThumbHeight = "0";
-            childMargin = "2 0";
-            mouseWheelScrollSpeed = "-1";
-            docking = "Client";
-            margin = "0 0 0 0";
-            padding = "0 0 0 0";
-            anchorTop = "1";
-            anchorBottom = "0";
-            anchorLeft = "1";
-            anchorRight = "0";
-            position = "1 9";
-            extent = "159 238";
-            minExtent = "8 2";
-            horizSizing = "width";
-            vertSizing = "height";
-            profile = "ToolsGuiScrollProfile";
-            visible = "1";
-            active = "1";
-            tooltipProfile = "ToolsGuiToolTipProfile";
-            hovertime = "1000";
-            isContainer = "1";
-            canSave = "1";
-            canSaveDynamicFields = "0";
-
-            new GuiStackControl(TagFilterList) {
-               stackingType = "Vertical";
-               horizStacking = "Left to Right";
-               vertStacking = "Top to Bottom";
-               padding = "-2";
-               dynamicSize = "1";
-               dynamicNonStackExtent = "0";
-               dynamicPos = "0";
-               changeChildSizeToFit = "1";
-               changeChildPosition = "1";
-               position = "3 1";
-               extent = "153 16";
-               minExtent = "16 16";
-               horizSizing = "width";
-               vertSizing = "bottom";
-               profile = "ToolsGuiDefaultProfile";
-               visible = "1";
-               active = "1";
-               tooltipProfile = "ToolsGuiToolTipProfile";
-               hovertime = "1000";
-               isContainer = "1";
-               internalName = "theVisOptionsList";
-               canSave = "1";
-               canSaveDynamicFields = "0";
-            };
-         };
       };
       };
-      new GuiSplitContainer() {
+      new GuiBitmapButtonCtrl(AssetBrowser_VisibilityOptions) {
+         bitmap = "tools/gui/images/visible";
+         bitmapMode = "Centered";
+         autoFitExtents = "0";
+         useModifiers = "0";
+         useStates = "1";
+         masked = "0";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "487 21";
+         extent = "23 23";
+         minExtent = "8 2";
+         horizSizing = "left";
+         vertSizing = "bottom";
+         profile = "ToolsGuiSolidDefaultProfile";
+         visible = "1";
+         active = "1";
+         command = "AssetBrowser.showVisibiltyOptions();";
+         tooltipProfile = "GuiToolTipProfile";
+         tooltip = "Visibility Options";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiSplitContainer(AssetBrowser_MainSplit) {
          orientation = "Vertical";
          orientation = "Vertical";
          splitterSize = "2";
          splitterSize = "2";
          splitPoint = "149 100";
          splitPoint = "149 100";
@@ -323,7 +343,7 @@
          minExtent = "64 64";
          minExtent = "64 64";
          horizSizing = "relative";
          horizSizing = "relative";
          vertSizing = "height";
          vertSizing = "height";
-         profile = "ToolsGuiDefaultProfile";
+         profile = "ToolsGuiSolidDefaultProfile";
          visible = "1";
          visible = "1";
          active = "1";
          active = "1";
          tooltipProfile = "GuiToolTipProfile";
          tooltipProfile = "GuiToolTipProfile";
@@ -332,7 +352,7 @@
          canSave = "1";
          canSave = "1";
          canSaveDynamicFields = "0";
          canSaveDynamicFields = "0";
 
 
-         new GuiPanel() {
+         new GuiPanel(AssetBrowser_FoldersPanel) {
             docking = "Client";
             docking = "Client";
             margin = "0 0 0 0";
             margin = "0 0 0 0";
             padding = "0 0 0 0";
             padding = "0 0 0 0";
@@ -342,10 +362,10 @@
             anchorRight = "0";
             anchorRight = "0";
             position = "0 0";
             position = "0 0";
             extent = "147 509";
             extent = "147 509";
-            minExtent = "16 16";
+            minExtent = "0 0";
             horizSizing = "right";
             horizSizing = "right";
             vertSizing = "bottom";
             vertSizing = "bottom";
-            profile = "ToolsGuiDefaultProfile";
+            profile = "ToolsGuiSolidDefaultProfile";
             visible = "1";
             visible = "1";
             active = "1";
             active = "1";
             tooltipProfile = "GuiToolTipProfile";
             tooltipProfile = "GuiToolTipProfile";
@@ -376,8 +396,13 @@
                canSave = "1";
                canSave = "1";
                canSaveDynamicFields = "0";
                canSaveDynamicFields = "0";
 
 
-               new GuiTextCtrl() {
-                  text = "Filters";
+               new GuiTextEditCtrl(AssetBrowserFolderSearchFilter) {
+                  historySize = "0";
+                  tabComplete = "0";
+                  sinkAllKeyEvents = "0";
+                  password = "0";
+                  passwordMask = "*";
+                  text = "Search Folders...";
                   maxLength = "1024";
                   maxLength = "1024";
                   margin = "0 0 0 0";
                   margin = "0 0 0 0";
                   padding = "0 0 0 0";
                   padding = "0 0 0 0";
@@ -385,23 +410,24 @@
                   anchorBottom = "0";
                   anchorBottom = "0";
                   anchorLeft = "1";
                   anchorLeft = "1";
                   anchorRight = "0";
                   anchorRight = "0";
-                  position = "5 0";
-                  extent = "30 16";
+                  position = "0 0";
+                  extent = "148 18";
                   minExtent = "8 2";
                   minExtent = "8 2";
-                  horizSizing = "right";
-                  vertSizing = "bottom";
-                  profile = "ToolsGuiDefaultProfile";
+                  horizSizing = "width";
+                  vertSizing = "height";
+                  profile = "ToolsGuiTextEditProfile";
                   visible = "1";
                   visible = "1";
                   active = "1";
                   active = "1";
                   tooltipProfile = "GuiToolTipProfile";
                   tooltipProfile = "GuiToolTipProfile";
                   hovertime = "1000";
                   hovertime = "1000";
                   isContainer = "1";
                   isContainer = "1";
+                  class = "AssetBrowserSearchFilterTxt";
                   canSave = "1";
                   canSave = "1";
                   canSaveDynamicFields = "0";
                   canSaveDynamicFields = "0";
                };
                };
-               new GuiBitmapButtonCtrl() {
-                  bitmap = "tools/gui/images/visible";
-                  bitmapMode = "Stretched";
+               new GuiBitmapButtonCtrl(AssetBrowser_ClearFolderFilterBtn) {
+                  bitmap = "tools/gui/images/clear-icon";
+                  bitmapMode = "Centered";
                   autoFitExtents = "0";
                   autoFitExtents = "0";
                   useModifiers = "0";
                   useModifiers = "0";
                   useStates = "1";
                   useStates = "1";
@@ -409,17 +435,15 @@
                   groupNum = "-1";
                   groupNum = "-1";
                   buttonType = "PushButton";
                   buttonType = "PushButton";
                   useMouseEvents = "0";
                   useMouseEvents = "0";
-                  position = "128 -1";
-                  extent = "18 19";
+                  position = "132 0";
+                  extent = "15 15";
                   minExtent = "8 2";
                   minExtent = "8 2";
-                  horizSizing = "right";
+                  horizSizing = "left";
                   vertSizing = "bottom";
                   vertSizing = "bottom";
-                  profile = "ToolsGuiDefaultProfile";
+                  profile = "GuiDefaultProfile";
                   visible = "1";
                   visible = "1";
                   active = "1";
                   active = "1";
-                  command = "AssetBrowser.showFilterPopup();";
                   tooltipProfile = "GuiToolTipProfile";
                   tooltipProfile = "GuiToolTipProfile";
-                  tooltip = "Views assets via module-oriented list tree.";
                   hovertime = "1000";
                   hovertime = "1000";
                   isContainer = "0";
                   isContainer = "0";
                   canSave = "1";
                   canSave = "1";
@@ -438,7 +462,7 @@
                minExtent = "8 2";
                minExtent = "8 2";
                horizSizing = "width";
                horizSizing = "width";
                vertSizing = "height";
                vertSizing = "height";
-               profile = "ToolsGuiDefaultProfile";
+               profile = "ToolsGuiSolidDefaultProfile";
                visible = "1";
                visible = "1";
                active = "1";
                active = "1";
                tooltipProfile = "GuiToolTipProfile";
                tooltipProfile = "GuiToolTipProfile";
@@ -471,7 +495,7 @@
                   profile = "GuiEditorScrollProfile";
                   profile = "GuiEditorScrollProfile";
                   visible = "1";
                   visible = "1";
                   active = "1";
                   active = "1";
-                  tooltipProfile = "ToolsGuiDefaultProfile";
+                  tooltipProfile = "ToolsGuiSolidDefaultProfile";
                   hovertime = "1000";
                   hovertime = "1000";
                   isContainer = "1";
                   isContainer = "1";
                   canSave = "1";
                   canSave = "1";
@@ -500,7 +524,7 @@
                      canRenameObjects = "1";
                      canRenameObjects = "1";
                      renameInternal = "0";
                      renameInternal = "0";
                      position = "1 1";
                      position = "1 1";
-                     extent = "145 252";
+                     extent = "145 147";
                      minExtent = "8 2";
                      minExtent = "8 2";
                      horizSizing = "right";
                      horizSizing = "right";
                      vertSizing = "bottom";
                      vertSizing = "bottom";
@@ -517,7 +541,7 @@
                };
                };
             };
             };
          };
          };
-         new GuiPanel() {
+         new GuiPanel(AssetBrowser_AssetsPanel) {
             docking = "Client";
             docking = "Client";
             margin = "0 0 0 0";
             margin = "0 0 0 0";
             padding = "0 0 0 0";
             padding = "0 0 0 0";
@@ -530,7 +554,7 @@
             minExtent = "16 16";
             minExtent = "16 16";
             horizSizing = "right";
             horizSizing = "right";
             vertSizing = "bottom";
             vertSizing = "bottom";
-            profile = "ToolsGuiDefaultProfile";
+            profile = "ToolsGuiSolidDefaultProfile";
             visible = "1";
             visible = "1";
             active = "1";
             active = "1";
             tooltipProfile = "GuiToolTipProfile";
             tooltipProfile = "GuiToolTipProfile";
@@ -548,7 +572,7 @@
                anchorLeft = "1";
                anchorLeft = "1";
                anchorRight = "0";
                anchorRight = "0";
                position = "1 0";
                position = "1 0";
-               extent = "354 41";
+               extent = "354 19";
                minExtent = "8 2";
                minExtent = "8 2";
                horizSizing = "width";
                horizSizing = "width";
                vertSizing = "bottom";
                vertSizing = "bottom";
@@ -561,65 +585,13 @@
                canSave = "1";
                canSave = "1";
                canSaveDynamicFields = "0";
                canSaveDynamicFields = "0";
 
 
-               new GuiBitmapButtonCtrl() {
-                  bitmap = "tools/gui/images/new";
-                  bitmapMode = "Stretched";
-                  autoFitExtents = "0";
-                  useModifiers = "0";
-                  useStates = "1";
-                  masked = "0";
-                  groupNum = "-1";
-                  buttonType = "PushButton";
-                  useMouseEvents = "0";
-                  position = "42 22";
-                  extent = "15 15";
-                  minExtent = "8 2";
-                  horizSizing = "right";
-                  vertSizing = "bottom";
-                  profile = "ToolsGuiDefaultProfile";
-                  visible = "1";
-                  active = "1";
-                  command = "AssetBrowser.createNewAsset();";
-                  tooltipProfile = "GuiToolTipProfile";
-                  tooltip = "Create New Asset";
-                  hovertime = "1000";
-                  isContainer = "0";
-                  canSave = "1";
-                  canSaveDynamicFields = "0";
-               };
-               new GuiBitmapButtonCtrl() {
-                  bitmap = "tools/gui/images/delete";
-                  bitmapMode = "Stretched";
-                  autoFitExtents = "0";
-                  useModifiers = "0";
-                  useStates = "1";
-                  masked = "0";
-                  groupNum = "-1";
-                  buttonType = "PushButton";
-                  useMouseEvents = "0";
-                  position = "23 22";
-                  extent = "15 15";
-                  minExtent = "8 2";
-                  horizSizing = "right";
-                  vertSizing = "bottom";
-                  profile = "ToolsGuiDefaultProfile";
-                  visible = "1";
-                  active = "1";
-                  command = "AssetBrowser.showDeleteDialog();";
-                  tooltipProfile = "GuiToolTipProfile";
-                  tooltip = "Delete Asset";
-                  hovertime = "1000";
-                  isContainer = "0";
-                  canSave = "1";
-                  canSaveDynamicFields = "0";
-               };
                new GuiTextEditCtrl(AssetBrowserSearchFilter) {
                new GuiTextEditCtrl(AssetBrowserSearchFilter) {
                   historySize = "0";
                   historySize = "0";
                   tabComplete = "0";
                   tabComplete = "0";
                   sinkAllKeyEvents = "0";
                   sinkAllKeyEvents = "0";
                   password = "0";
                   password = "0";
                   passwordMask = "*";
                   passwordMask = "*";
-                  text = "\c2Filter...";
+                  text = "Search Assets...";
                   maxLength = "1024";
                   maxLength = "1024";
                   margin = "0 0 0 0";
                   margin = "0 0 0 0";
                   padding = "0 0 0 0";
                   padding = "0 0 0 0";
@@ -627,8 +599,8 @@
                   anchorBottom = "0";
                   anchorBottom = "0";
                   anchorLeft = "1";
                   anchorLeft = "1";
                   anchorRight = "0";
                   anchorRight = "0";
-                  position = "62 19";
-                  extent = "273 18";
+                  position = "21 1";
+                  extent = "314 18";
                   minExtent = "8 2";
                   minExtent = "8 2";
                   horizSizing = "width";
                   horizSizing = "width";
                   vertSizing = "bottom";
                   vertSizing = "bottom";
@@ -638,12 +610,12 @@
                   tooltipProfile = "GuiToolTipProfile";
                   tooltipProfile = "GuiToolTipProfile";
                   hovertime = "1000";
                   hovertime = "1000";
                   isContainer = "1";
                   isContainer = "1";
-                  class = "AssetBrowserSearchFilterText";
+                  class = "AssetBrowserSearchFilterTxt";
                   canSave = "1";
                   canSave = "1";
                   canSaveDynamicFields = "0";
                   canSaveDynamicFields = "0";
                };
                };
-               new GuiBitmapButtonCtrl(TagFilterButton) {
-                  bitmap = "tools/gui/images/visible";
+               new GuiBitmapButtonCtrl(AssetBrowser_ClearAssetFilterBtn) {
+                  bitmap = "tools/gui/images/clear-icon";
                   bitmapMode = "Stretched";
                   bitmapMode = "Stretched";
                   autoFitExtents = "0";
                   autoFitExtents = "0";
                   useModifiers = "0";
                   useModifiers = "0";
@@ -652,46 +624,49 @@
                   groupNum = "-1";
                   groupNum = "-1";
                   buttonType = "PushButton";
                   buttonType = "PushButton";
                   useMouseEvents = "0";
                   useMouseEvents = "0";
-                  position = "4 19";
-                  extent = "20 20";
+                  position = "321 1";
+                  extent = "15 15";
                   minExtent = "8 2";
                   minExtent = "8 2";
-                  horizSizing = "right";
+                  horizSizing = "left";
                   vertSizing = "bottom";
                   vertSizing = "bottom";
-                  profile = "ToolsGuiDefaultProfile";
+                  profile = "ToolsGuiSolidDefaultProfile";
                   visible = "1";
                   visible = "1";
                   active = "1";
                   active = "1";
-                  command = "AssetBrowser.toggleTagFilterPopup();";
                   tooltipProfile = "GuiToolTipProfile";
                   tooltipProfile = "GuiToolTipProfile";
+                  tooltip = "Create New Asset";
                   hovertime = "1000";
                   hovertime = "1000";
                   isContainer = "0";
                   isContainer = "0";
                   canSave = "1";
                   canSave = "1";
                   canSaveDynamicFields = "0";
                   canSaveDynamicFields = "0";
                };
                };
-               new GuiTextCtrl() {
-                  text = "Assets";
-                  maxLength = "1024";
-                  margin = "0 0 0 0";
-                  padding = "0 0 0 0";
-                  anchorTop = "1";
-                  anchorBottom = "0";
-                  anchorLeft = "1";
-                  anchorRight = "0";
-                  position = "5 0";
-                  extent = "53 16";
+               new GuiBitmapButtonCtrl(AssetBrowser_ToggleFolderPanel) {
+                  bitmap = "tools/gui/images/iconList.png";
+                  bitmapMode = "Centered";
+                  autoFitExtents = "0";
+                  useModifiers = "0";
+                  useStates = "1";
+                  masked = "0";
+                  groupNum = "-1";
+                  buttonType = "PushButton";
+                  useMouseEvents = "0";
+                  position = "1 1";
+                  extent = "15 15";
                   minExtent = "8 2";
                   minExtent = "8 2";
                   horizSizing = "right";
                   horizSizing = "right";
                   vertSizing = "bottom";
                   vertSizing = "bottom";
-                  profile = "ToolsGuiDefaultProfile";
+                  profile = "ToolsGuiSolidDefaultProfile";
                   visible = "1";
                   visible = "1";
                   active = "1";
                   active = "1";
+                  command = "AssetBrowser.toggleFolderCollapseButton();";
                   tooltipProfile = "GuiToolTipProfile";
                   tooltipProfile = "GuiToolTipProfile";
+                  tooltip = "Toggles the display of the folders panel";
                   hovertime = "1000";
                   hovertime = "1000";
-                  isContainer = "1";
+                  isContainer = "0";
                   canSave = "1";
                   canSave = "1";
                   canSaveDynamicFields = "0";
                   canSaveDynamicFields = "0";
                };
                };
-               new GuiBitmapButtonCtrl() {
-                  bitmap = "tools/gui/images/delete";
+               new GuiBitmapButtonCtrl(AssetBrowser_FilterOptionsBtn) {
+                  bitmap = "tools/gui/images/filter.png";
                   bitmapMode = "Stretched";
                   bitmapMode = "Stretched";
                   autoFitExtents = "0";
                   autoFitExtents = "0";
                   useModifiers = "0";
                   useModifiers = "0";
@@ -700,17 +675,17 @@
                   groupNum = "-1";
                   groupNum = "-1";
                   buttonType = "PushButton";
                   buttonType = "PushButton";
                   useMouseEvents = "0";
                   useMouseEvents = "0";
-                  position = "337 22";
+                  position = "337 1";
                   extent = "15 15";
                   extent = "15 15";
                   minExtent = "8 2";
                   minExtent = "8 2";
                   horizSizing = "left";
                   horizSizing = "left";
                   vertSizing = "bottom";
                   vertSizing = "bottom";
-                  profile = "ToolsGuiDefaultProfile";
+                  profile = "ToolsGuiSolidDefaultProfile";
                   visible = "1";
                   visible = "1";
                   active = "1";
                   active = "1";
-                  command = "AssetBrowser.showDeleteDialog();";
+                  command = "AssetBrowser.showFilterOptions();";
                   tooltipProfile = "GuiToolTipProfile";
                   tooltipProfile = "GuiToolTipProfile";
-                  tooltip = "Delete Asset";
+                  tooltip = "Filter Options";
                   hovertime = "1000";
                   hovertime = "1000";
                   isContainer = "0";
                   isContainer = "0";
                   canSave = "1";
                   canSave = "1";
@@ -724,12 +699,12 @@
                anchorBottom = "0";
                anchorBottom = "0";
                anchorLeft = "1";
                anchorLeft = "1";
                anchorRight = "1";
                anchorRight = "1";
-               position = "1 40";
-               extent = "354 468";
+               position = "1 17";
+               extent = "354 487";
                minExtent = "8 2";
                minExtent = "8 2";
                horizSizing = "width";
                horizSizing = "width";
                vertSizing = "height";
                vertSizing = "height";
-               profile = "ToolsGuiDefaultProfile";
+               profile = "ToolsGuiSolidDefaultProfile";
                visible = "1";
                visible = "1";
                active = "1";
                active = "1";
                tooltipProfile = "GuiToolTipProfile";
                tooltipProfile = "GuiToolTipProfile";
@@ -755,19 +730,35 @@
                   anchorLeft = "1";
                   anchorLeft = "1";
                   anchorRight = "0";
                   anchorRight = "0";
                   position = "0 0";
                   position = "0 0";
-                  extent = "354 448";
+                  extent = "354 467";
                   minExtent = "8 8";
                   minExtent = "8 8";
                   horizSizing = "width";
                   horizSizing = "width";
                   vertSizing = "height";
                   vertSizing = "height";
                   profile = "GuiEditorScrollProfile";
                   profile = "GuiEditorScrollProfile";
                   visible = "1";
                   visible = "1";
                   active = "1";
                   active = "1";
-                  tooltipProfile = "ToolsGuiDefaultProfile";
+                  tooltipProfile = "ToolsGuiSolidDefaultProfile";
                   hovertime = "1000";
                   hovertime = "1000";
                   isContainer = "1";
                   isContainer = "1";
                   canSave = "1";
                   canSave = "1";
                   canSaveDynamicFields = "0";
                   canSaveDynamicFields = "0";
 
 
+                  new GuiMouseEventCtrl(AssetListPanelInputs) {
+                     lockMouse = "0";
+                     position = "1 0";
+                     extent = "339 467";
+                     minExtent = "8 2";
+                     horizSizing = "width";
+                     vertSizing = "height";
+                     profile = "GuiDefaultProfile";
+                     visible = "1";
+                     active = "1";
+                     tooltipProfile = "GuiToolTipProfile";
+                     hovertime = "1000";
+                     isContainer = "0";
+                     canSave = "1";
+                     canSaveDynamicFields = "0";
+                  };
                   new GuiStackControl() {
                   new GuiStackControl() {
                      stackingType = "Vertical";
                      stackingType = "Vertical";
                      horizStacking = "Left to Right";
                      horizStacking = "Left to Right";
@@ -778,8 +769,8 @@
                      dynamicPos = "0";
                      dynamicPos = "0";
                      changeChildSizeToFit = "1";
                      changeChildSizeToFit = "1";
                      changeChildPosition = "0";
                      changeChildPosition = "0";
-                     position = "1 1";
-                     extent = "352 254";
+                     position = "2 1";
+                     extent = "339 124";
                      minExtent = "16 16";
                      minExtent = "16 16";
                      horizSizing = "width";
                      horizSizing = "width";
                      vertSizing = "bottom";
                      vertSizing = "bottom";
@@ -792,25 +783,10 @@
                      canSave = "1";
                      canSave = "1";
                      canSaveDynamicFields = "0";
                      canSaveDynamicFields = "0";
 
 
-                     new GuiControl() {
-                        position = "0 0";
-                        extent = "352 4";
-                        minExtent = "8 2";
-                        horizSizing = "right";
-                        vertSizing = "bottom";
-                        profile = "ToolsGuiDefaultProfile";
-                        visible = "1";
-                        active = "1";
-                        tooltipProfile = "GuiToolTipProfile";
-                        hovertime = "1000";
-                        isContainer = "1";
-                        canSave = "1";
-                        canSaveDynamicFields = "0";
-                     };
                      new GuiDynamicCtrlArrayControl() {
                      new GuiDynamicCtrlArrayControl() {
                         colCount = "3";
                         colCount = "3";
                         colSize = "100";
                         colSize = "100";
-                        rowCount = "2";
+                        rowCount = "1";
                         rowSize = "124";
                         rowSize = "124";
                         rowSpacing = "2";
                         rowSpacing = "2";
                         colSpacing = "2";
                         colSpacing = "2";
@@ -819,8 +795,8 @@
                         fillRowFirst = "1";
                         fillRowFirst = "1";
                         dynamicSize = "1";
                         dynamicSize = "1";
                         padding = "0 0 0 0";
                         padding = "0 0 0 0";
-                        position = "3 4";
-                        extent = "352 250";
+                        position = "3 0";
+                        extent = "339 124";
                         minExtent = "8 8";
                         minExtent = "8 8";
                         horizSizing = "width";
                         horizSizing = "width";
                         vertSizing = "bottom";
                         vertSizing = "bottom";
@@ -830,7 +806,7 @@
                         tooltipProfile = "GuiToolTipProfile";
                         tooltipProfile = "GuiToolTipProfile";
                         hovertime = "1000";
                         hovertime = "1000";
                         isContainer = "1";
                         isContainer = "1";
-                        internalName = "materialSelection";
+                        internalName = "assetList";
                         canSave = "1";
                         canSave = "1";
                         canSaveDynamicFields = "0";
                         canSaveDynamicFields = "0";
                      };
                      };
@@ -844,12 +820,12 @@
                   anchorBottom = "0";
                   anchorBottom = "0";
                   anchorLeft = "1";
                   anchorLeft = "1";
                   anchorRight = "0";
                   anchorRight = "0";
-                  position = "0 448";
+                  position = "0 467";
                   extent = "354 20";
                   extent = "354 20";
                   minExtent = "8 2";
                   minExtent = "8 2";
                   horizSizing = "width";
                   horizSizing = "width";
                   vertSizing = "height";
                   vertSizing = "height";
-                  profile = "ToolsGuiDefaultProfile";
+                  profile = "ToolsGuiSolidDefaultProfile";
                   visible = "1";
                   visible = "1";
                   active = "1";
                   active = "1";
                   tooltipProfile = "GuiToolTipProfile";
                   tooltipProfile = "GuiToolTipProfile";
@@ -859,13 +835,35 @@
                   canSave = "1";
                   canSave = "1";
                   canSaveDynamicFields = "0";
                   canSaveDynamicFields = "0";
                };
                };
+               new GuiTextCtrl(AssetBrowser_FooterText) {
+                  maxLength = "1024";
+                  margin = "0 0 0 0";
+                  padding = "0 0 0 0";
+                  anchorTop = "1";
+                  anchorBottom = "0";
+                  anchorLeft = "1";
+                  anchorRight = "0";
+                  position = "0 470";
+                  extent = "269 23";
+                  minExtent = "8 2";
+                  horizSizing = "right";
+                  vertSizing = "top";
+                  profile = "ToolsGuiTextProfile";
+                  visible = "1";
+                  active = "1";
+                  tooltipProfile = "GuiToolTipProfile";
+                  hovertime = "1000";
+                  isContainer = "1";
+                  canSave = "1";
+                  canSaveDynamicFields = "0";
+               };
             };
             };
             new GuiButtonCtrl() {
             new GuiButtonCtrl() {
                text = "Select";
                text = "Select";
                groupNum = "-1";
                groupNum = "-1";
                buttonType = "PushButton";
                buttonType = "PushButton";
                useMouseEvents = "0";
                useMouseEvents = "0";
-               position = "242 491";
+               position = "301 488";
                extent = "53 19";
                extent = "53 19";
                minExtent = "8 2";
                minExtent = "8 2";
                horizSizing = "left";
                horizSizing = "left";
@@ -882,26 +880,6 @@
                canSave = "1";
                canSave = "1";
                canSaveDynamicFields = "0";
                canSaveDynamicFields = "0";
             };
             };
-            new GuiButtonCtrl() {
-               text = "Cancel";
-               groupNum = "-1";
-               buttonType = "PushButton";
-               useMouseEvents = "0";
-               position = "300 491";
-               extent = "52 19";
-               minExtent = "8 2";
-               horizSizing = "left";
-               vertSizing = "top";
-               profile = "ToolsGuiButtonProfile";
-               visible = "1";
-               active = "1";
-               command = "AssetBrowser.hideDialog();";
-               tooltipProfile = "GuiToolTipProfile";
-               hovertime = "1000";
-               isContainer = "0";
-               canSave = "1";
-               canSaveDynamicFields = "0";
-            };
          };
          };
       };
       };
    };
    };

+ 1 - 1
Templates/BaseGame/game/tools/assetBrowser/guis/assetImport.gui

@@ -224,7 +224,7 @@
          canSave = "1";
          canSave = "1";
          canSaveDynamicFields = "0";
          canSaveDynamicFields = "0";
       };
       };
-      new GuiScrollCtrl() {
+      new GuiScrollCtrl(ImportAssetConfigEditorScroll) {
          willFirstRespond = "1";
          willFirstRespond = "1";
          hScrollBar = "dynamic";
          hScrollBar = "dynamic";
          vScrollBar = "dynamic";
          vScrollBar = "dynamic";

+ 29 - 0
Templates/BaseGame/game/tools/assetBrowser/main.cs

@@ -30,6 +30,32 @@ function initializeAssetBrowser()
 {
 {
    echo(" % - Initializing Asset Browser");  
    echo(" % - Initializing Asset Browser");  
    
    
+   $AssetBrowser::importConfigsFile = "tools/assetBrowser/assetImportConfigs.xml";
+   $AssetBrowser::currentImportConfig = "";
+   
+   if(!isObject(AssetFilterTypeList))
+   {
+      new ArrayObject(AssetFilterTypeList);
+
+      AssetFilterTypeList.add("Component");
+      AssetFilterTypeList.add("Cpp");
+      AssetFilterTypeList.add("Cubemap");
+      AssetFilterTypeList.add("GameObjects");
+      AssetFilterTypeList.add("GUIs");
+      AssetFilterTypeList.add("Images");
+      AssetFilterTypeList.add("Levels");
+      AssetFilterTypeList.add("Materials");
+      AssetFilterTypeList.add("Particles");
+      AssetFilterTypeList.add("PostFXs");
+      AssetFilterTypeList.add("Scripts");
+      AssetFilterTypeList.add("Shapes");
+      AssetFilterTypeList.add("ShapeAnimations");
+      AssetFilterTypeList.add("Sounds");
+      AssetFilterTypeList.add("StateMachines");
+      AssetFilterTypeList.add("Terrain");
+      AssetFilterTypeList.add("TerrainMaterials");
+   }
+   
    exec("./guis/assetBrowser.gui");
    exec("./guis/assetBrowser.gui");
    exec("./guis/addModuleWindow.gui");
    exec("./guis/addModuleWindow.gui");
    exec("./guis/gameObjectCreator.gui");
    exec("./guis/gameObjectCreator.gui");
@@ -67,6 +93,9 @@ function initializeAssetBrowser()
    exec("./scripts/assetTypes/sound.cs"); 
    exec("./scripts/assetTypes/sound.cs"); 
    exec("./scripts/assetTypes/stateMachine.cs");   
    exec("./scripts/assetTypes/stateMachine.cs");   
    exec("./scripts/assetTypes/cubemap.cs");  
    exec("./scripts/assetTypes/cubemap.cs");  
+   exec("./scripts/assetTypes/folder.cs");  
+   exec("./scripts/assetTypes/terrain.cs");
+   exec("./scripts/assetTypes/terrainMaterial.cs");  
      
      
    exec("./scripts/fieldTypes/fieldTypes.cs");
    exec("./scripts/fieldTypes/fieldTypes.cs");
    exec("./scripts/fieldTypes/listField.cs");
    exec("./scripts/fieldTypes/listField.cs");

+ 693 - 137
Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.cs

@@ -44,15 +44,28 @@ function AssetBrowser::onWake(%this)
    if(!isObject(ImportAssetTree))
    if(!isObject(ImportAssetTree))
       new GuiTreeViewCtrl(ImportAssetTree);
       new GuiTreeViewCtrl(ImportAssetTree);
       
       
+   if(!isObject(AssetBrowser_NavPrevHistoryList))
+   {
+      new ArrayObject(AssetBrowser_NavPrevHistoryList);
+   }
+   if(!isObject(AssetBrowser_NavForeHistoryList))
+   {
+      new ArrayObject(AssetBrowser_NavForeHistoryList);
+   }
+      
    %this.importingFilesArray = new ArrayObject();
    %this.importingFilesArray = new ArrayObject();
    %this.importAssetUnprocessedListArray = new ArrayObject();
    %this.importAssetUnprocessedListArray = new ArrayObject();
    %this.importAssetFinalListArray = new ArrayObject();
    %this.importAssetFinalListArray = new ArrayObject();
    
    
    %this.isReImportingAsset = false;
    %this.isReImportingAsset = false;
    %this.coreModulesFilter = false;
    %this.coreModulesFilter = false;
+   %this.toolsModulesFilter = false;
    %this.onlyShowModulesWithAssets = false;
    %this.onlyShowModulesWithAssets = false;
    %this.treeFilterMode = "list";
    %this.treeFilterMode = "list";
    
    
+   %this.folderPanelState = true;
+   %this.folderPanelSplit = 0;
+   
    %this.templateFilesPath = "tools/assetBrowser/scripts/templateFiles/";
    %this.templateFilesPath = "tools/assetBrowser/scripts/templateFiles/";
    
    
    //First, build our our list of active modules
    //First, build our our list of active modules
@@ -77,6 +90,8 @@ function AssetBrowser::onWake(%this)
          "You have no modules or content. Do you want to import a module from the template content?",
          "You have no modules or content. Do you want to import a module from the template content?",
          "AssetBrowser.ImportTemplateModules();", "" );
          "AssetBrowser.ImportTemplateModules();", "" );
    }
    }
+   
+   %this.setPreviewSize(EditorSettings.value("Assets/Browser/previewTileSize", "small"));
 }
 }
 
 
 //Filters
 //Filters
@@ -87,18 +102,60 @@ function AssetBrowser::showFilterPopup(%this)
 
 
 function AssetBrowser::viewCoreModulesFilter(%this)
 function AssetBrowser::viewCoreModulesFilter(%this)
 {
 {
-   %this.coreModulesFilter = !%this.coreModulesFilter;
+   %oldVal = EditorSettings.value("Assets/Browser/showCoreModule", false);
+   %newVal = !%oldVal;
+   
+   BrowserVisibilityPopup.checkItem(0,%newVal);
+   
+   EditorSettings.setValue("Assets/Browser/showCoreModule", %newVal);
+    
+   AssetBrowser.loadFilters();
+}
+
+function AssetBrowser::viewToolsModulesFilter(%this)
+{
+   %oldVal = EditorSettings.value("Assets/Browser/showToolsModule", false);
+   %newVal = !%oldVal;
+   
+   BrowserVisibilityPopup.checkItem(1,%newVal);
    
    
-   BrowserVisibilityPopup.checkItem(0,%this.coreModulesFilter);
+   EditorSettings.setValue("Assets/Browser/showToolsModule", %newVal);
     
     
    AssetBrowser.loadFilters();
    AssetBrowser.loadFilters();
 }
 }
 
 
 function AssetBrowser::viewPopulatedModulesFilter(%this)
 function AssetBrowser::viewPopulatedModulesFilter(%this)
 {
 {
-   %this.onlyShowModulesWithAssets = !%this.onlyShowModulesWithAssets;
+   %oldVal = EditorSettings.value("Assets/Browser/showOnlyPopulatedModule", false);
+   %newVal = !%oldVal;
+   
+   BrowserVisibilityPopup.checkItem(2,%newVal);
+   
+   EditorSettings.setValue("Assets/Browser/showOnlyPopulatedModule", %newVal);
+    
+   AssetBrowser.loadFilters();
+}
+
+function AssetBrowser::toggleShowingFolders(%this)
+{
+   %oldVal = EditorSettings.value("Assets/Browser/showFolders", false);
+   %newVal = !%oldVal;
+   
+   BrowserVisibilityPopup.checkItem(4,%newVal);
    
    
-   BrowserVisibilityPopup.checkItem(1,%this.onlyShowModulesWithAssets);
+   EditorSettings.setValue("Assets/Browser/showFolders", %newVal);
+    
+   AssetBrowser.loadFilters();
+}
+
+function AssetBrowser::toggleShowingEmptyFolders(%this)
+{
+   %oldVal = EditorSettings.value("Assets/Browser/showEmptyFolders", false);
+   %newVal = !%oldVal;
+   
+   BrowserVisibilityPopup.checkItem(5,%newVal);
+   
+   EditorSettings.setValue("Assets/Browser/showEmptyFolders", %newVal);
     
     
    AssetBrowser.loadFilters();
    AssetBrowser.loadFilters();
 }
 }
@@ -115,7 +172,12 @@ function AssetBrowser::viewTagsFilter(%this)
    AssetBrowser.loadFilters();
    AssetBrowser.loadFilters();
 }
 }
 
 
-//Drag-Drop functionality
+function AssetBrowser::toggleAssetTypeFilter(%assetTypeIdx)
+{
+   %isChecked = AssetTypeListPopup.isItemChecked(%assetTypeIdx);
+   AssetTypeListPopup.checkItem(%assetTypeIdx, !%isChecked);
+}
+
 function AssetBrowser::selectAsset( %this, %asset )
 function AssetBrowser::selectAsset( %this, %asset )
 {
 {
    if(AssetBrowser.selectCallback !$= "")
    if(AssetBrowser.selectCallback !$= "")
@@ -189,20 +251,43 @@ function AssetBrowser::buildPreviewArray( %this, %asset, %moduleName )
       %this.previewData = new ScriptObject();      
       %this.previewData = new ScriptObject();      
    }
    }
    
    
-   %assetDesc = AssetDatabase.acquireAsset(%asset);
-   %assetName = AssetDatabase.getAssetName(%asset);
+   AssetPreviewArray.empty();
+   
    %previewImage = "core/art/warnmat";
    %previewImage = "core/art/warnmat";
    
    
-   AssetPreviewArray.empty();
+   if(ModuleDatabase.findModule(%moduleName, 1) !$= "")
+   {
+      %assetDesc = AssetDatabase.acquireAsset(%asset);
+      %assetName = AssetDatabase.getAssetName(%asset);
+      %assetType = AssetDatabase.getAssetType(%asset);
+      
+   }
+   else
+   {
+      %fullPath = %moduleName !$= "" ? %moduleName @ "/" @ %asset : %asset;
+      %fullPath = strreplace(%fullPath, "/", "_");
+      
+      if(isObject(%fullPath))
+         %assetDesc = %fullPath;
+      else
+         %assetDesc = new ScriptObject(%fullPath);
+         
+      %assetDesc.dirPath = %moduleName;
+      %assetDesc.assetName = %asset;
+      %assetDesc.description = %moduleName @ "/" @ %asset;
+      %assetDesc.assetType = "Folder";
+      
+      %assetName = %asset;
+      %assetType = "Folder";
+   }
       
       
    // it may seem goofy why the checkbox can't be instanciated inside the container
    // it may seem goofy why the checkbox can't be instanciated inside the container
    // reason being its because we need to store the checkbox ctrl in order to make changes
    // reason being its because we need to store the checkbox ctrl in order to make changes
    // on it later in the function. 
    // on it later in the function. 
-
-   %previewSize = "80 80";
-   %previewBounds = 20;
    
    
-   %assetType = AssetDatabase.getAssetType(%asset);
+   
+   %previewSize = %this.previewSize SPC %this.previewSize;
+   %previewBounds = 20;
    
    
    %container = new GuiControl(){
    %container = new GuiControl(){
       profile = "ToolsGuiDefaultProfile";
       profile = "ToolsGuiDefaultProfile";
@@ -310,6 +395,12 @@ function AssetBrowser::buildPreviewArray( %this, %asset, %moduleName )
       %buildCommand = %this @ ".build" @ %assetType @ "Preview(" @ %assetDesc @ "," @ %this.previewData @ ");";
       %buildCommand = %this @ ".build" @ %assetType @ "Preview(" @ %assetDesc @ "," @ %this.previewData @ ");";
       eval(%buildCommand);
       eval(%buildCommand);
       
       
+      //debug dump
+      %tooltip = %this.previewData.tooltip;
+      %assetName = %this.previewData.assetName;
+      %previewImage = %this.previewData.previewImage;
+      %doubleClickCommand = %this.previewData.doubleClickCommand;
+      
       %previewButton = new GuiBitmapButtonCtrl()
       %previewButton = new GuiBitmapButtonCtrl()
       {
       {
          className = "AssetPreviewControl";
          className = "AssetPreviewControl";
@@ -376,23 +467,198 @@ function AssetBrowser::buildPreviewArray( %this, %asset, %moduleName )
    %container.add(%previewNameCtrl);
    %container.add(%previewNameCtrl);
    
    
    // add to the gui control array
    // add to the gui control array
-   AssetBrowser-->materialSelection.add(%container);
+   AssetBrowser-->assetList.add(%container);
    
    
    // add to the array object for reference later
    // add to the array object for reference later
    AssetPreviewArray.add( %previewButton, %this.previewData.previewImage );
    AssetPreviewArray.add( %previewButton, %this.previewData.previewImage );
 }
 }
 
 
+//
+//
+function AssetPreviewButton::onClick(%this)
+{
+   echo("CLICKED AN ASSET PREVIEW BUTTON");
+}
+
+function AssetPreviewButton::onDoubleClick(%this)
+{
+   echo("DOUBLE CLICKED AN ASSET PREVIEW BUTTON");
+}
+//
+//
+
+function AssetBrowser::loadFolders(%this, %path, %parentId)
+{
+   //utilize home dir project setting here
+   %paths = getDirectoryList(%path);
+   for(%i=0; %i < getFieldCount(%paths); %i++)
+   {
+      %childPath = getField(%paths, %i);
+      
+      %folderCount = getTokenCount(%childPath, "/");
+      
+      for(%f=0; %f < %folderCount; %f++)
+      {
+         %folderName = getToken(%childPath, "/", %f);
+         
+         //we don't need to display the shadercache folder
+         if(%parentId == 1 && %folderName $= "shaderCache")
+            continue;
+         
+         %iconIdx = 1;
+         
+         if(ModuleDatabase.findModule(%folderName) !$= "")
+            %iconIdx = 0;
+         
+         %searchFoldersText = AssetBrowserFolderSearchFilter.getText();
+         if(%searchFoldersText !$= "Search Folders...")
+         {
+            if(strstr(strlwr(%folderName), strlwr(%searchFoldersText)) != -1)
+            {
+               %folderID = AssetBrowser-->filterTree.insertItem(%parentId, %folderName, %path, "", %iconIdx, %iconIdx);
+         
+            %this.loadFolders(%path @ "/" @ %folderName, %folderID);  
+            }
+         }
+         else
+         {
+            %folderID = AssetBrowser-->filterTree.insertItem(%parentId, %folderName, %path, "", %iconIdx, %iconIdx);
+         
+            %this.loadFolders(%path @ "/" @ %folderName, %folderID);
+         }
+      }
+   }
+}
+
 function AssetBrowser::loadFilters( %this )
 function AssetBrowser::loadFilters( %this )
 {
 {
    AssetBrowser-->filterTree.clear();
    AssetBrowser-->filterTree.clear();
 
 
-   AssetBrowser-->filterTree.buildIconTable(":tools/classIcons/prefab");
+   AssetBrowser-->filterTree.buildIconTable( "tools/classIcons/Prefab" @
+                                             ":tools/classIcons/SimSet");
+   
+   %dataItem = AssetBrowser-->filterTree.insertItem(0, "Data");
+   %this.loadFolders("Data", %dataItem);
+   
+   //If set to, show core
+   if(%this.coreModulesFilter)
+   {
+      %coreItem = AssetBrowser-->filterTree.insertItem(0, "Core");
+      %this.loadFolders("Core", %coreItem);
+   }
+   
+   //If set to, show tools
+   if(%this.toolsModulesFilter)
+   {
+      %toolsItem = AssetBrowser-->filterTree.insertItem(0, "Tools");
+      %this.loadFolders("Tools", %toolsItem);
+   }
 
 
-   AssetBrowser-->filterTree.insertItem(0, "Assets");
+   //AssetBrowser-->filterTree.insertItem(0, "Data");
+   
+   //get it alllll
+   /*%directoryDump = getDirectoryList("data", -1);
+   
+   %dirs = getFieldCount(%directoryDump);
+   
+   for(%i=0; %i < %dirs; %i++)
+   {
+      %folderName = getToken(%assetBasePath, "/", %f);
+
+      %folderID = AssetBrowser-->filterTree.findChildItemByName(%prevFolderID, %folderName);
+
+      if(%folderID == -1 || %folderID == 0)
+      {
+         %pathCache = "";
+         
+         for(%c=0; %c < %f; %c++)
+         {
+            %pathCache = %c == 0 ? getToken(%assetBasePath, "/", %c) : %pathCache @ "/" @ getToken(%assetBasePath, "/", %c);
+         }
+         
+         %folderID = AssetBrowser-->filterTree.insertItem(%prevFolderID, %folderName, %pathCache, "", 1, 1);
+      }
+   }*/
    
    
    AssetPreviewArray.empty();
    AssetPreviewArray.empty();
    
    
-   if(%this.treeFilterMode $= "list")
+   /*%assetQuery = new AssetQuery();
+   %numAssetsFound = AssetDatabase.findAllAssets(%assetQuery);
+   
+   for( %i=0; %i < %numAssetsFound; %i++)
+   {
+       %assetId = %assetQuery.getAsset(%i);
+       
+       %assetPath = makeRelativePath(AssetDatabase.getAssetFilePath(%assetId));
+       
+       //clean up the path
+       %assetPath = strreplace(%assetPath, "\\\\", "\\");
+       %assetPath = strreplace(%assetPath, "\\", "\\");
+       %assetPath = strreplace(%assetPath, "//", "\\");
+       
+       %assetBasePath = filePath(%assetPath);
+       
+       %foldersCount = getTokenCount(%assetBasePath, "/");
+       
+       //Build our directory structure
+       %prevFolderID = 0;
+       for(%f=0; %f < %foldersCount; %f++)
+       {
+         %folderName = getToken(%assetBasePath, "/", %f);
+
+         %folderID = AssetBrowser-->filterTree.findChildItemByName(%prevFolderID, %folderName);
+
+         if(%folderID == -1 || %folderID == 0)
+         {
+            %pathCache = "";
+            
+            for(%c=0; %c < %f; %c++)
+            {
+               %pathCache = %c == 0 ? getToken(%assetBasePath, "/", %c) : %pathCache @ "/" @ getToken(%assetBasePath, "/", %c);
+            }
+            
+            %folderID = AssetBrowser-->filterTree.insertItem(%prevFolderID, %folderName, %pathCache, "", 1, 1);
+         }
+
+         %prevFolderID = %folderID;
+       }
+       
+      //first, get the asset's module, as our major categories
+      %module = AssetDatabase.getAssetModule(%assetId);
+      
+      %moduleName = %module.moduleId;
+      
+      %moduleGroup = %module.Group;
+      if((%moduleGroup $= "Core" || %moduleGroup $= "Tools") && !%this.coreModulesFilter)
+         continue;
+      
+      //first, see if this module Module is listed already
+      /*%moduleItemId = AssetBrowser-->filterTree.findItemByName(%moduleName);
+      
+      //if(%moduleItemId == 0)
+      //   %moduleItemId = AssetBrowser-->filterTree.insertItem(1, %moduleName, "", "", 1, 1);
+         
+      %assetType = AssetDatabase.getAssetCategory(%assetId);
+      
+      if(%assetType $= "")
+      {
+         %assetType = AssetDatabase.getAssetType(%assetId);
+         if(%assetType $= "")
+            %assetType = "Misc";
+      }
+      
+      if(AssetBrowser.assetTypeFilter !$= "" && AssetBrowser.assetTypeFilter !$= %assetType)
+         continue;
+      
+      %assetTypeId = AssetBrowser-->filterTree.findChildItemByName(%moduleItemId, %assetType);
+      
+      if(%assetTypeId == 0)
+         %assetTypeId = AssetBrowser-->filterTree.insertItem(%moduleItemId, %assetType);*/
+   //}
+
+   AssetBrowser-->filterTree.buildVisibleTree(true);
+   
+   /*if(%this.treeFilterMode $= "list")
    {
    {
       //First, build our our list of active modules
       //First, build our our list of active modules
       %modulesList = ModuleDatabase.findModules(true);
       %modulesList = ModuleDatabase.findModules(true);
@@ -457,9 +723,9 @@ function AssetBrowser::loadFilters( %this )
    else if(%this.treeFilterMode $= "tags")
    else if(%this.treeFilterMode $= "tags")
    {
    {
       
       
-   }
+   }*/
    
    
-   %this.collapseTree();
+   //%this.collapseTree();
    
    
    //Remove any modules that have no assets if we have that filter on
    //Remove any modules that have no assets if we have that filter on
    if(%this.onlyShowModulesWithAssets)
    if(%this.onlyShowModulesWithAssets)
@@ -484,7 +750,12 @@ function AssetBrowser::loadFilters( %this )
       AssetBrowser.newModuleId = ""; 
       AssetBrowser.newModuleId = ""; 
    }
    }
    
    
-   %selectedItem = AssetBrowser-->filterTree.getSelectedItem();
+   %dataItem = AssetBrowser-->filterTree.findItemByName("Data");
+   AssetBrowser-->filterTree.expandItem(%dataItem);
+   
+   AssetBrowser.expandTreeToAddress(AssetBrowser.currentAddress);
+   
+   %selectedItem = AssetBrowser.getFolderTreeItemFromAddress(AssetBrowser.currentAddress);
    AssetBrowser-->filterTree.scrollVisibleByObjectId(%selectedItem);
    AssetBrowser-->filterTree.scrollVisibleByObjectId(%selectedItem);
    
    
    AssetBrowser-->filterTree.buildVisibleTree(); 
    AssetBrowser-->filterTree.buildVisibleTree(); 
@@ -541,9 +812,12 @@ function AssetBrowser::createFilter( %this, %filter )
 
 
 function AssetBrowser::updateSelection( %this, %asset, %moduleName )
 function AssetBrowser::updateSelection( %this, %asset, %moduleName )
 {
 {
-   // the material selector will visually update per material information
-   // after we move away from the material. eg: if we remove a field from the material,
-   // the empty checkbox will still be there until you move fro and to the material again
+   //If we're navigating a folder, just nav to it and be done
+   /*if(isDirectory(%moduleName))
+   {
+      AssetBrowser.navigateTo(%moduleName @ "/" @ %asset);
+      return;
+   }*/
    
    
    %isAssetBorder = 0;
    %isAssetBorder = 0;
    eval("%isAssetBorder = isObject(AssetBrowser-->"@%asset@"Border);");
    eval("%isAssetBorder = isObject(AssetBrowser-->"@%asset@"Border);");
@@ -786,11 +1060,14 @@ function AssetBrowser::reImportAsset(%this)
    }
    }
 }
 }
 
 
-//------------------------------------------------------------------------------
+//
+//
+// RMB context popups
 function AssetPreviewButton::onRightClick(%this)
 function AssetPreviewButton::onRightClick(%this)
 {
 {
    AssetBrowser.selectedAssetPreview = %this.getParent();
    AssetBrowser.selectedAssetPreview = %this.getParent();
    EditAssetPopup.assetId = %this.getParent().moduleName @ ":" @ %this.getParent().assetName;
    EditAssetPopup.assetId = %this.getParent().moduleName @ ":" @ %this.getParent().assetName;
+   EditAssetPopup.assetType = %this.getParent().assetType;
    %assetType = %this.getParent().assetType;
    %assetType = %this.getParent().assetType;
    
    
    //Do some enabling/disabling of options depending on asset type
    //Do some enabling/disabling of options depending on asset type
@@ -813,16 +1090,90 @@ function AssetPreviewButton::onRightClick(%this)
    
    
    if(%assetType $= "LevelAsset")
    if(%assetType $= "LevelAsset")
       EditLevelAssetPopup.showPopup(Canvas);  
       EditLevelAssetPopup.showPopup(Canvas);  
+   else if(%assetType $= "Folder")
+      EditFolderPopup.showPopup(Canvas);  
    else
    else
       EditAssetPopup.showPopup(Canvas);  
       EditAssetPopup.showPopup(Canvas);  
+      
+   if(%assetType $= "Folder")
+   {
+      EditAssetPopup.assetId = %this.getParent().moduleName @ "/" @ %this.getParent().assetName;
+   }
 }
 }
 
 
-function AssetListPanel::onRightMouseDown(%this)
+//function AssetListPanel::onRightMouseDown(%this)
+function AssetListPanelInputs::onRightMouseDown(%this)
 {
 {
    AddNewAssetPopup.showPopup(Canvas);
    AddNewAssetPopup.showPopup(Canvas);
 }
 }
 
 
-//------------------------------------------------------------------------------
+function AssetBrowserFilterTree::onRightMouseDown(%this, %itemId)
+{
+   if( %this.getSelectedItemsCount() > 0 && %itemId != 1)
+   {
+      //AddNewAssetPopup.showPopup(Canvas);  
+      
+      //We have something clicked, so figure out if it's a sub-filter or a module filter, then push the correct
+      //popup menu
+      if(%this.getParentItem(%itemId) == 1)
+      {
+         //yep, module, push the all-inclusive popup  
+         EditModulePopup.showPopup(Canvas); 
+         //also set the module value for creation info
+         AssetBrowser.selectedModule = %this.getItemText(%itemId);
+      }
+      else
+      {
+         EditFolderPopup.showPopup(Canvas);
+      }
+   }
+}
+
+//
+//
+//
+function AssetBrowser::showVisibiltyOptions(%this)
+{
+   BrowserVisibilityPopup.showPopup(Canvas);
+}
+
+function AssetBrowser::showFilterOptions(%this)
+{
+   
+}
+
+//
+//
+// Preview tile handling
+function AssetBrowser::setPreviewSize(%this, %size)
+{
+   AssetPreviewSizePopup.checkItem(0, false);
+   AssetPreviewSizePopup.checkItem(1, false);
+   AssetPreviewSizePopup.checkItem(2, false);
+   
+   %this.previewSize = 80; //default to small
+   
+   if(%size $= "Small")
+   {
+      %this.previewSize = 80;
+      AssetPreviewSizePopup.checkItem(0, true);
+   }
+   else if(%size $= "Medium")
+   {
+      %this.previewSize = 120;
+      AssetPreviewSizePopup.checkItem(1, true);
+   }
+   else if(%size $= "Large")
+   {
+      %this.previewSize = 160;
+      AssetPreviewSizePopup.checkItem(2, false);
+   }
+   
+   EditorSettings.setValue("Assets/Browser/previewTileSize", %size);
+      
+   %this.refreshPreviews();
+}
+
 function AssetBrowser::refreshPreviews(%this)
 function AssetBrowser::refreshPreviews(%this)
 {
 {
    AssetBrowserFilterTree.onSelect(AssetBrowser.selectedItem);
    AssetBrowserFilterTree.onSelect(AssetBrowser.selectedItem);
@@ -836,80 +1187,65 @@ function AssetBrowserFilterTree::onSelect(%this, %itemId)
 		
 		
    //Make sure we have an actual module selected!
    //Make sure we have an actual module selected!
    %parentId = %this.getParentItem(%itemId);
    %parentId = %this.getParentItem(%itemId);
-      
-   if(%parentId != 1)
-      AssetBrowser.selectedModule = %this.getItemText(%parentId);//looks like we have one of the categories selected, not the module. Nab the parent so we have the correct thing!
+   
+   %breadcrumbPath = %this.getItemValue(%itemId);
+   if(%breadcrumbPath !$= "")
+      %breadcrumbPath = %breadcrumbPath @ "/" @ %this.getItemText(%itemId);
    else
    else
-      AssetBrowser.selectedModule = %this.getItemText(%itemId);
-      
-   AssetBrowser.selectedItem = %itemId;
-	
-	//alright, we have a module or sub-filter selected, so now build our asset list based on that filter!
-	echo("Asset Browser Filter Tree selected filter #:" @ %itemId);
-	
-	// manage schedule array properly
-   if(!isObject(MatEdScheduleArray))
-      new ArrayObject(MatEdScheduleArray);
-	
-	// if we select another list... delete all schedules that were created by 
-   // previous load
-   for( %i = 0; %i < MatEdScheduleArray.count(); %i++ )
-      cancel(MatEdScheduleArray.getKey(%i));
-	
-	// we have to empty out the list; so when we create new schedules, these dont linger
-   MatEdScheduleArray.empty();
+      %breadcrumbPath = %this.getItemText(%itemId);
       
       
+   AssetBrowser.navigateTo(%breadcrumbPath);
+}
+
+function AssetBrowser::rebuildAssetArray(%this)
+{
+   %breadcrumbPath = AssetBrowser.currentAddress;
+   
    // we have to empty out the list; so when we create new guicontrols, these dont linger
    // we have to empty out the list; so when we create new guicontrols, these dont linger
+   AssetBrowser-->assetList.deleteAllObjects();
    AssetPreviewArray.empty();
    AssetPreviewArray.empty();
-   AssetBrowser-->materialSelection.deleteAllObjects();
-   //AssetBrowser-->materialPreviewPagesStack.deleteAllObjects();
 
 
    %assetArray = new ArrayObject();
    %assetArray = new ArrayObject();
-
+   
    //First, Query for our assets
    //First, Query for our assets
    %assetQuery = new AssetQuery();
    %assetQuery = new AssetQuery();
    %numAssetsFound = AssetDatabase.findAllAssets(%assetQuery);
    %numAssetsFound = AssetDatabase.findAllAssets(%assetQuery);
-   
-	//module name per our selected filter:
-	%moduleItemId = %this.getParentItem(%itemId);
-	
-	//check if we've selected a Module
-	if(%moduleItemId == 1)
-	{
-	   %FilterModuleName = %this.getItemText(%itemId);
-	}
-	else
-	{
-	   %FilterModuleName = %this.getItemText(%moduleItemId);
-	}
-   
+  
     //now, we'll iterate through, and find the assets that are in this module, and this category
     //now, we'll iterate through, and find the assets that are in this module, and this category
     for( %i=0; %i < %numAssetsFound; %i++)
     for( %i=0; %i < %numAssetsFound; %i++)
     {
     {
 	    %assetId = %assetQuery.getAsset(%i);
 	    %assetId = %assetQuery.getAsset(%i);
-		
-		//first, get the asset's module, as our major categories
-		%module = AssetDatabase.getAssetModule(%assetId);
-		
-		%moduleName = %module.moduleId;
-		
-		if(%FilterModuleName $= %moduleName)
-		{
-			//it's good, so test that the category is right!
+	    
+	    %assetPath = makeRelativePath(AssetDatabase.getAssetFilePath(%assetId));
+       %assetBasePath = filePath(%assetPath);
+       
+       //clean up the path
+       %assetBasePath = strreplace(%assetBasePath, "//", "/");
+       
+       if(%assetBasePath $= %breadcrumbPath)
+       {
+          //first, get the asset's module, as our major categories
+		    %module = AssetDatabase.getAssetModule(%assetId);
+		    %moduleName = %module.moduleId;
+		    
+		    //it's good, so test that the category is right!
 			%assetType = AssetDatabase.getAssetCategory(%assetId);
 			%assetType = AssetDatabase.getAssetCategory(%assetId);
 			if(%assetType $= "")
 			if(%assetType $= "")
 			{
 			{
 			   %assetType = AssetDatabase.getAssetType(%assetId);
 			   %assetType = AssetDatabase.getAssetType(%assetId);
 			}
 			}
 			
 			
-			if(%this.getItemText(%itemId) $= %assetType || (%assetType $= "" && %this.getItemText(%itemId) $= "Misc")
+			if(AssetBrowser.assetTypeFilter !$= "" && AssetBrowser.assetTypeFilter !$= %assetType)
+            continue;
+			
+			/*if(%this.getItemText(%itemId) $= %assetType || (%assetType $= "" && %this.getItemText(%itemId) $= "Misc")
 			   || %moduleItemId == 1)
 			   || %moduleItemId == 1)
-			{
+			{*/
 				//stop adding after previewsPerPage is hit
 				//stop adding after previewsPerPage is hit
 				%assetName = AssetDatabase.getAssetName(%assetId);
 				%assetName = AssetDatabase.getAssetName(%assetId);
 				
 				
 				%searchText = AssetBrowserSearchFilter.getText();
 				%searchText = AssetBrowserSearchFilter.getText();
-				if(%searchText !$= "\c2Filter...")
+				if(%searchText !$= "Search Assets...")
 				{
 				{
 					if(strstr(strlwr(%assetName), strlwr(%searchText)) != -1)
 					if(strstr(strlwr(%assetName), strlwr(%searchText)) != -1)
 						%assetArray.add( %moduleName, %assetId);
 						%assetArray.add( %moduleName, %assetId);
@@ -919,61 +1255,45 @@ function AssetBrowserFilterTree::onSelect(%this, %itemId)
 					//got it.	
 					//got it.	
 					%assetArray.add( %moduleName, %assetId );
 					%assetArray.add( %moduleName, %assetId );
 				}
 				}
-			}
-		}
+			//}
+       }
    }
    }
-
-	AssetBrowser.currentPreviewPage = 0;
-	AssetBrowser.totalPages = 1;
-	
-	for(%i=0; %i < %assetArray.count(); %i++)
-		AssetBrowser.buildPreviewArray( %assetArray.getValue(%i), %assetArray.getKey(%i) );
-}
-
-function AssetBrowserFilterTree::onRightMouseDown(%this, %itemId)
-{
-   if( %this.getSelectedItemsCount() > 0 && %itemId != 1)
+   
+   //Add folders
+   if(EditorSettings.value("Assets/Browser/showFolders", true) == true)
    {
    {
-      //AddNewAssetPopup.showPopup(Canvas);  
-      
-      //We have something clicked, so figure out if it's a sub-filter or a module filter, then push the correct
-      //popup menu
-      if(%this.getParentItem(%itemId) == 1)
+      %folders = getDirectoryList(%breadcrumbPath);
+      for(%f=0; %f < getFieldCount(%folders); %f++)
       {
       {
-         //yep, module, push the all-inclusive popup  
-         EditModulePopup.showPopup(Canvas); 
-         //also set the module value for creation info
-         AssetBrowser.selectedModule = %this.getItemText(%itemId);
-      }
-      else
-      {
-         //get the parent, and thus our module
-         %moduleId = %this.getParentItem(%itemId);
-         
-         //set the module value for creation info
-         AssetBrowser.selectedModule = %this.getItemText(%moduleId);
+         %folderName = getField(%folders, %f);
          
          
-         if(%this.getItemText(%itemId) $= "ComponentAsset")
+         %searchText = AssetBrowserSearchFilter.getText();
+         if(%searchText !$= "Search Assets...")
          {
          {
-            AddNewComponentAssetPopup.showPopup(Canvas);
-            //Canvas.popDialog(AssetBrowser_newComponentAsset); 
-	         //AssetBrowser_newComponentAsset-->AssetBrowserModuleList.setText(AssetBrowser.selectedModule);
+            if(strstr(strlwr(%folderName), strlwr(%searchText)) != -1)
+                     %assetArray.add( %breadcrumbPath, %folderName );
          }
          }
-         else if(%this.getItemText(%itemId) $= "ScriptAsset")
+         else
          {
          {
-            EditAssetCategoryPopup.showPopup(Canvas);
+            //got it.	
+            %assetArray.add( %breadcrumbPath, %folderName );
          }
          }
       }
       }
    }
    }
-   else if( %this.getSelectedItemsCount() > 0 && %itemId == 1)
-   {
-      AddNewModulePopup.showPopup(Canvas); 
-   }
+
+	AssetBrowser.currentPreviewPage = 0;
+	AssetBrowser.totalPages = 1;
+	
+	for(%i=0; %i < %assetArray.count(); %i++)
+		AssetBrowser.buildPreviewArray( %assetArray.getValue(%i), %assetArray.getKey(%i) );  
+		
+   AssetBrowser_FooterText.text = %assetArray.count() @ " Assets";
 }
 }
 
 
 //
 //
 //
 //
-function AssetBrowserSearchFilterText::onWake( %this )
+// Search Filters
+function AssetBrowserSearchFilterTxt::onWake( %this )
 {
 {
    /*%filter = %this.treeView.getFilterText();
    /*%filter = %this.treeView.getFilterText();
    if( %filter $= "" )
    if( %filter $= "" )
@@ -982,45 +1302,175 @@ function AssetBrowserSearchFilterText::onWake( %this )
       %this.setText( %filter );*/
       %this.setText( %filter );*/
 }
 }
 
 
-//------------------------------------------------------------------------------
-
-function AssetBrowserSearchFilterText::onGainFirstResponder( %this )
+function AssetBrowserSearchFilterTxt::onGainFirstResponder( %this )
 {
 {
    %this.selectAllText();
    %this.selectAllText();
 }
 }
 
 
-//---------------------------------------------------------------------------------------------
-
 // When Enter is pressed in the filter text control, pass along the text of the control
 // When Enter is pressed in the filter text control, pass along the text of the control
 // as the treeview's filter.
 // as the treeview's filter.
-function AssetBrowserSearchFilterText::onReturn( %this )
+function AssetBrowserFolderSearchFilter::onReturn( %this )
 {
 {
    %text = %this.getText();
    %text = %this.getText();
    if( %text $= "" )
    if( %text $= "" )
       %this.reset();
       %this.reset();
-   else
-   {
-      //%this.treeView.setFilterText( %text );
-	  %curItem = AssetBrowserFilterTree.getSelectedItem();
-	  AssetBrowserFilterTree.onSelect(%curItem);
-   }
+   
+   AssetBrowser.loadFilters();
 }
 }
 
 
-//---------------------------------------------------------------------------------------------
+function AssetBrowserSearchFilter::onReturn( %this )
+{
+   %text = %this.getText();
+   if( %text $= "" )
+      %this.reset();
+   
+   AssetBrowser.rebuildAssetArray();
+}
 
 
-function AssetBrowserSearchFilterText::reset( %this )
+function AssetBrowserFolderSearchFilter::reset( %this )
 {
 {
-   %this.setText( "\c2Filter..." );
-   //%this.treeView.clearFilterText();
-   %curItem = AssetBrowserFilterTree.getSelectedItem();
-   AssetBrowserFilterTree.onSelect(%curItem);
+   %this.setText( "Search Folders..." );
+   
+   AssetBrowser.loadFilters();
+}
+
+function AssetBrowserSearchFilter::reset( %this )
+{
+   %this.setText( "Search Assets..." );
+   
+   AssetBrowser.rebuildAssetArray();
+}
+
+function AssetBrowser_ClearFolderFilterBtn::onClick( %this )
+{
+   AssetBrowserFolderSearchFilter.reset();
+}
+
+function AssetBrowser_ClearAssetFilterBtn::onClick( %this )
+{
+   AssetBrowserSearchFilter.reset();
+}
+//
+//
+// Navigation
+function AssetBrowser::navigateTo(%this, %address, %historyNav)
+{
+   //Don't bother navigating if it's to the place we already are
+   if(AssetBrowser.currentAddress $= %address)
+      return;
+      
+   //clear the breadcrumb bar
+   AssetBrowser_BreadcrumbBar.clear();
+   
+   //break down the address
+   %folderCount = getTokenCount(%address, "/");
+      
+   %rebuiltPath = "";
+   for(%f=0; %f < %folderCount; %f++)
+   {
+      %folderName = getToken(%address, "/", %f);
+      
+      %rebuiltPath = %f == 0 ? %folderName : %rebuiltPath @ "/" @ %folderName;
+      
+      %folderNavButton = new GuiButtonCtrl()
+      {
+         profile = ToolsGuiButtonProfile;
+         text = %folderName;
+         command = "AssetBrowser.navigateTo(\"" @ %rebuiltPath @ "\");";
+         extent = "100" SPC AssetBrowser_BreadcrumbBar.extent.y;
+      };
+      
+      AssetBrowser_BreadcrumbBar.add(%folderNavButton);
+      
+      if(%f != %folderCount-1)
+      {
+         %folderSpacerButton = new GuiBitmapButtonCtrl()
+         {
+            profile = ToolsGuiButtonProfile;
+            bitmap = "tools/gui/images/rightArrowWhite";
+            bitmapMode = "Centered";
+            extent = "25" SPC AssetBrowser_BreadcrumbBar.extent.y;
+            //command = "AssetBrowser.navigateTo(\"" @ %rebuiltPath @ "\");";
+         };
+         
+         AssetBrowser_BreadcrumbBar.add(%folderSpacerButton);
+      }
+   }
+
+   //find our folder tree and action on it tree
+   %folderId = AssetBrowser.getFolderTreeItemFromAddress(%address);
+   
+   %oldAddress = AssetBrowser.currentAddress;   
+   AssetBrowser.currentAddress = %address;
+   AssetBrowser.selectedItem = %folderId;
+   
+   AssetBrowser-->filterTree.clearSelection();
+   AssetBrowser-->filterTree.selectItem(%folderId);
+   
+   //remove any history records that are 'newer' than this one
+   if(%historyNav $= "")
+   {
+      AssetBrowser_NavForeHistoryList.empty();  
+      
+      if(%oldAddress !$= "") 
+         AssetBrowser_NavPrevHistoryList.push_front(%oldAddress);
+   }
+   
+   //refresh the nav buttons to display the history
+   %backButtonHistory = "";
+   for(%i=0; %i < AssetBrowser_NavPrevHistoryList.Count(); %i++)
+   {
+      %prevAddress = AssetBrowser_NavPrevHistoryList.getKey(%i);
+      %backButtonHistory = %i==0 ? %prevAddress @ "\n" : %backButtonHistory @ %prevAddress @ "\n";
+   }
+   
+   AssetBrowser_NavigateBackBtn.tooltip = %backButtonHistory;
+   
+   %foreButtonHistory = "";
+   for(%i=0; %i < AssetBrowser_NavForeHistoryList.Count(); %i++)
+   {
+      %prevAddress = AssetBrowser_NavForeHistoryList.getKey(%i);
+      %foreButtonHistory = %i==0 ? %prevAddress @ "\n" : %foreButtonHistory @ %prevAddress @ "\n";
+   }
+   
+   AssetBrowser_NavigateForwardBtn.tooltip = %foreButtonHistory;
+   
+   %module = AssetBrowser.getModuleFromAddress(%address);
+   if(%module !$= "")
+   {
+      //legit module, so set it as current target
+      AssetBrowser.SelectedModule = %module.moduleId;
+   }
+   
+   %this.rebuildAssetArray();
 }
 }
 
 
-//---------------------------------------------------------------------------------------------
+function AssetBrowser::navigateHistoryForward(%this)
+{
+   if(AssetBrowser_NavForeHistoryList.count() == 0)
+      return;
+      
+   %newAddress = AssetBrowser_NavForeHistoryList.getKey(0);
+   %prevHistory = AssetBrowser.currentAddress;
+      
+   AssetBrowser_NavPrevHistoryList.push_front(%prevHistory);
+   AssetBrowser_NavForeHistoryList.pop_front();
+   
+   %this.navigateTo(%newAddress, true);
+}
 
 
-function AssetBrowserSearchFilterText::onClick( %this )
+function AssetBrowser::navigateHistoryBack(%this)
 {
 {
-   %this.textCtrl.reset();
+   if(AssetBrowser_NavPrevHistoryList.count() == 0)
+      return;
+      
+   %newAddress = AssetBrowser_NavPrevHistoryList.getKey(0);
+   %foreHistory = AssetBrowser.currentAddress;
+      
+   AssetBrowser_NavForeHistoryList.push_front(%foreHistory);
+   AssetBrowser_NavPrevHistoryList.pop_front();
+   
+   %this.navigateTo(%newAddress, true);
 }
 }
 
 
 //
 //
@@ -1054,8 +1504,114 @@ function AssetBrowser::reloadModules(%this)
    
    
    //ModuleDatabase.loadGroup("Game");
    //ModuleDatabase.loadGroup("Game");
 }
 }
+
+function AssetBrowser::getModuleFromAddress(%this, %address)
+{
+   //break down the address
+   %folderCount = getTokenCount(%address, "/");
+      
+   for(%f=0; %f < %folderCount; %f++)
+   {
+      %folderName = getToken(%address, "/", %f);
+
+      %module = ModuleDatabase.findModule(%folderName);
+      if(%module !$= "")
+         return %module;
+   }
+   
+   return "";
+}
+
+//AssetBrowser.getFolderTreeItemFromAddress(AssetBrowser.currentAddress);
+function AssetBrowser::getFolderTreeItemFromAddress(%this, %address)
+{
+   //break down the address
+   %folderCount = getTokenCount(%address, "/");
+
+   %curItem = 0;
+   %rebuiltPath = "";
+   for(%f=0; %f < %folderCount; %f++)
+   {
+      %folderName = getToken(%address, "/", %f);
+      %curItem = AssetBrowser-->filterTree.findChildItemByName(%curItem, %folderName);
+   }
+   
+   return %curItem;
+}
+
+function AssetBrowser::expandTreeToAddress(%this, %address)
+{
+   //break down the address
+   %folderCount = getTokenCount(%address, "/");
+   AssetBrowser-->filterTree.expandItem(0);
+
+   %curItem = 0;
+   %rebuiltPath = "";
+   for(%f=0; %f < %folderCount; %f++)
+   {
+      %folderName = getToken(%address, "/", %f);
+      %curItem = AssetBrowser-->filterTree.findChildItemByName(%curItem, %folderName);
+      AssetBrowser-->filterTree.expandItem(%curItem);
+   }
+}
+//
+//
 //
 //
+function AssetBrowser::createNewFolder(%this)
+{
+   %newFolderIdx = "";
+   %matched = true;
+   %newFolderPath = "";
+   while(%matched == true)
+   {
+      %newFolderPath = AssetBrowser.currentAddress @ "/NewFolder" @ %newFolderIdx;
+      if(!isDirectory(%newFolderPath))
+      {
+         %matched = false;
+      }
+      else
+      {
+         %newFolderIdx++;         
+      }
+   }
+   
+   //make a dummy file
+   %file = new FileObject();
+   %file.openForWrite(%newFolderPath @ "/test");
+   %file.close();
+   
+   fileDelete(%newFolderPath @ "/test");
+   
+   //refresh the directory
+   %this.loadFilters();
+   %this.rebuildAssetArray();
+}
 
 
+//
+//
+//
+function AssetBrowser::toggleFolderCollapseButton(%this)
+{
+   %this.folderPanelState = !%this.folderPanelState;
+   
+   //If we're collapsing
+   if(!%this.folderPanelState)
+   {
+      //Store the original
+      %this.folderPanelSplit = AssetBrowser_MainSplit.splitPoint.x;
+      
+      //collapse it
+      AssetBrowser_MainSplit.setSplitPoint(AssetBrowser_MainSplit.splitterSize SPC AssetBrowser_MainSplit.splitPoint.y);
+   }
+   else
+   {
+      //restore the original
+      AssetBrowser_MainSplit.setSplitPoint(%this.folderPanelSplit SPC AssetBrowser_MainSplit.splitPoint.y);
+   }  
+}
+//
+//
+// Drag n drop
 function AssetPreviewButton::onMouseDragged(%this)
 function AssetPreviewButton::onMouseDragged(%this)
 {
 {
    %payload = new GuiBitmapButtonCtrl();
    %payload = new GuiBitmapButtonCtrl();

+ 37 - 131
Templates/BaseGame/game/tools/assetBrowser/scripts/assetImport.cs

@@ -85,6 +85,7 @@ function AssetBrowser::onBeginDropFiles( %this )
    //prep the import control
    //prep the import control
    Canvas.pushDialog(AssetImportCtrl);
    Canvas.pushDialog(AssetImportCtrl);
    AssetImportCtrl.setHidden(true);
    AssetImportCtrl.setHidden(true);
+
    ImportAssetTree.clear();
    ImportAssetTree.clear();
    ImportAssetTree.insertItem(0, "Importing Assets");
    ImportAssetTree.insertItem(0, "Importing Assets");
    AssetBrowser.unprocessedAssetsCount = 0;
    AssetBrowser.unprocessedAssetsCount = 0;
@@ -161,136 +162,39 @@ function AssetBrowser::onDropZipFile(%this, %filePath)
    }
    }
 }
 }
 
 
-function AssetBrowser::onDropImageFile(%this, %filePath)
+function AssetBrowser::onEndDropFiles( %this )
 {
 {
    if(!%this.isVisible())
    if(!%this.isVisible())
       return;
       return;
       
       
-   // File Information madness
-   %fileName         = %filePath;
-   %fileOnlyName     = fileName( %fileName );
-   %fileBase         = validateDatablockName(fileBase( %fileName ) @ "ImageMap");
-   
-   // [neo, 5/17/2007 - #3117]
-   // Check if the file being dropped is already in data/images or a sub dir by checking if
-   // the file path up to length of check path is the same as check path.
-   %defaultPath = EditorSettings.value( "WorldEditor/defaultMaterialsPath" );
-
-   %checkPath    = expandFilename( "^"@%defaultPath );
-   %fileOnlyPath = expandFileName( %filePath ); //filePath( expandFileName( %filePath ) );
-   %fileBasePath = getSubStr( %fileOnlyPath, 0, strlen( %checkPath ) );
+   ImportAssetWindow.refresh();
    
    
-   if( %checkPath !$= %fileBasePath )
+   %hasIssues = ImportAssetWindow.validateAssets();
+   
+   //If we have a valid config file set and we've set to auto-import, and we have no
+   //issues for importing, then go ahead and run the import immediately, don't
+   //bother showing the window.
+   //If any of these conditions fail, we'll display the import window so it can be handled
+   //by the user
+   if(ImportAssetWindow.importConfigsList.count() != 0 && 
+      EditorSettings.value("Assets/AssetImporDefaultConfig") !$= "" && 
+      EditorSettings.value("Assets/AutoImport", false) == true
+      && %hasIssues == false)
    {
    {
-      // No match so file is from outside images directory and we need to copy it in
-      %fileNewLocation = expandFilename("^"@%defaultPath) @ "/" @ fileBase( %fileName ) @ fileExt( %fileName );
-   
-      // Move to final location
-      if( !pathCopy( %filePath, %fileNewLocation ) )
-         return;
-   }
-   else 
-   {  
-      // Already in images path somewhere so just link to it
-      %fileNewLocation = %filePath;
-   }
-   
-   addResPath( filePath( %fileNewLocation ) );
-
-   %matName = fileBase( %fileName );
+      AssetImportCtrl.setHidden(true);
+      ImportAssetWindow.visible = false;
       
       
-   // Create Material
-   %imap = new Material(%matName)
-   {
-	  mapTo = fileBase( %matName );
-	  diffuseMap[0] = %defaultPath @ "/" @ fileBase( %fileName ) @ fileExt( %fileName );
-   };
-   //%imap.setName( %fileBase );
-   //%imap.imageName = %fileNewLocation;
-   //%imap.imageMode = "FULL";
-   //%imap.filterPad = false;
-   //%imap.compile();
-
-   %diffusecheck = %imap.diffuseMap[0];
-         
-   // Bad Creation!
-   if( !isObject( %imap ) )
-      return;
-      
-   %this.addDatablock( %fileBase, false );
-}
-
-function AssetBrowser::onDropSoundFile(%this, %filePath)
-{
-   if(!%this.isVisible())
-      return;
-      
-   // File Information madness
-   %fileName         = %filePath;
-   %fileOnlyName     = fileName( %fileName );
-   %fileBase         = validateDatablockName(fileBase( %fileName ) @ "ImageMap");
-   
-   // [neo, 5/17/2007 - #3117]
-   // Check if the file being dropped is already in data/images or a sub dir by checking if
-   // the file path up to length of check path is the same as check path.
-   %defaultPath = EditorSettings.value( "WorldEditor/defaultMaterialsPath" );
-
-   %checkPath    = expandFilename( "^"@%defaultPath );
-   %fileOnlyPath = expandFileName( %filePath ); //filePath( expandFileName( %filePath ) );
-   %fileBasePath = getSubStr( %fileOnlyPath, 0, strlen( %checkPath ) );
-   
-   if( %checkPath !$= %fileBasePath )
-   {
-      // No match so file is from outside images directory and we need to copy it in
-      %fileNewLocation = expandFilename("^"@%defaultPath) @ "/" @ fileBase( %fileName ) @ fileExt( %fileName );
-   
-      // Move to final location
-      if( !pathCopy( %filePath, %fileNewLocation ) )
-         return;
+      //Go ahead and check if we have any issues, and if not, run the import!
+      ImportAssetWindow.ImportAssets();
    }
    }
-   else 
-   {  
-      // Already in images path somewhere so just link to it
-      %fileNewLocation = %filePath;
-   }
-   
-   addResPath( filePath( %fileNewLocation ) );
-
-   %matName = fileBase( %fileName );
-      
-   // Create Material
-   %imap = new Material(%matName)
+   else
    {
    {
-	  mapTo = fileBase( %matName );
-	  diffuseMap[0] = %defaultPath @ "/" @ fileBase( %fileName ) @ fileExt( %fileName );
-   };
-   //%imap.setName( %fileBase );
-   //%imap.imageName = %fileNewLocation;
-   //%imap.imageMode = "FULL";
-   //%imap.filterPad = false;
-   //%imap.compile();
-
-   %diffusecheck = %imap.diffuseMap[0];
-         
-   // Bad Creation!
-   if( !isObject( %imap ) )
-      return;
-      
-   %this.addDatablock( %fileBase, false );
-}
+      //we have assets to import, so go ahead and display the window for that now
+      AssetImportCtrl.setHidden(false);
+      ImportAssetWindow.visible = true;
+      ImportAssetWindow.selectWindow();
+   }
 
 
-function AssetBrowser::onEndDropFiles( %this )
-{
-   if(!%this.isVisible())
-      return;
-   
-   //we have assets to import, so go ahead and display the window for that now
-   AssetImportCtrl.setHidden(false);
-   ImportAssetWindow.visible = true;
-   //ImportAssetWindow.validateAssets();
-   ImportAssetWindow.refresh();
-   ImportAssetWindow.selectWindow();
-   
    // Update object library
    // Update object library
    GuiFormManager::SendContentMessage($LBCreateSiderBar, %this, "refreshAll 1");
    GuiFormManager::SendContentMessage($LBCreateSiderBar, %this, "refreshAll 1");
    
    
@@ -503,9 +407,6 @@ function ImportAssetWindow::onWake(%this)
    //Lets refresh our list
    //Lets refresh our list
    if(!ImportAssetWindow.isVisible())
    if(!ImportAssetWindow.isVisible())
       return;
       return;
-      
-   $AssetBrowser::importConfigsFile = "tools/assetBrowser/assetImportConfigs.xml";
-   $AssetBrowser::currentImportConfig = "";
    
    
    if(!isObject(AssetImportSettings))
    if(!isObject(AssetImportSettings))
    {
    {
@@ -526,7 +427,11 @@ function ImportAssetWindow::onWake(%this)
 
 
 function ImportAssetWindow::reloadImportOptionConfigs(%this)
 function ImportAssetWindow::reloadImportOptionConfigs(%this)
 {
 {
-   ImportAssetWindow.importConfigsList = new ArrayObject();
+   if(!isObject(ImportAssetWindow.importConfigsList))
+      ImportAssetWindow.importConfigsList = new ArrayObject();
+   else
+      ImportAssetWindow.importConfigsList.empty();
+      
    ImportAssetConfigList.clear();
    ImportAssetConfigList.clear();
    
    
    %xmlDoc = new SimXMLDocument();
    %xmlDoc = new SimXMLDocument();
@@ -1168,10 +1073,12 @@ function ImportAssetWindow::validateAssets(%this)
    //Clear any status
    //Clear any status
    %this.resetAssetsValidationStatus();
    %this.resetAssetsValidationStatus();
    
    
+   ImportAssetWindow.importIssues = false;
+   
    %id = ImportAssetTree.getChild(1);
    %id = ImportAssetTree.getChild(1);
    %hasIssues = %this.validateAsset(%id);
    %hasIssues = %this.validateAsset(%id);
    
    
-   if(%hasIssues)
+   if(ImportAssetWindow.importIssues == false)
       return false;
       return false;
    else
    else
       return true;
       return true;
@@ -1179,6 +1086,7 @@ function ImportAssetWindow::validateAssets(%this)
 
 
 function ImportAssetWindow::validateAsset(%this, %id)
 function ImportAssetWindow::validateAsset(%this, %id)
 {
 {
+   
    %moduleName = ImportAssetModuleList.getText();
    %moduleName = ImportAssetModuleList.getText();
    
    
    while (%id > 0)
    while (%id > 0)
@@ -1229,21 +1137,17 @@ function ImportAssetWindow::validateAsset(%this, %id)
             {
             {
                %foundCollision = true;
                %foundCollision = true;
                
                
-               %assetItem.status = "Warning";
+               %assetItem.status = "error";
                %assetItem.statusType = "DuplicateAsset";
                %assetItem.statusType = "DuplicateAsset";
                %assetItem.statusInfo = "Duplicate asset names found with the target module!\nAsset \"" @ 
                %assetItem.statusInfo = "Duplicate asset names found with the target module!\nAsset \"" @ 
                   %assetItem.assetName @ "\" of type \"" @ %assetItem.assetType @ "\" has a matching name.\nPlease rename it and try again!";
                   %assetItem.assetName @ "\" of type \"" @ %assetItem.assetType @ "\" has a matching name.\nPlease rename it and try again!";
                   
                   
-               //Clean up our queries
-               %assetQuery.delete();
                break;
                break;
             }
             }
          }
          }
          
          
          if(%foundCollision == true)
          if(%foundCollision == true)
          {
          {
-            %hasIssues = true;
-            
             //yup, a collision, prompt for the change and bail out
             //yup, a collision, prompt for the change and bail out
             /*MessageBoxOK( "Error!", "Duplicate asset names found with the target module!\nAsset \"" @ 
             /*MessageBoxOK( "Error!", "Duplicate asset names found with the target module!\nAsset \"" @ 
                %assetItemA.assetName @ "\" of type \"" @ %assetItemA.assetType @ "\" has a matching name.\nPlease rename it and try again!");*/
                %assetItemA.assetName @ "\" of type \"" @ %assetItemA.assetType @ "\" has a matching name.\nPlease rename it and try again!");*/
@@ -1259,7 +1163,6 @@ function ImportAssetWindow::validateAsset(%this, %id)
       //Check if we were given a file path(so not generated) but somehow isn't a valid file
       //Check if we were given a file path(so not generated) but somehow isn't a valid file
       if(%assetItem.filePath !$= ""  && !%assetItem.generatedAsset && !isFile(%assetItem.filePath))
       if(%assetItem.filePath !$= ""  && !%assetItem.generatedAsset && !isFile(%assetItem.filePath))
       {
       {
-         %hasIssues = true;  
          %assetItem.status = "error";
          %assetItem.status = "error";
          %assetItem.statusType = "MissingFile";
          %assetItem.statusType = "MissingFile";
          %assetItem.statusInfo = "Unable to find file to be imported. Please select asset file.";
          %assetItem.statusInfo = "Unable to find file to be imported. Please select asset file.";
@@ -1273,6 +1176,9 @@ function ImportAssetWindow::validateAsset(%this, %id)
          }
          }
       }
       }
       
       
+      if(%assetItem.status $= "error")
+         ImportAssetWindow.importIssues = true;
+      
       if(ImportAssetTree.isParentItem(%id))
       if(ImportAssetTree.isParentItem(%id))
       {
       {
          %childItem = ImportAssetTree.getChild(%id);
          %childItem = ImportAssetTree.getChild(%id);

+ 6 - 3
Templates/BaseGame/game/tools/assetBrowser/scripts/assetImportConfig.cs

@@ -9,7 +9,9 @@ function ImportAssetConfigList::onSelect( %this, %id, %text )
    ImportAssetWindow.activeImportConfigIndex = %id;
    ImportAssetWindow.activeImportConfigIndex = %id;
    ImportAssetWindow.activeImportConfig = ImportAssetWindow.importConfigsList.getKey(%id);
    ImportAssetWindow.activeImportConfig = ImportAssetWindow.importConfigsList.getKey(%id);
    
    
-   AssetBrowser.reloadImportingFiles();
+   //If we were trying to import anything, refresh it with the new config
+   if( AssetBrowser.importingFilesArray.count() != 0)
+      AssetBrowser.reloadImportingFiles();
 }
 }
 
 
 function setupImportConfigSettingsList()
 function setupImportConfigSettingsList()
@@ -428,8 +430,9 @@ function ImportOptionsConfigList::changeEditorSetting(%this, %varName, %value)
    
    
    if(%oldValue !$= %value)
    if(%oldValue !$= %value)
    {
    {
-      %id = %this.getSelectedRow();
-      %this.setSelectedRow(%id);  
+      %scollPos = ImportAssetConfigEditorScroll.getScrollPosition();
+      ImportAssetConfigEditorWindow.populateConfigList(ImportAssetWindow.activeImportConfig); 
+      ImportAssetConfigEditorScroll.setScrollPosition(%scollPos.x, %scollPos.y);
    }
    }
 }
 }
 
 

+ 1 - 1
Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/component.cs

@@ -76,7 +76,7 @@ function AssetBrowser::duplicateComponentAsset(%this, %assetId)
    
    
 }
 }
 
 
-function AssetBrowser::renameGameObjectAsset(%this, %assetDef, %newAssetId, %originalName, %newName)
+function AssetBrowser::renameComponentAsset(%this, %assetDef, %newAssetId, %originalName, %newName)
 {
 {
    %assetPath = AssetDatabase.getAssetFilePath(%newAssetId);
    %assetPath = AssetDatabase.getAssetFilePath(%newAssetId);
    
    

+ 95 - 0
Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/folder.cs

@@ -0,0 +1,95 @@
+function AssetBrowser::buildFolderPreview(%this, %assetDef, %previewData)
+{
+   %previewData.assetName = %assetDef.assetName;
+   %previewData.assetPath = %assetDef.dirPath;
+   
+   //%previewData.previewImage = "tools/assetBrowser/art/folderIcon";
+   %previewData.previewImage = "tools/gui/images/folder";
+   
+   //%previewData.assetFriendlyName = %assetDef.assetName;
+   %previewData.assetDesc = %assetDef.description;
+   %previewData.tooltip = %assetDef.dirPath;
+   %previewData.doubleClickCommand = "AssetBrowser.navigateTo(\""@ %assetDef.dirPath @ "/" @ %assetDef.assetName @"\")";//browseTo %assetDef.dirPath / %assetDef.assetName
+}
+
+function AssetBrowser::renameFolder(%this, %folderPath, %newFolderName)
+{
+   %fullPath = makeFullPath(%folderPath);
+   %newFullPath = makeFullPath(%folderPath);
+   
+   %fullPath = strreplace(%fullPath, "//", "/");
+   
+   %count = getTokenCount(%fullPath, "/");
+   %basePath = getTokens(%fullPath, "/", 0, %count-2);
+   %oldName = getToken(%fullPath, "/", %count-1);
+   
+   //We need to ensure that no files are 'active' while we try and clean up behind ourselves with the delete action
+   //so, we nix any assets active for the module, do the delete action on the old folder, and then re-acquire our assets.
+   //This will have the added benefit of updating paths for asset items
+   
+   %module = AssetBrowser.getModuleFromAddress(AssetBrowser.currentAddress);
+   %moduleId = %module.ModuleId;
+   
+   AssetDatabase.removeDeclaredAssets(%moduleId);
+   
+   %copiedSuccess = pathCopy(%fullPath, %basePath @ "/" @ %newFolderName);
+   %this.deleteFolder(%fullPath);
+   
+   AssetDatabase.addModuleDeclaredAssets(%moduleId);
+}
+
+function AssetBrowser::deleteFolder(%this, %folderPath)
+{
+   doDeleteFolder(%folderPath);
+   
+   %this.loadFilters();
+}
+
+function doDeleteFolder(%folderPath)
+{
+   %fullPath = makeFullPath(%folderPath);
+   
+   //First, wipe out any files inside the folder first
+   %file = findFirstFileMultiExpr( %fullPath @ "/*.*", true);
+
+   while( %file !$= "" )
+   {      
+      %success = fileDelete( %file );
+      
+      if(!%success)
+      {
+         error("doDeleteFolder - unable to delete file " @ %file);
+         return;         
+      }
+      
+      %file = findNextFileMultiExpr( %fullPath @ "/*.*" );
+   }
+   
+   //next, walk through and delete any subfolders that may be remaining
+   while(fileDelete(%fullPath) == 0)
+   {
+      //We couldn't delete the folder, so get a directory list and recurse through it, deleteing them as we go
+      %paths = getDirectoryList(%fullPath);
+      for(%i=0; %i < getFieldCount(%paths); %i++)
+      {
+         %childPath = getField(%paths, %i);
+         doDeleteFolder(%fullPath @ "/" @ %childPath);
+      }
+   }  
+}
+
+function AssetBrowser::moveFolder(%this, %folderPath, %newFolderPath)
+{
+   %fullPath = makeFullPath(%folderPath);
+   %newFullPath = makeFullPath(%newFolderPath);
+   
+   %fullPath = strreplace(%fullPath, "//", "/");
+   %newFullPath = strreplace(%newFullPath, "//", "/");
+   
+   %count = getTokenCount(%fullPath, "/");
+   %basePath = getTokens(%fullPath, "/", 0, %count-2);
+   %oldName = getToken(%fullPath, "/", %count-1);
+   
+   %copiedSuccess = pathCopy(%fullPath, %newFullPath @ "/" @ %newFolderName);
+   %this.deleteFolder(%fullPath);
+}

+ 5 - 3
Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/gui.cs

@@ -5,9 +5,11 @@ function AssetBrowser::createGUIAsset(%this)
       
       
    %assetName = AssetBrowser.newAssetSettings.assetName;
    %assetName = AssetBrowser.newAssetSettings.assetName;
    
    
-   %tamlpath = %modulePath @ "/GUIs/" @ %assetName @ ".asset.taml";
-   %guipath = %modulePath @ "/GUIs/" @ %assetName @ ".gui";
-   %scriptPath = %modulePath @ "/GUIs/" @ %assetName @ ".cs";
+   %assetPath = AssetBrowser.currentAddress @ "/";
+   
+   %tamlpath = %assetPath @ %assetName @ ".asset.taml";
+   %guipath = %assetPath @ %assetName @ ".gui";
+   %scriptPath = %assetPath @ %assetName @ ".cs";
    
    
    %asset = new GUIAsset()
    %asset = new GUIAsset()
    {
    {

+ 1 - 1
Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.cs

@@ -117,7 +117,7 @@ function AssetBrowser::importImageAsset(%this, %assetItem)
    %assetImportSuccessful = false;
    %assetImportSuccessful = false;
    %assetId = %moduleName@":"@%assetName;
    %assetId = %moduleName@":"@%assetName;
    
    
-   %assetPath = "data/" @ %moduleName @ "/Images";
+   %assetPath = AssetBrowser.currentAddress @ "/";
    %assetFullPath = %assetPath @ "/" @ fileName(%filePath);
    %assetFullPath = %assetPath @ "/" @ fileName(%filePath);
    
    
    %newAsset = new ImageAsset()
    %newAsset = new ImageAsset()

+ 12 - 2
Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/level.cs

@@ -5,14 +5,20 @@ function AssetBrowser::createLevelAsset(%this)
    
    
    %assetName = AssetBrowser.newAssetSettings.assetName;
    %assetName = AssetBrowser.newAssetSettings.assetName;
    
    
-   %tamlpath = %modulePath @ "/levels/" @ %assetName @ ".asset.taml";
-   %levelPath = %modulePath @ "/levels/" @ %assetName @ ".mis";
+   %assetPath = AssetBrowser.currentAddress @ "/";
+   
+   %tamlpath = %assetPath @ %assetName @ ".asset.taml";
+   %levelPath = %assetPath @ %assetName @ ".mis";
    
    
    %asset = new LevelAsset()
    %asset = new LevelAsset()
    {
    {
       AssetName = %assetName;
       AssetName = %assetName;
       versionId = 1;
       versionId = 1;
       LevelFile = %assetName @ ".mis";
       LevelFile = %assetName @ ".mis";
+      DecalsFile = %assetName @ ".mis.decals";
+      PostFXPresetFile = %assetName @ ".postfxpreset.cs";
+      ForestFile = %assetName @ ".forest";
+      NavmeshFile = %assetName @ ".nav";
       LevelName = AssetBrowser.newAssetSettings.levelName;
       LevelName = AssetBrowser.newAssetSettings.levelName;
       AssetDescription = AssetBrowser.newAssetSettings.description;
       AssetDescription = AssetBrowser.newAssetSettings.description;
       PreviewImage = AssetBrowser.newAssetSettings.levelPreviewImage;
       PreviewImage = AssetBrowser.newAssetSettings.levelPreviewImage;
@@ -24,6 +30,10 @@ function AssetBrowser::createLevelAsset(%this)
    {
    {
       echo("Unable to copy template level file!");
       echo("Unable to copy template level file!");
    }
    }
+   
+   //Generate the associated files
+   DecalManagerSave( %assetPath @ %asset.DecalsFile );
+   PostFXManager::savePresetHandler( %assetPath @ %asset.PostFXPresetFile );
 
 
 	%moduleDef = ModuleDatabase.findModule(%moduleName, 1);
 	%moduleDef = ModuleDatabase.findModule(%moduleName, 1);
 	AssetDatabase.addDeclaredAsset(%moduleDef, %tamlpath);
 	AssetDatabase.addDeclaredAsset(%moduleDef, %tamlpath);

+ 4 - 4
Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/material.cs

@@ -278,10 +278,10 @@ function AssetBrowser::importMaterialAsset(%this, %assetItem)
    %assetImportSuccessful = false;
    %assetImportSuccessful = false;
    %assetId = %moduleName@":"@%assetName;
    %assetId = %moduleName@":"@%assetName;
    
    
-   %assetPath = "data/" @ %moduleName @ "/materials";
-   %tamlpath = %assetPath @ "/" @ %assetName @ ".asset.taml";
-   %sgfPath = %assetPath @ "/" @ %assetName @ ".sgf";
-   %scriptPath = %assetPath @ "/" @ %assetName @ ".cs";
+   %assetPath = AssetBrowser.currentAddress @ "/";
+   %tamlpath = %assetPath @ %assetName @ ".asset.taml";
+   %sgfPath = %assetPath @ %assetName @ ".sgf";
+   %scriptPath = %assetPath @ %assetName @ ".cs";
    
    
    %newAsset = new MaterialAsset()
    %newAsset = new MaterialAsset()
    {
    {

+ 5 - 3
Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/script.cs

@@ -3,10 +3,12 @@ function AssetBrowser::createScriptAsset(%this)
    %moduleName = AssetBrowser.newAssetSettings.moduleName;
    %moduleName = AssetBrowser.newAssetSettings.moduleName;
    %modulePath = "data/" @ %moduleName;
    %modulePath = "data/" @ %moduleName;
       
       
-   %assetName = AssetBrowser.newAssetSettings.assetName;      
+   %assetName = AssetBrowser.newAssetSettings.assetName;  
    
    
-   %tamlpath = %modulePath @ "/scripts/" @ %assetName @ ".asset.taml";
-   %scriptPath = %modulePath @ "/scripts/" @ %assetName @ ".cs";
+   %assetPath = AssetBrowser.currentAddress @ "/";    
+   
+   %tamlpath = %assetPath @ %assetName @ ".asset.taml";
+   %scriptPath = %assetPath @ %assetName @ ".cs";
    
    
    %asset = new ScriptAsset()
    %asset = new ScriptAsset()
    {
    {

+ 4 - 2
Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.cs

@@ -5,8 +5,10 @@ function AssetBrowser::createShapeAsset(%this)
       
       
    %assetName = AssetBrowser.newAssetSettings.assetName;
    %assetName = AssetBrowser.newAssetSettings.assetName;
    
    
-   %tamlpath = %modulePath @ "/shapes/" @ %assetName @ ".asset.taml";
-   %shapeFilePath = %modulePath @ "/shapes/" @ %assetName @ ".dae";
+   %assetPath = AssetBrowser.currentAddress @ "/";
+   
+   %tamlpath = %assetPath @ %assetName @ ".asset.taml";
+   %shapeFilePath = %assetPath @ %assetName @ ".dae";
    
    
    %asset = new ShapeAsset()
    %asset = new ShapeAsset()
    {
    {

+ 33 - 0
Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/terrain.cs

@@ -1,5 +1,38 @@
 function AssetBrowser::createTerrainAsset(%this)
 function AssetBrowser::createTerrainAsset(%this)
 {
 {
+   %moduleName = AssetBrowser.newAssetSettings.moduleName;
+   %modulePath = "data/" @ %moduleName;
+      
+   %assetName = AssetBrowser.newAssetSettings.assetName;      
+   
+   %assetType = AssetBrowser.newAssetSettings.assetType;
+   %assetPath = AssetBrowser.currentAddress @ "/";   
+   
+   %tamlpath = %assetPath @ %assetName @ ".asset.taml";
+   %terPath = %assetPath @ %assetName @ ".ter";
+   
+   %asset = new TerrainAsset()
+   {
+      AssetName = %assetName;
+      versionId = 1;
+      terrainFile = %assetName @ ".ter";
+   };
+   
+   TamlWrite(%asset, %tamlpath);
+   
+   %moduleDef = ModuleDatabase.findModule(%moduleName, 1);
+	AssetDatabase.addDeclaredAsset(%moduleDef, %tamlpath);
+
+	AssetBrowser.loadFilters();
+	
+	AssetBrowserFilterTree.onSelect(%smItem);
+	
+	//Save out a basic terrain block here
+	%terrBlock = new TerrainBlock() { terrainFile = %terPath; };
+	%terrBlock.save(%terPath);
+	%terrBlock.delete();
+   
+	return %tamlpath;
 }
 }
 
 
 function AssetBrowser::editTerrainAsset(%this, %assetDef)
 function AssetBrowser::editTerrainAsset(%this, %assetDef)

+ 61 - 0
Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/terrainMaterial.cs

@@ -1,9 +1,70 @@
 function AssetBrowser::createTerrainMaterialAsset(%this)
 function AssetBrowser::createTerrainMaterialAsset(%this)
 {
 {
+   %moduleName = AssetBrowser.newAssetSettings.moduleName;
+   %modulePath = "data/" @ %moduleName;
+      
+   %assetName = AssetBrowser.newAssetSettings.assetName;      
+   
+   %assetType = AssetBrowser.newAssetSettings.assetType;
+   %assetPath = AssetBrowser.currentAddress @ "/";    
+   
+   %tamlpath = %assetPath @ %assetName @ ".asset.taml";
+   %scriptPath = %assetPath @ %assetName @ ".cs";
+   
+   %asset = new TerrainMaterialAsset()
+   {
+      AssetName = %assetName;
+      versionId = 1;
+      scriptFile = %assetName @ ".cs";
+      materialDefinitionName = %assetName;
+   };
+   
+   TamlWrite(%asset, %tamlpath);
+   
+   %moduleDef = ModuleDatabase.findModule(%moduleName, 1);
+	AssetDatabase.addDeclaredAsset(%moduleDef, %tamlpath);
+
+	AssetBrowser.loadFilters();
+	
+	AssetBrowserFilterTree.onSelect(%smItem);
+	
+	%file = new FileObject();
+	%templateFile = new FileObject();
+	
+	%templateFilePath = %this.templateFilesPath @ "terrainMaterial.cs.template";
+   
+   if(%file.openForWrite(%scriptPath) && %templateFile.openForRead(%templateFilePath))
+   {
+      while( !%templateFile.isEOF() )
+      {
+         %line = %templateFile.readline();
+         %line = strreplace( %line, "@", %assetName );
+         
+         %file.writeline(%line);
+         //echo(%line);
+      }
+      
+      %file.close();
+      %templateFile.close();
+   }
+   else
+   {
+      %file.close();
+      %templateFile.close();
+      
+      warnf("CreateNewTerrainMaterialAsset - Something went wrong and we couldn't write thescript file!");
+   }
+   
+   //If we've got the terrain mat editor open, go ahead and update it all
+   TerrainMaterialDlg.onWake();
+   
+	return %tamlpath;
 }
 }
 
 
 function AssetBrowser::editTerrainMaterialAsset(%this, %assetDef)
 function AssetBrowser::editTerrainMaterialAsset(%this, %assetDef)
 {
 {
+   TerrainMaterialDlg.show(0, 0, 0);
+   TerrainMaterialDlg.setActiveMaterial(%assetDef.assetName);
 }
 }
 
 
 function AssetBrowser::duplicateTerrainMaterialAsset(%this, %assetDef, %targetModule)
 function AssetBrowser::duplicateTerrainMaterialAsset(%this, %assetDef, %targetModule)

+ 82 - 33
Templates/BaseGame/game/tools/assetBrowser/scripts/editAsset.cs

@@ -76,7 +76,7 @@ function AssetBrowser::refreshAsset(%this, %assetId)
 function AssetBrowser::renameAsset(%this)
 function AssetBrowser::renameAsset(%this)
 {
 {
    //Find out what type it is
    //Find out what type it is
-   %assetDef = AssetDatabase.acquireAsset(EditAssetPopup.assetId);
+   //%assetDef = AssetDatabase.acquireAsset(EditAssetPopup.assetId);
    
    
    %curFirstResponder = AssetBrowser.getFirstResponder();
    %curFirstResponder = AssetBrowser.getFirstResponder();
    
    
@@ -92,36 +92,56 @@ function AssetBrowser::performRenameAsset(%this, %originalAssetName, %newName)
    //if the name is different to the asset's original name, rename it!
    //if the name is different to the asset's original name, rename it!
    if(%originalAssetName !$= %newName)
    if(%originalAssetName !$= %newName)
    {
    {
-      %moduleName = AssetBrowser.selectedModule;
-      
-      //do a rename!
-      %success = AssetDatabase.renameDeclaredAsset(%moduleName @ ":" @ %originalAssetName, %moduleName @ ":" @ %newName);
-      
-      if(%success)
-         echo("AssetBrowser - renaming of asset " @ %moduleName @ ":" @ %originalAssetName @ " to " @ %moduleName @ ":" @ %newName @ " was a success.");
-      else 
-         echo("AssetBrowser - renaming of asset " @ %moduleName @ ":" @ %originalAssetName @ " to " @ %moduleName @ ":" @ %newName @ " was a failure.");
-      
-      if(%success)
+      if(EditAssetPopup.assetType !$= "Folder")
       {
       {
-         %newAssetId = %moduleName @ ":" @ %newName;
-         %assetPath = AssetDatabase.getAssetFilePath(%newAssetId);
+         %moduleName = AssetBrowser.selectedModule;
          
          
-         //Rename any associated files as well
-         %assetDef = AssetDatabase.acquireAsset(%newAssetId);
-         %assetType = %assetDef.getClassName();
+         //do a rename!
+         %success = AssetDatabase.renameDeclaredAsset(%moduleName @ ":" @ %originalAssetName, %moduleName @ ":" @ %newName);
          
          
-         //rename the file to match
-         %path = filePath(%assetPath);
+         if(%success)
+            echo("AssetBrowser - renaming of asset " @ %moduleName @ ":" @ %originalAssetName @ " to " @ %moduleName @ ":" @ %newName @ " was a success.");
+         else 
+            echo("AssetBrowser - renaming of asset " @ %moduleName @ ":" @ %originalAssetName @ " to " @ %moduleName @ ":" @ %newName @ " was a failure.");
          
          
-         //Do the rename command
-         %buildCommand = %this @ ".rename" @ %assetType @ "(" @ %assetDef @ "," @ %newAssetId @ ");";
-         eval(%buildCommand);
+         if(%success)
+         {
+            %newAssetId = %moduleName @ ":" @ %newName;
+            %assetPath = AssetDatabase.getAssetFilePath(%newAssetId);
+            
+            //Rename any associated files as well
+            %assetDef = AssetDatabase.acquireAsset(%newAssetId);
+            %assetType = %assetDef.getClassName();
+            
+            //rename the file to match
+            %path = filePath(%assetPath);
+            
+            //Do the rename command
+            %buildCommand = %this @ ".rename" @ %assetType @ "(" @ %assetDef @ "," @ %newAssetId @ ");";
+            eval(%buildCommand);
+         }
+      }
+      else
+      {
+         %buildCommand = %this @ ".renameFolder(\"" @ EditAssetPopup.assetId @ "\",\"" @ %newName @ "\");";
+         eval(%buildCommand);      
       }
       }
    }
    }
    
    
    //Make sure everything is refreshed
    //Make sure everything is refreshed
    AssetBrowser.loadFilters();
    AssetBrowser.loadFilters();
+   
+   //Update the selection to immediately jump to the new asset
+   AssetBrowser-->filterTree.clearSelection();
+   %ModuleItem = AssetBrowser-->filterTree.findItemByName(%moduleName);
+   %assetTypeId = AssetBrowser-->filterTree.findChildItemByName(%ModuleItem, %assetType);
+   
+   AssetBrowser-->filterTree.selectItem(%assetTypeId);
+   
+   %selectedItem = AssetBrowser-->filterTree.getSelectedItem();
+   AssetBrowser-->filterTree.scrollVisibleByObjectId(%selectedItem);
+   
+   AssetBrowser-->filterTree.buildVisibleTree(); 
 }
 }
 
 
 function AssetNameField::onReturn(%this)
 function AssetNameField::onReturn(%this)
@@ -132,6 +152,26 @@ function AssetNameField::onReturn(%this)
    AssetBrowser.performRenameAsset(%this.originalAssetName, %this.getText());
    AssetBrowser.performRenameAsset(%this.originalAssetName, %this.getText());
 }
 }
 
 
+//------------------------------------------------------------
+function AssetBrowser::moveAsset(%this, %destination)
+{
+   if(EditAssetPopup.assetType $= "Folder")
+   {
+      //Do any cleanup required given the type
+      if(%this.isMethod("moveFolder"))
+         eval(%this @ ".moveFolder("@EditAssetPopup.assetId@",\""@%destination@"\");");
+   }
+   else
+   {
+      %assetDef = AssetDatabase.acquireAsset(EditAssetPopup.assetId);
+      %assetType = AssetDatabase.getAssetType(EditAssetPopup.assetType);
+      
+      //Do any cleanup required given the type
+      if(%this.isMethod("move"@%assetType))
+         eval(%this @ ".move"@%assetType@"("@%assetDef@");");
+   }
+}
+
 //------------------------------------------------------------
 //------------------------------------------------------------
 
 
 function AssetBrowser::duplicateAsset(%this, %targetModule)
 function AssetBrowser::duplicateAsset(%this, %targetModule)
@@ -157,10 +197,10 @@ function AssetBrowser::duplicateAsset(%this, %targetModule)
 function AssetBrowser::deleteAsset(%this)
 function AssetBrowser::deleteAsset(%this)
 {
 {
    //Find out what type it is
    //Find out what type it is
-   %assetDef = AssetDatabase.acquireAsset(EditAssetPopup.assetId);
-   %assetType = %assetDef.getClassName();
+   //%assetDef = AssetDatabase.acquireAsset(EditAssetPopup.assetId);
+   //%assetType = %assetDef.getClassName();
    
    
-   MessageBoxOKCancel("Warning!", "This will delete the selected asset and the files associated to it, do you wish to continue?", 
+   MessageBoxOKCancel("Warning!", "This will delete the selected content and the files associated to it, do you wish to continue?", 
       "AssetBrowser.confirmDeleteAsset();", "");
       "AssetBrowser.confirmDeleteAsset();", "");
 }
 }
 
 
@@ -169,14 +209,23 @@ function AssetBrowser::confirmDeleteAsset(%this)
    %currentSelectedItem = AssetBrowserFilterTree.getSelectedItem();
    %currentSelectedItem = AssetBrowserFilterTree.getSelectedItem();
    %currentItemParent = AssetBrowserFilterTree.getParentItem(%currentSelectedItem);
    %currentItemParent = AssetBrowserFilterTree.getParentItem(%currentSelectedItem);
    
    
-   %assetDef = AssetDatabase.acquireAsset(EditAssetPopup.assetId);
-   %assetType = AssetDatabase.getAssetType(EditAssetPopup.assetId);
-   
-   //Do any cleanup required given the type
-   if(%this.isMethod("delete"@%assetType))
-      eval(%this @ ".delete"@%assetType@"("@%assetDef@");");
-   
-   AssetDatabase.deleteAsset(EditAssetPopup.assetId, false);
+   if(EditAssetPopup.assetType $= "Folder")
+   {
+      //Do any cleanup required given the type
+      if(%this.isMethod("deleteFolder"))
+         eval(%this @ ".deleteFolder(\""@EditAssetPopup.assetId@"\");");
+   }
+   else
+   {
+      %assetDef = AssetDatabase.acquireAsset(EditAssetPopup.assetId);
+      %assetType = AssetDatabase.getAssetType(EditAssetPopup.assetType);
+      
+      //Do any cleanup required given the type
+      if(%this.isMethod("delete"@%assetType))
+         eval(%this @ ".delete"@%assetType@"("@%assetDef@");");
+      
+      AssetDatabase.deleteAsset(EditAssetPopup.assetId, false);
+   }
 
 
    %this.loadFilters();
    %this.loadFilters();
    
    

+ 12 - 0
Templates/BaseGame/game/tools/assetBrowser/scripts/newAsset.cs

@@ -191,6 +191,18 @@ function CreateNewAsset()
       %callbackCommand = "" @ AssetBrowser_newAsset.callbackFunc @ "(\"" @ %moduleName @ ":" @ %assetName @ "\");";
       %callbackCommand = "" @ AssetBrowser_newAsset.callbackFunc @ "(\"" @ %moduleName @ ":" @ %assetName @ "\");";
       eval(%callbackCommand);
       eval(%callbackCommand);
 	}
 	}
+	
+	//Update the selection to immediately jump to the new asset
+   AssetBrowser-->filterTree.clearSelection();
+   %ModuleItem = AssetBrowser-->filterTree.findItemByName(%moduleName);
+   %assetTypeId = AssetBrowser-->filterTree.findChildItemByName(%ModuleItem, %assetType);
+   
+   AssetBrowser-->filterTree.selectItem(%assetTypeId);
+   
+   %selectedItem = AssetBrowser-->filterTree.getSelectedItem();
+   AssetBrowser-->filterTree.scrollVisibleByObjectId(%selectedItem);
+   
+   AssetBrowser-->filterTree.buildVisibleTree(); 
 }
 }
 
 
 function ParentComponentList::onWake(%this)
 function ParentComponentList::onWake(%this)

+ 100 - 31
Templates/BaseGame/game/tools/assetBrowser/scripts/popupMenus.cs

@@ -14,7 +14,8 @@ function AssetBrowser::buildPopupMenus(%this)
       
       
       AddNewModulePopup.enableItem(1, false);
       AddNewModulePopup.enableItem(1, false);
    }
    }
-      
+   
+     
    if( !isObject( EditAssetPopup ) )
    if( !isObject( EditAssetPopup ) )
    {
    {
       new PopupMenu( EditAssetPopup )
       new PopupMenu( EditAssetPopup )
@@ -55,9 +56,9 @@ function AssetBrowser::buildPopupMenus(%this)
          item[ 5 ] = "-";
          item[ 5 ] = "-";
          Item[ 6 ] = "Duplicate Asset" TAB "" TAB "AssetBrowser.duplicateAsset();";
          Item[ 6 ] = "Duplicate Asset" TAB "" TAB "AssetBrowser.duplicateAsset();";
          item[ 7 ] = "-";
          item[ 7 ] = "-";
-         item[ 8 ] = "Re-Import Asset" TAB "" TAB "AssetBrowser.reImportAsset();";
-         item[ 9 ] = "-";
-         item[ 10 ] = "Delete Asset" TAB "" TAB "AssetBrowser.deleteAsset();";
+         //item[ 8 ] = "Re-Import Asset" TAB "" TAB "AssetBrowser.reImportAsset();";
+         //item[ 9 ] = "-";
+         item[ 8 ] = "Delete Asset" TAB "" TAB "AssetBrowser.deleteAsset();";
 
 
          jumpFileName = "";
          jumpFileName = "";
          jumpLineNumber = "";
          jumpLineNumber = "";
@@ -105,20 +106,23 @@ function AssetBrowser::buildPopupMenus(%this)
          //isPopup = true;
          //isPopup = true;
 
 
          item[ 0 ] = "Create Material" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"MaterialAsset\", AssetBrowser.selectedModule);";//"createNewMaterialAsset(\"NewMaterial\", AssetBrowser.selectedModule);";
          item[ 0 ] = "Create Material" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"MaterialAsset\", AssetBrowser.selectedModule);";//"createNewMaterialAsset(\"NewMaterial\", AssetBrowser.selectedModule);";
-         item[ 1 ] = "Create Image" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"ImageAsset\", AssetBrowser.selectedModule);";//"AssetBrowser.createNewImageAsset(\"NewImage\", AssetBrowser.selectedModule);";
-         item[ 2 ] = "-";         
-         item[ 3 ] = "Create Shape" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"Shape\", AssetBrowser.selectedModule);";
-         item[ 4 ] = "Create Shape Animation" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"ShapeAnimationAsset\", AssetBrowser.selectedModule);";//"AssetBrowser.createNewShapeAnimationAsset(\"NewShapeAnimation\", AssetBrowser.selectedModule);";
-         item[ 5 ] = "-";
-         item[ 6 ] = "Create GUI" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"GUIAsset\", AssetBrowser.selectedModule);";//"AssetBrowser.createNewGUIAsset(\"NewGUI\", AssetBrowser.selectedModule);";
-         item[ 7 ] = "-";
-         item[ 8 ] = "Create Post Effect" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"PostEffectAsset\", AssetBrowser.selectedModule);";//"AssetBrowser.createNewPostEffectAsset(\"NewPostEffect\", AssetBrowser.selectedModule);";
-         item[ 9 ] = "-";
-         item[ 10 ] = "Create Sound" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"SoundAsset\", AssetBrowser.selectedModule);";//"AssetBrowser.createNewSoundAsset(\"NewSound\", AssetBrowser.selectedModule);";
-         item[ 11 ] = "-";
-         item[ 12 ] = "Create Particle Effect" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"ParticleEffectAsset\", AssetBrowser.selectedModule);";//"AssetBrowser.createNewParticleEffectAsset(\"NewParticleEffect\", AssetBrowser.selectedModule);";
-         item[ 13 ] = "-";
-         item[ 14 ] = "Create Cubemap" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"CubemapAsset\", AssetBrowser.selectedModule);";
+         item[ 1 ] = "Create Terrain Material" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"TerrainMaterialAsset\", AssetBrowser.selectedModule);";//"AssetBrowser.createNewImageAsset(\"NewImage\", AssetBrowser.selectedModule);";
+         item[ 2 ] = "Create Image" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"ImageAsset\", AssetBrowser.selectedModule);";//"AssetBrowser.createNewImageAsset(\"NewImage\", AssetBrowser.selectedModule);";
+         item[ 3 ] = "-";
+         item[ 4 ] = "Create Terrain Data" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"TerrainAsset\", AssetBrowser.selectedModule);";
+         item[ 5 ] = "-";         
+         item[ 6 ] = "Create Shape" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"Shape\", AssetBrowser.selectedModule);";
+         item[ 7 ] = "Create Shape Animation" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"ShapeAnimationAsset\", AssetBrowser.selectedModule);";//"AssetBrowser.createNewShapeAnimationAsset(\"NewShapeAnimation\", AssetBrowser.selectedModule);";
+         item[ 8 ] = "-";
+         item[ 9 ] = "Create GUI" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"GUIAsset\", AssetBrowser.selectedModule);";//"AssetBrowser.createNewGUIAsset(\"NewGUI\", AssetBrowser.selectedModule);";
+         item[ 10 ] = "-";
+         item[ 11 ] = "Create Post Effect" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"PostEffectAsset\", AssetBrowser.selectedModule);";//"AssetBrowser.createNewPostEffectAsset(\"NewPostEffect\", AssetBrowser.selectedModule);";
+         item[ 12 ] = "-";
+         item[ 13 ] = "Create Sound" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"SoundAsset\", AssetBrowser.selectedModule);";//"AssetBrowser.createNewSoundAsset(\"NewSound\", AssetBrowser.selectedModule);";
+         item[ 14 ] = "-";
+         item[ 15 ] = "Create Particle Effect" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"ParticleEffectAsset\", AssetBrowser.selectedModule);";//"AssetBrowser.createNewParticleEffectAsset(\"NewParticleEffect\", AssetBrowser.selectedModule);";
+         item[ 16 ] = "-";
+         item[ 17 ] = "Create Cubemap" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"CubemapAsset\", AssetBrowser.selectedModule);";
       };
       };
    }
    }
    
    
@@ -148,15 +152,17 @@ function AssetBrowser::buildPopupMenus(%this)
          superClass = "MenuBuilder";
          superClass = "MenuBuilder";
          class = "EditorWorldMenu";
          class = "EditorWorldMenu";
          
          
-         item[0] = "Create Code Asset" TAB AddNewScriptAssetPopup;
+         item[0] = "Create Folder" TAB "" TAB "AssetBrowser.CreateNewFolder();";
          item[1] = "-";
          item[1] = "-";
-         item[2] = "Create Art Asset" TAB AddNewArtAssetPopup;
+         item[2] = "Create Code Asset" TAB AddNewScriptAssetPopup;
          item[3] = "-";
          item[3] = "-";
-         item[4] = "Create Level" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"LevelAsset\", AssetBrowser.selectedModule);";//"AssetBrowser.createNewLevelAsset(\"NewLevel\", AssetBrowser.selectedModule);";
+         item[4] = "Create Art Asset" TAB AddNewArtAssetPopup;
          item[5] = "-";
          item[5] = "-";
-         item[6] = "Create C++ Asset" TAB AddNewCppAssetPopup;
+         item[6] = "Create Level" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"LevelAsset\", AssetBrowser.selectedModule);";//"AssetBrowser.createNewLevelAsset(\"NewLevel\", AssetBrowser.selectedModule);";
          item[7] = "-";
          item[7] = "-";
-         item[8] = "Create New Module" TAB "" TAB "AssetBrowser.CreateNewModule();";
+         item[8] = "Create C++ Asset" TAB AddNewCppAssetPopup;
+         item[9] = "-";
+         item[10] = "Create New Module" TAB "" TAB "AssetBrowser.CreateNewModule();";
       
       
       };
       };
    }
    }
@@ -181,10 +187,27 @@ function AssetBrowser::buildPopupMenus(%this)
    }
    }
    
    
    //Some assets are not yet ready/implemented, so disable their creation here
    //Some assets are not yet ready/implemented, so disable their creation here
-   AddNewArtAssetPopup.enableItem(3, false); //shape
-   AddNewArtAssetPopup.enableItem(4, false); //shape animation
-   AddNewArtAssetPopup.enableItem(10, false); //sound asset
-   AddNewArtAssetPopup.enableItem(12, false); //particle effect
+   AddNewArtAssetPopup.enableItem(6, false); //shape
+   AddNewArtAssetPopup.enableItem(7, false); //shape animation
+   AddNewArtAssetPopup.enableItem(13, false); //sound asset
+   AddNewArtAssetPopup.enableItem(15, false); //particle effect
+   
+   if( !isObject( EditFolderPopup ) )
+   {
+      new PopupMenu( EditFolderPopup )
+      {
+         superClass = "MenuBuilder";
+         class = "EditorWorldMenu";
+         //isPopup = true;
+
+         Item[ 0 ] = "Create in Folder" TAB AddNewAssetPopup;
+         item[ 1 ] = "-";
+         item[ 2 ] = "Rename Folder" TAB "" TAB "AssetBrowser.renameAsset();";
+         Item[ 3 ] = "Duplicate Folder" TAB "" TAB "AssetBrowser.duplicateAsset();";
+         item[ 4 ] = "-";
+         item[ 5 ] = "Delete Folder" TAB "" TAB "AssetBrowser.deleteAsset();";
+      };
+   }
    
    
    if( !isObject( EditAssetCategoryPopup ) )
    if( !isObject( EditAssetCategoryPopup ) )
    {
    {
@@ -198,6 +221,38 @@ function AssetBrowser::buildPopupMenus(%this)
       };
       };
    }
    }
    
    
+   //Asset Preview size presets
+   if( !isObject( AssetPreviewSizePopup ) )
+   {
+      new PopupMenu( AssetPreviewSizePopup )
+      {
+         superClass = "MenuBuilder";
+         class = "EditorWorldMenu";
+         
+         item[ 0 ] = "Small" TAB "" TAB "AssetBrowser.setPreviewSize(\"Small\");";
+         item[ 1 ] = "Medium" TAB "" TAB "AssetBrowser.setPreviewSize(\"Medium\");";
+         Item[ 2 ] = "Large" TAB "" TAB "AssetBrowser.setPreviewSize(\"Large\");";
+      };
+      
+      AssetPreviewSizePopup.checkItem(0, true);
+   }
+   
+   if( !isObject( AssetTypeListPopup ) )
+   {
+      new PopupMenu( AssetTypeListPopup )
+      {
+         superClass = "MenuBuilder";
+         class = "EditorWorldMenu";
+         //isPopup = true;
+      };
+      
+      /*for(%i=0; %i < AssetFilterTypeList.Count(); %i++)
+      {
+         %assetTypeName = AssetFilterTypeList.getKey(%i);
+         AssetTypeListPopup.insertItem(%i, %assetTypeName, "", "AssetBrowser.toggleAssetTypeFilter(" @ %i @ ");");
+      }*/
+   }
+   
    //Browser visibility menu
    //Browser visibility menu
    if( !isObject( BrowserVisibilityPopup ) )
    if( !isObject( BrowserVisibilityPopup ) )
    {
    {
@@ -208,13 +263,26 @@ function AssetBrowser::buildPopupMenus(%this)
          //isPopup = true;
          //isPopup = true;
          
          
          item[ 0 ] = "Toggle Show Core Modules" TAB "" TAB "AssetBrowser.viewCoreModulesFilter();";
          item[ 0 ] = "Toggle Show Core Modules" TAB "" TAB "AssetBrowser.viewCoreModulesFilter();";
-         item[ 1 ] = "Toggle Only Show Modules with Assets" TAB "" TAB "AssetBrowser.viewPopulatedModulesFilter();";
-         Item[ 2 ] = "-";
-         item[ 3 ] = "Show Assets as list" TAB "" TAB "AssetBrowser.viewListFilter();";
-         Item[ 4 ] = "Show Assets with tags" TAB "" TAB "AssetBrowser.viewTagsFilter();";
+         item[ 1 ] = "Toggle Show Tools Modules" TAB "" TAB "AssetBrowser.viewToolsModulesFilter();";
+         item[ 2 ] = "Toggle Only Show Modules with Assets" TAB "" TAB "AssetBrowser.viewPopulatedModulesFilter();";
+         Item[ 3 ] = "-";
+         item[ 4 ] = "Show Folders" TAB "" TAB "AssetBrowser.toggleShowingFolders();";
+         item[ 5 ] = "Show Empty Folders" TAB "" TAB "AssetBrowser.toggleShowingEmptyFolders();";
+         item[ 6 ] = "-";
+         item[ 7 ] = "Filter by Asset Type" TAB AssetTypeListPopup;
+         item[ 8 ] = "-";
+         item[ 9 ] = "Enable Auto-refresh" TAB "" TAB "AssetBrowser.toggleAutorefresh();";
+         Item[ 10 ] = "-";
+         Item[ 11 ] = "Asset Preview Size" TAB AssetPreviewSizePopup;
       };
       };
+      
+      BrowserVisibilityPopup.enableItem(5, false);
+      BrowserVisibilityPopup.enableItem(7, false);
+      BrowserVisibilityPopup.enableItem(9, false);
    }
    }
    
    
+   //
+   
    //Import Legacy menus
    //Import Legacy menus
    if( !isObject( ImportAssetsPopup ) )
    if( !isObject( ImportAssetsPopup ) )
    {
    {
@@ -266,6 +334,7 @@ function AssetBrowser::buildPopupMenus(%this)
       
       
       };
       };
    }
    }
+
 }
 }
 
 
 function AddNewScriptAssetPopupMenu::onSelectItem(%this, %id, %text)
 function AddNewScriptAssetPopupMenu::onSelectItem(%this, %id, %text)

+ 24 - 0
Templates/BaseGame/game/tools/assetBrowser/scripts/templateFiles/terrainMaterial.cs.template

@@ -0,0 +1,24 @@
+singleton Material(TerrainFX_@)
+{
+   mapTo = "@";
+   footstepSoundId = 0;
+   terrainMaterials = "1";
+   ShowDust = "1";
+   showFootprints = "1";
+   materialTag0 = "Terrain";
+   effectColor[0] = "0.42 0.42 0 1";
+   effectColor[1] = "0.42 0.42 0 1";
+   impactSoundId = "0";
+};
+
+new TerrainMaterial(@)
+{
+   internalName = "@";
+   diffuseMap = "";
+   detailMap = "";
+   detailSize = "10";
+   isManaged = "1";
+   detailBrightness = "1";
+   Enabled = "1";
+   diffuseSize = "200";
+};

BIN
Templates/BaseGame/game/tools/base/images/512_forestgreen.png


BIN
Templates/BaseGame/game/tools/base/images/512_forestgreen_lines.png


+ 1 - 1
Templates/BaseGame/game/tools/gui/EditorLoadingGui.gui

@@ -20,7 +20,7 @@
       minExtent = "8 2";
       minExtent = "8 2";
       horizSizing = "center";
       horizSizing = "center";
       vertSizing = "center";
       vertSizing = "center";
-      profile = "ToolsGuiDefaultProfile";
+      profile = "ToolsGuiSolidDefaultProfile";
       visible = "1";
       visible = "1";
       active = "1";
       active = "1";
       tooltipProfile = "ToolsGuiToolTipProfile";
       tooltipProfile = "ToolsGuiToolTipProfile";

+ 38 - 1
Templates/BaseGame/game/tools/gui/editorSettingsWindow.ed.cs

@@ -32,6 +32,7 @@ function ESettingsWindow::startup( %this )
    %this.addEditorSettingsPage("ShapeEditor", "Shape Editor");
    %this.addEditorSettingsPage("ShapeEditor", "Shape Editor");
    %this.addEditorSettingsPage("NavEditor", "Navigation Editor");
    %this.addEditorSettingsPage("NavEditor", "Navigation Editor");
    %this.addEditorSettingsPage("Theme", "Theme");
    %this.addEditorSettingsPage("Theme", "Theme");
+   %this.addEditorSettingsPage("AssetEditing", "Asset Editing");
    
    
    %this.addGameSettingsPage("GameGeneral", "General");
    %this.addGameSettingsPage("GameGeneral", "General");
    %this.addGameSettingsPage("Gameplay", "Gameplay");
    %this.addGameSettingsPage("Gameplay", "Gameplay");
@@ -185,7 +186,7 @@ function SettingsInspector::changeEditorSetting(%this, %varName, %value)
       %success = ProjectSettings.write();
       %success = ProjectSettings.write();
       
       
    if(%oldValue !$= %value)
    if(%oldValue !$= %value)
-      ESettingsWindow.refresh();
+      ESettingsWindow.schedule(15,"refresh");
 }
 }
 
 
 function GuiInspectorVariableGroup::buildOptionsSettingField(%this, %fieldName, %fieldLabel, %fieldDesc, %fieldDefaultVal, %fieldDataVals, %ownerObj)
 function GuiInspectorVariableGroup::buildOptionsSettingField(%this, %fieldName, %fieldLabel, %fieldDesc, %fieldDefaultVal, %fieldDataVals, %ownerObj)
@@ -292,6 +293,12 @@ function ESettingsWindow::getGeneralSettings(%this)
    SettingsInspector.addSettingsField("WorldEditor/Theme/windowTitleFontColor", "Window Title Text Color", "colorI", "");
    SettingsInspector.addSettingsField("WorldEditor/Theme/windowTitleFontColor", "Window Title Text Color", "colorI", "");
    SettingsInspector.addSettingsField("WorldEditor/Theme/mainTextColor", "Main Text Color", "colorI", "");
    SettingsInspector.addSettingsField("WorldEditor/Theme/mainTextColor", "Main Text Color", "colorI", "");
    SettingsInspector.endGroup();
    SettingsInspector.endGroup();
+   
+   SettingsInspector.startGroup("Layout");
+   SettingsInspector.addSettingsField("WorldEditor/Layout/LayoutMode", "Editor Layout Mode", "list", "This dictates which layout style the editor should use." @
+                                                                                                      "WARNING - Modern layout is highlight experimental." @
+                                                                                                      "Updating this requires a restart of the program", "Classic,Modern");
+   SettingsInspector.endGroup();
 }  
 }  
 
 
 function ESettingsWindow::getCameraSettings(%this)
 function ESettingsWindow::getCameraSettings(%this)
@@ -380,6 +387,7 @@ function ESettingsWindow::getThemeSettings(%this)
    SettingsInspector.addSettingsField("Theme/fieldTextColor", "Field Text Color", "ColorI", "");
    SettingsInspector.addSettingsField("Theme/fieldTextColor", "Field Text Color", "ColorI", "");
    SettingsInspector.addSettingsField("Theme/fieldTextHLColor", "Field Text Highlight Color", "ColorI", "");
    SettingsInspector.addSettingsField("Theme/fieldTextHLColor", "Field Text Highlight Color", "ColorI", "");
    SettingsInspector.addSettingsField("Theme/fieldTextSELColor", "Field Text Selected Color", "ColorI", "");
    SettingsInspector.addSettingsField("Theme/fieldTextSELColor", "Field Text Selected Color", "ColorI", "");
+   SettingsInspector.addSettingsField("Theme/fieldTextNAColor", "Field Text N/A Color", "ColorI", "");
    
    
    SettingsInspector.addSettingsField("Theme/fieldBGColor", "Field Background Color", "ColorI", "");
    SettingsInspector.addSettingsField("Theme/fieldBGColor", "Field Background Color", "ColorI", "");
    SettingsInspector.addSettingsField("Theme/fieldBGHLColor", "Field Background Highlight Color", "ColorI", "");
    SettingsInspector.addSettingsField("Theme/fieldBGHLColor", "Field Background Highlight Color", "ColorI", "");
@@ -431,9 +439,38 @@ function ESettingsWindow::getAssetManagementSettings(%this)
    SettingsInspector.addSettingsField("AssetManagement/Assets/assetExtension", "Asset Extension", "string", "");
    SettingsInspector.addSettingsField("AssetManagement/Assets/assetExtension", "Asset Extension", "string", "");
    SettingsInspector.addSettingsField("AssetManagement/Assets/datablockCaching", "Cache Datablocks", "bool", "");
    SettingsInspector.addSettingsField("AssetManagement/Assets/datablockCaching", "Cache Datablocks", "bool", "");
    //SettingsInspector.addSettingsField("AssetManagement/Assets/moduleExtension", "Module Extension", "string", "");
    //SettingsInspector.addSettingsField("AssetManagement/Assets/moduleExtension", "Module Extension", "string", "");
+   
    SettingsInspector.endGroup();
    SettingsInspector.endGroup();
 } 
 } 
 
 
+function ESettingsWindow::getAssetEditingSettings(%this)
+{
+   ImportAssetWindow::reloadImportOptionConfigs();
+   
+   for(%i=0; %i < ImportAssetWindow.importConfigsList.Count(); %i++)
+   {
+      %configName = ImportAssetWindow.importConfigsList.getKey(%i);
+      %formattedConfigList = %i == 0 ? %configName : %formattedConfigList @ "," @ %configName;
+   }
+   
+   SettingsInspector.startGroup("Assets Importing");
+   SettingsInspector.addSettingsField("Assets/AssetImporDefaultConfig", "Default Asset Import Config", "list", "", %formattedConfigList); 
+   SettingsInspector.addSettingsField("Assets/AutoImport", "Automatically Import using default config", "bool", "If on, the asset importing process" @
+                                                                                                                        "will attempt to automatically import any inbound assets"@
+                                                                                                                        "using the default config, without prompting the import window."@
+                                                                                                                        "The window will still display if any issues are detected", ""); 
+   SettingsInspector.endGroup();
+   
+   SettingsInspector.startGroup("Asset Browser");
+   SettingsInspector.addSettingsField("Assets/Browser/showCoreModule", "Show Core Module in Asset Browser", "bool", ""); 
+   SettingsInspector.addSettingsField("Assets/Browser/showToolsModule", "Show Tools Module in Asset Browser", "bool", ""); 
+   SettingsInspector.addSettingsField("Assets/Browser/showOnlyPopulatedModule", "Show Only Modules with Assets in Asset Browser", "bool", "");
+   SettingsInspector.addSettingsField("Assets/Browser/showFolders", "Show Folders in Tiles view in Asset Browser", "bool", "");
+   SettingsInspector.addSettingsField("Assets/Browser/showEmptyFolders", "Show Empty Folders in Tiles view in Asset Browser", "bool", "");
+   SettingsInspector.addSettingsField("Assets/Browser/previewTileSize", "Asset Preview Tile Size", "bool", "");
+   SettingsInspector.endGroup();
+}
+
 function ESettingsWindow::getGameplaySettings(%this)
 function ESettingsWindow::getGameplaySettings(%this)
 {
 {
    SettingsInspector.startGroup("Game Modes");
    SettingsInspector.startGroup("Game Modes");

BIN
Templates/BaseGame/game/tools/gui/images/folderDown.png


BIN
Templates/BaseGame/game/tools/gui/images/rightArrowWhite.png


+ 5 - 3
Templates/BaseGame/game/tools/gui/profiles.ed.cs

@@ -37,7 +37,7 @@ new GuiControlProfile (ToolsGuiDefaultProfile)
    mouseOverSelected = false;
    mouseOverSelected = false;
 
 
    // fill color
    // fill color
-   opaque = true;
+   opaque = false;
    fillColor = EditorSettings.value("Theme/tabsColor");
    fillColor = EditorSettings.value("Theme/tabsColor");
    fillColorHL = EditorSettings.value("Theme/tabsGLColor");
    fillColorHL = EditorSettings.value("Theme/tabsGLColor");
    fillColorSEL = EditorSettings.value("Theme/tabsSELColor");
    fillColorSEL = EditorSettings.value("Theme/tabsSELColor");
@@ -79,7 +79,7 @@ new GuiControlProfile (ToolsGuiDefaultProfile)
 };
 };
 
 
 if( !isObject( ToolsGuiSolidDefaultProfile ) )
 if( !isObject( ToolsGuiSolidDefaultProfile ) )
-new GuiControlProfile (ToolsGuiSolidDefaultProfile)
+new GuiControlProfile (ToolsGuiSolidDefaultProfile : ToolsGuiDefaultProfile)
 {
 {
    opaque = true;
    opaque = true;
    border = true;
    border = true;
@@ -1109,7 +1109,7 @@ singleton GuiControlProfile( ToolsGuiMenuBarProfile )
    fontColor = EditorSettings.value("Theme/headerTextColor");
    fontColor = EditorSettings.value("Theme/headerTextColor");
    fontColorSEL = EditorSettings.value("Theme/fieldTextSELColor");
    fontColorSEL = EditorSettings.value("Theme/fieldTextSELColor");
    fontColorHL = EditorSettings.value("Theme/fieldTextHLColor");
    fontColorHL = EditorSettings.value("Theme/fieldTextHLColor");
-   fontColorNA = EditorSettings.value("Theme/fieldTextSELColor");
+   fontColorNA = EditorSettings.value("Theme/fieldTextNAColor");
    border = 0;
    border = 0;
    borderThickness = 1;
    borderThickness = 1;
    opaque = true;
    opaque = true;
@@ -1123,6 +1123,8 @@ singleton GuiControlProfile( ToolsMenubarProfile : ToolsGuiDefaultProfile )
    bitmap = "./menubar";
    bitmap = "./menubar";
    category = "Editor";
    category = "Editor";
    
    
+   opaque = true;
+   
    fillColor = EditorSettings.value("Theme/headerColor");
    fillColor = EditorSettings.value("Theme/headerColor");
    fontColor = EditorSettings.value("Theme/headerTextColor");
    fontColor = EditorSettings.value("Theme/headerTextColor");
    fontColorHL = EditorSettings.value("Theme/fieldTextHLColor");
    fontColorHL = EditorSettings.value("Theme/fieldTextHLColor");

+ 174 - 144
Templates/BaseGame/game/tools/settings.xml

@@ -1,219 +1,249 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <EditorSettings>
 <EditorSettings>
-    <Group name="LevelInformation">
-        <Setting name="levelsDirectory">data/FPSGameplay/levels</Setting>
-        <Group name="levels">
-            <Group name="BlankRoom.mis">
-                <Setting name="cameraSpeed">25</Setting>
-            </Group>
-            <Group name="PbrMatTest.mis">
-                <Setting name="cameraSpeed">5</Setting>
-            </Group>
-        </Group>
-    </Group>
     <Group name="MeshRoadEditor">
     <Group name="MeshRoadEditor">
-        <Setting name="DefaultNormal">0 0 1</Setting>
-        <Setting name="DefaultWidth">10</Setting>
         <Setting name="HoverSplineColor">255 0 0 255</Setting>
         <Setting name="HoverSplineColor">255 0 0 255</Setting>
+        <Setting name="SelectedSplineColor">0 255 0 255</Setting>
         <Setting name="sideMaterialName">DefaultRoadMaterialOther</Setting>
         <Setting name="sideMaterialName">DefaultRoadMaterialOther</Setting>
+        <Setting name="DefaultWidth">10</Setting>
         <Setting name="topMaterialName">DefaultRoadMaterialTop</Setting>
         <Setting name="topMaterialName">DefaultRoadMaterialTop</Setting>
-        <Setting name="SelectedSplineColor">0 255 0 255</Setting>
+        <Setting name="DefaultNormal">0 0 1</Setting>
+    </Group>
+    <Group name="TerrainEditor">
+        <Setting name="currentAction">lowerHeight</Setting>
+        <Group name="ActionValues">
+            <Setting name="softSelectRadius">50</Setting>
+            <Setting name="softSelectDefaultFilter">1.000000 0.833333 0.666667 0.500000 0.333333 0.166667 0.000000</Setting>
+            <Setting name="setHeightVal">100</Setting>
+            <Setting name="scaleVal">1</Setting>
+            <Setting name="softSelectFilter">1.000000 0.833333 0.666667 0.500000 0.333333 0.166667 0.000000</Setting>
+            <Setting name="SlopeMaxAngle">90</Setting>
+            <Setting name="SlopeMinAngle">0</Setting>
+            <Setting name="smoothFactor">0.1</Setting>
+            <Setting name="noiseFactor">1</Setting>
+            <Setting name="adjustHeightVal">10</Setting>
+        </Group>
+        <Group name="Brush">
+            <Setting name="brushSize">40 40</Setting>
+            <Setting name="maxBrushSize">40 40</Setting>
+            <Setting name="brushSoftness">1</Setting>
+            <Setting name="brushPressure">1</Setting>
+            <Setting name="brushType">ellipse</Setting>
+        </Group>
     </Group>
     </Group>
     <Group name="Theme">
     <Group name="Theme">
-        <Setting name="fieldTextHLColor">234 232 230 255</Setting>
-        <Setting name="tooltipDividerColor">72 70 68 255</Setting>
-        <Setting name="tooltipTextColor">255 255 255 255</Setting>
-        <Setting name="headerColor">50 49 48 255</Setting>
-        <Setting name="fieldBGSELColor">100 98 96 255</Setting>
-        <Setting name="dividerMidColor">50 49 48 255</Setting>
         <Setting name="dividerDarkColor">17 16 15 255</Setting>
         <Setting name="dividerDarkColor">17 16 15 255</Setting>
-        <Setting name="dividerLightColor">96 94 92 255</Setting>
-        <Setting name="fieldBGHLColor">72 70 68 255</Setting>
+        <Setting name="fieldTextHLColor">234 232 230 255</Setting>
+        <Setting name="fieldTextColor">178 175 172 255</Setting>
         <Setting name="fieldTextSELColor">255 255 255 255</Setting>
         <Setting name="fieldTextSELColor">255 255 255 255</Setting>
+        <Setting name="fieldBGHLColor">72 70 68 255</Setting>
+        <Setting name="dividerMidColor">50 49 48 255</Setting>
         <Setting name="tooltipBGColor">43 43 43 255</Setting>
         <Setting name="tooltipBGColor">43 43 43 255</Setting>
         <Setting name="windowBackgroundColor">32 31 30 255</Setting>
         <Setting name="windowBackgroundColor">32 31 30 255</Setting>
-        <Setting name="tabsHLColor">50 49 48 255</Setting>
-        <Setting name="fieldTextColor">178 175 172 255</Setting>
         <Setting name="fieldBGColor">59 58 57 255</Setting>
         <Setting name="fieldBGColor">59 58 57 255</Setting>
+        <Setting name="fieldBGSELColor">100 98 96 255</Setting>
         <Setting name="tabsColor">37 36 35 255</Setting>
         <Setting name="tabsColor">37 36 35 255</Setting>
-        <Setting name="tabsSELColor">59 58 57 255</Setting>
+        <Setting name="tabsHLColor">50 49 48 255</Setting>
+        <Setting name="headerColor">50 49 48 255</Setting>
+        <Setting name="fieldTextNAColor">77 77 77 255</Setting>
+        <Setting name="tooltipTextColor">255 255 255 255</Setting>
         <Setting name="headerTextColor">236 234 232 255</Setting>
         <Setting name="headerTextColor">236 234 232 255</Setting>
-    </Group>
-    <Group name="AxisGizmo">
-        <Setting name="renderInfoText">1</Setting>
-        <Setting name="mouseRotateScalar">0.8</Setting>
-        <Setting name="renderWhenUsed">0</Setting>
-        <Setting name="snapRotations">0</Setting>
-        <Setting name="axisGizmoMaxScreenLen">100</Setting>
-        <Setting name="mouseScaleScalar">0.8</Setting>
-        <Setting name="rotationSnap">15</Setting>
-        <Group name="Grid">
-            <Setting name="snapToGrid">0</Setting>
-            <Setting name="planeDim">500</Setting>
-            <Setting name="renderPlane">0</Setting>
-            <Setting name="gridSize">10 10 10</Setting>
-            <Setting name="gridColor">255 255 255 20</Setting>
-            <Setting name="renderPlaneHashes">0</Setting>
-        </Group>
+        <Setting name="tooltipDividerColor">72 70 68 255</Setting>
+        <Setting name="tabsSELColor">59 58 57 255</Setting>
+        <Setting name="dividerLightColor">96 94 92 255</Setting>
     </Group>
     </Group>
     <Group name="GuiEditor">
     <Group name="GuiEditor">
-        <Setting name="lastPath">tools/gui</Setting>
+        <Setting name="lastPath">tools/worldEditor/gui</Setting>
         <Setting name="previewResolution">1024 768</Setting>
         <Setting name="previewResolution">1024 768</Setting>
-        <Group name="EngineDevelopment">
-            <Setting name="showEditorProfiles">0</Setting>
-            <Setting name="toggleIntoEditor">0</Setting>
-            <Setting name="showEditorGuis">0</Setting>
-        </Group>
         <Group name="Library">
         <Group name="Library">
             <Setting name="viewType">Categorized</Setting>
             <Setting name="viewType">Categorized</Setting>
         </Group>
         </Group>
         <Group name="Snapping">
         <Group name="Snapping">
-            <Setting name="snapToCenters">1</Setting>
-            <Setting name="snapToControls">1</Setting>
-            <Setting name="snap2GridSize">8</Setting>
-            <Setting name="snap2Grid">0</Setting>
             <Setting name="snapToCanvas">1</Setting>
             <Setting name="snapToCanvas">1</Setting>
-            <Setting name="snapToGuides">1</Setting>
+            <Setting name="snapToCenters">1</Setting>
             <Setting name="sensitivity">2</Setting>
             <Setting name="sensitivity">2</Setting>
+            <Setting name="snap2Grid">0</Setting>
+            <Setting name="snap2GridSize">8</Setting>
+            <Setting name="snapToControls">1</Setting>
             <Setting name="snapToEdges">1</Setting>
             <Setting name="snapToEdges">1</Setting>
+            <Setting name="snapToGuides">1</Setting>
+        </Group>
+        <Group name="Rendering">
+            <Setting name="drawGuides">1</Setting>
+            <Setting name="drawBorderLines">1</Setting>
         </Group>
         </Group>
         <Group name="Help">
         <Group name="Help">
+            <Setting name="documentationURL">http://www.garagegames.com/products/torque-3d/documentation/user</Setting>
             <Setting name="documentationReference">../../../Documentation/Torque 3D - Script Manual.chm</Setting>
             <Setting name="documentationReference">../../../Documentation/Torque 3D - Script Manual.chm</Setting>
             <Setting name="documentationLocal">../../../Documentation/Official Documentation.html</Setting>
             <Setting name="documentationLocal">../../../Documentation/Official Documentation.html</Setting>
-            <Setting name="documentationURL">http://www.garagegames.com/products/torque-3d/documentation/user</Setting>
-        </Group>
-        <Group name="Rendering">
-            <Setting name="drawBorderLines">1</Setting>
-            <Setting name="drawGuides">1</Setting>
         </Group>
         </Group>
         <Group name="Selection">
         <Group name="Selection">
             <Setting name="fullBox">0</Setting>
             <Setting name="fullBox">0</Setting>
         </Group>
         </Group>
+        <Group name="EngineDevelopment">
+            <Setting name="showEditorProfiles">0</Setting>
+            <Setting name="toggleIntoEditor">0</Setting>
+            <Setting name="showEditorGuis">0</Setting>
+        </Group>
+    </Group>
+    <Group name="ShapeEditor">
+        <Setting name="SunAngleZ">135</Setting>
+        <Setting name="gridDimension">40 40</Setting>
+        <Setting name="gridSize">0.1</Setting>
+        <Setting name="showObjBox">1</Setting>
+        <Setting name="AdvancedWndVisible">1</Setting>
+        <Setting name="showNodes">1</Setting>
+        <Setting name="ShowGrid">1</Setting>
+        <Setting name="SunDiffuseColor">255 255 255 255</Setting>
+        <Setting name="SunAngleX">45</Setting>
+        <Setting name="highlightMaterial">1</Setting>
+        <Setting name="backgroundColor">0 0 0 100</Setting>
+        <Setting name="renderMounts">1</Setting>
+        <Setting name="RenderCollision">0</Setting>
+        <Setting name="showBounds">0</Setting>
+        <Setting name="SunAmbientColor">180 180 180 255</Setting>
     </Group>
     </Group>
     <Group name="WorldEditor">
     <Group name="WorldEditor">
+        <Setting name="forceLoadDAE">0</Setting>
+        <Setting name="torsionPath">AssetWork_Debug.exe</Setting>
         <Setting name="orthoFOV">50</Setting>
         <Setting name="orthoFOV">50</Setting>
+        <Setting name="undoLimit">40</Setting>
+        <Setting name="EditorLayoutMode">Modern</Setting>
+        <Setting name="dropType">screenCenter</Setting>
         <Setting name="orthoShowGrid">1</Setting>
         <Setting name="orthoShowGrid">1</Setting>
-        <Setting name="torsionPath">AssetWork_Debug.exe</Setting>
-        <Setting name="forceLoadDAE">0</Setting>
         <Setting name="displayType">6</Setting>
         <Setting name="displayType">6</Setting>
-        <Setting name="currentEditor">WorldEditorInspectorPlugin</Setting>
-        <Setting name="dropType">screenCenter</Setting>
-        <Setting name="undoLimit">40</Setting>
-        <Group name="Render">
-            <Setting name="showMousePopupInfo">1</Setting>
-            <Setting name="renderObjText">1</Setting>
-            <Setting name="renderSelectionBox">1</Setting>
-            <Setting name="renderObjHandle">1</Setting>
-            <Setting name="renderPopupBackground">1</Setting>
+        <Setting name="currentEditor">TerrainPainterPlugin</Setting>
+        <Group name="Images">
+            <Setting name="selectHandle">tools/worldEditor/images/SelectHandle</Setting>
+            <Setting name="lockedHandle">tools/worldEditor/images/LockedHandle</Setting>
+            <Setting name="defaultHandle">tools/worldEditor/images/DefaultHandle</Setting>
         </Group>
         </Group>
-        <Group name="Color">
-            <Setting name="popupBackgroundColor">100 100 100 255</Setting>
-            <Setting name="objectTextColor">255 255 255 255</Setting>
-            <Setting name="dragRectColor">255 255 0 255</Setting>
-            <Setting name="objMouseOverColor">0 255 0 255</Setting>
-            <Setting name="selectionBoxColor">255 255 0 255</Setting>
-            <Setting name="objSelectColor">255 0 0 255</Setting>
-            <Setting name="objMouseOverSelectColor">0 0 255 255</Setting>
+        <Group name="Docs">
+            <Setting name="documentationURL">http://www.garagegames.com/products/torque-3d/documentation/user</Setting>
+            <Setting name="forumURL">http://www.garagegames.com/products/torque-3d/forums</Setting>
+            <Setting name="documentationLocal">../../../Documentation/Official Documentation.html</Setting>
+            <Setting name="documentationReference">../../../Documentation/Torque 3D - Script Manual.chm</Setting>
+        </Group>
+        <Group name="Theme">
+            <Setting name="windowTitleFontColor">215 215 215 255</Setting>
+            <Setting name="windowTitleFontHLColor">255 255 255 255</Setting>
+            <Setting name="windowTitleBGColor">50 50 50 255</Setting>
+            <Setting name="windowTitleBGHLColor">48 48 48 255</Setting>
+            <Setting name="windowTitleBGNAColor">180 180 180 255</Setting>
         </Group>
         </Group>
         <Group name="Grid">
         <Group name="Grid">
-            <Setting name="gridMinorColor">51 51 51 100</Setting>
             <Setting name="gridColor">102 102 102 100</Setting>
             <Setting name="gridColor">102 102 102 100</Setting>
-            <Setting name="gridSize">1</Setting>
             <Setting name="gridOriginColor">255 255 255 100</Setting>
             <Setting name="gridOriginColor">255 255 255 100</Setting>
-            <Setting name="gridSnap">0</Setting>
+            <Setting name="gridMinorColor">51 51 51 100</Setting>
+            <Setting name="gridSize">1</Setting>
+            <Setting name="gridSnap">1</Setting>
         </Group>
         </Group>
         <Group name="ObjectIcons">
         <Group name="ObjectIcons">
-            <Setting name="fadeIconsEndDist">20</Setting>
-            <Setting name="fadeIconsStartDist">8</Setting>
             <Setting name="fadeIcons">1</Setting>
             <Setting name="fadeIcons">1</Setting>
+            <Setting name="fadeIconsStartDist">8</Setting>
+            <Setting name="fadeIconsEndDist">20</Setting>
             <Setting name="fadeIconsEndAlpha">0</Setting>
             <Setting name="fadeIconsEndAlpha">0</Setting>
             <Setting name="fadeIconsStartAlpha">255</Setting>
             <Setting name="fadeIconsStartAlpha">255</Setting>
         </Group>
         </Group>
-        <Group name="Docs">
-            <Setting name="documentationReference">../../../Documentation/Torque 3D - Script Manual.chm</Setting>
-            <Setting name="documentationLocal">../../../Documentation/Official Documentation.html</Setting>
-            <Setting name="forumURL">http://www.garagegames.com/products/torque-3d/forums</Setting>
-            <Setting name="documentationURL">http://www.garagegames.com/products/torque-3d/documentation/user</Setting>
-        </Group>
         <Group name="Tools">
         <Group name="Tools">
-            <Setting name="boundingBoxCollision">0</Setting>
             <Setting name="dropAtScreenCenterScalar">1</Setting>
             <Setting name="dropAtScreenCenterScalar">1</Setting>
+            <Setting name="TerrainSnapOffsetZ">0</Setting>
+            <Setting name="OffsetZValue">0.01</Setting>
             <Setting name="objectsUseBoxCenter">1</Setting>
             <Setting name="objectsUseBoxCenter">1</Setting>
+            <Setting name="boundingBoxCollision">0</Setting>
             <Setting name="dropAtScreenCenterMax">100</Setting>
             <Setting name="dropAtScreenCenterMax">100</Setting>
-            <Setting name="snapSoftSize">2</Setting>
-            <Setting name="snapSoft">0</Setting>
             <Setting name="snapGround">0</Setting>
             <Setting name="snapGround">0</Setting>
+            <Setting name="snapSoft">0</Setting>
+            <Setting name="snapSoftSize">2</Setting>
         </Group>
         </Group>
-        <Group name="Theme">
-            <Setting name="windowTitleFontHLColor">255 255 255 255</Setting>
-            <Setting name="windowTitleBGColor">50 50 50 255</Setting>
-            <Setting name="windowTitleBGHLColor">48 48 48 255</Setting>
-            <Setting name="windowTitleFontColor">215 215 215 255</Setting>
-            <Setting name="windowTitleBGNAColor">180 180 180 255</Setting>
+        <Group name="Render">
+            <Setting name="renderObjText">1</Setting>
+            <Setting name="renderPopupBackground">1</Setting>
+            <Setting name="showMousePopupInfo">1</Setting>
+            <Setting name="renderSelectionBox">1</Setting>
+            <Setting name="renderObjHandle">1</Setting>
         </Group>
         </Group>
-        <Group name="Images">
-            <Setting name="lockedHandle">tools/worldEditor/images/LockedHandle</Setting>
-            <Setting name="selectHandle">tools/worldEditor/images/SelectHandle</Setting>
-            <Setting name="defaultHandle">tools/worldEditor/images/DefaultHandle</Setting>
+        <Group name="Color">
+            <Setting name="objMouseOverSelectColor">0 0 255 255</Setting>
+            <Setting name="objSelectColor">255 0 0 255</Setting>
+            <Setting name="objMouseOverColor">0 255 0 255</Setting>
+            <Setting name="dragRectColor">255 255 0 255</Setting>
+            <Setting name="objectTextColor">255 255 255 255</Setting>
+            <Setting name="selectionBoxColor">255 255 0 255</Setting>
+            <Setting name="popupBackgroundColor">100 100 100 255</Setting>
+        </Group>
+        <Group name="Layout">
+            <Setting name="LayoutMode">Classic</Setting>
         </Group>
         </Group>
     </Group>
     </Group>
-    <Group name="ShapeEditor">
-        <Setting name="SunAmbientColor">180 180 180 255</Setting>
-        <Setting name="RenderCollision">0</Setting>
-        <Setting name="showBounds">0</Setting>
-        <Setting name="renderMounts">1</Setting>
-        <Setting name="gridSize">0.1</Setting>
-        <Setting name="SunAngleZ">135</Setting>
-        <Setting name="showNodes">1</Setting>
-        <Setting name="highlightMaterial">1</Setting>
-        <Setting name="showObjBox">1</Setting>
-        <Setting name="SunDiffuseColor">255 255 255 255</Setting>
-        <Setting name="backgroundColor">0 0 0 100</Setting>
-        <Setting name="AdvancedWndVisible">1</Setting>
-        <Setting name="SunAngleX">45</Setting>
-        <Setting name="ShowGrid">1</Setting>
-        <Setting name="gridDimension">40 40</Setting>
+    <Group name="AssetCreation">
+        <Setting name="CubemapAssetSubdirectoryFormat">&lt;AssetType&gt;/</Setting>
+        <Setting name="LevelAssetSubdirectoryFormat">&lt;AssetType&gt;/&lt;AssetName&gt;/</Setting>
+        <Setting name="AssetImporDefaultConfig">TestConfig</Setting>
+        <Setting name="PostFXAssetSubdirectoryFormat">&lt;AssetType&gt;/</Setting>
+        <Setting name="CppAssetSubdirectoryFormat">&lt;AssetType&gt;/&lt;SpecialAssetTag&gt;/</Setting>
+        <Setting name="StatemachineAssetSubdirectoryFormat">&lt;AssetType&gt;/</Setting>
+        <Setting name="TerrainMatAssetSubdirectoryFormat">&lt;AssetType&gt;/</Setting>
+        <Setting name="ScriptAssetSubdirectoryFormat">&lt;AssetType&gt;/&lt;SpecialAssetTag&gt;/</Setting>
+        <Setting name="AutoImport">1</Setting>
+        <Setting name="TerrainAssetSubdirectoryFormat">&lt;AssetType&gt;/</Setting>
+        <Setting name="GUIAssetSubdirectoryFormat">&lt;AssetType&gt;/OtherFolder/</Setting>
     </Group>
     </Group>
-    <Group name="TerrainEditor">
-        <Setting name="currentAction">lowerHeight</Setting>
-        <Group name="Brush">
-            <Setting name="brushPressure">1</Setting>
-            <Setting name="brushSize">40 40</Setting>
-            <Setting name="maxBrushSize">40 40</Setting>
-            <Setting name="brushSoftness">1</Setting>
-            <Setting name="brushType">ellipse</Setting>
+    <Group name="LevelInformation">
+        <Setting name="levelsDirectory">data/FPSGameplay/levels</Setting>
+        <Group name="levels">
+            <Group name="BlankRoom.mis">
+                <Setting name="cameraSpeed">25</Setting>
+            </Group>
+            <Group name="PbrMatTest.mis">
+                <Setting name="cameraSpeed">5</Setting>
+            </Group>
         </Group>
         </Group>
-        <Group name="ActionValues">
-            <Setting name="setHeightVal">100</Setting>
-            <Setting name="scaleVal">1</Setting>
-            <Setting name="SlopeMinAngle">0</Setting>
-            <Setting name="adjustHeightVal">10</Setting>
-            <Setting name="softSelectRadius">50</Setting>
-            <Setting name="SlopeMaxAngle">90</Setting>
-            <Setting name="softSelectDefaultFilter">1.000000 0.833333 0.666667 0.500000 0.333333 0.166667 0.000000</Setting>
-            <Setting name="softSelectFilter">1.000000 0.833333 0.666667 0.500000 0.333333 0.166667 0.000000</Setting>
-            <Setting name="noiseFactor">1</Setting>
-            <Setting name="smoothFactor">0.1</Setting>
+    </Group>
+    <Group name="Assets">
+        <Setting name="AssetImporDefaultConfig">TestConfig</Setting>
+        <Setting name="AutoImport">0</Setting>
+        <Group name="Browser">
+            <Setting name="previewTileSize">small</Setting>
         </Group>
         </Group>
     </Group>
     </Group>
+    <Group name="NavEditor">
+        <Setting name="backgroundBuild">1</Setting>
+        <Setting name="spawnDatablock">DefaultPlayerData</Setting>
+        <Setting name="SpawnClass">AIPlayer</Setting>
+    </Group>
     <Group name="RiverEditor">
     <Group name="RiverEditor">
         <Setting name="DefaultNormal">0 0 1</Setting>
         <Setting name="DefaultNormal">0 0 1</Setting>
-        <Setting name="HoverNodeColor">255 255 255 255</Setting>
         <Setting name="HoverSplineColor">255 0 0 255</Setting>
         <Setting name="HoverSplineColor">255 0 0 255</Setting>
-        <Setting name="SelectedSplineColor">0 255 0 255</Setting>
         <Setting name="DefaultWidth">10</Setting>
         <Setting name="DefaultWidth">10</Setting>
         <Setting name="DefaultDepth">5</Setting>
         <Setting name="DefaultDepth">5</Setting>
+        <Setting name="HoverNodeColor">255 255 255 255</Setting>
+        <Setting name="SelectedSplineColor">0 255 0 255</Setting>
     </Group>
     </Group>
-    <Group name="NavEditor">
-        <Setting name="backgroundBuild">1</Setting>
-        <Setting name="SpawnClass">AIPlayer</Setting>
-        <Setting name="spawnDatablock">DefaultPlayerData</Setting>
+    <Group name="AxisGizmo">
+        <Setting name="rotationSnap">15</Setting>
+        <Setting name="mouseRotateScalar">0.8</Setting>
+        <Setting name="snapRotations">0</Setting>
+        <Setting name="mouseScaleScalar">0.8</Setting>
+        <Setting name="renderInfoText">1</Setting>
+        <Setting name="renderWhenUsed">0</Setting>
+        <Setting name="axisGizmoMaxScreenLen">100</Setting>
+        <Group name="Grid">
+            <Setting name="gridSize">1 1 1</Setting>
+            <Setting name="planeDim">500</Setting>
+            <Setting name="gridColor">255 255 255 20</Setting>
+            <Setting name="renderPlane">0</Setting>
+            <Setting name="snapToGrid">1</Setting>
+            <Setting name="renderPlaneHashes">0</Setting>
+        </Group>
+    </Group>
+    <Group name="AssetBrowser">
+        <Setting name="previewSize">Small</Setting>
     </Group>
     </Group>
     <Group name="RoadEditor">
     <Group name="RoadEditor">
-        <Setting name="HoverNodeColor">255 255 255 255</Setting>
-        <Setting name="DefaultWidth">10</Setting>
         <Setting name="materialName">DefaultDecalRoadMaterial</Setting>
         <Setting name="materialName">DefaultDecalRoadMaterial</Setting>
+        <Setting name="DefaultWidth">10</Setting>
         <Setting name="SelectedSplineColor">0 255 0 255</Setting>
         <Setting name="SelectedSplineColor">0 255 0 255</Setting>
+        <Setting name="HoverNodeColor">255 255 255 255</Setting>
     </Group>
     </Group>
     <Group name="ConvexEditor">
     <Group name="ConvexEditor">
         <Setting name="materialName">Grid_512_Orange</Setting>
         <Setting name="materialName">Grid_512_Orange</Setting>

+ 16 - 2
Templates/BaseGame/game/tools/worldEditor/gui/guiCreateNewTerrainGui.gui

@@ -299,6 +299,20 @@
 function CreateNewTerrainGui::onWake( %this )
 function CreateNewTerrainGui::onWake( %this )
 {   
 {   
    %this-->theName.setText( "" );
    %this-->theName.setText( "" );
+   
+   //Run through and grab any TerrainMaterialAssets
+   %assetQuery = new AssetQuery();
+   AssetDatabase.findAssetType(%assetQuery, "TerrainMaterialAsset");
+        
+   %count = %assetQuery.getCount();
+      
+	for(%i=0; %i < %count; %i++)
+	{
+	   %assetId = %assetQuery.getAsset(%i);
+	   
+      AssetDatabase.acquireAsset(%assetId);
+	}	
+	%assetQuery.delete();		   
 
 
    %matList = %this-->theMaterialList;
    %matList = %this-->theMaterialList;
    %matList.clear();
    %matList.clear();
@@ -313,8 +327,8 @@ function CreateNewTerrainGui::onWake( %this )
    %rezList.add( "512", 512 );
    %rezList.add( "512", 512 );
    %rezList.add( "1024", 1024 );
    %rezList.add( "1024", 1024 );
    %rezList.add( "2048", 2048 );
    %rezList.add( "2048", 2048 );
-   //%rezList.add( "4096", 4096 );
-   %rezList.setSelected( 256 );
+   %rezList.add( "4096", 4096 );
+   %rezList.setSelected( 512 );
    
    
    %this-->flatRadio.setStateOn( true );
    %this-->flatRadio.setStateOn( true );
 }
 }

File diff suppressed because it is too large
+ 1095 - 499
Templates/BaseGame/game/tools/worldEditor/gui/guiTerrainMaterialDlg.ed.gui


+ 75 - 0
Templates/BaseGame/game/tools/worldEditor/gui/objectBuilderGui.ed.gui

@@ -227,6 +227,77 @@ function ObjectBuilderGui::gotFileName(%this, %name)
    //%this.controls[%this.currentControl].setValue(%name);
    //%this.controls[%this.currentControl].setValue(%name);
 }
 }
 
 
+//------------------------------------------------------------------------------
+function ObjectBuilderGui::createTerrainAssetType(%this, %index)
+{
+   if(%index >= %this.numFields || %this.field[%index, name] $= "")
+   {
+      error("ObjectBuilderGui::createTerrainAssetType: invalid field");
+      return;
+   }
+
+   //
+   if(%this.field[%index, text] $= "")
+      %name = %this.field[%index, name];
+   else
+      %name = %this.field[%index, text];
+
+   // 
+   %this.textControls[%this.numControls] = new GuiTextCtrl() {
+      profile = "ToolsGuiTextRightProfile";
+      text = %name;
+      extent = %this.fieldNameExtent;
+      position = %this.curXPos @ " " @ %this.curYPos;
+      modal = "1";
+   };
+
+   // 
+   %this.controls[%this.numControls] = new GuiButtonCtrl() {
+      HorizSizing = "width";
+      profile = "ToolsGuiButtonProfile";
+      extent = %this.fileButtonExtent;
+      position = %this.curXPos + %this.columnOffset @ " " @ %this.curYPos;
+      modal = "1";
+      command = %this @ ".getTerrainAsset(" @ %index @ ");";
+   };
+
+   %val = %this.field[%index, value];
+   %this.controls[%this.numControls].setValue(fileBase(%val) @ fileExt(%val));
+
+   %this.numControls++;
+   %this.curYPos += %this.defaultFieldStep;
+}
+
+function ObjectBuilderGui::getTerrainAsset(%this, %index)
+{
+   if(%index >= %this.numFields || %this.field[%index, name] $= "")
+   {
+      error("ObjectBuilderGui::getTerrainAsset: invalid field");
+      return;
+   }
+   
+   %val = %this.field[%index, ext];
+
+   //%path = filePath(%val);
+   //%ext = fileExt(%val);
+
+   %this.currentControl = %index;
+   AssetBrowser.showDialog("TerrainAsset", %this @ ".gotTerrainAsset", "", "", "");
+   //getLoadFilename( %val @ "|" @ %val, %this @ ".gotFileName", %this.lastPath );
+}
+
+function ObjectBuilderGui::gotTerrainAsset(%this, %name)
+{
+   %index = %this.currentControl;
+   
+   %this.field[%index, value] = %name;
+   %this.controls[%this.currentControl].setText(fileBase(%name) @ fileExt(%name));
+   
+   %this.lastPath = %name;
+   
+   // This doesn't work for button controls as getValue returns their state!
+   //%this.controls[%this.currentControl].setValue(%name);
+}
 //------------------------------------------------------------------------------
 //------------------------------------------------------------------------------
 
 
 function ObjectBuilderGui::createMaterialNameType(%this, %index)
 function ObjectBuilderGui::createMaterialNameType(%this, %index)
@@ -489,6 +560,9 @@ function ObjectBuilderGui::process(%this)
 
 
          case "TypeFile":
          case "TypeFile":
             %this.createFileType(%i);
             %this.createFileType(%i);
+            
+         case "TypeTerrainAsset":
+            %this.createTerrainAssetType(%i);
 
 
          case "TypeMaterialName":
          case "TypeMaterialName":
             %this.createMaterialNameType(%i);
             %this.createMaterialNameType(%i);
@@ -830,6 +904,7 @@ function ObjectBuilderGui::buildTerrainBlock(%this)
    %this.createCallback = "ETerrainEditor.attachTerrain();";
    %this.createCallback = "ETerrainEditor.attachTerrain();";
 
 
    %this.addField("terrainFile", "TypeFile", "Terrain file", "", "*.ter");
    %this.addField("terrainFile", "TypeFile", "Terrain file", "", "*.ter");
+   %this.addField("terrainAsset", "TypeTerrainAsset", "Terrain Asset", "", "");
    %this.addField("squareSize", "TypeInt", "Square size", "8");
    %this.addField("squareSize", "TypeInt", "Square size", "8");
 
 
    %this.process();
    %this.process();

+ 3 - 0
Templates/BaseGame/game/tools/worldEditor/scripts/EditorGui.ed.cs

@@ -1885,6 +1885,9 @@ function Editor::open(%this)
    Canvas.setContent(EditorGui);   
    Canvas.setContent(EditorGui);   
    $isFirstPersonVar = true;
    $isFirstPersonVar = true;
    EditorGui.syncCameraGui();
    EditorGui.syncCameraGui();
+   
+   if(EditorSettings.value("WorldEditor/Layout/LayoutMode", "Classic") $= "Modern")
+      togglePanelLayout();
 }
 }
 
 
 function Editor::close(%this, %gui)
 function Editor::close(%this, %gui)

+ 1 - 1
Templates/BaseGame/game/tools/worldEditor/scripts/editor.ed.cs

@@ -164,7 +164,7 @@ function toggleEditor(%make)
 
 
 //------------------------------------------------------------------------------
 //------------------------------------------------------------------------------
 //  The editor action maps are defined in editor.bind.cs
 //  The editor action maps are defined in editor.bind.cs
-GlobalActionMap.bind(keyboard, "f11", toggleEditor);
+GlobalActionMap.bind(keyboard, "f11", fastLoadWorldEdit);
 
 
 
 
 // The scenario:
 // The scenario:

+ 6 - 0
Templates/BaseGame/game/tools/worldEditor/scripts/editorPrefs.ed.cs

@@ -60,6 +60,8 @@ EditorSettings.endGroup();
 
 
 EditorSettings.beginGroup( "Tools" );
 EditorSettings.beginGroup( "Tools" );
 EditorSettings.setDefaultValue(  "snapGround",              "0"               );
 EditorSettings.setDefaultValue(  "snapGround",              "0"               );
+EditorSettings.setDefaultValue(  "TerrainSnapOffsetZ",      "0"               );
+EditorSettings.setDefaultValue(  "OffsetZValue",            "0.01"             );
 EditorSettings.setDefaultValue(  "snapSoft",                "0"               );
 EditorSettings.setDefaultValue(  "snapSoft",                "0"               );
 EditorSettings.setDefaultValue(  "snapSoftSize",            "2.0"             );
 EditorSettings.setDefaultValue(  "snapSoftSize",            "2.0"             );
 EditorSettings.setDefaultValue(  "boundingBoxCollision",    "0"               );
 EditorSettings.setDefaultValue(  "boundingBoxCollision",    "0"               );
@@ -215,6 +217,8 @@ function EditorGui::readWorldEditorSettings(%this)
    
    
    EditorSettings.beginGroup( "Tools" );
    EditorSettings.beginGroup( "Tools" );
    EWorldEditor.stickToGround             = EditorSettings.value("snapGround");                 //$pref::WorldEditor::snapGround;
    EWorldEditor.stickToGround             = EditorSettings.value("snapGround");                 //$pref::WorldEditor::snapGround;
+   EWorldEditor.TerrainSnapOffsetZ        = EditorSettings.value("TerrainSnapOffsetZ");         //$pref::WorldEditor::TerrainSnapOffsetZ;
+   EWorldEditor.OffsetZValue              = EditorSettings.value("OffsetZValue");               //$pref::WorldEditor::OffsetZValue;
    EWorldEditor.setSoftSnap( EditorSettings.value("snapSoft") );                                //$pref::WorldEditor::snapSoft
    EWorldEditor.setSoftSnap( EditorSettings.value("snapSoft") );                                //$pref::WorldEditor::snapSoft
    EWorldEditor.setSoftSnapSize( EditorSettings.value("snapSoftSize") );                        //$pref::WorldEditor::snapSoftSize
    EWorldEditor.setSoftSnapSize( EditorSettings.value("snapSoftSize") );                        //$pref::WorldEditor::snapSoftSize
    EWorldEditor.boundingBoxCollision      = EditorSettings.value("boundingBoxCollision");       //$pref::WorldEditor::boundingBoxCollision;
    EWorldEditor.boundingBoxCollision      = EditorSettings.value("boundingBoxCollision");       //$pref::WorldEditor::boundingBoxCollision;
@@ -310,6 +314,8 @@ function EditorGui::writeWorldEditorSettings(%this)
 
 
    EditorSettings.beginGroup( "Tools" );
    EditorSettings.beginGroup( "Tools" );
    EditorSettings.setValue( "snapGround",             EWorldEditor.stickToGround );          //$Pref::WorldEditor::snapGround
    EditorSettings.setValue( "snapGround",             EWorldEditor.stickToGround );          //$Pref::WorldEditor::snapGround
+   EditorSettings.setValue( "TerrainSnapOffsetZ",      EWorldEditor.TerrainSnapOffsetZ );     //$pref::WorldEditor::TerrainSnapOffsetZ;
+   EditorSettings.setValue( "OffsetZValue",            EWorldEditor.OffsetZValue );           //$pref::WorldEditor::OffsetZValue;
    EditorSettings.setValue( "snapSoft",               EWorldEditor.getSoftSnap() );          //$Pref::WorldEditor::snapSoft
    EditorSettings.setValue( "snapSoft",               EWorldEditor.getSoftSnap() );          //$Pref::WorldEditor::snapSoft
    EditorSettings.setValue( "snapSoftSize",           EWorldEditor.getSoftSnapSize() );      //$Pref::WorldEditor::snapSoftSize
    EditorSettings.setValue( "snapSoftSize",           EWorldEditor.getSoftSnapSize() );      //$Pref::WorldEditor::snapSoftSize
    EditorSettings.setValue( "boundingBoxCollision",   EWorldEditor.boundingBoxCollision );   //$Pref::WorldEditor::boundingBoxCollision
    EditorSettings.setValue( "boundingBoxCollision",   EWorldEditor.boundingBoxCollision );   //$Pref::WorldEditor::boundingBoxCollision

+ 61 - 8
Templates/BaseGame/game/tools/worldEditor/scripts/interfaces/terrainMaterialDlg.ed.cs

@@ -83,6 +83,20 @@ function TerrainMaterialDlg::onWake( %this )
    if( !isObject( TerrainMaterialDlgDeleteGroup ) )
    if( !isObject( TerrainMaterialDlgDeleteGroup ) )
       new SimGroup( TerrainMaterialDlgDeleteGroup );
       new SimGroup( TerrainMaterialDlgDeleteGroup );
       
       
+   //Run through and grab any TerrainMaterialAssets
+   %assetQuery = new AssetQuery();
+   AssetDatabase.findAssetType(%assetQuery, "TerrainMaterialAsset");
+        
+   %count = %assetQuery.getCount();
+      
+	for(%i=0; %i < %count; %i++)
+	{
+	   %assetId = %assetQuery.getAsset(%i);
+	   
+      AssetDatabase.acquireAsset(%assetId);
+	}	
+	%assetQuery.delete();	   
+      
    // Snapshot the materials.
    // Snapshot the materials.
    %this.snapshotMaterials();
    %this.snapshotMaterials();
 
 
@@ -292,12 +306,33 @@ function TerrainMaterialDlg::changeNormal( %this )
    %ctrl.setBitmap( %file );   
    %ctrl.setBitmap( %file );   
 }
 }
 
 
+//-----------------------------------------------------------------------------
+function TerrainMaterialDlg::changePBRConfig( %this )
+{   
+   %ctrl = %this-->pbrConfigTexCtrl;
+   %file = %ctrl.bitmap;
+   if( getSubStr( %file, 0 , 6 ) $= "tools/" )
+      %file = "";
+
+   %file = TerrainMaterialDlg._selectTextureFileDialog( %file );  
+   if( %file $= "" )
+   {
+      if( %ctrl.bitmap !$= "" )
+         %file = %ctrl.bitmap;
+      else
+         %file = "tools/materialEditor/gui/unknownImage";
+   }
+
+   %file = makeRelativePath( %file, getMainDotCsDir() );
+   %ctrl.setBitmap( %file );   
+}
+
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 
 
 function TerrainMaterialDlg::newMat( %this )
 function TerrainMaterialDlg::newMat( %this )
 {
 {
    // Create a unique material name.
    // Create a unique material name.
-   %matName = getUniqueInternalName( "newMaterial", TerrainMaterialSet, true );
+   /*%matName = getUniqueInternalName( "newMaterial", TerrainMaterialSet, true );
 
 
    // Create the new material.
    // Create the new material.
    %newMat = new TerrainMaterial()
    %newMat = new TerrainMaterial()
@@ -308,12 +343,16 @@ function TerrainMaterialDlg::newMat( %this )
    %newMat.setFileName( "art/terrains/materials.cs" );
    %newMat.setFileName( "art/terrains/materials.cs" );
    
    
    // Mark it as dirty and to be saved in the default location.
    // Mark it as dirty and to be saved in the default location.
-   ETerrainMaterialPersistMan.setDirty( %newMat, "art/terrains/materials.cs" );
-            
-   %matLibTree = %this-->matLibTree;
-   %matLibTree.buildVisibleTree( true );
-   %item = %matLibTree.findItemByObjectId( %newMat );
-   %matLibTree.selectItem( %item );   
+   ETerrainMaterialPersistMan.setDirty( %newMat, "art/terrains/materials.cs" );*/
+
+   %scene = getRootScene();
+   %path = filePath(%scene.getFilename());
+   %module = AssetBrowser.getModuleFromAddress(%path);
+   AssetBrowser.selectedModule = %module.moduleID;
+   
+   AssetBrowser.currentAddress = "data/" @ %module.moduleID;
+   
+   AssetBrowser.setupCreateNewAsset("TerrainMaterialAsset", AssetBrowser.selectedModule);
 }
 }
 
 
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
@@ -380,6 +419,11 @@ function TerrainMaterialDlg::setActiveMaterial( %this, %mat )
       }else{
       }else{
          %this-->baseTexCtrl.setBitmap( %mat.diffuseMap ); 
          %this-->baseTexCtrl.setBitmap( %mat.diffuseMap ); 
       }
       }
+      if (%mat.pbrConfigMap $= ""){
+         %this-->pbrConfigTexCtrl.setBitmap( "tools/materialEditor/gui/unknownImage" );
+      }else{
+         %this-->pbrConfigTexCtrl.setBitmap( %mat.pbrConfigMap );
+      }
       if (%mat.detailMap $= ""){
       if (%mat.detailMap $= ""){
          %this-->detailTexCtrl.setBitmap( "tools/materialEditor/gui/unknownImage" );
          %this-->detailTexCtrl.setBitmap( "tools/materialEditor/gui/unknownImage" );
       }else{
       }else{
@@ -438,6 +482,11 @@ function TerrainMaterialDlg::saveDirtyMaterial( %this, %mat )
    }else{
    }else{
       %newNormal = %this-->normTexCtrl.bitmap;  
       %newNormal = %this-->normTexCtrl.bitmap;  
    }
    }
+   if (%this-->pbrConfigTexCtrl.bitmap $= "tools/materialEditor/gui/unknownImage"){
+      %newPBRConfig = "";
+   }else{
+      %newPBRConfig = %this-->pbrConfigTexCtrl.bitmap;  
+   }
    if (%this-->detailTexCtrl.bitmap $= "tools/materialEditor/gui/unknownImage"){
    if (%this-->detailTexCtrl.bitmap $= "tools/materialEditor/gui/unknownImage"){
       %newDetail = "";
       %newDetail = "";
    }else{
    }else{
@@ -466,6 +515,7 @@ function TerrainMaterialDlg::saveDirtyMaterial( %this, %mat )
          %mat.diffuseMap $= %newDiffuse &&
          %mat.diffuseMap $= %newDiffuse &&
          %mat.normalMap $= %newNormal &&
          %mat.normalMap $= %newNormal &&
          %mat.detailMap $= %newDetail &&
          %mat.detailMap $= %newDetail &&
+         %mat.pbrConfigMap $= %newPBRConfig &&
          %mat.macroMap $= %newMacro &&
          %mat.macroMap $= %newMacro &&
          %mat.detailSize == %detailSize &&
          %mat.detailSize == %detailSize &&
          %mat.diffuseSize == %diffuseSize &&
          %mat.diffuseSize == %diffuseSize &&
@@ -497,7 +547,8 @@ function TerrainMaterialDlg::saveDirtyMaterial( %this, %mat )
    }
    }
    
    
    %mat.diffuseMap = %newDiffuse;    
    %mat.diffuseMap = %newDiffuse;    
-   %mat.normalMap = %newNormal;    
+   %mat.normalMap = %newNormal;   
+   %mat.pbrConfigMap = %newPBRConfig; 
    %mat.detailMap = %newDetail;    
    %mat.detailMap = %newDetail;    
    %mat.macroMap = %newMacro;
    %mat.macroMap = %newMacro;
    %mat.detailSize = %detailSize;  
    %mat.detailSize = %detailSize;  
@@ -543,6 +594,7 @@ function TerrainMaterialDlg::snapshotMaterials( %this )
          internalName = %mat.internalName;
          internalName = %mat.internalName;
          diffuseMap = %mat.diffuseMap;
          diffuseMap = %mat.diffuseMap;
          normalMap = %mat.normalMap;
          normalMap = %mat.normalMap;
+         pbrConfigMap = %mat.pbrConfigMap;
          detailMap = %mat.detailMap;
          detailMap = %mat.detailMap;
          macroMap = %mat.macroMap;
          macroMap = %mat.macroMap;
          detailSize = %mat.detailSize;
          detailSize = %mat.detailSize;
@@ -577,6 +629,7 @@ function TerrainMaterialDlg::restoreMaterials( %this )
       %mat.setInternalName( %obj.internalName );
       %mat.setInternalName( %obj.internalName );
       %mat.diffuseMap = %obj.diffuseMap;
       %mat.diffuseMap = %obj.diffuseMap;
       %mat.normalMap = %obj.normalMap;
       %mat.normalMap = %obj.normalMap;
+      %mat.pbrConfigMap = %obj.pbrConfigMap;
       %mat.detailMap = %obj.detailMap;
       %mat.detailMap = %obj.detailMap;
       %mat.macroMap = %obj.macroMap;
       %mat.macroMap = %obj.macroMap;
       %mat.detailSize = %obj.detailSize;
       %mat.detailSize = %obj.detailSize;

+ 11 - 1
Templates/BaseGame/game/tools/worldEditor/scripts/menuHandlers.ed.cs

@@ -280,7 +280,17 @@ function EditorSaveMission()
       initContainerTypeSearch($TypeMasks::TerrainObjectType);
       initContainerTypeSearch($TypeMasks::TerrainObjectType);
 
 
       while ((%terrainObject = containerSearchNext()) != 0)
       while ((%terrainObject = containerSearchNext()) != 0)
-         %terrainObject.save(%terrainObject.terrainFile);
+      {
+         if(%terrainObject.terrainAsset !$= "")
+         {
+            //we utilize a terrain asset, so we'll update our dependencies while we're at it
+            %terrainObject.saveAsset();
+         }
+         else
+         {
+            %terrainObject.save(%terrainObject.terrainFile);
+         }
+      }
    }
    }
 
 
    ETerrainPersistMan.saveDirty();
    ETerrainPersistMan.saveDirty();

+ 9 - 9
Templates/BaseGame/game/tools/worldEditor/scripts/visibility/lightViz.cs

@@ -20,7 +20,7 @@
 // IN THE SOFTWARE.
 // IN THE SOFTWARE.
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 // Debug Shaders.
 // Debug Shaders.
-new ShaderData( AL_ColorBufferShader )
+singleton shaderData( AL_ColorBufferShader )
 {
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXPixelShaderFile  = "./shaders/dbgColorBufferP.hlsl";
    DXPixelShaderFile  = "./shaders/dbgColorBufferP.hlsl";
@@ -59,7 +59,7 @@ function toggleColorBufferViz( %enable )
    }
    }
 }
 }
 
 
-new ShaderData( AL_SpecMapShader )
+singleton shaderData( AL_SpecMapShader )
 {
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXPixelShaderFile  = "./shaders/dbgSpecMapVisualizeP.hlsl";
    DXPixelShaderFile  = "./shaders/dbgSpecMapVisualizeP.hlsl";
@@ -94,7 +94,7 @@ function toggleSpecMapViz( %enable )
       AL_SpecMapVisualize.disable();    
       AL_SpecMapVisualize.disable();    
 }
 }
 
 
-new GFXStateBlockData( AL_DepthVisualizeState )
+singleton GFXStateBlockData( AL_DepthVisualizeState )
 {
 {
    zDefined = true;
    zDefined = true;
    zEnable = false;
    zEnable = false;
@@ -105,7 +105,7 @@ new GFXStateBlockData( AL_DepthVisualizeState )
    samplerStates[1] = SamplerClampLinear; // viz color lookup
    samplerStates[1] = SamplerClampLinear; // viz color lookup
 };
 };
 
 
-new GFXStateBlockData( AL_DefaultVisualizeState )
+singleton GFXStateBlockData( AL_DefaultVisualizeState )
 {
 {
    blendDefined = true;
    blendDefined = true;
    blendEnable = true;
    blendEnable = true;
@@ -121,7 +121,7 @@ new GFXStateBlockData( AL_DefaultVisualizeState )
    samplerStates[1] = SamplerClampLinear;  // depthviz
    samplerStates[1] = SamplerClampLinear;  // depthviz
 };
 };
 
 
-new ShaderData( AL_DepthVisualizeShader )
+singleton shaderData( AL_DepthVisualizeShader )
 {
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXPixelShaderFile  = "./shaders/dbgDepthVisualizeP.hlsl";
    DXPixelShaderFile  = "./shaders/dbgDepthVisualizeP.hlsl";
@@ -157,7 +157,7 @@ function AL_DepthVisualize::onEnabled( %this )
    return true;
    return true;
 }
 }
 
 
-new ShaderData( AL_GlowVisualizeShader )
+singleton shaderData( AL_GlowVisualizeShader )
 {
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXPixelShaderFile  = "./shaders/dbgGlowVisualizeP.hlsl";
    DXPixelShaderFile  = "./shaders/dbgGlowVisualizeP.hlsl";
@@ -178,7 +178,7 @@ singleton PostEffect( AL_GlowVisualize )
    renderPriority = 9999;
    renderPriority = 9999;
 };
 };
 
 
-new ShaderData( AL_NormalsVisualizeShader )
+singleton shaderData( AL_NormalsVisualizeShader )
 {
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXPixelShaderFile  = "./shaders/dbgNormalVisualizeP.hlsl";
    DXPixelShaderFile  = "./shaders/dbgNormalVisualizeP.hlsl";
@@ -214,7 +214,7 @@ function AL_NormalsVisualize::onEnabled( %this )
 
 
 
 
 
 
-new ShaderData( AL_LightColorVisualizeShader )
+singleton shaderData( AL_LightColorVisualizeShader )
 {
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXPixelShaderFile  = "./shaders/dbgLightColorVisualizeP.hlsl";
    DXPixelShaderFile  = "./shaders/dbgLightColorVisualizeP.hlsl";
@@ -249,7 +249,7 @@ function AL_LightColorVisualize::onEnabled( %this )
 }
 }
 
 
 
 
-new ShaderData( AL_LightSpecularVisualizeShader )
+singleton shaderData( AL_LightSpecularVisualizeShader )
 {
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXPixelShaderFile  = "./shaders/dbgLightSpecularVisualizeP.hlsl";
    DXPixelShaderFile  = "./shaders/dbgLightSpecularVisualizeP.hlsl";

+ 5 - 5
Templates/BaseGame/game/tools/worldEditor/scripts/visibility/miscViz.cs

@@ -1,4 +1,4 @@
-new GFXStateBlockData( Viz_DefaultVisualizeState )
+singleton GFXStateBlockData( Viz_DefaultVisualizeState )
 {
 {
    /*alphaDefined = true;
    /*alphaDefined = true;
    alphaTestEnable = true;
    alphaTestEnable = true;
@@ -39,7 +39,7 @@ new GFXStateBlockData( Viz_DefaultVisualizeState )
    samplerStates[4] = SamplerClampLinear;  // depthviz
    samplerStates[4] = SamplerClampLinear;  // depthviz
 };
 };
 
 
-new ShaderData( Viz_TexelDensity )
+singleton shaderData( Viz_TexelDensity )
 {
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXPixelShaderFile  = "./shaders/Viz_TexelDensityP.hlsl";
    DXPixelShaderFile  = "./shaders/Viz_TexelDensityP.hlsl";
@@ -79,7 +79,7 @@ function toggleTexelDensityViz( %enable )
 
 
 //
 //
 //
 //
-new ShaderData( Viz_SurfaceProperties )
+singleton shaderData( Viz_SurfaceProperties )
 {
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXPixelShaderFile  = "./shaders/Viz_SurfacePropertiesP.hlsl";
    DXPixelShaderFile  = "./shaders/Viz_SurfacePropertiesP.hlsl";
@@ -203,7 +203,7 @@ function Viz_SurfacePropertiesPFX::onEnabled( %this )
 //
 //
 //
 //
 //
 //
-new ShaderData( Viz_ColorBlindness )
+singleton shaderData( Viz_ColorBlindness )
 {
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXPixelShaderFile  = "./shaders/Viz_ColorblindnessP.hlsl";
    DXPixelShaderFile  = "./shaders/Viz_ColorblindnessP.hlsl";
@@ -307,7 +307,7 @@ function Viz_ColorBlindnessPFX::onEnabled( %this )
 
 
 //
 //
 //Material Complexity Viz
 //Material Complexity Viz
-new ShaderData( Viz_MaterialComplexity )
+singleton shaderData( Viz_MaterialComplexity )
 {
 {
    DXVertexShaderFile   = "./shaders/Viz_materialComplexityV.hlsl";
    DXVertexShaderFile   = "./shaders/Viz_materialComplexityV.hlsl";
    DXPixelShaderFile    = "./shaders/Viz_materialComplexityP.hlsl";
    DXPixelShaderFile    = "./shaders/Viz_materialComplexityP.hlsl";

+ 1 - 1
Templates/BaseGame/game/tools/worldEditor/scripts/visibility/shadowViz.cs

@@ -20,7 +20,7 @@
 // IN THE SOFTWARE.
 // IN THE SOFTWARE.
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 
 
-new ShaderData( AL_ShadowVisualizeShader )
+singleton shaderData( AL_ShadowVisualizeShader )
 {
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/guiMaterialV.hlsl";
    DXVertexShaderFile = $Core::CommonShaderPath @ "/guiMaterialV.hlsl";
    DXPixelShaderFile  = "./shaders/dbgShadowVisualizeP.hlsl";
    DXPixelShaderFile  = "./shaders/dbgShadowVisualizeP.hlsl";

+ 4 - 3
Tools/CMake/cleanup-win.bat.in

@@ -2,7 +2,7 @@
 
 
 :: Delete procedural shaders
 :: Delete procedural shaders
 echo shaders
 echo shaders
-del /q /a:-R shaders\procedural\*.*
+del /q /a:-R data\shaderCachel\*.*
 :: Delete dumped shader disassembly files
 :: Delete dumped shader disassembly files
 for /R %%a IN (*._dis.txt) do IF EXIST "%%a._dis.txt" del "%%a._dis.txt"
 for /R %%a IN (*._dis.txt) do IF EXIST "%%a._dis.txt" del "%%a._dis.txt"
 
 
@@ -38,10 +38,11 @@ IF EXIST "scripts\server\banlist.cs" del /s scripts\server\banlist.cs
 IF EXIST "scripts\server\prefs.cs" del /s scripts\server\prefs.cs
 IF EXIST "scripts\server\prefs.cs" del /s scripts\server\prefs.cs
 IF EXIST "client\config.cs" del /s client\config.cs
 IF EXIST "client\config.cs" del /s client\config.cs
 IF EXIST "config.cs" del /s config.cs
 IF EXIST "config.cs" del /s config.cs
-IF EXIST "tools\settings.xml" del /s tools\settings.xml
+:: IF EXIST "tools\settings.xml" del /s tools\settings.xml
 IF EXIST "banlist.cs" del /s banlist.cs
 IF EXIST "banlist.cs" del /s banlist.cs
 
 
 :: logs
 :: logs
 echo logs
 echo logs
 IF EXIST "torque3d.log" del /s torque3d.log
 IF EXIST "torque3d.log" del /s torque3d.log
-echo DONE!
+IF EXIST "console.log" del /s console.log
+echo DONE!

Some files were not shown because too many files changed in this diff