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();
    mLevelFile = StringTable->EmptyString();
    mPreviewImage = StringTable->EmptyString();
+   mPostFXPresetFile = StringTable->EmptyString();
+   mDecalsFile = StringTable->EmptyString();
+   mForestFile = StringTable->EmptyString();
+   mNavmeshFile = StringTable->EmptyString();
 
    mGamemodeName = StringTable->EmptyString();
    mMainLevelAsset = StringTable->EmptyString();
@@ -115,6 +119,15 @@ void LevelAsset::initPersistFields()
    addProtectedField("PreviewImage", TypeAssetLooseFilePath, Offset(mPreviewImage, LevelAsset),
       &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("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        mLevelFile;
+   StringTableEntry        mPostFXPresetFile;
+   StringTableEntry        mDecalsFile;
+   StringTableEntry        mForestFile;
+   StringTableEntry        mNavmeshFile;
    StringTableEntry        mPreviewImage;
 
    bool                    mIsSubLevel;
@@ -66,6 +70,14 @@ public:
 
    void                    setLevelFile(const char* pImageFile);
    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);
    inline StringTableEntry getImageFile(void) const { return mPreviewImage; };
 

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

@@ -40,6 +40,8 @@
 #include "assets/assetPtr.h"
 #endif
 
+#include "T3D/assets/TerrainMaterialAsset.h"
+
 //-----------------------------------------------------------------------------
 
 IMPLEMENT_CONOBJECT(TerrainAsset);
@@ -89,7 +91,7 @@ ConsoleSetType(TypeTerrainAssetPtr)
 
 TerrainAsset::TerrainAsset()
 {
-   mTerrainFile = StringTable->EmptyString();
+   mTerrainFilePath = StringTable->EmptyString();
 }
 
 //-----------------------------------------------------------------------------
@@ -106,8 +108,22 @@ void TerrainAsset::initPersistFields()
    Parent::initPersistFields();
 
    //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()
@@ -115,22 +131,20 @@ void TerrainAsset::initializeAsset()
    // Call parent.
    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()
 {
-   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!
    AssertFatal(pScriptFile != NULL, "Cannot use a NULL script file.");
@@ -139,12 +153,52 @@ void TerrainAsset::setTerrainFile(const char* pScriptFile)
    pScriptFile = StringTable->insert(pScriptFile);
 
    // Update.
-   mTerrainFile = getOwned() ? expandAssetFilePath(pScriptFile) : pScriptFile;
+   mTerrainFilePath = getOwned() ? expandAssetFilePath(pScriptFile) : pScriptFile;
 
    // Refresh the asset.
    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)
@@ -190,7 +244,7 @@ GuiControl* GuiInspectorTypeTerrainAssetPtr::constructEditControl()
 
    TerrainAsset* matAsset = AssetDatabase.acquireAsset< TerrainAsset>(matAssetId);
 
-   TerrainMaterial* materialDef = nullptr;
+   //TerrainMaterial* materialDef = nullptr;
 
    char bitmapName[512] = "tools/worldEditor/images/toolbar/shape-editor";
 
@@ -268,23 +322,3 @@ bool GuiInspectorTypeTerrainAssetPtr::updateRects()
 
    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
 // IN THE SOFTWARE.
 //-----------------------------------------------------------------------------
+#pragma once
 #ifndef TERRAINASSET_H
 #define TERRAINASSET_H
 
@@ -46,14 +47,23 @@
 #include "gui/editor/guiInspectorTypes.h"
 #endif
 
-#include "terrain/terrData.h"
+//#include "terrain/terrData.h"
+#include "assets/assetPtr.h"
+#include "terrain/terrFile.h"
+
+class TerrainMaterialAsset;
 
 //-----------------------------------------------------------------------------
 class TerrainAsset : public AssetBase
 {
    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:
    TerrainAsset();
@@ -63,8 +73,14 @@ public:
    static void initPersistFields();
    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_CONOBJECT(TerrainAsset);
@@ -73,8 +89,8 @@ protected:
    virtual void initializeAsset();
    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)
@@ -96,7 +112,6 @@ public:
 
    virtual GuiControl* constructEditControl();
    virtual bool updateRects();
-   void setMaterialAsset(String assetId);
 };
 
 #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
 // IN THE SOFTWARE.
 //-----------------------------------------------------------------------------
+#pragma once
 #ifndef TERRAINMATERIALASSET_H
 #define TERRAINMATERIALASSET_H
 

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

@@ -240,9 +240,15 @@ LightningData::LightningData()
 {
    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;
 }
 
@@ -282,9 +288,10 @@ bool LightningData::preload(bool server, String &errorStr)
    if (Parent::preload(server, errorStr) == 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) 
@@ -321,14 +328,15 @@ void LightningData::packData(BitStream* stream)
 
    U32 i;
    for (i = 0; i < MaxThunders; i++)
-      sfxWrite( stream, thunderSounds[ i ] );
+   {
+      if (stream->writeFlag(thunderSounds[i]))
+         sfxWrite(stream, thunderSounds[i]);
+   }
 
    stream->writeInt(mNumStrikeTextures, 4);
 
-   for (i = 0; i < MaxTextures; i++) 
-   {
+   for (i = 0; i < MaxTextures; i++)
       stream->writeString(strikeTextureNames[i]);
-   }
 
    sfxWrite( stream, strikeSound );
 }
@@ -339,14 +347,17 @@ void LightningData::unpackData(BitStream* stream)
 
    U32 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);
 
-   for (i = 0; i < MaxTextures; i++) 
-   {
+   for (i = 0; i < MaxTextures; i++)
       strikeTextureNames[i] = stream->readSTString();
-   }
 
    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.setCullMode(GFXCullNone);
    desc.setBlend(true);
