| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420 |
- //-----------------------------------------------------------------------------
- // Copyright (c) 2012 GarageGames, LLC
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to
- // deal in the Software without restriction, including without limitation the
- // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- // sell copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- // IN THE SOFTWARE.
- //-----------------------------------------------------------------------------
- //------------------------------------------------------------------------------
- // Shape Editor
- //------------------------------------------------------------------------------
- function initializeShapeEditor()
- {
- echo(" % - Initializing Shape Editor");
- exec("./gui/Profiles.ed.cs");
- exec("./gui/shapeEdPreviewWindow.ed.gui");
- exec("./gui/shapeEdAnimWindow.ed.gui");
- exec("./gui/shapeEdAdvancedWindow.ed.gui");
- exec("./gui/ShapeEditorToolbar.ed.gui");
- exec("./gui/shapeEdSelectWindow.ed.gui");
- exec("./gui/shapeEdPropWindow.ed.gui");
- exec("./scripts/shapeEditor.ed.cs");
- exec("./scripts/shapeEditorHints.ed.cs");
- exec("./scripts/shapeEditorActions.ed.cs");
- // Add windows to editor gui
- ShapeEdPreviewGui.setVisible(false);
- ShapeEdAnimWindow.setVisible(false);
- ShapeEditorToolbar.setVisible(false);
- ShapeEdSelectWindow.setVisible(false);
- ShapeEdPropWindow.setVisible(false);
- EditorGui.add(ShapeEdPreviewGui);
- EditorGui.add(ShapeEdAnimWindow);
- EditorGui.add(ShapeEdAdvancedWindow);
- EditorGui.add(ShapeEditorToolbar);
- EditorGui.add(ShapeEdSelectWindow);
- EditorGui.add(ShapeEdPropWindow);
- new ScriptObject(ShapeEditorPlugin)
- {
- superClass = "EditorPlugin";
- editorGui = ShapeEdShapeView;
- };
- %map = new ActionMap();
- %map.bindCmd( keyboard, "escape", "ToolsToolbarArray->WorldEditorInspectorPalette.performClick();", "" );
- %map.bindCmd( keyboard, "1", "ShapeEditorNoneModeBtn.performClick();", "" );
- %map.bindCmd( keyboard, "2", "ShapeEditorMoveModeBtn.performClick();", "" );
- %map.bindCmd( keyboard, "3", "ShapeEditorRotateModeBtn.performClick();", "" );
- //%map.bindCmd( keyboard, "4", "ShapeEditorScaleModeBtn.performClick();", "" ); // not needed for the shape editor
- %map.bindCmd( keyboard, "n", "ShapeEditorToolbar->showNodes.performClick();", "" );
- %map.bindCmd( keyboard, "t", "ShapeEditorToolbar->ghostMode.performClick();", "" );
- %map.bindCmd( keyboard, "r", "ShapeEditorToolbar->wireframeMode.performClick();", "" );
- %map.bindCmd( keyboard, "f", "ShapeEditorToolbar->fitToShapeBtn.performClick();", "" );
- %map.bindCmd( keyboard, "g", "ShapeEditorToolbar->showGridBtn.performClick();", "" );
- %map.bindCmd( keyboard, "h", "ShapeEdSelectWindow->tabBook.selectPage( 2 );", "" ); // Load help tab
- %map.bindCmd( keyboard, "l", "ShapeEdSelectWindow->tabBook.selectPage( 1 );", "" ); // load Library Tab
- %map.bindCmd( keyboard, "j", "ShapeEdSelectWindow->tabBook.selectPage( 0 );", "" ); // load scene object Tab
- %map.bindCmd( keyboard, "SPACE", "ShapeEdAnimWindow.togglePause();", "" );
- %map.bindCmd( keyboard, "i", "ShapeEdSequences.onEditSeqInOut(\"in\", ShapeEdSeqSlider.getValue());", "" );
- %map.bindCmd( keyboard, "o", "ShapeEdSequences.onEditSeqInOut(\"out\", ShapeEdSeqSlider.getValue());", "" );
- %map.bindCmd( keyboard, "shift -", "ShapeEdSeqSlider.setValue(ShapeEdAnimWindow-->seqIn.getText());", "" );
- %map.bindCmd( keyboard, "shift =", "ShapeEdSeqSlider.setValue(ShapeEdAnimWindow-->seqOut.getText());", "" );
- %map.bindCmd( keyboard, "=", "ShapeEdAnimWindow-->stepFwdBtn.performClick();", "" );
- %map.bindCmd( keyboard, "-", "ShapeEdAnimWindow-->stepBkwdBtn.performClick();", "" );
- ShapeEditorPlugin.map = %map;
- ShapeEditorPlugin.initSettings();
- }
- function destroyShapeEditor()
- {
- }
- function SetToggleButtonValue(%ctrl, %value)
- {
- if ( %ctrl.getValue() != %value )
- %ctrl.performClick();
- }
- // Replace the command field in an Editor PopupMenu item (returns the original value)
- function ShapeEditorPlugin::replaceMenuCmd(%this, %menuTitle, %id, %newCmd)
- {
- %menu = EditorGui.findMenu( %menuTitle );
- %cmd = getField( %menu.item[%id], 2 );
- %menu.setItemCommand( %id, %newCmd );
- return %cmd;
- }
- function ShapeEditorPlugin::onWorldEditorStartup(%this)
- {
- // Add ourselves to the window menu.
- %accel = EditorGui.addToEditorsMenu("Shape Editor", "", ShapeEditorPlugin);
- // Add ourselves to the ToolsToolbar
- %tooltip = "Shape Editor (" @ %accel @ ")";
- EditorGui.addToToolsToolbar( "ShapeEditorPlugin", "ShapeEditorPalette", expandFilename("tools/worldEditor/images/toolbar/shape-editor"), %tooltip );
- // Add ourselves to the Editor Settings window
- exec( "./gui/ShapeEditorSettingsTab.gui" );
- ESettingsWindow.addTabPage( EShapeEditorSettingsPage );
- GuiWindowCtrl::attach(ShapeEdPropWindow, ShapeEdSelectWindow);
- ShapeEdAnimWindow.resize( -1, 526, 593, 53 );
-
- // Initialise gui
- ShapeEdSeqNodeTabBook.selectPage(0);
- ShapeEdAdvancedWindow-->tabBook.selectPage(0);
- ShapeEdSelectWindow-->tabBook.selectPage(0);
- ShapeEdSelectWindow.navigate("");
- SetToggleButtonValue( ShapeEditorToolbar-->orbitNodeBtn, 0 );
- SetToggleButtonValue( ShapeEditorToolbar-->ghostMode, 0 );
- // Initialise hints menu
- ShapeEdHintMenu.clear();
- %count = ShapeHintGroup.getCount();
- for (%i = 0; %i < %count; %i++)
- {
- %hint = ShapeHintGroup.getObject(%i);
- ShapeEdHintMenu.add(%hint.objectType, %hint);
- }
- }
- function ShapeEditorPlugin::open(%this, %filename)
- {
- if ( !%this.isActivated )
- {
- // Activate the Shape Editor
- EditorGui.setEditor( %this, true );
- // Get editor settings (note the sun angle is not configured in the settings
- // dialog, so apply the settings here instead of in readSettings)
- %this.readSettings();
- ShapeEdShapeView.sunAngleX = EditorSettings.value("ShapeEditor/SunAngleX");
- ShapeEdShapeView.sunAngleZ = EditorSettings.value("ShapeEditor/SunAngleZ");
- EWorldEditor.forceLoadDAE = EditorSettings.value("forceLoadDAE");
- $wasInWireFrameMode = $gfx::wireframe;
- ShapeEditorToolbar-->wireframeMode.setStateOn($gfx::wireframe);
- if ( GlobalGizmoProfile.getFieldValue(alignment) $= "Object" )
- ShapeEdNodes-->objectTransform.setStateOn(1);
- else
- ShapeEdNodes-->worldTransform.setStateOn(1);
- // Initialise and show the shape editor
- ShapeEdShapeTreeView.open(MissionGroup);
- ShapeEdShapeTreeView.buildVisibleTree(true);
- ShapeEdPreviewGui.setVisible(true);
- ShapeEdSelectWindow.setVisible(true);
- ShapeEdPropWindow.setVisible(true);
- ShapeEdAnimWindow.setVisible(true);
- ShapeEdAdvancedWindow.setVisible(ShapeEditorToolbar-->showAdvanced.getValue());
- ShapeEditorToolbar.setVisible(true);
- EditorGui.bringToFront(ShapeEdPreviewGui);
- ToolsPaletteArray->WorldEditorMove.performClick();
- %this.map.push();
- // Switch to the ShapeEditor UndoManager
- %this.oldUndoMgr = Editor.getUndoManager();
- Editor.setUndoManager( ShapeEdUndoManager );
- ShapeEdShapeView.setDisplayType( EditorGui.currentDisplayType );
- %this.initStatusBar();
- // Customise menu bar
- %this.oldCamFitCmd = %this.replaceMenuCmd( "Camera", 8, "ShapeEdShapeView.fitToShape();" );
- %this.oldCamFitOrbitCmd = %this.replaceMenuCmd( "Camera", 9, "ShapeEdShapeView.fitToShape();" );
- Parent::onActivated(%this);
- }
- // Select the new shape
- if (isObject(ShapeEditor.shape) && (ShapeEditor.shape.baseShape $= %filename))
- {
- // Shape is already selected => re-highlight the selected material if necessary
- ShapeEdMaterials.updateSelectedMaterial(ShapeEdMaterials-->highlightMaterial.getValue());
- }
- else if (%filename !$= "")
- {
- ShapeEditor.selectShape(%filename, ShapeEditor.isDirty());
- // 'fitToShape' only works after the GUI has been rendered, so force a repaint first
- Canvas.repaint();
- ShapeEdShapeView.fitToShape();
- }
- }
- function ShapeEditorPlugin::onActivated(%this)
- {
- %this.open("");
- // Try to start with the shape selected in the world editor
- %count = EWorldEditor.getSelectionSize();
- for (%i = 0; %i < %count; %i++)
- {
- %obj = EWorldEditor.getSelectedObject(%i);
- %shapeFile = ShapeEditor.getObjectShapeFile(%obj);
- if (%shapeFile !$= "")
- {
- if (!isObject(ShapeEditor.shape) || (ShapeEditor.shape.baseShape !$= %shapeFile))
- {
- // Call the 'onSelect' method directly if the object is not in the
- // MissionGroup tree (such as a Player or Projectile object).
- ShapeEdShapeTreeView.clearSelection();
- if (!ShapeEdShapeTreeView.selectItem(%obj))
- ShapeEdShapeTreeView.onSelect(%obj);
- // 'fitToShape' only works after the GUI has been rendered, so force a repaint first
- Canvas.repaint();
- ShapeEdShapeView.fitToShape();
- }
- break;
- }
- }
- }
- function ShapeEditorPlugin::initStatusBar(%this)
- {
- EditorGuiStatusBar.setInfo("Shape editor ( Shift Click ) to speed up camera.");
- EditorGuiStatusBar.setSelection( ShapeEditor.shape.baseShape );
- }
- function ShapeEditorPlugin::onDeactivated(%this)
- {
- %this.writeSettings();
- // Notify game objects if shape has been modified
- if ( ShapeEditor.isDirty() )
- ShapeEditor.shape.notifyShapeChanged();
- $gfx::wireframe = $wasInWireFrameMode;
- ShapeEdMaterials.updateSelectedMaterial(false);
- ShapeEditorToolbar.setVisible(false);
- ShapeEdPreviewGui.setVisible(false);
- ShapeEdSelectWindow.setVisible(false);
- ShapeEdPropWindow.setVisible(false);
- ShapeEdAnimWindow.setVisible(false);
- ShapeEdAdvancedWindow.setVisible(false);
-
- if( EditorGui-->MatEdPropertiesWindow.visible )
- {
- ShapeEdMaterials.editSelectedMaterialEnd( true );
- }
- %this.map.pop();
- // Restore the original undo manager
- Editor.setUndoManager( %this.oldUndoMgr );
- // Restore menu bar
- %this.replaceMenuCmd( "Camera", 8, %this.oldCamFitCmd );
- %this.replaceMenuCmd( "Camera", 9, %this.oldCamFitOrbitCmd );
- Parent::onDeactivated(%this);
- }
- function ShapeEditorPlugin::onExitMission( %this )
- {
- // unselect the current shape
- ShapeEdShapeView.setModel( "" );
- if (ShapeEditor.shape != -1)
- ShapeEditor.shape.delete();
- ShapeEditor.shape = 0;
- ShapeEdUndoManager.clearAll();
- ShapeEditor.setDirty( false );
- ShapeEdSequenceList.clear();
- ShapeEdNodeTreeView.removeItem( 0 );
- ShapeEdPropWindow.update_onNodeSelectionChanged( -1 );
- ShapeEdDetailTree.removeItem( 0 );
- ShapeEdMaterialList.clear();
- ShapeEdMountWindow-->mountList.clear();
- ShapeEdThreadWindow-->seqList.clear();
- ShapeEdThreadList.clear();
- }
- function ShapeEditorPlugin::openShape( %this, %path, %discardChangesToCurrent )
- {
- EditorGui.setEditor( ShapeEditorPlugin );
-
- if( ShapeEditor.isDirty() && !%discardChangesToCurrent )
- {
- MessageBoxYesNo( "Save Changes?",
- "Save changes to current shape?",
- "ShapeEditor.saveChanges(); ShapeEditorPlugin.openShape(\"" @ %path @ "\");",
- "ShapeEditorPlugin.openShape(\"" @ %path @ "\");" );
- return;
- }
-
- ShapeEditor.selectShape( %path );
- ShapeEdShapeView.fitToShape();
- }
- function shapeEditorWireframeMode()
- {
- $gfx::wireframe = !$gfx::wireframe;
- ShapeEditorToolbar-->wireframeMode.setStateOn($gfx::wireframe);
- }
- //-----------------------------------------------------------------------------
- // Settings
- //-----------------------------------------------------------------------------
- function ShapeEditorPlugin::initSettings( %this )
- {
- EditorSettings.beginGroup( "ShapeEditor", true );
- // Display options
- EditorSettings.setDefaultValue( "BackgroundColor", "0 0 0 100" );
- EditorSettings.setDefaultValue( "HighlightMaterial", 1 );
- EditorSettings.setDefaultValue( "ShowNodes", 1 );
- EditorSettings.setDefaultValue( "ShowBounds", 0 );
- EditorSettings.setDefaultValue( "ShowObjBox", 1 );
- EditorSettings.setDefaultValue( "RenderMounts", 1 );
- EditorSettings.setDefaultValue( "RenderCollision", 0 );
- // Grid
- EditorSettings.setDefaultValue( "ShowGrid", 1 );
- EditorSettings.setDefaultValue( "GridSize", 0.1 );
- EditorSettings.setDefaultValue( "GridDimension", "40 40" );
- // Sun
- EditorSettings.setDefaultValue( "SunDiffuseColor", "255 255 255 255" );
- EditorSettings.setDefaultValue( "SunAmbientColor", "180 180 180 255" );
- EditorSettings.setDefaultValue( "SunAngleX", "45" );
- EditorSettings.setDefaultValue( "SunAngleZ", "135" );
- // Sub-windows
- EditorSettings.setDefaultValue( "AdvancedWndVisible", "1" );
- EditorSettings.endGroup();
- }
- function ShapeEditorPlugin::readSettings( %this )
- {
- EditorSettings.beginGroup( "ShapeEditor", true );
- // Display options
- ShapeEdPreviewGui-->previewBackground.color = ColorIntToFloat( EditorSettings.value("BackgroundColor") );
- SetToggleButtonValue( ShapeEdMaterials-->highlightMaterial, EditorSettings.value( "HighlightMaterial" ) );
- SetToggleButtonValue( ShapeEditorToolbar-->showNodes, EditorSettings.value( "ShowNodes" ) );
- SetToggleButtonValue( ShapeEditorToolbar-->showBounds, EditorSettings.value( "ShowBounds" ) );
- SetToggleButtonValue( ShapeEditorToolbar-->showObjBox, EditorSettings.value( "ShowObjBox" ) );
- SetToggleButtonValue( ShapeEditorToolbar-->renderColMeshes, EditorSettings.value( "RenderCollision" ) );
- SetToggleButtonValue( ShapeEdMountWindow-->renderMounts, EditorSettings.value( "RenderMounts" ) );
- // Grid
- SetToggleButtonValue( ShapeEditorToolbar-->showGridBtn, EditorSettings.value( "ShowGrid" ) );
- ShapeEdShapeView.gridSize = EditorSettings.value( "GridSize" );
- ShapeEdShapeView.gridDimension = EditorSettings.value( "GridDimension" );
- // Sun
- ShapeEdShapeView.sunDiffuse = EditorSettings.value("SunDiffuseColor");
- ShapeEdShapeView.sunAmbient = EditorSettings.value("SunAmbientColor");
- // Sub-windows
- SetToggleButtonValue( ShapeEditorToolbar-->showAdvanced, EditorSettings.value( "AdvancedWndVisible" ) );
- EditorSettings.endGroup();
- }
- function ShapeEditorPlugin::writeSettings( %this )
- {
- EditorSettings.beginGroup( "ShapeEditor", true );
- // Display options
- EditorSettings.setValue( "BackgroundColor", ColorFloatToInt( ShapeEdPreviewGui-->previewBackground.color ) );
- EditorSettings.setValue( "HighlightMaterial", ShapeEdMaterials-->highlightMaterial.getValue() );
- EditorSettings.setValue( "ShowNodes", ShapeEditorToolbar-->showNodes.getValue() );
- EditorSettings.setValue( "ShowBounds", ShapeEditorToolbar-->showBounds.getValue() );
- EditorSettings.setValue( "ShowObjBox", ShapeEditorToolbar-->showObjBox.getValue() );
- EditorSettings.setValue( "RenderCollision", ShapeEditorToolbar-->renderColMeshes.getValue() );
- EditorSettings.setValue( "RenderMounts", ShapeEdMountWindow-->renderMounts.getValue() );
- // Grid
- EditorSettings.setValue( "ShowGrid", ShapeEditorToolbar-->showGridBtn.getValue() );
- EditorSettings.setValue( "GridSize", ShapeEdShapeView.gridSize );
- EditorSettings.setValue( "GridDimension", ShapeEdShapeView.gridDimension );
- // Sun
- EditorSettings.setValue( "SunDiffuseColor", ShapeEdShapeView.sunDiffuse );
- EditorSettings.setValue( "SunAmbientColor", ShapeEdShapeView.sunAmbient );
- EditorSettings.setValue( "SunAngleX", ShapeEdShapeView.sunAngleX );
- EditorSettings.setValue( "SunAngleZ", ShapeEdShapeView.sunAngleZ );
- // Sub-windows
- EditorSettings.setValue( "AdvancedWndVisible", ShapeEditorToolbar-->showAdvanced.getValue() );
- EditorSettings.endGroup();
- }
|