2018-01-28 15:30:17 -06:00
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 )
{
}
function AssetBrowser : : onWake ( % this )
{
2019-05-04 11:49:42 -05:00
// manage preview array
if ( ! isObject ( AssetPreviewArray ) )
new ArrayObject ( AssetPreviewArray ) ;
if ( ! isObject ( ImportAssetTree ) )
new GuiTreeViewCtrl ( ImportAssetTree ) ;
% this . importingFilesArray = new ArrayObject ( ) ;
2018-01-28 15:30:17 -06:00
% this . importAssetUnprocessedListArray = new ArrayObject ( ) ;
% this . importAssetFinalListArray = new ArrayObject ( ) ;
2019-05-04 11:49:42 -05:00
% this . isReImportingAsset = false ;
% this . coreModulesFilter = false ;
% this . onlyShowModulesWithAssets = false ;
% this . treeFilterMode = "list" ;
2019-07-15 00:34:18 -05:00
% this . templateFilesPath = "tools/assetBrowser/scripts/templateFiles/" ;
2019-05-04 11:49:42 -05:00
//First, build our our list of active modules
% modulesList = ModuleDatabase . findModules ( true ) ;
% nonDefaultModuleCount = 0 ;
for ( % i = 0 ; % i < getWordCount ( % modulesList ) ; % i + + )
{
% moduleName = getWord ( % modulesList , % i ) . ModuleId ;
% moduleGroup = getWord ( % modulesList , % i ) . Group ;
if ( ( % moduleGroup $ = "Core" | | % moduleGroup $ = "Tools" ) & & ! % this . coreModulesFilter )
continue ;
% nonDefaultModuleCount + + ;
}
if ( % nonDefaultModuleCount = = 0 )
{
MessageBoxYesNo ( "Import Template Content?" ,
"You have no modules or content. Do you want to import a module from the template content?" ,
"AssetBrowser.ImportTemplateModules();" , "" ) ;
}
}
//Filters
function AssetBrowser : : showFilterPopup ( % this )
{
BrowserVisibilityPopup . showPopup ( Canvas ) ;
}
function AssetBrowser : : viewCoreModulesFilter ( % this )
{
% this . coreModulesFilter = ! % this . coreModulesFilter ;
BrowserVisibilityPopup . checkItem ( 0 , % this . coreModulesFilter ) ;
AssetBrowser . loadFilters ( ) ;
}
function AssetBrowser : : viewPopulatedModulesFilter ( % this )
{
% this . onlyShowModulesWithAssets = ! % this . onlyShowModulesWithAssets ;
BrowserVisibilityPopup . checkItem ( 1 , % this . onlyShowModulesWithAssets ) ;
AssetBrowser . loadFilters ( ) ;
}
function AssetBrowser : : viewListFilter ( % this )
{
% this . treeFilterMode = "list" ;
AssetBrowser . loadFilters ( ) ;
}
function AssetBrowser : : viewTagsFilter ( % this )
{
% this . treeFilterMode = "tags" ;
AssetBrowser . loadFilters ( ) ;
2018-01-28 15:30:17 -06:00
}
//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 ;
2019-06-13 00:37:12 -05:00
Canvas . pushDialog ( AssetBrowser ) ;
2018-01-28 15:30:17 -06:00
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 )
{
2019-05-04 11:49:42 -05:00
if ( ! isObject ( % this . previewData ) )
{
% this . previewData = new ScriptObject ( ) ;
}
2018-01-28 15:30:17 -06:00
% 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 ;
2019-05-04 11:49:42 -05:00
% doubleClickCommand = "AssetBrowser.editAsset( " @ % assetDesc @" );" ;
2018-01-28 15:30:17 -06:00
if ( % assetType $ = "ShapeAsset" )
{
2019-05-04 11:49:42 -05:00
% this . previewData . assetName = % assetDesc . assetName ;
% this . previewData . assetPath = % assetDesc . scriptFile ;
% this . previewData . doubleClickCommand = % doubleClickCommand ;
% this . previewData . previewImage = "tools/assetBrowser/art/componentIcon" ;
% this . previewData . assetFriendlyName = % assetDesc . friendlyName ;
% this . previewData . assetDesc = % assetDesc . description ;
% this . previewData . tooltip = % assetDesc . friendlyName @ "\n" @ % assetDesc ;
2018-01-28 15:30:17 -06:00
% 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
{
2019-05-04 11:49:42 -05:00
//Build out the preview
% buildCommand = % this @ ".build" @ % assetType @ "Preview(" @ % assetDesc @ "," @ % this . previewData @ ");" ;
eval ( % buildCommand ) ;
2018-01-28 15:30:17 -06:00
% previewButton = new GuiBitmapButtonCtrl ( )
{
className = "AssetPreviewControl" ;
2019-05-04 11:49:42 -05:00
internalName = % this . previewData . assetName ;
2018-01-28 15:30:17 -06:00
HorizSizing = "right" ;
VertSizing = "bottom" ;
profile = "ToolsGuiButtonProfile" ;
position = "10 4" ;
extent = % previewSize ;
buttonType = "PushButton" ;
2019-05-04 11:49:42 -05:00
bitmap = % this . previewData . previewImage ;
2018-01-28 15:30:17 -06:00
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" ;
2019-05-04 11:49:42 -05:00
internalName = % this . previewData . assetName @"Border" ;
2018-01-28 15:30:17 -06:00
HorizSizing = "right" ;
VertSizing = "bottom" ;
profile = "ToolsGuiThumbHighlightButtonProfile" ;
position = "0 0" ;
extent = % previewSize . x + % previewBounds SPC % previewSize . y + 24 ;
Variable = "" ;
buttonType = "radioButton" ;
2019-05-04 11:49:42 -05:00
tooltip = % this . previewData . tooltip ;
2018-01-28 15:30:17 -06:00
Command = "AssetBrowser.updateSelection( $ThisControl.getParent().assetName, $ThisControl.getParent().moduleName );" ;
2019-05-04 11:49:42 -05:00
altCommand = % this . previewData . doubleClickCommand ;
2018-01-28 15:30:17 -06:00
groupNum = "0" ;
useMouseEvents = true ;
text = "" ;
2019-05-04 11:49:42 -05:00
icon = % this . previewData . previewImage ;
2018-01-28 15:30:17 -06:00
} ;
% previewNameCtrl = new GuiTextEditCtrl ( ) {
position = 0 SPC % previewSize . y + % previewBounds - 16 ;
profile = ToolsGuiTextEditCenterProfile ;
extent = % previewSize . x + % previewBounds SPC 16 ;
2019-05-04 11:49:42 -05:00
text = % this . previewData . assetName ;
originalAssetName = % this . previewData . assetName ; //special internal field used in renaming assets
2018-01-28 15:30:17 -06:00
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
2019-05-04 11:49:42 -05:00
AssetPreviewArray . add ( % previewButton , % this . previewData . previewImage ) ;
2018-01-28 15:30:17 -06:00
}
function AssetBrowser : : loadFilters ( % this )
{
AssetBrowser - - > filterTree . clear ( ) ;
AssetBrowser - - > filterTree . buildIconTable ( ":tools/classIcons/prefab" ) ;
AssetBrowser - - > filterTree . insertItem ( 0 , "Assets" ) ;
2019-05-04 11:49:42 -05:00
AssetPreviewArray . empty ( ) ;
2018-01-28 15:30:17 -06:00
2019-05-04 11:49:42 -05:00
if ( % this . treeFilterMode $ = "list" )
2018-01-28 15:30:17 -06:00
{
2019-05-04 11:49:42 -05:00
//First, build our our list of active modules
% modulesList = ModuleDatabase . findModules ( true ) ;
2018-01-28 15:30:17 -06:00
2019-05-04 11:49:42 -05:00
for ( % i = 0 ; % i < getWordCount ( % modulesList ) ; % i + + )
{
% moduleName = getWord ( % modulesList , % i ) . ModuleId ;
% moduleGroup = getWord ( % modulesList , % i ) . Group ;
if ( ( % moduleGroup $ = "Core" | | % moduleGroup $ = "Tools" ) & & ! % this . coreModulesFilter )
continue ;
% moduleItemId = AssetBrowser - - > filterTree . findItemByName ( % moduleName ) ;
if ( % moduleItemId = = 0 )
% moduleItemId = AssetBrowser - - > filterTree . insertItem ( 1 , % moduleName , "" , "" , 1 , 1 ) ;
}
2018-01-28 15:30:17 -06:00
2019-05-04 11:49:42 -05:00
//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 ;
% moduleGroup = % module . Group ;
if ( ( % moduleGroup $ = "Core" | | % moduleGroup $ = "Tools" ) & & ! % this . coreModulesFilter )
continue ;
//first, see if this module Module is listed already
% moduleItemId = AssetBrowser - - > filterTree . findItemByName ( % moduleName ) ;
if ( % moduleItemId = = 0 )
% moduleItemId = AssetBrowser - - > filterTree . insertItem ( 1 , % moduleName , "" , "" , 1 , 1 ) ;
% assetType = AssetDatabase . getAssetCategory ( % assetId ) ;
if ( % assetType $ = "" )
{
% assetType = AssetDatabase . getAssetType ( % assetId ) ;
if ( % assetType $ = "" )
% assetType = "Misc" ;
}
if ( AssetBrowser . assetTypeFilter ! $ = "" & & AssetBrowser . assetTypeFilter ! $ = % assetType )
continue ;
% assetTypeId = AssetBrowser - - > filterTree . findChildItemByName ( % moduleItemId , % assetType ) ;
if ( % assetTypeId = = 0 )
% assetTypeId = AssetBrowser - - > filterTree . insertItem ( % moduleItemId , % assetType ) ;
}
AssetBrowser - - > filterTree . buildVisibleTree ( true ) ;
}
else if ( % this . treeFilterMode $ = "tags" )
2018-01-28 15:30:17 -06:00
{
2019-05-04 11:49:42 -05:00
2018-01-28 15:30:17 -06:00
}
2019-05-04 11:49:42 -05:00
% this . collapseTree ( ) ;
//Remove any modules that have no assets if we have that filter on
if ( % this . onlyShowModulesWithAssets )
{
for ( % i = 0 ; % i < getWordCount ( % modulesList ) ; % i + + )
{
% moduleName = getWord ( % modulesList , % i ) . ModuleId ;
% moduleItemId = AssetBrowser - - > filterTree . findItemByName ( % moduleName ) ;
if ( AssetBrowser - - > filterTree . isParentItem ( % moduleItemId ) = = false )
AssetBrowser - - > filterTree . removeItem ( % moduleItemId ) ;
}
}
2018-01-28 15:30:17 -06:00
//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 ) ;
2019-05-04 11:49:42 -05:00
AssetBrowser - - > filterTree . buildVisibleTree ( ) ;
2018-01-28 15:30:17 -06:00
}
// 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 ;
}
2019-05-04 11:49:42 -05:00
function AssetBrowser : : collapseTree ( % this )
{
% modulesList = ModuleDatabase . findModules ( true ) ;
for ( % i = 0 ; % i < getWordCount ( % modulesList ) ; % i + + )
{
% moduleName = getWord ( % modulesList , % i ) . ModuleId ;
% moduleGroup = getWord ( % modulesList , % i ) . Group ;
if ( ( % moduleGroup $ = "Core" | | % moduleGroup $ = "Tools" ) & & ! % this . coreModulesFilter )
continue ;
% moduleItemId = AssetBrowser - - > filterTree . findItemByName ( % moduleName ) ;
AssetBrowser - - > filterTree . expandItem ( % moduleItemId , false ) ;
}
AssetBrowser - - > filterTree . expandItem ( 1 , true ) ;
}
2018-01-28 15:30:17 -06:00
//
//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 ) ;
2019-05-04 11:49:42 -05:00
//Flag us as dirty for editing purposes
EWorldEditor . setSceneAsDirty ( ) ;
2018-01-28 15:30:17 -06:00
}
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 ;
2019-05-04 11:49:42 -05:00
% reimportingPath = % assetDef . originalFilePath ;
//first, double-check we have an originating file. if we don't then we need to basically go out looking for it
if ( ! isFile ( % assetDef . originalFilePath ) )
{
//if(%assetType $= "ImageAsset")
// %filters = "";
% dlg = new OpenFileDialog ( )
{
Filters = "(All Files (*.*)|*.*|" ;
DefaultFile = % currentFile ;
ChangePath = false ;
MustExist = true ;
MultipleFiles = false ;
forceRelativePath = false ;
} ;
if ( % dlg . Execute ( ) )
{
% reimportingPath = % dlg . FileName ;
}
% dlg . delete ( ) ;
}
2018-01-28 15:30:17 -06:00
AssetBrowser . onBeginDropFiles ( ) ;
2019-05-04 11:49:42 -05:00
AssetBrowser . onDropFile ( % reimportingPath ) ;
2018-01-28 15:30:17 -06:00
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?
2019-05-04 11:49:42 -05:00
if ( % assetType $ = "ImageAsset" /*|| %assetType $= "GameObjectAsset"*/ | | % assetType $ = "CppAsset" | | % assetType $ = "SoundAsset" )
2018-01-28 15:30:17 -06:00
{
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 ) ;
}
2019-05-04 11:49:42 -05:00
if ( % assetType $ = "LevelAsset" )
EditLevelAssetPopup . showPopup ( Canvas ) ;
else
EditAssetPopup . showPopup ( Canvas ) ;
2018-01-28 15:30:17 -06:00
}
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 ( ) ;
// 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 ) ) ;
}
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);
}
2019-05-04 11:49:42 -05:00
else if ( % this . getItemText ( % itemId ) $ = "ScriptAsset" )
2018-01-28 15:30:17 -06:00
{
2019-05-04 11:49:42 -05:00
EditAssetCategoryPopup . showPopup ( Canvas ) ;
2018-01-28 15:30:17 -06:00
}
}
}
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" )
{
2019-05-04 11:49:42 -05:00
echo ( "WorldEditor::onControlDropped - dropped an ImageAsset onto the editor window. Todo: Implement dropping image/material into scene" ) ;
2018-01-28 15:30:17 -06:00
}
else if ( % assetType $ = "ShapeAsset" )
{
echo ( "DROPPED A SHAPE ON THE EDITOR WINDOW!" ) ;
2019-05-04 11:49:42 -05:00
% staticShapeObjDef = AssetDatabase . acquireAsset ( "Core_GameObjects:StaticShapeObject" ) ;
% newEntity = % staticShapeObjDef . createObject ( ) ;
2018-01-28 15:30:17 -06:00
2019-05-04 11:49:42 -05:00
% newEntity . position = % pos ;
% newEntity - - > MeshComponent . MeshAsset = % module @ ":" @ % asset ;
2019-08-19 01:14:34 -05:00
% newEntity . dirtyGameObject = true ; //because if we're specifically setting the mesh asset, it's dirty
2019-05-04 11:49:42 -05:00
getScene ( 0 ) . add ( % newEntity ) ;
2018-01-28 15:30:17 -06:00
EWorldEditor . clearSelection ( ) ;
EWorldEditor . selectObject ( % newEntity ) ;
}
else if ( % assetType $ = "MaterialAsset" )
{
2019-05-04 11:49:42 -05:00
echo ( "WorldEditor::onControlDropped - dropped an MaterialAsset onto the editor window. Todo: Implement dropping image/material into scene" ) ;
2018-01-28 15:30:17 -06:00
}
else if ( % assetType $ = "GameObjectAsset" )
{
2019-05-04 11:49:42 -05:00
echo ( "WorldEditor::onControlDropped - dropped an GameObjectAsset onto the editor window." ) ;
2018-01-28 15:30:17 -06:00
2019-05-04 11:49:42 -05:00
% goAssetDef = AssetDatabase . acquireAsset ( % module @ ":" @ % asset ) ;
2018-01-28 15:30:17 -06:00
2019-05-04 11:49:42 -05:00
AssetBrowser . dragAndDropGameObjectAsset ( % goAssetDef , EWorldEditor ) ;
2018-01-28 15:30:17 -06:00
}
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);" ) ;
2019-05-04 11:49:42 -05:00
getScene ( 0 ) . add ( % newEntity ) ;
2018-01-28 15:30:17 -06:00
EWorldEditor . clearSelection ( ) ;
EWorldEditor . selectObject ( % newEntity ) ;
}
else if ( % assetType $ = "ScriptAsset" ) //do we want to do it this way?
{
% newEntity = new Entity ( )
{
position = % pos ;
class = % asset ;
} ;
2019-05-04 11:49:42 -05:00
getScene ( 0 ) . add ( % newEntity ) ;
2018-01-28 15:30:17 -06:00
EWorldEditor . clearSelection ( ) ;
EWorldEditor . selectObject ( % newEntity ) ;
}
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 @");" , "" ) ;
}
}
}