瀏覽代碼

Initial implementation of the Asset Browser tool.

Areloch 7 年之前
父節點
當前提交
1278cf22a2
共有 38 個文件被更改,包括 8518 次插入0 次删除
  1. 二進制
      Templates/BaseGame/game/tools/assetBrowser/art/animationIcon.png
  2. 二進制
      Templates/BaseGame/game/tools/assetBrowser/art/clientScriptIcon.png
  3. 二進制
      Templates/BaseGame/game/tools/assetBrowser/art/componentIcon.png
  4. 二進制
      Templates/BaseGame/game/tools/assetBrowser/art/gameObjectIcon.png
  5. 二進制
      Templates/BaseGame/game/tools/assetBrowser/art/guiIcon.png
  6. 二進制
      Templates/BaseGame/game/tools/assetBrowser/art/levelIcon.png
  7. 二進制
      Templates/BaseGame/game/tools/assetBrowser/art/materialIcon.png
  8. 二進制
      Templates/BaseGame/game/tools/assetBrowser/art/postEffectIcon.png
  9. 二進制
      Templates/BaseGame/game/tools/assetBrowser/art/scriptIcon.png
  10. 二進制
      Templates/BaseGame/game/tools/assetBrowser/art/serverScriptIcon.png
  11. 二進制
      Templates/BaseGame/game/tools/assetBrowser/art/soundIcon.png
  12. 二進制
      Templates/BaseGame/game/tools/assetBrowser/art/stateMachineIcon.png
  13. 18 0
      Templates/BaseGame/game/tools/assetBrowser/assetImportConfigs.xml
  14. 217 0
      Templates/BaseGame/game/tools/assetBrowser/guis/GameObjectCreator.gui
  15. 142 0
      Templates/BaseGame/game/tools/assetBrowser/guis/addModuleWindow.gui
  16. 142 0
      Templates/BaseGame/game/tools/assetBrowser/guis/addPackageWindow.gui
  17. 934 0
      Templates/BaseGame/game/tools/assetBrowser/guis/assetBrowser.gui
  18. 613 0
      Templates/BaseGame/game/tools/assetBrowser/guis/assetImport.gui
  19. 147 0
      Templates/BaseGame/game/tools/assetBrowser/guis/editAsset.gui
  20. 147 0
      Templates/BaseGame/game/tools/assetBrowser/guis/editModule.gui
  21. 237 0
      Templates/BaseGame/game/tools/assetBrowser/guis/newAsset.gui
  22. 434 0
      Templates/BaseGame/game/tools/assetBrowser/guis/newComponentAsset.gui
  23. 144 0
      Templates/BaseGame/game/tools/assetBrowser/guis/selectModule.gui
  24. 144 0
      Templates/BaseGame/game/tools/assetBrowser/guis/selectPackage.gui
  25. 70 0
      Templates/BaseGame/game/tools/assetBrowser/main.cs
  26. 112 0
      Templates/BaseGame/game/tools/assetBrowser/scripts/addModuleWindow.cs
  27. 110 0
      Templates/BaseGame/game/tools/assetBrowser/scripts/addPackageWindow.cs
  28. 1304 0
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.cs
  29. 1525 0
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetImport.cs
  30. 472 0
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetImportConfig.cs
  31. 371 0
      Templates/BaseGame/game/tools/assetBrowser/scripts/editAsset.cs
  32. 127 0
      Templates/BaseGame/game/tools/assetBrowser/scripts/editModule.cs
  33. 127 0
      Templates/BaseGame/game/tools/assetBrowser/scripts/fieldTypes.cs
  34. 130 0
      Templates/BaseGame/game/tools/assetBrowser/scripts/gameObjectCreator.cs
  35. 663 0
      Templates/BaseGame/game/tools/assetBrowser/scripts/newAsset.cs
  36. 154 0
      Templates/BaseGame/game/tools/assetBrowser/scripts/popupMenus.cs
  37. 17 0
      Templates/BaseGame/game/tools/assetBrowser/scripts/selectModule.cs
  38. 17 0
      Templates/BaseGame/game/tools/assetBrowser/scripts/selectPackage.cs

二進制
Templates/BaseGame/game/tools/assetBrowser/art/animationIcon.png


二進制
Templates/BaseGame/game/tools/assetBrowser/art/clientScriptIcon.png


二進制
Templates/BaseGame/game/tools/assetBrowser/art/componentIcon.png


二進制
Templates/BaseGame/game/tools/assetBrowser/art/gameObjectIcon.png


二進制
Templates/BaseGame/game/tools/assetBrowser/art/guiIcon.png


二進制
Templates/BaseGame/game/tools/assetBrowser/art/levelIcon.png


二進制
Templates/BaseGame/game/tools/assetBrowser/art/materialIcon.png


二進制
Templates/BaseGame/game/tools/assetBrowser/art/postEffectIcon.png


二進制
Templates/BaseGame/game/tools/assetBrowser/art/scriptIcon.png


二進制
Templates/BaseGame/game/tools/assetBrowser/art/serverScriptIcon.png


二進制
Templates/BaseGame/game/tools/assetBrowser/art/soundIcon.png


二進制
Templates/BaseGame/game/tools/assetBrowser/art/stateMachineIcon.png


+ 18 - 0
Templates/BaseGame/game/tools/assetBrowser/assetImportConfigs.xml

@@ -0,0 +1,18 @@
+<AssetImportConfigs>
+    <Config Name="TestConfig">
+        <Mesh ImportMesh="1" DoUpAxisOverride="0" UpAxisOverride="Z_AXIS" DoScaleOverride="0" ScaleOverride="1" IgnoreNodeScale="0" AdjustCenter="0" AdjustFloor="1" CollapseSubmeshes="0" LODType="TrailingNumber" ImportedNodes="" IgnoreNodes="" ImportMeshes="" IgnoreMeshes="" />
+        <Materials ImportMaterials="1" CreateComposites="1" UseDiffuseSuffixOnOriginImg="1" UseExistingMaterials="1" />
+        <Animations ImportAnimations="1" SeparateAnimations="1" SeparateAnimationPrefix="" />
+        <Collisions GenerateCollisions="1" GenCollisionType="CollisionMesh" CollisionMeshPrefix="Col" GenerateLOSCollisions="1" GenLOSCollisionType="CollisionMesh" LOSCollisionMeshPrefix="LOS" />
+        <Images ImageType="N/A" DiffuseTypeSuffixes="_ALBEDO,_DIFFUSE,_ALB,_DIF,_COLOR,_COL" NormalTypeSuffixes="_NORMAL,_NORM" SpecularTypeSuffixes="_SPECULAR,_SPEC" MetalnessTypeSuffixes="_METAL,_MET,_METALNESS,_METALLIC" RoughnessTypeSuffixes="_ROUGH,_ROUGHNESS" SmoothnessTypeSuffixes="_SMOOTH,_SMOOTHNESS" AOTypeSuffixes="_AO,_AMBIENT,_AMBIENTOCCLUSION" CompositeTypeSuffixes="_COMP,_COMPOSITE" TextureFilteringMode="Bilinear" UseMips="1" IsHDR="0" Scaling="1" Compressed="0" GenerateMaterialOnImport="1" PopulateMaterialMaps="1" />
+        <Sounds VolumeAdjust="1" PitchAdjust="1" Compressed="0" />
+    </Config>
+    <Config Name="SecondTest">
+        <Mesh ImportMesh="1" DoUpAxisOverride="0" UpAxisOverride="Z_AXIS" DoScaleOverride="0" ScaleOverride="1" IgnoreNodeScale="0" AdjustCenter="0" AdjustFloor="0" CollapseSubmeshes="0" LODType="TrailingNumber" ImportedNodes="" IgnoreNodes="" ImportMeshes="" IgnoreMeshes="" />
+        <Materials ImportMaterials="1" CreateComposites="1" UseDiffuseSuffixOnOriginImg="" UseExistingMaterials="" />
+        <Animations ImportAnimations="1" SeparateAnimations="1" SeparateAnimationPrefix="" />
+        <Collisions GenerateCollisions="1" GenCollisionType="CollisionMesh" CollisionMeshPrefix="Col" GenerateLOSCollisions="1" GenLOSCollisionType="CollisionMesh" LOSCollisionMeshPrefix="LOS" />
+        <Images ImageType="N/A" DiffuseTypeSuffixes="_ALBEDO,_DIFFUSE,_ALB,_DIF,_COLOR,_COL" NormalTypeSuffixes="_NORMAL,_NORM" SpecularTypeSuffixes="_SPECULAR,_SPEC" MetalnessTypeSuffixes="_METAL,_MET,_METALNESS,_METALLIC" RoughnessTypeSuffixes="_ROUGH,_ROUGHNESS" SmoothnessTypeSuffixes="_SMOOTH,_SMOOTHNESS" AOTypeSuffixes="_AO,_AMBIENT,_AMBIENTOCCLUSION" CompositeTypeSuffixes="_COMP,_COMPOSITE" TextureFilteringMode="Bilinear" UseMips="1" IsHDR="0" Scaling="1" Compressed="0" GenerateMaterialOnImport="" PopulateMaterialMaps="" />
+        <Sounds VolumeAdjust="1" PitchAdjust="1" Compressed="0" />
+    </Config>
+</AssetImportConfigs>

+ 217 - 0
Templates/BaseGame/game/tools/assetBrowser/guis/GameObjectCreator.gui

