new GuiControl(MaterialSelectorOverlay, EditorGuiGroup) { canSaveDynamicFields = "0"; Profile = "GuiOverlayProfile"; Enabled = "1"; isContainer = "1"; HorizSizing = "right"; VertSizing = "bottom"; Position = "0 0"; Extent = "1024 768"; MinExtent = "8 2"; canSave = "1"; Visible = "1"; hovertime = "1000"; new GuiWindowCtrl(MaterialSelector){ profile = "ToolsGuiWindowProfile"; HorizSizing = "center"; VertSizing = "center"; resizeWidth = "1"; resizeHeight = "1"; canClose = "1"; canMinimize = "0"; canMaximize = "0"; position = "72 98"; extent =" 766 550"; MinExtent = "383 274"; text = "Material Selector"; closeCommand = "MaterialSelector::hideDialog();"; EdgeSnap = "0"; canCollapse = "0"; visible = "0"; new GuiContainer(){ isContainer = "1"; HorizSizing = "right"; VertSizing = "bottom"; Position = "4 22"; Extent = "120 31"; Profile = "inspectorStyleRolloutDarkProfile"; }; new GuiTextCtrl(){ Profile = "ToolsGuiDefaultProfile"; HorizSizing = "right"; VertSizing = "bottom"; position = "10 23"; extent = "30 16"; text = "Filters"; }; new GuiContainer(){ profile = "ToolsGuiDefaultProfile"; Position = "4 39"; Extent = "120 507"; HorizSizing = "right"; VertSizing = "height"; isContainer = "1"; new GuiScrollCtrl() { canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "1"; Profile = "GuiEditorScrollProfile"; HorizSizing = "width"; VertSizing = "height"; Position = "0 0"; Extent = "128 355"; MinExtent = "8 8"; canSave = "1"; isDecoy = "0"; Visible = "1"; tooltipprofile = "ToolsGuiDefaultProfile"; hovertime = "1000"; Docking = "Client"; Margin = "0 0 0 0"; Padding = "0 0 0 0"; AnchorTop = "1"; AnchorBottom = "0"; AnchorLeft = "1"; AnchorRight = "0"; willFirstRespond = "1"; hScrollBar = "alwaysOff"; vScrollBar = "dynamic"; lockHorizScroll = true; lockVertScroll = "false"; constantThumbHeight = "0"; childMargin = "0 0"; mouseWheelScrollSpeed = "-1"; new GuiDynamicCtrlArrayControl() { canSaveDynamicFields = "0"; internalName = "filterArray"; Enabled = "1"; isContainer = "1"; Profile = "ToolsGuiDefaultProfile"; HorizSizing = "width"; VertSizing = "bottom"; Position = "18 0"; Extent = "128 195"; MinExtent = "8 8"; dynamicSize = "1"; rowSpacing = "2"; colSize = "128"; rowSize = "18"; }; }; }; new GuiContainer(){ Profile = "inspectorStyleRolloutDarkProfile"; Position = "128 22"; Extent = "480 31"; HorizSizing = "width"; VertSizing = "bottom"; isContainer = "1"; }; new GuiTextCtrl(){ profile = "ToolsGuiDefaultProfile"; HorizSizing = "right"; VertSizing = "bottom"; position = "133 23"; extent = "53 16"; text = "Materials"; }; // Create New Material new GuiBitmapButtonCtrl() { canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "0"; Profile = "ToolsGuiDefaultProfile"; HorizSizing = "left"; VertSizing = "bottom"; position = "594 24"; Extent = "15 15"; MinExtent = "8 2"; canSave = "1"; Visible = "1"; Command = "MaterialSelector.createNewMaterial();"; hovertime = "1000"; tooltip = "Create New Unmapped Material"; bitmap = "tools/gui/images/new"; groupNum = "-1"; buttonType = "PushButton"; useMouseEvents = "0"; }; new GuiBitmapButtonCtrl() { canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "0"; Profile = "ToolsGuiDefaultProfile"; HorizSizing = "left"; VertSizing = "bottom"; position = "578 24"; Extent = "15 15"; MinExtent = "8 2"; canSave = "1"; Visible = "1"; Command = "MaterialSelector.showDeleteDialog();"; hovertime = "1000"; tooltip = "Delete Material"; bitmap = "tools/gui/images/delete"; groupNum = "-1"; buttonType = "PushButton"; useMouseEvents = "0"; }; new GuiContainer(){ // Materials profile = "ToolsGuiDefaultProfile"; Position = "128 39"; Extent = "480 507"; HorizSizing = "width"; VertSizing = "height"; isContainer = "1"; new GuiScrollCtrl() { canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "1"; Profile = "GuiEditorScrollProfile"; HorizSizing = "width"; VertSizing = "height"; Position = "0 0"; Extent = "480 507"; MinExtent = "8 8"; canSave = "1"; isDecoy = "0"; Visible = "1"; tooltipprofile = "ToolsGuiDefaultProfile"; hovertime = "1000"; Docking = "Client"; Margin = "0 0 0 0"; Padding = "0 0 0 0"; AnchorTop = "1"; AnchorBottom = "0"; AnchorLeft = "1"; AnchorRight = "0"; willFirstRespond = "1"; hScrollBar = "alwaysOff"; vScrollBar = "dynamic"; lockHorizScroll = "true"; lockVertScroll = "false"; constantThumbHeight = "0"; childMargin = "0 0"; mouseWheelScrollSpeed = "-1"; new GuiStackControl(){ HorizSizing = "width"; VertSizing = "bottom"; Position = "0 0"; Extent = "128 0"; changeChildPosition = 0; changeChildSizeToFit = 1; new GuiControl(){ Extent = "0 4"; }; new GuiDynamicCtrlArrayControl() { canSaveDynamicFields = "0"; internalName = "materialSelection"; Enabled = "1"; isContainer = "1"; Profile = "ToolsGuiDefaultProfile"; HorizSizing = "width"; VertSizing = "bottom"; Position = "3 0"; Extent = "128 0"; MinExtent = "8 8"; dynamicSize = "1"; autoCellSize = "1"; rowSpacing = "2"; colSpacing = "2"; margin = "2"; }; }; }; new GuiContainer(){ internalName = "materialPreviewControlContainer"; profile = "ToolsGuiDefaultProfile"; Position = "0 0"; Extent = "480 20"; HorizSizing = "width"; VertSizing = "height"; isContainer = "1"; Docking = "Bottom"; new GuiTextCtrl(){ profile = "ToolsGuiDefaultProfile"; HorizSizing = "right"; VertSizing = "bottom"; position = "0 2"; extent = "100 16"; text = "Thumbnails per Page:"; }; new GuiPopupMenuCtrlEx(){ internalName = "materialPreviewCountPopup"; Profile = "ToolsGuiPopUpMenuProfile"; Position = "104 2"; Extent = "40 18"; HorizSizing = "right"; VertSizing = "bottom"; Command = "MaterialSelector.thumbnailCountUpdate();"; reverseTextList = "0"; Text = "16"; }; new GuiStackControl(){ internalName = "materialPreviewButtonStack"; HorizSizing = "left"; VertSizing = "bottom"; Position = "480 2"; Extent = "0 16"; dynamic = 1; dynamicPos = 1; stackingType = "Horizontal"; changeChildPosition = 1; changeChildSizeToFit = 1; padding = 2; new GuiButtonCtrl() { canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "0"; Profile = "ToolsGuiButtonProfile"; HorizSizing = "right"; VertSizing = "bottom"; Position = "0 0"; Extent = "20 16"; MinExtent = "8 8"; canSave = "1"; isDecoy = "0"; Visible = "1"; Command = "MaterialSelector::firstPage();"; tooltipprofile = "ToolsGuiToolTipProfile"; tooltip = "First"; hovertime = "1000"; text = "|<"; groupNum = "-1"; buttonType = "PushButton"; useMouseEvents = "1"; }; new GuiButtonCtrl() { canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "0"; Profile = "ToolsGuiButtonProfile"; HorizSizing = "right"; VertSizing = "bottom"; Position = "0 0"; Extent = "20 16"; MinExtent = "8 8"; canSave = "1"; isDecoy = "0"; Visible = "1"; Command = "MaterialSelector::previousPage();"; tooltipprofile = "ToolsGuiToolTipProfile"; tooltip = "Previous"; hovertime = "1000"; text = "<"; groupNum = "-1"; buttonType = "PushButton"; useMouseEvents = "1"; }; new GuiStackControl(){ internalName = "materialPreviewPagesStack"; HorizSizing = "right"; VertSizing = "bottom"; Position = "0 0"; Extent = "0 16"; dynamic = 1; stackingType = "Horizontal"; changeChildPosition = 1; changeChildSizeToFit = 1; padding = 2; }; new GuiButtonCtrl() { canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "0"; Profile = "ToolsGuiButtonProfile"; HorizSizing = "right"; VertSizing = "bottom"; Position = "0 0"; Extent = "20 16"; MinExtent = "8 8"; canSave = "1"; isDecoy = "0"; Visible = "1"; Command = "MaterialSelector::nextPage();"; tooltipprofile = "ToolsGuiToolTipProfile"; tooltip = "Next"; hovertime = "1000"; text = ">"; groupNum = "-1"; buttonType = "PushButton"; useMouseEvents = "1"; }; new GuiButtonCtrl() { canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "0"; Profile = "ToolsGuiButtonProfile"; HorizSizing = "right"; VertSizing = "bottom"; Position = "0 0"; Extent = "20 16"; MinExtent = "8 8"; canSave = "1"; isDecoy = "0"; Visible = "1"; Command = "MaterialSelector::lastPage();"; tooltipprofile = "ToolsGuiToolTipProfile"; tooltip = "Last"; hovertime = "1000"; text = ">|"; groupNum = "-1"; buttonType = "PushButton"; useMouseEvents = "1"; }; }; }; }; new GuiContainer(){ Profile = "inspectorStyleRolloutDarkProfile"; Position = "612 206"; Extent = "150 31"; HorizSizing = "left"; VertSizing = "bottom"; isContainer = "1"; }; new GuiTextCtrl(){ profile = "ToolsGuiDefaultProfile"; HorizSizing = "left"; VertSizing = "bottom"; position = "618 207"; extent = "84 16"; text = "Material Tags"; }; new GuiContainer(){ // Filter Selection profile = "ToolsGuiDefaultProfile"; Position = "612 223"; Extent = "150 295"; HorizSizing = "left"; VertSizing = "height"; isContainer = "1"; new GuiScrollCtrl() { canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "1"; Profile = "GuiEditorScrollProfile"; HorizSizing = "width"; VertSizing = "height"; Position = "0 0"; Extent = "128 195"; MinExtent = "8 8"; canSave = "1"; isDecoy = "0"; Visible = "1"; tooltipprofile = "ToolsGuiDefaultProfile"; hovertime = "1000"; Docking = "Client"; Margin = "0 0 0 0"; Padding = "0 0 0 0"; AnchorTop = "1"; AnchorBottom = "0"; AnchorLeft = "1"; AnchorRight = "0"; willFirstRespond = "1"; hScrollBar = "alwaysOff"; vScrollBar = "dynamic"; lockHorizScroll = "true"; lockVertScroll = "false"; constantThumbHeight = "0"; childMargin = "0 0"; mouseWheelScrollSpeed = "-1"; new GuiDynamicCtrlArrayControl() { canSaveDynamicFields = "0"; internalName = "materialCategories"; Enabled = "1"; isContainer = "1"; Profile = "ToolsGuiDefaultProfile"; HorizSizing = "width"; VertSizing = "bottom"; Position = "0 0"; Extent = "128 195"; MinExtent = "8 8"; dynamicSize = "1"; rowSpacing = "2"; colSize = "128"; rowSize = "18"; }; }; }; new GuiContainer(){ Profile = "inspectorStyleRolloutDarkProfile"; Position = "612 22"; Extent = "150 167"; HorizSizing = "left"; VertSizing = "bottom"; isContainer = "1"; new GuiBitmapCtrl(){ internalName = "previewSelection"; HorizSizing = "left"; VertSizing = "bottom"; profile = "ToolsGuiDefaultProfile"; position = "1 18"; extent = "148 148"; bitmap = ""; }; }; new GuiTextCtrl(){ profile = "ToolsGuiDefaultProfile"; HorizSizing = "left"; VertSizing = "bottom"; position = "618 23"; extent = "84 16"; text = "Diffuse Preview"; }; new GuiBitmapCtrl(){ HorizSizing = "left"; VertSizing = "bottom"; profile = "ToolsGuiDefaultProfile"; position = "612 39"; extent = "150 150"; bitmap = "tools/worldEditor/images/terrainpainter/terrain-painter-border-large"; visible = false; }; new GuiTextCtrl(){ internalName = "previewSelectionText"; HorizSizing = "left"; VertSizing = "bottom"; profile = "ToolsGuiTextProfile"; position = "613 189"; extent = "149 16"; text = ""; }; new GuiButtonCtrl(){ internalName = "SelectButton"; HorizSizing = "left"; VertSizing = "top"; profile = "ToolsGuiButtonProfile"; position = "612 522"; extent = "94 24"; text = "Select"; command = "MaterialSelector.selectMaterial( MaterialSelector.selectedMaterial );"; }; new GuiButtonCtrl(){ HorizSizing = "left"; VertSizing = "top"; profile = "ToolsGuiButtonProfile"; position = "710 522"; extent = "52 24"; text = "Cancel"; command = "MaterialSelector.hideDialog();"; }; }; new GuiWindowCtrl(MaterialSelector_addFilterWindow) { canSaveDynamicFields = "0"; isContainer = "1"; Profile = "ToolsGuiWindowProfile"; HorizSizing = "center"; VertSizing = "center"; position = "362 333"; Extent = "272 99"; MinExtent = "48 92"; canSave = "1"; Visible = "0"; tooltipprofile = "ToolsGuiToolTipProfile"; hovertime = "1000"; Margin = "0 0 0 0"; Padding = "0 0 0 0"; AnchorTop = "1"; AnchorBottom = "0"; AnchorLeft = "1"; AnchorRight = "0"; resizeWidth = "1"; resizeHeight = "1"; canMove = "1"; canClose = "0"; canMinimize = "0"; canMaximize = "0"; minSize = "50 50"; EdgeSnap = "1"; text = "Create New Tag"; new GuiTextEditCtrl() { canSaveDynamicFields = "0"; internalName = "tagName"; isContainer = "0"; Profile = "ToolsGuiTextEditProfile"; HorizSizing = "right"; VertSizing = "bottom"; position = "64 35"; Extent = "196 18"; MinExtent = "8 2"; 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"; maxLength = "1024"; historySize = "0"; password = "0"; tabComplete = "0"; sinkAllKeyEvents = "0"; passwordMask = "*"; }; new GuiTextCtrl() { canSaveDynamicFields = "0"; isContainer = "0"; Profile = "ToolsGuiTextProfile"; HorizSizing = "right"; VertSizing = "bottom"; position = "12 35"; Extent = "52 16"; MinExtent = "8 2"; 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"; maxLength = "1024"; text = "Tag Name"; }; new GuiButtonCtrl() { canSaveDynamicFields = "0"; isContainer = "0"; Profile = "ToolsGuiButtonProfile"; HorizSizing = "right"; VertSizing = "bottom"; position = "64 68"; Extent = "126 22"; MinExtent = "8 2"; canSave = "1"; Visible = "1"; tooltipprofile = "ToolsGuiToolTipProfile"; hovertime = "1000"; groupNum = "-1"; buttonType = "PushButton"; useMouseEvents = "0"; text = "Create"; Command = "MaterialSelector.createFilter( MaterialSelector_addFilterWindow-->tagName.getText() );MaterialSelector_addFilterWindow.setVisible(0);"; }; new GuiButtonCtrl() { canSaveDynamicFields = "0"; isContainer = "0"; Profile = "ToolsGuiButtonProfile"; HorizSizing = "right"; VertSizing = "bottom"; position = "196 68"; Extent = "64 22"; MinExtent = "8 2"; canSave = "1"; Visible = "1"; tooltipprofile = "ToolsGuiToolTipProfile"; hovertime = "1000"; groupNum = "-1"; buttonType = "PushButton"; useMouseEvents = "0"; text = "Cancel"; Command = "MaterialSelector_addFilterWindow.setVisible(0);"; }; }; }; $Pref::MaterialSelector::CurrentStaticFilter = "MaterialFilterAllArray"; $Pref::MaterialSelector::CurrentFilter = ""; //ALL $Pref::MaterialSelector::ThumbnailCountIndex = 0; new PersistenceManager(MaterialSelectorPerMan); new ArrayObject(UnlistedMaterials); UnlistedMaterials.add( "unlistedMaterials", WarningMaterial ); UnlistedMaterials.add( "unlistedMaterials", materialEd_previewMaterial ); UnlistedMaterials.add( "unlistedMaterials", notDirtyMaterial ); UnlistedMaterials.add( "unlistedMaterials", materialEd_cubemapEd_cubeMapPreview ); UnlistedMaterials.add( "unlistedMaterials", matEdCubeMapPreviewMat ); UnlistedMaterials.add( "unlistedMaterials", materialEd_justAlphaMaterial ); UnlistedMaterials.add( "unlistedMaterials", materialEd_justAlphaShader ); function MaterialSelector::selectMaterial( %this, %material ) { %name = ""; if( MaterialSelector.terrainMaterials ) { %name = %material; %material = TerrainMaterialSet.findObjectByInternalName( %material ); } else { %name = %material.getName(); } // The callback function should be ready to intake the returned material //eval("materialEd_previewMaterial." @ %propertyField @ " = " @ %value @ ";"); if( MaterialSelector.returnType $= "name" ) eval( "" @ MaterialSelector.selectCallback @ "(" @ %name @ ");"); else if( MaterialSelector.returnType $= "index" ) { %index = -1; if( MaterialSelector.terrainMaterials ) { // Obtain the index into the terrain's material list %mats = ETerrainEditor.getMaterials(); for(%i = 0; %i < getRecordCount( %mats ); %i++) { %matInternalName = getRecord( %mats, %i ); if( %matInternalName $= %name ) { %index = %i; break; } } } else { // Obtain the index into the material set for(%i = 0; %i < materialSet.getCount(); %i++) { %obj = materialSet.getObject(%i); if( %obj.getName() $= %name ) { %index = %i; break; } } } eval( "" @ MaterialSelector.selectCallback @ "(" @ %index @ ");"); } else eval( "" @ MaterialSelector.selectCallback @ "(" @ %material.getId() @ ");"); MaterialSelector.hideDialog(); } function MaterialSelector::showDialog( %this, %selectCallback, %returnType) { if( MaterialSelector.isVisible() ) return; %this.showDialogBase(%selectCallback, %returnType, false); } function MaterialSelector::showTerrainDialog( %this, %selectCallback, %returnType) { %this.showDialogBase(%selectCallback, %returnType, true); } function MaterialSelector::showDialogBase( %this, %selectCallback, %returnType, %useTerrainMaterials) { // Set the select callback MaterialSelector.selectCallback = %selectCallback; MaterialSelector.returnType = %returnType; MaterialSelector.currentStaticFilter = $Pref::MaterialSelector::CurrentStaticFilter; MaterialSelector.currentFilter = $Pref::MaterialSelector::CurrentFilter; MaterialSelector.terrainMaterials = %useTerrainMaterials; MaterialSelector-->materialPreviewCountPopup.clear(); MaterialSelector-->materialPreviewCountPopup.add( "10", 0 ); MaterialSelector-->materialPreviewCountPopup.add( "15", 1 ); MaterialSelector-->materialPreviewCountPopup.add( "25", 2 ); MaterialSelector-->materialPreviewCountPopup.add( "50", 3 ); MaterialSelector-->materialPreviewCountPopup.add( "75", 4 ); MaterialSelector-->materialPreviewCountPopup.add( "100", 5 ); MaterialSelector-->materialPreviewCountPopup.setSelected( $Pref::MaterialSelector::ThumbnailCountIndex ); Canvas.pushDialog(MaterialSelectorOverlay); MaterialSelector.setVisible(1); MaterialSelector.buildStaticFilters(); MaterialSelector.selectedMaterial = ""; MaterialSelector.loadMaterialFilters(); } function MaterialSelector::hideDialog( %this ) { MaterialSelector.breakdown(); MaterialSelector.setVisible(0); Canvas.popDialog(MaterialSelectorOverlay); } function MaterialSelector::breakdown( %this ) { $Pref::MaterialSelector::CurrentStaticFilter = MaterialSelector.currentStaticFilter; $Pref::MaterialSelector::CurrentFilter = MaterialSelector.currentFilter; MaterialSelector-->filterArray.deleteAllObjects(); MaterialSelector-->materialSelection.deleteAllObjects(); MatEdPreviewArray.delete(); MaterialSelector-->materialCategories.deleteAllObjects(); MaterialFilterAllArray.delete(); MaterialFilterMappedArray.delete(); MaterialFilterUnmappedArray.delete(); } function MaterialSelector::buildStaticFilters( %this ) { // if you want to add any more containers to staticFilterObjects, here's // where to do it %staticFilterContainer = new GuiControl (){ new GuiContainer(){ profile = "ToolsGuiDefaultProfile"; Position = "0 0"; Extent = "128 18"; HorizSizing = "right"; VertSizing = "bottom"; isContainer = "1"; parentGroup = %filterArray; new GuiContainer(){ profile = "inspectorStyleRolloutDarkProfile"; Position = "-1 0"; Extent = "128 32"; HorizSizing = "right"; VertSizing = "bottom"; isContainer = "1"; }; new GuiTextCtrl(){ Profile = "EditorTextProfile"; position = "5 0"; Extent = "118 18"; text = "Types"; }; }; new GuiContainer(){ // All profile = "ToolsGuiDefaultProfile"; Position = "415 191"; Extent = "128 18"; HorizSizing = "right"; VertSizing = "bottom"; isContainer = "1"; parentGroup = %filterArray; new GuiCheckBoxCtrl(MaterialFilterAllArrayCheckbox){ Profile = "ToolsGuiCheckBoxListProfile"; position = "5 2"; Extent = "118 18"; text = "All"; Command = "MaterialSelector.switchStaticFilters(\"MaterialFilterAllArray\");"; }; }; new GuiContainer(){ // Mapped profile = "ToolsGuiDefaultProfile"; Position = "415 191"; Extent = "128 18"; HorizSizing = "right"; VertSizing = "bottom"; isContainer = "1"; parentGroup = %filterArray; new GuiCheckBoxCtrl(MaterialFilterMappedArrayCheckbox){ Profile = "ToolsGuiCheckBoxListProfile"; position = "5 2"; Extent = "118 18"; text = "Mapped"; Command = "MaterialSelector.switchStaticFilters(\"MaterialFilterMappedArray\");"; }; }; new GuiContainer(){ // Unmapped profile = "ToolsGuiDefaultProfile"; Position = "415 191"; Extent = "128 18"; HorizSizing = "right"; VertSizing = "bottom"; isContainer = "1"; parentGroup = %filterArray; new GuiCheckBoxCtrl(MaterialFilterUnmappedArrayCheckbox){ Profile = "ToolsGuiCheckBoxListProfile"; position = "5 2"; Extent = "118 18"; text = "Unmapped"; Command = "MaterialSelector.switchStaticFilters(\"MaterialFilterUnmappedArray\");"; }; }; new GuiContainer(){ profile = "ToolsGuiDefaultProfile"; Position = "0 0"; Extent = "128 18"; HorizSizing = "right"; VertSizing = "bottom"; isContainer = "1"; parentGroup = %filterArray; new GuiContainer(){ profile = "inspectorStyleRolloutDarkProfile"; Position = "-1 0"; Extent = "128 32"; HorizSizing = "right"; VertSizing = "bottom"; isContainer = "1"; }; new GuiTextCtrl(){ Profile = "EditorTextProfile"; position = "5 0"; Extent = "118 18"; text = "Tags"; }; // Create New Tag new GuiBitmapButtonCtrl() { canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "0"; Profile = "ToolsGuiDefaultProfile"; HorizSizing = "left"; VertSizing = "bottom"; position = "105 2"; Extent = "15 15"; MinExtent = "8 2"; canSave = "1"; Visible = "1"; Command = "MaterialSelector_addFilterWindow.setVisible(1); MaterialSelectorOverlay.pushToBack(MaterialSelector_addFilterWindow);"; hovertime = "1000"; tooltip = "Create New Tag"; bitmap = "tools/gui/images/new"; groupNum = "-1"; buttonType = "PushButton"; useMouseEvents = "0"; }; new GuiBitmapButtonCtrl() { canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "0"; Profile = "ToolsGuiDefaultProfile"; HorizSizing = "left"; VertSizing = "bottom"; position = "89 2"; Extent = "13 13"; MinExtent = "8 2"; canSave = "1"; Visible = "1"; Command = "MaterialSelector.clearMaterialFilters();"; hovertime = "1000"; tooltip = "Clear Selected Tag"; bitmap = "tools/gui/images/clear-btn"; groupNum = "-1"; buttonType = "PushButton"; useMouseEvents = "0"; }; }; }; %i = %staticFilterContainer.getCount(); for( ; %i != 0; %i--) MaterialSelector-->filterArray.addGuiControl(%staticFilterContainer.getObject(0)); MaterialSelector.staticFilterObjects = MaterialSelector-->filterArray.getCount(); %staticFilterContainer.delete(); // Create our category array used in the selector, this code should be taken out // in order to make the material selector agnostic new ArrayObject(MaterialFilterAllArray); new ArrayObject(MaterialFilterMappedArray); new ArrayObject(MaterialFilterUnmappedArray); %mats = ""; %count = 0; if( MaterialSelector.terrainMaterials ) { %mats = ETerrainEditor.getTerrainBlocksMaterialList(); %count = getRecordCount( %mats ); } else { %count = materialSet.getCount(); } for(%i = 0; %i < %count; %i++) { // Process terrain materials if( MaterialSelector.terrainMaterials ) { %matInternalName = getRecord( %mats, %i ); %material = TerrainMaterialSet.findObjectByInternalName( %matInternalName ); // Is there no material info for this slot? if ( !isObject( %material ) ) continue; // Add to the appropriate filters MaterialFilterMappedArray.add( "", %material ); MaterialFilterAllArray.add( "", %material ); continue; } // Process regular materials here %material = materialSet.getObject(%i); for( %k = 0; %k < UnlistedMaterials.count(); %k++ ) { %unlistedFound = 0; if( UnlistedMaterials.getValue(%k) $= %material.name ) { %unlistedFound = 1; break; } } if( %unlistedFound ) continue; if( %material.mapTo $= "" || %material.mapTo $= "unmapped_mat" ) { MaterialFilterUnmappedArray.add( "", %material.name ); //running through the existing tag names for( %j = 0; %material.getFieldValue("materialTag" @ %j) !$= ""; %j++ ) MaterialFilterUnmappedArray.add( %material.getFieldValue("materialTag" @ %j), %material.name ); } else { MaterialFilterMappedArray.add( "", %material.name ); for( %j = 0; %material.getFieldValue("materialTag" @ %j) !$= ""; %j++ ) MaterialFilterMappedArray.add( %material.getFieldValue("materialTag" @ %j), %material.name ); } MaterialFilterAllArray.add( "", %material.name ); for( %j = 0; %material.getFieldValue("materialTag" @ %j) !$= ""; %j++ ) MaterialFilterAllArray.add( %material.getFieldValue("materialTag" @ %j), %material.name ); } MaterialFilterAllArrayCheckbox.setText("All ( " @ MaterialFilterAllArray.count() @" ) "); MaterialFilterMappedArrayCheckbox.setText("Mapped ( " @ MaterialFilterMappedArray.count() @" ) "); MaterialFilterUnmappedArrayCheckbox.setText("Unmapped ( " @ MaterialFilterUnmappedArray.count() @" ) "); } function MaterialSelector::preloadFilter( %this ) { %selectedFilter = ""; for( %i = MaterialSelector.staticFilterObjects; %i < MaterialSelector-->filterArray.getCount(); %i++ ) { if( MaterialSelector-->filterArray.getObject(%i).getObject(0).getValue() == 1 ) { if( %selectedFilter $= "" ) %selectedFilter = MaterialSelector-->filterArray.getObject(%i).getObject(0).filter; else %selectedFilter = %selectedFilter @ " " @ MaterialSelector-->filterArray.getObject(%i).getObject(0).filter; } } MaterialSelector.loadFilter( %selectedFilter ); } function MaterialSelector::loadFilter( %this, %selectedFilter, %staticFilter ) { // 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(MatEdPreviewArray)) new ArrayObject(MatEdPreviewArray); // we have to empty out the list; so when we create new guicontrols, these dont linger MatEdPreviewArray.empty(); MaterialSelector-->materialSelection.deleteAllObjects(); MaterialSelector-->materialPreviewPagesStack.deleteAllObjects(); // changed to accomadate tagging. dig through the array for each tag name, // call unique value, sort, and we have a perfect set of materials if( %staticFilter !$= "" ) MaterialSelector.currentStaticFilter = %staticFilter; MaterialSelector.currentFilter = %selectedFilter; %filteredObjectsArray = new ArrayObject(); %previewsPerPage = MaterialSelector-->materialPreviewCountPopup.getTextById( MaterialSelector-->materialPreviewCountPopup.getSelected() ); %tagCount = getWordCount( MaterialSelector.currentFilter ); if( %tagCount != 0 ) { for( %j = 0; %j < %tagCount; %j++ ) { for( %i = 0; %i < MaterialSelector.currentStaticFilter.count(); %i++ ) { %currentTag = getWord( MaterialSelector.currentFilter, %j ); if( MaterialSelector.currentStaticFilter.getKey(%i) $= %currentTag) %filteredObjectsArray.add( MaterialSelector.currentStaticFilter.getKey(%i), MaterialSelector.currentStaticFilter.getValue(%i) ); } } %filteredObjectsArray.uniqueValue(); %filteredObjectsArray.sortd(); MaterialSelector.totalPages = mCeil( %filteredObjectsArray.count() / %previewsPerPage ); //Can we maintain the current preview page, or should we go to page 1? if( (MaterialSelector.currentPreviewPage * %previewsPerPage) >= %filteredObjectsArray.count() ) MaterialSelector.currentPreviewPage = 0; // Build out the pages buttons MaterialSelector.buildPagesButtons( MaterialSelector.currentPreviewPage, MaterialSelector.totalPages ); %previewCount = %previewsPerPage; %possiblePreviewCount = %filteredObjectsArray.count() - MaterialSelector.currentPreviewPage * %previewsPerPage; if( %possiblePreviewCount < %previewCount ) %previewCount = %possiblePreviewCount; %start = MaterialSelector.currentPreviewPage * %previewsPerPage; for( %i = %start; %i < %start + %previewCount; %i++ ) MaterialSelector.buildPreviewArray( %filteredObjectsArray.getValue(%i) ); %filteredObjectsArray.delete(); } else { MaterialSelector.currentStaticFilter.sortd(); // Rebuild the static filter list without tagged materials %noTagArray = new ArrayObject(); for( %i = 0; %i < MaterialSelector.currentStaticFilter.count(); %i++ ) { if( MaterialSelector.currentStaticFilter.getKey(%i) !$= "") continue; %material = MaterialSelector.currentStaticFilter.getValue(%i); // CustomMaterials are not available for selection if ( !isObject( %material ) || %material.isMemberOfClass( "CustomMaterial" ) ) continue; %noTagArray.add( "", %material ); } MaterialSelector.totalPages = mCeil( %noTagArray.count() / %previewsPerPage ); //Can we maintain the current preview page, or should we go to page 1? if( (MaterialSelector.currentPreviewPage * %previewsPerPage) >= %noTagArray.count() ) MaterialSelector.currentPreviewPage = 0; // Build out the pages buttons MaterialSelector.buildPagesButtons( MaterialSelector.currentPreviewPage, MaterialSelector.totalPages ); %previewCount = %previewsPerPage; %possiblePreviewCount = %noTagArray.count() - MaterialSelector.currentPreviewPage * %previewsPerPage; if( %possiblePreviewCount < %previewCount ) %previewCount = %possiblePreviewCount; %start = MaterialSelector.currentPreviewPage * %previewsPerPage; for( %i = %start; %i < %start + %previewCount; %i++ ) { MaterialSelector.buildPreviewArray( %noTagArray.getValue(%i) ); } } MaterialSelector.loadImages( 0 ); } function MaterialSelector::buildPreviewArray( %this, %material ) { %matName = ""; // CustomMaterials are not available for selection if ( !isObject( %material ) || %material.isMemberOfClass( "CustomMaterial" ) ) return; if( %material.isMemberOfClass("TerrainMaterial") ) { %matName = %material.getInternalName(); if( %material.diffuseMap $= "") %previewImage = "core/art/warnmat"; else %previewImage = %material.diffuseMap; } else if( %material.toneMap[0] $= "" && %material.diffuseMap[0] $= "" && !isObject(%material.cubemap) ) { %matName = %material.name; %previewImage = "core/art/warnmat"; } else { %matName = %material.name; if( %material.toneMap[0] !$= "" ) %previewImage = %material.toneMap[0]; else if( %material.diffuseMap[0] !$= "" ) %previewImage = %material.diffuseMap[0]; else if( %material.cubemap.cubeFace[0] !$= "" ) %previewImage = %material.cubemap.cubeFace[0]; //%previewImage = MaterialEditorGui.searchForTexture( %material, %previewImage ); // were going to use a couple of string commands in order to properly // find out what the img src path is // **NEW** this needs to be updated with the above, but has some timing issues %materialDiffuse = %previewImage; %materialPath = %material.getFilename(); if( strchr( %materialDiffuse, "/") $= "" ) { %k = 0; while( strpos( %materialPath, "/", %k ) != -1 ) { %foo = strpos( %materialPath, "/", %k ); %k = %foo + 1; } %foobar = getSubStr( %materialPath , %k , 99 ); %previewImage = strreplace( %materialPath, %foobar, %previewImage ); } else %previewImage = strreplace( %materialPath, %materialPath, %previewImage ); } // 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. %container = new GuiControl(){ profile = "ToolsGuiDefaultProfile"; Position = "0 0"; Extent = "74 87"; HorizSizing = "right"; VertSizing = "bottom"; isContainer = "1"; new GuiTextCtrl(){ position = "7 71"; profile = "ToolsGuiTextCenterProfile"; extent = "64 16"; text = %matName; }; }; %previewButton = new GuiBitmapButtonCtrl(){ internalName = %matName; HorizSizing = "right"; VertSizing = "bottom"; profile = "ToolsGuiButtonProfile"; position = "7 4"; extent = "64 64"; buttonType = "PushButton"; bitmap = ""; Command = ""; text = "Loading..."; useStates = false; new GuiBitmapButtonCtrl(){ HorizSizing = "right"; VertSizing = "bottom"; profile = "ToolsGuiButtonProfile"; position = "0 0"; extent = "64 64"; Variable = ""; buttonType = "toggleButton"; bitmap = "tools/materialEditor/gui/cubemapBtnBorder"; groupNum = "0"; text = ""; }; }; %previewBorder = new GuiButtonCtrl(){ internalName = %matName@"Border"; HorizSizing = "right"; VertSizing = "bottom"; profile = "ToolsGuiThumbHighlightButtonProfile"; position = "3 0"; extent = "72 88"; Variable = ""; buttonType = "toggleButton"; tooltip = %matName; Command = "MaterialSelector.updateSelection( $ThisControl.getParent().getObject(1).internalName, $ThisControl.getParent().getObject(1).bitmap );"; groupNum = "0"; text = ""; }; %container.add(%previewButton); %container.add(%previewBorder); // add to the gui control array MaterialSelector-->materialSelection.add(%container); // add to the array object for reference later MatEdPreviewArray.add( %previewButton, %previewImage ); } function MaterialSelector::loadImages( %this, %materialNum ) { // this will save us from spinning our wheels in case we don't exist if( !MaterialSelector.visible ) return; // this schedule is here to dynamically load images %previewButton = MatEdPreviewArray.getKey(%materialNum); %previewImage = MatEdPreviewArray.getValue(%materialNum); %previewButton.setBitmap(%previewImage); %previewButton.setText(""); %materialNum++; if( %materialNum < MatEdPreviewArray.count() ) { %tempSchedule = %this.schedule(64, "loadImages", %materialNum); MatEdScheduleArray.add( %tempSchedule, %materialNum ); } } function MaterialSelector::clearMaterialFilters( %this ) { for( %i = MaterialSelector.staticFilterObjects; %i < MaterialSelector-->filterArray.getCount(); %i++ ) MaterialSelector-->filterArray.getObject(%i).getObject(0).setStateOn(0); MaterialSelector.loadFilter( "", "" ); } function MaterialSelector::loadMaterialFilters( %this ) { %filteredTypesArray = new ArrayObject(); %filteredTypesArray.duplicate( MaterialFilterAllArray ); %filteredTypesArray.uniqueKey(); // sort the the keys before we do anything %filteredTypesArray.sortkd(); eval( MaterialSelector.currentStaticFilter @ "Checkbox.setStateOn(1);" ); // 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. %selectedFilter = ""; for( %i = 0; %i < %filteredTypesArray.count(); %i++ ) { %filter = %filteredTypesArray.getKey(%i); if(%filter $= "") continue; %container = new GuiControl(){ profile = "ToolsGuiDefaultProfile"; Position = "0 0"; Extent = "128 18"; HorizSizing = "right"; VertSizing = "bottom"; isContainer = "1"; }; %checkbox = new GuiCheckBoxCtrl(){ Profile = "ToolsGuiCheckBoxListProfile"; position = "5 1"; Extent = "118 18"; Command = ""; groupNum = "0"; buttonType = "ToggleButton"; text = %filter @ " ( " @ MaterialFilterAllArray.countKey(%filter) @ " )"; filter = %filter; Command = "MaterialSelector.preloadFilter();"; }; %container.add( %checkbox ); MaterialSelector-->filterArray.add( %container ); %tagCount = getWordCount( MaterialSelector.currentFilter ); for( %j = 0; %j < %tagCount; %j++ ) { if( %filter $= getWord( MaterialSelector.currentFilter, %j ) ) { if( %selectedFilter $= "" ) %selectedFilter = %filter; else %selectedFilter = %selectedFilter @ " " @ %filter; %checkbox.setStateOn(1); } } } MaterialSelector.loadFilter( %selectedFilter ); %filteredTypesArray.delete(); } // create category and update current material if there is one function MaterialSelector::createFilter( %this, %filter ) { if( %filter $= %existingFilters ) { MessageBoxOK( "Error", "Can not create blank filter."); return; } for( %i = MaterialSelector.staticFilterObjects; %i < MaterialSelector-->filterArray.getCount() ; %i++ ) { %existingFilters = MaterialSelector-->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 = "MaterialSelector.preloadFilter();"; }; }; MaterialSelector-->filterArray.add( %container ); // if selection exists, lets reselect it to refresh it if( isObject(MaterialSelector.selectedMaterial) ) MaterialSelector.updateSelection( MaterialSelector.selectedMaterial, MaterialSelector.selectedPreviewImagePath ); // material category text field to blank MaterialSelector_addFilterWindow-->tagName.setText(""); } function MaterialSelector::updateSelection( %this, %material, %previewImagePath ) { // 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 %isMaterialBorder = 0; eval("%isMaterialBorder = isObject(MaterialSelector-->"@%material@"Border);"); if( %isMaterialBorder ) { eval( "MaterialSelector-->"@%material@"Border.setStateOn(1);"); } %isMaterialBorderPrevious = 0; eval("%isMaterialBorderPrevious = isObject(MaterialSelector-->"@$prevSelectedMaterialHL@"Border);"); if( %isMaterialBorderPrevious ) { eval( "MaterialSelector-->"@$prevSelectedMaterialHL@"Border.setStateOn(0);"); } MaterialSelector-->materialCategories.deleteAllObjects(); MaterialSelector.selectedMaterial = %material; MaterialSelector.selectedPreviewImagePath = %previewImagePath; MaterialSelector-->previewSelectionText.setText( %material ); MaterialSelector-->previewSelection.setBitmap( %previewImagePath ); // running through the existing list of categorynames in the left, so yes // some might exist on the left only temporary if not given a home for( %i = MaterialSelector.staticFilterObjects; %i < MaterialSelector-->filterArray.getCount() ; %i++ ) { %filter = MaterialSelector-->filterArray.getObject(%i).getObject(0).filter; %checkbox = new GuiCheckBoxCtrl(){ materialName = %material.name; Profile = "ToolsGuiCheckBoxListProfile"; position = "5 2"; Extent = "118 18"; Command = "MaterialSelector.updateMaterialTags( $ThisControl.materialName, $ThisControl.getText(), $ThisControl.getValue() );"; text = %filter; }; MaterialSelector-->materialCategories.add( %checkbox ); // crawl through material for categories in order to check or not %filterFound = 0; for( %j = 0; %material.getFieldValue("materialTag" @ %j) !$= ""; %j++ ) { %tag = %material.getFieldValue("materialTag" @ %j); if( %tag $= %filter ) { %filterFound = 1; break; } } if( %filterFound ) %checkbox.setStateOn(1); else %checkbox.setStateOn(0); } $prevSelectedMaterialHL = %material; } function MaterialSelector::updateMaterialTags( %this, %material, %tag, %tagValue ) { if( %tagValue == 1 ) { MaterialFilterAllArray.add( %tag, %material ); if( %material.mapTo $= "" || %material.mapTo $= "unmapped_mat" ) %secondStaticFilter = MaterialFilterUnmappedArray; else %secondStaticFilter = MaterialFilterMappedArray; %secondStaticFilter.add( %tag, %material ); %createdTag = 0; for( %i = 0; %createdTag == 0; %i++ ) { %materialTag = %material.getFieldValue("materialTag" @ %i); if( %materialTag $= "" ) { eval( %material @ ".materialTag" @ %i @ "=" @ %tag @ ";" ); %createdTag = 1; for( %j = MaterialSelector.staticFilterObjects; %j < MaterialSelector-->filterArray.getCount() ; %j++ ) { if( %tag $= MaterialSelector-->filterArray.getObject(%j).getObject(0).filter ) { %count = getWord( MaterialSelector-->filterArray.getObject(%j).getObject(0).getText(), 2 ); %count++; MaterialSelector-->filterArray.getObject(%j).getObject(0).setText( %tag @ " ( "@ %count @ " )"); } } break; } } } else { // Remove the material from the "all" category for( %i = 0; %i < MaterialFilterAllArray.count(); %i++ ) { if( MaterialFilterAllArray.getKey(%i) $= %tag ) { if( MaterialFilterAllArray.getValue(%i) $= %material ) { MaterialFilterAllArray.erase(%i); break; } } } // Figure out what the material's other category is if( %material.mapTo $= "" || %material.mapTo $= "unmapped_mat" ) %secondStaticFilter = MaterialFilterUnmappedArray; else %secondStaticFilter = MaterialFilterMappedArray; // Remove the material from its other category for( %i = 0; %i < %secondStaticFilter.count(); %i++ ) { if( %secondStaticFilter.getKey(%i) $= %tag ) { if( %secondStaticFilter.getValue(%i) $= %material ) { %secondStaticFilter.erase( %i ); break; } } } MaterialSelector.updateFilterCount( %tag, false ); %tagField = MaterialSelector.getTagField( %material, %tag ); %lastTagField = MaterialSelector.getLastTagField( %material ); %lastValidTagField = MaterialSelector.getLastValidTagField( %material, %tag ); if( %tagField $= %lastValidTagField || %lastValidTagField $= "" ) { MaterialSelectorPerMan.removeField( %material, %tagField ); } else { // Replace the current tagFieldValue with the last tagFieldValue %lastValidTag = %material.getFieldValue( %lastValidTagField ); %material.setFieldValue( %tagField, %lastValidTag ); // Remove the last tagFieldValue MaterialSelectorPerMan.removeField( %material, %lastTagField ); } } // so were not going to save materials that dont current exist... // technically all the data is stored in dynamic fields if the user feels like saving // their auto-generated or new material if( %material.getFilename() !$= "" && %material.getFilename() !$= "tools/gui/MaterialSelector.ed.gui" && %material.getFilename() !$= "tools/materialEditor/scripts/materialEditor.ed.cs" ) { MaterialSelectorPerMan.setDirty( %material ); MaterialSelectorPerMan.saveDirty(); MaterialSelectorPerMan.removeDirty( %material ); if(!%tagValue) %material.setFieldValue( %lastTagField, "" ); } } function MaterialSelector::updateFilterCount( %this, %tag, %add ) { for( %i = MaterialSelector.staticFilterObjects; %i < MaterialSelector-->filterArray.getCount() ; %i++ ) { if( %tag $= MaterialSelector-->filterArray.getObject(%i).getObject(0).filter ) { // Get the filter count and apply the operation %idx = getWord( MaterialSelector-->filterArray.getObject(%i).getObject(0).getText(), 2 ); if( %add ) %idx++; else %idx--; MaterialSelector-->filterArray.getObject(%i).getObject(0).setText( %tag @ " ( "@ %idx @ " )"); } } } // this should create a new material pretty nicely function MaterialSelector::createNewMaterial( %this ) { // look for a newMaterial name to grab %material = getUniqueName( "newMaterial" ); new Material(%material) { diffuseMap[0] = "core/art/warnMat"; mapTo = "unmapped_mat"; parentGroup = RootGroup; }; // add one to All filter MaterialFilterAllArray.add( "", %material.name ); MaterialFilterAllArrayCheckbox.setText("All ( " @ MaterialFilterAllArray.count() + 1 @ " ) "); MaterialFilterUnmappedArray.add( "", %material.name ); MaterialFilterUnmappedArrayCheckbox.setText("Unmapped ( " @ MaterialFilterUnmappedArray.count() + 1 @ " ) "); if( MaterialSelector.currentStaticFilter !$= "MaterialFilterMappedArray" ) { // create the new material gui %container = new GuiControl(){ profile = "ToolsGuiDefaultProfile"; Position = "0 0"; Extent = "74 85"; HorizSizing = "right"; VertSizing = "bottom"; isContainer = "1"; new GuiTextCtrl(){ position = "10 70"; profile = "ToolsGuiTextCenterProfile"; extent = "64 16"; text = %material.name; }; }; %previewButton = new GuiBitmapButtonCtrl(){ internalName = %material.name; HorizSizing = "right"; VertSizing = "bottom"; profile = "ToolsGuiButtonProfile"; position = "7 4"; extent = "64 64"; buttonType = "PushButton"; bitmap = "core/art/warnMat"; Command = ""; text = "Loading..."; useStates = false; new GuiBitmapButtonCtrl(){ HorizSizing = "right"; VertSizing = "bottom"; profile = "ToolsGuiButtonProfile"; position = "0 0"; extent = "64 64"; Variable = ""; buttonType = "toggleButton"; bitmap = "tools/materialEditor/gui/cubemapBtnBorder"; groupNum = "0"; text = ""; }; }; %previewBorder = new GuiButtonCtrl(){ internalName = %material.name@"Border"; HorizSizing = "right"; VertSizing = "bottom"; profile = "ToolsGuiThumbHighlightButtonProfile"; position = "3 0"; extent = "72 88"; Variable = ""; buttonType = "toggleButton"; tooltip = %material.name; Command = "MaterialSelector.updateSelection( $ThisControl.getParent().getObject(1).internalName, $ThisControl.getParent().getObject(1).bitmap );"; groupNum = "0"; text = ""; }; %container.add(%previewButton); %container.add(%previewBorder); // add to the gui control array MaterialSelector-->materialSelection.add(%container); } // select me MaterialSelector.updateSelection( %material, "core/art/warnMat.png" ); } //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 MaterialSelector::showDeleteDialog( %this ) { %material = MaterialSelector.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

" @ %material.getName() @ "

Material deletion won't take affect until the engine is quit.", "MaterialSelector.deleteMaterial( " @ %material @ ", " @ %secondFilter @ ", " @ %secondFilterName @" );", "", "" ); } } function MaterialSelector::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 = MaterialSelector.staticFilterObjects; %j < MaterialSelector-->filterArray.getCount() ; %j++ ) { if( %materialTag $= MaterialSelector-->filterArray.getObject(%j).getObject(0).filter ) { %count = getWord( MaterialSelector-->filterArray.getObject(%j).getObject(0).getText(), 2 ); %count--; MaterialSelector-->filterArray.getObject(%j).getObject(0).setText( %materialTag @ " ( "@ %count @ " )"); } } } UnlistedMaterials.add( "unlistedMaterials", %materialName ); if( %materialName.getFilename() !$= "" && %materialName.getFilename() !$= "tools/gui/MaterialSelector.ed.gui" && %materialName.getFilename() !$= "tools/materialEditor/scripts/materialEditor.ed.cs" ) { MaterialSelectorPerMan.removeObjectFromFile(%materialName); MaterialSelectorPerMan.saveDirty(); } MaterialSelector.preloadFilter(); //MaterialSelector.selectMaterial( "WarningMaterial" ); } function MaterialSelector::switchStaticFilters( %this, %staticFilter) { switch$(%staticFilter) { case "MaterialFilterAllArray": MaterialFilterAllArrayCheckbox.setStateOn(1); MaterialFilterMappedArrayCheckbox.setStateOn(0); MaterialFilterUnmappedArrayCheckbox.setStateOn(0); case "MaterialFilterMappedArray": MaterialFilterMappedArrayCheckbox.setStateOn(1); MaterialFilterAllArrayCheckbox.setStateOn(0); MaterialFilterUnmappedArrayCheckbox.setStateOn(0); case "MaterialFilterUnmappedArray": MaterialFilterUnmappedArrayCheckbox.setStateOn(1); MaterialFilterAllArrayCheckbox.setStateOn(0); MaterialFilterMappedArrayCheckbox.setStateOn(0); } // kinda goofy were passing a class variable... we can't do an empty check right now // on load filter because we actually pass "" as a filter... MaterialSelector.loadFilter( MaterialSelector.currentFilter, %staticFilter ); } // Tagging Functionality function MaterialSelector::getTagField( %this, %material, %tag ) { for( %i = 0; %material.getFieldValue("materialTag" @ %i) !$= ""; %i++ ) { %loopTag = %material.getFieldValue("materialTag" @ %i); if( %tag $= %loopTag ) { %tagField = "materialTag" @ %i; break; } } return %tagField; } function MaterialSelector::getLastTagField( %this, %material ) { for( %i = 0; %material.getFieldValue("materialTag" @ %i) !$= ""; %i++ ) { %tagField = "materialTag" @ %i; } return %tagField; } function MaterialSelector::getLastValidTagField( %this, %material, %invalidTag ) { for( %i = 0; %material.getFieldValue("materialTag" @ %i) !$= ""; %i++ ) { %tag = %material.getFieldValue("materialTag" @ %i); // Can't equal our invalid tag if( %tag $= %invalidTag ) continue; // Set our last found tag %tagField = "materialTag" @ %i; } return %tagField; } // Preview Page Navigation function MaterialSelector::firstPage(%this) { MaterialSelector.currentPreviewPage = 0; MaterialSelector.LoadFilter( MaterialSelector.currentFilter, MaterialSelector.currentStaticFilter ); } function MaterialSelector::previousPage(%this) { MaterialSelector.currentPreviewPage--; if( MaterialSelector.currentPreviewPage < 0) MaterialSelector.currentPreviewPage = 0; MaterialSelector.LoadFilter( MaterialSelector.currentFilter, MaterialSelector.currentStaticFilter ); } function MaterialSelector::nextPage(%this) { MaterialSelector.currentPreviewPage++; if( MaterialSelector.currentPreviewPage >= MaterialSelector.totalPages) MaterialSelector.currentPreviewPage = MaterialSelector.totalPages - 1; if( MaterialSelector.currentPreviewPage < 0) MaterialSelector.currentPreviewPage = 0; MaterialSelector.LoadFilter( MaterialSelector.currentFilter, MaterialSelector.currentStaticFilter ); } function MaterialSelector::lastPage(%this) { MaterialSelector.currentPreviewPage = MaterialSelector.totalPages - 1; if( MaterialSelector.currentPreviewPage < 0) MaterialSelector.currentPreviewPage = 0; MaterialSelector.LoadFilter( MaterialSelector.currentFilter, MaterialSelector.currentStaticFilter ); } function MaterialSelector::selectPage(%this, %page) { MaterialSelector.currentPreviewPage = %page; MaterialSelector.LoadFilter( MaterialSelector.currentFilter, MaterialSelector.currentStaticFilter ); } function MaterialSelector::thumbnailCountUpdate(%this) { $Pref::MaterialSelector::ThumbnailCountIndex = MaterialSelector-->materialPreviewCountPopup.getSelected(); MaterialSelector.LoadFilter( MaterialSelector.currentFilter, MaterialSelector.currentStaticFilter ); } function MaterialSelector::buildPagesButtons(%this, %currentPage, %totalPages) { // We don't want any more than 8 pages at a time. if( %totalPages > 8 ) { // We attempt to display up to 2 pages before the current page %start = %currentPage - 2; if( %start <= 0 ) { %start = 0; %startbracket = false; } else { %startbracket = true; } if( (%totalPages - %start) < 8 ) { // Move %start closer to the beginning to maintain 8 pages %start = %totalPages - 8; } %end = %start + 8; if( %end >= %totalPages ) { %end = %totalPages; %endbracket = false; } else { %endbracket = true; } } else { %start = 0; %end = %totalPages; %startbracket = false; %endbracket = false; } if( %startbracket ) { %control = new GuiTextCtrl(){ profile = "ToolsGuiTextCenterProfile"; HorizSizing = "right"; VertSizing = "bottom"; position = "0 2"; extent = "14 16"; MinExtent = "8 8"; text = "..."; }; MaterialSelector-->materialPreviewPagesStack.add( %control ); } for( %i = %start; %i < %end; %i++ ) { if( %i != %currentPage ) { %control = new GuiButtonCtrl() { canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "0"; Profile = "ToolsGuiTextCenterProfile"; HorizSizing = "right"; VertSizing = "bottom"; Position = "0 0"; Extent = "14 16"; MinExtent = "8 8"; canSave = "1"; isDecoy = "0"; Visible = "1"; Command = "MaterialSelector.schedule(0, selectPage, " @ %i @ ");"; tooltipprofile = "ToolsGuiToolTipProfile"; hovertime = "1000"; text = %i+1; groupNum = "-1"; buttonType = "PushButton"; useMouseEvents = "1"; }; } else { %control = new GuiTextCtrl(){ profile = "ToolsGuiTextBoldCenterProfile"; HorizSizing = "right"; VertSizing = "bottom"; position = "0 2"; extent = "14 16"; MinExtent = "8 8"; text = %i+1; }; } MaterialSelector-->materialPreviewPagesStack.add( %control ); } if( %endbracket ) { %control = new GuiTextCtrl(){ profile = "ToolsGuiTextCenterProfile"; HorizSizing = "right"; VertSizing = "bottom"; position = "0 2"; extent = "14 16"; MinExtent = "8 8"; text = "..."; }; MaterialSelector-->materialPreviewPagesStack.add( %control ); } }