-   desc.fillMode = GFXFillWireframe;
+   //desc.fillMode = GFXFillWireframe;
+
    // Base the sphere color on the light color.
    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)
 {
    // Acquired the acquired reference count.

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

@@ -104,6 +104,12 @@ public:
 
    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_CONOBJECT(AssetBase);
 

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

@@ -1,4 +1,4 @@
-//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 // Copyright (c) 2013 GarageGames, LLC
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -39,3 +39,31 @@ DefineEngineMethod(AssetBase, getAssetId, String, (), ,
 {
     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;
    }
    
-#if defined(_MSC_VER) && (_MSC_VER >= 1910)
+#if defined(_MSC_VER) && (_MSC_VER >= 1910) && (_MSC_VER < 1920)
    template<typename ...TailTs>
    struct DodgyVCHelper
    {

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

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

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

@@ -59,13 +59,12 @@ class VolumetricFogRTManager : public SceneObject
       static S32 mTargetScale;
       bool mIsInitialized;
       U32 mNumFogObjects;
-      U32 mFogHasAnswered;
       U32 mWidth;
       U32 mHeight;
    
       void onRemove();
       void onSceneRemove();
-      void ResizeRT(PlatformWindow *win, bool resize);
+      void ResizeRT(WindowId did, S32 width, S32 height);
    
       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);
    getColor(x, y, pixelColor);
-
+   if (mInternalFormat == GFXFormatL16)
+   {
+      chan = 0;
+   }
    switch (chan) {
    case 0: return pixelColor.red;
    case 1: return pixelColor.green;
@@ -1323,7 +1326,7 @@ U32 GBitmap::getSurfaceSize(const U32 mipLevel) const
    if (mInternalFormat >= GFXFormatBC1 && mInternalFormat <= GFXFormatBC3)
    {
       // 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;
 

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

@@ -1176,6 +1176,10 @@ void GuiTreeViewCtrl::_buildItem( Item* item, U32 tabLevel, bool bForceFullUpdat
    else
       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?
    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)
 {
    for (S32 i = 0; i < selectedItems.size(); i++)
@@ -5651,6 +5667,26 @@ DefineEngineMethod(GuiTreeViewCtrl, setItemFilterException, void, (U32 item, boo
 {
    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, (),,

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

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

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

@@ -447,10 +447,6 @@ AdvancedLightBinManager::LightMaterialInfo* AdvancedLightBinManager::_getLightMa
       if ( smPSSMDebugRender )
          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.
       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(mCellSize, 0, sizeof(mCellSize));
    dMemset(mNormalMapAtlas, 0, sizeof(mNormalMapAtlas));
-   dMemset(mUseAnisotropic, 0, sizeof(mUseAnisotropic));
+   dMemset(mUseAnisotropic, 1, sizeof(mUseAnisotropic));
 
    mImposterLimits = Point4F::Zero;
 

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

@@ -38,9 +38,16 @@
 #include "console/consoleTypes.h"
 #endif
 
+#ifndef _MODULE_DEFINITION_H
+#include "module/moduleDefinition.h"
+#endif
+
+#ifndef _STRINGFUNCTIONS_H_
+#include "core/strings/stringFunctions.h"
+#endif
+
 // Script bindings.
 #include "moduleManager_ScriptBinding.h"
-
 //-----------------------------------------------------------------------------
 
 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;
 }
 
+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() :
@@ -1087,6 +1113,7 @@ void ModuleManager::findModules( const bool loadedOnly, typeConstModuleDefinitio
             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;
 }
+
+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.
    static const char* getSingletonName() { return "PostEffectManager"; }
+
+   void dumpActivePostFX();
 };
 
 /// Returns the PostEffectManager singleton.
 #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 "math/mPolyhedron.impl.h"
 #include "gfx/gfxTransformSaver.h"
-
+#include "lighting/advanced/advancedLightBinManager.h" //for ssao
 #include "gfx/gfxDebugEvent.h"
 #include "shaderGen/shaderGenVars.h"
 #include "materials/shaderData.h"
@@ -752,6 +752,24 @@ void RenderProbeMgr::render( SceneRenderState *state )
       mProbeArrayEffect->setShaderMacro("SKYLIGHT_ONLY", "1");
    else
       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->setCubemapArrayTexture(4, mPrefilterArray);

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

@@ -53,7 +53,7 @@
 #include "T3D/physics/physicsCollision.h"
 #include "console/engineAPI.h"
 
-#include "console/engineAPI.h"
+#include "T3D/assets/TerrainMaterialAsset.h"
 using namespace Torque;
 
 IMPLEMENT_CO_NETOBJECT_V1(TerrainBlock);
@@ -207,6 +207,9 @@ TerrainBlock::TerrainBlock()
    mNetFlags.set(Ghostable | ScopeAlways);
    mIgnoreZodiacs = false;
    zode_primBuffer = 0;
+
+   mTerrainAsset = StringTable->EmptyString();
+   mTerrainAssetId = StringTable->EmptyString();
 }
 
 
@@ -352,17 +355,90 @@ void TerrainBlock::setFile(const Resource<TerrainFile>& terr)
    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)
 {
    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 )
 {
    static_cast<TerrainBlock*>( obj )->setFile( FileName( data ) );
    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()
 {
    if ( !mFile )
@@ -901,31 +977,50 @@ bool TerrainBlock::onAdd()
    if(!Parent::onAdd())
       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 )
    {
@@ -1125,7 +1220,11 @@ void TerrainBlock::setScale( const VectorF &scale )
 void TerrainBlock::initPersistFields()
 {
    addGroup( "Media" );
-      
+
+      addProtectedField("terrainAsset", TypeTerrainAssetPtr, Offset(mTerrainAsset, TerrainBlock),
+         &TerrainBlock::_setTerrainAsset, &defaultProtectedGetFn,
+         "The source terrain data asset.");
+
       addProtectedField( "terrainFile", TypeStringFilename, Offset( mTerrFileName, TerrainBlock ), 
          &TerrainBlock::_setTerrainFile, &defaultProtectedGetFn,
          "The source terrain data file." );
@@ -1310,6 +1409,16 @@ DefineEngineMethod( TerrainBlock, save, bool, ( const char* 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.")
 //{
 //   char filename[256];

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

@@ -50,7 +50,12 @@
 #include "gfx/gfxPrimitiveBuffer.h"
 #endif
 
-
+#ifndef _ASSET_PTR_H_
+#include "assets/assetPtr.h"
+#endif 
+#ifndef TERRAINASSET_H
+#include "T3D/assets/TerrainAsset.h"
+#endif 
 
 class GBitmap;
 class TerrainBlock;
@@ -120,6 +125,9 @@ protected:
 
    ///
    FileName mTerrFileName;
+
+   AssetPtr<TerrainAsset> mTerrainAsset;
+   StringTableEntry mTerrainAssetId;
    
    /// The maximum detail distance found in the material list.
    F32 mMaxDetailDistance;
@@ -241,6 +249,7 @@ protected:
 
    // Protected fields
    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 _setBaseTexSize(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);
 
+   bool setTerrainAsset(const StringTableEntry terrainAssetId);
+
    bool save(const char* filename);
+   bool saveAsset();
 
    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 "
 	   "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();
 
    // 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;
 
-            if (!Platform::isFile(fileName))
+            if (!Platform::isDirectory(fileName) && !Platform::isFile(fileName))
                break;
 
             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();
 
    SetForegroundWindow( getHWND() );
-   getScreenResChangeSignal().trigger( this, true );
+   resizeEvent.trigger( this, true );
 }
 
 bool Win32Window::clearFullscreen()
@@ -806,7 +806,7 @@ LRESULT PASCAL Win32Window::WindowProc( HWND hWnd, UINT message, WPARAM wParam,
 				window->getGFXTarget()->resetMode();
 			}
 
-         window->getScreenResChangeSignal().trigger(window, true);
+         window->resizeEvent.trigger(window, true);
 		}
 		return 0;
 

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

@@ -38,7 +38,73 @@
 //----------------------------------------------------------------------------
 // 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.
    echo ("*** New Mission: " @ %missionName);
@@ -61,6 +127,56 @@ function clientCmdMissionStartPhase1(%seq, %missionName)
       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");
    
    commandToServer('MissionStartPhase1Ack', %seq);
@@ -164,7 +280,7 @@ function connect(%server)
 {
    %conn = new GameConnection(ServerConnection);
    RootGroup.add(ServerConnection);
-   %conn.setConnectArgs($pref::Player::Name);
+   %conn.setConnectArgs($pref::Player::Name, $ConncetInfoKey);
    %conn.setJoinPassword($Client::Password);
    %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
 $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
 // to connect to the server

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

@@ -38,8 +38,26 @@
 //----------------------------------------------------------------------------
 // Phase 1 
 //----------------------------------------------------------------------------
+$Pref::Server::EnableDatablockCache = true;
+$pref::Server::DatablockCacheFilename = "data/cache/server/datablock_cache_c.dbc";
 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
    // when we learn it got there, we'll send the data blocks
    %this.currentPhase = 0;
@@ -50,12 +68,41 @@ function GameConnection::loadMission(%this)
    }
    else
    {
-      commandToClient(%this, 'MissionStartPhase1', $missionSequence, $Server::MissionFile);
+      commandToClient(%this, 'MissionStartPhase1', $missionSequence, $Server::MissionFile, %cache_crc);
          
       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)
 {
    // 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
       if (!isObject(%client.camera))
       {
-         if(!isObject(Observer))
-         {
-            datablock CameraData(Observer)
-            {
-               mode = "Observer";
-            };  
-         }
-         
          //if (isDefined("$Game::DefaultCameraClass"))
             %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 );
    
+   callOnModules("onServerScriptExec", "Core");
+   callOnModules("onServerScriptExec", "Game");   
+   
    // Keep track of when the game started
    $Game::StartTime = $Sim::Time;
-
-   onServerCreatedAFX();
 }
 
 /// Shut down the server
@@ -283,6 +284,9 @@ function onServerDestroyed()
    MissionCleanup.delete();
    
    clearServerPaths();
+   
+  if ($Pref::Server::EnableDatablockCache)
+    resetDatablockCache();
 }
 
 /// 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";
    DXPixelShaderFile    = $Core::CommonShaderPath @ "/ribbons/basicRibbonShaderP.hlsl";
@@ -26,7 +26,7 @@ singleton CustomMaterial( BasicRibbonMat )
    preload = true;
 };
 
-new ShaderData( TexturedRibbonShader )
+singleton ShaderData( TexturedRibbonShader )
 {
    DXVertexShaderFile   = $Core::CommonShaderPath @ "/ribbons/texRibbonShaderV.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
-new GFXStateBlockData( AL_VectorLightState )
+singleton GFXStateBlockData( AL_VectorLightState )
 {
    blendDefined = true;
    blendEnable = true;
@@ -48,9 +48,7 @@ new GFXStateBlockData( AL_VectorLightState )
    mSamplerNames[1] = "shadowMap";
    samplerStates[2] = SamplerClampPoint;  // Shadow Map (Do not change this to linear, as all cards can not filter equally.)
    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;
    cullMode = GFXCullNone;
@@ -61,7 +59,7 @@ new GFXStateBlockData( AL_VectorLightState )
 };
 
 // Vector Light Material
-new ShaderData( AL_VectorLightShader )
+singleton shaderData( AL_VectorLightShader )
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/advanced/farFrustumQuadV.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/vectorLightP.hlsl";
@@ -72,11 +70,10 @@ new ShaderData( AL_VectorLightShader )
    samplerNames[0] = "$deferredBuffer";
    samplerNames[1] = "$shadowMap";
    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;
 };
@@ -89,7 +86,6 @@ new CustomMaterial( AL_VectorLightMaterial )
    sampler["deferredBuffer"] = "#deferred";
    sampler["shadowMap"] = "$dynamiclight";
    sampler["dynamicShadowMap"] = "$dynamicShadowMap";
-   sampler["ssaoMask"] = "#ssaoMask";  
    sampler["lightBuffer"] = "#specularLighting";
    sampler["colorBuffer"] = "#color";
    sampler["matInfoBuffer"] = "#matinfo";
@@ -102,7 +98,7 @@ new CustomMaterial( AL_VectorLightMaterial )
 //------------------------------------------------------------------------------
 
 // Convex-geometry light states
-new GFXStateBlockData( AL_ConvexLightState )
+singleton GFXStateBlockData( AL_ConvexLightState )
 {
    blendDefined = true;
    blendEnable = true;
@@ -140,7 +136,7 @@ new GFXStateBlockData( AL_ConvexLightState )
 };
 
 // Point Light Material
-new ShaderData( AL_PointLightShader )
+singleton shaderData( AL_PointLightShader )
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/advanced/convexGeometryV.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/pointLightP.hlsl";
@@ -179,7 +175,7 @@ new CustomMaterial( AL_PointLightMaterial )
 };
 
 // Spot Light Material
-new ShaderData( AL_SpotLightShader )
+singleton shaderData( AL_SpotLightShader )
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/advanced/convexGeometryV.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/spotLightP.hlsl";
@@ -256,7 +252,7 @@ new Material( AL_DefaultShadowMaterial )
 };
 
 // Particle System Point Light Material
-new ShaderData( AL_ParticlePointLightShader )
+singleton shaderData( AL_ParticlePointLightShader )
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/advanced/particlePointLightV.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/particlePointLightP.hlsl";
@@ -281,7 +277,7 @@ new CustomMaterial( AL_ParticlePointLightMaterial )
 };
 
 //Probe Processing
-new ShaderData( IrradianceShader )
+singleton shaderData( IrradianceShader )
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/advanced/cubemapV.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/irradianceP.hlsl";
@@ -294,7 +290,7 @@ new ShaderData( IrradianceShader )
    pixVersion = 3.0;
 };
 
-new ShaderData( PrefiterCubemapShader )
+singleton shaderData( PrefiterCubemapShader )
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/lighting/advanced/cubemapV.hlsl";
    DXPixelShaderFile  = $Core::CommonShaderPath @ "/lighting/advanced/prefilterP.hlsl";
@@ -322,6 +318,7 @@ singleton ShaderData( PFX_ReflectionProbeArray )
    samplerNames[3] = "$BRDFTexture";
    samplerNames[4] = "$specularCubemapAR";
    samplerNames[5] = "$irradianceCubemapAR";
+   samplerNames[6] = "$ssaoMask";
 
    pixVersion = 2.0;
 };  
