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 );
}
}