@@ -0,0 +1,217 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GuiControl(GameObjectCreator) {
+   position = "0 0";
+   extent = "1024 768";
+   minExtent = "8 2";
+   horizSizing = "right";
+   vertSizing = "bottom";
+   profile = "ToolsGuiDefaultNonModalProfile";
+   visible = "1";
+   active = "1";
+   tooltipProfile = "GuiToolTipProfile";
+   hovertime = "1000";
+   isContainer = "1";
+   canSave = "1";
+   canSaveDynamicFields = "1";
+      selectedEntity = "20054";
+
+   new GuiWindowCtrl(CreateGameObjectWindow) {
+      text = "Create GameObject";
+      resizeWidth = "1";
+      resizeHeight = "1";
+      canMove = "1";
+      canClose = "1";
+      canMinimize = "0";
+      canMaximize = "0";
+      canCollapse = "0";
+      closeCommand = "Canvas.popDialog(GameObjectCreator);";
+      edgeSnap = "1";
+      margin = "0 0 0 0";
+      padding = "0 0 0 0";
+      anchorTop = "1";
+      anchorBottom = "0";
+      anchorLeft = "1";
+      anchorRight = "0";
+      position = "328 322";
+      extent = "368 123";
+      minExtent = "48 92";
+      horizSizing = "center";
+      vertSizing = "center";
+      profile = "ToolsGuiWindowProfile";
+      visible = "1";
+      active = "1";
+      tooltipProfile = "ToolsGuiToolTipProfile";
+      hovertime = "1000";
+      isContainer = "1";
+      canSave = "1";
+      canSaveDynamicFields = "0";
+
+      new GuiButtonCtrl(GameObjectCreateBtn) {
+         text = "Done";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "224 92";
+         extent = "64 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "AssetBrowser_importAssetWindow.ImportAssets();";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiButtonCtrl() {
+         text = "Cancel";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "292 92";
+         extent = "64 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "Canvas.popDialog(GameObjectCreator);";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiTextCtrl(GameObjectCreatorObjectName) {
+         text = "Game Object Name:";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "12 60";
+         extent = "116 17";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiTextProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiTextCtrl() {
+         text = "Target Module:";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "12 30";
+         extent = "116 17";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiTextProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiBitmapButtonCtrl(GameObjectCreatorPkgBtn) {
+         bitmap = "tools/gui/images/iconAdd.png";
+         bitmapMode = "Centered";
+         autoFitExtents = "0";
+         useModifiers = "0";
+         useStates = "1";
+         masked = "0";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "342 27";
+         extent = "22 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         command = "Canvas.pushDialog(AssetBrowser_addModule);\nAssetBrowser_addModuleWindow.selectWindow();";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiPopUpMenuCtrlEx(GameObjectModuleList) {
+         maxPopupHeight = "200";
+         sbUsesNAColor = "0";
+         reverseTextList = "0";
+         bitmapBounds = "16 16";
+         hotTrackCallback = "0";
+         text = "Characters";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "134 27";
+         extent = "204 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiTextEditCtrl(GameObjectCreatorName) {
+         historySize = "0";
+         tabComplete = "0";
+         sinkAllKeyEvents = "0";
+         password = "0";
+         passwordMask = "*";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "116 60";
+         extent = "234 18";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiTextEditProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+   };
+};
+//--- OBJECT WRITE END ---

+ 142 - 0
Templates/BaseGame/game/tools/assetBrowser/guis/addModuleWindow.gui

@@ -0,0 +1,142 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GuiControl(AssetBrowser_AddModule) {
+   position = "0 0";
+   extent = "1024 768";
+   minExtent = "8 2";
+   horizSizing = "right";
+   vertSizing = "bottom";
+   profile = "ToolsGuiDefaultNonModalProfile";
+   visible = "1";
+   active = "1";
+   tooltipProfile = "GuiToolTipProfile";
+   hovertime = "1000";
+   isContainer = "1";
+   canSave = "1";
+   canSaveDynamicFields = "1";
+      Enabled = "1";
+
+   new GuiWindowCtrl(AssetBrowser_addModuleWindow) {
+      text = "Create New Module";
+      resizeWidth = "1";
+      resizeHeight = "1";
+      canMove = "1";
+      canClose = "0";
+      canMinimize = "0";
+      canMaximize = "0";
+      canCollapse = "0";
+      edgeSnap = "1";
+      margin = "0 0 0 0";
+      padding = "0 0 0 0";
+      anchorTop = "1";
+      anchorBottom = "0";
+      anchorLeft = "1";
+      anchorRight = "0";
+      position = "362 334";
+      extent = "299 99";
+      minExtent = "48 92";
+      horizSizing = "center";
+      vertSizing = "center";
+      profile = "ToolsGuiWindowProfile";
+      visible = "1";
+      active = "1";
+      tooltipProfile = "ToolsGuiToolTipProfile";
+      hovertime = "1000";
+      isContainer = "1";
+      hidden = "0";
+      canSave = "1";
+      canSaveDynamicFields = "0";
+
+      new GuiTextEditCtrl() {
+         historySize = "0";
+         tabComplete = "0";
+         sinkAllKeyEvents = "0";
+         password = "0";
+         passwordMask = "*";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "88 35";
+         extent = "196 18";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiTextEditProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         internalName = "ModuleName";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiTextCtrl() {
+         text = "Module Name";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "12 35";
+         extent = "72 16";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiTextProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiButtonCtrl() {
+         text = "Create";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "88 68";
+         extent = "126 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "AssetBrowser_addModuleWindow.CreateNewModule();";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiButtonCtrl() {
+         text = "Cancel";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "220 68";
+         extent = "64 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "AssetBrowser_addModuleWindow.Close();";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+   };
+};
+//--- OBJECT WRITE END ---

+ 142 - 0
Templates/BaseGame/game/tools/assetBrowser/guis/addPackageWindow.gui

@@ -0,0 +1,142 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GuiControl(AssetBrowser_AddPackage) {
+   position = "0 0";
+   extent = "1024 768";
+   minExtent = "8 2";
+   horizSizing = "right";
+   vertSizing = "bottom";
+   profile = "ToolsGuiDefaultNonModalProfile";
+   visible = "1";
+   active = "1";
+   tooltipProfile = "GuiToolTipProfile";
+   hovertime = "1000";
+   isContainer = "1";
+   canSave = "1";
+   canSaveDynamicFields = "1";
+      Enabled = "1";
+
+   new GuiWindowCtrl(AssetBrowser_addPackageWindow) {
+      text = "Create New Package";
+      resizeWidth = "1";
+      resizeHeight = "1";
+      canMove = "1";
+      canClose = "0";
+      canMinimize = "0";
+      canMaximize = "0";
+      canCollapse = "0";
+      edgeSnap = "1";
+      margin = "0 0 0 0";
+      padding = "0 0 0 0";
+      anchorTop = "1";
+      anchorBottom = "0";
+      anchorLeft = "1";
+      anchorRight = "0";
+      position = "362 334";
+      extent = "299 99";
+      minExtent = "48 92";
+      horizSizing = "center";
+      vertSizing = "center";
+      profile = "ToolsGuiWindowProfile";
+      visible = "1";
+      active = "1";
+      tooltipProfile = "ToolsGuiToolTipProfile";
+      hovertime = "1000";
+      isContainer = "1";
+      hidden = "0";
+      canSave = "1";
+      canSaveDynamicFields = "0";
+
+      new GuiTextEditCtrl() {
+         historySize = "0";
+         tabComplete = "0";
+         sinkAllKeyEvents = "0";
+         password = "0";
+         passwordMask = "*";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "88 35";
+         extent = "196 18";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiTextEditProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         internalName = "PackageName";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiTextCtrl() {
+         text = "Package Name";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "12 35";
+         extent = "72 16";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiTextProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiButtonCtrl() {
+         text = "Create";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "88 68";
+         extent = "126 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "AssetBrowser_addPackageWindow.CreateNewPackage();";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiButtonCtrl() {
+         text = "Cancel";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "220 68";
+         extent = "64 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "AssetBrowser_addPackageWindow.Close();";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+   };
+};
+//--- OBJECT WRITE END ---

+ 934 - 0
Templates/BaseGame/game/tools/assetBrowser/guis/assetBrowser.gui

@@ -0,0 +1,934 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GuiControl(AssetBrowser) {
+   position = "0 0";
+   extent = "1024 768";
+   minExtent = "8 2";
+   horizSizing = "right";
+   vertSizing = "bottom";
+   profile = "ToolsGuiDefaultNonModalProfile";
+   visible = "1";
+   active = "1";
+   tooltipProfile = "GuiToolTipProfile";
+   hovertime = "1000";
+   isContainer = "1";
+   canSave = "1";
+   canSaveDynamicFields = "1";
+      AddNewArtAssetPopup = "18801";
+      AddNewAssetPopup = "18802";
+      AddNewScriptAssetPopup = "18800";
+      currentPreviewPage = "0";
+      enabled = "1";
+      importAssetFinalListArray = "20465";
+      importAssetNewListArray = "20463";
+      importAssetUnprocessedListArray = "20464";
+      totalPages = "1";
+
+   new GuiWindowCtrl(AssetBrowser_addFilterWindow) {
+      text = "Create New Tag";
+      resizeWidth = "1";
+      resizeHeight = "1";
+      canMove = "1";
+      canClose = "0";
+      canMinimize = "0";
+      canMaximize = "0";
+      canCollapse = "0";
+      edgeSnap = "1";
+      margin = "0 0 0 0";
+      padding = "0 0 0 0";
+      anchorTop = "1";
+      anchorBottom = "0";
+      anchorLeft = "1";
+      anchorRight = "0";
+      position = "321 334";
+      extent = "381 99";
+      minExtent = "48 92";
+      horizSizing = "center";
+      vertSizing = "center";
+      profile = "ToolsGuiWindowProfile";
+      visible = "0";
+      active = "1";
+      tooltipProfile = "ToolsGuiToolTipProfile";
+      hovertime = "1000";
+      isContainer = "1";
+      hidden = "1";
+      canSave = "1";
+      canSaveDynamicFields = "0";
+
+      new GuiTextEditCtrl() {
+         historySize = "0";
+         tabComplete = "0";
+         sinkAllKeyEvents = "0";
+         password = "0";
+         passwordMask = "*";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "64 35";
+         extent = "196 18";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiTextEditProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         internalName = "tagName";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiTextCtrl() {
+         text = "Tag Name";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "12 35";
+         extent = "52 16";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiTextProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiButtonCtrl() {
+         text = "Create";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "64 68";
+         extent = "126 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "AssetBrowser.createFilter( AssetBrowser_addFilterWindow-->tagName.getText() );AssetBrowser_addFilterWindow.setVisible(0);";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiButtonCtrl() {
+         text = "Cancel";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "196 68";
+         extent = "64 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "AssetBrowser_addFilterWindow.setVisible(0);";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+   };
+   new GuiWindowCtrl(AssetBrowserWindow) {
+      text = "Asset Browser";
+      resizeWidth = "1";
+      resizeHeight = "1";
+      canMove = "1";
+      canClose = "1";
+      canMinimize = "0";
+      canMaximize = "0";
+      canCollapse = "0";
+      closeCommand = "AssetBrowser::hideDialog();";
+      edgeSnap = "1";
+      margin = "0 0 0 0";
+      padding = "0 0 0 0";
+      anchorTop = "1";
+      anchorBottom = "0";
+      anchorLeft = "1";
+      anchorRight = "0";
+      position = "256 107";
+      extent = "512 554";
+      minExtent = "383 274";
+      horizSizing = "center";
+      vertSizing = "center";
+      profile = "ToolsGuiWindowProfile";
+      visible = "1";
+      active = "1";
+      tooltipProfile = "GuiToolTipProfile";
+      hovertime = "1000";
+      isContainer = "1";
+      canSave = "1";
+      canSaveDynamicFields = "0";
+
+      new GuiButtonCtrl(CreateAssetButton) {
+         text = "New";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "3 22";
+         extent = "45 19";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiButtonCtrl(ImportAssetButton) {
+         text = "Import";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "50 22";
+         extent = "45 19";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         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";
+         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() {
+         orientation = "Vertical";
+         splitterSize = "2";
+         splitPoint = "149 100";
+         fixedPanel = "None";
+         fixedSize = "356";
+         docking = "None";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "3 42";
+         extent = "505 509";
+         minExtent = "64 64";
+         horizSizing = "relative";
+         vertSizing = "height";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+
+         new GuiPanel() {
+            docking = "Client";
+            margin = "0 0 0 0";
+            padding = "0 0 0 0";
+            anchorTop = "1";
+            anchorBottom = "0";
+            anchorLeft = "1";
+            anchorRight = "0";
+            position = "0 0";
+            extent = "147 509";
+            minExtent = "16 16";
+            horizSizing = "right";
+            vertSizing = "bottom";
+            profile = "GuiDefaultProfile";
+            visible = "1";
+            active = "1";
+            tooltipProfile = "GuiToolTipProfile";
+            hovertime = "1000";
+            isContainer = "1";
+            internalName = "Panel1";
+            canSave = "1";
+            canSaveDynamicFields = "0";
+
+            new GuiContainer() {
+               margin = "0 0 0 0";
+               padding = "0 0 0 0";
+               anchorTop = "1";
+               anchorBottom = "0";
+               anchorLeft = "1";
+               anchorRight = "0";
+               position = "0 0";
+               extent = "147 31";
+               minExtent = "8 2";
+               horizSizing = "width";
+               vertSizing = "bottom";
+               profile = "inspectorStyleRolloutDarkProfile";
+               visible = "1";
+               active = "1";
+               tooltipProfile = "GuiToolTipProfile";
+               hovertime = "1000";
+               isContainer = "1";
+               canSave = "1";
+               canSaveDynamicFields = "0";
+
+               new GuiTextCtrl() {
+                  text = "Filters";
+                  maxLength = "1024";
+                  margin = "0 0 0 0";
+                  padding = "0 0 0 0";
+                  anchorTop = "1";
+                  anchorBottom = "0";
+                  anchorLeft = "1";
+                  anchorRight = "0";
+                  position = "5 0";
+                  extent = "30 16";
+                  minExtent = "8 2";
+                  horizSizing = "right";
+                  vertSizing = "bottom";
+                  profile = "ToolsGuiDefaultProfile";
+                  visible = "1";
+                  active = "1";
+                  tooltipProfile = "GuiToolTipProfile";
+                  hovertime = "1000";
+                  isContainer = "1";
+                  canSave = "1";
+                  canSaveDynamicFields = "0";
+               };
+               new GuiBitmapButtonCtrl() {
+                  bitmap = "tools/gui/images/iconNew.png";
+                  bitmapMode = "Stretched";
+                  autoFitExtents = "0";
+                  useModifiers = "0";
+                  useStates = "1";
+                  masked = "0";
+                  groupNum = "-1";
+                  buttonType = "PushButton";
+                  useMouseEvents = "0";
+                  position = "113 1";
+                  extent = "15 15";
+                  minExtent = "8 2";
+                  horizSizing = "right";
+                  vertSizing = "bottom";
+                  profile = "GuiDefaultProfile";
+                  visible = "1";
+                  active = "1";
+                  command = "AssetBrowser.viewTagsFilter();";
+                  tooltipProfile = "GuiToolTipProfile";
+                  tooltip = "Show assets grouped and filtered via tags.";
+                  hovertime = "1000";
+                  isContainer = "0";
+                  canSave = "1";
+                  canSaveDynamicFields = "0";
+               };
+               new GuiBitmapButtonCtrl() {
+                  bitmap = "tools/gui/images/iconList.png";
+                  bitmapMode = "Stretched";
+                  autoFitExtents = "0";
+                  useModifiers = "0";
+                  useStates = "1";
+                  masked = "0";
+                  groupNum = "-1";
+                  buttonType = "PushButton";
+                  useMouseEvents = "0";
+                  position = "130 1";
+                  extent = "15 15";
+                  minExtent = "8 2";
+                  horizSizing = "right";
+                  vertSizing = "bottom";
+                  profile = "GuiDefaultProfile";
+                  visible = "1";
+                  active = "1";
+                  command = "AssetBrowser.viewListFilter();";
+                  tooltipProfile = "GuiToolTipProfile";
+                  tooltip = "Views assets via module-oriented list tree.";
+                  hovertime = "1000";
+                  isContainer = "0";
+                  canSave = "1";
+                  canSaveDynamicFields = "0";
+               };
+            };
+            new GuiContainer() {
+               margin = "0 0 0 0";
+               padding = "0 0 0 0";
+               anchorTop = "1";
+               anchorBottom = "0";
+               anchorLeft = "1";
+               anchorRight = "0";
+               position = "0 17";
+               extent = "147 493";
+               minExtent = "8 2";
+               horizSizing = "width";
+               vertSizing = "height";
+               profile = "ToolsGuiDefaultProfile";
+               visible = "1";
+               active = "1";
+               tooltipProfile = "GuiToolTipProfile";
+               hovertime = "1000";
+               isContainer = "1";
+               canSave = "1";
+               canSaveDynamicFields = "0";
+
+               new GuiScrollCtrl() {
+                  willFirstRespond = "1";
+                  hScrollBar = "alwaysOff";
+                  vScrollBar = "dynamic";
+                  lockHorizScroll = "1";
+                  lockVertScroll = "0";
+                  constantThumbHeight = "0";
+                  childMargin = "0 0";
+                  mouseWheelScrollSpeed = "-1";
+                  docking = "Client";
+                  margin = "0 0 0 0";
+                  padding = "0 0 0 0";
+                  anchorTop = "1";
+                  anchorBottom = "0";
+                  anchorLeft = "1";
+                  anchorRight = "0";
+                  position = "0 0";
+                  extent = "147 493";
+                  minExtent = "8 8";
+                  horizSizing = "width";
+                  vertSizing = "height";
+                  profile = "GuiEditorScrollProfile";
+                  visible = "1";
+                  active = "1";
+                  tooltipProfile = "ToolsGuiDefaultProfile";
+                  hovertime = "1000";
+                  isContainer = "1";
+                  canSave = "1";
+                  canSaveDynamicFields = "0";
+
+                  new GuiTreeViewCtrl(AssetBrowserFilterTree) {
+                     tabSize = "16";
+                     textOffset = "2";
+                     fullRowSelect = "0";
+                     itemHeight = "21";
+                     destroyTreeOnSleep = "1";
+                     mouseDragging = "1";
+                     multipleSelections = "1";
+                     deleteObjectAllowed = "1";
+                     dragToItemAllowed = "1";
+                     clearAllOnSingleSelection = "1";
+                     showRoot = "1";
+                     useInspectorTooltips = "0";
+                     tooltipOnWidthOnly = "0";
+                     showObjectIds = "1";
+                     showClassNames = "1";
+                     showObjectNames = "1";
+                     showInternalNames = "1";
+                     showClassNameForUnnamedObjects = "0";
+                     compareToObjectID = "1";
+                     canRenameObjects = "1";
+                     renameInternal = "0";
+                     position = "1 1";
+                     extent = "145 294";
+                     minExtent = "8 2";
+                     horizSizing = "right";
+                     vertSizing = "bottom";
+                     profile = "ToolsGuiTreeViewProfile";
+                     visible = "1";
+                     active = "1";
+                     tooltipProfile = "GuiToolTipProfile";
+                     hovertime = "1000";
+                     isContainer = "1";
+                     internalName = "filterTree";
+                     canSave = "1";
+                     canSaveDynamicFields = "0";
+                  };
+               };
+            };
+         };
+         new GuiPanel() {
+            docking = "Client";
+            margin = "0 0 0 0";
+            padding = "0 0 0 0";
+            anchorTop = "1";
+            anchorBottom = "0";
+            anchorLeft = "1";
+            anchorRight = "0";
+            position = "151 0";
+            extent = "354 509";
+            minExtent = "16 16";
+            horizSizing = "right";
+            vertSizing = "bottom";
+            profile = "GuiDefaultProfile";
+            visible = "1";
+            active = "1";
+            tooltipProfile = "GuiToolTipProfile";
+            hovertime = "1000";
+            isContainer = "1";
+            internalName = "panel2";
+            canSave = "1";
+            canSaveDynamicFields = "0";
+
+            new GuiContainer() {
+               margin = "0 0 0 0";
+               padding = "0 0 0 0";
+               anchorTop = "1";
+               anchorBottom = "0";
+               anchorLeft = "1";
+               anchorRight = "0";
+               position = "1 0";
+               extent = "354 41";
+               minExtent = "8 2";
+               horizSizing = "width";
+               vertSizing = "bottom";
+               profile = "inspectorStyleRolloutDarkProfile";
+               visible = "1";
+               active = "1";
+               tooltipProfile = "GuiToolTipProfile";
+               hovertime = "1000";
+               isContainer = "1";
+               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...";
+                  maxLength = "1024";
+                  margin = "0 0 0 0";
+                  padding = "0 0 0 0";
+                  anchorTop = "1";
+                  anchorBottom = "0";
+                  anchorLeft = "1";
+                  anchorRight = "0";
+                  position = "62 19";
+                  extent = "273 18";
+                  minExtent = "8 2";
+                  horizSizing = "width";
+                  vertSizing = "bottom";
+                  profile = "ToolsGuiTextEditProfile";
+                  visible = "1";
+                  active = "1";
+                  tooltipProfile = "GuiToolTipProfile";
+                  hovertime = "1000";
+                  isContainer = "1";
+                  class = "AssetBrowserSearchFilterText";
+                  canSave = "1";
+                  canSaveDynamicFields = "0";
+               };
+               new GuiBitmapButtonCtrl(TagFilterButton) {
+                  bitmap = "tools/gui/images/visible";
+                  bitmapMode = "Stretched";
+                  autoFitExtents = "0";
+                  useModifiers = "0";
+                  useStates = "1";
+                  masked = "0";
+                  groupNum = "-1";
+                  buttonType = "PushButton";
+                  useMouseEvents = "0";
+                  position = "4 19";
+                  extent = "20 20";
+                  minExtent = "8 2";
+                  horizSizing = "right";
+                  vertSizing = "bottom";
+                  profile = "GuiDefaultProfile";
+                  visible = "1";
+                  active = "1";
+                  command = "AssetBrowser.toggleTagFilterPopup();";
+                  tooltipProfile = "GuiToolTipProfile";
+                  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";
+                  minExtent = "8 2";
+                  horizSizing = "right";
+                  vertSizing = "bottom";
+                  profile = "ToolsGuiDefaultProfile";
+                  visible = "1";
+                  active = "1";
+                  tooltipProfile = "GuiToolTipProfile";
+                  hovertime = "1000";
+                  isContainer = "1";
+                  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 = "337 22";
+                  extent = "15 15";
+                  minExtent = "8 2";
+                  horizSizing = "left";
+                  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 GuiContainer() {
+               margin = "0 0 0 0";
+               padding = "0 0 0 0";
+               anchorTop = "1";
+               anchorBottom = "0";
+               anchorLeft = "1";
+               anchorRight = "1";
+               position = "1 40";
+               extent = "354 468";
+               minExtent = "8 2";
+               horizSizing = "width";
+               vertSizing = "height";
+               profile = "ToolsGuiDefaultProfile";
+               visible = "1";
+               active = "1";
+               tooltipProfile = "GuiToolTipProfile";
+               hovertime = "1000";
+               isContainer = "1";
+               canSave = "1";
+               canSaveDynamicFields = "0";
+
+               new GuiScrollCtrl(AssetListPanel) {
+                  willFirstRespond = "1";
+                  hScrollBar = "alwaysOff";
+                  vScrollBar = "dynamic";
+                  lockHorizScroll = "1";
+                  lockVertScroll = "0";
+                  constantThumbHeight = "0";
+                  childMargin = "0 0";
+                  mouseWheelScrollSpeed = "-1";
+                  docking = "Client";
+                  margin = "0 0 0 0";
+                  padding = "0 0 0 0";
+                  anchorTop = "1";
+                  anchorBottom = "0";
+                  anchorLeft = "1";
+                  anchorRight = "0";
+                  position = "0 0";
+                  extent = "354 448";
+                  minExtent = "8 8";
+                  horizSizing = "width";
+                  vertSizing = "height";
+                  profile = "GuiEditorScrollProfile";
+                  visible = "1";
+                  active = "1";
+                  tooltipProfile = "ToolsGuiDefaultProfile";
+                  hovertime = "1000";
+                  isContainer = "1";
+                  canSave = "1";
+                  canSaveDynamicFields = "0";
+
+                  new GuiStackControl() {
+                     stackingType = "Vertical";
+                     horizStacking = "Left to Right";
+                     vertStacking = "Top to Bottom";
+                     padding = "0";
+                     dynamicSize = "1";
+                     dynamicNonStackExtent = "0";
+                     dynamicPos = "0";
+                     changeChildSizeToFit = "1";
+                     changeChildPosition = "0";
+                     position = "1 1";
+                     extent = "352 254";
+                     minExtent = "16 16";
+                     horizSizing = "width";
+                     vertSizing = "bottom";
+                     profile = "ToolsGuiModelessDialogProfile";
+                     visible = "1";
+                     active = "1";
+                     tooltipProfile = "GuiToolTipProfile";
+                     hovertime = "1000";
+                     isContainer = "1";
+                     canSave = "1";
+                     canSaveDynamicFields = "0";
+
+                     new GuiControl() {
+                        position = "0 0";
+                        extent = "352 4";
+                        minExtent = "8 2";
+                        horizSizing = "right";
+                        vertSizing = "bottom";
+                        profile = "GuiDefaultProfile";
+                        visible = "1";
+                        active = "1";
+                        tooltipProfile = "GuiToolTipProfile";
+                        hovertime = "1000";
+                        isContainer = "1";
+                        canSave = "1";
+                        canSaveDynamicFields = "0";
+                     };
+                     new GuiDynamicCtrlArrayControl() {
+                        colCount = "3";
+                        colSize = "100";
+                        rowCount = "2";
+                        rowSize = "124";
+                        rowSpacing = "2";
+                        colSpacing = "2";
+                        frozen = "0";
+                        autoCellSize = "1";
+                        fillRowFirst = "1";
+                        dynamicSize = "1";
+                        padding = "0 0 0 0";
+                        position = "3 4";
+                        extent = "352 250";
+                        minExtent = "8 8";
+                        horizSizing = "width";
+                        vertSizing = "bottom";
+                        profile = "ToolsGuiDefaultNonModalProfile";
+                        visible = "1";
+                        active = "1";
+                        tooltipProfile = "GuiToolTipProfile";
+                        hovertime = "1000";
+                        isContainer = "1";
+                        internalName = "materialSelection";
+                        canSave = "1";
+                        canSaveDynamicFields = "0";
+                     };
+                  };
+               };
+               new GuiContainer() {
+                  docking = "Bottom";
+                  margin = "0 0 0 0";
+                  padding = "0 0 0 0";
+                  anchorTop = "1";
+                  anchorBottom = "0";
+                  anchorLeft = "1";
+                  anchorRight = "0";
+                  position = "0 448";
+                  extent = "354 20";
+                  minExtent = "8 2";
+                  horizSizing = "width";
+                  vertSizing = "height";
+                  profile = "ToolsGuiDefaultProfile";
+                  visible = "1";
+                  active = "1";
+                  tooltipProfile = "GuiToolTipProfile";
+                  hovertime = "1000";
+                  isContainer = "1";
+                  internalName = "materialPreviewControlContainer";
+                  canSave = "1";
+                  canSaveDynamicFields = "0";
+               };
+            };
+            new GuiButtonCtrl() {
+               text = "Select";
+               groupNum = "-1";
+               buttonType = "PushButton";
+               useMouseEvents = "0";
+               position = "242 491";
+               extent = "53 19";
+               minExtent = "8 2";
+               horizSizing = "left";
+               vertSizing = "top";
+               profile = "ToolsGuiButtonProfile";
+               visible = "1";
+               active = "1";
+               command = "AssetBrowser.selectAsset( AssetBrowser.selectedAsset );";
+               tooltipProfile = "GuiToolTipProfile";
+               hovertime = "1000";
+               isContainer = "0";
+               internalName = "SelectButton";
+               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";
+            };
+         };
+      };
+   };
+};
+//--- OBJECT WRITE END ---

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

@@ -0,0 +1,613 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GuiControl(AssetImportCtrl) {
+   position = "0 0";
+   extent = "1440 900";
+   minExtent = "8 2";
+   horizSizing = "right";
+   vertSizing = "bottom";
+   profile = "GuiDefaultProfile";
+   visible = "1";
+   active = "1";
+   tooltipProfile = "GuiToolTipProfile";
+   hovertime = "1000";
+   isContainer = "1";
+   canSave = "1";
+   canSaveDynamicFields = "1";
+
+   new GuiWindowCtrl(ImportAssetOptionsWindow) {
+      text = "Import Options";
+      resizeWidth = "1";
+      resizeHeight = "1";
+      canMove = "1";
+      canClose = "0";
+      canMinimize = "0";
+      canMaximize = "0";
+      canCollapse = "0";
+      edgeSnap = "1";
+      margin = "0 0 0 0";
+      padding = "0 0 0 0";
+      anchorTop = "1";
+      anchorBottom = "0";
+      anchorLeft = "1";
+      anchorRight = "0";
+      position = "633 358";
+      extent = "346 409";
+      minExtent = "48 92";
+      horizSizing = "center";
+      vertSizing = "center";
+      profile = "ToolsGuiWindowProfile";
+      visible = "0";
+      active = "1";
+      tooltipProfile = "ToolsGuiToolTipProfile";
+      hovertime = "1000";
+      isContainer = "1";
+      hidden = "1";
+      canSave = "1";
+      canSaveDynamicFields = "0";
+
+      new GuiButtonCtrl() {
+         text = "Done";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "271 377";
+         extent = "64 22";
+         minExtent = "8 2";
+         horizSizing = "left";
+         vertSizing = "top";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "ImportAssetOptionsWindow.saveAssetOptions();";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiScrollCtrl() {
+         willFirstRespond = "1";
+         hScrollBar = "dynamic";
+         vScrollBar = "dynamic";
+         lockHorizScroll = "0";
+         lockVertScroll = "0";
+         constantThumbHeight = "0";
+         childMargin = "0 0";
+         mouseWheelScrollSpeed = "-1";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "9 26";
+         extent = "326 344";
+         minExtent = "8 2";
+         horizSizing = "width";
+         vertSizing = "height";
+         profile = "GuiScrollProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+
+         new GuiVariableInspector(ImportOptionsList) {
+            dividerMargin = "5";
+            showCustomFields = "1";
+            stackingType = "Vertical";
+            horizStacking = "Left to Right";
+            vertStacking = "Top to Bottom";
+            padding = "1";
+            dynamicSize = "1";
+            dynamicNonStackExtent = "0";
+            dynamicPos = "0";
+            changeChildSizeToFit = "1";
+            changeChildPosition = "1";
+            position = "1 1";
+            extent = "309 64";
+            minExtent = "16 16";
+            horizSizing = "right";
+            vertSizing = "bottom";
+            profile = "GuiDefaultProfile";
+            visible = "1";
+            active = "1";
+            tooltipProfile = "GuiToolTipProfile";
+            hovertime = "1000";
+            isContainer = "1";
+            canSave = "1";
+            canSaveDynamicFields = "0";
+         };
+      };
+   };
+   new GuiWindowCtrl(ImportAssetConfigEditorWindow) {
+      text = "Import Options Config";
+      resizeWidth = "1";
+      resizeHeight = "1";
+      canMove = "1";
+      canClose = "0";
+      canMinimize = "0";
+      canMaximize = "0";
+      canCollapse = "0";
+      edgeSnap = "1";
+      margin = "0 0 0 0";
+      padding = "0 0 0 0";
+      anchorTop = "1";
+      anchorBottom = "0";
+      anchorLeft = "1";
+      anchorRight = "0";
+      position = "562 251";
+      extent = "376 503";
+      minExtent = "48 92";
+      horizSizing = "center";
+      vertSizing = "center";
+      profile = "ToolsGuiWindowProfile";
+      visible = "0";
+      active = "1";
+      tooltipProfile = "ToolsGuiToolTipProfile";
+      hovertime = "1000";
+      isContainer = "1";
+      hidden = "1";
+      canSave = "1";
+      canSaveDynamicFields = "0";
+
+      new GuiTextCtrl() {
+         text = "Configuration Name:";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "10 26";
+         extent = "100 17";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiTextProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiTextEditCtrl(AssetImportConfigName) {
+         historySize = "0";
+         tabComplete = "0";
+         sinkAllKeyEvents = "0";
+         password = "0";
+         passwordMask = "*";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "113 25";
+         extent = "250 18";
+         minExtent = "8 2";
+         horizSizing = "width";
+         vertSizing = "bottom";
+         profile = "GuiTextEditProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiButtonCtrl() {
+         text = "Done";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "301 471";
+         extent = "64 22";
+         minExtent = "8 2";
+         horizSizing = "left";
+         vertSizing = "top";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "ImportAssetConfigEditorWindow.saveAssetOptionsConfig();";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiScrollCtrl() {
+         willFirstRespond = "1";
+         hScrollBar = "dynamic";
+         vScrollBar = "dynamic";
+         lockHorizScroll = "0";
+         lockVertScroll = "0";
+         constantThumbHeight = "0";
+         childMargin = "0 0";
+         mouseWheelScrollSpeed = "-1";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "9 50";
+         extent = "356 414";
+         minExtent = "8 2";
+         horizSizing = "width";
+         vertSizing = "height";
+         profile = "GuiScrollProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+
+         new GuiVariableInspector(ImportOptionsConfigList) {
+            dividerMargin = "5";
+            showCustomFields = "1";
+            stackingType = "Vertical";
+            horizStacking = "Left to Right";
+            vertStacking = "Top to Bottom";
+            padding = "1";
+            dynamicSize = "1";
+            dynamicNonStackExtent = "0";
+            dynamicPos = "0";
+            changeChildSizeToFit = "1";
+            changeChildPosition = "1";
+            position = "1 1";
+            extent = "339 64";
+            minExtent = "16 16";
+            horizSizing = "right";
+            vertSizing = "bottom";
+            profile = "GuiDefaultProfile";
+            visible = "1";
+            active = "1";
+            tooltipProfile = "GuiToolTipProfile";
+            hovertime = "1000";
+            isContainer = "1";
+            canSave = "1";
+            canSaveDynamicFields = "0";
+         };
+      };
+   };
+   new GuiWindowCtrl(ImportAssetWindow) {
+      text = "Import Assets";
+      resizeWidth = "1";
+      resizeHeight = "1";
+      canMove = "1";
+      canClose = "0";
+      canMinimize = "0";
+      canMaximize = "0";
+      canCollapse = "0";
+      edgeSnap = "1";
+      margin = "0 0 0 0";
+      padding = "0 0 0 0";
+      anchorTop = "1";
+      anchorBottom = "0";
+      anchorLeft = "1";
+      anchorRight = "0";
+      position = "536 205";
+      extent = "368 502";
+      minExtent = "48 92";
+      horizSizing = "center";
+      vertSizing = "center";
+      profile = "ToolsGuiWindowProfile";
+      visible = "1";
+      active = "1";
+      tooltipProfile = "ToolsGuiToolTipProfile";
+      hovertime = "1000";
+      isContainer = "1";
+      canSave = "1";
+      canSaveDynamicFields = "0";
+
+      new GuiButtonCtrl() {
+         text = "Done";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "224 470";
+         extent = "64 22";
+         minExtent = "8 2";
+         horizSizing = "left";
+         vertSizing = "top";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "ImportAssetWindow.ImportAssets();";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiButtonCtrl() {
+         text = "Cancel";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "292 470";
+         extent = "64 22";
+         minExtent = "8 2";
+         horizSizing = "left";
+         vertSizing = "top";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "Canvas.popDialog();";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiTextCtrl() {
+         text = "Target Module:";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "12 30";
+         extent = "116 17";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiTextProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiPopUpMenuCtrlEx(ImportAssetModuleList) {
+         maxPopupHeight = "200";
+         sbUsesNAColor = "0";
+         reverseTextList = "0";
+         bitmapBounds = "16 16";
+         hotTrackCallback = "0";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "134 27";
+         extent = "204 22";
+         minExtent = "8 2";
+         horizSizing = "width";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiBitmapButtonCtrl() {
+         bitmap = "tools/gui/images/iconAdd.png";
+         bitmapMode = "Centered";
+         autoFitExtents = "0";
+         useModifiers = "0";
+         useStates = "1";
+         masked = "0";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "342 27";
+         extent = "22 22";
+         minExtent = "8 2";
+         horizSizing = "left";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         command = "Canvas.pushDialog(AssetBrowser_addModule);\nAssetBrowser_addModuleWindow.selectWindow();";
+         tooltipProfile = "GuiToolTipProfile";
+         tooltip = "New Module";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiTextCtrl() {
+         text = "Import Options Config:";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "12 56";
+         extent = "116 17";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiTextProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiPopUpMenuCtrlEx(ImportAssetConfigList) {
+         maxPopupHeight = "200";
+         sbUsesNAColor = "0";
+         reverseTextList = "0";
+         bitmapBounds = "16 16";
+         hotTrackCallback = "0";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "126 53";
+         extent = "175 22";
+         minExtent = "8 2";
+         horizSizing = "width";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiBitmapButtonCtrl() {
+         bitmap = "tools/gui/images/iconAdd.png";
+         bitmapMode = "Centered";
+         autoFitExtents = "0";
+         useModifiers = "0";
+         useStates = "1";
+         masked = "0";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "305 53";
+         extent = "15 22";
+         minExtent = "8 2";
+         horizSizing = "left";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         command = "ImportAssetConfigEditorWindow.addNewConfig();";
+         tooltipProfile = "GuiToolTipProfile";
+         tooltip = "New Config";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiBitmapButtonCtrl() {
+         bitmap = "tools/gui/images/iconInformation.png";
+         bitmapMode = "Centered";
+         autoFitExtents = "0";
+         useModifiers = "0";
+         useStates = "1";
+         masked = "0";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "325 53";
+         extent = "15 22";
+         minExtent = "8 2";
+         horizSizing = "left";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         command = "ImportAssetConfigEditorWindow.editConfig();";
+         tooltipProfile = "GuiToolTipProfile";
+         tooltip = "Edit Config";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiBitmapButtonCtrl() {
+         bitmap = "tools/gui/images/iconDelete.png";
+         bitmapMode = "Centered";
+         autoFitExtents = "0";
+         useModifiers = "0";
+         useStates = "1";
+         masked = "0";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "346 53";
+         extent = "15 22";
+         minExtent = "8 2";
+         horizSizing = "left";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         command = "ImportAssetConfigEditorWindow.deleteConfig();";
+         tooltipProfile = "GuiToolTipProfile";
+         tooltip = "Delete Config";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiScrollCtrl() {
+         willFirstRespond = "1";
+         hScrollBar = "dynamic";
+         vScrollBar = "dynamic";
+         lockHorizScroll = "0";
+         lockVertScroll = "0";
+         constantThumbHeight = "0";
+         childMargin = "0 0";
+         mouseWheelScrollSpeed = "-1";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "9 82";
+         extent = "348 381";
+         minExtent = "8 2";
+         horizSizing = "width";
+         vertSizing = "height";
+         profile = "GuiScrollProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+
+         new GuiStackControl(ImportingAssetList) {
+            stackingType = "Vertical";
+            horizStacking = "Left to Right";
+            vertStacking = "Top to Bottom";
+            padding = "0";
+            dynamicSize = "1";
+            dynamicNonStackExtent = "0";
+            dynamicPos = "0";
+            changeChildSizeToFit = "0";
+            changeChildPosition = "1";
+            position = "1 1";
+            extent = "345 20";
+            minExtent = "16 16";
+            horizSizing = "width";
+            vertSizing = "bottom";
+            profile = "GuiDefaultProfile";
+            visible = "1";
+            active = "1";
+            tooltipProfile = "GuiToolTipProfile";
+            hovertime = "1000";
+            isContainer = "1";
+            canSave = "1";
+            canSaveDynamicFields = "0";
+         };
+      };
+   };
+};
+//--- OBJECT WRITE END ---

+ 147 - 0
Templates/BaseGame/game/tools/assetBrowser/guis/editAsset.gui

@@ -0,0 +1,147 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GuiControl(AssetBrowser_editAsset) {
+   position = "0 0";
+   extent = "1920 1080";
+   minExtent = "8 2";
+   horizSizing = "right";
+   vertSizing = "bottom";
+   profile = "ToolsGuiDefaultNonModalProfile";
+   visible = "1";
+   active = "1";
+   tooltipProfile = "GuiToolTipProfile";
+   hovertime = "1000";
+   isContainer = "1";
+   canSave = "1";
+   canSaveDynamicFields = "1";
+      enabled = "1";
+
+   new GuiWindowCtrl(AssetBrowser_editAssetWindow) {
+      text = "Asset Properties";
+      resizeWidth = "1";
+      resizeHeight = "1";
+      canMove = "1";
+      canClose = "1";
+      canMinimize = "1";
+      canMaximize = "0";
+      canCollapse = "0";
+      closeCommand = "Canvas.popDialog(AssetBrowser_editAsset);";
+      edgeSnap = "1";
+      margin = "0 0 0 0";
+      padding = "0 0 0 0";
+      anchorTop = "1";
+      anchorBottom = "0";
+      anchorLeft = "1";
+      anchorRight = "0";
+      position = "710 375";
+      extent = "500 329";
+      minExtent = "48 92";
+      horizSizing = "center";
+      vertSizing = "center";
+      profile = "ToolsGuiWindowProfile";
+      visible = "1";
+      active = "1";
+      tooltipProfile = "ToolsGuiToolTipProfile";
+      hovertime = "1000";
+      isContainer = "1";
+      canSave = "1";
+      canSaveDynamicFields = "0";
+
+      new GuiScrollCtrl() {
+         willFirstRespond = "1";
+         hScrollBar = "alwaysOff";
+         vScrollBar = "dynamic";
+         lockHorizScroll = "0";
+         lockVertScroll = "0";
+         constantThumbHeight = "0";
+         childMargin = "0 0";
+         mouseWheelScrollSpeed = "-1";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "1 21";
+         extent = "498 283";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiScrollProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+
+         new GuiInspector(AssetEditInspector) {
+            dividerMargin = "5";
+            showCustomFields = "1";
+            stackingType = "Vertical";
+            horizStacking = "Left to Right";
+            vertStacking = "Top to Bottom";
+            padding = "1";
+            dynamicSize = "1";
+            dynamicNonStackExtent = "0";
+            dynamicPos = "0";
+            changeChildSizeToFit = "1";
+            changeChildPosition = "1";
+            position = "1 1";
+            extent = "481 101";
+            minExtent = "16 16";
+            horizSizing = "right";
+            vertSizing = "bottom";
+            profile = "GuiInspectorProfile";
+            visible = "1";
+            active = "1";
+            tooltipProfile = "GuiToolTipProfile";
+            hovertime = "1000";
+            isContainer = "1";
+            canSave = "1";
+            canSaveDynamicFields = "0";
+         };
+      };
+      new GuiButtonCtrl() {
+         text = "Save";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "402 305";
+         extent = "45 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "AssetBrowser_editAsset.saveAsset();";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiButtonCtrl() {
+         text = "Cancel";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "450 305";
+         extent = "45 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "Canvas.popDialog(AssetBrowser_editAsset);";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+   };
+};
+//--- OBJECT WRITE END ---

+ 147 - 0
Templates/BaseGame/game/tools/assetBrowser/guis/editModule.gui

@@ -0,0 +1,147 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GuiControl(AssetBrowser_editModule) {
+   position = "0 0";
+   extent = "1920 1080";
+   minExtent = "8 2";
+   horizSizing = "right";
+   vertSizing = "bottom";
+   profile = "ToolsGuiDefaultNonModalProfile";
+   visible = "1";
+   active = "1";
+   tooltipProfile = "GuiToolTipProfile";
+   hovertime = "1000";
+   isContainer = "1";
+   canSave = "1";
+   canSaveDynamicFields = "1";
+      enabled = "1";
+
+   new GuiWindowCtrl(AssetBrowser_editModuleWindow) {
+      text = "Module Properties";
+      resizeWidth = "1";
+      resizeHeight = "1";
+      canMove = "1";
+      canClose = "1";
+      canMinimize = "1";
+      canMaximize = "0";
+      canCollapse = "0";
+      closeCommand = "Canvas.popDialog(AssetBrowser_editModule);";
+      edgeSnap = "1";
+      margin = "0 0 0 0";
+      padding = "0 0 0 0";
+      anchorTop = "1";
+      anchorBottom = "0";
+      anchorLeft = "1";
+      anchorRight = "0";
+      position = "710 375";
+      extent = "500 329";
+      minExtent = "48 92";
+      horizSizing = "center";
+      vertSizing = "center";
+      profile = "ToolsGuiWindowProfile";
+      visible = "1";
+      active = "1";
+      tooltipProfile = "ToolsGuiToolTipProfile";
+      hovertime = "1000";
+      isContainer = "1";
+      canSave = "1";
+      canSaveDynamicFields = "0";
+
+      new GuiScrollCtrl() {
+         willFirstRespond = "1";
+         hScrollBar = "alwaysOff";
+         vScrollBar = "dynamic";
+         lockHorizScroll = "0";
+         lockVertScroll = "0";
+         constantThumbHeight = "0";
+         childMargin = "0 0";
+         mouseWheelScrollSpeed = "-1";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "1 21";
+         extent = "498 283";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiScrollProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+
+         new GuiInspector(ModuleEditInspector) {
+            dividerMargin = "5";
+            showCustomFields = "1";
+            stackingType = "Vertical";
+            horizStacking = "Left to Right";
+            vertStacking = "Top to Bottom";
+            padding = "1";
+            dynamicSize = "1";
+            dynamicNonStackExtent = "0";
+            dynamicPos = "0";
+            changeChildSizeToFit = "1";
+            changeChildPosition = "1";
+            position = "1 1";
+            extent = "481 101";
+            minExtent = "16 16";
+            horizSizing = "right";
+            vertSizing = "bottom";
+            profile = "GuiInspectorProfile";
+            visible = "1";
+            active = "1";
+            tooltipProfile = "GuiToolTipProfile";
+            hovertime = "1000";
+            isContainer = "1";
+            canSave = "1";
+            canSaveDynamicFields = "0";
+         };
+      };
+      new GuiButtonCtrl() {
+         text = "Save";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "402 305";
+         extent = "45 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "AssetBrowser_editModule.saveModule();";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiButtonCtrl() {
+         text = "Cancel";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "450 305";
+         extent = "45 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "Canvas.popDialog(AssetBrowser_editModule);";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+   };
+};
+//--- OBJECT WRITE END ---

+ 237 - 0
Templates/BaseGame/game/tools/assetBrowser/guis/newAsset.gui

@@ -0,0 +1,237 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GuiControl(AssetBrowser_newAsset) {
+   position = "0 0";
+   extent = "1024 768";
+   minExtent = "8 2";
+   horizSizing = "right";
+   vertSizing = "bottom";
+   profile = "ToolsGuiDefaultNonModalProfile";
+   visible = "1";
+   active = "1";
+   tooltipProfile = "GuiToolTipProfile";
+   hovertime = "1000";
+   isContainer = "1";
+   canSave = "1";
+   canSaveDynamicFields = "1";
+
+   new GuiWindowCtrl(AssetBrowser_newAssetWindow) {
+      text = "Create Asset";
+      resizeWidth = "1";
+      resizeHeight = "1";
+      canMove = "1";
+      canClose = "1";
+      canMinimize = "0";
+      canMaximize = "0";
+      canCollapse = "0";
+      closeCommand = "Canvas.popDialog(AssetBrowser_newAsset);";
+      edgeSnap = "1";
+      margin = "0 0 0 0";
+      padding = "0 0 0 0";
+      anchorTop = "1";
+      anchorBottom = "0";
+      anchorLeft = "1";
+      anchorRight = "0";
+      position = "328 140";
+      extent = "368 450";
+      minExtent = "48 92";
+      horizSizing = "center";
+      vertSizing = "center";
+      profile = "ToolsGuiWindowProfile";
+      visible = "1";
+      active = "1";
+      tooltipProfile = "ToolsGuiToolTipProfile";
+      hovertime = "1000";
+      isContainer = "1";
+      canSave = "1";
+      canSaveDynamicFields = "0";
+
+      new GuiButtonCtrl(NewAssetCreateBtn) {
+         text = "Done";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "227 419";
+         extent = "64 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "CreateNewAsset();";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiButtonCtrl() {
+         text = "Cancel";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "295 419";
+         extent = "64 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "AssetBrowser_newAssetWindow.onClose();";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiTextCtrl() {
+         text = "Target Module:";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "12 30";
+         extent = "116 17";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiTextProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiPopUpMenuCtrlEx(NewAssetModuleList) {
+         maxPopupHeight = "200";
+         sbUsesNAColor = "0";
+         reverseTextList = "0";
+         bitmapBounds = "16 16";
+         hotTrackCallback = "0";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "134 27";
+         extent = "204 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         class = "AssetBrowserModuleList";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiBitmapButtonCtrl(NewAssetModuleBtn) {
+         bitmap = "tools/gui/images/iconAdd.png";
+         bitmapMode = "Centered";
+         autoFitExtents = "0";
+         useModifiers = "0";
+         useStates = "1";
+         masked = "0";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "342 27";
+         extent = "22 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         command = "Canvas.pushDialog(AssetBrowser_AddModule);\nAssetBrowser_addModuleWindow.selectWindow();";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiControl(NewComponentAssetSettings) {
+         position = "12 120";
+         extent = "344 107";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiScrollCtrl() {
+         willFirstRespond = "1";
+         hScrollBar = "alwaysOn";
+         vScrollBar = "alwaysOn";
+         lockHorizScroll = "0";
+         lockVertScroll = "0";
+         constantThumbHeight = "0";
+         childMargin = "0 0";
+         mouseWheelScrollSpeed = "-1";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "7 56";
+         extent = "354 357";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiScrollProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+
+         new GuiVariableInspector(NewAssetPropertiesInspector) {
+            dividerMargin = "5";
+            showCustomFields = "1";
+            stackingType = "Vertical";
+            horizStacking = "Left to Right";
+            vertStacking = "Top to Bottom";
+            padding = "1";
+            dynamicSize = "1";
+            dynamicNonStackExtent = "0";
+            dynamicPos = "0";
+            changeChildSizeToFit = "1";
+            changeChildPosition = "1";
+            position = "1 1";
+            extent = "337 338";
+            minExtent = "16 16";
+            horizSizing = "right";
+            vertSizing = "bottom";
+            profile = "GuiDefaultProfile";
+            visible = "1";
+            active = "1";
+            tooltipProfile = "GuiToolTipProfile";
+            hovertime = "1000";
+            isContainer = "1";
+            canSave = "1";
+            canSaveDynamicFields = "0";
+         };
+      };
+   };
+};
+//--- OBJECT WRITE END ---

+ 434 - 0
Templates/BaseGame/game/tools/assetBrowser/guis/newComponentAsset.gui

@@ -0,0 +1,434 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GuiControl(AssetBrowser_newComponentAsset) {
+   position = "0 0";
+   extent = "1024 768";
+   minExtent = "8 2";
+   horizSizing = "right";
+   vertSizing = "bottom";
+   profile = "ToolsGuiDefaultNonModalProfile";
+   visible = "1";
+   active = "1";
+   tooltipProfile = "GuiToolTipProfile";
+   hovertime = "1000";
+   isContainer = "1";
+   canSave = "1";
+   canSaveDynamicFields = "1";
+
+   new GuiWindowCtrl(AssetBrowser_newComponentAssetWindow) {
+      text = "Create Component";
+      resizeWidth = "1";
+      resizeHeight = "1";
+      canMove = "1";
+      canClose = "1";
+      canMinimize = "0";
+      canMaximize = "0";
+      canCollapse = "0";
+      closeCommand = "Canvas.popDialog(AssetBrowser_newComponentAsset);";
+      edgeSnap = "1";
+      margin = "0 0 0 0";
+      padding = "0 0 0 0";
+      anchorTop = "1";
+      anchorBottom = "0";
+      anchorLeft = "1";
+      anchorRight = "0";
+      position = "328 250";
+      extent = "368 268";
+      minExtent = "48 92";
+      horizSizing = "center";
+      vertSizing = "center";
+      profile = "ToolsGuiWindowProfile";
+      visible = "1";
+      active = "1";
+      tooltipProfile = "ToolsGuiToolTipProfile";
+      hovertime = "1000";
+      isContainer = "1";
+      canSave = "1";
+      canSaveDynamicFields = "0";
+
+      new GuiTextCtrl() {
+         text = "Target Module:";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "12 30";
+         extent = "116 17";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiTextProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiPopUpMenuCtrlEx() {
+         maxPopupHeight = "200";
+         sbUsesNAColor = "0";
+         reverseTextList = "0";
+         bitmapBounds = "16 16";
+         hotTrackCallback = "0";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "134 27";
+         extent = "204 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         internalName = "NewComponentModuleList";
+         class = "AssetBrowserModuleList";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiBitmapButtonCtrl() {
+         bitmap = "tools/gui/images/iconAdd.png";
+         bitmapMode = "Centered";
+         autoFitExtents = "0";
+         useModifiers = "0";
+         useStates = "1";
+         masked = "0";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "342 27";
+         extent = "22 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         command = "Canvas.pushDialog(AssetBrowser_AddModule);\nAssetBrowser_addModuleWindow.selectWindow();";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         internalName = "NewComponentModuleBtn";
+         class = "NewAssetModuleBtn";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiTextCtrl() {
+         text = "Component Name:";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "12 83";
+         extent = "116 17";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiTextProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiTextEditCtrl(NewComponentName) {
+         historySize = "0";
+         tabComplete = "0";
+         sinkAllKeyEvents = "0";
+         password = "0";
+         passwordMask = "*";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "134 83";
+         extent = "203 18";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiTextEditProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiTextCtrl() {
+         text = "Parent Component:";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "12 57";
+         extent = "116 17";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiTextProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiPopUpMenuCtrlEx(ParentComponentList) {
+         maxPopupHeight = "200";
+         sbUsesNAColor = "0";
+         reverseTextList = "0";
+         bitmapBounds = "16 16";
+         hotTrackCallback = "0";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "134 54";
+         extent = "204 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         command = "NewAssetTypeList.onSelected();";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiTextEditCtrl(NewComponentFriendlyName) {
+         historySize = "0";
+         tabComplete = "0";
+         sinkAllKeyEvents = "0";
+         password = "0";
+         passwordMask = "*";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "134 109";
+         extent = "203 18";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiTextEditProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiTextCtrl() {
+         text = "Friendly Name:";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "12 109";
+         extent = "116 17";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiTextProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiTextEditCtrl(NewComponentGroup) {
+         historySize = "0";
+         tabComplete = "0";
+         sinkAllKeyEvents = "0";
+         password = "0";
+         passwordMask = "*";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "134 134";
+         extent = "203 18";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiTextEditProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiTextCtrl() {
+         text = "Component Group:";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "12 134";
+         extent = "116 17";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiTextProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiContainer() {
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "134 159";
+         extent = "203 64";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+
+         new GuiMLTextEditCtrl(NewComponentDescription) {
+            lineSpacing = "2";
+            allowColorChars = "0";
+            maxChars = "-1";
+            useURLMouseCursor = "0";
+            position = "1 0";
+            extent = "201 64";
+            minExtent = "8 2";
+            horizSizing = "right";
+            vertSizing = "bottom";
+            profile = "ToolsGuiTextEditProfile";
+            visible = "1";
+            active = "1";
+            tooltipProfile = "GuiToolTipProfile";
+            hovertime = "1000";
+            isContainer = "0";
+            canSave = "1";
+            canSaveDynamicFields = "0";
+         };
+      };
+      new GuiTextCtrl() {
+         text = "Description:";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "12 159";
+         extent = "116 17";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiTextProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiButtonCtrl() {
+         text = "Done";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "224 240";
+         extent = "64 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "createNewComponentAsset();";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiButtonCtrl() {
+         text = "Cancel";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "292 240";
+         extent = "64 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "Canvas.popDialog(AssetBrowser_newComponentAsset);";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+   };
+};
+//--- OBJECT WRITE END ---

+ 144 - 0
Templates/BaseGame/game/tools/assetBrowser/guis/selectModule.gui

@@ -0,0 +1,144 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GuiControl(AssetBrowser_SelectModule) {
+   position = "0 0";
+   extent = "1024 768";
+   minExtent = "8 2";
+   horizSizing = "right";
+   vertSizing = "bottom";
+   profile = "ToolsGuiDefaultNonModalProfile";
+   visible = "1";
+   active = "1";
+   tooltipProfile = "GuiToolTipProfile";
+   hovertime = "1000";
+   isContainer = "1";
+   canSave = "1";
+   canSaveDynamicFields = "1";
+      enabled = "1";
+
+   new GuiWindowCtrl(AssetBrowser_SelectModuleWindow) {
+      text = "Select Module";
+      resizeWidth = "1";
+      resizeHeight = "1";
+      canMove = "1";
+      canClose = "1";
+      canMinimize = "0";
+      canMaximize = "0";
+      canCollapse = "0";
+      edgeSnap = "1";
+      margin = "0 0 0 0";
+      padding = "0 0 0 0";
+      anchorTop = "1";
+      anchorBottom = "0";
+      anchorLeft = "1";
+      anchorRight = "0";
+      position = "362 334";
+      extent = "299 99";
+      minExtent = "48 92";
+      horizSizing = "center";
+      vertSizing = "center";
+      profile = "ToolsGuiWindowProfile";
+      visible = "1";
+      active = "1";
+      tooltipProfile = "ToolsGuiToolTipProfile";
+      hovertime = "1000";
+      isContainer = "1";
+      canSave = "1";
+      canSaveDynamicFields = "0";
+
+      new GuiPopUpMenuCtrlEx() {
+         maxPopupHeight = "200";
+         sbUsesNAColor = "0";
+         reverseTextList = "0";
+         bitmapBounds = "16 16";
+         hotTrackCallback = "0";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "39 34";
+         extent = "217 19";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         class = "AssetBrowserModuleList";
+         internalName = "ModuleList";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiBitmapButtonCtrl() {
+         bitmap = "tools/gui/images/iconAdd.png";
+         bitmapMode = "Centered";
+         autoFitExtents = "0";
+         useModifiers = "0";
+         useStates = "1";
+         masked = "0";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "260 32";
+         extent = "22 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         class = "SelectPackage_NewAssetModuleBtn";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiButtonCtrl() {
+         text = "Select";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "88 68";
+         extent = "126 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "Canvas.popDialog(AssetBrowser_SelectModule);";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiButtonCtrl() {
+         text = "Cancel";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "220 68";
+         extent = "64 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "Canvas.popDialog(AssetBrowser_addModule);";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+   };
+};
+//--- OBJECT WRITE END ---

+ 144 - 0
Templates/BaseGame/game/tools/assetBrowser/guis/selectPackage.gui

@@ -0,0 +1,144 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GuiControl(AssetBrowser_SelectPackage) {
+   position = "0 0";
+   extent = "1024 768";
+   minExtent = "8 2";
+   horizSizing = "right";
+   vertSizing = "bottom";
+   profile = "ToolsGuiDefaultNonModalProfile";
+   visible = "1";
+   active = "1";
+   tooltipProfile = "GuiToolTipProfile";
+   hovertime = "1000";
+   isContainer = "1";
+   canSave = "1";
+   canSaveDynamicFields = "1";
+      enabled = "1";
+
+   new GuiWindowCtrl(AssetBrowser_SelectPackageWindow) {
+      text = "Select Package";
+      resizeWidth = "1";
+      resizeHeight = "1";
+      canMove = "1";
+      canClose = "1";
+      canMinimize = "0";
+      canMaximize = "0";
+      canCollapse = "0";
+      edgeSnap = "1";
+      margin = "0 0 0 0";
+      padding = "0 0 0 0";
+      anchorTop = "1";
+      anchorBottom = "0";
+      anchorLeft = "1";
+      anchorRight = "0";
+      position = "362 334";
+      extent = "299 99";
+      minExtent = "48 92";
+      horizSizing = "center";
+      vertSizing = "center";
+      profile = "ToolsGuiWindowProfile";
+      visible = "1";
+      active = "1";
+      tooltipProfile = "ToolsGuiToolTipProfile";
+      hovertime = "1000";
+      isContainer = "1";
+      canSave = "1";
+      canSaveDynamicFields = "0";
+
+      new GuiPopUpMenuCtrlEx() {
+         maxPopupHeight = "200";
+         sbUsesNAColor = "0";
+         reverseTextList = "0";
+         bitmapBounds = "16 16";
+         hotTrackCallback = "0";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "39 34";
+         extent = "217 19";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         class = "AssetBrowserPackageList";
+         internalName = "PackageList";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiBitmapButtonCtrl() {
+         bitmap = "tools/gui/images/iconAdd.png";
+         bitmapMode = "Centered";
+         autoFitExtents = "0";
+         useModifiers = "0";
+         useStates = "1";
+         masked = "0";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "260 32";
+         extent = "22 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         class = "SelectPackage_NewAssetPackageBtn";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiButtonCtrl() {
+         text = "Select";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "88 68";
+         extent = "126 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "Canvas.popDialog(AssetBrowser_SelectPackage);";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiButtonCtrl() {
+         text = "Cancel";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+         position = "220 68";
+         extent = "64 22";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "Canvas.popDialog(AssetBrowser_addPackage);";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+   };
+};
+//--- OBJECT WRITE END ---

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

@@ -0,0 +1,70 @@
+//-----------------------------------------------------------------------------
+// Copyright (c) 2012 GarageGames, LLC
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+// sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//-----------------------------------------------------------------------------
+if( !isObject( ToolsGuiDefaultNonModalProfile ) )
+new GuiControlProfile (ToolsGuiDefaultNonModalProfile : ToolsGuiDefaultProfile)
+{
+   modal = false;
+};
+
+function initializeAssetBrowser()
+{
+   echo(" % - Initializing Asset Browser");  
+   
+   exec("./guis/assetBrowser.gui");
+   exec("./guis/addModuleWindow.gui");
+   exec("./guis/gameObjectCreator.gui");
+   exec("./guis/newAsset.gui");
+   exec("./guis/newComponentAsset.gui");
+   exec("./guis/editAsset.gui");
+   exec("./guis/assetImport.gui");
+   exec("./guis/selectModule.gui");
+   exec("./guis/editModule.gui");
+
+   exec("./scripts/assetBrowser.cs");
+   exec("./scripts/popupMenus.cs");
+   exec("./scripts/addModuleWindow.cs");
+   exec("./scripts/assetImport.cs");
+   exec("./scripts/assetImportConfig.cs");
+   exec("./scripts/gameObjectCreator.cs");
+   exec("./scripts/newAsset.cs");
+   exec("./scripts/editAsset.cs");
+   exec("./scripts/editModule.cs");   
+   
+   exec("./scripts/fieldTypes.cs");
+   
+   new ScriptObject( AssetBrowserPlugin )
+   {
+      superClass = "EditorPlugin";
+   };
+   
+   Input::GetEventManager().subscribe( AssetBrowser, "BeginDropFiles" );
+   Input::GetEventManager().subscribe( AssetBrowser, "DropFile" );
+   Input::GetEventManager().subscribe( AssetBrowser, "EndDropFiles" );
+   
+   AssetBrowser.buildPopupMenus();
+}
+
+function AssetBrowserPlugin::onWorldEditorStartup( %this )
+{ 
+   // Add ourselves to the toolbar.
+   AssetBrowser.addToolbarButton();
+}

+ 112 - 0
Templates/BaseGame/game/tools/assetBrowser/scripts/addModuleWindow.cs

@@ -0,0 +1,112 @@
+//-----------------------------------------------------------------------------
+// Copyright (c) 2012 GarageGames, LLC
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+// sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//-----------------------------------------------------------------------------
+function AssetBrowser_addModuleWindow::onGainFirstResponder(%this)
+{
+   %this-->moduleName.setFirstResponder();
+}
+
+function AssetBrowser_addModuleWindow::close()
+{
+   Canvas.popDialog(AssetBrowser_addModule);  
+   eval(AssetBrowser_addModuleWindow.callbackFunction);
+}
+
+function AssetBrowser_addModuleWindow::CreateNewModule(%this)
+{
+   %newModuleName = %this-->moduleName.getText();
+   
+   if(%newModuleName $= "")
+      return;
+      
+   echo("Creating a new Module named: " @ %newModuleName);
+   
+   %moduleFilePath = "data/" @ %newModuleName;
+   %moduleDefinitionFilePath = %moduleFilePath @ "/" @ %newModuleName @ ".module";
+   %moduleScriptFilePath = %moduleFilePath @ "/" @ %newModuleName @ ".cs";
+   
+   %newModule = new ModuleDefinition()
+   {
+      ModuleId = %newModuleName;
+      versionId = 1;
+      ScriptFile = %newModuleName @ ".cs";
+      CreateFunction="onCreate";
+	   DestroyFunction="onDestroy";
+	   Group = "Game";
+      
+      new DeclaredAssets()
+      {
+         Extension = "asset.taml";
+         Recurse = true;
+      };
+   };
+   
+   TAMLWrite(%newModule, %moduleDefinitionFilePath); 
+   
+   //Now generate the script file for it
+   %file = new FileObject();
+	
+	if(%file.openForWrite(%moduleScriptFilePath))
+	{
+		%file.writeline("function " @ %newModuleName @ "::onCreate(%this)\n{\n\n}\n");
+		%file.writeline("function " @ %newModuleName @ "::onDestroy(%this)\n{\n\n}\n");
+		
+		//todo, pre-write any event functions of interest
+		
+		%file.close();
+	}
+   
+   //force a refresh of our modules list
+   ModuleDatabase.ignoreLoadedGroups(true);
+   ModuleDatabase.scanModules();
+   %success = ModuleDatabase.loadExplicit(%newModuleName, 1);
+   ModuleDatabase.ignoreLoadedGroups(false);
+   
+   //force a reload of the Module lists
+   NewAssetModuleList.refresh();
+   GameObjectModuleList.refresh();
+   ImportAssetModuleList.refresh();
+   
+   AssetBrowser.newModuleId = %newModuleName;
+   
+   Canvas.popDialog(AssetBrowser_addModule);
+   eval(AssetBrowser_addModuleWindow.callbackFunction);
+}
+
+function AssetBrowserModuleList::onWake(%this)
+{
+   %this.refresh();
+}
+
+function AssetBrowserModuleList::refresh(%this)
+{
+   %this.clear();
+   
+   //First, get our list of modules
+   %moduleList = ModuleDatabase.findModules();
+   
+   %count = getWordCount(%moduleList);
+   for(%i=0; %i < %count; %i++)
+   {
+      %moduleName = getWord(%moduleList, %i);
+      %this.add(%moduleName.ModuleId, %i);  
+   }
+}

+ 110 - 0
Templates/BaseGame/game/tools/assetBrowser/scripts/addPackageWindow.cs

@@ -0,0 +1,110 @@
+//-----------------------------------------------------------------------------
+// Copyright (c) 2012 GarageGames, LLC
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+// sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//-----------------------------------------------------------------------------
+function AssetBrowser_addPackageWindow::onGainFirstResponder(%this)
+{
+   %this-->packageName.setFirstResponder();
+}
+
+function AssetBrowser_addPackageWindow::close()
+{
+   Canvas.popDialog(AssetBrowser_addPackage);  
+   eval(AssetBrowser_addPackageWindow.callbackFunction);
+}
+
+function AssetBrowser_addPackageWindow::CreateNewPackage(%this)
+{
+   %newPackageName = %this-->packageName.getText();
+   
+   if(%newPackageName $= "")
+      return;
+      
+   echo("Creating a new package named: " @ %newPackageName);
+   
+   %moduleFilePath = "data/" @ %newPackageName;
+   %moduleDefinitionFilePath = %moduleFilePath @ "/" @ %newPackageName @ ".module";
+   %moduleScriptFilePath = %moduleFilePath @ "/" @ %newPackageName @ ".cs";
+   
+   %newPackage = new ModuleDefinition()
+   {
+      ModuleId = %newPackageName;
+      versionId = 1;
+      ScriptFile = %newPackageName @ ".cs";
+      CreateFunction="onCreate";
+	   DestroyFunction="onDestroy";
+	   Group = "Game";
+      
+      new DeclaredAssets()
+      {
+         Extension = "asset.taml";
+         Recurse = true;
+      };
+   };
+   
+   TAMLWrite(%newPackage, %moduleDefinitionFilePath); 
+   
+   //Now generate the script file for it
+   %file = new FileObject();
+	
+	if(%file.openForWrite(%moduleScriptFilePath))
+	{
+		%file.writeline("function " @ %newPackageName @ "::onCreate(%this)\n{\n\n}\n");
+		%file.writeline("function " @ %newPackageName @ "::onDestroy(%this)\n{\n\n}\n");
+		
+		//todo, pre-write any event functions of interest
+		
+		%file.close();
+	}
+   
+   //force a refresh of our modules list
+   ModuleDatabase.ignoreLoadedGroups(true);
+   ModuleDatabase.scanModules();
+   %success = ModuleDatabase.loadExplicit(%newPackageName, 1);
+   ModuleDatabase.ignoreLoadedGroups(false);
+   
+   //force a reload of the package lists
+   NewAssetPackageList.refresh();
+   GameObjectPackageList.refresh();
+   ImportAssetPackageList.refresh();
+   
+   Canvas.popDialog(AssetBrowser_addPackage);
+   eval(AssetBrowser_addPackageWindow.callbackFunction);
+}
+
+function AssetBrowserPackageList::onWake(%this)
+{
+   %this.refresh();
+}
+
+function AssetBrowserPackageList::refresh(%this)
+{
+   %this.clear();
+   
+   //First, get our list of modules
+   %moduleList = ModuleDatabase.findModules();
+   
+   %count = getWordCount(%moduleList);
+   for(%i=0; %i < %count; %i++)
+   {
+      %moduleName = getWord(%moduleList, %i);
+      %this.add(%moduleName.ModuleId, %i);  
+   }
+}

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

@@ -0,0 +1,1304 @@
+
+new SimGroup(AssetBrowserPreviewCache);
+
+//AssetBrowser.addToolbarButton
+function AssetBrowser::addToolbarButton(%this)
+{
+	%filename = expandFilename("tools/gui/images/iconOpen");
+	%button = new GuiBitmapButtonCtrl() {
+		canSaveDynamicFields = "0";
+		internalName = AssetBrowserBtn;
+		Enabled = "1";
+		isContainer = "0";
+		Profile = "ToolsGuiButtonProfile";
+		HorizSizing = "right";
+		VertSizing = "bottom";
+		position = "180 0";
+		Extent = "25 19";
+		MinExtent = "8 2";
+		canSave = "1";
+		Visible = "1";
+		Command = "AssetBrowser.ShowDialog();";
+		tooltipprofile = "ToolsGuiToolTipProfile";
+		ToolTip = "Asset Browser";
+		hovertime = "750";
+		bitmap = %filename;
+		bitmapMode = "Centered";
+		buttonType = "PushButton";
+		groupNum = "0";
+		useMouseEvents = "0";
+	};
+	ToolsToolbarArray.add(%button);
+	EWToolsToolbar.setExtent((25 + 8) * (ToolsToolbarArray.getCount()) + 12 SPC "33");
+}
+//
+function AssetBrowser::onAdd(%this)
+{
+   %this.isReImportingAsset = false;
+}
+
+function AssetBrowser::onWake(%this)
+{
+   %this.importAssetNewListArray = new ArrayObject();
+   %this.importAssetUnprocessedListArray = new ArrayObject();
+   %this.importAssetFinalListArray = new ArrayObject();
+}
+
+//Drag-Drop functionality
+function AssetBrowser::selectAsset( %this, %asset )
+{
+   if(AssetBrowser.selectCallback !$= "")
+   {
+      // The callback function should be ready to intake the returned material
+      //eval("materialEd_previewMaterial." @ %propertyField @ " = " @ %value @ ";");
+      if( AssetBrowser.returnType $= "name" )
+      {
+         eval( "" @ AssetBrowser.selectCallback @ "(" @ %name  @ ");");
+      }
+      else
+      {
+         %command = "" @ AssetBrowser.selectCallback @ "(\"" @ %asset  @ "\");";
+         eval(%command);
+      }
+   }
+   else
+   {
+      //try just setting the asset
+      %this.changeAsset();
+   }
+   
+   Inspector.refresh();
+   
+   AssetBrowser.hideDialog();
+}
+
+function AssetBrowser::showDialog( %this, %AssetTypeFilter, %selectCallback, %targetObj, %fieldName, %returnType)
+{
+   // Set the select callback
+   AssetBrowser.selectCallback = %selectCallback;
+   AssetBrowser.returnType = %returnType;
+   AssetBrowser.assetTypeFilter = %AssetTypeFilter;
+   AssetBrowser.fieldTargetObject = %targetObj;
+   AssetBrowser.fieldTargetName = %fieldName;
+
+   Canvas.add(AssetBrowser);
+   AssetBrowser.setVisible(1);
+   AssetBrowserWindow.setVisible(1);
+   AssetBrowserWindow.selectWindow();
+   
+   if(%selectCallback $= "")
+   {
+      //we're not in selection mode, so just hide the select button
+      %this-->SelectButton.setHidden(true);  
+   }
+   else
+   {
+      %this-->SelectButton.setHidden(false); 
+   }
+   
+   //AssetBrowser_importAssetWindow.setVisible(0);
+   //AssetBrowser_importAssetConfigWindow.setVisible(0);
+   AssetBrowser.loadFilters();
+}
+
+function AssetBrowser::hideDialog( %this )
+{
+   AssetBrowser.setVisible(1);
+   AssetBrowserWindow.setVisible(1);
+   Canvas.popDialog(AssetBrowser_addModule);
+   Canvas.popDialog(ImportAssetWindow);
+   
+   Canvas.popDialog(AssetBrowser);
+}
+
+function AssetBrowser::buildPreviewArray( %this, %asset, %moduleName )
+{
+   %assetDesc = AssetDatabase.acquireAsset(%asset);
+   %assetName = AssetDatabase.getAssetName(%asset);
+   %previewImage = "core/art/warnmat";
+   
+   AssetPreviewArray.empty();
+      
+   // 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);
+   
+   %container = new GuiControl(){
+      profile = "ToolsGuiDefaultProfile";
+      Position = "0 0";
+      Extent = %previewSize.x + %previewBounds SPC %previewSize.y + %previewBounds + 24;
+      HorizSizing = "right";
+      VertSizing = "bottom";
+      isContainer = "1";
+      assetName = %assetName;
+      moduleName = %moduleName;
+      assetType = %assetType;
+   };
+
+   %tooltip = %assetName;
+   
+   if(%assetType $= "ShapeAsset")
+   {
+      %previewButton = new GuiObjectView()
+      {
+         className = "AssetPreviewControl";
+         internalName = %matName;
+         HorizSizing = "right";
+         VertSizing = "bottom";
+         Profile = "ToolsGuiDefaultProfile";
+         position = "7 4";
+         extent = %previewSize;
+         MinExtent = "8 8";
+         canSave = "1";
+         Visible = "1";
+         tooltipprofile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
+         Margin = "0 0 0 0";
+         Padding = "0 0 0 0";
+         AnchorTop = "1";
+         AnchorBottom = "0";
+         AnchorLeft = "1";
+         AnchorRight = "0";
+         renderMissionArea = "0";
+         GizmoProfile = "GlobalGizmoProfile";
+         cameraZRot = "0";
+         forceFOV = "0";
+         gridColor = "0 0 0 0";
+         renderNodes = "0";
+         renderObjBox = "0";
+         renderMounts = "0";
+         renderColMeshes = "0";
+         selectedNode = "-1";
+         sunDiffuse = "255 255 255 255";
+         sunAmbient = "180 180 180 255";
+         timeScale = "1.0";
+         fixedDetail = "0";
+         orbitNode = "0";
+         
+         new GuiBitmapButtonCtrl()
+         {
+            HorizSizing = "right";
+            VertSizing = "bottom";
+            profile = "ToolsGuiButtonProfile";
+            position = "0 0";
+            extent = %previewSize;
+            Variable = "";
+            buttonType = "ToggleButton";
+            bitmap = "tools/materialEditor/gui/cubemapBtnBorder";
+            groupNum = "0";
+            text = "";
+         }; 
+      };
+      
+      %assetQuery = new AssetQuery();
+      %numAssetsFound = AssetDatabase.findAllAssets(%assetQuery);
+      
+      for( %i=0; %i < %numAssetsFound; %i++)
+      {
+          %assetId = %assetQuery.getAsset(%i);
+          %name = AssetDatabase.getAssetName(%assetId);
+          
+          if(%name $= %assetName)
+          {
+            %asset = AssetDatabase.acquireAsset(%assetId);
+            
+            %previewButton.setModel(%asset.fileName);
+            //%previewButton.refreshShape();
+            //%previewButton.currentDL = 0;
+            //%previewButton.fitToShape();
+            
+            break;
+          }
+      }
+   }
+   else
+   {
+      if(%assetType $= "ComponentAsset")
+      {
+         %assetPath = "data/" @ %moduleName @ "/components/" @ %assetName @ ".cs";
+         %doubleClickCommand = "EditorOpenFileInTorsion( "@%assetPath@", 0 );";
+         
+         %previewImage = "tools/assetBrowser/art/componentIcon";
+         
+         %assetFriendlyName = %assetDesc.friendlyName;
+         %assetDesc = %assetDesc.description;
+         %tooltip = %assetFriendlyName @ "\n" @ %assetDesc;
+      }
+      else if(%assetType $= "GameObjectAsset")
+      {
+         %assetPath = "data/" @ %moduleName @ "/gameObjects/" @ %assetName @ ".cs";
+         %doubleClickCommand = "EditorOpenFileInTorsion( "@%assetPath@", 0 );";
+         
+         %previewImage = "tools/assetBrowser/art/gameObjectIcon";
+         
+         %tooltip = %assetDesc.gameObjectName;
+      }
+      else if(%assetType $= "ImageAsset")
+      {
+         //nab the image and use it for the preview
+         %assetQuery = new AssetQuery();
+         %numAssetsFound = AssetDatabase.findAllAssets(%assetQuery);
+         
+         for( %i=0; %i < %numAssetsFound; %i++)
+         {
+             %assetId = %assetQuery.getAsset(%i);
+             %name = AssetDatabase.getAssetName(%assetId);
+             
+             if(%name $= %assetName)
+             {
+               %asset = AssetDatabase.acquireAsset(%assetId);
+               %previewImage = %asset.imageFile;
+               break;
+             }
+         }
+      }
+      else if(%assetType $= "StateMachineAsset")
+      {
+         %previewImage = "tools/assetBrowser/art/stateMachineIcon";
+      }
+      else if(%assetType $= "SoundAsset")
+      {
+         %previewImage = "tools/assetBrowser/art/soundIcon";
+      }
+      else if(%assetType $= "LevelAsset")
+      {
+         %previewImage = "tools/assetBrowser/art/levelIcon";
+      }
+      else if(%assetType $= "PostEffectAsset")
+      {
+         %previewImage = "tools/assetBrowser/art/postEffectIcon";
+      }
+      else if(%assetType $= "GUIAsset")
+      {
+         %previewImage = "tools/assetBrowser/art/guiIcon";
+      }
+      else if(%assetType $= "ScriptAsset")
+      {
+         if(%assetDesc.isServerSide)
+            %previewImage = "tools/assetBrowser/art/serverScriptIcon";
+         else
+            %previewImage = "tools/assetBrowser/art/clientScriptIcon";
+      }
+      else if(%assetType $= "MaterialAsset")
+      {
+         %previewImage = "";
+         //nab the image and use it for the preview
+         %assetQuery = new AssetQuery();
+         %numAssetsFound = AssetDatabase.findAllAssets(%assetQuery);
+         
+         for( %i=0; %i < %numAssetsFound; %i++)
+         {
+             %assetId = %assetQuery.getAsset(%i);
+             %name = AssetDatabase.getAssetName(%assetId);
+             
+             if(%name $= %assetName)
+             {
+               %asset = AssetDatabase.acquireAsset(%assetId);
+               %previewImage = %asset.materialDefinitionName.diffuseMap[0];
+               break;
+             }
+         }
+         
+         if(%previewImage $= "")
+            %previewImage = "tools/assetBrowser/art/materialIcon";
+      }
+      if(%assetType $= "ShapeAnimationAsset")
+      {
+         %previewImage = "tools/assetBrowser/art/animationIcon";
+      }
+      
+      %previewButton = new GuiBitmapButtonCtrl()
+      {
+         className = "AssetPreviewControl";
+         internalName = %assetName;
+         HorizSizing = "right";
+         VertSizing = "bottom";
+         profile = "ToolsGuiButtonProfile";
+         position = "10 4";
+         extent = %previewSize;
+         buttonType = "PushButton";
+         bitmap = %previewImage;
+         Command = "";
+         text = "";
+         useStates = false;
+         
+         new GuiBitmapButtonCtrl()
+         {
+               HorizSizing = "right";
+               VertSizing = "bottom";
+               profile = "ToolsGuiButtonProfile";
+               position = "0 0";
+               extent = %previewSize;
+               Variable = "";
+               buttonType = "toggleButton";
+               bitmap = "tools/materialEditor/gui/cubemapBtnBorder";
+               groupNum = "0";
+               text = "";
+            }; 
+      }; 
+   }
+   
+   %previewBorder = new GuiButtonCtrl(){
+         class = "AssetPreviewButton";
+         internalName = %assetName@"Border";
+         HorizSizing = "right";
+         VertSizing = "bottom";
+         profile = "ToolsGuiThumbHighlightButtonProfile";
+         position = "0 0";
+         extent = %previewSize.x + %previewBounds SPC %previewSize.y + 24;
+         Variable = "";
+         buttonType = "radioButton";
+         tooltip = %tooltip;
+         Command = "AssetBrowser.updateSelection( $ThisControl.getParent().assetName, $ThisControl.getParent().moduleName );"; 
+		   altCommand = %doubleClickCommand;
+         groupNum = "0";
+         useMouseEvents = true;
+         text = "";
+         icon = %previewImage;
+   };
+   
+   %previewNameCtrl = new GuiTextEditCtrl(){
+         position = 0 SPC %previewSize.y + %previewBounds - 16;
+         profile = ToolsGuiTextEditCenterProfile;
+         extent = %previewSize.x + %previewBounds SPC 16;
+         text = %assetName;
+         originalAssetName = %assetName; //special internal field used in renaming assets
+         internalName = "AssetNameLabel";
+         class = "AssetNameField";
+         active = false;
+      };
+   
+   %container.add(%previewButton);  
+   %container.add(%previewBorder); 
+   %container.add(%previewNameCtrl);
+   
+   // add to the gui control array
+   AssetBrowser-->materialSelection.add(%container);
+   
+   // add to the array object for reference later
+   AssetPreviewArray.add( %previewButton, %previewImage );
+}
+
+function AssetBrowser::loadImages( %this, %materialNum )
+{
+   // this will save us from spinning our wheels in case we don't exist
+   /*if( !AssetBrowser.visible )
+      return;
+   
+   // this schedule is here to dynamically load images
+   %previewButton = AssetPreviewArray.getKey(%materialNum);
+   %previewImage = AssetPreviewArray.getValue(%materialNum);
+   
+   if(%previewButton.getClassName() !$= "GuiObjectView")
+   {
+      %previewButton.setBitmap(%previewImage);
+      %previewButton.setText("");
+   }
+   
+   %materialNum++;
+   
+   /*if( %materialNum < AssetPreviewArray.count() )
+   {
+      %tempSchedule = %this.schedule(64, "loadImages", %materialNum);
+      MatEdScheduleArray.add( %tempSchedule, %materialNum );
+   }*/
+}
+
+function AssetBrowser::loadFilters( %this )
+{
+   AssetBrowser-->filterTree.clear();
+
+   AssetBrowser-->filterTree.buildIconTable(":tools/classIcons/prefab");
+
+   AssetBrowser-->filterTree.insertItem(0, "Assets");
+   
+   //First, build our our list of active modules
+   %modulesList = ModuleDatabase.findModules(true);
+   
+   for(%i=0; %i < getWordCount(%modulesList); %i++)
+   {
+      %moduleName = getWord(%modulesList, %i).ModuleId;
+      
+      %moduleItemId = AssetBrowser-->filterTree.findItemByName(%moduleName);
+		
+		if(%moduleItemId == 0)
+		   %moduleItemId = AssetBrowser-->filterTree.insertItem(1, %moduleName, "", "", 1, 1); 
+   }
+
+   //Next, go through and list the asset categories
+   %assetQuery = new AssetQuery();
+   %numAssetsFound = AssetDatabase.findAllAssets(%assetQuery);
+   
+   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;
+		
+		//These are core, native-level components, so we're not going to be messing with this module at all, skip it
+		if(%moduleName $= "CoreComponentsModule")
+		   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);
+   
+   //special handling for selections
+   if(AssetBrowser.newModuleId !$= "")
+   {
+      AssetBrowser-->filterTree.clearSelection();
+      %newModuleItem = AssetBrowser-->filterTree.findItemByName(AssetBrowser.newModuleId);
+      AssetBrowser-->filterTree.selectItem(%newModuleItem);
+      AssetBrowser.newModuleId = ""; 
+   }
+   
+   %selectedItem = AssetBrowser-->filterTree.getSelectedItem();
+   AssetBrowser-->filterTree.scrollVisibleByObjectId(%selectedItem);
+}
+
+// create category and update current material if there is one
+function AssetBrowser::createFilter( %this, %filter )
+{
+   if( %filter $= %existingFilters )
+   {
+      MessageBoxOK( "Error", "Can not create blank filter.");
+      return;
+   }
+      
+   for( %i = AssetBrowser.staticFilterObjects; %i < AssetBrowser-->filterArray.getCount() ; %i++ )
+   {
+      %existingFilters = AssetBrowser-->filterArray.getObject(%i).getObject(0).filter;
+      if( %filter $= %existingFilters )
+      {
+         MessageBoxOK( "Error", "Can not create two filters of the same name.");
+         return;
+      }
+   }
+   %container = new GuiControl(){
+      profile = "ToolsGuiDefaultProfile";
+      Position = "0 0";
+      Extent = "128 18";
+      HorizSizing = "right";
+      VertSizing = "bottom";
+      isContainer = "1";
+         
+      new GuiCheckBoxCtrl(){
+         Profile = "ToolsGuiCheckBoxListProfile";
+         position = "5 1";
+         Extent = "118 18";
+         Command = "";
+         groupNum = "0";
+         buttonType = "ToggleButton";
+         text = %filter @ " ( " @ MaterialFilterAllArray.countKey(%filter) @ " )";
+         filter = %filter;
+         Command = "AssetBrowser.preloadFilter();";
+      };
+   };
+   
+   AssetBrowser-->filterArray.add( %container );
+   
+   // if selection exists, lets reselect it to refresh it
+   if( isObject(AssetBrowser.selectedMaterial) )
+      AssetBrowser.updateSelection( AssetBrowser.selectedMaterial, AssetBrowser.selectedPreviewImagePath );
+   
+   // material category text field to blank
+   AssetBrowser_addFilterWindow-->tagName.setText("");
+}
+
+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
+   
+   %isAssetBorder = 0;
+   eval("%isAssetBorder = isObject(AssetBrowser-->"@%asset@"Border);");
+   if( %isAssetBorder )
+   {
+      eval( "AssetBrowser-->"@%asset@"Border.setStateOn(1);");
+   }
+      
+   %isAssetBorderPrevious = 0;
+   eval("%isAssetBorderPrevious = isObject(AssetBrowser-->"@%this.prevSelectedMaterialHL@"Border);");
+   if( %isAssetBorderPrevious )
+   {
+      eval( "AssetBrowser-->"@%this.prevSelectedMaterialHL@"Border.setStateOn(0);");
+   }
+   
+   AssetBrowser.selectedMaterial = %asset;
+   AssetBrowser.selectedAsset = %moduleName@":"@%asset;
+   AssetBrowser.selectedAssetDef = AssetDatabase.acquireAsset(AssetBrowser.selectedAsset);
+   //AssetBrowser.selectedPreviewImagePath = %previewImagePath;
+   
+   %this.prevSelectedMaterialHL = %asset;
+}
+
+//
+//needs to be deleted with the persistence manager and needs to be blanked out of the matmanager
+//also need to update instances... i guess which is the tricky part....
+function AssetBrowser::showDeleteDialog( %this )
+{
+   %material = AssetBrowser.selectedMaterial;
+   %secondFilter = "MaterialFilterMappedArray";
+   %secondFilterName = "Mapped";
+   
+   for( %i = 0; %i < MaterialFilterUnmappedArray.count(); %i++ )
+   {
+      if( MaterialFilterUnmappedArray.getValue(%i) $= %material )
+      {
+         %secondFilter = "MaterialFilterUnmappedArray";
+         %secondFilterName = "Unmapped";
+         break;
+      }
+   }
+   
+   if( isObject( %material ) )
+   {
+      MessageBoxYesNoCancel("Delete Material?", 
+         "Are you sure you want to delete<br><br>" @ %material.getName() @ "<br><br> Material deletion won't take affect until the engine is quit.", 
+         "AssetBrowser.deleteMaterial( " @ %material @ ", " @ %secondFilter @ ", " @ %secondFilterName @" );", 
+         "", 
+         "" );
+   }
+}
+
+function AssetBrowser::deleteMaterial( %this, %materialName, %secondFilter, %secondFilterName )
+{
+   if( !isObject( %materialName ) )
+      return;
+   
+   for( %i = 0; %i <= MaterialFilterAllArray.countValue( %materialName ); %i++)
+   {
+      %index = MaterialFilterAllArray.getIndexFromValue( %materialName );
+      MaterialFilterAllArray.erase( %index );
+   }
+   MaterialFilterAllArrayCheckbox.setText("All ( " @ MaterialFilterAllArray.count() - 1 @ " ) ");
+   
+   %checkbox = %secondFilter @ "Checkbox";
+   for( %k = 0; %k <= %secondFilter.countValue( %materialName ); %k++)
+   {
+      %index = %secondFilter.getIndexFromValue( %materialName );
+      %secondFilter.erase( %index );
+   }
+   %checkbox.setText( %secondFilterName @ " ( " @ %secondFilter.count() - 1 @ " ) ");
+   
+   for( %i = 0; %materialName.getFieldValue("materialTag" @ %i) !$= ""; %i++ )
+   {
+      %materialTag = %materialName.getFieldValue("materialTag" @ %i);
+         
+         for( %j = AssetBrowser.staticFilterObjects; %j < AssetBrowser-->filterArray.getCount() ; %j++ )
+         {
+            if( %materialTag $= AssetBrowser-->filterArray.getObject(%j).getObject(0).filter )
+            {
+               %count = getWord( AssetBrowser-->filterArray.getObject(%j).getObject(0).getText(), 2 );
+               %count--;
+               AssetBrowser-->filterArray.getObject(%j).getObject(0).setText( %materialTag @ " ( "@ %count @ " )");
+            }
+         }
+      
+   }
+   
+   UnlistedMaterials.add( "unlistedMaterials", %materialName );
+   
+   if( %materialName.getFilename() !$= "" && 
+         %materialName.getFilename() !$= "tools/gui/AssetBrowser.ed.gui" &&
+         %materialName.getFilename() !$= "tools/materialEditor/scripts/materialEditor.ed.cs" )
+   {
+      AssetBrowserPerMan.removeObjectFromFile(%materialName);
+      AssetBrowserPerMan.saveDirty();
+   }
+      
+   AssetBrowser.preloadFilter();
+}
+
+function AssetBrowser::thumbnailCountUpdate(%this)
+{
+   $Pref::AssetBrowser::ThumbnailCountIndex = AssetBrowser-->materialPreviewCountPopup.getSelected();
+   AssetBrowser.LoadFilter( AssetBrowser.currentFilter, AssetBrowser.currentStaticFilter );
+}
+
+function AssetBrowser::toggleTagFilterPopup(%this)
+{
+	if(TagFilterWindow.visible)
+		TagFilterWindow.visible = false;
+	else
+		TagFilterWindow.visible = true;
+		
+	return;
+   %assetQuery = new AssetQuery();
+   %numAssetsFound = AssetDatabase.findAllAssets(%assetQuery);
+   
+   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;
+		
+		//check that we don't re-add it
+		%moduleItemId = AssetBrowser-->filterTree.findItemByName(%moduleName);
+		
+		if(%moduleItemId == -1 || %moduleItemId == 0)
+			%moduleItemId = AssetBrowser-->filterTree.insertItem(1, %module.moduleId, "", "", 1, 1);
+			
+		//now, add the asset's category
+		%assetType = AssetDatabase.getAssetCategory(%assetId);
+		
+		%checkBox = new GuiCheckBoxCtrl()
+		{
+			canSaveDynamicFields = "0";
+			isContainer = "0";
+			Profile = "ToolsGuiCheckBoxListProfile";
+			HorizSizing = "right";
+			VertSizing = "bottom";
+			Position = "0 0";
+			Extent = (%textLength * 4) @ " 18";
+			MinExtent = "8 2";
+			canSave = "1";
+			Visible = "1";
+			Variable = %var;
+			tooltipprofile = "ToolsGuiToolTipProfile";
+			hovertime = "1000";
+			text = %text;
+			groupNum = "-1";
+			buttonType = "ToggleButton";
+			useMouseEvents = "0";
+			useInactiveState = "0";
+			Command = %cmd;
+		};
+		
+		TagFilterList.add(%checkBox);
+   }	
+}
+
+function AssetBrowser::changeAsset(%this)
+{
+   //alright, we've selectd an asset for a field, so time to set it!
+   %cmd = %this.fieldTargetObject @ "." @ %this.fieldTargetName @ "=\"" @ %this.selectedAsset @ "\";";
+   echo("Changing asset via the " @ %cmd @ " command");
+   eval(%cmd);
+}
+
+function AssetBrowser::reImportAsset(%this)
+{
+   //Find out what type it is
+   %assetDef = AssetDatabase.acquireAsset(EditAssetPopup.assetId);
+   %assetType = AssetDatabase.getAssetType(EditAssetPopup.assetId);
+      
+   if(%assetType $= "ShapeAsset" || %assetType $= "ImageAsset" || %assetType $= "SoundAsset")
+   {
+      AssetBrowser.isAssetReImport = true;
+      AssetBrowser.reImportingAssetId = EditAssetPopup.assetId;
+      
+      AssetBrowser.onBeginDropFiles();
+      AssetBrowser.onDropFile(%assetDef.originalFilePath);
+      AssetBrowser.onEndDropFiles();
+      
+      %module = AssetDatabase.getAssetModule(EditAssetPopup.assetId);
+      
+      //get the selected module data
+      ImportAssetModuleList.setText(%module.ModuleId);
+   }
+}
+
+//------------------------------------------------------------------------------
+function AssetPreviewButton::onRightClick(%this)
+{
+   AssetBrowser.selectedAssetPreview = %this.getParent();
+   EditAssetPopup.assetId = %this.getParent().moduleName @ ":" @ %this.getParent().assetName;
+   %assetType = %this.getParent().assetType;
+   
+   //Do some enabling/disabling of options depending on asset type
+   EditAssetPopup.enableItem(0, true);
+   EditAssetPopup.enableItem(7, true);
+   
+   //Is it an editable type?
+   if(%assetType $= "ImageAsset" || %assetType $= "GameObjectAsset" || %assetType $= "SoundAsset")
+   {
+      EditAssetPopup.enableItem(0, false);
+   }
+   
+   //Is it an importable type?
+   if(%assetType $= "GameObjectAsset" || %assetType $= "ComponentAsset" || %assetType $= "GUIAsset" || %assetType $= "LevelAsset"
+       || %assetType $= "MaterialAsset" || %assetType $= "ParticleAsset"  || %assetType $= "PostEffectAsset" || %assetType $= "ScriptAsset"
+       || %assetType $= "StateMachineAsset")
+   {
+      EditAssetPopup.enableItem(7, false);
+   }
+   
+   EditAssetPopup.showPopup(Canvas);  
+}
+
+function AssetListPanel::onRightMouseDown(%this)
+{
+   AddNewAssetPopup.showPopup(Canvas);
+}
+
+//------------------------------------------------------------------------------
+function AssetBrowser::refreshPreviews(%this)
+{
+   AssetBrowserFilterTree.onSelect(AssetBrowser.selectedItem);
+}
+
+function AssetBrowserFilterTree::onSelect(%this, %itemId)
+{
+	if(%itemId == 1)
+		//can't select root
+		return;
+		
+   //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!
+   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();
+   
+   // manage preview array
+   if(!isObject(AssetPreviewArray))
+      new ArrayObject(AssetPreviewArray);
+      
+   // we have to empty out the list; so when we create new guicontrols, these dont linger
+   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!
+			%assetType = AssetDatabase.getAssetCategory(%assetId);
+			if(%assetType $= "")
+			{
+			   %assetType = AssetDatabase.getAssetType(%assetId);
+			}
+			
+			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(strstr(strlwr(%assetName), strlwr(%searchText)) != -1)
+						%assetArray.add( %moduleName, %assetId);
+				}
+				else
+				{
+					//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) );
+   
+   AssetBrowser.loadImages( 0 );
+}
+
+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
+      {
+         //get the parent, and thus our module
+         %moduleId = %this.getParentItem(%itemId);
+         
+         //set the module value for creation info
+         AssetBrowser.selectedModule = %this.getItemText(%moduleId);
+         
+         if(%this.getItemText(%itemId) $= "ComponentAsset")
+         {
+            AddNewComponentAssetPopup.showPopup(Canvas);
+            //Canvas.popDialog(AssetBrowser_newComponentAsset); 
+	         //AssetBrowser_newComponentAsset-->AssetBrowserModuleList.setText(AssetBrowser.selectedModule);
+         }
+         else
+         {
+            
+         }
+      }
+   }
+   else if( %this.getSelectedItemsCount() > 0 && %itemId == 1)
+   {
+      AddNewModulePopup.showPopup(Canvas); 
+   }
+}
+
+//
+//
+function AssetBrowserSearchFilterText::onWake( %this )
+{
+   /*%filter = %this.treeView.getFilterText();
+   if( %filter $= "" )
+      %this.setText( "\c2Filter..." );
+   else
+      %this.setText( %filter );*/
+}
+
+//------------------------------------------------------------------------------
+
+function AssetBrowserSearchFilterText::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 )
+{
+   %text = %this.getText();
+   if( %text $= "" )
+      %this.reset();
+   else
+   {
+      //%this.treeView.setFilterText( %text );
+	  %curItem = AssetBrowserFilterTree.getSelectedItem();
+	  AssetBrowserFilterTree.onSelect(%curItem);
+   }
+}
+
+//---------------------------------------------------------------------------------------------
+
+function AssetBrowserSearchFilterText::reset( %this )
+{
+   %this.setText( "\c2Filter..." );
+   //%this.treeView.clearFilterText();
+   %curItem = AssetBrowserFilterTree.getSelectedItem();
+   AssetBrowserFilterTree.onSelect(%curItem);
+}
+
+//---------------------------------------------------------------------------------------------
+
+function AssetBrowserSearchFilterText::onClick( %this )
+{
+   %this.textCtrl.reset();
+}
+
+//
+//
+//
+function AssetBrowser::reloadModules(%this)
+{
+   ModuleDatabase.unloadGroup("Game");
+   
+   %modulesList = ModuleDatabase.findModules();
+   
+   %count = getWordCount(%modulesList);
+   
+   for(%i=0; %i < %count; %i++)
+   {
+      %moduleId = getWord(%modulesList, %i).ModuleId;
+      ModuleDatabase.unloadExplicit(%moduleId);
+   }
+
+   ModuleDatabase.scanModules();
+   
+   %modulesList = ModuleDatabase.findModules();
+   
+   %count = getWordCount(%modulesList);
+   
+   for(%i=0; %i < %count; %i++)
+   {
+      %moduleId = getWord(%modulesList, %i).ModuleId;
+      ModuleDatabase.loadExplicit(%moduleId);
+   }
+   
+   //ModuleDatabase.loadGroup("Game");
+}
+//
+
+function AssetPreviewButton::onMouseDragged(%this)
+{
+   %payload = new GuiBitmapButtonCtrl();
+   %payload.assignFieldsFrom( %this );
+   %payload.className = "AssetPreviewControl";
+   %payload.position = "0 0";
+   %payload.dragSourceControl = %this;
+   %payload.bitmap = %this.icon;
+   %payload.extent.x /= 2;
+   %payload.extent.y /= 2;
+   
+   %xOffset = getWord( %payload.extent, 0 ) / 2;
+   %yOffset = getWord( %payload.extent, 1 ) / 2;
+   
+   // Compute the initial position of the GuiDragAndDrop control on the cavas based on the current
+   // mouse cursor position.
+   
+   %cursorpos = Canvas.getCursorPos();
+   %xPos = getWord( %cursorpos, 0 ) - %xOffset;
+   %yPos = getWord( %cursorpos, 1 ) - %yOffset;
+   
+   if(!isObject(EditorDragAndDropLayer))
+   {
+      new GuiControl(EditorDragAndDropLayer)
+      {
+         position = "0 0";
+         extent = Canvas.extent;
+      };
+   }
+   
+   // Create the drag control.
+   %ctrl = new GuiDragAndDropControl()
+   {
+      canSaveDynamicFields    = "0";
+      Profile                 = "GuiSolidDefaultProfile";
+      HorizSizing             = "right";
+      VertSizing              = "bottom";
+      Position                = %xPos SPC %yPos;
+      extent                  = %payload.extent;
+      MinExtent               = "4 4";
+      canSave                 = "1";
+      Visible                 = "1";
+      hovertime               = "1000";
+
+      // Let the GuiDragAndDropControl delete itself on mouse-up.  When the drag is aborted,
+      // this not only deletes the drag control but also our payload.
+      deleteOnMouseUp         = true;
+      
+      useWholeCanvas = true;
+
+      // To differentiate drags, use the namespace hierarchy to classify them.
+      // This will allow a color swatch drag to tell itself apart from a file drag, for example.
+      class                   = "AssetPreviewControlType_AssetDrop";
+   };
+   
+   // Add the temporary color swatch to the drag control as the payload.
+   %ctrl.add( %payload );
+   
+   // Start drag by adding the drag control to the canvas and then calling startDragging().
+   //Canvas.getContent().add( %ctrl );
+   EditorDragAndDropLayer.add(%ctrl);
+   Canvas.pushDialog(EditorDragAndDropLayer);
+   
+   %ctrl.startDragging( %xOffset, %yOffset );
+}
+
+function AssetPreviewButton::onControlDragCancelled(%this)
+{
+   Canvas.popDialog(EditorDragAndDropLayer);
+}
+
+function AssetPreviewButton::onControlDropped( %this, %payload, %position )
+{
+   Canvas.popDialog(EditorDragAndDropLayer);
+   
+   // Make sure this is a color swatch drag operation.
+   if( !%payload.parentGroup.isInNamespaceHierarchy( "AssetPreviewControlType_AssetDrop" ) )
+      return;
+
+   // If dropped on same button whence we came from,
+   // do nothing.
+
+   if( %payload.dragSourceControl == %this )
+      return;
+
+   // If a swatch button control is dropped onto this control,
+   // copy it's color.
+
+   if( %payload.isMemberOfClass( "AssetPreviewButton" ) )
+   {
+      // If the swatch button is part of a color-type inspector field,
+      // remember the inspector field so we can later set the color
+      // through it.
+
+      if( %this.parentGroup.isMemberOfClass( "GuiInspectorTypeColorI" ) )
+         %this.parentGroup.apply( ColorFloatToInt( %payload.color ) );
+      else if( %this.parentGroup.isMemberOfClass( "GuiInspectorTypeColorF" ) )
+         %this.parentGroup.apply( %payload.color );
+      else
+         %this.setColor( %payload.color );
+   }
+}
+
+function EWorldEditor::onControlDropped( %this, %payload, %position )
+{
+   Canvas.popDialog(EditorDragAndDropLayer);
+   
+   // Make sure this is a color swatch drag operation.
+   if( !%payload.parentGroup.isInNamespaceHierarchy( "AssetPreviewControlType_AssetDrop" ) )
+      return;
+
+   // If dropped on same button whence we came from,
+   // do nothing.
+
+   if( %payload.dragSourceControl == %this )
+      return;
+
+   %assetType = %payload.dragSourceControl.parentGroup.assetType;
+   
+   %pos = EWCreatorWindow.getCreateObjectPosition(); //LocalClientConnection.camera.position; 
+   %module = %payload.dragSourceControl.parentGroup.moduleName;
+   %asset = %payload.dragSourceControl.parentGroup.assetName;
+   
+   if(%assetType $= "ImageAsset")
+   {
+      echo("DROPPED AN IMAGE ON THE EDITOR WINDOW!");  
+   }
+   else if(%assetType $= "ShapeAsset")
+   {
+      echo("DROPPED A SHAPE ON THE EDITOR WINDOW!"); 
+      
+      %newEntity = new Entity()
+      {
+         position = %pos;
+         
+         new MeshComponent()
+         {
+            MeshAsset = %module @ ":" @ %asset;
+         };
+         
+         //new CollisionComponent(){};
+      };
+      
+      MissionGroup.add(%newEntity);
+      
+      EWorldEditor.clearSelection();
+      EWorldEditor.selectObject(%newEntity);
+   }
+   else if(%assetType $= "MaterialAsset")
+   {
+      echo("DROPPED A MATERIAL ON THE EDITOR WINDOW!");  
+   }
+   else if(%assetType $= "GameObjectAsset")
+   {
+      echo("DROPPED A GAME OBJECT ON THE EDITOR WINDOW!");  
+      
+      %GO = spawnGameObject(%asset, true);
+      
+      %pos = EWCreatorWindow.getCreateObjectPosition(); //LocalClientConnection.camera.position; 
+      
+      %GO.position = %pos;
+      
+      EWorldEditor.clearSelection();
+      EWorldEditor.selectObject(%GO);
+   }
+   else if(%assetType $= "ComponentAsset")
+   {
+      %newEntity = new Entity()
+      {
+         position = %pos;
+      };
+      
+      %assetDef = AssetDatabase.acquireAsset(%module @ ":" @ %asset);
+      
+      if(%assetDef.componentClass $= "Component")
+         eval("$tmpVar = new " @ %assetDef.componentClass @ "() { class = " @ %assetDef.componentName @ "; }; %newEntity.add($tmpVar);");
+      else
+         eval("$tmpVar = new " @ %assetDef.componentClass @ "() {}; %newEntity.add($tmpVar);");
+         
+      MissionGroup.add(%newEntity);
+      
+      EWorldEditor.clearSelection();
+      EWorldEditor.selectObject(%newEntity);
+   }
+   else if(%assetType $= "ScriptAsset") //do we want to do it this way?
+   {
+      %newEntity = new Entity()
+      {
+         position = %pos;
+         class = %asset;
+      };
+
+      MissionGroup.add(%newEntity);
+      
+      EWorldEditor.clearSelection();
+      EWorldEditor.selectObject(%newEntity);
+   }
+   
+   EWorldEditor.isDirty = true;
+}
+
+function GuiInspectorTypeShapeAssetPtr::onControlDropped( %this, %payload, %position )
+{
+   Canvas.popDialog(EditorDragAndDropLayer);
+   
+   // Make sure this is a color swatch drag operation.
+   if( !%payload.parentGroup.isInNamespaceHierarchy( "AssetPreviewControlType_AssetDrop" ) )
+      return;
+
+   %assetType = %payload.dragSourceControl.parentGroup.assetType;
+   
+   if(%assetType $= "ShapeAsset")
+   {
+      echo("DROPPED A SHAPE ON A SHAPE ASSET COMPONENT FIELD!");  
+      
+      %module = %payload.dragSourceControl.parentGroup.moduleName;
+      %asset = %payload.dragSourceControl.parentGroup.assetName;
+      
+      %targetComponent = %this.ComponentOwner;
+      %targetComponent.MeshAsset = %module @ ":" @ %asset;
+      
+      //Inspector.refresh();
+   }
+   
+   EWorldEditor.isDirty= true;
+}
+
+function GuiInspectorTypeImageAssetPtr::onControlDropped( %this, %payload, %position )
+{
+   Canvas.popDialog(EditorDragAndDropLayer);
+   
+   // Make sure this is a color swatch drag operation.
+   if( !%payload.parentGroup.isInNamespaceHierarchy( "AssetPreviewControlType_AssetDrop" ) )
+      return;
+
+   %assetType = %payload.dragSourceControl.parentGroup.assetType;
+   
+   if(%assetType $= "ImageAsset")
+   {
+      echo("DROPPED A IMAGE ON AN IMAGE ASSET COMPONENT FIELD!");  
+   }
+   
+   EWorldEditor.isDirty = true;
+}
+
+function GuiInspectorTypeMaterialAssetPtr::onControlDropped( %this, %payload, %position )
+{
+   Canvas.popDialog(EditorDragAndDropLayer);
+   
+   // Make sure this is a color swatch drag operation.
+   if( !%payload.parentGroup.isInNamespaceHierarchy( "AssetPreviewControlType_AssetDrop" ) )
+      return;
+
+   %assetType = %payload.dragSourceControl.parentGroup.assetType;
+   
+   if(%assetType $= "MaterialAsset")
+   {
+      echo("DROPPED A MATERIAL ON A MATERIAL ASSET COMPONENT FIELD!");  
+   }
+   
+   EWorldEditor.isDirty = true;
+}
+
+function AssetBrowserFilterTree::onControlDropped( %this, %payload, %position )
+{
+   Canvas.popDialog(EditorDragAndDropLayer);
+   
+   if( !%payload.parentGroup.isInNamespaceHierarchy( "AssetPreviewControlType_AssetDrop" ) )
+      return;
+      
+   %assetType = %payload.dragSourceControl.parentGroup.assetType;
+   %assetName = %payload.dragSourceControl.parentGroup.assetName;
+   %moduleName = %payload.dragSourceControl.parentGroup.moduleName;
+   
+   echo("DROPPED A " @ %assetType @ " ON THE ASSET BROWSER NAVIGATION TREE!");
+   
+   %item = %this.getItemAtPosition(%position);
+   
+   echo("DROPPED IT ON ITEM " @ %item);
+   
+   %parent = %this.getParentItem(%item);
+   
+   if(%parent == 1)
+   {
+      //we're a module entry, cool
+      %targetModuleName = %this.getItemText(%item);
+      echo("DROPPED IT ON MODULE " @ %targetModuleName);   
+      
+      if(%moduleName !$= %targetModuleName)
+      {
+         //we're trying to move the asset to a different module!
+         MessageBoxYesNo( "Move Asset", "Do you wish to move asset " @ %assetName @ " to module " @ %targetModuleName @ "?", 
+               "AssetBrowser.moveAsset("@%assetName@", "@%targetModuleName@");", "");  
+      }
+   }
+}

+ 1525 - 0
Templates/BaseGame/game/tools/assetBrowser/scripts/assetImport.cs

@@ -0,0 +1,1525 @@
+//-----------------------------------------------------------------------------
+// Copyright (c) 2012 GarageGames, LLC
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+// sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//-----------------------------------------------------------------------------
+
+//
+//
+function isImageFormat(%fileExt)
+{
+   if( (%fileExt $= ".png") || (%fileExt $= ".jpg") || (%fileExt $= ".bmp") || (%fileExt $= ".dds") || (%fileExt $= ".tif"))
+      return true;
+      
+   return false;
+}
+
+function isShapeFormat(%fileExt)
+{
+   if( (%fileExt $= ".dae") || (%fileExt $= ".dts") || (%fileExt $= ".fbx") || (%fileExt $= ".obj") || (%fileExt $= ".blend"))
+      return true;
+      
+   return false;
+}
+
+function isSoundFormat(%fileExt)
+{
+   if( (%fileExt $= ".ogg") || (%fileExt $= ".wav") || (%fileExt $= ".mp3"))
+      return true;
+      
+   return false;
+}
+
+function getImageInfo(%file)
+{
+   //we're going to populate a GuiTreeCtrl with info of the inbound image file
+}
+
+//This lets us go and look for a image at the importing directory as long as it matches the material name
+function findImageFile(%path, %materialName, %type)
+{
+   
+   if(isFile(%path @ "/" @ %materialName @ ".jpg"))
+      return %path @ "/" @ %materialName @ ".jpg";
+   else if(isFile(%path @ "/" @ %materialName @ ".png"))
+      return %path @ "/" @ %materialName @ ".png";
+   else if(isFile(%path @ "/" @ %materialName @ ".dds"))
+      return %path @ "/" @ %materialName @ ".dds";
+   else if(isFile(%path @ "/" @ %materialName @ ".tif"))
+      return %path @ "/" @ %materialName @ ".tif";
+}
+
+function AssetBrowser::onBeginDropFiles( %this )
+{   
+   error("% DragDrop - Beginning files dropping.");
+   %this.importAssetNewListArray.empty();
+   %this.importAssetUnprocessedListArray.empty();
+   %this.importAssetFinalListArray.empty();
+}
+
+function AssetBrowser::onDropFile( %this, %filePath )
+{
+   if(!%this.isVisible())
+      return;
+      
+   %fileExt = fileExt( %filePath );
+   //add it to our array!
+   if(isImageFormat(%fileExt))
+      %this.addImportingAsset("Image", %filePath);
+   else if( isShapeFormat(%fileExt))
+      %this.addImportingAsset("Model", %filePath);
+   else if( isSoundFormat(%fileExt))
+      %this.addImportingAsset("Sound", %filePath);
+   else if (%fileExt $= ".zip")
+      %this.onDropZipFile(%filePath);
+}
+
+function AssetBrowser::onDropZipFile(%this, %filePath)
+{
+   if(!%this.isVisible())
+      return;
+      
+   %zip = new ZipObject();
+   %zip.openArchive(%filePath);
+   %count = %zip.getFileEntryCount();
+   
+   echo("Dropped in a zip file with" SPC %count SPC "files inside!");
+   
+   return;
+   for (%i = 0; %i < %count; %i++)
+   {
+      %fileEntry = %zip.getFileEntry(%i);
+      %fileFrom = getField(%fileEntry, 0);
+      
+      //First, we wanna scan to see if we have modules to contend with. If we do, we'll just plunk them in wholesale
+      //and not process their contents.
+      
+      //If not modules, it's likely an art pack or other mixed files, so we'll import them as normal
+      if( (%fileExt $= ".png") || (%fileExt $= ".jpg") || (%fileExt $= ".bmp") || (%fileExt $= ".dds") )
+         %this.importAssetListArray.add("Image", %filePath);
+      else if( (%fileExt $= ".dae") || (%fileExt $= ".dts"))
+         %this.importAssetListArray.add("Model", %filePath);
+      else if( (%fileExt $= ".ogg") || (%fileExt $= ".wav") || (%fileExt $= ".mp3"))
+         %this.importAssetListArray.add("Sound", %filePath);
+      else if( (%fileExt $= ".gui") || (%fileExt $= ".gui.dso"))
+         %this.importAssetListArray.add("GUI", %filePath);
+      //else if( (%fileExt $= ".cs") || (%fileExt $= ".dso"))
+      //   %this.importAssetListArray.add("Script", %filePath);
+      else if( (%fileExt $= ".mis"))
+         %this.importAssetListArray.add("Level", %filePath);
+         
+      // For now, if it's a .cs file, we'll assume it's a behavior.
+      if (fileExt(%fileFrom) !$= ".cs")
+         continue;
+      
+      %fileTo = expandFilename("^game/behaviors/") @ fileName(%fileFrom);
+      %zip.extractFile(%fileFrom, %fileTo);
+      exec(%fileTo);
+   }
+}
+
+function AssetBrowser::onDropImageFile(%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;
+   }
+   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)
+   {
+	  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;
+   }
+   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)
+   {
+	  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::onEndDropFiles( %this )
+{
+   if(!%this.isVisible())
+      return;
+   
+   //we have assets to import, so go ahead and display the window for that now
+   Canvas.pushDialog(AssetImportCtrl);
+   ImportAssetWindow.visible = true;
+   //ImportAssetWindow.validateAssets();
+   ImportAssetWindow.refresh();
+   ImportAssetWindow.selectWindow();
+   
+   // Update object library
+   GuiFormManager::SendContentMessage($LBCreateSiderBar, %this, "refreshAll 1");
+   
+   if(ImportAssetWindow.importConfigsList.count() == 0)
+   {
+      MessageBoxOK( "Warning", "No base import config. Please create an import configuration set to simplify asset importing.");
+   }
+}
+//
+//
+//
+
+function AssetBrowser::addImportingAsset( %this, %assetType, %filePath, %parentAssetItem )
+{
+   %assetName = fileBase(%filePath);
+   %filePath = filePath(%filePath) @ "/" @ fileBase(%filePath) @ fileExt(%filePath); //sanitize the file path
+   
+   %moduleName = AssetBrowser.SelectedModule;
+   ImportAssetModuleList.text = %moduleName;
+   
+   //Add to our main list
+   %assetItem = new ScriptObject()
+   {
+      assetType = %assetType;
+      filePath = %filePath;
+      assetName = %assetName;
+      moduleName = %moduleName;
+      dirty  = true;
+      parentAssetItem = %parentAssetItem;
+      status = "";
+      statusType = "";
+      statusInfo = "";
+      skip = false;
+   };
+   
+   //little bit of interception here
+   if(%assetItem.assetType $= "Model")
+   {
+      %fileExt = fileExt(%assetItem.filePath);
+      if(%fileExt $= ".dae")
+      {
+         %shapeInfo = new GuiTreeViewCtrl();
+         enumColladaForImport(%assetItem.filePath, %shapeInfo);  
+      }
+      else
+      {
+         %shapeInfo = GetShapeInfo(%assetItem.filePath);
+      }
+      
+      %assetItem.shapeInfo = %shapeInfo;
+      
+      %shapeItem = %assetItem.shapeInfo.findItemByName("Shape");
+      %shapeCount = %assetItem.shapeInfo.getItemValue(%shapeItem);
+      
+      %animItem = %assetItem.shapeInfo.findItemByName("Animations");
+      %animCount = %assetItem.shapeInfo.getItemValue(%animItem);
+      
+      //If the model has shapes AND animations, then it's a normal shape with embedded animations
+      //if it has shapes and no animations it's a regular static mesh
+      //if it has no shapes and animations, it's a special case. This means it's a shape animation only file so it gets flagged as special
+      if(%shapeCount == 0 && %animCount != 0)
+      {
+         %assetItem.assetType = "Animation";
+      }
+      else if(%shapeCount == 0 && %animCount == 0)
+      {
+         //either it imported wrong or it's a bad file we can't read. Either way, don't try importing it
+         error("Error - attempted to import a model file with no shapes or animations! Model in question was: " @ %filePath);
+         
+         %assetItem.delete();
+         return 0;
+      }
+   }
+   
+   if(%parentAssetItem $= "")
+   {
+      %assetItem.parentDepth = 0;
+      %this.importAssetNewListArray.add(%assetItem);
+      %this.importAssetUnprocessedListArray.add(%assetItem);
+   }
+   else
+   {
+      %assetItem.parentDepth = %parentAssetItem.parentDepth + 1;  
+      %parentIndex = %this.importAssetUnprocessedListArray.getIndexFromKey(%parentAssetItem);
+      
+      %parentAssetItem.dependencies = %parentAssetItem.dependencies SPC %assetItem;
+      trim(%parentAssetItem.dependencies);
+      
+      %this.importAssetUnprocessedListArray.insert(%assetItem, "", %parentIndex + 1);
+   }
+   
+   return %assetItem;
+}
+
+//
+function ImportAssetButton::onClick(%this)
+{
+   %dlg = new OpenFileDialog()
+   {
+      Filters        = "Shape Files(*.dae, *.cached.dts)|*.dae;*.cached.dts|Images Files(*.jpg,*.png,*.tga,*.bmp,*.dds)|*.jpg;*.png;*.tga;*.bmp;*.dds|Any Files (*.*)|*.*|";
+      DefaultPath    = $Pref::WorldEditor::LastPath;
+      DefaultFile    = "";
+      ChangePath     = false;
+      OverwritePrompt = true;
+      //MultipleFiles = true;
+   };
+
+   %ret = %dlg.Execute();
+   
+   if ( %ret )
+   {
+      $Pref::WorldEditor::LastPath = filePath( %dlg.FileName );
+      %fullPath = makeRelativePath( %dlg.FileName, getMainDotCSDir() );
+      %file = fileBase( %fullPath );
+   }   
+   
+   %dlg.delete();
+   
+   if ( !%ret )
+      return;
+      
+   AssetBrowser.importAssetListArray.empty();
+   
+   %fileExt = fileExt( %fullPath );
+   //add it to our array!
+   if( (%fileExt $= ".png") || (%fileExt $= ".jpg") || (%fileExt $= ".bmp") || (%fileExt $= ".dds") )
+      AssetBrowser.importAssetListArray.add("Image", %fullPath);
+   else if( (%fileExt $= ".dae") || (%fileExt $= ".dts"))
+      AssetBrowser.importAssetListArray.add("Model", %fullPath);
+   else if( (%fileExt $= ".ogg") || (%fileExt $= ".wav") || (%fileExt $= ".mp3"))
+      AssetBrowser.importAssetListArray.add("Sound", %fullPath);
+   else if (%fileExt $= ".zip")
+      AssetBrowser.onDropZipFile(%fullPath);
+      
+   ImportAssetConfigWindow.visible = true;
+   ImportAssetConfigWindow.refresh();
+   ImportAssetConfigWindow.selectWindow();
+}
+//
+
+//
+function ImportAssetWindow::onWake(%this)
+{
+   //We've woken, meaning we're trying to import assets
+   //Lets refresh our list
+   if(!ImportAssetWindow.isVisible())
+      return;
+      
+   $AssetBrowser::importConfigsFile = "tools/assetBrowser/assetImportConfigs.xml";
+   
+   %this.reloadImportOptionConfigs();
+}
+
+function ImportAssetWindow::reloadImportOptionConfigs(%this)
+{
+   ImportAssetWindow.importConfigsList = new ArrayObject();
+   ImportAssetConfigList.clear();
+   
+   %xmlDoc = new SimXMLDocument();
+   if(%xmlDoc.loadFile($AssetBrowser::importConfigsFile))
+   {
+      //StateMachine element
+      %xmlDoc.pushFirstChildElement("AssetImportConfigs");
+      
+      //Configs
+      %configCount = 0;
+      while(%xmlDoc.pushChildElement(%configCount))
+      {
+         %configObj = new ScriptObject(){};
+         
+         %configObj.Name = %xmlDoc.attribute("Name");
+
+         %xmlDoc.pushFirstChildElement("Mesh");
+            %configObj.ImportMesh = %xmlDoc.attribute("ImportMesh");
+            %configObj.DoUpAxisOverride = %xmlDoc.attribute("DoUpAxisOverride");
+            %configObj.UpAxisOverride = %xmlDoc.attribute("UpAxisOverride");
+            %configObj.DoScaleOverride = %xmlDoc.attribute("DoScaleOverride");
+            %configObj.ScaleOverride = %xmlDoc.attribute("ScaleOverride");
+            %configObj.IgnoreNodeScale = %xmlDoc.attribute("IgnoreNodeScale");
+            %configObj.AdjustCenter = %xmlDoc.attribute("AdjustCenter");
+            %configObj.AdjustFloor = %xmlDoc.attribute("AdjustFloor");
+            %configObj.CollapseSubmeshes = %xmlDoc.attribute("CollapseSubmeshes");       
+            %configObj.LODType = %xmlDoc.attribute("LODType");
+            %configObj.ImportedNodes = %xmlDoc.attribute("ImportedNodes");
+            %configObj.IgnoreNodes = %xmlDoc.attribute("IgnoreNodes");
+            %configObj.ImportMeshes = %xmlDoc.attribute("ImportMeshes");
+            %configObj.IgnoreMeshes = %xmlDoc.attribute("IgnoreMeshes");
+         %xmlDoc.popElement();
+         
+         %xmlDoc.pushFirstChildElement("Materials");
+            %configObj.ImportMaterials = %xmlDoc.attribute("ImportMaterials");
+            %configObj.CreateComposites = %xmlDoc.attribute("CreateComposites");
+            %configObj.UseDiffuseSuffixOnOriginImg = %xmlDoc.attribute("UseDiffuseSuffixOnOriginImg");
+            %configObj.UseExistingMaterials = %xmlDoc.attribute("UseExistingMaterials");
+         %xmlDoc.popElement();
+         
+         %xmlDoc.pushFirstChildElement("Animations");
+            %configObj.ImportAnimations = %xmlDoc.attribute("ImportAnimations");
+            %configObj.SeparateAnimations = %xmlDoc.attribute("SeparateAnimations");
+            %configObj.SeparateAnimationPrefix = %xmlDoc.attribute("SeparateAnimationPrefix");
+         %xmlDoc.popElement();
+         
+         %xmlDoc.pushFirstChildElement("Collisions");
+            %configObj.GenerateCollisions = %xmlDoc.attribute("GenerateCollisions");
+            %configObj.GenCollisionType = %xmlDoc.attribute("GenCollisionType");
+            %configObj.CollisionMeshPrefix = %xmlDoc.attribute("CollisionMeshPrefix");
+            %configObj.GenerateLOSCollisions = %xmlDoc.attribute("GenerateLOSCollisions");
+            %configObj.GenLOSCollisionType = %xmlDoc.attribute("GenLOSCollisionType");
+            %configObj.LOSCollisionMeshPrefix = %xmlDoc.attribute("LOSCollisionMeshPrefix");
+         %xmlDoc.popElement();
+         
+         %xmlDoc.pushFirstChildElement("Images");
+            %configObj.ImageType = %xmlDoc.attribute("ImageType");
+            %configObj.DiffuseTypeSuffixes = %xmlDoc.attribute("DiffuseTypeSuffixes");
+            %configObj.NormalTypeSuffixes = %xmlDoc.attribute("NormalTypeSuffixes");
+            %configObj.SpecularTypeSuffixes = %xmlDoc.attribute("SpecularTypeSuffixes");
+            %configObj.MetalnessTypeSuffixes = %xmlDoc.attribute("MetalnessTypeSuffixes");
+            %configObj.RoughnessTypeSuffixes = %xmlDoc.attribute("RoughnessTypeSuffixes");
+            %configObj.SmoothnessTypeSuffixes = %xmlDoc.attribute("SmoothnessTypeSuffixes");
+            %configObj.AOTypeSuffixes = %xmlDoc.attribute("AOTypeSuffixes");
+            %configObj.CompositeTypeSuffixes = %xmlDoc.attribute("CompositeTypeSuffixes");
+            %configObj.TextureFilteringMode = %xmlDoc.attribute("TextureFilteringMode");
+            %configObj.UseMips = %xmlDoc.attribute("UseMips");
+            %configObj.IsHDR = %xmlDoc.attribute("IsHDR");
+            %configObj.Scaling = %xmlDoc.attribute("Scaling");
+            %configObj.Compressed = %xmlDoc.attribute("Compressed");
+            %configObj.GenerateMaterialOnImport = %xmlDoc.attribute("GenerateMaterialOnImport");
+            %configObj.PopulateMaterialMaps = %xmlDoc.attribute("PopulateMaterialMaps");
+         %xmlDoc.popElement();
+         
+         %xmlDoc.pushFirstChildElement("Sounds");
+            %configObj.VolumeAdjust = %xmlDoc.attribute("VolumeAdjust");
+            %configObj.PitchAdjust = %xmlDoc.attribute("PitchAdjust");
+            %configObj.Compressed = %xmlDoc.attribute("Compressed");
+         %xmlDoc.popElement();
+         
+         %xmlDoc.popElement();
+         %configCount++;
+         
+         ImportAssetWindow.importConfigsList.add(%configObj);
+      }
+      
+      %xmlDoc.popElement();
+   }
+   
+   for(%i = 0; %i < ImportAssetWindow.importConfigsList.count(); %i++)
+   {
+      %configObj = ImportAssetWindow.importConfigsList.getKey(%i);
+      ImportAssetConfigList.add(%configObj.Name);
+   }
+   
+   ImportAssetConfigList.setSelected(0);
+}
+
+function ImportAssetWindow::setImportOptions(%this, %optionsObj)
+{
+   //Todo, editor + load from files for preconfigs
+   
+   //Meshes
+   %optionsObj.ImportMesh = true;
+   %optionsObj.UpAxisOverride = "Z_AXIS";
+   %optionsObj.OverrideScale = 1.0;
+   %optionsObj.IgnoreNodeScale = false;
+   %optionsObj.AdjustCenter = false;
+   %optionsObj.AdjustFloor = false;
+   %optionsObj.CollapseSubmeshes = false;
+   %optionsObj.LODType = "TrailingNumber";
+   %optionsObj.TrailingNumber = 2;
+   %optionsObj.ImportedNodes = "";
+   %optionsObj.IgnoreNodes = "";
+   %optionsObj.ImportMeshes = "";
+   %optionsObj.IgnoreMeshes = "";
+   
+   //Materials
+   %optionsObj.ImportMaterials = true;
+   %optionsObj.CreateComposites = true;
+   
+   //Animations
+   %optionsObj.ImportAnimations = true;
+   %optionsObj.SeparateAnimations = true;
+   %optionsObj.SeparateAnimationPrefix = "";
+   
+   //Collision
+   %optionsObj.GenerateCollisions = true;
+   %optionsObj.GenCollisionType = "CollisionMesh";
+   %optionsObj.CollisionMeshPrefix = "Collision";
+   %optionsObj.GenerateLOSCollisions = true;
+   %optionsObj.GenLOSCollisionType = "CollisionMesh";
+   %optionsObj.LOSCollisionMeshPrefix = "LOS";
+   
+   //Images
+   %optionsObj.ImageType = "Diffuse";
+   %optionsObj.DiffuseTypeSuffixes = "_ALBEDO,_DIFFUSE,_ALB,_DIF,_COLOR,_COL";
+   %optionsObj.NormalTypeSuffixes = "_NORMAL,_NORM";
+   %optionsObj.SpecularTypeSuffixes = "_SPECULAR,_SPEC";
+   %optionsObj.MetalnessTypeSuffixes = "_METAL,_MET,_METALNESS,_METALLIC";
+   %optionsObj.RoughnessTypeSuffixes = "_ROUGH,_ROUGHNESS";
+   %optionsObj.SmoothnessTypeSuffixes = "_SMOOTH,_SMOOTHNESS";
+   %optionsObj.AOTypeSuffixes = "_AO,_AMBIENT,_AMBIENTOCCLUSION";
+   %optionsObj.CompositeTypeSuffixes = "_COMP,_COMPOSITE";
+   %optionsObj.TextureFilteringMode = "Bilinear";
+   %optionsObj.UseMips = true;
+   %optionsObj.IsHDR = false;
+   %optionsObj.Scaling = 1.0;
+   %optionsObj.Compressed = true;
+   
+   //Sounds
+   %optionsObj.VolumeAdjust = 1.0;
+   %optionsObj.PitchAdjust = 1.0;
+   %optionsObj.Compressed = false;
+}
+
+//
+function ImportAssetWindow::processNewImportAssets(%this)
+{
+      %unprocessedCount = AssetBrowser.importAssetUnprocessedListArray.count();
+   while(AssetBrowser.importAssetUnprocessedListArray.count() > 0)
+   {
+      %assetItem = AssetBrowser.importAssetUnprocessedListArray.getKey(0);  
+      
+      %assetConfigObj = ImportAssetWindow.activeImportConfig.clone();
+      %assetConfigObj.assetIndex = %i;
+      %assetConfigObj.assetName = %assetItem.assetName;
+      %assetItem.importConfig = %assetConfigObj;
+      
+      if(%assetItem.assetType $= "Model")
+      {
+         %fileExt = fileExt(%assetItem.filePath);
+         if(%fileExt $= ".dae")
+         {
+            %shapeInfo = new GuiTreeViewCtrl();
+            enumColladaForImport(%assetItem.filePath, %shapeInfo);  
+         }
+         else
+         {
+            %shapeInfo = GetShapeInfo(%assetItem.filePath);
+         }
+         
+         %assetItem.shapeInfo = %shapeInfo;
+      
+         %shapeItem = %assetItem.shapeInfo.findItemByName("Shape");
+         %shapeCount = %assetItem.shapeInfo.getItemValue(%shapeItem);
+         
+         if(%assetConfigObj.ImportMesh == 1 && %shapeCount > 0)
+         {
+            
+         }
+         
+         %animItem = %assetItem.shapeInfo.findItemByName("Animations");
+         %animCount = %assetItem.shapeInfo.getItemValue(%animItem);
+         
+         if(%assetConfigObj.ImportAnimations == 1 && %animCount > 0)
+         {
+            %animationItem = %assetItem.shapeInfo.getChild(%animItem);
+            
+            %animName = %assetItem.shapeInfo.getItemText(%animationItem);
+            //%animName = %assetItem.shapeInfo.getItemValue(%animationItem);
+            
+            AssetBrowser.addImportingAsset("Animation", %animName, %assetItem);
+            
+            %animationItem = %assetItem.shapeInfo.getNextSibling(%animationItem);
+            while(%animationItem != 0)
+            {
+               %animName = %assetItem.shapeInfo.getItemText(%animationItem);
+               //%animName = %assetItem.shapeInfo.getItemValue(%animationItem);
+               
+               AssetBrowser.addImportingAsset("Animation", %animName, %assetItem);
+                  
+               %animationItem = %shapeInfo.getNextSibling(%animationItem);
+            }
+         }
+         
+         %matItem = %assetItem.shapeInfo.findItemByName("Materials");
+         %matCount = %assetItem.shapeInfo.getItemValue(%matItem);
+         
+         if(%assetConfigObj.importMaterials == 1 && %matCount > 0)
+         {
+            %materialItem = %assetItem.shapeInfo.getChild(%matItem);
+            
+            %matName = %assetItem.shapeInfo.getItemText(%materialItem);
+            
+            %filePath = %assetItem.shapeInfo.getItemValue(%materialItem);
+            if(%filePath !$= "")
+            {
+               AssetBrowser.addImportingAsset("Material", %filePath, %assetItem);
+            }
+            else
+            {
+               //we need to try and find our material, since the shapeInfo wasn't able to find it automatically
+               %filePath = findImageFile(filePath(%assetItem.filePath), %matName);
+               if(%filePath !$= "")
+                  AssetBrowser.addImportingAsset("Material", %filePath, %assetItem);
+               else
+                  AssetBrowser.addImportingAsset("Material", %matName, %assetItem);
+            }
+            
+            %materialItem = %assetItem.shapeInfo.getNextSibling(%materialItem);
+            while(%materialItem != 0)
+            {
+               %matName = %assetItem.shapeInfo.getItemText(%materialItem);
+               %filePath = %assetItem.shapeInfo.getItemValue(%materialItem);
+               if(%filePath !$= "")
+               {
+                  AssetBrowser.addImportingAsset("Material", %filePath, %assetItem);
+               }
+               else
+               {
+                  //we need to try and find our material, since the shapeInfo wasn't able to find it automatically
+                  %filePath = findImageFile(filePath(%assetItem.filePath), %matName);
+                  if(%filePath !$= "")
+                     AssetBrowser.addImportingAsset("Material", %filePath, %assetItem);
+                  else
+                     AssetBrowser.addImportingAsset("Material", %matName, %assetItem);
+               }
+                  
+               %materialItem = %shapeInfo.getNextSibling(%materialItem);
+            }
+         }
+      }
+      else if(%assetItem.assetType $= "Animation")
+      {
+         //if we don't have our own file, that means we're gunna be using our parent shape's file so reference that
+         if(!isFile(%assetItem.filePath))
+         {
+            %assetItem.filePath = %assetItem.parentAssetItem.filePath;
+         }
+      }
+      else if(%assetItem.assetType $= "Material")
+      {
+         //Iterate over to find appropriate images for
+         
+         //Fetch just the fileBase name
+         %fileDir = filePath(%assetItem.filePath);
+         %filename = fileBase(%assetItem.filePath);
+         %fileExt = fileExt(%assetItem.filePath);
+         
+         if(%assetItem.importConfig.PopulateMaterialMaps == 1)
+         {
+            if(%assetItem.diffuseImageAsset $= "")
+            {
+               //First, load our diffuse map, as set to the material in the shape
+               %diffuseAsset = AssetBrowser.addImportingAsset("Image", %fileDir @ "/" @ %filename @ %fileExt, %assetItem);
+               %assetItem.diffuseImageAsset = %diffuseAsset;
+               
+               if(%assetItem.importConfig.UseDiffuseSuffixOnOriginImg == 1)
+               {
+                  %diffuseToken = getToken(%assetItem.importConfig.DiffuseTypeSuffixes, ",", 0);
+                  %diffuseAsset.AssetName = %diffuseAsset.AssetName @ %diffuseToken;
+               }
+            }
+            
+            if(%assetItem.normalImageAsset $= "")
+            {
+               //Now, iterate over our comma-delimited suffixes to see if we have any matches. We'll use the first match in each case, if any.
+               //First, normal map
+               %listCount = getTokenCount(%assetItem.importConfig.NormalTypeSuffixes, ",");
+         
+               %foundFile = 0;
+               for(%i=0; %i < %listCount; %i++)
+               {
+                  %entryText = getToken(%assetItem.importConfig.NormalTypeSuffixes, ",", %i);
+                  
+                  %targetFilePath = %fileDir @ "/" @ %filename @ %entryText @ %fileExt;
+                  %foundFile = isFile(%targetFilePath);
+                  
+                  if(%foundFile)
+                  {
+                     %normalAsset = AssetBrowser.addImportingAsset("Image", %targetFilePath, %assetItem);
+                     %assetItem.normalImageAsset = %normalAsset;
+                     break;  
+                  }
+               }
+            }
+            if(%assetItem.specularImageAsset $= "")
+            {
+               //Specular
+               %listCount = getTokenCount(%assetItem.importConfig.SpecularTypeSuffixes, ",");
+         
+               %foundFile = 0;
+               for(%i=0; %i < %listCount; %i++)
+               {
+                  %entryText = getToken(%assetItem.importConfig.SpecularTypeSuffixes, ",", %i);
+                  
+                  %targetFilePath = %fileDir @ "/" @ %filename @ %entryText @ %fileExt;
+                  %foundFile = isFile(%targetFilePath);
+                  
+                  if(%foundFile)
+                  {
+                     %specularAsset = AssetBrowser.addImportingAsset("Image", %targetFilePath, %assetItem);
+                     %assetItem.specularImageAsset = %specularAsset;
+                     break;  
+                  }
+               }
+            }
+            
+            if(%assetItem.metalImageAsset $= "")
+            {
+               //Metal
+               %listCount = getTokenCount(%assetItem.importConfig.MetalnessTypeSuffixes, ",");
+         
+               %foundFile = 0;
+               for(%i=0; %i < %listCount; %i++)
+               {
+                  %entryText = getToken(%assetItem.importConfig.MetalnessTypeSuffixes, ",", %i);
+                  
+                  %targetFilePath = %fileDir @ "/" @ %filename @ %entryText @ %fileExt;
+                  %foundFile = isFile(%targetFilePath);
+                  
+                  if(%foundFile)
+                  {
+                     %metalAsset = AssetBrowser.addImportingAsset("Image", %targetFilePath, %assetItem);
+                     %assetItem.metalImageAsset = %metalAsset;
+                     break;  
+                  }
+               }
+            }
+            
+            if(%assetItem.roughnessImageAsset $= "")
+            {
+               //Roughness
+               %listCount = getTokenCount(%assetItem.importConfig.RoughnessTypeSuffixes, ",");
+         
+               %foundFile = 0;
+               for(%i=0; %i < %listCount; %i++)
+               {
+                  %entryText = getToken(%assetItem.importConfig.RoughnessTypeSuffixes, ",", %i);
+                  
+                  %targetFilePath = %fileDir @ "/" @ %filename @ %entryText @ %fileExt;
+                  %foundFile = isFile(%targetFilePath);
+                  
+                  if(%foundFile)
+                  {
+                     %roughnessAsset = AssetBrowser.addImportingAsset("Image", %targetFilePath, %assetItem);
+                     %assetItem.roughnessImageAsset = %roughnessAsset;
+                     break;  
+                  }
+               }
+            }
+            
+            if(%assetItem.smoothnessImageAsset $= "")
+            {
+               //Smoothness
+               %listCount = getTokenCount(%assetItem.importConfig.SmoothnessTypeSuffixes, ",");
+         
+               %foundFile = 0;
+               for(%i=0; %i < %listCount; %i++)
+               {
+                  %entryText = getToken(%assetItem.importConfig.SmoothnessTypeSuffixes, ",", %i);
+                  
+                  %targetFilePath = %fileDir @ "/" @ %filename @ %entryText @ %fileExt;
+                  %foundFile = isFile(%targetFilePath);
+                  
+                  if(%foundFile)
+                  {
+                     %smoothnessAsset = AssetBrowser.addImportingAsset("Image", %targetFilePath, %assetItem);
+                     %assetItem.SmoothnessImageAsset = %smoothnessAsset;
+                     break;  
+                  }
+               }
+            }
+            
+            if(%assetItem.AOImageAsset $= "")
+            {
+               //AO
+               %listCount = getTokenCount(%assetItem.importConfig.AOTypeSuffixes, ",");
+         
+               %foundFile = 0;
+               for(%i=0; %i < %listCount; %i++)
+               {
+                  %entryText = getToken(%assetItem.importConfig.AOTypeSuffixes, ",", %i);
+                  
+                  %targetFilePath = %fileDir @ "/" @ %filename @ %entryText @ %fileExt;
+                  %foundFile = isFile(%targetFilePath);
+                  
+                  if(%foundFile)
+                  {
+                     %AOAsset = AssetBrowser.addImportingAsset("Image", %targetFilePath, %assetItem);
+                     %assetItem.AOImageAsset = %AOAsset;
+                     break;  
+                  }
+               }
+            }
+            
+            if(%assetItem.compositeImageAsset $= "")
+            {
+               //Composite
+               %listCount = getTokenCount(%assetItem.importConfig.CompositeTypeSuffixes, ",");
+         
+               %foundFile = 0;
+               for(%i=0; %i < %listCount; %i++)
+               {
+                  %entryText = getToken(%assetItem.importConfig.CompositeTypeSuffixes, ",", %i);
+                  
+                  %targetFilePath = %fileDir @ "/" @ %filename @ %entryText @ %fileExt;
+                  %foundFile = isFile(%targetFilePath);
+                  
+                  if(%foundFile)
+                  {
+                     %compositeAsset = AssetBrowser.addImportingAsset("Image", %targetFilePath, %assetItem);
+                     %assetItem.compositeImageAsset = %compositeAsset;
+                     break;  
+                  }
+               }
+            }
+         }
+      } 
+      else if(%assetItem.assetType $= "Image")
+      {
+         if(%assetConfigObj.GenerateMaterialOnImport == 1 && %assetItem.parentAssetItem $= "")
+         {
+            %filePath = %assetItem.filePath;
+            if(%filePath !$= "")
+               %materialAsset = AssetBrowser.addImportingAsset("Material", %filePath, %assetItem);
+            
+            %materialAsset.diffuseImageAsset = %assetItem;
+            
+            if(%assetConfigObj.UseDiffuseSuffixOnOriginImg == 1)
+            {
+               %diffuseToken = getToken(%assetItem.importConfig.DiffuseTypeSuffixes, ",", 0);
+               %assetItem.AssetName = %assetItem.AssetName @ %diffuseToken;
+            }
+         }
+      }
+      
+      AssetBrowser.importAssetUnprocessedListArray.erase(0);    
+      //Been processed, so add it to our final list
+      AssetBrowser.importAssetFinalListArray.add(%assetItem);
+   }
+}
+
+function ImportAssetWindow::refresh(%this)
+{
+   ImportingAssetList.clear();
+   
+   //Go through and process any newly, unprocessed assets
+   %this.processNewImportAssets();
+   
+   if(AssetBrowser.importAssetUnprocessedListArray.count() == 0)
+   {
+      //We've processed them all, prep the assets for actual importing
+      //Initial set of assets
+      %assetCount = AssetBrowser.importAssetFinalListArray.count();
+      
+      for(%i=0; %i < %assetCount; %i++)
+      {
+         %assetItem = AssetBrowser.importAssetFinalListArray.getKey(%i);
+         %assetType = %assetItem.assetType;
+         %filePath = %assetItem.filePath;
+         %assetName = %assetItem.assetName;
+         
+         //validate
+         %this.validateAsset(%assetItem);
+         
+         //Once validated, attempt any fixes for issues
+         %this.resolveIssue(%assetItem);
+         
+         //Make sure we size correctly
+         ImportingAssetList.extent.x = ImportingAssetList.getParent().extent.x - 15;
+         
+         //create!
+         %width = mRound(mRound(ImportingAssetList.extent.x) / 2);
+         %height = 20;
+         %indent = %assetItem.parentDepth * 16;
+         %toolTip = "";
+         
+         %iconPath = "tools/gui/images/iconInformation";
+         %configCommand = "ImportAssetOptionsWindow.editImportSettings(" @ %assetItem @ ");";
+         
+         if(%assetType $= "Model" || %assetType $= "Animation" || %assetType $= "Image" || %assetType $= "Sound")
+         {
+            if(%assetItem.status $= "Error")
+            {
+               %iconPath = "tools/gui/images/iconError";
+               %configCommand = "ImportAssetOptionsWindow.findMissingFile(" @ %assetItem @ ");";
+            }
+            else if(%assetItem.status $= "Warning")
+            {
+               %iconPath = "tools/gui/images/iconWarn";
+               %configCommand = "ImportAssetOptionsWindow.fixIssues(" @ %assetItem @ ");";
+               
+               if(%assetItem.statusType $= "DuplicateAsset" || %assetItem.statusType $= "DuplicateImportAsset")
+                  %assetName = %assetItem.assetName @ " <Duplicate Asset>";
+            }
+            
+            %toolTip = %assetItem.statusInfo;
+         }
+         else
+         {
+            if(%assetItem.status $= "Error")
+            {
+               %iconPath = "tools/gui/images/iconError";
+               %configCommand = "";//"ImportAssetOptionsWindow.findMissingFile(" @ %assetItem @ ");";
+            }
+            else if(%assetItem.status $= "Warning")
+            {
+               %iconPath = "tools/gui/images/iconWarn";
+               %configCommand = "";//"ImportAssetOptionsWindow.fixIssues(" @ %assetItem @ ");";
+               
+               if(%assetItem.statusType $= "DuplicateAsset" || %assetItem.statusType $= "DuplicateImportAsset")
+                  %assetName = %assetItem.assetName @ " <Duplicate Asset>";
+            }
+         }
+         
+         %importEntry = new GuiControl()
+         {
+            position = "0 0";
+            extent = ImportingAssetList.extent.x SPC %height;
+            
+            new GuiTextCtrl()
+            {
+              Text = %assetName; 
+              position = %indent SPC "0";
+              extent = %width - %indent SPC %height;
+              internalName = "AssetName";
+            };
+            
+            new GuiTextCtrl()
+            {
+              Text = %assetType; 
+              position = %width SPC "0";
+              extent = %width - %height - %height SPC %height;
+              internalName = "AssetType";
+            };
+            
+            new GuiBitmapButtonCtrl()
+            {
+               position = ImportingAssetList.extent.x - %height - %height SPC "0";
+               extent = %height SPC %height;
+               command = %configCommand;
+               bitmap = %iconPath;
+               tooltip = %toolTip;
+            };
+            new GuiBitmapButtonCtrl()
+            {
+               position = ImportingAssetList.extent.x - %height SPC "0";
+               extent = %height SPC %height;
+               command = "ImportAssetOptionsWindow.deleteImportingAsset(" @ %assetItem @ ");";
+               bitmap = "tools/gui/images/iconDelete";
+            };
+         };
+         
+         ImportingAssetList.add(%importEntry);
+      }
+   }
+   else
+   {
+      //Continue processing
+      %this.refresh();  
+   }
+}
+//
+
+function ImportAssetWindow::validateAssets(%this)
+{
+   %assetCount = AssetBrowser.importAssetFinalListArray.count();
+   %moduleName = ImportAssetModuleList.getText();
+   %assetQuery = new AssetQuery();
+   
+   %hasIssues = false;
+   
+   //First, check the obvious: name collisions. We should have no asset that shares a similar name.
+   //If we do, prompt for it be renamed first before continuing
+   
+   for(%i=0; %i < %assetCount; %i++)
+   {
+      %assetItemA = AssetBrowser.importAssetFinalListArray.getKey(%i);
+      
+      //First, check our importing assets for name collisions
+      for(%j=0; %j < %assetCount; %j++)
+      {
+         %assetItemB = AssetBrowser.importAssetFinalListArray.getKey(%j);
+         if( (%assetItemA.assetName $= %assetItemB.assetName) && (%i != %j) )
+         {
+            //yup, a collision, prompt for the change and bail out
+            /*MessageBoxOK( "Error!", "Duplicate asset names found with importing assets!\nAsset \"" @ 
+               %assetItemA.assetName @ "\" of type \"" @ %assetItemA.assetType @ "\" and \"" @
+               %assetItemB.assetName @ "\" of type \"" @ %assetItemB.assetType @ "\" have matching names.\nPlease rename one of them and try again!");*/
+               
+            %assetItemA.status = "Warning";
+            %assetItemA.statusType = "DuplicateImportAsset";
+            %assetItemA.statusInfo = "Duplicate asset names found with importing assets!\nAsset \"" @ 
+               %assetItemA.assetName @ "\" of type \"" @ %assetItemA.assetType @ "\" and \"" @
+               %assetItemB.assetName @ "\" of type \"" @ %assetItemB.assetType @ "\" have matching names.\nPlease rename one of them and try again!";
+               
+            %hasIssues = true;
+         }
+      }
+      
+      //No collisions of for this name in the importing assets. Now, check against the existing assets in the target module
+      if(!AssetBrowser.isAssetReImport)
+      {
+         %numAssetsFound = AssetDatabase.findAllAssets(%assetQuery);
+
+         %foundCollision = false;
+         for( %f=0; %f < %numAssetsFound; %f++)
+         {
+            %assetId = %assetQuery.getAsset(%f);
+             
+            //first, get the asset's module, as our major categories
+            %module = AssetDatabase.getAssetModule(%assetId);
+            
+            %testModuleName = %module.moduleId;
+            
+            //These are core, native-level components, so we're not going to be messing with this module at all, skip it
+            if(%moduleName !$= %testModuleName)
+               continue;
+
+            %testAssetName = AssetDatabase.getAssetName(%assetId);
+            
+            if(%testAssetName $= %assetItemA.assetName)
+            {
+               %foundCollision = true;
+               
+               %assetItemA.status = "Warning";
+               %assetItemA.statusType = "DuplicateAsset";
+               %assetItemA.statusInfo = "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!";
+                  
+               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!");*/
+               
+            //%assetQuery.delete();
+            //return false;
+         }
+      }
+      
+      if(!isFile(%assetItemA.filePath))
+      {
+         %hasIssues = true;  
+         %assetItemA.status = "error";
+         %assetItemA.statusType = "MissingFile";
+         %assetItemA.statusInfo = "Unable to find file to be imported. Please select asset file.";
+      }
+   }
+   
+   //Clean up our queries
+   %assetQuery.delete();
+   
+   if(%hasIssues)
+      return false;
+   else
+      return true;
+}
+
+function ImportAssetWindow::ImportAssets(%this)
+{
+   //do the actual importing, now!
+   %assetCount = AssetBrowser.importAssetFinalListArray.count();
+   
+   //get the selected module data
+   %moduleName = ImportAssetModuleList.getText();
+   
+   %module = ModuleDatabase.findModule(%moduleName, 1);
+   
+   if(!isObject(%module))
+   {
+      MessageBoxOK( "Error!", "No module selected. You must select or create a module for the assets to be added to.");
+      return;
+   }
+   
+   /*if(!%this.validateAssets())
+   {
+      //Force a refresh, as some things may have changed, such as errors and failure info!
+      refresh();
+      
+      return;
+   }*/
+   
+   for(%i=0; %i < %assetCount; %i++)
+   {
+      %assetItem = AssetBrowser.importAssetFinalListArray.getKey(%i);
+      %assetType = %assetItem.AssetType;
+      %filePath = %assetItem.filePath;
+      %assetName = %assetItem.assetName;
+      %assetImportSuccessful = false;
+      %assetId = %moduleName@":"@%assetName;
+      
+      if(%assetType $= "Image")
+      {
+         %assetPath = "data/" @ %moduleName @ "/Images";
+         %assetFullPath = %assetPath @ "/" @ fileName(%filePath);
+         
+         %newAsset = new ImageAsset()
+         {
+            assetName = %assetName;
+            versionId = 1;
+            imageFile = %assetFullPath;
+            originalFilePath = %filePath;
+         };
+         
+         %assetImportSuccessful = TAMLWrite(%newAsset, %assetPath @ "/" @ %assetName @ ".asset.taml"); 
+         
+         //and copy the file into the relevent directory
+         %doOverwrite = !AssetBrowser.isAssetReImport;
+         if(!pathCopy(%filePath, %assetFullPath, %doOverwrite))
+         {
+            error("Unable to import asset: " @ %filePath);
+         }
+      }
+      else if(%assetType $= "Model")
+      {
+         %assetPath = "data/" @ %moduleName @ "/Shapes";
+         %assetFullPath = %assetPath @ "/" @ fileName(%filePath);
+         
+         %newAsset = new ShapeAsset()
+         {
+            assetName = %assetName;
+            versionId = 1;
+            fileName = %assetFullPath;
+            originalFilePath = %filePath;
+            isNewShape = true;
+         };
+         
+         %dependencyCount = getWordCount(%assetItem.dependencies);
+         for(%d=0; %d < %dependencyCount; %d++)
+         {
+            %dependencyAssetItem = getWord(%assetItem.dependencies, %d);
+            
+            %depAssetType = %dependencyAssetItem.assetType;
+            if(%depAssetType $= "Material")
+            {
+               %matSet = "%newAsset.materialSlot"@%d@"=\"@Asset="@%moduleName@":"@%dependencyAssetItem.assetName@"\";";
+               eval(%matSet);
+            }
+            if(%depAssetType $= "Animation")
+            {
+               %matSet = "%newAsset.animationSequence"@%d@"=\"@Asset="@%moduleName@":"@%dependencyAssetItem.assetName@"\";";
+               eval(%matSet);
+            }
+         }
+         
+         %assetImportSuccessful = TAMLWrite(%newAsset, %assetPath @ "/" @ %assetName @ ".asset.taml"); 
+         
+         //and copy the file into the relevent directory
+         %doOverwrite = !AssetBrowser.isAssetReImport;
+         if(!pathCopy(%filePath, %assetFullPath, %doOverwrite))
+         {
+            error("Unable to import asset: " @ %filePath);
+         }
+         
+         //now, force-load the file if it's collada
+         %fileExt = fileExt(%assetFullPath);
+         if(isSupportedFormat(getSubStr(%fileExt,1)))
+         {
+            %tempShape = new TSStatic()
+            {
+               shapeName = %assetFullPath;
+            };
+            
+            %tempShape.delete();
+         }
+      }
+      else if(%assetType $= "Animation")
+      {
+         %assetPath = "data/" @ %moduleName @ "/ShapeAnimations";
+         %assetFullPath = %assetPath @ "/" @ fileName(%filePath);
+         
+         %newAsset = new ShapeAnimationAsset()
+         {
+            assetName = %assetName;
+            versionId = 1;
+            fileName = %assetFullPath;
+            originalFilePath = %filePath;
+            animationFile = %assetFullPath;
+            animationName = %assetName;
+            startFrame = 0;
+            endFrame = -1;
+            padRotation = false;
+            padTransforms = false;
+         };
+
+         %assetImportSuccessful = TAMLWrite(%newAsset, %assetPath @ "/" @ %assetName @ ".asset.taml"); 
+         
+         //and copy the file into the relevent directory
+         %doOverwrite = !AssetBrowser.isAssetReImport;
+         if(!pathCopy(%filePath, %assetFullPath, %doOverwrite))
+         {
+            error("Unable to import asset: " @ %filePath);
+         }
+      }
+      else if(%assetType $= "Sound")
+      {
+         %assetPath = "data/" @ %moduleName @ "/Sounds";
+         %assetFullPath = %assetPath @ "/" @ fileName(%filePath);
+         
+         %newAsset = new SoundAsset()
+         {
+            assetName = %assetName;
+            versionId = 1;
+            fileName = %assetFullPath;
+            originalFilePath = %filePath;
+         };
+         
+         %assetImportSuccessful = TAMLWrite(%newAsset, %assetPath @ "/" @ %assetName @ ".asset.taml"); 
+         
+         //and copy the file into the relevent directory
+         %doOverwrite = !AssetBrowser.isAssetReImport;
+         if(!pathCopy(%filePath, %assetFullPath, %doOverwrite))
+         {
+            error("Unable to import asset: " @ %filePath);
+         }
+      }
+      else if(%assetType $= "Material")
+      {
+         %assetPath = "data/" @ %moduleName @ "/materials";
+         %tamlpath = %assetPath @ "/" @ %assetName @ ".asset.taml";
+         %sgfPath = %assetPath @ "/" @ %assetName @ ".sgf";
+         %scriptPath = %assetPath @ "/" @ %assetName @ ".cs";
+         
+         %newAsset = new MaterialAsset()
+         {
+            assetName = %assetName;
+            versionId = 1;
+            shaderGraph = %sgfPath;
+            scriptFile = %scriptPath;
+            originalFilePath = %filePath;
+            materialDefinitionName = %assetName;
+         };
+         
+         %dependencyCount = getWordCount(%assetItem.dependencies);
+         for(%d=0; %d < %dependencyCount; %d++)
+         {
+            %dependencyAssetItem = getWord(%assetItem.dependencies, %d);
+            
+            %depAssetType = %dependencyAssetItem.assetType;
+            if(%depAssetType $= "Image")
+            {
+               %matSet = "%newAsset.imageMap"@%d@"=\"@Asset="@%moduleName@":"@%dependencyAssetItem.assetName@"\";";
+               eval(%matSet);
+            }
+         }
+         
+         %assetImportSuccessful = TamlWrite(%newAsset, %tamlpath);
+         
+         %file = new FileObject();
+   
+         if(%file.openForWrite(%scriptPath))
+         {
+            %file.writeline("//--- OBJECT WRITE BEGIN ---");
+            %file.writeline("singleton Material(" @ %assetName @ ") {");
+            
+            //TODO: pass along the shape's target material for this just to be sure
+            %file.writeLine("   mapTo = \"" @ %assetName @ "\";"); 
+            
+            if(%assetItem.diffuseImageAsset !$= "")
+            {
+               %diffuseAssetPath = "data/" @ %moduleName @ "/Images/" @ fileName(%assetItem.diffuseImageAsset.filePath);
+               %file.writeline("   DiffuseMap[0] = \"" @ %diffuseAssetPath @"\";");
+               %file.writeline("   DiffuseMapAsset[0] = \"" @ %moduleName @ ":" @ %assetItem.diffuseImageAsset.assetName @"\";");
+            }
+            if(%assetItem.normalImageAsset)
+            {
+               %normalAssetPath = "data/" @ %moduleName @ "/Images/" @ fileName(%assetItem.normalImageAsset.filePath);
+               %file.writeline("   NormalMap[0] = \"" @ %normalAssetPath @"\";");
+               %file.writeline("   NormalMapAsset[0] = \"" @ %moduleName @ ":" @ %assetItem.normalImageAsset.assetName @"\";");
+            }
+            /*if(%assetItem.specularImageAsset)
+            {
+               %file.writeline("   SpecularMap[0] = \"" @ %assetItem.specularImageAsset.filePath @"\";");
+               %file.writeline("   SpecularMapAsset[0] = \"" @ %moduleName @ ":" @ %assetItem.specularImageAsset.assetName @"\";");
+            }*/
+            if(%assetItem.roughnessImageAsset)
+            {
+               %file.writeline("   RoughMap[0] = \"" @ %assetItem.roughnessImageAsset.filePath @"\";");
+               %file.writeline("   RoughMapAsset[0] = \"" @ %moduleName @ ":" @ %assetItem.roughnessImageAsset.assetName @"\";");
+            }
+            if(%assetItem.smoothnessImageAsset)
+            {
+               %file.writeline("   SmoothnessMap[0] = \"" @ %assetItem.smoothnessImageAsset.filePath @"\";");
+               %file.writeline("   SmoothnessMapAsset[0] = \"" @ %moduleName @ ":" @ %assetItem.smoothnessImageAsset.assetName @"\";");
+            }
+            if(%assetItem.metalnessImageAsset)
+            {
+               %file.writeline("   MetalMap[0] = \"" @ %assetItem.metalnessImageAsset.filePath @"\";");
+               %file.writeline("   MetalMapAsset[0] = \"" @ %moduleName @ ":" @ %assetItem.metalnessImageAsset.assetName @"\";");
+            }
+            if(%assetItem.AOImageAsset)
+            {
+               %file.writeline("   AOMap[0] = \"" @ %assetItem.AOImageAsset.filePath @"\";");
+               %file.writeline("   AOMapAsset[0] = \"" @ %moduleName @ ":" @ %assetItem.AOImageAsset.assetName @"\";");
+            }
+            if(%assetItem.compositeImageAsset)
+            {
+               %file.writeline("   CompositeMap[0] = \"" @ %assetItem.compositeImageAsset.filePath @"\";");
+               %file.writeline("   CompositeMapAsset[0] = \"" @ %moduleName @ ":" @ %assetItem.compositeImageAsset.assetName @"\";");
+            }
+            %file.writeline("};");
+            %file.writeline("//--- OBJECT WRITE END ---");
+            
+            %file.close();
+         }
+      }
+      
+      if(%assetImportSuccessful)
+      {
+         %moduleDef = ModuleDatabase.findModule(%moduleName,1);
+         
+         if(!AssetBrowser.isAssetReImport)
+            AssetDatabase.addDeclaredAsset(%moduleDef, %assetPath @ "/" @ %assetName @ ".asset.taml");
+         else
+            AssetDatabase.refreshAsset(%assetId);
+      }
+   }
+   
+   //force an update of any and all modules so we have an up-to-date asset list
+   AssetBrowser.loadFilters();
+   AssetBrowser.refreshPreviews();
+   Canvas.popDialog(AssetImportCtrl);
+   AssetBrowser.isAssetReImport = false;
+}
+
+//
+function ImportAssetWindow::validateAsset(%this, %assetItem)
+{
+   %assetCount = AssetBrowser.importAssetFinalListArray.count();
+   %moduleName = ImportAssetModuleList.getText();
+   
+   %hasIssues = false;
+   
+   //First, check the obvious: name collisions. We should have no asset that shares a similar name.
+   //If we do, prompt for it be renamed first before continuing
+   
+   for(%i=0; %i < %assetCount; %i++)
+   {
+      %assetItemA = AssetBrowser.importAssetFinalListArray.getKey(%i);
+      
+      if( (%assetItemA.assetName $= %assetItem.assetName) && (%assetItemA.getId() != %assetItem.getId()) )
+      {
+         //yup, a collision, prompt for the change and bail out
+         /*MessageBoxOK( "Error!", "Duplicate asset names found with importing assets!\nAsset \"" @ 
+            %assetItemA.assetName @ "\" of type \"" @ %assetItemA.assetType @ "\" and \"" @
+            %assetItemB.assetName @ "\" of type \"" @ %assetItemB.assetType @ "\" have matching names.\nPlease rename one of them and try again!");*/
+            
+         %assetItem.status = "Warning";
+         %assetItem.statusType = "DuplicateImportAsset";
+         %assetItem.statusInfo = "Duplicate asset names found with importing assets!\nAsset \"" @ 
+            %assetItemA.assetName @ "\" of type \"" @ %assetItemA.assetType @ "\" and \"" @
+            %assetItem.assetName @ "\" of type \"" @ %assetItem.assetType @ "\" have matching names.\nPlease rename one of them and try again!";
+            
+         %hasIssues = true;
+         return false;
+      }
+   }
+
+   //No collisions of for this name in the importing assets. Now, check against the existing assets in the target module
+   if(!AssetBrowser.isAssetReImport)
+   {
+      %assetQuery = new AssetQuery();
+      
+      %numAssetsFound = AssetDatabase.findAllAssets(%assetQuery);
+
+      %foundCollision = false;
+      for( %f=0; %f < %numAssetsFound; %f++)
+      {
+         %assetId = %assetQuery.getAsset(%f);
+          
+         //first, get the asset's module, as our major categories
+         %module = AssetDatabase.getAssetModule(%assetId);
+         
+         %testModuleName = %module.moduleId;
+         
+         //These are core, native-level components, so we're not going to be messing with this module at all, skip it
+         if(%moduleName !$= %testModuleName)
+            continue;
+
+         %testAssetName = AssetDatabase.getAssetName(%assetId);
+         
+         if(%testAssetName $= %assetItem.assetName)
+         {
+            %foundCollision = true;
+            
+            %assetItem.status = "Warning";
+            %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();
+      
+            return false;            
+         }
+      }
+      
+      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!");*/
+            
+         //%assetQuery.delete();
+         //return false;
+      }
+      
+      //Clean up our queries
+      %assetQuery.delete();
+   }
+      
+   if(!isFile(%assetItem.filePath))
+   {
+      %hasIssues = true;  
+      %assetItem.status = "error";
+      %assetItem.statusType = "MissingFile";
+      %assetItem.statusInfo = "Unable to find file to be imported. Please select asset file.";
+      
+      return false;
+   }
+   
+   return true;
+}
+
+function ImportAssetWindow::resolveIssue(%this, %assetItem)
+{
+   if(%assetItem.status !$= "Warning")
+      return;
+      
+   //Ok, we actually have a warning, so lets resolve
+   if(%assetItem.statusType $= "DuplicateImportAsset" || %assetItem.statusType $= "DuplicateAsset")
+   {
+      
+   }
+   else if(%assetItem.statusType $= "MissingFile")
+   {
+      %this.findMissingFile(%assetItem);
+   }
+}
+//
+
+//
+function ImportAssetModuleList::onWake(%this)
+{
+   %this.refresh();
+}
+
+function ImportAssetModuleList::refresh(%this)
+{
+   %this.clear();
+   
+   //First, get our list of modules
+   %moduleList = ModuleDatabase.findModules();
+   
+   %count = getWordCount(%moduleList);
+   for(%i=0; %i < %count; %i++)
+   {
+      %moduleName = getWord(%moduleList, %i);
+      %this.add(%moduleName.ModuleId, %i);  
+   }
+}
+//

+ 472 - 0
Templates/BaseGame/game/tools/assetBrowser/scripts/assetImportConfig.cs

@@ -0,0 +1,472 @@
+function ImportAssetConfigList::onSelect( %this, %id, %text )
+{
+   //Apply our settings to the assets
+   echo("Changed our import config!");
+   AssetBrowser.importAssetUnprocessedListArray.empty();
+   AssetBrowser.importAssetUnprocessedListArray.duplicate(AssetBrowser.importAssetNewListArray);
+   AssetBrowser.importAssetFinalListArray.empty();
+   
+   ImportAssetWindow.activeImportConfigIndex = %id;
+   ImportAssetWindow.activeImportConfig = ImportAssetWindow.importConfigsList.getKey(%id);
+   ImportAssetWindow.refresh();
+}
+
+function ImportAssetOptionsWindow::findMissingFile(%this, %assetItem)
+{
+   if(%assetItem.assetType $= "Model")
+      %filters = "Shape Files(*.dae, *.cached.dts)|*.dae;*.cached.dts";
+   else if(%assetItem.assetType $= "Image")
+      %filters = "Images Files(*.jpg,*.png,*.tga,*.bmp,*.dds)|*.jpg;*.png;*.tga;*.bmp;*.dds";
+      
+   %dlg = new OpenFileDialog()
+   {
+      Filters        = %filters;
+      DefaultPath    = $Pref::WorldEditor::LastPath;
+      DefaultFile    = "";
+      ChangePath     = true;
+      OverwritePrompt = true;
+      forceRelativePath = false;
+      //MultipleFiles = true;
+   };
+
+   %ret = %dlg.Execute();
+   
+   if ( %ret )
+   {
+      $Pref::WorldEditor::LastPath = filePath( %dlg.FileName );
+      %fullPath = %dlg.FileName;//makeRelativePath( %dlg.FileName, getMainDotCSDir() );
+   }   
+   
+   %dlg.delete();
+   
+   if ( !%ret )
+      return;
+      
+   %assetItem.filePath = %fullPath;
+   
+   ImportAssetWindow.refresh();
+}
+
+//
+function ImportAssetOptionsWindow::editImportSettings(%this, %assetItem)
+{
+   ImportAssetOptionsWindow.setVisible(1);
+   ImportAssetOptionsWindow.selectWindow();
+   
+   ImportOptionsList.clearFields();
+   
+   %assetType = %assetItem.assetType;
+   %filePath = %assetItem.filePath;
+   %assetName = %assetItem.assetName;
+   %assetConfigObj = %assetItem.importConfig;
+   
+   ImportOptionsList.startGroup("Asset");
+   ImportOptionsList.addField("AssetName", "Asset Name", "string", "", "NewAsset", "", %assetItem);
+   ImportOptionsList.endGroup();
+   
+   if(%assetType $= "Model")
+   {
+      //Get the shape info, so we know what we're doing with the mesh
+      %shapeInfo = GetShapeInfo(%filePath);
+      %meshItem = %shapeInfo.findItemByName("Meshes");
+      %matItem = %shapeInfo.findItemByName("Materials");
+      
+      %meshCount = %shapeInfo.getItemValue(%meshItem);
+      %matCount = %shapeInfo.getItemValue(%matItem);
+      
+      %firstMat = %shapeInfo.getChild(%matItem);
+      echo("Mesh's first material texture path is: " @ %shapeInfo.getItemValue(%firstMat));
+            
+      if(%meshCount > 0)
+      {
+         ImportOptionsList.startGroup("Mesh");
+         ImportOptionsList.addField("AutogenCollisions", "Auto-gen Collisions", "bool", "", "0", "", %assetConfigObj);
+         ImportOptionsList.addField("CollapseSubmeshes", "Collapse Submeshes", "bool", "", "0", "", %assetConfigObj);
+         ImportOptionsList.addField("UpAxisOverride", "Up-Axis Override", "list", "", "Z_AXIS", "Z_AXIS,Y_AXIS,X_AXIS", %assetConfigObj);
+         ImportOptionsList.addField("OverrideScale", "Override Scale", "float", "", "1.0", "", %assetConfigObj);
+         ImportOptionsList.addField("IgnoreNodeScale", "IgnoreNodeScaling", "bool", "", "0", "", %assetConfigObj);
+         ImportOptionsList.addField("AdjustCenter", "Adjust Center", "bool", "", "0", "", %assetConfigObj);
+         ImportOptionsList.addField("CollapseSubmeshes", "Collapse Submeshes", "bool", "", "0", "", %assetConfigObj);
+         ImportOptionsList.addField("AdjustFloor", "Adjust Floor", "bool", "", "0", "", %assetConfigObj);
+         ImportOptionsList.addField("LODType", "LOD Type", "list", "", "TrailingNumber", "TrailingNumber,DetectDTS", %assetConfigObj);
+         ImportOptionsList.endGroup();
+      }
+      
+      if(%matItem > 0)
+      {
+         ImportOptionsList.startGroup("Material");
+         ImportOptionsList.addCallbackField("ImportMaterials", "Import Materials", "bool", "", "1", "", "ImportMaterialsChanged", %assetConfigObj);
+         ImportOptionsList.addField("UseExistingMaterials", "Use Existing Materials", "bool", "", "1", "", %assetConfigObj);
+         ImportOptionsList.endGroup();
+      }
+   }
+   else if(%assetType $= "Material")
+   {
+      ImportOptionsList.startGroup("Material");
+      ImportOptionsList.addField("CreateComposites", "Create Composite Textures", "bool", "", "1", "", %assetConfigObj);
+      ImportOptionsList.endGroup();
+   }
+   else if(%assetType $= "Image")
+   {
+      ImportOptionsList.startGroup("Formatting");
+      ImportOptionsList.addField("ImageType", "Image Type", "string", "", "Diffuse", "", %assetConfigObj);
+      ImportOptionsList.addField("TextureFiltering", "Texture Filtering", "list", "", "Bilinear", "None,Bilinear,Trilinear", %assetConfigObj);
+      ImportOptionsList.addField("UseMips", "Use Mips", "bool", "", "1", "", %assetConfigObj);
+      ImportOptionsList.addField("IsHDR", "Is HDR", "bool", "", "0", "", %assetConfigObj);
+      ImportOptionsList.endGroup();
+      
+      ImportOptionsList.startGroup("Scaling");
+      ImportOptionsList.addField("Scaling", "Scaling", "float", "", "1.0", "", %assetConfigObj);
+      ImportOptionsList.endGroup();
+      
+      ImportOptionsList.startGroup("Compression");
+      ImportOptionsList.addField("IsCompressed", "Is Compressed", "bool", "", "1", "", %assetConfigObj);
+      ImportOptionsList.endGroup();
+      
+      ImportOptionsList.startGroup("Material");
+      ImportOptionsList.addField("GenerateMaterialOnImport", "Generate Material On Import", "bool", "", "1", "", %optionsObj);
+      ImportOptionsList.addField("PopulateMaterialMaps", "Populate Material Maps", "bool", "", "1", "", %optionsObj);
+      ImportOptionsList.addField("UseDiffuseSuffixOnOriginImg", "Use Diffuse Suffix for Origin Image", "bool", "", "1", "", %optionsObj);
+      ImportOptionsList.addField("UseExistingMaterials", "Use Existing Materials", "bool", "", "1", "", %optionsObj);
+      ImportOptionsList.endGroup();
+   }
+   else if(%assetType $= "Sound")
+   {
+      ImportOptionsList.startGroup("Adjustment");
+      ImportOptionsList.addField("VolumeAdjust", "VolumeAdjustment", "float", "", "1.0", "", %assetConfigObj);
+      ImportOptionsList.addField("PitchAdjust", "PitchAdjustment", "float", "", "1.0", "", %assetConfigObj);
+      ImportOptionsList.endGroup();
+      
+      ImportOptionsList.startGroup("Compression");
+      ImportOptionsList.addField("IsCompressed", "Is Compressed", "bool", "", "1", "", %assetConfigObj);
+      ImportOptionsList.endGroup();
+   }
+}
+
+function ImportAssetOptionsWindow::deleteImportingAsset(%this, %assetItem)
+{
+   %assetIndex = AssetBrowser.importAssetNewListArray.getIndexFromKey(%assetItem);
+   AssetBrowser.importAssetNewListArray.erase(%assetIndex);
+   
+   //check if we have any child assets and remove them as well
+   for(%i=0; %i < AssetBrowser.importAssetNewListArray.count(); %i++)
+   {
+      %asset = AssetBrowser.importAssetNewListArray.getKey(%i);  
+      if(%asset.ParentAssetItem == %assetItem)
+      {
+         AssetBrowser.importAssetNewListArray.erase(%i);
+         %i--;
+      }
+   }
+   
+   %assetIndex = AssetBrowser.importAssetFinalListArray.getIndexFromKey(%assetItem);
+   AssetBrowser.importAssetFinalListArray.erase(%assetIndex);
+   
+   //check if we have any child assets and remove them as well
+   for(%i=0; %i < AssetBrowser.importAssetFinalListArray.count(); %i++)
+   {
+      %asset = AssetBrowser.importAssetFinalListArray.getKey(%i);  
+      if(%asset.ParentAssetItem == %assetItem)
+      {
+         AssetBrowser.importAssetFinalListArray.erase(%i);
+         %i--;
+      }
+   }
+   
+   ImportAssetWindow.refresh();
+   ImportAssetOptionsWindow.setVisible(0);
+}
+
+function ImportAssetOptionsWindow::saveAssetOptions(%this)
+{
+   ImportAssetWindow.refresh();
+   ImportAssetOptionsWindow.setVisible(0);   
+}
+
+function ImportOptionsList::ImportMaterialsChanged(%this, %fieldName, %newValue, %ownerObject)
+{
+   echo("CHANGED IF OUR IMPORTED MATERIALS WERE HAPPENING!");
+}
+
+function ImportAssetConfigEditorWindow::populateConfigList(%this, %optionsObj)
+{
+   AssetImportConfigName.setText(%optionsObj.Name);
+   
+   ImportOptionsConfigList.clear();
+   
+   ImportOptionsConfigList.startGroup("Mesh");
+   ImportOptionsConfigList.addCallbackField("ImportMesh", "Import Mesh", "bool", "", "1", "", "ToggleImportMesh", %optionsObj);
+   ImportOptionsConfigList.addField("DoUpAxisOverride", "Do Up-axis Override", "bool", "", "0", "", %optionsObj);
+   ImportOptionsConfigList.addField("UpAxisOverride", "Up-axis Override", "list", "", "Z_AXIS", "X_AXIS,Y_AXIS,Z_AXIS", %optionsObj);
+   ImportOptionsConfigList.addField("DoScaleOverride", "Do Scale Override", "bool", "", "0", "", %optionsObj);
+   ImportOptionsConfigList.addField("ScaleOverride", "Scale Override", "float", "", "1", "", %optionsObj);
+   ImportOptionsConfigList.addField("IgnoreNodeScale", "Ignore Node Scale", "bool", "", "0", "", %optionsObj);
+   ImportOptionsConfigList.addField("AdjustCenter", "Adjust Center", "bool", "", "0", "", %optionsObj);
+   ImportOptionsConfigList.addField("AdjustFloor", "Adjust Floor", "bool", "", "0", "", %optionsObj);
+   ImportOptionsConfigList.addField("CollapseSubmeshes", "Collapse Submeshes", "bool", "", "0", "", %optionsObj);
+   ImportOptionsConfigList.addField("LODType", "LOD Type", "list", "", "TrailingNumber", "TrailingNumber,DetectDTS", %optionsObj);
+   //ImportOptionsConfigList.addField("TrailingNumber", "Trailing Number", "float", "", "2", "", %optionsObj, "Mesh");
+   ImportOptionsConfigList.addField("ImportedNodes", "Imported Nodes", "command", "", "", "", %optionsObj);
+   ImportOptionsConfigList.addField("IgnoreNodes", "Ignore Nodes", "command", "", "", "", %optionsObj);
+   ImportOptionsConfigList.addField("ImportMeshes", "Import Meshes", "command", "", "", "", %optionsObj);
+   ImportOptionsConfigList.addField("IgnoreMeshes", "Imported Meshes", "command", "", "", "", %optionsObj);
+   ImportOptionsConfigList.endGroup();
+   
+   //Materials
+   ImportOptionsConfigList.startGroup("Material");
+   ImportOptionsConfigList.addField("ImportMaterials", "Import Materials", "bool", "", "1", "", %optionsObj);
+   ImportOptionsConfigList.addField("CreateComposites", "Create Composites", "bool", "", "1", "", %optionsObj);
+   ImportOptionsConfigList.addField("UseDiffuseSuffixOnOriginImg", "Use Diffuse Suffix for Origin Image", "bool", "", "1", "", %optionsObj);
+   ImportOptionsConfigList.addField("UseExistingMaterials", "Use Existing Materials", "bool", "", "1", "", %optionsObj);
+   ImportOptionsConfigList.addField("IgnoreMaterials", "Ignore Materials", "command", "", "", "", %optionsObj);
+   ImportOptionsConfigList.endGroup();
+   
+   //Animations
+   ImportOptionsConfigList.startGroup("Animations");
+   ImportOptionsConfigList.addField("ImportAnimations", "Import Animations", "bool", "", "1", "", %optionsObj);
+   ImportOptionsConfigList.addField("SeparateAnimations", "Separate Animations", "bool", "", "1", "", %optionsObj);
+   ImportOptionsConfigList.addField("SeparateAnimationPrefix", "Separate Animation Prefix", "string", "", "", "", %optionsObj);
+   ImportOptionsConfigList.endGroup();
+   
+   //Collision
+   ImportOptionsConfigList.startGroup("Collision");
+   ImportOptionsConfigList.addField("GenerateCollisions", "Generate Collisions", "bool", "", "1", "", %optionsObj);
+   ImportOptionsConfigList.addField("GenCollisionType", "Generate Collision Type", "list", "", "CollisionMesh", "CollisionMesh,ConvexHull", %optionsObj);
+   ImportOptionsConfigList.addField("CollisionMeshPrefix", "CollisionMesh Prefix", "string", "", "Col", "", %optionsObj);
+   ImportOptionsConfigList.addField("GenerateLOSCollisions", "Generate LOS Collisions", "bool", "", "1", "", %optionsObj);
+   ImportOptionsConfigList.addField("GenLOSCollisionType", "Generate LOS Collision Type", "list", "", "CollisionMesh", "CollisionMesh,ConvexHull", %optionsObj);
+   ImportOptionsConfigList.addField("LOSCollisionMeshPrefix", "LOS CollisionMesh Prefix", "string", "", "LOS", "", %optionsObj);
+   ImportOptionsConfigList.endGroup();
+   
+   //Images
+   ImportOptionsConfigList.startGroup("Image");
+   ImportOptionsConfigList.addField("ImageType", "Image Type", "list", "", "N/A", "N/A,Diffuse,Normal,Specular,Metalness,Roughness,AO,Composite,GUI", %optionsObj);
+   ImportOptionsConfigList.addField("DiffuseTypeSuffixes", "Diffuse Type Suffixes", "command", "", "_ALBEDO,_DIFFUSE,_ALB,_DIF,_COLOR,_COL", "", %optionsObj);
+   ImportOptionsConfigList.addField("NormalTypeSuffixes", "Normal Type Suffixes", "command", "", "_NORMAL,_NORM", "", %optionsObj);
+   
+   if(EditorSettings.lightingModel $= "Legacy")
+   {
+      ImportOptionsConfigList.addField("SpecularTypeSuffixes", "Specular Type Suffixes", "command", "", "_SPECULAR,_SPEC", "", %optionsObj);
+   }
+   else
+   {
+      ImportOptionsConfigList.addField("MetalnessTypeSuffixes", "Metalness Type Suffixes", "command", "", "_METAL,_MET,_METALNESS,_METALLIC", "", %optionsObj);
+      ImportOptionsConfigList.addField("RoughnessTypeSuffixes", "Roughness Type Suffixes", "command", "", "_ROUGH,_ROUGHNESS", "", %optionsObj);
+      ImportOptionsConfigList.addField("SmoothnessTypeSuffixes", "Smoothness Type Suffixes", "command", "", "_SMOOTH,_SMOOTHNESS", "", %optionsObj);
+      ImportOptionsConfigList.addField("AOTypeSuffixes", "AO Type Suffixes", "command", "", "_AO,_AMBIENT,_AMBIENTOCCLUSION", "", %optionsObj);
+      ImportOptionsConfigList.addField("CompositeTypeSuffixes", "Composite Type Suffixes", "command", "", "_COMP,_COMPOSITE", "", %optionsObj);
+   }
+   
+   ImportOptionsConfigList.addField("TextureFilteringMode", "Texture Filtering Mode", "list", "", "Bilinear", "None,Bilinear,Trilinear", %optionsObj);
+   ImportOptionsConfigList.addField("UseMips", "Use Mipmaps", "bool", "", "1", "", %optionsObj);
+   ImportOptionsConfigList.addField("IsHDR", "Is HDR", "bool", "", "0", "", %optionsObj);
+   ImportOptionsConfigList.addField("Scaling", "Scaling", "float", "", "1.0", "", %optionsObj);
+   ImportOptionsConfigList.addField("Compressed", "Is Compressed", "bool", "", "1", "", %optionsObj);
+   ImportOptionsConfigList.addField("GenerateMaterialOnImport", "Generate Material On Import", "bool", "", "1", "", %optionsObj);
+   ImportOptionsConfigList.addField("PopulateMaterialMaps", "Populate Material Maps", "bool", "", "1", "", %optionsObj);
+   ImportOptionsConfigList.endGroup();
+   
+   //Sounds
+   ImportOptionsConfigList.startGroup("Sound");
+   ImportOptionsConfigList.addField("VolumeAdjust", "Volume Adjustment", "float", "", "1.0", "", %optionsObj);
+   ImportOptionsConfigList.addField("PitchAdjust", "Pitch Adjustment", "float", "", "1.0", "", %optionsObj);
+   ImportOptionsConfigList.addField("Compressed", "Is Compressed", "bool", "", "0", "", %optionsObj);
+   ImportOptionsConfigList.endGroup();
+}
+
+function ImportAssetConfigEditorWindow::addNewConfig(%this)
+{
+   ImportAssetConfigEditorWindow.setVisible(1);
+   ImportAssetConfigEditorWindow.selectWindow();
+   
+   %optionsObj = new ScriptObject(){};
+   
+   ImportAssetWindow.importConfigsList.add(%optionsObj); 
+   
+   //Initial, blank configuration
+   %optionsObj.ImportMesh = true;
+   %optionsObj.DoUpAxisOverride = false;
+   %optionsObj.UpAxisOverride = "Z_AXIS";
+   %optionsObj.DoScaleOverride = false;
+   %optionsObj.ScaleOverride = 1.0;
+   %optionsObj.IgnoreNodeScale = false;
+   %optionsObj.AdjustCenter = false;
+   %optionsObj.AdjustFloor = false;
+   %optionsObj.CollapseSubmeshes = false;
+   %optionsObj.LODType = "TrailingNumber";
+   //%optionsObj.TrailingNumber = 2;
+   %optionsObj.ImportedNodes = "";
+   %optionsObj.IgnoreNodes = "";
+   %optionsObj.ImportMeshes = "";
+   %optionsObj.IgnoreMeshes = "";
+   
+   //Materials
+   %optionsObj.ImportMaterials = true;
+   %optionsObj.CreateComposites = true;
+   %optionsObj.UseDiffuseSuffixOnOriginImg = true;
+   %optionsObj.UseExistingMaterials = true;
+   
+   //Animations
+   %optionsObj.ImportAnimations = true;
+   %optionsObj.SeparateAnimations = true;
+   %optionsObj.SeparateAnimationPrefix = "";
+   
+   //Collision
+   %optionsObj.GenerateCollisions = true;
+   %optionsObj.GenCollisionType = "CollisionMesh";
+   %optionsObj.CollisionMeshPrefix = "Col";
+   %optionsObj.GenerateLOSCollisions = true;
+   %optionsObj.GenLOSCollisionType = "CollisionMesh";
+   %optionsObj.LOSCollisionMeshPrefix = "LOS";
+   
+   //Images
+   %optionsObj.ImageType = "N/A";
+   %optionsObj.DiffuseTypeSuffixes = "_ALBEDO;_DIFFUSE;_ALB;_DIF;_COLOR;_COL;_BASECOLOR;_BASE_COLOR";
+   %optionsObj.NormalTypeSuffixes = "_NORMAL;_NORM";
+   %optionsObj.SpecularTypeSuffixes = "_SPECULAR;_SPEC";
+   %optionsObj.MetalnessTypeSuffixes = "_METAL;_MET;_METALNESS;_METALLIC";
+   %optionsObj.RoughnessTypeSuffixes = "_ROUGH;_ROUGHNESS";
+   %optionsObj.SmoothnessTypeSuffixes = "_SMOOTH;_SMOOTHNESS";
+   %optionsObj.AOTypeSuffixes = "_AO;_AMBIENT;_AMBIENTOCCLUSION";
+   %optionsObj.CompositeTypeSuffixes = "_COMP;_COMPOSITE";
+   %optionsObj.TextureFilteringMode = "Bilinear";
+   %optionsObj.UseMips = true;
+   %optionsObj.IsHDR = false;
+   %optionsObj.Scaling = 1.0;
+   %optionsObj.Compressed = true;
+   %optionsObj.GenerateMaterialOnImport = true;
+   %optionsObj.PopulateMaterialMaps = true;
+   
+   //Sounds
+   %optionsObj.VolumeAdjust = 1.0;
+   %optionsObj.PitchAdjust = 1.0;
+   %optionsObj.Compressed = false;
+   
+   //Hook in the UI
+   %this.populateConfigList(%optionsObj);
+}
+
+function ImportAssetConfigEditorWindow::editConfig(%this)
+{
+   ImportAssetConfigEditorWindow.setVisible(1);
+   ImportAssetConfigEditorWindow.selectWindow();
+   
+   %this.populateConfigList(ImportAssetWindow.activeImportConfig);
+}
+
+function ImportAssetConfigEditorWindow::deleteConfig(%this)
+{
+   ImportAssetWindow.importConfigsList.erase(ImportAssetWindow.activeImportConfigIndex);
+   ImportAssetConfigList.setSelected(0); //update it
+   
+   ImportAssetConfigEditorWindow.saveAssetOptionsConfig();
+}
+
+function ImportAssetConfigEditorWindow::saveAssetOptionsConfig(%this)
+{
+   %xmlDoc = new SimXMLDocument();
+   
+   %xmlDoc.pushNewElement("AssetImportConfigs");
+      
+      for(%i = 0; %i < ImportAssetWindow.importConfigsList.count(); %i++)
+      {
+         %configObj = ImportAssetWindow.importConfigsList.getKey(%i);         
+         
+         %xmlDoc.pushNewElement("Config");
+         
+         if(%configObj.Name $= "")
+            %configObj.Name = AssetImportConfigName.getText();
+            
+         %xmlDoc.setAttribute("Name", %configObj.Name); 
+         
+            %xmlDoc.pushNewElement("Mesh");
+               %xmlDoc.setAttribute("ImportMesh", %configObj.ImportMesh);
+               %xmlDoc.setAttribute("DoUpAxisOverride", %configObj.DoUpAxisOverride);
+               %xmlDoc.setAttribute("UpAxisOverride", %configObj.UpAxisOverride);
+               %xmlDoc.setAttribute("DoScaleOverride", %configObj.DoScaleOverride);
+               %xmlDoc.setAttribute("ScaleOverride", %configObj.ScaleOverride);
+               %xmlDoc.setAttribute("IgnoreNodeScale", %configObj.IgnoreNodeScale);
+               %xmlDoc.setAttribute("AdjustCenter", %configObj.AdjustCenter);
+               %xmlDoc.setAttribute("AdjustFloor", %configObj.AdjustFloor);
+               %xmlDoc.setAttribute("CollapseSubmeshes", %configObj.CollapseSubmeshes);         
+               %xmlDoc.setAttribute("LODType", %configObj.LODType);
+               %xmlDoc.setAttribute("ImportedNodes", %configObj.ImportedNodes);
+               %xmlDoc.setAttribute("IgnoreNodes", %configObj.IgnoreNodes);
+               %xmlDoc.setAttribute("ImportMeshes", %configObj.ImportMeshes);
+               %xmlDoc.setAttribute("IgnoreMeshes", %configObj.IgnoreMeshes);
+            %xmlDoc.popElement();
+            
+            %xmlDoc.pushNewElement("Materials");
+               %xmlDoc.setAttribute("ImportMaterials", %configObj.ImportMaterials);
+               %xmlDoc.setAttribute("CreateComposites", %configObj.CreateComposites);
+               %xmlDoc.setAttribute("UseDiffuseSuffixOnOriginImg", %configObj.UseDiffuseSuffixOnOriginImg);
+               %xmlDoc.setAttribute("UseExistingMaterials", %configObj.UseExistingMaterials);
+            %xmlDoc.popElement();
+            
+            %xmlDoc.pushNewElement("Animations");
+               %xmlDoc.setAttribute("ImportAnimations", %configObj.ImportAnimations);
+               %xmlDoc.setAttribute("SeparateAnimations", %configObj.SeparateAnimations);
+               %xmlDoc.setAttribute("SeparateAnimationPrefix", %configObj.SeparateAnimationPrefix);
+            %xmlDoc.popElement();
+            
+            %xmlDoc.pushNewElement("Collisions");
+               %xmlDoc.setAttribute("GenerateCollisions", %configObj.GenerateCollisions);
+               %xmlDoc.setAttribute("GenCollisionType", %configObj.GenCollisionType);
+               %xmlDoc.setAttribute("CollisionMeshPrefix", %configObj.CollisionMeshPrefix);
+               %xmlDoc.setAttribute("GenerateLOSCollisions", %configObj.GenerateLOSCollisions);
+               %xmlDoc.setAttribute("GenLOSCollisionType", %configObj.GenLOSCollisionType);
+               %xmlDoc.setAttribute("LOSCollisionMeshPrefix", %configObj.LOSCollisionMeshPrefix);
+            %xmlDoc.popElement();
+            
+            %xmlDoc.pushNewElement("Images");
+               %xmlDoc.setAttribute("ImageType", %configObj.ImageType);
+               %xmlDoc.setAttribute("DiffuseTypeSuffixes", %configObj.DiffuseTypeSuffixes);
+               %xmlDoc.setAttribute("NormalTypeSuffixes", %configObj.NormalTypeSuffixes);
+               %xmlDoc.setAttribute("SpecularTypeSuffixes", %configObj.SpecularTypeSuffixes);
+               %xmlDoc.setAttribute("MetalnessTypeSuffixes", %configObj.MetalnessTypeSuffixes);
+               %xmlDoc.setAttribute("RoughnessTypeSuffixes", %configObj.RoughnessTypeSuffixes);
+               %xmlDoc.setAttribute("SmoothnessTypeSuffixes", %configObj.SmoothnessTypeSuffixes);
+               %xmlDoc.setAttribute("AOTypeSuffixes", %configObj.AOTypeSuffixes);
+               %xmlDoc.setAttribute("CompositeTypeSuffixes", %configObj.CompositeTypeSuffixes);
+               %xmlDoc.setAttribute("TextureFilteringMode", %configObj.TextureFilteringMode);
+               %xmlDoc.setAttribute("UseMips", %configObj.UseMips);
+               %xmlDoc.setAttribute("IsHDR", %configObj.IsHDR);
+               %xmlDoc.setAttribute("Scaling", %configObj.Scaling);
+               %xmlDoc.setAttribute("Compressed", %configObj.Compressed);
+               %xmlDoc.setAttribute("GenerateMaterialOnImport", %configObj.GenerateMaterialOnImport);
+               %xmlDoc.setAttribute("PopulateMaterialMaps", %configObj.PopulateMaterialMaps);
+            %xmlDoc.popElement();
+            
+            %xmlDoc.pushNewElement("Sounds");
+               %xmlDoc.setAttribute("VolumeAdjust", %configObj.VolumeAdjust);
+               %xmlDoc.setAttribute("PitchAdjust", %configObj.PitchAdjust);
+               %xmlDoc.setAttribute("Compressed", %configObj.Compressed);
+            %xmlDoc.popElement();
+         
+         %xmlDoc.popElement();
+      }
+      
+   %xmlDoc.popElement();
+   
+   %xmlDoc.saveFile($AssetBrowser::importConfigsFile);
+   
+   ImportAssetConfigEditorWindow.setVisible(0);
+   ImportAssetWindow.reloadImportOptionConfigs();
+}
+
+function ImportOptionsConfigList::ToggleImportMesh(%this, %fieldName, %newValue, %ownerObject)
+{
+   %this.setFieldEnabled("DoUpAxisOverride", %newValue);
+   %this.setFieldEnabled("UpAxisOverride", %newValue);
+   %this.setFieldEnabled("DoScaleOverride", %newValue);
+   %this.setFieldEnabled("ScaleOverride", %newValue);
+   %this.setFieldEnabled("IgnoreNodeScale", %newValue);
+   %this.setFieldEnabled("AdjustCenter", %newValue);
+   %this.setFieldEnabled("AdjustFloor", %newValue);
+   %this.setFieldEnabled("CollapseSubmeshes", %newValue);
+   %this.setFieldEnabled("LODType", %newValue);   
+   %this.setFieldEnabled("ImportedNodes", %newValue);
+   %this.setFieldEnabled("IgnoreNodes", %newValue);
+   %this.setFieldEnabled("ImportMeshes", %newValue);
+   %this.setFieldEnabled("IgnoreMeshes", %newValue);
+}

+ 371 - 0
Templates/BaseGame/game/tools/assetBrowser/scripts/editAsset.cs

@@ -0,0 +1,371 @@
+function AssetBrowser_editAsset::saveAsset(%this)
+{
+   %file = AssetDatabase.getAssetFilePath(%this.editedAssetId);
+   %success = TamlWrite(AssetBrowser_editAsset.editedAsset, %file);
+   
+   AssetBrowser.loadFilters();
+
+   Canvas.popDialog(AssetBrowser_editAsset);
+}
+
+function AssetBrowser::editAsset(%this)
+{
+   //Find out what type it is
+   %assetDef = AssetDatabase.acquireAsset(EditAssetPopup.assetId);
+   %assetType = %assetDef.getClassName();
+   
+   if(%assetType $= "MaterialAsset")
+   {
+      //if(EditorSettings.materialEditMode $= "MaterialEditor")
+      //{
+         %assetDef.materialDefinitionName.reload();
+         
+         EditorGui.setEditor(MaterialEditorPlugin);
+         
+         MaterialEditorGui.currentMaterial = %assetDef.materialDefinitionName;
+         MaterialEditorGui.setActiveMaterial( %assetDef.materialDefinitionName );
+         
+         AssetBrowser.hideDialog();
+      /*}
+      else
+      {
+         Canvas.pushDialog(ShaderEditor); 
+         ShaderEditorGraph.loadGraph(%assetDef.shaderGraph);
+         $ShaderGen::targetShaderFile = filePath(%assetDef.shaderGraph) @"/"@fileBase(%assetDef.shaderGraph);
+      }*/
+   }
+   else if(%assetType $= "StateMachineAsset")
+   {
+      eval("AssetBrowser.tempAsset = new " @ %assetDef.getClassName() @ "();");
+      AssetBrowser.tempAsset.assignFieldsFrom(%assetDef);
+      
+      SMAssetEditInspector.inspect(AssetBrowser.tempAsset);  
+      AssetBrowser_editAsset.editedAssetId = EditAssetPopup.assetId;
+      AssetBrowser_editAsset.editedAsset = AssetBrowser.tempAsset;
+      
+      //remove some of the groups we don't need:
+      for(%i=0; %i < SMAssetEditInspector.getCount(); %i++)
+      {
+         %caption = SMAssetEditInspector.getObject(%i).caption;
+         
+         if(%caption $= "Ungrouped" || %caption $= "Object" || %caption $= "Editing" 
+            || %caption $= "Persistence" || %caption $= "Dynamic Fields")
+         {
+            SMAssetEditInspector.remove(SMAssetEditInspector.getObject(%i));
+            %i--;
+         }
+      }
+   
+      Canvas.pushDialog(StateMachineEditor);
+      StateMachineEditor.loadStateMachineAsset(EditAssetPopup.assetId);
+      StateMachineEditor-->Window.text = "State Machine Editor ("@EditAssetPopup.assetId@")";
+   }
+   else if(%assetType $= "ComponentAsset")
+   {
+      %assetDef = AssetDatabase.acquireAsset(EditAssetPopup.assetId);
+      %scriptFile = %assetDef.scriptFile;
+      
+      EditorOpenFileInTorsion(makeFullPath(%scriptFile), 0);
+   }
+   else if(%assetType $= "GameObjectAsset")
+   {
+      %assetDef = AssetDatabase.acquireAsset(EditAssetPopup.assetId);
+      %scriptFile = %assetDef.scriptFilePath;
+      
+      EditorOpenFileInTorsion(makeFullPath(%scriptFile), 0);
+   }
+   else if(%assetType $= "ScriptAsset")
+   {
+      %assetDef = AssetDatabase.acquireAsset(EditAssetPopup.assetId);
+      %scriptFile = %assetDef.scriptFilePath;
+      
+      EditorOpenFileInTorsion(makeFullPath(%scriptFile), 0);
+   }
+   else if(%assetType $= "ShapeAsset")
+   {
+      %this.hideDialog();
+      ShapeEditorPlugin.openShapeAsset(EditAssetPopup.assetId);  
+   }
+   else if(%assetType $= "ShapeAnimationAsset")
+   {
+      %this.hideDialog();
+      ShapeEditorPlugin.openShapeAsset(EditAssetPopup.assetId);  
+   }
+   else if(%assetType $= "LevelAsset")
+   {
+      schedule( 1, 0, "EditorOpenMission", %assetDef.LevelFile);
+   }
+   else if(%assetType $= "GUIAsset")
+   {
+      if(!isObject(%assetDef.assetName))
+      {
+         exec(%assetDef.GUIFilePath);
+         exec(%assetDef.mScriptFilePath);
+      }
+      
+      GuiEditContent(%assetDef.assetName);
+   }
+}
+
+function AssetBrowser::editAssetInfo(%this)
+{
+   Canvas.pushDialog(AssetBrowser_editAsset); 
+   
+   %assetDef = AssetDatabase.acquireAsset(EditAssetPopup.assetId);
+   
+   eval("AssetBrowser.tempAsset = new " @ %assetDef.getClassName() @ "();");
+   AssetBrowser.tempAsset.assignFieldsFrom(%assetDef);
+   
+   AssetEditInspector.inspect(AssetBrowser.tempAsset);  
+   AssetBrowser_editAsset.editedAssetId = EditAssetPopup.assetId;
+   AssetBrowser_editAsset.editedAsset = AssetBrowser.tempAsset;
+   
+   //remove some of the groups we don't need:
+   for(%i=0; %i < AssetEditInspector.getCount(); %i++)
+   {
+      %caption = AssetEditInspector.getObject(%i).caption;
+      
+      if(%caption $= "Ungrouped" || %caption $= "Object" || %caption $= "Editing" 
+         || %caption $= "Persistence" || %caption $= "Dynamic Fields")
+      {
+         AssetEditInspector.remove(AssetEditInspector.getObject(%i));
+         %i--;
+      }
+   }
+}
+
+//------------------------------------------------------------
+
+function AssetBrowser::refreshAsset(%this, %assetId)
+{
+   if(%assetId $= "")
+   {
+      //if we have no passed-in asset ID, we're probably going through the popup menu, so get our edit popup id  
+      %assetId = EditAssetPopup.assetId;
+   }
+   
+   AssetDatabase.refreshAsset(%assetId);
+   AssetBrowser.refreshPreviews();
+}
+
+//------------------------------------------------------------
+
+function AssetBrowser::renameAsset(%this)
+{
+   //Find out what type it is
+   %assetDef = AssetDatabase.acquireAsset(EditAssetPopup.assetId);
+   
+   %curFirstResponder = AssetBrowser.getFirstResponder();
+   
+   if(%curFirstResponder != 0)
+      %curFirstResponder.clearFirstResponder();
+   
+   AssetBrowser.selectedAssetPreview-->AssetNameLabel.setActive(true);
+   AssetBrowser.selectedAssetPreview-->AssetNameLabel.setFirstResponder();
+}
+
+function AssetNameField::onReturn(%this)
+{
+   //if the name is different to the asset's original name, rename it!
+   %newName = %this.getText();
+   if(%this.originalAssetName !$= %this.getText())
+   {
+      %moduleName = AssetBrowser.selectedModule;
+      
+      //do a rename!
+      %success = AssetDatabase.renameDeclaredAsset(%moduleName @ ":" @ %this.originalAssetName, %moduleName @ ":" @ %this.getText());
+      
+      if(%success)
+      {
+         %newAssetId = %moduleName @ ":" @ %this.getText();
+         %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);
+         
+         if(%assetType $= "ComponentAsset")
+         {
+            %oldScriptFilePath = %assetDef.scriptFile;
+            %scriptFilePath = filePath(%assetDef.scriptFile);
+            %scriptExt = fileExt(%assetDef.scriptFile);
+            
+            %newScriptFileName = %scriptFilePath @ "/" @ %newName @ %scriptExt;
+            %newAssetFile = %path @ "/" @ %this.getText() @ ".asset.taml";
+            
+            %assetDef.componentName = %newName;
+            %assetDef.scriptFile = %newScriptFileName;
+            
+            TamlWrite(%assetDef, %newAssetFile);
+            fileDelete(%assetPath);
+            
+            pathCopy(%oldScriptFilePath, %newScriptFileName);
+            fileDelete(%oldScriptFilePath);
+            
+            //Go through our scriptfile and replace the old namespace with the new
+            %editedFileContents = "";
+            
+            %file = new FileObject();
+            if ( %file.openForRead( %newScriptFileName ) ) 
+            {
+		         while ( !%file.isEOF() ) 
+		         {
+                  %line = %file.readLine();
+                  %line = trim( %line );
+                  
+                  %editedFileContents = %editedFileContents @ strreplace(%line, %this.originalAssetName, %newName) @ "\n";
+		         }
+		         
+		         %file.close();
+            }
+            
+            if(%editedFileContents !$= "")
+            {
+               %file.openForWrite(%newScriptFileName);
+               
+               %file.writeline(%editedFileContents);
+               
+               %file.close();
+            }
+            
+            exec(%newScriptFileName);
+         }
+         else if(%assetType $= "StateMachineAsset")
+         {
+            %oldScriptFilePath = %assetDef.stateMachineFile;
+            %scriptFilePath = filePath(%assetDef.stateMachineFile);
+            %scriptExt = fileExt(%assetDef.stateMachineFile);
+            
+            %newScriptFileName = %scriptFilePath @ "/" @ %newName @ %scriptExt;
+            %newAssetFile = %path @ "/" @ %this.getText() @ ".asset.taml";
+            
+            %assetDef.stateMachineFile = %newScriptFileName;
+            
+            TamlWrite(%assetDef, %newAssetFile);
+            fileDelete(%assetPath);
+            
+            pathCopy(%oldScriptFilePath, %newScriptFileName);
+            fileDelete(%oldScriptFilePath);
+         }
+         else if(%assetType $= "GameObjectAsset")
+         {
+            %oldScriptFilePath = %assetDef.scriptFilePath;
+            %scriptFilePath = filePath(%assetDef.scriptFilePath);
+            %scriptExt = fileExt(%assetDef.scriptFilePath);
+            
+            %oldGOFilePath = %assetDef.TAMLFilePath;
+            
+            %newScriptFileName = %scriptFilePath @ "/" @ %newName @ %scriptExt;
+            %newAssetFile = %path @ "/" @ %this.getText() @ ".asset.taml";
+            %newGOFile = %path @ "/" @ %this.getText() @ ".taml";
+            
+            %assetDef.gameObjectName = %newName;
+            %assetDef.scriptFilePath = %newScriptFileName;
+            %assetDef.TAMLFilePath = %newGOFile;
+            
+            TamlWrite(%assetDef, %newAssetFile);
+            fileDelete(%assetPath);
+            
+            pathCopy(%oldScriptFilePath, %newScriptFileName);
+            fileDelete(%oldScriptFilePath);
+            
+            pathCopy(%oldGOFilePath, %newGOFile);
+            fileDelete(%oldGOFilePath);
+            
+            //Go through our scriptfile and replace the old namespace with the new
+            %editedFileContents = "";
+            
+            %file = new FileObject();
+            if ( %file.openForRead( %newScriptFileName ) ) 
+            {
+		         while ( !%file.isEOF() ) 
+		         {
+                  %line = %file.readLine();
+                  %line = trim( %line );
+                  
+                  %editedFileContents = %editedFileContents @ strreplace(%line, %this.originalAssetName, %newName) @ "\n";
+		         }
+		         
+		         %file.close();
+            }
+            
+            if(%editedFileContents !$= "")
+            {
+               %file.openForWrite(%newScriptFileName);
+               
+               %file.writeline(%editedFileContents);
+               
+               %file.close();
+            }
+            
+            exec(%newScriptFileName);
+            
+            //Rename in the TAML file as well
+            %file = new FileObject();
+            if ( %file.openForRead( %newGOFile ) ) 
+            {
+		         while ( !%file.isEOF() ) 
+		         {
+                  %line = %file.readLine();
+                  %line = trim( %line );
+                  
+                  %editedFileContents = %editedFileContents @ strreplace(%line, %this.originalAssetName, %newName) @ "\n";
+		         }
+		         
+		         %file.close();
+            }
+            
+            if(%editedFileContents !$= "")
+            {
+               %file.openForWrite(%newGOFile);
+               
+               %file.writeline(%editedFileContents);
+               
+               %file.close();
+            }
+         }
+      }
+   }
+   
+   %this.clearFirstResponder();
+   %this.setActive(false);
+}
+
+//------------------------------------------------------------
+
+function AssetBrowser::duplicateAsset(%this)
+{
+   %assetDef = AssetDatabase.acquireAsset(EditAssetPopup.assetId);
+   
+   %this.setupCreateNewAsset(%assetDef.getClassName(), AssetBrowser.selectedModule);
+}
+
+function AssetBrowser::deleteAsset(%this)
+{
+   //Find out what type it is
+   %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?", 
+      "AssetBrowser.confirmDeleteAsset();", "");
+}
+
+function AssetBrowser::confirmDeleteAsset(%this)
+{
+   %currentSelectedItem = AssetBrowserFilterTree.getSelectedItem();
+   %currentItemParent = AssetBrowserFilterTree.getParentItem(%currentSelectedItem);
+   
+   AssetDatabase.deleteAsset(EditAssetPopup.assetId, false);
+   
+   %this.loadFilters();
+   
+   if(!AssetBrowserFilterTree.selectItem(%currentSelectedItem))
+   {
+      //if it failed, that means we deleted the last item in that category, and we need to do the parent  
+      AssetBrowserFilterTree.selectItem(%currentItemParent);
+      AssetBrowserFilterTree.expandItem(%currentItemParent);
+   }
+}

+ 127 - 0
Templates/BaseGame/game/tools/assetBrowser/scripts/editModule.cs

@@ -0,0 +1,127 @@
+//
+function AssetBrowser::CreateNewModule(%this)
+{
+   Canvas.pushDialog(AssetBrowser_AddModule); 
+   AssetBrowser_addModuleWindow.selectWindow();  
+   
+   AssetBrowser_addModuleWindow.callbackFunction = "AssetBrowser.loadFilters();";
+}
+
+function AssetBrowser_editModule::saveModule(%this)
+{
+   //Check what special actions we may need to do, such as renames
+   %moduleDef = ModuleDatabase.findModule(AssetBrowser.selectedModule, 1);
+   
+   %oldModuleName = %moduleDef.ModuleID;
+   
+   if(%oldModuleName !$= AssetBrowser.tempModule.ModuleID)
+   {      
+      //rename the script file and script namespaces
+      %oldScriptFilePath = "data/" @ %oldModuleName @ "/" @ %moduleDef.scriptFile;
+      %newscriptFilePath = "data/" @ AssetBrowser.tempModule.ModuleID @ "/";
+      %scriptExt = fileExt(%moduleDef.scriptFile);
+      
+      %newScriptFileName = %newscriptFilePath @ "/" @ AssetBrowser.tempModule.ModuleID @ %scriptExt;
+      %newScriptFileOldName = %newscriptFilePath @ "/" @ %oldModuleName @ %scriptExt;
+      
+      %moduleDef.ModuleId = AssetBrowser.tempModule.ModuleID;
+      %moduleDef.scriptFile = AssetBrowser.tempModule.ModuleID @ %scriptExt;
+      
+      ModuleDatabase.copyModule(%moduleDef, AssetBrowser.tempModule.ModuleID, "data/" @ AssetBrowser.tempModule.ModuleID);
+      
+      //Go through our scriptfile and replace the old namespace with the new
+      %editedFileContents = "";
+      
+      %file = new FileObject();
+      if ( %file.openForRead( %newScriptFileOldName ) ) 
+      {
+         while ( !%file.isEOF() ) 
+         {
+            %line = %file.readLine();
+            %line = trim( %line );
+            
+            %editedFileContents = %editedFileContents @ strreplace(%line, %oldModuleName, AssetBrowser.tempModule.ModuleID) @ "\n";
+         }
+         
+         %file.close();
+      }
+      
+      if(%editedFileContents !$= "")
+      {
+         %file.openForWrite(%newScriptFileName);
+         
+         %file.writeline(%editedFileContents);
+         
+         %file.close();
+      }
+      
+      %success = fileDelete(%newScriptFileOldName);
+      
+      ModuleDatabase.unloadExplicit(%oldModuleName);
+      
+      %success = fileDelete("data/" @ %oldModuleName);
+      
+      ModuleDatabase.loadExplicit(AssetBrowser.tempModule.ModuleID);
+   }
+   
+   //Now, update the module file itself
+   //%file = ModuleDatabase.getAssetFilePath(%moduleDef.ModuleID);
+   //%success = TamlWrite(AssetBrowser_editAsset.editedAsset, %file);
+   
+   AssetBrowser.loadFilters();
+
+   Canvas.popDialog(AssetBrowser_editModule);
+}
+
+function AssetBrowser::editModuleInfo(%this)
+{
+   Canvas.pushDialog(AssetBrowser_editModule); 
+   
+   %moduleDef = ModuleDatabase.findModule(AssetBrowser.selectedModule, 1);
+   
+   AssetBrowser.tempModule = new ModuleDefinition();
+   AssetBrowser.tempModule.assignFieldsFrom(%moduleDef);
+   
+   ModuleEditInspector.inspect(AssetBrowser.tempModule);  
+   AssetBrowser_editModule.editedModuleId = AssetBrowser.selectedModule;
+   AssetBrowser_editModule.editedModule = AssetBrowser.tempModule;
+   
+   //remove some of the groups we don't need:
+   for(%i=0; %i < ModuleEditInspector.getCount(); %i++)
+   {
+      %caption = ModuleEditInspector.getObject(%i).caption;
+      
+      if(%caption $= "BuildId" || %caption $= "type" || %caption $= "Dependencies" || %caption $= "scriptFile" 
+         || %caption $= "AssetTagsManifest" || %caption $= "ScopeSet" || %caption $= "ModulePath" 
+         || %caption $= "ModuleFile" || %caption $= "ModuleFilePath" || %caption $= "ModuleScriptFilePath"  )
+      {
+         ModuleEditInspector.remove(ModuleEditInspector.getObject(%i));
+         %i--;
+      }
+   }
+}
+
+function AssetBrowser::renameModule(%this)
+{
+   
+}
+
+function AssetBrowser::reloadModule(%this)
+{
+   ModuleDatabase.unregisterModule(AssetBrowser.SelectedModule, 1);
+   ModuleDatabase.loadExplicit(AssetBrowser.SelectedModule);
+}
+
+function AssetBrowser::deleteModule(%this)
+{
+   
+}
+
+function AssetBrowser::RefreshModuleDependencies(%this)
+{
+   //Iterate through all our modules
+   
+   //then, iterate through the module's assets
+   
+   //if an asset has a module that isn't us, queue that into the dependencies list  
+}

+ 127 - 0
Templates/BaseGame/game/tools/assetBrowser/scripts/fieldTypes.cs

@@ -0,0 +1,127 @@
+function GuiVariableInspector::onInspectorFieldModified(%this, %targetObj, %fieldName, %index, %oldValue, %newValue)
+{
+   echo("FIELD CHANGED: " @ %fieldName @ " from " @ %oldValue @ " to " @ %newValue);
+}
+
+function GuiInspectorVariableGroup::onConstructField(%this, %fieldName, %fieldLabel, %fieldTypeName, %fieldDesc, %fieldDefaultVal, %fieldDataVals, %ownerObj)
+{
+   %makeCommand = %this @ ".build" @ %fieldTypeName @ "Field(\""@ %fieldName @ "\",\"" @ %fieldLabel @ "\",\"" @ %fieldDesc @ "\",\"" @ 
+            %fieldDefaultVal @ "\",\"" @ %fieldDataVals @ "\",\"" @ %ownerObj @"\");";
+   eval(%makeCommand);
+}
+
+function GuiInspectorVariableGroup::buildListField(%this, %fieldName, %fieldLabel, %fieldDesc, %fieldDefaultVal, %fieldDataVals, %ownerObj)
+{
+   %extent = 200;
+   
+   %fieldCtrl = %this.createInspectorField();
+   
+   %extent = %this.stack.getExtent();
+   
+   %width = mRound(%extent/2);
+   %height = 20;
+   %inset = 10;
+      
+   /*%container = new GuiControl() {
+      canSaveDynamicFields = "0";
+      Profile = "EditorContainerProfile";
+      HorizSizing = "right";
+      VertSizing = "bottom";
+      Position = "0 0";
+      Extent = %extent.x SPC %height;
+      MinExtent = "8 2";
+      canSave = "0";
+      Visible = "1";
+      hovertime = "100";
+      tooltip = %tooltip;
+      tooltipProfile = "EditorToolTipProfile";
+   };
+
+   %labelControl = new GuiTextCtrl() {
+      canSaveDynamicFields = "0";
+      Profile = "EditorFontHLBold";
+      HorizSizing = "right";
+      VertSizing = "bottom";
+      Position = %inset SPC "0";
+      Extent = %width + %inset SPC %height;
+      MinExtent = "8 2";
+      canSave = "0";
+      Visible = "1";
+      hovertime = "100";
+      tooltip = %tooltip;
+      tooltipProfile = "EditorToolTipProfile";
+      text = %fieldLabel;
+      maxLength = "1024";
+   };*/
+   
+   %editControl = new GuiPopUpMenuCtrl() {
+      class = "guiInspectorListField";
+      maxPopupHeight = "200";
+      sbUsesNAColor = "0";
+      reverseTextList = "0";
+      bitmapBounds = "16 16";
+      maxLength = "1024";
+      Margin = "0 0 0 0";
+      Padding = "0 0 0 0";
+      AnchorTop = "1";
+      AnchorBottom = "0";
+      AnchorLeft = "1";
+      AnchorRight = "0";
+      isContainer = "0";
+      Profile = "ToolsGuiPopUpMenuProfile";
+      HorizSizing = "right";
+      VertSizing = "bottom";
+      Position = %fieldCtrl.edit.position;
+      Extent = %fieldCtrl.edit.extent;
+      MinExtent = "8 2";
+      canSave = "1";
+      Visible = "1";
+      tooltipprofile = "ToolsGuiToolTipProfile";
+      tooltip = %tooltip;
+      text = %fieldDefaultVal;
+      hovertime = "1000";
+      ownerObject = %ownerObj;
+      fieldName = %fieldName;
+   };
+   
+   //set the field value
+   if(getSubStr(%this.fieldName, 0, 1) $= "$")
+   {
+      if(%fieldName $= "")
+         %editControl.setText(%fieldName);
+   }
+   else
+   {
+      //regular variable
+      %setCommand = %editControl @ ".setText(" @ %ownerObj @ "." @ %fieldName @ ");";
+      eval(%setCommand);
+   }
+   
+   %listCount = getTokenCount(%fieldDataVals, ",");
+   
+   for(%i=0; %i < %listCount; %i++)
+   {
+      %entryText = getToken(%fieldDataVals, ",", %i);
+      %editControl.add(%entryText); 
+   }
+
+   %fieldCtrl.setCaption(%fieldLabel);
+   %fieldCtrl.setEditControl(%editControl);
+
+   %this.addInspectorField(%fieldCtrl);
+}
+
+function guiInspectorListField::onSelect( %this, %id, %text )
+{   
+   if(getSubStr(%this.fieldName, 0, 1) $= "$")
+   {
+      //ah, a global var, just do it straight, then
+      %setCommand = %this.fieldName @ " = \"" @ %text @ "\";";
+   }
+   else
+   {
+      //regular variable
+      %setCommand = %this.ownerObject @ "." @ %this.fieldName @ " = \"" @ %text @ "\";";
+   }
+   eval(%setCommand);
+}

+ 130 - 0
Templates/BaseGame/game/tools/assetBrowser/scripts/gameObjectCreator.cs

@@ -0,0 +1,130 @@
+function GameObjectModuleList::onWake(%this)
+{
+   %this.refresh();
+}
+
+function GameObjectModuleList::refresh(%this)
+{
+   %this.clear();
+   
+   //First, get our list of modules
+   %moduleList = ModuleDatabase.findModules();
+   
+   %count = getWordCount(%moduleList);
+   for(%i=0; %i < %count; %i++)
+   {
+      %moduleName = getWord(%moduleList, %i);
+      %this.add(%moduleName.ModuleId, %i);  
+   }
+}
+
+function GameObjectCreatorPkgBtn::onClick(%this)
+{
+   Canvas.pushDialog(AssetBrowser_AddModule);
+   AssetBrowser_addModuleWindow.selectWindow();
+}
+
+function GameObjectCreateBtn::onClick(%this)
+{
+   %className = GameObjectCreatorName.getText();
+   
+   if(%className $= "")
+	{
+		error("Attempted to make a new Game Object with no name!");
+		Canvas.popDialog(GameObjectCreator);
+		return;
+	}
+	
+	//First, find out if this one already exists. If so, we're obviously merely updating it
+	//also, exec any components that may exist
+   //find all GameObjectAssets
+   %assetQuery = new AssetQuery();
+   if(!AssetDatabase.findAssetType(%assetQuery, "GameObjectAsset"))
+      return; //if we didn't find ANY, just exit
+      
+   %count = %assetQuery.getCount();
+   
+   %createNew = true;
+   
+	for(%i=0; %i < %count; %i++)
+	{
+	   %assetId = %assetQuery.getAsset(%i);
+      
+      %gameObjectAsset = AssetDatabase.acquireAsset(%assetId);
+      
+      if(%gameObjectAsset.gameObjectName $= %className)
+      {
+         %createNew = false;
+         break;
+      }
+	}
+	
+	%selectedEntity = GameObjectCreator.selectedEntity;
+
+	%selectedEntity.class = %className;
+	Inspector.inspect(%selectedEntity);
+	
+	if(%createNew)
+	{
+      //get the selected module data
+      %moduleName = GameObjectModuleList.getText();
+      
+      %selectedEntity.gameObjectAsset = %moduleName @ ":" @ %className;
+      
+      %path = "data/" @ %moduleName @ "/gameObjects/";
+      
+      %file = new FileObject();
+      
+      if(%file.openForWrite(%path @ "\\" @ %className @ ".cs"))
+      {
+         %file.writeline("function " @ %className @ "::onAdd(%this)\n{\n\n}\n");
+         %file.writeline("function " @ %className @ "::onRemove(%this)\n{\n\n}\n");
+         
+         //todo, pre-write any event functions of interest
+         
+         %file.close();
+      }
+      
+      //set up the paths
+      %tamlPath = %path  @ %className @ ".taml";
+      %scriptPath = %path  @ %className @ ".cs";
+      saveGameObject(%className, %tamlPath, %scriptPath);
+      
+      %asset = new GameObjectAsset()
+      {
+         AssetName = %className;
+         VersionId = 1;
+         gameObjectName=%className;
+         TAMLFilePath = %tamlPath;
+         scriptFilePath = %scriptPath;
+      };
+      %assetPath = %path  @ %className @ ".asset.taml";
+      
+      //now, add the script file and a ref to the taml into our SGO manifest so we can readily spawn it later.
+      TamlWrite(%selectedEntity, %tamlpath);
+      TamlWrite(%asset, %assetPath);
+
+      GameObjectCreator.selectedEntity = "";
+      
+      Canvas.popDialog(GameObjectCreator);
+      
+      //Load it
+      %moduleDef = ModuleDatabase.findModule(%moduleName,1);
+      AssetDatabase.addDeclaredAsset(%moduleDef, %assetPath);
+	}
+	else
+	{
+	   %moduleDef = AssetDatabase.getAssetModule(%assetId);
+	   %moduleName = %moduleDef.ModuleId;
+	   %path = "data/" @ %moduleName @ "/gameObjects/";
+	   
+	   %selectedEntity.gameObjectAsset = %moduleName @ ":" @ %className;
+	   
+	   %tamlPath = %path  @ %className @ ".taml";
+	   TamlWrite(%selectedEntity, %tamlpath);
+	   
+	   GameObjectCreator.selectedEntity = "";
+      
+      Canvas.popDialog(GameObjectCreator);
+	}
+}

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

@@ -0,0 +1,663 @@
+//-----------------------------------------------------------------------------
+// Copyright (c) 2012 GarageGames, LLC
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+// sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//-----------------------------------------------------------------------------
+function CreateAssetButton::onClick(%this)
+{
+   AddNewAssetPopup.showPopup(Canvas);
+}
+
+function AssetBrowser_newAsset::onWake(%this)
+{
+   NewAssetModuleList.refresh();
+   //NewComponentParentClass.setText("Component");
+}
+
+function AssetBrowser_newAssetWindow::onClose(%this)
+{
+   NewAssetPropertiesInspector.clearFields(); 
+   Canvas.popDialog(AssetBrowser_newAsset);
+}
+
+function NewAssetTypeList::onWake(%this)
+{
+   %this.refresh();
+}
+
+function NewAssetTypeList::refresh(%this)
+{
+   %this.clear();
+   
+   //TODO: make this more automated
+   //%this.add("GameObject", 0);
+   %this.add("Component", 0);
+   %this.add("Image", 1);
+   %this.add("Material", 2);
+   %this.add("Shape", 3);  
+   %this.add("Sound", 4);
+   %this.add("State Machine", 5);
+}
+
+function NewAssetTypeList::onSelected(%this)
+{
+   %assetType = %this.getText();
+   
+   if(%assetType $= "Component")
+   {
+      NewComponentAssetSettings.hidden = false;
+   }
+}
+
+function NewAssetModuleBtn::onClick(%this)
+{
+   Canvas.pushDialog(AssetBrowser_AddModule);
+   AssetBrowser_addModuleWindow.selectWindow();
+}
+
+function AssetBrowser::setupCreateNewAsset(%this, %assetType, %moduleName)
+{
+   Canvas.pushDialog(AssetBrowser_newAsset);
+   
+   AssetBrowser_newAssetWindow.text = "New" SPC %assetType SPC "Asset";
+   
+   NewAssetPropertiesInspector.clear();
+   
+   NewAssetModuleList.setText(%moduleName);
+   
+   //get rid of the old one if we had one.
+   if(isObject(%this.newAssetSettings))
+      %this.newAssetSettings.delete();
+   
+   %this.newAssetSettings = new ScriptObject();
+   
+   %this.newAssetSettings.assetType = %assetType;
+   %this.newAssetSettings.moduleName = %moduleName;
+   
+   %shortAssetTypeName = strreplace(%assetType, "Asset", "");
+   
+   NewAssetPropertiesInspector.startGroup("General");
+   NewAssetPropertiesInspector.addField("assetName", "New Asset Name", "String",  "Name of the new asset", "New" @ %shortAssetTypeName, "", %this.newAssetSettings);
+   //NewAssetPropertiesInspector.addField("AssetType", "New Asset Type", "List",  "Type of the new asset", %assetType, "Component,Image,Material,Shape,Sound,State Machine", %newAssetSettings);
+   
+   NewAssetPropertiesInspector.addField("friendlyName", "Friendly Name", "String",  "Human-readable name of new asset", "", "", %this.newAssetSettings);
+      
+   NewAssetPropertiesInspector.addField("description", "Description", "Command",  "Description of the new asset", "", "", %this.newAssetSettings);   
+   NewAssetPropertiesInspector.endGroup();
+   
+   if(%assetType $= "ComponentAsset")
+   {
+      NewAssetPropertiesInspector.startGroup("Components");
+      NewAssetPropertiesInspector.addField("parentClass", "New Asset Parent Class", "String",  "Name of the new asset's parent class", "Component", "", %this.newAssetSettings);
+      NewAssetPropertiesInspector.addField("componentGroup", "Component Group", "String",  "Name of the group of components this component asset belongs to", "", "", %this.newAssetSettings);
+      //NewAssetPropertiesInspector.addField("componentName", "Component Name", "String",  "Name of the new component", "", "", %this.newAssetSettings);
+      NewAssetPropertiesInspector.endGroup();
+   }
+   else if(%assetType $= "LevelAsset")
+   {
+      NewAssetPropertiesInspector.startGroup("Level");
+      NewAssetPropertiesInspector.addField("levelPreviewImage", "LevePreviewImage", "Image",  "Preview Image for the level", "", "", %this.newAssetSettings);
+      NewAssetPropertiesInspector.endGroup();
+   }
+   else if(%assetType $= "ScriptAsset")
+   {
+      NewAssetPropertiesInspector.startGroup("Script");
+      NewAssetPropertiesInspector.addField("isServerScript", "Is Server Script", "bool",  "Is this script used on the server?", "1", "", %this.newAssetSettings);
+      NewAssetPropertiesInspector.endGroup();
+   }
+   /*else if(%assetType $= "ShapeAnimationAsset")
+   {
+      NewAssetPropertiesInspector.startGroup("Animation");
+      NewAssetPropertiesInspector.addField("sourceFile", "Source File", "filename",  "Source file this animation will pull from", "", "", %this.newAssetSettings);
+      NewAssetPropertiesInspector.addField("animationName", "Animation Name", "string",  "Name of the animation clip when used in a shape", "", "", %this.newAssetSettings);
+      
+      NewAssetPropertiesInspector.addField("startFrame", "Starting Frame", "int",  "Source file this animation will pull from", "", "", %this.newAssetSettings);
+      NewAssetPropertiesInspector.addField("endFrame", "Ending Frame", "int",  "Source file this animation will pull from", "", "", %this.newAssetSettings);
+      
+      NewAssetPropertiesInspector.addField("padRotation", "Pad Rotations", "bool",  "Source file this animation will pull from", "0", "", %this.newAssetSettings);
+      NewAssetPropertiesInspector.addField("padTransforms", "Pad Transforms", "bool",  "Source file this animation will pull from", "0", "", %this.newAssetSettings);
+      NewAssetPropertiesInspector.endGroup();
+   }*/
+   
+   return;
+   
+   if(%moduleName $= "")
+   {
+      Canvas.pushDialog(AssetBrowser_selectModule);
+   }
+   else
+   {
+      AssetBrowser.SelectedModule = %moduleName;
+      
+      if(%assetType $= "MaterialAsset")
+      {
+         createNewMaterialAsset("NewMaterial", %moduleName);
+      }
+      else if(%assetType $= "StateMachineAsset")
+      {
+         createNewStateMachineAsset("NewStateMachine", %moduleName);
+      }
+      else if(%assetType $= "ScriptAsset")
+      {
+         createNewScriptAsset("NewScriptAsset", %moduleName);
+      }
+   }
+}
+
+//We do a quick validation that mandatory fields are filled in before passing along to the asset-type specific function
+function CreateNewAsset()
+{
+   %assetName = AssetBrowser.newAssetSettings.assetName;
+   
+   if(%assetName $= "")
+	{
+	   MessageBoxOK( "Error", "Attempted to make a new asset with no name!");
+		return;
+	}
+	
+	//get the selected module data
+   %moduleName = NewAssetModuleList.getText();
+   
+   if(%moduleName $= "")
+	{
+	   MessageBoxOK( "Error", "Attempted to make a new asset with no module!");
+		return;
+	}
+	
+	AssetBrowser.newAssetSettings.moduleName = %moduleName;
+	
+   %assetType = AssetBrowser.newAssetSettings.assetType;
+	if(%assetType $= "")
+	{
+	   MessageBoxOK( "Error", "Attempted to make a new asset with no type!");
+		return;
+	}
+	
+	if(%assetType $= "ComponentAsset")
+	{
+	   //Canvas.popDialog(AssetBrowser_newComponentAsset); 
+	   //AssetBrowser_newComponentAsset-->AssetBrowserModuleList.setText(AssetBrowser.selectedModule);
+	   %assetFilePath = createNewComponentAsset(%assetName, %path);
+	}
+	else if(%assetType $= "MaterialAsset")
+	{
+	   %assetFilePath = createNewMaterialAsset();
+	}
+	else if(%assetType $= "StateMachineAsset")
+	{
+	   %assetFilePath = createNewStateMachineAsset();
+	}
+	else if(%assetType $= "GUIAsset")
+	{
+	   %assetFilePath = createNewGUIAsset();
+	}
+	else if(%assetType $= "LevelAsset")
+	{
+	   %assetFilePath = createNewLevelAsset();
+	}
+	else if(%assetType $= "ScriptAsset")
+	{
+	   %assetFilePath = createNewScriptAsset();
+	}
+	else if(%assetType $= "ShapeAnimationAsset")
+	{
+	   %assetFilePath = createShapeAnimationAsset();
+	}
+	
+	Canvas.popDialog(AssetBrowser_newAsset);
+	
+	//Load it
+	%moduleDef = ModuleDatabase.findModule(%moduleName,1);
+	AssetDatabase.addDeclaredAsset(%moduleDef, %assetFilePath);
+	
+	AssetBrowser.loadFilters();
+}
+
+function createNewComponentAsset()
+{
+   %moduleName = AssetBrowser.newAssetSettings.moduleName;
+   %modulePath = "data/" @ %moduleName;
+      
+   %assetName = AssetBrowser.newAssetSettings.assetName;
+   
+   %tamlpath = %modulePath @ "/components/" @ %assetName @ ".asset.taml";
+   %scriptPath = %modulePath @ "/components/" @ %assetName @ ".cs";
+   
+   %asset = new ComponentAsset()
+   {
+      AssetName = %assetName;
+      versionId = 1;
+      componentName = %assetName;
+      componentClass = AssetBrowser.newAssetSettings.parentClass;
+      friendlyName = AssetBrowser.newAssetSettings.friendlyName;
+      componentType = AssetBrowser.newAssetSettings.componentGroup;
+      description = AssetBrowser.newAssetSettings.description;
+      scriptFile = %scriptPath;
+   };
+   
+   TamlWrite(%asset, %tamlpath);
+   
+   %file = new FileObject();
+	
+	if(%file.openForWrite(%scriptPath))
+	{
+		//TODO: enable ability to auto-embed a header for copyright or whatnot
+	   %file.writeline("//onAdd is called when the component is created and then added to it's owner entity.\n");
+	   %file.writeline("//You would also add any script-defined component fields via addComponentField().\n");
+		%file.writeline("function " @ %assetName @ "::onAdd(%this)\n{\n\n}\n");
+		%file.writeline("//onAdd is called when the component is removed and deleted from it's owner entity.");
+		%file.writeline("function " @ %assetName @ "::onRemove(%this)\n{\n\n}\n");
+		%file.writeline("//onClientConnect is called any time a new client connects to the server.");
+		%file.writeline("function " @ %assetName @ "::onClientConnect(%this, %client)\n{\n\n}\n");
+		%file.writeline("//onClientDisconnect is called any time a client disconnects from the server.");
+		%file.writeline("function " @ %assetName @ "::onClientDisonnect(%this, %client)\n{\n\n}\n");
+		%file.writeline("//update is called when the component does an update tick.\n");
+		%file.writeline("function " @ %assetName @ "::Update(%this)\n{\n\n}\n");
+		
+		%file.close();
+	}
+	
+	Canvas.popDialog(AssetBrowser_newComponentAsset);
+	
+	%moduleDef = ModuleDatabase.findModule(%moduleName, 1);
+	AssetDatabase.addDeclaredAsset(%moduleDef, %tamlpath);
+
+	AssetBrowser.loadFilters();
+	
+	%treeItemId = AssetBrowserFilterTree.findItemByName(%moduleName);
+	%smItem = AssetBrowserFilterTree.findChildItemByName(%treeItemId, "Components");
+	
+	AssetBrowserFilterTree.onSelect(%smItem);
+	
+	return %tamlpath;
+}
+
+function createNewMaterialAsset()
+{
+   %assetName = AssetBrowser.newAssetSettings.assetName;
+   
+   %moduleName = AssetBrowser.newAssetSettings.moduleName;
+   %modulePath = "data/" @ %moduleName;
+   
+   %tamlpath = %modulePath @ "/materials/" @ %assetName @ ".asset.taml";
+   %sgfPath = %modulePath @ "/materials/" @ %assetName @ ".sgf";
+   
+   %asset = new MaterialAsset()
+   {
+      AssetName = %assetName;
+      versionId = 1;
+      shaderData = "";
+      shaderGraph = %sgfPath;
+   };
+   
+   TamlWrite(%asset, %tamlpath);
+   
+   %moduleDef = ModuleDatabase.findModule(%moduleName, 1);
+	AssetDatabase.addDeclaredAsset(%moduleDef, %tamlpath);
+
+	AssetBrowser.loadFilters();
+	
+	%treeItemId = AssetBrowserFilterTree.findItemByName(%moduleName);
+	%smItem = AssetBrowserFilterTree.findChildItemByName(%treeItemId, "Materials");
+	
+	AssetBrowserFilterTree.onSelect(%smItem);
+   
+	return %tamlpath;
+}
+
+function createNewScriptAsset()
+{
+   %moduleName = AssetBrowser.newAssetSettings.moduleName;
+   %modulePath = "data/" @ %moduleName;
+      
+   %assetName = AssetBrowser.newAssetSettings.assetName;      
+   
+   %tamlpath = %modulePath @ "/scripts/" @ %assetName @ ".asset.taml";
+   %scriptPath = %modulePath @ "/scripts/" @ %assetName @ ".cs";
+   
+   %asset = new ScriptAsset()
+   {
+      AssetName = %assetName;
+      versionId = 1;
+      scriptFilePath = %scriptPath;
+   };
+   
+   TamlWrite(%asset, %tamlpath);
+   
+   %moduleDef = ModuleDatabase.findModule(%moduleName, 1);
+	AssetDatabase.addDeclaredAsset(%moduleDef, %tamlpath);
+
+	AssetBrowser.loadFilters();
+	
+	%treeItemId = AssetBrowserFilterTree.findItemByName(%moduleName);
+	%smItem = AssetBrowserFilterTree.findChildItemByName(%treeItemId, "Scripts");
+	
+	AssetBrowserFilterTree.onSelect(%smItem);
+	
+	%file = new FileObject();
+   
+   if(%file.openForWrite(%scriptPath))
+	{
+		%file.close();
+	}
+   
+	return %tamlpath;
+}
+
+function createNewStateMachineAsset()
+{
+   %assetName = AssetBrowser.newAssetSettings.assetName;
+      
+   %assetQuery = new AssetQuery();
+   
+   %matchingAssetCount = AssetDatabase.findAssetName(%assetQuery, %assetName);
+   
+   %i=1;
+   while(%matchingAssetCount > 0)
+   {
+      %newAssetName = %assetName @ %i;
+      %i++;
+      
+      %matchingAssetCount = AssetDatabase.findAssetName(%assetQuery, %newAssetName);
+   }
+   
+   %assetName = %newAssetName;
+   
+   %assetQuery.delete();
+   
+   %tamlpath = "data/" @ %moduleName @ "/stateMachines/" @ %assetName @ ".asset.taml";
+   %smFilePath = "data/" @ %moduleName @ "/stateMachines/" @ %assetName @ ".xml";
+   
+   %asset = new StateMachineAsset()
+   {
+      AssetName = %assetName;
+      versionId = 1;
+      stateMachineFile = %smFilePath;
+   };
+   
+   %xmlDoc = new SimXMLDocument();
+   %xmlDoc.saveFile(%smFilePath);
+   %xmlDoc.delete();
+   
+   TamlWrite(%asset, %tamlpath);
+   
+   //Now write our XML file
+   %xmlFile = new FileObject();
+	%xmlFile.openForWrite(%smFilePath);
+	%xmlFile.writeLine("<StateMachine>");
+	%xmlFile.writeLine("</StateMachine>");
+	%xmlFile.close();
+   
+   %moduleDef = ModuleDatabase.findModule(%moduleName, 1);
+	AssetDatabase.addDeclaredAsset(%moduleDef, %tamlpath);
+
+	AssetBrowser.loadFilters();
+	
+	%treeItemId = AssetBrowserFilterTree.findItemByName(%moduleName);
+	%smItem = AssetBrowserFilterTree.findChildItemByName(%treeItemId, "StateMachines");
+	
+	AssetBrowserFilterTree.onSelect(%smItem);
+   
+	return %tamlpath;
+}
+
+function createNewGUIAsset()
+{
+   %moduleName = AssetBrowser.newAssetSettings.moduleName;
+   %modulePath = "data/" @ %moduleName;
+      
+   %assetName = AssetBrowser.newAssetSettings.assetName;
+   
+   %tamlpath = %modulePath @ "/GUIs/" @ %assetName @ ".asset.taml";
+   %guipath = %modulePath @ "/GUIs/" @ %assetName @ ".gui";
+   %scriptPath = %modulePath @ "/GUIs/" @ %assetName @ ".cs";
+   
+   %asset = new GUIAsset()
+   {
+      AssetName = %assetName;
+      versionId = 1;
+      scriptFilePath = %scriptPath;
+      guiFilePath = %guipath;
+   };
+   
+   TamlWrite(%asset, %tamlpath);
+   
+   %file = new FileObject();
+   
+   if(%file.openForWrite(%guipath))
+	{
+	   %file.writeline("//--- OBJECT WRITE BEGIN ---");
+		%file.writeline("%guiContent = new GuiControl(" @ %assetName @ ") {");
+		%file.writeline("   position = \"0 0\";");
+		%file.writeline("   extent = \"100 100\";");
+		%file.writeline("};");
+		%file.writeline("//--- OBJECT WRITE END ---");
+		
+		%file.close();
+	}
+	
+	if(%file.openForWrite(%scriptPath))
+	{
+		%file.writeline("function " @ %assetName @ "::onWake(%this)\n{\n\n}\n");
+		%file.writeline("function " @ %assetName @ "::onSleep(%this)\n{\n\n}\n");
+		
+		%file.close();
+	}
+	
+	//load the gui
+	exec(%guipath);
+	exec(%scriptPath);
+	
+	%moduleDef = ModuleDatabase.findModule(%moduleName, 1);
+	AssetDatabase.addDeclaredAsset(%moduleDef, %tamlpath);
+
+	AssetBrowser.loadFilters();
+	
+	%treeItemId = AssetBrowserFilterTree.findItemByName(%moduleName);
+	%smItem = AssetBrowserFilterTree.findChildItemByName(%treeItemId, "GUIs");
+	
+	AssetBrowserFilterTree.onSelect(%smItem);
+	
+	return %tamlpath;
+}
+
+function createNewLevelAsset()
+{
+   %moduleName = AssetBrowser.newAssetSettings.moduleName;
+   %modulePath = "data/" @ %moduleName;
+   
+   %assetName = AssetBrowser.newAssetSettings.assetName;
+   
+   %tamlpath = %modulePath @ "/levels/" @ %assetName @ ".asset.taml";
+   %levelPath = %modulePath @ "/levels/" @ %assetName @ ".mis";
+   
+   %asset = new LevelAsset()
+   {
+      AssetName = %assetName;
+      versionId = 1;
+      LevelFile = %levelPath;
+      LevelDescription = AssetBrowser.newAssetSettings.levelDescription;
+      PreviewImage = AssetBrowser.newAssetSettings.levelPreviewImage;
+   };
+   
+   TamlWrite(%asset, %tamlpath);
+   
+   if(!pathCopy("tools/levels/BlankRoom.mis", %levelPath, false))
+   {
+      echo("Unable to copy template level file!");
+   }
+
+	%moduleDef = ModuleDatabase.findModule(%moduleName, 1);
+	AssetDatabase.addDeclaredAsset(%moduleDef, %tamlpath);
+
+	AssetBrowser.loadFilters();
+	
+	%treeItemId = AssetBrowserFilterTree.findItemByName(%moduleName);
+	%smItem = AssetBrowserFilterTree.findChildItemByName(%treeItemId, "Levels");
+	
+	AssetBrowserFilterTree.onSelect(%smItem);
+	
+	return %tamlpath;
+}
+
+function createNewShapeAnimationAsset()
+{
+   %dlg = new OpenFileDialog()
+   {
+      Filters        = "Animation Files(*.dae, *.cached.dts)|*.dae;*.cached.dts";
+      DefaultPath    = $Pref::WorldEditor::LastPath;
+      DefaultFile    = "";
+      ChangePath     = false;
+      OverwritePrompt = true;
+      forceRelativePath = false;
+      //MultipleFiles = true;
+   };
+
+   %ret = %dlg.Execute();
+   
+   if ( %ret )
+   {
+      $Pref::WorldEditor::LastPath = filePath( %dlg.FileName );
+      %fullPath = %dlg.FileName;
+   }   
+   
+   %dlg.delete();
+   
+   if ( !%ret )
+      return;
+      
+   /*%moduleName = AssetBrowser.newAssetSettings.moduleName;
+   %modulePath = "data/" @ %moduleName;
+   
+   %assetName = AssetBrowser.newAssetSettings.assetName;
+   
+   %tamlpath = %modulePath @ "/levels/" @ %assetName @ ".asset.taml";
+   %levelPath = %modulePath @ "/levels/" @ %assetName @ ".mis";
+   
+   %asset = new ShapeAnimationAsset()
+   {
+      AssetName = %assetName;
+      versionId = 1;
+      LevelFile = %levelPath;
+      LevelDescription = AssetBrowser.newAssetSettings.levelDescription;
+      PreviewImage = AssetBrowser.newAssetSettings.levelPreviewImage;
+   };
+   
+   TamlWrite(%asset, %tamlpath);
+   
+   if(!pathCopy("tools/levels/BlankRoom.mis", %levelPath, false))
+   {
+      echo("Unable to copy template level file!");
+   }
+
+	%moduleDef = ModuleDatabase.findModule(%moduleName, 1);
+	AssetDatabase.addDeclaredAsset(%moduleDef, %tamlpath);
+
+	AssetBrowser.loadFilters();
+	
+	%treeItemId = AssetBrowserFilterTree.findItemByName(%moduleName);
+	%smItem = AssetBrowserFilterTree.findChildItemByName(%treeItemId, "Levels");
+	
+	AssetBrowserFilterTree.onSelect(%smItem);
+	
+	return %tamlpath;*/
+}
+
+function ParentComponentList::onWake(%this)
+{
+   %this.refresh();
+}
+
+function ParentComponentList::refresh(%this)
+{
+   %this.clear();
+   
+   %assetQuery = new AssetQuery();
+   if(!AssetDatabase.findAssetType(%assetQuery, "ComponentAsset"))
+      return; //if we didn't find ANY, just exit
+   
+   // Find all the types.
+   %count = %assetQuery.getCount();
+
+   /*%categories = "";
+   for (%i = 0; %i < %count; %i++)
+   {
+      %assetId = %assetQuery.getAsset(%i);
+      
+      %componentAsset = AssetDatabase.acquireAsset(%assetId);
+      %componentName = %componentAsset.componentName;
+      
+      if(%componentName $= "")
+         %componentName = %componentAsset.componentClass;
+      
+      %this.add(%componentName, %i);
+   }*/
+   
+   %categories = "";
+   for (%i = 0; %i < %count; %i++)
+   {
+      %assetId = %assetQuery.getAsset(%i);
+      
+      %componentAsset = AssetDatabase.acquireAsset(%assetId);
+      %componentClass = %componentAsset.componentClass;
+      if (!isInList(%componentClass, %categories))
+         %categories = %categories TAB %componentClass;
+   }
+   
+   %categories = trim(%categories);
+   
+   %index = 0;
+   %categoryCount = getFieldCount(%categories);
+   for (%i = 0; %i < %categoryCount; %i++)
+   {
+      %category = getField(%categories, %i);
+      %this.addCategory(%category);
+      
+      for (%j = 0; %j < %count; %j++)
+      {
+         %assetId = %assetQuery.getAsset(%j);
+      
+         %componentAsset = AssetDatabase.acquireAsset(%assetId);
+         %componentName = %componentAsset.componentName;
+         %componentClass = %componentAsset.componentClass;
+      
+         if (%componentClass $= %category)
+         {
+            if(%componentName !$= "")
+               %this.add("   "@%componentName, %i);
+         }
+      }
+   }
+}
+
+//----------------------------------------------------------
+// Game Object creation
+//----------------------------------------------------------
+function EWorldEditor::createGameObject( %this )
+{
+   GameObjectCreatorObjectName.text = "";
+   
+   %activeSelection = %this.getActiveSelection();
+   if( %activeSelection.getCount() == 0 )
+      return;
+      
+   GameObjectCreator.selectedEntity = %activeSelection.getObject( 0 );
+
+   Canvas.pushDialog(GameObjectCreator);
+}

+ 154 - 0
Templates/BaseGame/game/tools/assetBrowser/scripts/popupMenus.cs

@@ -0,0 +1,154 @@
+function AssetBrowser::buildPopupMenus(%this)
+{
+   if( !isObject( AddNewModulePopup ) )
+   {
+      new PopupMenu( AddNewModulePopup )
+      {
+         superClass = "MenuBuilder";
+         class = "EditorWorldMenu";
+         isPopup = true;
+         
+         item[ 0 ] = "Create New Module" TAB "" TAB "AssetBrowser.CreateNewModule();";
+         item[ 1 ] = "Refresh Module Dependencies" TAB "" TAB "AssetBrowser.RefreshModuleDependencies();";
+      };
+   }
+      
+   if( !isObject( EditAssetPopup ) )
+   {
+      new PopupMenu( EditAssetPopup )
+      {
+         superClass = "MenuBuilder";
+         class = "EditorWorldMenu";
+         //isPopup = true;
+
+         item[ 0 ] = "Edit Asset" TAB "" TAB "AssetBrowser.editAsset();";
+         item[ 1 ] = "Rename Asset" TAB "" TAB "AssetBrowser.renameAsset();";
+         item[ 2 ] = "Refresh Asset" TAB "" TAB "AssetBrowser.refreshAsset();";
+         item[ 3 ] = "Asset Properties" TAB "" TAB "AssetBrowser.editAssetInfo();";
+         item[ 4 ] = "-";
+         Item[ 5 ] = "Duplicate Asset" TAB "" TAB "AssetBrowser.duplicateAsset();";
+         item[ 6 ] = "-";
+         item[ 7 ] = "Re-Import Asset" TAB "" TAB "AssetBrowser.reImportAsset();";
+         item[ 8 ] = "-";
+         item[ 9 ] = "Delete Asset" TAB "" TAB "AssetBrowser.deleteAsset();";
+
+         jumpFileName = "";
+         jumpLineNumber = "";
+      };
+   }
+   
+   if( !isObject( AddNewComponentAssetPopup ) )
+   {
+      new PopupMenu( AddNewComponentAssetPopup )
+      {
+         superClass = "MenuBuilder";
+         class = "EditorWorldMenu";
+         //isPopup = true;
+
+         //item[ 0 ] = "Create Component" TAB "" TAB "Canvas.pushDialog(AssetBrowser_newComponentAsset); AssetBrowser_newComponentAsset-->NewComponentPackageList.setText(AssetBrowser.selectedModule);";
+         item[ 0 ] = "Component" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"ComponentAsset\", AssetBrowser.selectedModule);";
+         
+         //list other common component types here to shortcut the creation process
+      };
+   }
+   
+   if( !isObject( AddNewScriptAssetPopup ) )
+   {
+      %this.AddNewScriptAssetPopup = new PopupMenu( AddNewScriptAssetPopup )
+      {
+         superClass = "MenuBuilder";
+         class = "EditorWorldMenu";
+         //isPopup = true;
+
+         item[ 0 ] = "Create Component" TAB AddNewComponentAssetPopup;
+         item[ 1 ] = "Create Script" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"ScriptAsset\", AssetBrowser.selectedModule);";
+         item[ 2 ] = "Create State Machine" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"StateMachineAsset\", AssetBrowser.selectedModule);";
+         //item[ 3 ] = "-";
+         //item[ 3 ] = "Create Game Object" TAB "" TAB "AssetBrowser.createNewGameObjectAsset(\"NewGameObject\", AssetBrowser.selectedModule);";
+      };
+      //%this.AddNewScriptAssetPopup.insertSubMenu(0, "Create Component", AddNewComponentAssetPopup);
+   }
+   
+   if( !isObject( AddNewArtAssetPopup ) )
+   {
+      %this.AddNewArtAssetPopup = new PopupMenu( AddNewArtAssetPopup )
+      {
+         superClass = "MenuBuilder";
+         class = "EditorWorldMenu";
+         //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);";
+      };
+   }
+      
+   if( !isObject( AddNewAssetPopup ) )
+   {
+      %this.AddNewAssetPopup = new PopupMenu( AddNewAssetPopup )
+      {
+         superClass = "MenuBuilder";
+         class = "EditorWorldMenu";
+         
+         item[0] = "Create Code Asset" TAB AddNewScriptAssetPopup;
+         item[1] = "-";
+         item[2] = "Create Art Asset" TAB AddNewArtAssetPopup;
+         item[3] = "-";
+         item[4] = "Create Level" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"LevelAsset\", AssetBrowser.selectedModule);";//"AssetBrowser.createNewLevelAsset(\"NewLevel\", AssetBrowser.selectedModule);";
+      };
+   }
+   
+   if( !isObject( EditModulePopup ) )
+   {
+      new PopupMenu( EditModulePopup )
+      {
+         superClass = "MenuBuilder";
+         class = "EditorWorldMenu";
+         //isPopup = true;
+         
+         item[ 0 ] = "Create New Asset" TAB AddNewAssetPopup;
+         item[ 1 ] = "Reload Module" TAB "" TAB "AssetBrowser.reloadModule();";
+         Item[ 2 ] = "-";
+         Item[ 3 ] = "Edit Module" TAB "" TAB "AssetBrowser.editModuleInfo();";
+         Item[ 4 ] = "-";
+         Item[ 5 ] = "Duplicate Module" TAB "" TAB "AssetBrowser.copyModule();";
+         Item[ 6 ] = "-";
+         Item[ 7 ] = "Delete Module" TAB "" TAB "AssetBrowser.deleteModule();";
+      };
+   }
+   
+   //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(8, false); //post effect
+   AddNewArtAssetPopup.enableItem(10, false); //sound asset
+   AddNewArtAssetPopup.enableItem(12, false); //particle effect
+   
+   AddNewScriptAssetPopup.enableItem(2, false); //state machine
+}
+
+function AddNewScriptAssetPopupMenu::onSelectItem(%this, %id, %text)
+{   
+   return true;
+}
+function AddNewScriptAssetPopupMenu::setupDefaultState(%this)
+{
+   // Setup camera speed gui's. Both menu and editorgui
+   %this.setupGuiControls();
+   
+   Parent::setupDefaultState(%this);
+}
+
+function AddNewScriptAssetPopupMenu::setupGuiControls(%this)
+{
+}

+ 17 - 0
Templates/BaseGame/game/tools/assetBrowser/scripts/selectModule.cs

@@ -0,0 +1,17 @@
+function AssetBrowser_selectModule::onWake(%this)
+{
+   AssetBrowser_SelectModuleWindow-->ModuleList.refresh();
+}
+
+function SelectModule_NewAssetModuleBtn::onClick(%this)
+{
+   Canvas.pushDialog(AssetBrowser_AddModule);
+   AssetBrowser_addModuleWindow.selectWindow();
+   
+   AssetBrowser_AddModule.callback = "AssetBrowser_selectModule.newModuleAdded();";
+}
+
+function AssetBrowser_selectModule::newModuleAdded(%this)
+{
+   AssetBrowser_SelectModuleWindow-->ModuleList.refresh();     
+}

+ 17 - 0
Templates/BaseGame/game/tools/assetBrowser/scripts/selectPackage.cs

@@ -0,0 +1,17 @@
+function AssetBrowser_selectPackage::onWake(%this)
+{
+   AssetBrowser_SelectPackageWindow-->packageList.refresh();
+}
+
+function SelectPackage_NewAssetPackageBtn::onClick(%this)
+{
+   Canvas.pushDialog(AssetBrowser_AddPackage);
+   AssetBrowser_addPackageWindow.selectWindow();
+   
+   AssetBrowser_AddPackage.callback = "AssetBrowser_selectPackage.newPackageAdded();";
+}
+
+function AssetBrowser_selectPackage::newPackageAdded(%this)
+{
+   AssetBrowser_SelectPackageWindow-->packageList.refresh();     
+}