@@ -350,4 +347,5 @@ singleton GFXStateBlockData( PFX_ReflectionProbeArrayStateBlock )
    samplerStates[3] = SamplerClampPoint;
    samplerStates[4] = 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;   
 };
 
-new GFXStateBlockData( AL_DeferredCaptureState : PFX_DefaultStateBlock )
+singleton GFXStateBlockData( AL_DeferredCaptureState : PFX_DefaultStateBlock )
 {        
    blendEnable = false; 
    
@@ -27,7 +27,7 @@ new GFXStateBlockData( AL_DeferredCaptureState : PFX_DefaultStateBlock )
    samplerStates[4] = SamplerWrapLinear;
 };
 
-new ShaderData( AL_ProbeShader )
+singleton shaderData( AL_ProbeShader )
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.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";
    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";
 	target = "$outTex";
 	targetScale = "0.5 0.5";
-	isEnabled = true;
+	isEnabled = false;
 	// Blur vertically
 	new PostEffect()
 	{

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

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

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

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

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

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

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

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

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

@@ -57,7 +57,7 @@ singleton ShaderData( OffscreenParticleCompositeShaderData )
 //-----------------------------------------------------------------------------
 // Planar Reflection
 //-----------------------------------------------------------------------------
-new ShaderData( ReflectBump )
+singleton shaderData( ReflectBump )
 {
    DXVertexShaderFile 	= $Core::CommonShaderPath @ "/planarReflectBumpV.hlsl";
    DXPixelShaderFile 	= $Core::CommonShaderPath @ "/planarReflectBumpP.hlsl";
@@ -72,7 +72,7 @@ new ShaderData( ReflectBump )
    pixVersion = 2.0;
 };
 
-new ShaderData( Reflect )
+singleton shaderData( Reflect )
 {
    DXVertexShaderFile 	= $Core::CommonShaderPath @ "/planarReflectV.hlsl";
    DXPixelShaderFile 	= $Core::CommonShaderPath @ "/planarReflectP.hlsl";
@@ -89,7 +89,7 @@ new ShaderData( Reflect )
 //-----------------------------------------------------------------------------
 // fxFoliageReplicator
 //-----------------------------------------------------------------------------
-new ShaderData( fxFoliageReplicatorShader )
+singleton shaderData( fxFoliageReplicatorShader )
 {
    DXVertexShaderFile 	= $Core::CommonShaderPath @ "/fxFoliageReplicatorV.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;
 };
 
-new GFXSamplerStateData(WaterSampler)
+singleton GFXSamplerStateData(WaterSampler)
 {
    textureColorOp = GFXTOPModulate;
    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)
 	vec3 f0;				// fresnel value (rgb)
+    float f90;
 	vec3 albedo;			// diffuse light absorbtion value (rgb)
 	vec3 R;				// reflection vector
 	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.f0 = lerp(vec3(0.04f), surface.baseColor.rgb, surface.metalness);
 	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)
@@ -229,6 +230,11 @@ vec3 getPunctualLight(in Surface surface, in SurfaceToLight surfaceToLight, vec3
    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 shadowMask,
                      vec4 inLightPos[4],
@@ -421,20 +427,18 @@ vec4 computeForwardProbes(Surface surface,
       specular = mix(specular,textureLod(specularCubemapAR, vec4(surface.R, skylightCubemapIdx), lod).xyz, alpha);
    }
 
-   vec3 F = FresnelSchlickRoughness(surface.NdotV, surface.f0, surface.roughness);
-
    //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 R;				// reflection vector
 	float3 F;				// fresnel term computed from f0, N and V
+   float f90;
 
 	inline void Update()
 	{
@@ -94,7 +95,7 @@ struct Surface
 		f0 = lerp(0.04.xxx, baseColor.rgb, metalness);
 
 		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);
 	}
 };
@@ -235,6 +236,11 @@ inline float3 getPunctualLight(in Surface surface, in SurfaceToLight surfaceToLi
    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 shadowMask,
                      float4 inLightPos[4],
@@ -462,19 +468,18 @@ float4 computeForwardProbes(Surface surface,
       specular = lerp(specular,TORQUE_TEXCUBEARRAYLOD(specularCubemapAR, surface.R, skylightCubemapIdx, lod).xyz,alpha);
    }
 
-   float3 F = FresnelSchlickRoughness(surface.NdotV, surface.f0, surface.roughness);
-
    //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 irradianceCubemapAR;
 
+#ifdef USE_SSAO_MASK
+uniform sampler2D ssaoMask;
+uniform vec4 rtParams6;
+#endif
+
 uniform vec4    inProbePosArray[MAX_PROBES];
 uniform vec4    inRefPosArray[MAX_PROBES];
 uniform mat4    worldToObjArray[MAX_PROBES];
@@ -52,6 +57,12 @@ void main()
    {
       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;
 
@@ -190,20 +201,19 @@ void main()
    return;
 #endif
 
-   vec3 F = FresnelSchlickRoughness(surface.NdotV, surface.f0, surface.roughness);
 
    //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 dynamicShadowMap;
 
-#ifdef USE_SSAO_MASK
-uniform sampler2D ssaoMask ;
-uniform vec4 rtParams3;
-#endif
-
 uniform sampler2D colorBuffer;
 uniform sampler2D matInfoBuffer;             
 uniform float  lightBrightness;
@@ -245,10 +240,6 @@ void main()
       #endif
 
    #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   
    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(irradianceCubemapAR, 5);
 
+#ifdef USE_SSAO_MASK
+TORQUE_UNIFORM_SAMPLER2D(ssaoMask, 6);
+uniform float4 rtParams6;
+#endif
+
 uniform float4    inProbePosArray[MAX_PROBES];
 uniform float4    inRefPosArray[MAX_PROBES];
 uniform float4x4  worldToObjArray[MAX_PROBES];
@@ -49,6 +54,11 @@ float4 main(PFXVertToPix IN) : SV_TARGET
       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;
 
 #if SKYLIGHT_ONLY == 0
@@ -182,19 +192,18 @@ float4 main(PFXVertToPix IN) : SV_TARGET
    return float4(irradiance, 1);
 #endif
 
-   float3 F = FresnelSchlickRoughness(surface.NdotV, surface.f0, surface.roughness);
-
    //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
 /// rotations of the filter taps.
-TORQUE_UNIFORM_SAMPLER2D(gTapRotationTex, 4);
+TORQUE_UNIFORM_SAMPLER2D(gTapRotationTex, 3);
 
 float softShadow_sampleTaps(  TORQUE_SAMPLER2D(shadowMap1),
                               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(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 float3 lightDirection;
@@ -234,10 +229,6 @@ float4 main(FarFrustumQuadConnectP IN) : SV_TARGET
       #endif
 
    #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   
    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)
 {
+   //clear per module group file execution chain
+   ExecFilesList.empty();
    //Get our modules so we can exec any specific client-side loading/handling
    %modulesList = ModuleDatabase.findModules(false);
    for(%i=0; %i < getWordCount(%modulesList); %i++)
@@ -16,7 +23,14 @@ function callOnModules(%functionName, %moduleGroup)
       {
          eval(%module.scopeSet @ "." @ %functionName @ "();");
       }
-   }   
+   }
+   
+   %execFilecount = ExecFilesList.count();
+   for (%i=0;%i<%execFilecount;%i++)
+   {
+        %filename = ExecFilesList.getKey(%i);
+        exec(%filename);
+   }
 }
 
 function loadModuleMaterials(%moduleGroup)
@@ -69,10 +83,12 @@ function SimSet::getModulePath(%scopeSet)
    return "";
 }
 
-function SimSet::registerDatablock(%scopeSet, %datablockFilePath)
+function SimSet::registerDatablock(%scopeSet, %datablockFilePath, %isExclusive)
 {
+   if ($traceModuleCalls)
+      warn("SimSet::registerDatablock");
    %name = %scopeSet.getName();
-   %moduleDef = ModuleDatabase.findModule(%name);
+   %moduleDef = ModuleDatabase.findModule(%name, 1);
      
    if(!isObject(%moduleDef))
    {
@@ -89,6 +105,176 @@ function SimSet::registerDatablock(%scopeSet, %datablockFilePath)
    %relativePath = makeRelativePath(%datablockFilePath);
    
    %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)
 {
     
@@ -15,7 +15,7 @@ function ExampleComponent::onClientConnect(%this, %client)
     
 }
 //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
       %newSetting = getToken(%settingsList, ",", %currentSettingIdx);
-      eval(%settingCtrl.qualitySettingGroup@"::set("@%newSetting@");");
+      eval(%settingCtrl.qualitySettingGroup@"::set(\""@%newSetting@"\");");
       %settingCtrl-->SettingText.setText( %newSetting );
       
       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
-   $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" )
 	{

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

@@ -1,56 +1,56 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <AssetImportSettings>
     <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">
-            <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="CollapseSubmeshes">0</Setting>
+            <Setting name="IgnoreNodeScale">0</Setting>
             <Setting name="UpAxisOverride">Z_AXIS</Setting>
+            <Setting name="ScaleOverride">1</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 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="Compressed">1</Setting>
             <Setting name="TextureFilteringMode">Bilinear</Setting>
-            <Setting name="GenerateMaterialOnImport">1</Setting>
-            <Setting name="RoughnessTypeSuffixes">_ROUGH,_ROUGHNESS</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="Compressed">1</Setting>
+            <Setting name="RoughnessTypeSuffixes">_ROUGH,_ROUGHNESS</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 name="Collision">
             <Setting name="GenerateLOSCollisions">1</Setting>
-            <Setting name="GenerateCollisions">1</Setting>
-            <Setting name="LOSCollisionMeshPrefix">LOS</Setting>
             <Setting name="CollisionMeshPrefix">Col</Setting>
             <Setting name="GenCollisionType">CollisionMesh</Setting>
+            <Setting name="GenerateCollisions">1</Setting>
+            <Setting name="LOSCollisionMeshPrefix">LOS</Setting>
             <Setting name="GenLOSCollisionType">CollisionMesh</Setting>
         </Group>
-        <Group name="Animations">
-            <Setting name="ImportAnimations">1</Setting>
-            <Setting name="SeparateAnimations">1</Setting>
-        </Group>
         <Group name="Sounds">
             <Setting name="PitchAdjust">1.0</Setting>
-            <Setting name="Compressed">0</Setting>
             <Setting name="VolumeAdjust">1.0</Setting>
+            <Setting name="Compressed">0</Setting>
         </Group>
         <Group name="General">
             <Setting name="DuplicatAutoResolution">AutoPrune</Setting>

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

@@ -13,13 +13,23 @@
    isContainer = "1";
    canSave = "1";
    canSaveDynamicFields = "1";
-      AddNewArtAssetPopup = "18222";
-      AddNewAssetPopup = "18223";
-      AddNewScriptAssetPopup = "18221";
+      AddNewArtAssetPopup = "18110";
+      AddNewAssetPopup = "18112";
+      AddNewCppAssetPopup = "18111";
+      AddNewScriptAssetPopup = "18109";
       coreModulesFilter = "0";
       currentPreviewPage = "0";
-      enabled = "1";
+      Enabled = "1";
+      importAssetFinalListArray = "20689";
+      ImportAssetResolutionsPopup = "18119";
+      importAssetUnprocessedListArray = "20688";
+      importingFilesArray = "20687";
       isReImportingAsset = "0";
+      navigationHistoryIdx = "0";
+      onlyShowModulesWithAssets = "0";
+      previewData = "19953";
+      previewSize = "80";
+      templateFilesPath = "tools/assetBrowser/scripts/templateFiles/";
       totalPages = "1";
       treeFilterMode = "list";
 
@@ -201,7 +211,7 @@
          groupNum = "-1";
          buttonType = "PushButton";
          useMouseEvents = "0";
-         position = "50 22";
+         position = "52 22";
          extent = "45 19";
          minExtent = "8 2";
          horizSizing = "right";
@@ -215,97 +225,107 @@
          canSave = "1";
          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";
          tooltipProfile = "GuiToolTipProfile";
          hovertime = "1000";
          isContainer = "1";
-         internalName = "VisibilityLayerWindow";
-         hidden = "1";
          canSave = "1";
          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";
          splitterSize = "2";
          splitPoint = "149 100";
@@ -323,7 +343,7 @@
          minExtent = "64 64";
          horizSizing = "relative";
          vertSizing = "height";
-         profile = "ToolsGuiDefaultProfile";
+         profile = "ToolsGuiSolidDefaultProfile";
          visible = "1";
          active = "1";
          tooltipProfile = "GuiToolTipProfile";
@@ -332,7 +352,7 @@
          canSave = "1";
          canSaveDynamicFields = "0";
 
-         new GuiPanel() {
+         new GuiPanel(AssetBrowser_FoldersPanel) {
             docking = "Client";
             margin = "0 0 0 0";
             padding = "0 0 0 0";
@@ -342,10 +362,10 @@
             anchorRight = "0";
             position = "0 0";
             extent = "147 509";
-            minExtent = "16 16";
+            minExtent = "0 0";
             horizSizing = "right";
             vertSizing = "bottom";
-            profile = "ToolsGuiDefaultProfile";
+            profile = "ToolsGuiSolidDefaultProfile";
             visible = "1";
             active = "1";
             tooltipProfile = "GuiToolTipProfile";
@@ -376,8 +396,13 @@
                canSave = "1";
                canSaveDynamicFields = "0";
 
-               new GuiTextCtrl() {
-                  text = "Filters";
+               new GuiTextEditCtrl(AssetBrowserFolderSearchFilter) {
+                  historySize = "0";
+                  tabComplete = "0";
+                  sinkAllKeyEvents = "0";
+                  password = "0";
+                  passwordMask = "*";
+                  text = "Search Folders...";
                   maxLength = "1024";
                   margin = "0 0 0 0";
                   padding = "0 0 0 0";
@@ -385,23 +410,24 @@
                   anchorBottom = "0";
                   anchorLeft = "1";
                   anchorRight = "0";
-                  position = "5 0";
-                  extent = "30 16";
+                  position = "0 0";
+                  extent = "148 18";
                   minExtent = "8 2";
-                  horizSizing = "right";
-                  vertSizing = "bottom";
-                  profile = "ToolsGuiDefaultProfile";
+                  horizSizing = "width";
+                  vertSizing = "height";
+                  profile = "ToolsGuiTextEditProfile";
                   visible = "1";
                   active = "1";
                   tooltipProfile = "GuiToolTipProfile";
                   hovertime = "1000";
                   isContainer = "1";
+                  class = "AssetBrowserSearchFilterTxt";
                   canSave = "1";
                   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";
                   useModifiers = "0";
                   useStates = "1";
@@ -409,17 +435,15 @@
                   groupNum = "-1";
                   buttonType = "PushButton";
                   useMouseEvents = "0";
-                  position = "128 -1";
-                  extent = "18 19";
+                  position = "132 0";
+                  extent = "15 15";
                   minExtent = "8 2";
-                  horizSizing = "right";
+                  horizSizing = "left";
                   vertSizing = "bottom";
-                  profile = "ToolsGuiDefaultProfile";
+                  profile = "GuiDefaultProfile";
                   visible = "1";
                   active = "1";
-                  command = "AssetBrowser.showFilterPopup();";
                   tooltipProfile = "GuiToolTipProfile";
-                  tooltip = "Views assets via module-oriented list tree.";
                   hovertime = "1000";
                   isContainer = "0";
                   canSave = "1";
@@ -438,7 +462,7 @@
                minExtent = "8 2";
                horizSizing = "width";
                vertSizing = "height";
-               profile = "ToolsGuiDefaultProfile";
+               profile = "ToolsGuiSolidDefaultProfile";
                visible = "1";
                active = "1";
                tooltipProfile = "GuiToolTipProfile";
@@ -471,7 +495,7 @@
                   profile = "GuiEditorScrollProfile";
                   visible = "1";
                   active = "1";
-                  tooltipProfile = "ToolsGuiDefaultProfile";
+                  tooltipProfile = "ToolsGuiSolidDefaultProfile";
                   hovertime = "1000";
                   isContainer = "1";
                   canSave = "1";
@@ -500,7 +524,7 @@
                      canRenameObjects = "1";
                      renameInternal = "0";
                      position = "1 1";
-                     extent = "145 252";
+                     extent = "145 147";
                      minExtent = "8 2";
                      horizSizing = "right";
                      vertSizing = "bottom";
@@ -517,7 +541,7 @@
                };
             };
          };
-         new GuiPanel() {
+         new GuiPanel(AssetBrowser_AssetsPanel) {
             docking = "Client";
             margin = "0 0 0 0";
             padding = "0 0 0 0";
@@ -530,7 +554,7 @@
             minExtent = "16 16";
             horizSizing = "right";
             vertSizing = "bottom";
-            profile = "ToolsGuiDefaultProfile";
+            profile = "ToolsGuiSolidDefaultProfile";
             visible = "1";
             active = "1";
             tooltipProfile = "GuiToolTipProfile";
@@ -548,7 +572,7 @@
                anchorLeft = "1";
                anchorRight = "0";
                position = "1 0";
-               extent = "354 41";
+               extent = "354 19";
                minExtent = "8 2";
                horizSizing = "width";
                vertSizing = "bottom";
@@ -561,65 +585,13 @@
                canSave = "1";
                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) {
                   historySize = "0";
                   tabComplete = "0";
                   sinkAllKeyEvents = "0";
                   password = "0";
                   passwordMask = "*";
-                  text = "\c2Filter...";
+                  text = "Search Assets...";
                   maxLength = "1024";
                   margin = "0 0 0 0";
                   padding = "0 0 0 0";
@@ -627,8 +599,8 @@
                   anchorBottom = "0";
                   anchorLeft = "1";
                   anchorRight = "0";
-                  position = "62 19";
-                  extent = "273 18";
+                  position = "21 1";
+                  extent = "314 18";
                   minExtent = "8 2";
                   horizSizing = "width";
                   vertSizing = "bottom";
@@ -638,12 +610,12 @@
                   tooltipProfile = "GuiToolTipProfile";
                   hovertime = "1000";
                   isContainer = "1";
-                  class = "AssetBrowserSearchFilterText";
+                  class = "AssetBrowserSearchFilterTxt";
                   canSave = "1";
                   canSaveDynamicFields = "0";
                };
-               new GuiBitmapButtonCtrl(TagFilterButton) {
-                  bitmap = "tools/gui/images/visible";
+               new GuiBitmapButtonCtrl(AssetBrowser_ClearAssetFilterBtn) {
+                  bitmap = "tools/gui/images/clear-icon";
                   bitmapMode = "Stretched";
                   autoFitExtents = "0";
                   useModifiers = "0";
@@ -652,46 +624,49 @@
                   groupNum = "-1";
                   buttonType = "PushButton";
                   useMouseEvents = "0";
-                  position = "4 19";
-                  extent = "20 20";
+                  position = "321 1";
+                  extent = "15 15";
                   minExtent = "8 2";
-                  horizSizing = "right";
+                  horizSizing = "left";
                   vertSizing = "bottom";
-                  profile = "ToolsGuiDefaultProfile";
+                  profile = "ToolsGuiSolidDefaultProfile";
                   visible = "1";
                   active = "1";
-                  command = "AssetBrowser.toggleTagFilterPopup();";
                   tooltipProfile = "GuiToolTipProfile";
+                  tooltip = "Create New Asset";
                   hovertime = "1000";
                   isContainer = "0";
                   canSave = "1";
                   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";
                   horizSizing = "right";
                   vertSizing = "bottom";
-                  profile = "ToolsGuiDefaultProfile";
+                  profile = "ToolsGuiSolidDefaultProfile";
                   visible = "1";
                   active = "1";
+                  command = "AssetBrowser.toggleFolderCollapseButton();";
                   tooltipProfile = "GuiToolTipProfile";
+                  tooltip = "Toggles the display of the folders panel";
                   hovertime = "1000";
-                  isContainer = "1";
+                  isContainer = "0";
                   canSave = "1";
                   canSaveDynamicFields = "0";
                };
-               new GuiBitmapButtonCtrl() {
-                  bitmap = "tools/gui/images/delete";
+               new GuiBitmapButtonCtrl(AssetBrowser_FilterOptionsBtn) {
+                  bitmap = "tools/gui/images/filter.png";
                   bitmapMode = "Stretched";
                   autoFitExtents = "0";
                   useModifiers = "0";
@@ -700,17 +675,17 @@
                   groupNum = "-1";
                   buttonType = "PushButton";
                   useMouseEvents = "0";
-                  position = "337 22";
+                  position = "337 1";
                   extent = "15 15";
                   minExtent = "8 2";
                   horizSizing = "left";
                   vertSizing = "bottom";
-                  profile = "ToolsGuiDefaultProfile";
+                  profile = "ToolsGuiSolidDefaultProfile";
                   visible = "1";
                   active = "1";
-                  command = "AssetBrowser.showDeleteDialog();";
+                  command = "AssetBrowser.showFilterOptions();";
                   tooltipProfile = "GuiToolTipProfile";
-                  tooltip = "Delete Asset";
+                  tooltip = "Filter Options";
                   hovertime = "1000";
                   isContainer = "0";
                   canSave = "1";
@@ -724,12 +699,12 @@
                anchorBottom = "0";
                anchorLeft = "1";
                anchorRight = "1";
-               position = "1 40";
-               extent = "354 468";
+               position = "1 17";
+               extent = "354 487";
                minExtent = "8 2";
                horizSizing = "width";
                vertSizing = "height";
-               profile = "ToolsGuiDefaultProfile";
+               profile = "ToolsGuiSolidDefaultProfile";
                visible = "1";
                active = "1";
                tooltipProfile = "GuiToolTipProfile";
@@ -755,19 +730,35 @@
                   anchorLeft = "1";
                   anchorRight = "0";
                   position = "0 0";
-                  extent = "354 448";
+                  extent = "354 467";
                   minExtent = "8 8";
                   horizSizing = "width";
                   vertSizing = "height";
                   profile = "GuiEditorScrollProfile";
                   visible = "1";
                   active = "1";
-                  tooltipProfile = "ToolsGuiDefaultProfile";
+                  tooltipProfile = "ToolsGuiSolidDefaultProfile";
                   hovertime = "1000";
                   isContainer = "1";
                   canSave = "1";
                   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() {
                      stackingType = "Vertical";
                      horizStacking = "Left to Right";
@@ -778,8 +769,8 @@
                      dynamicPos = "0";
                      changeChildSizeToFit = "1";
                      changeChildPosition = "0";
-                     position = "1 1";
-                     extent = "352 254";
+                     position = "2 1";
+                     extent = "339 124";
                      minExtent = "16 16";
                      horizSizing = "width";
                      vertSizing = "bottom";
@@ -792,25 +783,10 @@
                      canSave = "1";
                      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() {
                         colCount = "3";
                         colSize = "100";
-                        rowCount = "2";
+                        rowCount = "1";
                         rowSize = "124";
                         rowSpacing = "2";
                         colSpacing = "2";
@@ -819,8 +795,8 @@
                         fillRowFirst = "1";
                         dynamicSize = "1";
                         padding = "0 0 0 0";
-                        position = "3 4";
-                        extent = "352 250";
+                        position = "3 0";
+                        extent = "339 124";
                         minExtent = "8 8";
                         horizSizing = "width";
                         vertSizing = "bottom";
@@ -830,7 +806,7 @@
                         tooltipProfile = "GuiToolTipProfile";
                         hovertime = "1000";
                         isContainer = "1";
-                        internalName = "materialSelection";
+                        internalName = "assetList";
                         canSave = "1";
                         canSaveDynamicFields = "0";
                      };
@@ -844,12 +820,12 @@
                   anchorBottom = "0";
                   anchorLeft = "1";
                   anchorRight = "0";
-                  position = "0 448";
+                  position = "0 467";
                   extent = "354 20";
                   minExtent = "8 2";
                   horizSizing = "width";
                   vertSizing = "height";
-                  profile = "ToolsGuiDefaultProfile";
+                  profile = "ToolsGuiSolidDefaultProfile";
                   visible = "1";
                   active = "1";
                   tooltipProfile = "GuiToolTipProfile";
@@ -859,13 +835,35 @@
                   canSave = "1";
                   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() {
                text = "Select";
                groupNum = "-1";
                buttonType = "PushButton";
                useMouseEvents = "0";
-               position = "242 491";
+               position = "301 488";
                extent = "53 19";
                minExtent = "8 2";
                horizSizing = "left";
@@ -882,26 +880,6 @@
                canSave = "1";
                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";
          canSaveDynamicFields = "0";
       };
-      new GuiScrollCtrl() {
+      new GuiScrollCtrl(ImportAssetConfigEditorScroll) {
          willFirstRespond = "1";
          hScrollBar = "dynamic";
          vScrollBar = "dynamic";

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

@@ -30,6 +30,32 @@ function initializeAssetBrowser()
 {
    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/addModuleWindow.gui");
    exec("./guis/gameObjectCreator.gui");
@@ -67,6 +93,9 @@ function initializeAssetBrowser()
    exec("./scripts/assetTypes/sound.cs"); 
    exec("./scripts/assetTypes/stateMachine.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/listField.cs");

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

@@ -44,15 +44,28 @@ function AssetBrowser::onWake(%this)
    if(!isObject(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.importAssetUnprocessedListArray = new ArrayObject();
    %this.importAssetFinalListArray = new ArrayObject();
    
    %this.isReImportingAsset = false;
    %this.coreModulesFilter = false;
+   %this.toolsModulesFilter = false;
    %this.onlyShowModulesWithAssets = false;
    %this.treeFilterMode = "list";
    
+   %this.folderPanelState = true;
+   %this.folderPanelSplit = 0;
+   
    %this.templateFilesPath = "tools/assetBrowser/scripts/templateFiles/";
    
    //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?",
          "AssetBrowser.ImportTemplateModules();", "" );
    }
+   
+   %this.setPreviewSize(EditorSettings.value("Assets/Browser/previewTileSize", "small"));
 }
 
 //Filters
@@ -87,18 +102,60 @@ function AssetBrowser::showFilterPopup(%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();
 }
 
 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();
 }
@@ -115,7 +172,12 @@ function AssetBrowser::viewTagsFilter(%this)
    AssetBrowser.loadFilters();
 }
 
-//Drag-Drop functionality
+function AssetBrowser::toggleAssetTypeFilter(%assetTypeIdx)
+{
+   %isChecked = AssetTypeListPopup.isItemChecked(%assetTypeIdx);
+   AssetTypeListPopup.checkItem(%assetTypeIdx, !%isChecked);
+}
+
 function AssetBrowser::selectAsset( %this, %asset )
 {
    if(AssetBrowser.selectCallback !$= "")
@@ -189,20 +251,43 @@ function AssetBrowser::buildPreviewArray( %this, %asset, %moduleName )
       %this.previewData = new ScriptObject();      
    }
    
-   %assetDesc = AssetDatabase.acquireAsset(%asset);
-   %assetName = AssetDatabase.getAssetName(%asset);
+   AssetPreviewArray.empty();
+   
    %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
    // reason being its because we need to store the checkbox ctrl in order to make changes
    // 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(){
       profile = "ToolsGuiDefaultProfile";
@@ -310,6 +395,12 @@ function AssetBrowser::buildPreviewArray( %this, %asset, %moduleName )
       %buildCommand = %this @ ".build" @ %assetType @ "Preview(" @ %assetDesc @ "," @ %this.previewData @ ");";
       eval(%buildCommand);
       
+      //debug dump
+      %tooltip = %this.previewData.tooltip;
+      %assetName = %this.previewData.assetName;
+      %previewImage = %this.previewData.previewImage;
+      %doubleClickCommand = %this.previewData.doubleClickCommand;
+      
       %previewButton = new GuiBitmapButtonCtrl()
       {
          className = "AssetPreviewControl";
@@ -376,23 +467,198 @@ function AssetBrowser::buildPreviewArray( %this, %asset, %moduleName )
    %container.add(%previewNameCtrl);
    
    // add to the gui control array
-   AssetBrowser-->materialSelection.add(%container);
+   AssetBrowser-->assetList.add(%container);
    
    // add to the array object for reference later
    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 )
 {
    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();
    
-   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
       %modulesList = ModuleDatabase.findModules(true);
@@ -457,9 +723,9 @@ function AssetBrowser::loadFilters( %this )
    else if(%this.treeFilterMode $= "tags")
    {
       
-   }
+   }*/
    
-   %this.collapseTree();
+   //%this.collapseTree();
    
    //Remove any modules that have no assets if we have that filter on
    if(%this.onlyShowModulesWithAssets)
@@ -484,7 +750,12 @@ function AssetBrowser::loadFilters( %this )
       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.buildVisibleTree(); 
@@ -541,9 +812,12 @@ function AssetBrowser::createFilter( %this, %filter )
 
 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;
    eval("%isAssetBorder = isObject(AssetBrowser-->"@%asset@"Border);");
@@ -786,11 +1060,14 @@ function AssetBrowser::reImportAsset(%this)
    }
 }
 
-//------------------------------------------------------------------------------
+//
+//
+// RMB context popups
 function AssetPreviewButton::onRightClick(%this)
 {
    AssetBrowser.selectedAssetPreview = %this.getParent();
    EditAssetPopup.assetId = %this.getParent().moduleName @ ":" @ %this.getParent().assetName;
+   EditAssetPopup.assetType = %this.getParent().assetType;
    %assetType = %this.getParent().assetType;
    
    //Do some enabling/disabling of options depending on asset type
@@ -813,16 +1090,90 @@ function AssetPreviewButton::onRightClick(%this)
    
    if(%assetType $= "LevelAsset")
       EditLevelAssetPopup.showPopup(Canvas);  
+   else if(%assetType $= "Folder")
+      EditFolderPopup.showPopup(Canvas);  
    else
       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);
 }
 
-//------------------------------------------------------------------------------
+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)
 {
    AssetBrowserFilterTree.onSelect(AssetBrowser.selectedItem);
@@ -836,80 +1187,65 @@ function AssetBrowserFilterTree::onSelect(%this, %itemId)
 		
    //Make sure we have an actual module selected!
    %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
-      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
+   AssetBrowser-->assetList.deleteAllObjects();
    AssetPreviewArray.empty();
-   AssetBrowser-->materialSelection.deleteAllObjects();
-   //AssetBrowser-->materialPreviewPagesStack.deleteAllObjects();
 
    %assetArray = new ArrayObject();
-
+   
    //First, Query for our assets
    %assetQuery = new 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
     for( %i=0; %i < %numAssetsFound; %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);
 			if(%assetType $= "")
 			{
 			   %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)
-			{
+			{*/
 				//stop adding after previewsPerPage is hit
 				%assetName = AssetDatabase.getAssetName(%assetId);
 				
 				%searchText = AssetBrowserSearchFilter.getText();
-				if(%searchText !$= "\c2Filter...")
+				if(%searchText !$= "Search Assets...")
 				{
 					if(strstr(strlwr(%assetName), strlwr(%searchText)) != -1)
 						%assetArray.add( %moduleName, %assetId);
@@ -919,61 +1255,45 @@ function AssetBrowserFilterTree::onSelect(%this, %itemId)
 					//got it.	
 					%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();
    if( %filter $= "" )
@@ -982,45 +1302,175 @@ function AssetBrowserSearchFilterText::onWake( %this )
       %this.setText( %filter );*/
 }
 
-//------------------------------------------------------------------------------
-
-function AssetBrowserSearchFilterText::onGainFirstResponder( %this )
+function AssetBrowserSearchFilterTxt::onGainFirstResponder( %this )
 {
    %this.selectAllText();
 }
 
-//---------------------------------------------------------------------------------------------
-
 // When Enter is pressed in the filter text control, pass along the text of the control
 // as the treeview's filter.
-function AssetBrowserSearchFilterText::onReturn( %this )
+function AssetBrowserFolderSearchFilter::onReturn( %this )
 {
    %text = %this.getText();
    if( %text $= "" )
       %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");
 }
+
+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)
 {
    %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
    Canvas.pushDialog(AssetImportCtrl);
    AssetImportCtrl.setHidden(true);
+
    ImportAssetTree.clear();
    ImportAssetTree.insertItem(0, "Importing Assets");
    AssetBrowser.unprocessedAssetsCount = 0;
@@ -161,136 +162,39 @@ function AssetBrowser::onDropZipFile(%this, %filePath)
    }
 }
 
-function AssetBrowser::onDropImageFile(%this, %filePath)
+function AssetBrowser::onEndDropFiles( %this )
 {
    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 ) );
+   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
    GuiFormManager::SendContentMessage($LBCreateSiderBar, %this, "refreshAll 1");
    
@@ -503,9 +407,6 @@ function ImportAssetWindow::onWake(%this)
    //Lets refresh our list
    if(!ImportAssetWindow.isVisible())
       return;
-      
-   $AssetBrowser::importConfigsFile = "tools/assetBrowser/assetImportConfigs.xml";
-   $AssetBrowser::currentImportConfig = "";
    
    if(!isObject(AssetImportSettings))
    {
@@ -526,7 +427,11 @@ function ImportAssetWindow::onWake(%this)
 
 function ImportAssetWindow::reloadImportOptionConfigs(%this)
 {
-   ImportAssetWindow.importConfigsList = new ArrayObject();
+   if(!isObject(ImportAssetWindow.importConfigsList))
+      ImportAssetWindow.importConfigsList = new ArrayObject();
+   else
+      ImportAssetWindow.importConfigsList.empty();
+      
    ImportAssetConfigList.clear();
    
    %xmlDoc = new SimXMLDocument();
@@ -1168,10 +1073,12 @@ function ImportAssetWindow::validateAssets(%this)
    //Clear any status
    %this.resetAssetsValidationStatus();
    
+   ImportAssetWindow.importIssues = false;
+   
    %id = ImportAssetTree.getChild(1);
    %hasIssues = %this.validateAsset(%id);
    
-   if(%hasIssues)
+   if(ImportAssetWindow.importIssues == false)
       return false;
    else
       return true;
@@ -1179,6 +1086,7 @@ function ImportAssetWindow::validateAssets(%this)
 
 function ImportAssetWindow::validateAsset(%this, %id)
 {
+   
    %moduleName = ImportAssetModuleList.getText();
    
    while (%id > 0)
@@ -1229,21 +1137,17 @@ function ImportAssetWindow::validateAsset(%this, %id)
             {
                %foundCollision = true;
                
-               %assetItem.status = "Warning";
+               %assetItem.status = "error";
                %assetItem.statusType = "DuplicateAsset";
                %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!";
                   
-               //Clean up our queries
-               %assetQuery.delete();
                break;
             }
          }
          
          if(%foundCollision == true)
          {
-            %hasIssues = true;
-            
             //yup, a collision, prompt for the change and bail out
             /*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!");*/
@@ -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
       if(%assetItem.filePath !$= ""  && !%assetItem.generatedAsset && !isFile(%assetItem.filePath))
       {
-         %hasIssues = true;  
          %assetItem.status = "error";
          %assetItem.statusType = "MissingFile";
          %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))
       {
          %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.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()
@@ -428,8 +430,9 @@ function ImportOptionsConfigList::changeEditorSetting(%this, %varName, %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);
    

+ 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;
    
-   %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()
    {

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

@@ -117,7 +117,7 @@ function AssetBrowser::importImageAsset(%this, %assetItem)
    %assetImportSuccessful = false;
    %assetId = %moduleName@":"@%assetName;
    
-   %assetPath = "data/" @ %moduleName @ "/Images";
+   %assetPath = AssetBrowser.currentAddress @ "/";
    %assetFullPath = %assetPath @ "/" @ fileName(%filePath);
    
    %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;
    
-   %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()
    {
       AssetName = %assetName;
       versionId = 1;
       LevelFile = %assetName @ ".mis";
+      DecalsFile = %assetName @ ".mis.decals";
+      PostFXPresetFile = %assetName @ ".postfxpreset.cs";
+      ForestFile = %assetName @ ".forest";
+      NavmeshFile = %assetName @ ".nav";
       LevelName = AssetBrowser.newAssetSettings.levelName;
       AssetDescription = AssetBrowser.newAssetSettings.description;
       PreviewImage = AssetBrowser.newAssetSettings.levelPreviewImage;
@@ -24,6 +30,10 @@ function AssetBrowser::createLevelAsset(%this)
    {
       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);
 	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;
    %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()
    {

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

@@ -3,10 +3,12 @@ function AssetBrowser::createScriptAsset(%this)
    %moduleName = AssetBrowser.newAssetSettings.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()
    {

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

@@ -5,8 +5,10 @@ function AssetBrowser::createShapeAsset(%this)
       
    %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()
    {

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

@@ -1,5 +1,38 @@
 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)

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

@@ -1,9 +1,70 @@
 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)
 {
+   TerrainMaterialDlg.show(0, 0, 0);
+   TerrainMaterialDlg.setActiveMaterial(%assetDef.assetName);
 }
 
 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)
 {
    //Find out what type it is
-   %assetDef = AssetDatabase.acquireAsset(EditAssetPopup.assetId);
+   //%assetDef = AssetDatabase.acquireAsset(EditAssetPopup.assetId);
    
    %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(%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
    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)
@@ -132,6 +152,26 @@ function AssetNameField::onReturn(%this)
    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)
@@ -157,10 +197,10 @@ function AssetBrowser::duplicateAsset(%this, %targetModule)
 function AssetBrowser::deleteAsset(%this)
 {
    //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();", "");
 }
 
@@ -169,14 +209,23 @@ function AssetBrowser::confirmDeleteAsset(%this)
    %currentSelectedItem = AssetBrowserFilterTree.getSelectedItem();
    %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();
    

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

@@ -191,6 +191,18 @@ function CreateNewAsset()
       %callbackCommand = "" @ AssetBrowser_newAsset.callbackFunc @ "(\"" @ %moduleName @ ":" @ %assetName @ "\");";
       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)

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

@@ -14,7 +14,8 @@ function AssetBrowser::buildPopupMenus(%this)
       
       AddNewModulePopup.enableItem(1, false);
    }
-      
+   
+     
    if( !isObject( EditAssetPopup ) )
    {
       new PopupMenu( EditAssetPopup )
@@ -55,9 +56,9 @@ function AssetBrowser::buildPopupMenus(%this)
          item[ 5 ] = "-";
          Item[ 6 ] = "Duplicate Asset" TAB "" TAB "AssetBrowser.duplicateAsset();";
          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 = "";
          jumpLineNumber = "";
@@ -105,20 +106,23 @@ function AssetBrowser::buildPopupMenus(%this)
          //isPopup = true;
 
          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";
          class = "EditorWorldMenu";
          
-         item[0] = "Create Code Asset" TAB AddNewScriptAssetPopup;
+         item[0] = "Create Folder" TAB "" TAB "AssetBrowser.CreateNewFolder();";
          item[1] = "-";
-         item[2] = "Create Art Asset" TAB AddNewArtAssetPopup;
+         item[2] = "Create Code Asset" TAB AddNewScriptAssetPopup;
          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[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[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
-   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 ) )
    {
@@ -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
    if( !isObject( BrowserVisibilityPopup ) )
    {
@@ -208,13 +263,26 @@ function AssetBrowser::buildPopupMenus(%this)
          //isPopup = true;
          
          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
    if( !isObject( ImportAssetsPopup ) )
    {
@@ -266,6 +334,7 @@ function AssetBrowser::buildPopupMenus(%this)
       
       };
    }
+
 }
 
 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";
       horizSizing = "center";
       vertSizing = "center";
-      profile = "ToolsGuiDefaultProfile";
+      profile = "ToolsGuiSolidDefaultProfile";
       visible = "1";
       active = "1";
       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("NavEditor", "Navigation Editor");
    %this.addEditorSettingsPage("Theme", "Theme");
+   %this.addEditorSettingsPage("AssetEditing", "Asset Editing");
    
    %this.addGameSettingsPage("GameGeneral", "General");
    %this.addGameSettingsPage("Gameplay", "Gameplay");
@@ -185,7 +186,7 @@ function SettingsInspector::changeEditorSetting(%this, %varName, %value)
       %success = ProjectSettings.write();
       
    if(%oldValue !$= %value)
-      ESettingsWindow.refresh();
+      ESettingsWindow.schedule(15,"refresh");
 }
 
 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/mainTextColor", "Main Text Color", "colorI", "");
    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)
@@ -380,6 +387,7 @@ function ESettingsWindow::getThemeSettings(%this)
    SettingsInspector.addSettingsField("Theme/fieldTextColor", "Field Text Color", "ColorI", "");
    SettingsInspector.addSettingsField("Theme/fieldTextHLColor", "Field Text Highlight 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/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/datablockCaching", "Cache Datablocks", "bool", "");
    //SettingsInspector.addSettingsField("AssetManagement/Assets/moduleExtension", "Module Extension", "string", "");
+   
    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)
 {
    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;
 
    // fill color
-   opaque = true;
+   opaque = false;
    fillColor = EditorSettings.value("Theme/tabsColor");
    fillColorHL = EditorSettings.value("Theme/tabsGLColor");
    fillColorSEL = EditorSettings.value("Theme/tabsSELColor");
@@ -79,7 +79,7 @@ new GuiControlProfile (ToolsGuiDefaultProfile)
 };
 
 if( !isObject( ToolsGuiSolidDefaultProfile ) )
-new GuiControlProfile (ToolsGuiSolidDefaultProfile)
+new GuiControlProfile (ToolsGuiSolidDefaultProfile : ToolsGuiDefaultProfile)
 {
    opaque = true;
    border = true;
@@ -1109,7 +1109,7 @@ singleton GuiControlProfile( ToolsGuiMenuBarProfile )
    fontColor = EditorSettings.value("Theme/headerTextColor");
    fontColorSEL = EditorSettings.value("Theme/fieldTextSELColor");
    fontColorHL = EditorSettings.value("Theme/fieldTextHLColor");
-   fontColorNA = EditorSettings.value("Theme/fieldTextSELColor");
+   fontColorNA = EditorSettings.value("Theme/fieldTextNAColor");
    border = 0;
    borderThickness = 1;
    opaque = true;
@@ -1123,6 +1123,8 @@ singleton GuiControlProfile( ToolsMenubarProfile : ToolsGuiDefaultProfile )
    bitmap = "./menubar";
    category = "Editor";
    
+   opaque = true;
+   
    fillColor = EditorSettings.value("Theme/headerColor");
    fontColor = EditorSettings.value("Theme/headerTextColor");
    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" ?>
 <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">
-        <Setting name="DefaultNormal">0 0 1</Setting>
-        <Setting name="DefaultWidth">10</Setting>
         <Setting name="HoverSplineColor">255 0 0 255</Setting>
+        <Setting name="SelectedSplineColor">0 255 0 255</Setting>
         <Setting name="sideMaterialName">DefaultRoadMaterialOther</Setting>
+        <Setting name="DefaultWidth">10</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 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="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="fieldBGHLColor">72 70 68 255</Setting>
+        <Setting name="dividerMidColor">50 49 48 255</Setting>
         <Setting name="tooltipBGColor">43 43 43 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="fieldBGSELColor">100 98 96 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>
-    </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 name="GuiEditor">
-        <Setting name="lastPath">tools/gui</Setting>
+        <Setting name="lastPath">tools/worldEditor/gui</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">
             <Setting name="viewType">Categorized</Setting>
         </Group>
         <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="snapToGuides">1</Setting>
+            <Setting name="snapToCenters">1</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="snapToGuides">1</Setting>
+        </Group>
+        <Group name="Rendering">
+            <Setting name="drawGuides">1</Setting>
+            <Setting name="drawBorderLines">1</Setting>
         </Group>
         <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="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 name="Selection">
             <Setting name="fullBox">0</Setting>
         </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 name="WorldEditor">
+        <Setting name="forceLoadDAE">0</Setting>
+        <Setting name="torsionPath">AssetWork_Debug.exe</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="torsionPath">AssetWork_Debug.exe</Setting>
-        <Setting name="forceLoadDAE">0</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 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 name="Grid">
-            <Setting name="gridMinorColor">51 51 51 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="gridSnap">0</Setting>
+            <Setting name="gridMinorColor">51 51 51 100</Setting>
+            <Setting name="gridSize">1</Setting>
+            <Setting name="gridSnap">1</Setting>
         </Group>
         <Group name="ObjectIcons">
-            <Setting name="fadeIconsEndDist">20</Setting>
-            <Setting name="fadeIconsStartDist">8</Setting>
             <Setting name="fadeIcons">1</Setting>
+            <Setting name="fadeIconsStartDist">8</Setting>
+            <Setting name="fadeIconsEndDist">20</Setting>
             <Setting name="fadeIconsEndAlpha">0</Setting>
             <Setting name="fadeIconsStartAlpha">255</Setting>
         </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">
-            <Setting name="boundingBoxCollision">0</Setting>
             <Setting name="dropAtScreenCenterScalar">1</Setting>
+            <Setting name="TerrainSnapOffsetZ">0</Setting>
+            <Setting name="OffsetZValue">0.01</Setting>
             <Setting name="objectsUseBoxCenter">1</Setting>
+            <Setting name="boundingBoxCollision">0</Setting>
             <Setting name="dropAtScreenCenterMax">100</Setting>
-            <Setting name="snapSoftSize">2</Setting>
-            <Setting name="snapSoft">0</Setting>
             <Setting name="snapGround">0</Setting>
+            <Setting name="snapSoft">0</Setting>
+            <Setting name="snapSoftSize">2</Setting>
         </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 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 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 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 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 name="NavEditor">
+        <Setting name="backgroundBuild">1</Setting>
+        <Setting name="spawnDatablock">DefaultPlayerData</Setting>
+        <Setting name="SpawnClass">AIPlayer</Setting>
+    </Group>
     <Group name="RiverEditor">
         <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="SelectedSplineColor">0 255 0 255</Setting>
         <Setting name="DefaultWidth">10</Setting>
         <Setting name="DefaultDepth">5</Setting>
+        <Setting name="HoverNodeColor">255 255 255 255</Setting>
+        <Setting name="SelectedSplineColor">0 255 0 255</Setting>
     </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 name="RoadEditor">
-        <Setting name="HoverNodeColor">255 255 255 255</Setting>
-        <Setting name="DefaultWidth">10</Setting>
         <Setting name="materialName">DefaultDecalRoadMaterial</Setting>
+        <Setting name="DefaultWidth">10</Setting>
         <Setting name="SelectedSplineColor">0 255 0 255</Setting>
+        <Setting name="HoverNodeColor">255 255 255 255</Setting>
     </Group>
     <Group name="ConvexEditor">
         <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 )
 {   
    %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.clear();
@@ -313,8 +327,8 @@ function CreateNewTerrainGui::onWake( %this )
    %rezList.add( "512", 512 );
    %rezList.add( "1024", 1024 );
    %rezList.add( "2048", 2048 );
-   //%rezList.add( "4096", 4096 );
-   %rezList.setSelected( 256 );
+   %rezList.add( "4096", 4096 );
+   %rezList.setSelected( 512 );
    
    %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);
 }
 
+//------------------------------------------------------------------------------
+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)
@@ -489,6 +560,9 @@ function ObjectBuilderGui::process(%this)
 
          case "TypeFile":
             %this.createFileType(%i);
+            
+         case "TypeTerrainAsset":
+            %this.createTerrainAssetType(%i);
 
          case "TypeMaterialName":
             %this.createMaterialNameType(%i);
@@ -830,6 +904,7 @@ function ObjectBuilderGui::buildTerrainBlock(%this)
    %this.createCallback = "ETerrainEditor.attachTerrain();";
 
    %this.addField("terrainFile", "TypeFile", "Terrain file", "", "*.ter");
+   %this.addField("terrainAsset", "TypeTerrainAsset", "Terrain Asset", "", "");
    %this.addField("squareSize", "TypeInt", "Square size", "8");
 
    %this.process();

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

@@ -1885,6 +1885,9 @@ function Editor::open(%this)
    Canvas.setContent(EditorGui);   
    $isFirstPersonVar = true;
    EditorGui.syncCameraGui();
+   
+   if(EditorSettings.value("WorldEditor/Layout/LayoutMode", "Classic") $= "Modern")
+      togglePanelLayout();
 }
 
 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
-GlobalActionMap.bind(keyboard, "f11", toggleEditor);
+GlobalActionMap.bind(keyboard, "f11", fastLoadWorldEdit);
 
 
 // The scenario:

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

@@ -60,6 +60,8 @@ EditorSettings.endGroup();
 
 EditorSettings.beginGroup( "Tools" );
 EditorSettings.setDefaultValue(  "snapGround",              "0"               );
+EditorSettings.setDefaultValue(  "TerrainSnapOffsetZ",      "0"               );
+EditorSettings.setDefaultValue(  "OffsetZValue",            "0.01"             );
 EditorSettings.setDefaultValue(  "snapSoft",                "0"               );
 EditorSettings.setDefaultValue(  "snapSoftSize",            "2.0"             );
 EditorSettings.setDefaultValue(  "boundingBoxCollision",    "0"               );
@@ -215,6 +217,8 @@ function EditorGui::readWorldEditorSettings(%this)
    
    EditorSettings.beginGroup( "Tools" );
    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.setSoftSnapSize( EditorSettings.value("snapSoftSize") );                        //$pref::WorldEditor::snapSoftSize
    EWorldEditor.boundingBoxCollision      = EditorSettings.value("boundingBoxCollision");       //$pref::WorldEditor::boundingBoxCollision;
@@ -310,6 +314,8 @@ function EditorGui::writeWorldEditorSettings(%this)
 
    EditorSettings.beginGroup( "Tools" );
    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( "snapSoftSize",           EWorldEditor.getSoftSnapSize() );      //$Pref::WorldEditor::snapSoftSize
    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 ) )
       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.
    %this.snapshotMaterials();
 
@@ -292,12 +306,33 @@ function TerrainMaterialDlg::changeNormal( %this )
    %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 )
 {
    // Create a unique material name.
-   %matName = getUniqueInternalName( "newMaterial", TerrainMaterialSet, true );
+   /*%matName = getUniqueInternalName( "newMaterial", TerrainMaterialSet, true );
 
    // Create the new material.
    %newMat = new TerrainMaterial()
@@ -308,12 +343,16 @@ function TerrainMaterialDlg::newMat( %this )
    %newMat.setFileName( "art/terrains/materials.cs" );
    
    // 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{
          %this-->baseTexCtrl.setBitmap( %mat.diffuseMap ); 
       }
+      if (%mat.pbrConfigMap $= ""){
+         %this-->pbrConfigTexCtrl.setBitmap( "tools/materialEditor/gui/unknownImage" );
+      }else{
+         %this-->pbrConfigTexCtrl.setBitmap( %mat.pbrConfigMap );
+      }
       if (%mat.detailMap $= ""){
          %this-->detailTexCtrl.setBitmap( "tools/materialEditor/gui/unknownImage" );
       }else{
@@ -438,6 +482,11 @@ function TerrainMaterialDlg::saveDirtyMaterial( %this, %mat )
    }else{
       %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"){
       %newDetail = "";
    }else{
@@ -466,6 +515,7 @@ function TerrainMaterialDlg::saveDirtyMaterial( %this, %mat )
          %mat.diffuseMap $= %newDiffuse &&
          %mat.normalMap $= %newNormal &&
          %mat.detailMap $= %newDetail &&
+         %mat.pbrConfigMap $= %newPBRConfig &&
          %mat.macroMap $= %newMacro &&
          %mat.detailSize == %detailSize &&
          %mat.diffuseSize == %diffuseSize &&
@@ -497,7 +547,8 @@ function TerrainMaterialDlg::saveDirtyMaterial( %this, %mat )
    }
    
    %mat.diffuseMap = %newDiffuse;    
-   %mat.normalMap = %newNormal;    
+   %mat.normalMap = %newNormal;   
+   %mat.pbrConfigMap = %newPBRConfig; 
    %mat.detailMap = %newDetail;    
    %mat.macroMap = %newMacro;
    %mat.detailSize = %detailSize;  
@@ -543,6 +594,7 @@ function TerrainMaterialDlg::snapshotMaterials( %this )
          internalName = %mat.internalName;
          diffuseMap = %mat.diffuseMap;
          normalMap = %mat.normalMap;
+         pbrConfigMap = %mat.pbrConfigMap;
          detailMap = %mat.detailMap;
          macroMap = %mat.macroMap;
          detailSize = %mat.detailSize;
@@ -577,6 +629,7 @@ function TerrainMaterialDlg::restoreMaterials( %this )
       %mat.setInternalName( %obj.internalName );
       %mat.diffuseMap = %obj.diffuseMap;
       %mat.normalMap = %obj.normalMap;
+      %mat.pbrConfigMap = %obj.pbrConfigMap;
       %mat.detailMap = %obj.detailMap;
       %mat.macroMap = %obj.macroMap;
       %mat.detailSize = %obj.detailSize;

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

@@ -280,7 +280,17 @@ function EditorSaveMission()
       initContainerTypeSearch($TypeMasks::TerrainObjectType);
 
       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();

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

@@ -20,7 +20,7 @@
 // IN THE SOFTWARE.
 //-----------------------------------------------------------------------------
 // Debug Shaders.
-new ShaderData( AL_ColorBufferShader )
+singleton shaderData( AL_ColorBufferShader )
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.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";
    DXPixelShaderFile  = "./shaders/dbgSpecMapVisualizeP.hlsl";
@@ -94,7 +94,7 @@ function toggleSpecMapViz( %enable )
       AL_SpecMapVisualize.disable();    
 }
 
-new GFXStateBlockData( AL_DepthVisualizeState )
+singleton GFXStateBlockData( AL_DepthVisualizeState )
 {
    zDefined = true;
    zEnable = false;
@@ -105,7 +105,7 @@ new GFXStateBlockData( AL_DepthVisualizeState )
    samplerStates[1] = SamplerClampLinear; // viz color lookup
 };
 
-new GFXStateBlockData( AL_DefaultVisualizeState )
+singleton GFXStateBlockData( AL_DefaultVisualizeState )
 {
    blendDefined = true;
    blendEnable = true;
@@ -121,7 +121,7 @@ new GFXStateBlockData( AL_DefaultVisualizeState )
    samplerStates[1] = SamplerClampLinear;  // depthviz
 };
 
-new ShaderData( AL_DepthVisualizeShader )
+singleton shaderData( AL_DepthVisualizeShader )
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXPixelShaderFile  = "./shaders/dbgDepthVisualizeP.hlsl";
@@ -157,7 +157,7 @@ function AL_DepthVisualize::onEnabled( %this )
    return true;
 }
 
-new ShaderData( AL_GlowVisualizeShader )
+singleton shaderData( AL_GlowVisualizeShader )
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
    DXPixelShaderFile  = "./shaders/dbgGlowVisualizeP.hlsl";
@@ -178,7 +178,7 @@ singleton PostEffect( AL_GlowVisualize )
    renderPriority = 9999;
 };
 
-new ShaderData( AL_NormalsVisualizeShader )
+singleton shaderData( AL_NormalsVisualizeShader )
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.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";
    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";
    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;
    alphaTestEnable = true;
@@ -39,7 +39,7 @@ new GFXStateBlockData( Viz_DefaultVisualizeState )
    samplerStates[4] = SamplerClampLinear;  // depthviz
 };
 
-new ShaderData( Viz_TexelDensity )
+singleton shaderData( Viz_TexelDensity )
 {
    DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.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";
    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";
    DXPixelShaderFile  = "./shaders/Viz_ColorblindnessP.hlsl";
@@ -307,7 +307,7 @@ function Viz_ColorBlindnessPFX::onEnabled( %this )
 
 //
 //Material Complexity Viz
-new ShaderData( Viz_MaterialComplexity )
+singleton shaderData( Viz_MaterialComplexity )
 {
    DXVertexShaderFile   = "./shaders/Viz_materialComplexityV.hlsl";
    DXPixelShaderFile    = "./shaders/Viz_materialComplexityP.hlsl";

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

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

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

@@ -2,7 +2,7 @@
 
 :: Delete procedural shaders
 echo shaders
-del /q /a:-R shaders\procedural\*.*
+del /q /a:-R data\shaderCachel\*.*
 :: Delete dumped shader disassembly files
 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 "client\config.cs" del /s client\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
 
 :: logs
 echo logs
 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