2009-04-19 18:07:22 +00:00
#region = = = = = = = = = = = = = = = = = = Copyright ( c ) 2007 Pascal vd Heiden
/ *
* Copyright ( c ) 2007 Pascal vd Heiden , www . codeimp . com
* This program is released under GNU General Public License
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* /
#endregion
#region = = = = = = = = = = = = = = = = = = Namespaces
using System ;
using System.Collections.Generic ;
2015-07-14 23:34:31 +00:00
using System.Drawing ;
2009-04-19 18:07:22 +00:00
using System.Windows.Forms ;
using CodeImp.DoomBuilder.Actions ;
Removed "Paste Properties Options" action.
Added "Paste Properties Special" actions in "Classic" and "Visual" categories. They work the same way as "Paste Special" action.
Added: "Copy Properties", "Paste Properties" and "Paste Properties Special" options are now shown in the Edit menu if current classic mode supports them.
Changed, Paste Properties Special window: only options relevant to current map format are now displayed.
Changed, Paste Properties Special window, UDMF: all UI-managed options are now available.
Fixed: MAPINFO parser was unable to process "include" directives.
Fixed, General interface: selection info was reset to "Nothing selected" after few seconds regardless of current selection.
Fixed, Visual mode: thing bounding boxes were not updated when changing things positions using Randomize mode.
Fixed, Visual mode: event lines were displayed at incorrect height when entering Visual mode for the first time.
Fixed, Texture Browser window: when MixTexturesFlats Game Configuration option is disabled, textures/flats are no longer shown in the Used group when flats/textures with the same names are used in the map.
Fixed(?): probably fixed an exception some users reported when trying to initialize a Classic mode after switching from Visual mode with "Sync cameras" option enabled.
Changed, Game configurations, Thing Categories: a block must have at least one thing category property to be recognized as a thing category.
Changed, Visplane Explorer: the plugin now outputs more info when it fails to initialize vpo.dll.
Cosmetic, Thing Edit window, Doom/Hexen map format: adjusted UI layout so thing flags control no longer displays scrollbars in Hexen map format.
Internal: merged methods from UDMFTools into UniFields, removed UDMFTools.
Updated Inno Setup script (added VC++ 2008 SP1 distributive).
Updated ZDoom_DECORATE.cfg (A_CheckBlock).
Updated documentation (added "System Requirements" page).
2015-10-09 12:38:12 +00:00
using CodeImp.DoomBuilder.BuilderModes.Interface ;
2009-04-19 18:07:22 +00:00
using CodeImp.DoomBuilder.Config ;
2014-12-03 23:15:26 +00:00
using CodeImp.DoomBuilder.Editing ;
2015-10-02 14:47:34 +00:00
using CodeImp.DoomBuilder.GZBuilder.Data ;
2014-12-03 23:15:26 +00:00
using CodeImp.DoomBuilder.Geometry ;
2012-09-17 15:41:18 +00:00
using CodeImp.DoomBuilder.GZBuilder.Geometry ;
2014-12-03 23:15:26 +00:00
using CodeImp.DoomBuilder.Map ;
using CodeImp.DoomBuilder.Rendering ;
using CodeImp.DoomBuilder.Types ;
using CodeImp.DoomBuilder.Windows ;
2009-04-19 18:07:22 +00:00
#endregion
namespace CodeImp.DoomBuilder.BuilderModes
{
[ EditMode ( DisplayName = "Things Mode" ,
SwitchAction = "thingsmode" , // Action name used to switch to this mode
2013-09-11 09:47:53 +00:00
ButtonImage = "ThingsMode.png" , // Image resource name for the button
2009-04-19 18:07:22 +00:00
ButtonOrder = int . MinValue + 300 , // Position of the button (lower is more to the left)
ButtonGroup = "000_editing" ,
2009-07-09 15:15:49 +00:00
UseByDefault = true ,
SafeStartMode = true ) ]
2009-04-19 18:07:22 +00:00
public class ThingsMode : BaseClassicMode
{
#region = = = = = = = = = = = = = = = = = = Constants
#endregion
#region = = = = = = = = = = = = = = = = = = Variables
// Highlighted item
private Thing highlighted ;
2015-09-04 12:44:09 +00:00
private readonly Association [ ] association = new Association [ Thing . NUM_ARGS ] ;
private readonly Association highlightasso = new Association ( ) ;
2009-04-19 18:07:22 +00:00
// Interface
private bool editpressed ;
private bool thinginserted ;
2013-04-09 10:56:05 +00:00
private bool awaitingMouseClick ; //mxd
2015-10-02 14:47:34 +00:00
//mxd. Event lines
private List < Line3D > persistenteventlines ;
2015-12-14 12:34:31 +00:00
//mxd. Dynamic light shapes
private List < Line3D > dynamiclightshapes ;
2009-04-19 18:07:22 +00:00
#endregion
#region = = = = = = = = = = = = = = = = = = Properties
2009-05-17 14:00:36 +00:00
public override object HighlightedObject { get { return highlighted ; } }
2009-04-19 18:07:22 +00:00
#endregion
#region = = = = = = = = = = = = = = = = = = Constructor / Disposer
2015-07-28 15:04:21 +00:00
public ThingsMode ( )
{
//mxd. Associations now requre initializing...
2015-09-04 12:44:09 +00:00
for ( int i = 0 ; i < association . Length ; i + + ) association [ i ] = new Association ( ) ;
2015-07-28 15:04:21 +00:00
}
2009-04-19 18:07:22 +00:00
#endregion
#region = = = = = = = = = = = = = = = = = = Methods
2014-04-02 10:57:52 +00:00
//mxd. This makes a CRC for given selection
2014-12-03 23:15:26 +00:00
private static int CreateSelectionCRC ( ICollection < Thing > selection )
{
2014-04-02 10:57:52 +00:00
CRC crc = new CRC ( ) ;
crc . Add ( selection . Count ) ;
2014-12-03 23:15:26 +00:00
foreach ( Thing t in selection ) crc . Add ( t . Index ) ;
2014-04-02 10:57:52 +00:00
return ( int ) ( crc . Value & 0xFFFFFFFF ) ;
}
2009-04-19 18:07:22 +00:00
public override void OnHelp ( )
{
General . ShowHelp ( "e_things.html" ) ;
}
// Cancel mode
public override void OnCancel ( )
{
base . OnCancel ( ) ;
// Return to this mode
General . Editing . ChangeMode ( new ThingsMode ( ) ) ;
}
// Mode engages
public override void OnEngage ( )
{
base . OnEngage ( ) ;
renderer . SetPresentation ( Presentation . Things ) ;
2010-08-15 13:45:43 +00:00
// Add toolbar buttons
General . Interface . AddButton ( BuilderPlug . Me . MenusForm . CopyProperties ) ;
General . Interface . AddButton ( BuilderPlug . Me . MenusForm . PasteProperties ) ;
2014-04-09 10:16:33 +00:00
General . Interface . AddButton ( BuilderPlug . Me . MenusForm . PastePropertiesOptions ) ; //mxd
2013-03-18 13:52:27 +00:00
General . Interface . AddButton ( BuilderPlug . Me . MenusForm . SeparatorCopyPaste ) ; //mxd
General . Interface . AddButton ( BuilderPlug . Me . MenusForm . AlignThingsToWall ) ; //mxd
2010-08-15 13:45:43 +00:00
2009-04-19 18:07:22 +00:00
// Convert geometry selection to linedefs selection
General . Map . Map . ConvertSelection ( SelectionType . Linedefs ) ;
General . Map . Map . SelectionType = SelectionType . Things ;
2014-05-08 09:24:32 +00:00
UpdateSelectionInfo ( ) ; //mxd
2015-12-14 12:34:31 +00:00
UpdateHelperObjects ( ) ; //mxd
2009-04-19 18:07:22 +00:00
}
// Mode disengages
public override void OnDisengage ( )
{
base . OnDisengage ( ) ;
2010-08-15 13:45:43 +00:00
// Remove toolbar buttons
General . Interface . RemoveButton ( BuilderPlug . Me . MenusForm . CopyProperties ) ;
General . Interface . RemoveButton ( BuilderPlug . Me . MenusForm . PasteProperties ) ;
2014-04-09 10:16:33 +00:00
General . Interface . RemoveButton ( BuilderPlug . Me . MenusForm . PastePropertiesOptions ) ; //mxd
2013-03-18 13:52:27 +00:00
General . Interface . RemoveButton ( BuilderPlug . Me . MenusForm . SeparatorCopyPaste ) ; //mxd
General . Interface . RemoveButton ( BuilderPlug . Me . MenusForm . AlignThingsToWall ) ; //mxd
2010-08-15 13:45:43 +00:00
2015-08-06 22:16:12 +00:00
//mxd. Do some highlight management...
if ( highlighted ! = null ) highlighted . Highlighted = false ;
2009-04-19 18:07:22 +00:00
// Going to EditSelectionMode?
if ( General . Editing . NewMode is EditSelectionMode )
{
2009-08-19 11:42:20 +00:00
// Not pasting anything?
EditSelectionMode editmode = ( General . Editing . NewMode as EditSelectionMode ) ;
if ( ! editmode . Pasting )
2009-04-19 18:07:22 +00:00
{
2009-08-19 11:42:20 +00:00
// No selection made? But we have a highlight!
if ( ( General . Map . Map . GetSelectedThings ( true ) . Count = = 0 ) & & ( highlighted ! = null ) )
{
// Make the highlight the selection
highlighted . Selected = true ;
}
2009-04-19 18:07:22 +00:00
}
2015-08-03 22:02:39 +00:00
}
2009-04-19 18:07:22 +00:00
2015-07-14 09:02:48 +00:00
// Hide highlight info and tooltip
2009-04-19 18:07:22 +00:00
General . Interface . HideInfo ( ) ;
2015-07-14 09:02:48 +00:00
General . Interface . Display . HideToolTip ( ) ; //mxd
2009-04-19 18:07:22 +00:00
}
// This redraws the display
public override void OnRedrawDisplay ( )
{
renderer . RedrawSurface ( ) ;
2015-06-24 21:21:19 +00:00
List < Line3D > eventlines = new List < Line3D > ( ) ; //mxd
2009-04-19 18:07:22 +00:00
// Render lines and vertices
2015-12-14 12:34:31 +00:00
if ( renderer . StartPlotter ( true ) )
2014-12-03 23:15:26 +00:00
{
2009-04-19 18:07:22 +00:00
renderer . PlotLinedefSet ( General . Map . Map . Linedefs ) ;
renderer . PlotVerticesSet ( General . Map . Map . Vertices ) ;
2015-06-24 21:21:19 +00:00
for ( int i = 0 ; i < Thing . NUM_ARGS ; i + + ) BuilderPlug . PlotAssociations ( renderer , association [ i ] , eventlines ) ;
if ( ( highlighted ! = null ) & & ! highlighted . IsDisposed ) BuilderPlug . PlotReverseAssociations ( renderer , highlightasso , eventlines ) ;
2009-04-19 18:07:22 +00:00
renderer . Finish ( ) ;
}
// Render things
if ( renderer . StartThings ( true ) )
{
renderer . RenderThingSet ( General . Map . ThingsFilter . HiddenThings , Presentation . THINGS_HIDDEN_ALPHA ) ;
2015-08-03 22:02:39 +00:00
renderer . RenderThingSet ( General . Map . ThingsFilter . VisibleThings , Presentation . THINGS_ALPHA ) ;
2015-06-24 21:21:19 +00:00
for ( int i = 0 ; i < Thing . NUM_ARGS ; i + + ) BuilderPlug . RenderAssociations ( renderer , association [ i ] , eventlines ) ;
2009-04-19 18:07:22 +00:00
if ( ( highlighted ! = null ) & & ! highlighted . IsDisposed )
{
2015-08-03 22:02:39 +00:00
renderer . RenderThing ( highlighted , General . Colors . Highlight , Presentation . THINGS_ALPHA ) ;
2015-06-24 21:21:19 +00:00
BuilderPlug . RenderReverseAssociations ( renderer , highlightasso , eventlines ) ; //mxd
2009-04-19 18:07:22 +00:00
}
2012-09-17 15:41:18 +00:00
2015-12-14 12:34:31 +00:00
//mxd. Event lines
if ( General . Settings . GZShowEventLines ) eventlines . AddRange ( persistenteventlines ) ;
//mxd. Dynamic light radii
if ( ! General . Map . DOOM & & General . Settings . GZDrawLightsMode ! = LightRenderMode . NONE )
eventlines . AddRange ( dynamiclightshapes ) ;
2013-09-11 09:47:53 +00:00
//mxd
2015-12-14 12:34:31 +00:00
if ( eventlines . Count > 0 ) renderer . RenderArrows ( eventlines ) ;
2009-04-19 18:07:22 +00:00
renderer . Finish ( ) ;
}
// Selecting?
2015-07-14 23:34:31 +00:00
if ( renderer . StartOverlay ( true ) )
2009-04-19 18:07:22 +00:00
{
// Render selection
2015-07-14 23:34:31 +00:00
if ( selecting ) RenderMultiSelection ( ) ;
//mxd. Render comments
if ( General . Map . UDMF & & General . Settings . RenderComments ) foreach ( Thing t in General . Map . Map . Things ) RenderComment ( t ) ;
renderer . Finish ( ) ;
2009-04-19 18:07:22 +00:00
}
renderer . Present ( ) ;
}
// This highlights a new item
Fixed, Draw Lines/Rectangle/Circle/Curve modes: line length labels displayed incorrect length.
Changed, Drag Linedefs/Vertices/Sectors/Things modes: line length labels are now displayed the same way as in Draw modes.
Changed, Drag Linedefs/Vertices/Sectors/Things modes: "lock movement to cardinal directions" mode (Alt-Shift-Drag) now locks movement in 4 directions instead of 8 and doesn't snap map elements to nearest grid intersections when they are not aligned to it.
Added, Visual mode, GZDoom, DECORATE: FORCEXYBILLBOARD flag is now supported.
Added, Visual mode, GLOOME, DECORATE: FLOORSPRITE, CEILSPRITE, WALLSPRITE, ROLLSPRITE and STICKTOPLANE flags are now supported (implementation is somewhat broken ATM and probably doesn't work the same way as in GLOOME, because Windows build with most these features is nowhere to be found...).
Fixed, Visual mode: in some cases Thing brightness was calculated incorrectly.
Updated ZDoom_DECORATE.cfg.
2015-08-25 22:05:14 +00:00
private void Highlight ( Thing t )
2009-04-19 18:07:22 +00:00
{
// Set highlight association
2015-07-28 15:04:21 +00:00
if ( t ! = null & & t . Tag ! = 0 )
2012-09-17 21:57:08 +00:00
highlightasso . Set ( t . Position , t . Tag , UniversalType . ThingTag ) ;
2009-04-19 18:07:22 +00:00
else
2012-09-17 21:57:08 +00:00
highlightasso . Set ( new Vector2D ( ) , 0 , 0 ) ;
2009-04-19 18:07:22 +00:00
2015-08-03 22:02:39 +00:00
if ( highlighted ! = null ) highlighted . Highlighted = false ; //mxd
2009-04-19 18:07:22 +00:00
2015-09-08 14:54:53 +00:00
//mxd. Determine thing associations
bool clearassociations = true ; //mxd
2009-04-19 18:07:22 +00:00
if ( t ! = null )
{
2015-08-03 22:02:39 +00:00
t . Highlighted = true ; //mxd
2009-04-19 18:07:22 +00:00
// Check if we can find the linedefs action
if ( ( t . Action > 0 ) & & General . Map . Config . LinedefActions . ContainsKey ( t . Action ) )
2015-09-08 14:54:53 +00:00
{
clearassociations = false ;
LinedefActionInfo action = General . Map . Config . LinedefActions [ t . Action ] ;
for ( int i = 0 ; i < Thing . NUM_ARGS ; i + + )
association [ i ] . Set ( t . Position , t . Args [ i ] , action . Args [ i ] . Type ) ;
}
//mxd. Check if we can use thing arguments
else if ( t . Action = = 0 )
{
ThingTypeInfo ti = General . Map . Data . GetThingInfoEx ( t . Type ) ;
if ( ti ! = null )
{
clearassociations = false ;
for ( int i = 0 ; i < Thing . NUM_ARGS ; i + + )
association [ i ] . Set ( t . Position , t . Args [ i ] , ti . Args [ i ] . Type ) ;
}
}
2009-04-19 18:07:22 +00:00
}
2015-09-08 14:54:53 +00:00
// mxd. Clear associations?
if ( clearassociations )
for ( int i = 0 ; i < Thing . NUM_ARGS ; i + + ) association [ i ] . Set ( new Vector2D ( ) , 0 , 0 ) ;
2009-04-19 18:07:22 +00:00
2015-08-03 22:02:39 +00:00
// Set new highlight and redraw display
highlighted = t ;
General . Interface . RedrawDisplay ( ) ;
2009-04-19 18:07:22 +00:00
// Show highlight info
if ( ( highlighted ! = null ) & & ! highlighted . IsDisposed )
2015-07-14 09:02:48 +00:00
{
2009-04-19 18:07:22 +00:00
General . Interface . ShowThingInfo ( highlighted ) ;
2015-07-14 09:02:48 +00:00
}
2009-04-19 18:07:22 +00:00
else
2015-07-14 09:02:48 +00:00
{
General . Interface . Display . HideToolTip ( ) ; //mxd
2009-04-19 18:07:22 +00:00
General . Interface . HideInfo ( ) ;
2015-07-14 09:02:48 +00:00
}
2009-04-19 18:07:22 +00:00
}
// Selection
protected override void OnSelectBegin ( )
{
2013-04-09 10:56:05 +00:00
//mxd. Yep, it's kinda hackish...
2014-12-03 23:15:26 +00:00
if ( awaitingMouseClick )
{
2013-04-09 10:56:05 +00:00
awaitingMouseClick = false ;
ThingPointAtCursor ( ) ;
return ;
}
2009-04-19 18:07:22 +00:00
// Item highlighted?
if ( ( highlighted ! = null ) & & ! highlighted . IsDisposed )
{
// Update display
if ( renderer . StartThings ( false ) )
{
// Redraw highlight to show selection
2015-08-03 22:02:39 +00:00
renderer . RenderThing ( highlighted , renderer . DetermineThingColor ( highlighted ) , Presentation . THINGS_ALPHA ) ;
2009-04-19 18:07:22 +00:00
renderer . Finish ( ) ;
renderer . Present ( ) ;
}
}
base . OnSelectBegin ( ) ;
}
// End selection
protected override void OnSelectEnd ( )
{
// Not ending from a multi-selection?
if ( ! selecting )
{
// Item highlighted?
if ( ( highlighted ! = null ) & & ! highlighted . IsDisposed )
{
2013-03-18 13:52:27 +00:00
//mxd. Flip selection
highlighted . Selected = ! highlighted . Selected ;
2009-04-19 18:07:22 +00:00
// Update display
if ( renderer . StartThings ( false ) )
{
// Render highlighted item
2015-08-03 22:02:39 +00:00
renderer . RenderThing ( highlighted , General . Colors . Highlight , Presentation . THINGS_ALPHA ) ;
2009-04-19 18:07:22 +00:00
renderer . Finish ( ) ;
renderer . Present ( ) ;
}
2014-12-03 23:15:26 +00:00
}
2013-03-28 11:37:08 +00:00
//mxd
2014-12-03 23:15:26 +00:00
else if ( BuilderPlug . Me . AutoClearSelection & & General . Map . Map . SelectedThingsCount > 0 )
{
2013-03-28 11:37:08 +00:00
General . Map . Map . ClearSelectedThings ( ) ;
General . Interface . RedrawDisplay ( ) ;
2009-04-19 18:07:22 +00:00
}
2013-07-09 11:29:10 +00:00
2014-05-08 09:24:32 +00:00
UpdateSelectionInfo ( ) ; //mxd
2009-04-19 18:07:22 +00:00
}
base . OnSelectEnd ( ) ;
}
// Start editing
protected override void OnEditBegin ( )
{
thinginserted = false ;
// Item highlighted?
if ( ( highlighted ! = null ) & & ! highlighted . IsDisposed )
{
// Edit pressed in this mode
editpressed = true ;
// Highlighted item not selected?
2009-07-09 14:03:47 +00:00
if ( ! highlighted . Selected & & ( BuilderPlug . Me . AutoClearSelection | | ( General . Map . Map . SelectedThingsCount = = 0 ) ) )
2009-04-19 18:07:22 +00:00
{
// Make this the only selection
General . Map . Map . ClearSelectedThings ( ) ;
highlighted . Selected = true ;
General . Interface . RedrawDisplay ( ) ;
}
// Update display
if ( renderer . StartThings ( false ) )
{
// Redraw highlight to show selection
2015-08-03 22:02:39 +00:00
renderer . RenderThing ( highlighted , renderer . DetermineThingColor ( highlighted ) , Presentation . THINGS_ALPHA ) ;
2009-04-19 18:07:22 +00:00
renderer . Finish ( ) ;
renderer . Present ( ) ;
}
}
2013-12-05 09:24:55 +00:00
else if ( mouseinside & & ! selecting & & BuilderPlug . Me . AutoDrawOnEdit ) //mxd. We don't want to insert a thing when multiselecting
2009-04-19 18:07:22 +00:00
{
2013-12-05 09:24:55 +00:00
// Edit pressed in this mode
editpressed = true ;
thinginserted = true ;
2010-08-13 18:32:21 +00:00
2013-12-05 09:24:55 +00:00
// Insert a new item and select it for dragging
General . Map . UndoRedo . CreateUndo ( "Insert thing" ) ;
Thing t = InsertThing ( mousemappos ) ;
2014-12-03 23:15:26 +00:00
if ( t = = null )
{
2013-12-05 09:24:55 +00:00
General . Map . UndoRedo . WithdrawUndo ( ) ;
2014-12-03 23:15:26 +00:00
}
else
{
2013-12-05 09:24:55 +00:00
General . Map . Map . ClearSelectedThings ( ) ;
t . Selected = true ;
Highlight ( t ) ;
General . Interface . RedrawDisplay ( ) ;
2009-04-19 18:07:22 +00:00
}
}
base . OnEditBegin ( ) ;
}
// Done editing
protected override void OnEditEnd ( )
{
// Edit pressed in this mode?
if ( editpressed )
{
// Anything selected?
ICollection < Thing > selected = General . Map . Map . GetSelectedThings ( true ) ;
if ( selected . Count > 0 )
{
if ( General . Interface . IsActiveWindow )
{
// Edit only when preferred
if ( ! thinginserted | | BuilderPlug . Me . EditNewThing )
{
2013-07-19 15:30:58 +00:00
//mxd. Show realtime thing edit dialog
2014-02-21 14:42:12 +00:00
General . Interface . OnEditFormValuesChanged + = thingEditForm_OnValuesChanged ;
2013-11-29 12:24:47 +00:00
DialogResult result = General . Interface . ShowEditThings ( selected ) ;
2013-07-19 15:30:58 +00:00
General . Interface . OnEditFormValuesChanged - = thingEditForm_OnValuesChanged ;
2009-04-19 18:07:22 +00:00
// When a single thing was selected, deselect it now
2015-10-02 14:47:34 +00:00
if ( selected . Count = = 1 )
2014-12-03 23:15:26 +00:00
{
2013-07-19 15:30:58 +00:00
General . Map . Map . ClearSelectedThings ( ) ;
2014-12-03 23:15:26 +00:00
}
else if ( result = = DialogResult . Cancel ) //mxd. Restore selection...
{
2015-10-02 14:47:34 +00:00
foreach ( Thing t in selected ) t . Selected = true ;
2013-07-19 15:30:58 +00:00
}
2015-10-02 14:47:34 +00:00
2015-12-14 12:34:31 +00:00
//mxd. Update helper lines
UpdateHelperObjects ( ) ;
2015-10-02 14:47:34 +00:00
// Update display
2013-11-29 12:24:47 +00:00
General . Interface . RedrawDisplay ( ) ;
2009-04-19 18:07:22 +00:00
}
}
}
2013-07-09 11:29:10 +00:00
2015-10-02 14:47:34 +00:00
//mxd. Update selection info
UpdateSelectionInfo ( ) ;
2009-04-19 18:07:22 +00:00
}
editpressed = false ;
base . OnEditEnd ( ) ;
}
2015-10-02 14:47:34 +00:00
//mxd
public override void OnUndoEnd ( )
{
base . OnUndoEnd ( ) ;
2015-12-14 12:34:31 +00:00
//mxd. Update helper lines
UpdateHelperObjects ( ) ;
2015-10-02 14:47:34 +00:00
}
//mxd
public override void OnRedoEnd ( )
{
base . OnRedoEnd ( ) ;
2015-12-14 12:34:31 +00:00
//mxd. Update helper lines
UpdateHelperObjects ( ) ;
2015-10-02 14:47:34 +00:00
}
2015-03-06 19:12:12 +00:00
//mxd. Otherwise event lines won't be drawn after panning finishes.
protected override void EndViewPan ( )
{
base . EndViewPan ( ) ;
if ( General . Settings . GZShowEventLines ) General . Interface . RedrawDisplay ( ) ;
}
2013-07-19 15:30:58 +00:00
//mxd
2014-12-03 23:15:26 +00:00
private void thingEditForm_OnValuesChanged ( object sender , EventArgs e )
{
2013-07-19 15:30:58 +00:00
// Update things filter
General . Map . ThingsFilter . Update ( ) ;
// Update entire display
General . Interface . RedrawDisplay ( ) ;
}
2009-04-19 18:07:22 +00:00
// Mouse moves
public override void OnMouseMove ( MouseEventArgs e )
{
base . OnMouseMove ( e ) ;
2015-06-24 21:21:19 +00:00
if ( panning ) return ; //mxd. Skip all this jazz while panning
2009-04-19 18:07:22 +00:00
2013-03-18 13:52:27 +00:00
//mxd
2014-12-03 23:15:26 +00:00
if ( selectpressed & & ! editpressed & & ! selecting )
{
2013-03-18 13:52:27 +00:00
// Check if moved enough pixels for multiselect
Vector2D delta = mousedownpos - mousepos ;
if ( ( Math . Abs ( delta . x ) > MULTISELECT_START_MOVE_PIXELS ) | |
2014-12-03 23:15:26 +00:00
( Math . Abs ( delta . y ) > MULTISELECT_START_MOVE_PIXELS ) )
{
2013-03-18 13:52:27 +00:00
// Start multiselecting
StartMultiSelection ( ) ;
}
}
2014-12-03 23:15:26 +00:00
else if ( paintselectpressed & & ! editpressed & & ! selecting ) //mxd. Drag-select
2009-04-19 18:07:22 +00:00
{
// Find the nearest thing within highlight range
2009-05-20 15:03:08 +00:00
Thing t = MapSet . NearestThingSquareRange ( General . Map . ThingsFilter . VisibleThings , mousemappos , BuilderPlug . Me . HighlightThingsRange / renderer . Scale ) ;
2013-03-18 13:52:27 +00:00
2014-12-03 23:15:26 +00:00
if ( t ! = null )
{
if ( t ! = highlighted )
{
2013-03-18 13:52:27 +00:00
//toggle selected state
if ( General . Interface . ShiftState ^ BuilderPlug . Me . AdditiveSelect )
t . Selected = true ;
2015-12-28 15:01:53 +00:00
else if ( General . Interface . CtrlState )
2013-03-18 13:52:27 +00:00
t . Selected = false ;
else
t . Selected = ! t . Selected ;
highlighted = t ;
2014-05-08 09:24:32 +00:00
UpdateSelectionInfo ( ) ; //mxd
2013-07-09 11:29:10 +00:00
2013-03-18 13:52:27 +00:00
// Update entire display
General . Interface . RedrawDisplay ( ) ;
}
2015-01-25 23:22:42 +00:00
}
else if ( highlighted ! = null )
2014-12-03 23:15:26 +00:00
{
2013-03-18 13:52:27 +00:00
Highlight ( null ) ;
// Update entire display
General . Interface . RedrawDisplay ( ) ;
}
2009-04-19 18:07:22 +00:00
}
2013-03-18 13:52:27 +00:00
else if ( e . Button = = MouseButtons . None ) // Not holding any buttons?
{
// Find the nearest thing within highlight range
Thing t = MapSet . NearestThingSquareRange ( General . Map . ThingsFilter . VisibleThings , mousemappos , BuilderPlug . Me . HighlightThingsRange / renderer . Scale ) ;
2015-07-14 09:02:48 +00:00
//mxd. Show tooltip?
2015-07-15 09:09:47 +00:00
if ( General . Map . UDMF & & General . Settings . RenderComments & & mouselastpos ! = mousepos & & highlighted ! = null & & ! highlighted . IsDisposed & & highlighted . Fields . ContainsKey ( "comment" ) )
2015-07-14 09:02:48 +00:00
{
string comment = highlighted . Fields . GetValue ( "comment" , string . Empty ) ;
2015-07-14 23:34:31 +00:00
if ( comment . Length > 2 )
{
string type = comment . Substring ( 0 , 3 ) ;
int index = Array . IndexOf ( CommentType . Types , type ) ;
if ( index > 0 ) comment = comment . TrimStart ( type . ToCharArray ( ) ) ;
}
2015-07-14 09:02:48 +00:00
General . Interface . Display . ShowToolTip ( "Comment:" , comment , ( int ) ( mousepos . x + 32 * MainForm . DPIScaler . Width ) , ( int ) ( mousepos . y + 8 * MainForm . DPIScaler . Height ) ) ;
}
2013-03-18 13:52:27 +00:00
// Highlight if not the same
2014-12-03 23:15:26 +00:00
if ( t ! = highlighted ) Highlight ( t ) ;
2013-03-18 13:52:27 +00:00
}
2009-04-19 18:07:22 +00:00
}
// Mouse leaves
public override void OnMouseLeave ( EventArgs e )
{
base . OnMouseLeave ( e ) ;
// Highlight nothing
Highlight ( null ) ;
}
2013-03-18 13:52:27 +00:00
//mxd
2014-12-03 23:15:26 +00:00
protected override void OnPaintSelectBegin ( )
{
2015-09-04 12:44:09 +00:00
// Highlight nothing
Highlight ( null ) ;
2013-03-18 13:52:27 +00:00
base . OnPaintSelectBegin ( ) ;
}
2009-04-19 18:07:22 +00:00
// Mouse wants to drag
protected override void OnDragStart ( MouseEventArgs e )
{
base . OnDragStart ( e ) ;
// Edit button used?
if ( General . Actions . CheckActionActive ( null , "classicedit" ) )
{
// Anything highlighted?
if ( ( highlighted ! = null ) & & ! highlighted . IsDisposed )
{
// Highlighted item not selected?
if ( ! highlighted . Selected )
{
2014-04-18 11:22:44 +00:00
// Select only this thing for dragging
2009-04-19 18:07:22 +00:00
General . Map . Map . ClearSelectedThings ( ) ;
highlighted . Selected = true ;
}
// Start dragging the selection
2015-12-28 15:01:53 +00:00
if ( ! BuilderPlug . Me . DontMoveGeometryOutsideMapBoundary | | CanDrag ( ) ) //mxd
2014-12-03 23:15:26 +00:00
{
2014-04-18 11:22:44 +00:00
// Shift pressed? Clone things!
2016-02-02 21:07:15 +00:00
bool thingscloned = false ;
2015-12-28 15:01:53 +00:00
if ( General . Interface . ShiftState )
2014-12-03 23:15:26 +00:00
{
2014-04-18 11:22:44 +00:00
ICollection < Thing > selection = General . Map . Map . GetSelectedThings ( true ) ;
2016-02-02 21:07:15 +00:00
if ( selection . Count > 0 )
2014-12-03 23:15:26 +00:00
{
2016-02-02 21:07:15 +00:00
// Make undo
General . Map . UndoRedo . CreateUndo ( ( selection . Count = = 1 ? "Clone-drag thing" : "Clone-drag " + selection . Count + " things" ) ) ;
2015-08-06 21:54:15 +00:00
2016-02-02 21:07:15 +00:00
// Clone things
foreach ( Thing t in selection )
2015-08-06 21:54:15 +00:00
{
2016-02-02 21:07:15 +00:00
Thing clone = InsertThing ( t . Position ) ;
t . CopyPropertiesTo ( clone ) ;
// If the cloned item is an interpolation point or patrol point, then insert the point in the path
ThingTypeInfo info = General . Map . Data . GetThingInfo ( t . Type ) ;
int nextpointtagargnum = - 1 ;
// Thing type can be changed in MAPINFO DoomEdNums block...
switch ( info . ClassName . ToLowerInvariant ( ) )
{
case "interpolationpoint" :
nextpointtagargnum = 3 ;
break ;
case "patrolpoint" :
nextpointtagargnum = 0 ;
break ;
}
// Apply changes?
if ( nextpointtagargnum ! = - 1 )
{
if ( t . Tag = = 0 ) t . Tag = General . Map . Map . GetNewTag ( ) ;
t . Args [ nextpointtagargnum ] = clone . Tag = General . Map . Map . GetNewTag ( ) ;
}
t . Selected = false ;
clone . Selected = true ;
2015-08-06 21:54:15 +00:00
}
2016-02-02 21:07:15 +00:00
// We'll want to skip creating additional Undo in DragThingsMode
thingscloned = true ;
2014-04-18 11:22:44 +00:00
}
}
2016-02-02 21:07:15 +00:00
General . Editing . ChangeMode ( new DragThingsMode ( new ThingsMode ( ) , mousedownmappos , ! thingscloned ) ) ;
2014-04-18 11:22:44 +00:00
}
2013-03-18 13:52:27 +00:00
}
}
}
//mxd. Check if any selected thing is outside of map boundary
2014-12-03 23:15:26 +00:00
private static bool CanDrag ( )
2014-05-20 09:09:28 +00:00
{
2013-03-18 13:52:27 +00:00
ICollection < Thing > selectedthings = General . Map . Map . GetSelectedThings ( true ) ;
int unaffectedCount = 0 ;
2014-12-03 23:15:26 +00:00
foreach ( Thing t in selectedthings )
{
2013-03-18 13:52:27 +00:00
// Make sure the vertex is inside the map boundary
if ( t . Position . x < General . Map . Config . LeftBoundary | | t . Position . x > General . Map . Config . RightBoundary
2014-12-03 23:15:26 +00:00
| | t . Position . y > General . Map . Config . TopBoundary | | t . Position . y < General . Map . Config . BottomBoundary )
{
2013-03-18 13:52:27 +00:00
t . Selected = false ;
unaffectedCount + + ;
2009-04-19 18:07:22 +00:00
}
}
2013-03-18 13:52:27 +00:00
2014-12-03 23:15:26 +00:00
if ( unaffectedCount = = selectedthings . Count )
{
2013-03-18 13:52:27 +00:00
General . Interface . DisplayStatus ( StatusType . Warning , "Unable to drag selection: " + ( selectedthings . Count = = 1 ? "selected thing is" : "all of selected things are" ) + " outside of map boundary!" ) ;
General . Interface . RedrawDisplay ( ) ;
return false ;
}
if ( unaffectedCount > 0 )
General . Interface . DisplayStatus ( StatusType . Warning , unaffectedCount + " of selected vertices " + ( unaffectedCount = = 1 ? "is" : "are" ) + " outside of map boundary!" ) ;
return true ;
2009-04-19 18:07:22 +00:00
}
// This is called wheh selection ends
protected override void OnEndMultiSelection ( )
{
2013-12-20 09:24:43 +00:00
bool selectionvolume = ( ( Math . Abs ( selectionrect . Width ) > 0.1f ) & & ( Math . Abs ( selectionrect . Height ) > 0.1f ) ) ;
2009-08-19 11:09:10 +00:00
if ( selectionvolume )
2009-04-19 18:07:22 +00:00
{
2013-03-18 13:52:27 +00:00
//mxd
2014-12-03 23:15:26 +00:00
switch ( marqueSelectionMode )
{
2013-12-20 09:24:43 +00:00
case MarqueSelectionMode . SELECT :
foreach ( Thing t in General . Map . ThingsFilter . VisibleThings )
t . Selected = selectionrect . Contains ( t . Position . x , t . Position . y ) ;
break ;
case MarqueSelectionMode . ADD :
foreach ( Thing t in General . Map . ThingsFilter . VisibleThings )
t . Selected | = selectionrect . Contains ( t . Position . x , t . Position . y ) ;
break ;
case MarqueSelectionMode . SUBTRACT :
foreach ( Thing t in General . Map . ThingsFilter . VisibleThings )
if ( selectionrect . Contains ( t . Position . x , t . Position . y ) ) t . Selected = false ;
break ;
default : //should be Intersect
foreach ( Thing t in General . Map . ThingsFilter . VisibleThings )
if ( ! selectionrect . Contains ( t . Position . x , t . Position . y ) ) t . Selected = false ;
break ;
2009-04-19 18:07:22 +00:00
}
2013-07-09 11:29:10 +00:00
2014-05-08 09:24:32 +00:00
UpdateSelectionInfo ( ) ; //mxd
2009-04-19 18:07:22 +00:00
}
base . OnEndMultiSelection ( ) ;
// Clear overlay
if ( renderer . StartOverlay ( true ) ) renderer . Finish ( ) ;
// Redraw
General . Interface . RedrawDisplay ( ) ;
}
// This is called when the selection is updated
protected override void OnUpdateMultiSelection ( )
{
base . OnUpdateMultiSelection ( ) ;
// Render selection
if ( renderer . StartOverlay ( true ) )
{
RenderMultiSelection ( ) ;
renderer . Finish ( ) ;
renderer . Present ( ) ;
}
}
// When copying
public override bool OnCopyBegin ( )
{
// No selection made? But we have a highlight!
if ( ( General . Map . Map . GetSelectedThings ( true ) . Count = = 0 ) & & ( highlighted ! = null ) )
{
// Make the highlight the selection
highlighted . Selected = true ;
2015-04-16 13:03:12 +00:00
//mxd. Actually, we want it marked, not selected
bool result = base . OnCopyBegin ( ) ;
highlighted . Selected = false ;
return result ;
2009-04-19 18:07:22 +00:00
}
return base . OnCopyBegin ( ) ;
}
2015-07-14 23:34:31 +00:00
//mxd
private void RenderComment ( Thing t )
{
if ( t . Fields . ContainsKey ( "comment" ) )
{
float size = ( ( t . FixedSize & & renderer . Scale > 1.0f ) ? t . Size / renderer . Scale : t . Size ) ;
if ( size * renderer . Scale < 1.5f ) return ; // Thing is too small to render
int iconindex = 0 ;
string comment = t . Fields . GetValue ( "comment" , string . Empty ) ;
if ( comment . Length > 2 )
{
string type = comment . Substring ( 0 , 3 ) ;
int index = Array . IndexOf ( CommentType . Types , type ) ;
if ( index ! = - 1 ) iconindex = index ;
}
RectangleF rect = new RectangleF ( t . Position . x + size - 10 / renderer . Scale , t . Position . y + size + 18 / renderer . Scale , 16 / renderer . Scale , - 16 / renderer . Scale ) ;
PixelColor c = ( t = = highlighted ? General . Colors . Highlight : ( t . Selected ? General . Colors . Selection : PixelColor . FromColor ( Color . White ) ) ) ;
renderer . RenderRectangleFilled ( rect , c , true , General . Map . Data . CommentTextures [ iconindex ] ) ;
}
}
2015-12-14 12:34:31 +00:00
//mxd
private void UpdateHelperObjects ( )
{
// Update event lines
persistenteventlines = LinksCollector . GetThingLinks ( General . Map . ThingsFilter . VisibleThings ) ;
// Update light radii
dynamiclightshapes = Tools . GetDynamicLightShapes ( ) ;
}
2009-04-19 18:07:22 +00:00
#endregion
#region = = = = = = = = = = = = = = = = = = Actions
2010-08-15 13:45:43 +00:00
// This copies the properties
[BeginAction("classiccopyproperties")]
public void CopyProperties ( )
{
// Determine source things
ICollection < Thing > sel = null ;
Removed "Paste Properties Options" action.
Added "Paste Properties Special" actions in "Classic" and "Visual" categories. They work the same way as "Paste Special" action.
Added: "Copy Properties", "Paste Properties" and "Paste Properties Special" options are now shown in the Edit menu if current classic mode supports them.
Changed, Paste Properties Special window: only options relevant to current map format are now displayed.
Changed, Paste Properties Special window, UDMF: all UI-managed options are now available.
Fixed: MAPINFO parser was unable to process "include" directives.
Fixed, General interface: selection info was reset to "Nothing selected" after few seconds regardless of current selection.
Fixed, Visual mode: thing bounding boxes were not updated when changing things positions using Randomize mode.
Fixed, Visual mode: event lines were displayed at incorrect height when entering Visual mode for the first time.
Fixed, Texture Browser window: when MixTexturesFlats Game Configuration option is disabled, textures/flats are no longer shown in the Used group when flats/textures with the same names are used in the map.
Fixed(?): probably fixed an exception some users reported when trying to initialize a Classic mode after switching from Visual mode with "Sync cameras" option enabled.
Changed, Game configurations, Thing Categories: a block must have at least one thing category property to be recognized as a thing category.
Changed, Visplane Explorer: the plugin now outputs more info when it fails to initialize vpo.dll.
Cosmetic, Thing Edit window, Doom/Hexen map format: adjusted UI layout so thing flags control no longer displays scrollbars in Hexen map format.
Internal: merged methods from UDMFTools into UniFields, removed UDMFTools.
Updated Inno Setup script (added VC++ 2008 SP1 distributive).
Updated ZDoom_DECORATE.cfg (A_CheckBlock).
Updated documentation (added "System Requirements" page).
2015-10-09 12:38:12 +00:00
if ( General . Map . Map . SelectedThingsCount > 0 ) sel = General . Map . Map . GetSelectedThings ( true ) ;
else if ( highlighted ! = null ) sel = new List < Thing > { highlighted } ;
2010-08-15 13:45:43 +00:00
if ( sel ! = null )
{
Removed "Paste Properties Options" action.
Added "Paste Properties Special" actions in "Classic" and "Visual" categories. They work the same way as "Paste Special" action.
Added: "Copy Properties", "Paste Properties" and "Paste Properties Special" options are now shown in the Edit menu if current classic mode supports them.
Changed, Paste Properties Special window: only options relevant to current map format are now displayed.
Changed, Paste Properties Special window, UDMF: all UI-managed options are now available.
Fixed: MAPINFO parser was unable to process "include" directives.
Fixed, General interface: selection info was reset to "Nothing selected" after few seconds regardless of current selection.
Fixed, Visual mode: thing bounding boxes were not updated when changing things positions using Randomize mode.
Fixed, Visual mode: event lines were displayed at incorrect height when entering Visual mode for the first time.
Fixed, Texture Browser window: when MixTexturesFlats Game Configuration option is disabled, textures/flats are no longer shown in the Used group when flats/textures with the same names are used in the map.
Fixed(?): probably fixed an exception some users reported when trying to initialize a Classic mode after switching from Visual mode with "Sync cameras" option enabled.
Changed, Game configurations, Thing Categories: a block must have at least one thing category property to be recognized as a thing category.
Changed, Visplane Explorer: the plugin now outputs more info when it fails to initialize vpo.dll.
Cosmetic, Thing Edit window, Doom/Hexen map format: adjusted UI layout so thing flags control no longer displays scrollbars in Hexen map format.
Internal: merged methods from UDMFTools into UniFields, removed UDMFTools.
Updated Inno Setup script (added VC++ 2008 SP1 distributive).
Updated ZDoom_DECORATE.cfg (A_CheckBlock).
Updated documentation (added "System Requirements" page).
2015-10-09 12:38:12 +00:00
// Copy properties from the first source thing
2010-08-15 13:45:43 +00:00
BuilderPlug . Me . CopiedThingProps = new ThingProperties ( General . GetByIndex ( sel , 0 ) ) ;
General . Interface . DisplayStatus ( StatusType . Action , "Copied thing properties." ) ;
}
Removed "Paste Properties Options" action.
Added "Paste Properties Special" actions in "Classic" and "Visual" categories. They work the same way as "Paste Special" action.
Added: "Copy Properties", "Paste Properties" and "Paste Properties Special" options are now shown in the Edit menu if current classic mode supports them.
Changed, Paste Properties Special window: only options relevant to current map format are now displayed.
Changed, Paste Properties Special window, UDMF: all UI-managed options are now available.
Fixed: MAPINFO parser was unable to process "include" directives.
Fixed, General interface: selection info was reset to "Nothing selected" after few seconds regardless of current selection.
Fixed, Visual mode: thing bounding boxes were not updated when changing things positions using Randomize mode.
Fixed, Visual mode: event lines were displayed at incorrect height when entering Visual mode for the first time.
Fixed, Texture Browser window: when MixTexturesFlats Game Configuration option is disabled, textures/flats are no longer shown in the Used group when flats/textures with the same names are used in the map.
Fixed(?): probably fixed an exception some users reported when trying to initialize a Classic mode after switching from Visual mode with "Sync cameras" option enabled.
Changed, Game configurations, Thing Categories: a block must have at least one thing category property to be recognized as a thing category.
Changed, Visplane Explorer: the plugin now outputs more info when it fails to initialize vpo.dll.
Cosmetic, Thing Edit window, Doom/Hexen map format: adjusted UI layout so thing flags control no longer displays scrollbars in Hexen map format.
Internal: merged methods from UDMFTools into UniFields, removed UDMFTools.
Updated Inno Setup script (added VC++ 2008 SP1 distributive).
Updated ZDoom_DECORATE.cfg (A_CheckBlock).
Updated documentation (added "System Requirements" page).
2015-10-09 12:38:12 +00:00
else
{
//mxd
General . Interface . DisplayStatus ( StatusType . Warning , "This action requires highlight or selection!" ) ;
}
2010-08-15 13:45:43 +00:00
}
// This pastes the properties
[BeginAction("classicpasteproperties")]
public void PasteProperties ( )
{
if ( BuilderPlug . Me . CopiedThingProps ! = null )
{
// Determine target things
ICollection < Thing > sel = null ;
Removed "Paste Properties Options" action.
Added "Paste Properties Special" actions in "Classic" and "Visual" categories. They work the same way as "Paste Special" action.
Added: "Copy Properties", "Paste Properties" and "Paste Properties Special" options are now shown in the Edit menu if current classic mode supports them.
Changed, Paste Properties Special window: only options relevant to current map format are now displayed.
Changed, Paste Properties Special window, UDMF: all UI-managed options are now available.
Fixed: MAPINFO parser was unable to process "include" directives.
Fixed, General interface: selection info was reset to "Nothing selected" after few seconds regardless of current selection.
Fixed, Visual mode: thing bounding boxes were not updated when changing things positions using Randomize mode.
Fixed, Visual mode: event lines were displayed at incorrect height when entering Visual mode for the first time.
Fixed, Texture Browser window: when MixTexturesFlats Game Configuration option is disabled, textures/flats are no longer shown in the Used group when flats/textures with the same names are used in the map.
Fixed(?): probably fixed an exception some users reported when trying to initialize a Classic mode after switching from Visual mode with "Sync cameras" option enabled.
Changed, Game configurations, Thing Categories: a block must have at least one thing category property to be recognized as a thing category.
Changed, Visplane Explorer: the plugin now outputs more info when it fails to initialize vpo.dll.
Cosmetic, Thing Edit window, Doom/Hexen map format: adjusted UI layout so thing flags control no longer displays scrollbars in Hexen map format.
Internal: merged methods from UDMFTools into UniFields, removed UDMFTools.
Updated Inno Setup script (added VC++ 2008 SP1 distributive).
Updated ZDoom_DECORATE.cfg (A_CheckBlock).
Updated documentation (added "System Requirements" page).
2015-10-09 12:38:12 +00:00
if ( General . Map . Map . SelectedThingsCount > 0 ) sel = General . Map . Map . GetSelectedThings ( true ) ;
else if ( highlighted ! = null ) sel = new List < Thing > { highlighted } ;
2010-08-15 13:45:43 +00:00
if ( sel ! = null )
{
// Apply properties to selection
Removed "Paste Properties Options" action.
Added "Paste Properties Special" actions in "Classic" and "Visual" categories. They work the same way as "Paste Special" action.
Added: "Copy Properties", "Paste Properties" and "Paste Properties Special" options are now shown in the Edit menu if current classic mode supports them.
Changed, Paste Properties Special window: only options relevant to current map format are now displayed.
Changed, Paste Properties Special window, UDMF: all UI-managed options are now available.
Fixed: MAPINFO parser was unable to process "include" directives.
Fixed, General interface: selection info was reset to "Nothing selected" after few seconds regardless of current selection.
Fixed, Visual mode: thing bounding boxes were not updated when changing things positions using Randomize mode.
Fixed, Visual mode: event lines were displayed at incorrect height when entering Visual mode for the first time.
Fixed, Texture Browser window: when MixTexturesFlats Game Configuration option is disabled, textures/flats are no longer shown in the Used group when flats/textures with the same names are used in the map.
Fixed(?): probably fixed an exception some users reported when trying to initialize a Classic mode after switching from Visual mode with "Sync cameras" option enabled.
Changed, Game configurations, Thing Categories: a block must have at least one thing category property to be recognized as a thing category.
Changed, Visplane Explorer: the plugin now outputs more info when it fails to initialize vpo.dll.
Cosmetic, Thing Edit window, Doom/Hexen map format: adjusted UI layout so thing flags control no longer displays scrollbars in Hexen map format.
Internal: merged methods from UDMFTools into UniFields, removed UDMFTools.
Updated Inno Setup script (added VC++ 2008 SP1 distributive).
Updated ZDoom_DECORATE.cfg (A_CheckBlock).
Updated documentation (added "System Requirements" page).
2015-10-09 12:38:12 +00:00
string rest = ( sel . Count = = 1 ? "a single thing" : sel . Count + " things" ) ; //mxd
General . Map . UndoRedo . CreateUndo ( "Paste properties to " + rest ) ;
2010-08-15 13:45:43 +00:00
foreach ( Thing t in sel )
{
Removed "Paste Properties Options" action.
Added "Paste Properties Special" actions in "Classic" and "Visual" categories. They work the same way as "Paste Special" action.
Added: "Copy Properties", "Paste Properties" and "Paste Properties Special" options are now shown in the Edit menu if current classic mode supports them.
Changed, Paste Properties Special window: only options relevant to current map format are now displayed.
Changed, Paste Properties Special window, UDMF: all UI-managed options are now available.
Fixed: MAPINFO parser was unable to process "include" directives.
Fixed, General interface: selection info was reset to "Nothing selected" after few seconds regardless of current selection.
Fixed, Visual mode: thing bounding boxes were not updated when changing things positions using Randomize mode.
Fixed, Visual mode: event lines were displayed at incorrect height when entering Visual mode for the first time.
Fixed, Texture Browser window: when MixTexturesFlats Game Configuration option is disabled, textures/flats are no longer shown in the Used group when flats/textures with the same names are used in the map.
Fixed(?): probably fixed an exception some users reported when trying to initialize a Classic mode after switching from Visual mode with "Sync cameras" option enabled.
Changed, Game configurations, Thing Categories: a block must have at least one thing category property to be recognized as a thing category.
Changed, Visplane Explorer: the plugin now outputs more info when it fails to initialize vpo.dll.
Cosmetic, Thing Edit window, Doom/Hexen map format: adjusted UI layout so thing flags control no longer displays scrollbars in Hexen map format.
Internal: merged methods from UDMFTools into UniFields, removed UDMFTools.
Updated Inno Setup script (added VC++ 2008 SP1 distributive).
Updated ZDoom_DECORATE.cfg (A_CheckBlock).
Updated documentation (added "System Requirements" page).
2015-10-09 12:38:12 +00:00
BuilderPlug . Me . CopiedThingProps . Apply ( t , false ) ;
2010-08-15 13:45:43 +00:00
t . UpdateConfiguration ( ) ;
}
Removed "Paste Properties Options" action.
Added "Paste Properties Special" actions in "Classic" and "Visual" categories. They work the same way as "Paste Special" action.
Added: "Copy Properties", "Paste Properties" and "Paste Properties Special" options are now shown in the Edit menu if current classic mode supports them.
Changed, Paste Properties Special window: only options relevant to current map format are now displayed.
Changed, Paste Properties Special window, UDMF: all UI-managed options are now available.
Fixed: MAPINFO parser was unable to process "include" directives.
Fixed, General interface: selection info was reset to "Nothing selected" after few seconds regardless of current selection.
Fixed, Visual mode: thing bounding boxes were not updated when changing things positions using Randomize mode.
Fixed, Visual mode: event lines were displayed at incorrect height when entering Visual mode for the first time.
Fixed, Texture Browser window: when MixTexturesFlats Game Configuration option is disabled, textures/flats are no longer shown in the Used group when flats/textures with the same names are used in the map.
Fixed(?): probably fixed an exception some users reported when trying to initialize a Classic mode after switching from Visual mode with "Sync cameras" option enabled.
Changed, Game configurations, Thing Categories: a block must have at least one thing category property to be recognized as a thing category.
Changed, Visplane Explorer: the plugin now outputs more info when it fails to initialize vpo.dll.
Cosmetic, Thing Edit window, Doom/Hexen map format: adjusted UI layout so thing flags control no longer displays scrollbars in Hexen map format.
Internal: merged methods from UDMFTools into UniFields, removed UDMFTools.
Updated Inno Setup script (added VC++ 2008 SP1 distributive).
Updated ZDoom_DECORATE.cfg (A_CheckBlock).
Updated documentation (added "System Requirements" page).
2015-10-09 12:38:12 +00:00
General . Interface . DisplayStatus ( StatusType . Action , "Pasted properties to" + rest + "." ) ;
2010-08-15 13:45:43 +00:00
Removed "Paste Properties Options" action.
Added "Paste Properties Special" actions in "Classic" and "Visual" categories. They work the same way as "Paste Special" action.
Added: "Copy Properties", "Paste Properties" and "Paste Properties Special" options are now shown in the Edit menu if current classic mode supports them.
Changed, Paste Properties Special window: only options relevant to current map format are now displayed.
Changed, Paste Properties Special window, UDMF: all UI-managed options are now available.
Fixed: MAPINFO parser was unable to process "include" directives.
Fixed, General interface: selection info was reset to "Nothing selected" after few seconds regardless of current selection.
Fixed, Visual mode: thing bounding boxes were not updated when changing things positions using Randomize mode.
Fixed, Visual mode: event lines were displayed at incorrect height when entering Visual mode for the first time.
Fixed, Texture Browser window: when MixTexturesFlats Game Configuration option is disabled, textures/flats are no longer shown in the Used group when flats/textures with the same names are used in the map.
Fixed(?): probably fixed an exception some users reported when trying to initialize a Classic mode after switching from Visual mode with "Sync cameras" option enabled.
Changed, Game configurations, Thing Categories: a block must have at least one thing category property to be recognized as a thing category.
Changed, Visplane Explorer: the plugin now outputs more info when it fails to initialize vpo.dll.
Cosmetic, Thing Edit window, Doom/Hexen map format: adjusted UI layout so thing flags control no longer displays scrollbars in Hexen map format.
Internal: merged methods from UDMFTools into UniFields, removed UDMFTools.
Updated Inno Setup script (added VC++ 2008 SP1 distributive).
Updated ZDoom_DECORATE.cfg (A_CheckBlock).
Updated documentation (added "System Requirements" page).
2015-10-09 12:38:12 +00:00
// Update
2010-08-15 13:45:43 +00:00
General . Map . IsChanged = true ;
General . Map . ThingsFilter . Update ( ) ;
General . Interface . RefreshInfo ( ) ;
Removed "Paste Properties Options" action.
Added "Paste Properties Special" actions in "Classic" and "Visual" categories. They work the same way as "Paste Special" action.
Added: "Copy Properties", "Paste Properties" and "Paste Properties Special" options are now shown in the Edit menu if current classic mode supports them.
Changed, Paste Properties Special window: only options relevant to current map format are now displayed.
Changed, Paste Properties Special window, UDMF: all UI-managed options are now available.
Fixed: MAPINFO parser was unable to process "include" directives.
Fixed, General interface: selection info was reset to "Nothing selected" after few seconds regardless of current selection.
Fixed, Visual mode: thing bounding boxes were not updated when changing things positions using Randomize mode.
Fixed, Visual mode: event lines were displayed at incorrect height when entering Visual mode for the first time.
Fixed, Texture Browser window: when MixTexturesFlats Game Configuration option is disabled, textures/flats are no longer shown in the Used group when flats/textures with the same names are used in the map.
Fixed(?): probably fixed an exception some users reported when trying to initialize a Classic mode after switching from Visual mode with "Sync cameras" option enabled.
Changed, Game configurations, Thing Categories: a block must have at least one thing category property to be recognized as a thing category.
Changed, Visplane Explorer: the plugin now outputs more info when it fails to initialize vpo.dll.
Cosmetic, Thing Edit window, Doom/Hexen map format: adjusted UI layout so thing flags control no longer displays scrollbars in Hexen map format.
Internal: merged methods from UDMFTools into UniFields, removed UDMFTools.
Updated Inno Setup script (added VC++ 2008 SP1 distributive).
Updated ZDoom_DECORATE.cfg (A_CheckBlock).
Updated documentation (added "System Requirements" page).
2015-10-09 12:38:12 +00:00
2015-12-14 12:34:31 +00:00
//mxd. Update helper lines
UpdateHelperObjects ( ) ;
Removed "Paste Properties Options" action.
Added "Paste Properties Special" actions in "Classic" and "Visual" categories. They work the same way as "Paste Special" action.
Added: "Copy Properties", "Paste Properties" and "Paste Properties Special" options are now shown in the Edit menu if current classic mode supports them.
Changed, Paste Properties Special window: only options relevant to current map format are now displayed.
Changed, Paste Properties Special window, UDMF: all UI-managed options are now available.
Fixed: MAPINFO parser was unable to process "include" directives.
Fixed, General interface: selection info was reset to "Nothing selected" after few seconds regardless of current selection.
Fixed, Visual mode: thing bounding boxes were not updated when changing things positions using Randomize mode.
Fixed, Visual mode: event lines were displayed at incorrect height when entering Visual mode for the first time.
Fixed, Texture Browser window: when MixTexturesFlats Game Configuration option is disabled, textures/flats are no longer shown in the Used group when flats/textures with the same names are used in the map.
Fixed(?): probably fixed an exception some users reported when trying to initialize a Classic mode after switching from Visual mode with "Sync cameras" option enabled.
Changed, Game configurations, Thing Categories: a block must have at least one thing category property to be recognized as a thing category.
Changed, Visplane Explorer: the plugin now outputs more info when it fails to initialize vpo.dll.
Cosmetic, Thing Edit window, Doom/Hexen map format: adjusted UI layout so thing flags control no longer displays scrollbars in Hexen map format.
Internal: merged methods from UDMFTools into UniFields, removed UDMFTools.
Updated Inno Setup script (added VC++ 2008 SP1 distributive).
Updated ZDoom_DECORATE.cfg (A_CheckBlock).
Updated documentation (added "System Requirements" page).
2015-10-09 12:38:12 +00:00
// Redraw
2010-08-15 13:45:43 +00:00
General . Interface . RedrawDisplay ( ) ;
}
Removed "Paste Properties Options" action.
Added "Paste Properties Special" actions in "Classic" and "Visual" categories. They work the same way as "Paste Special" action.
Added: "Copy Properties", "Paste Properties" and "Paste Properties Special" options are now shown in the Edit menu if current classic mode supports them.
Changed, Paste Properties Special window: only options relevant to current map format are now displayed.
Changed, Paste Properties Special window, UDMF: all UI-managed options are now available.
Fixed: MAPINFO parser was unable to process "include" directives.
Fixed, General interface: selection info was reset to "Nothing selected" after few seconds regardless of current selection.
Fixed, Visual mode: thing bounding boxes were not updated when changing things positions using Randomize mode.
Fixed, Visual mode: event lines were displayed at incorrect height when entering Visual mode for the first time.
Fixed, Texture Browser window: when MixTexturesFlats Game Configuration option is disabled, textures/flats are no longer shown in the Used group when flats/textures with the same names are used in the map.
Fixed(?): probably fixed an exception some users reported when trying to initialize a Classic mode after switching from Visual mode with "Sync cameras" option enabled.
Changed, Game configurations, Thing Categories: a block must have at least one thing category property to be recognized as a thing category.
Changed, Visplane Explorer: the plugin now outputs more info when it fails to initialize vpo.dll.
Cosmetic, Thing Edit window, Doom/Hexen map format: adjusted UI layout so thing flags control no longer displays scrollbars in Hexen map format.
Internal: merged methods from UDMFTools into UniFields, removed UDMFTools.
Updated Inno Setup script (added VC++ 2008 SP1 distributive).
Updated ZDoom_DECORATE.cfg (A_CheckBlock).
Updated documentation (added "System Requirements" page).
2015-10-09 12:38:12 +00:00
else
{
//mxd
General . Interface . DisplayStatus ( StatusType . Warning , "This action requires highlight or selection!" ) ;
}
}
else
{
//mxd
General . Interface . DisplayStatus ( StatusType . Warning , "Copy thing properties first!" ) ;
}
}
//mxd. This pastes the properties with options
[BeginAction("classicpastepropertieswithoptions")]
public void PastePropertiesWithOptions ( )
{
if ( BuilderPlug . Me . CopiedThingProps ! = null )
{
// Determine target things
ICollection < Thing > sel = null ;
if ( General . Map . Map . SelectedThingsCount > 0 ) sel = General . Map . Map . GetSelectedThings ( true ) ;
else if ( highlighted ! = null ) sel = new List < Thing > { highlighted } ;
if ( sel ! = null )
{
PastePropertiesOptionsForm form = new PastePropertiesOptionsForm ( ) ;
Game Configurations: added Vanilla Strife, Vanilla Heretic and Vanilla Hexen game configurations.
Added "makedoorceil" game configuration property. Works the same way as "makedoortrack" and "makedoordoor", but for ceilings of door sectors.
Changed, Game configurations: the editor no longer tries to load DECORATE/MODELDEF/VOXELDEF/GLDEFS/REVERBS lumps when "decorategames" setting is not specified / is set to empty string.
Changed, General interface: "Tools -> Reload MODELDEF/VOXELDEF" and "Tools -> Reload GLDEFS" menu items are no longer shown when current game configuration doesn't support DECORATE.
Fixed a crash when pasting linedef/thing properties in Hexen map format.
Fixed, Visual mode: Visual Thing resources were not fully unloaded when resetting D3D device leading to crash when switching to the editor from a DX-using game engine (like ZDoom) running in fullscreen.
Fixed: in some cases, when current game configuration supported multiple script compilers, it was possible to open/create a map or change map options without selecting any script compiler.
Fixed, New Map Options window: default map name was not updated when switching game configurations.
Fixed: copied map element properties were not reset after switching to another map.
Fixed: stored textures for "Make Door" action were not reset after switching to another map.
Fixed, Game Configurations window: currently selected test engine name was not updated when pasting test engines from another configuration.
Fixed, Game Configurations: all "Heretic in Doom map format" configurations were using Doom sector effects list.
Fixed, Game Configurations: all "Strife in Doom map format" configurations were using Doom sector effects list.
2015-10-21 13:35:42 +00:00
if ( form . Setup ( MapElementType . THING ) & & form . ShowDialog ( General . Interface ) = = DialogResult . OK )
Removed "Paste Properties Options" action.
Added "Paste Properties Special" actions in "Classic" and "Visual" categories. They work the same way as "Paste Special" action.
Added: "Copy Properties", "Paste Properties" and "Paste Properties Special" options are now shown in the Edit menu if current classic mode supports them.
Changed, Paste Properties Special window: only options relevant to current map format are now displayed.
Changed, Paste Properties Special window, UDMF: all UI-managed options are now available.
Fixed: MAPINFO parser was unable to process "include" directives.
Fixed, General interface: selection info was reset to "Nothing selected" after few seconds regardless of current selection.
Fixed, Visual mode: thing bounding boxes were not updated when changing things positions using Randomize mode.
Fixed, Visual mode: event lines were displayed at incorrect height when entering Visual mode for the first time.
Fixed, Texture Browser window: when MixTexturesFlats Game Configuration option is disabled, textures/flats are no longer shown in the Used group when flats/textures with the same names are used in the map.
Fixed(?): probably fixed an exception some users reported when trying to initialize a Classic mode after switching from Visual mode with "Sync cameras" option enabled.
Changed, Game configurations, Thing Categories: a block must have at least one thing category property to be recognized as a thing category.
Changed, Visplane Explorer: the plugin now outputs more info when it fails to initialize vpo.dll.
Cosmetic, Thing Edit window, Doom/Hexen map format: adjusted UI layout so thing flags control no longer displays scrollbars in Hexen map format.
Internal: merged methods from UDMFTools into UniFields, removed UDMFTools.
Updated Inno Setup script (added VC++ 2008 SP1 distributive).
Updated ZDoom_DECORATE.cfg (A_CheckBlock).
Updated documentation (added "System Requirements" page).
2015-10-09 12:38:12 +00:00
{
// Apply properties to selection
string rest = ( sel . Count = = 1 ? "a single thing" : sel . Count + " things" ) ;
General . Map . UndoRedo . CreateUndo ( "Paste properties with options to " + rest ) ;
foreach ( Thing t in sel )
{
BuilderPlug . Me . CopiedThingProps . Apply ( t , true ) ;
t . UpdateConfiguration ( ) ;
}
General . Interface . DisplayStatus ( StatusType . Action , "Pasted properties with options to " + rest + "." ) ;
// Update
General . Map . IsChanged = true ;
General . Map . ThingsFilter . Update ( ) ;
General . Interface . RefreshInfo ( ) ;
2015-12-14 12:34:31 +00:00
//mxd. Update helper lines
UpdateHelperObjects ( ) ;
Removed "Paste Properties Options" action.
Added "Paste Properties Special" actions in "Classic" and "Visual" categories. They work the same way as "Paste Special" action.
Added: "Copy Properties", "Paste Properties" and "Paste Properties Special" options are now shown in the Edit menu if current classic mode supports them.
Changed, Paste Properties Special window: only options relevant to current map format are now displayed.
Changed, Paste Properties Special window, UDMF: all UI-managed options are now available.
Fixed: MAPINFO parser was unable to process "include" directives.
Fixed, General interface: selection info was reset to "Nothing selected" after few seconds regardless of current selection.
Fixed, Visual mode: thing bounding boxes were not updated when changing things positions using Randomize mode.
Fixed, Visual mode: event lines were displayed at incorrect height when entering Visual mode for the first time.
Fixed, Texture Browser window: when MixTexturesFlats Game Configuration option is disabled, textures/flats are no longer shown in the Used group when flats/textures with the same names are used in the map.
Fixed(?): probably fixed an exception some users reported when trying to initialize a Classic mode after switching from Visual mode with "Sync cameras" option enabled.
Changed, Game configurations, Thing Categories: a block must have at least one thing category property to be recognized as a thing category.
Changed, Visplane Explorer: the plugin now outputs more info when it fails to initialize vpo.dll.
Cosmetic, Thing Edit window, Doom/Hexen map format: adjusted UI layout so thing flags control no longer displays scrollbars in Hexen map format.
Internal: merged methods from UDMFTools into UniFields, removed UDMFTools.
Updated Inno Setup script (added VC++ 2008 SP1 distributive).
Updated ZDoom_DECORATE.cfg (A_CheckBlock).
Updated documentation (added "System Requirements" page).
2015-10-09 12:38:12 +00:00
// Redraw
General . Interface . RedrawDisplay ( ) ;
}
}
else
{
General . Interface . DisplayStatus ( StatusType . Warning , "This action requires highlight or selection!" ) ;
}
}
else
{
General . Interface . DisplayStatus ( StatusType . Warning , "Copy thing properties first!" ) ;
2010-08-15 13:45:43 +00:00
}
}
2009-04-19 18:07:22 +00:00
// This clears the selection
[BeginAction("clearselection", BaseAction = true)]
public void ClearSelection ( )
{
// Clear selection
General . Map . Map . ClearAllSelected ( ) ;
2013-12-12 09:07:30 +00:00
//mxd. Clear selection info
General . Interface . DisplayStatus ( StatusType . Selection , string . Empty ) ;
2009-04-19 18:07:22 +00:00
// Redraw
General . Interface . RedrawDisplay ( ) ;
}
// This creates a new thing at the mouse position
[BeginAction("insertitem", BaseAction = true)]
Fixed, Draw Lines/Rectangle/Circle/Curve modes: line length labels displayed incorrect length.
Changed, Drag Linedefs/Vertices/Sectors/Things modes: line length labels are now displayed the same way as in Draw modes.
Changed, Drag Linedefs/Vertices/Sectors/Things modes: "lock movement to cardinal directions" mode (Alt-Shift-Drag) now locks movement in 4 directions instead of 8 and doesn't snap map elements to nearest grid intersections when they are not aligned to it.
Added, Visual mode, GZDoom, DECORATE: FORCEXYBILLBOARD flag is now supported.
Added, Visual mode, GLOOME, DECORATE: FLOORSPRITE, CEILSPRITE, WALLSPRITE, ROLLSPRITE and STICKTOPLANE flags are now supported (implementation is somewhat broken ATM and probably doesn't work the same way as in GLOOME, because Windows build with most these features is nowhere to be found...).
Fixed, Visual mode: in some cases Thing brightness was calculated incorrectly.
Updated ZDoom_DECORATE.cfg.
2015-08-25 22:05:14 +00:00
public void InsertThing ( )
2009-04-19 18:07:22 +00:00
{
// Mouse in window?
if ( mouseinside )
{
// Insert new thing
General . Map . UndoRedo . CreateUndo ( "Insert thing" ) ;
Thing t = InsertThing ( mousemappos ) ;
2010-08-13 18:32:21 +00:00
2015-12-28 15:01:53 +00:00
if ( t = = null )
2010-08-13 18:32:21 +00:00
{
General . Map . UndoRedo . WithdrawUndo ( ) ;
return ;
}
2009-04-19 18:07:22 +00:00
// Edit the thing?
if ( BuilderPlug . Me . EditNewThing )
{
// Redraw screen
General . Interface . RedrawDisplay ( ) ;
2014-02-21 15:24:54 +00:00
General . Interface . ShowEditThings ( new List < Thing > { t } ) ;
2009-04-19 18:07:22 +00:00
}
General . Interface . DisplayStatus ( StatusType . Action , "Inserted a new thing." ) ;
// Update things filter
General . Map . ThingsFilter . Update ( ) ;
2015-12-14 12:34:31 +00:00
//mxd. Update helper lines
UpdateHelperObjects ( ) ;
2015-10-02 14:47:34 +00:00
2009-04-19 18:07:22 +00:00
// Redraw screen
General . Interface . RedrawDisplay ( ) ;
}
}
// This creates a new thing
2014-05-20 09:09:28 +00:00
private static Thing InsertThing ( Vector2D pos )
2009-04-19 18:07:22 +00:00
{
2015-12-14 12:34:31 +00:00
if ( pos . x < General . Map . Config . LeftBoundary | | pos . x > General . Map . Config . RightBoundary | |
pos . y > General . Map . Config . TopBoundary | | pos . y < General . Map . Config . BottomBoundary )
2010-08-13 18:32:21 +00:00
{
General . Interface . DisplayStatus ( StatusType . Warning , "Failed to insert thing: outside of map boundaries." ) ;
return null ;
}
2010-08-15 19:43:00 +00:00
// Create thing
2009-04-19 18:07:22 +00:00
Thing t = General . Map . Map . CreateThing ( ) ;
2010-08-15 19:43:00 +00:00
if ( t ! = null )
{
General . Settings . ApplyDefaultThingSettings ( t ) ;
t . Move ( pos ) ;
t . UpdateConfiguration ( ) ;
2009-04-19 18:07:22 +00:00
2010-08-15 19:43:00 +00:00
// Update things filter so that it includes this thing
General . Map . ThingsFilter . Update ( ) ;
2009-04-19 18:07:22 +00:00
2010-08-15 19:43:00 +00:00
// Snap to grid enabled?
if ( General . Interface . SnapToGrid )
{
// Snap to grid
t . SnapToGrid ( ) ;
}
else
{
// Snap to map format accuracy
t . SnapToAccuracy ( ) ;
}
2009-04-19 18:07:22 +00:00
}
2010-08-15 19:43:00 +00:00
2009-04-19 18:07:22 +00:00
return t ;
}
[BeginAction("deleteitem", BaseAction = true)]
public void DeleteItem ( )
{
// Make list of selected things
List < Thing > selected = new List < Thing > ( General . Map . Map . GetSelectedThings ( true ) ) ;
if ( ( selected . Count = = 0 ) & & ( highlighted ! = null ) & & ! highlighted . IsDisposed ) selected . Add ( highlighted ) ;
// Anything to do?
if ( selected . Count > 0 )
{
// Make undo
if ( selected . Count > 1 )
{
General . Map . UndoRedo . CreateUndo ( "Delete " + selected . Count + " things" ) ;
General . Interface . DisplayStatus ( StatusType . Action , "Deleted " + selected . Count + " things." ) ;
}
else
{
General . Map . UndoRedo . CreateUndo ( "Delete thing" ) ;
General . Interface . DisplayStatus ( StatusType . Action , "Deleted a thing." ) ;
}
2015-11-03 08:54:56 +00:00
DeleteThings ( selected ) ; //mxd
2009-04-19 18:07:22 +00:00
// Update cache values
General . Map . IsChanged = true ;
General . Map . ThingsFilter . Update ( ) ;
2015-12-14 12:34:31 +00:00
//mxd. Update helper lines
UpdateHelperObjects ( ) ;
2015-10-02 14:47:34 +00:00
2009-04-19 18:07:22 +00:00
// Invoke a new mousemove so that the highlighted item updates
MouseEventArgs e = new MouseEventArgs ( MouseButtons . None , 0 , ( int ) mousepos . x , ( int ) mousepos . y , 0 ) ;
OnMouseMove ( e ) ;
// Redraw screen
2015-06-30 18:34:08 +00:00
UpdateSelectionInfo ( ) ; //mxd
2009-04-19 18:07:22 +00:00
General . Interface . RedrawDisplay ( ) ;
}
}
2013-03-18 13:52:27 +00:00
//mxd
[BeginAction("thingaligntowall")]
2014-12-03 23:15:26 +00:00
public void AlignThingsToWall ( )
{
2013-03-18 13:52:27 +00:00
// Make list of selected things
List < Thing > selected = new List < Thing > ( General . Map . Map . GetSelectedThings ( true ) ) ;
if ( ( selected . Count = = 0 ) & & ( highlighted ! = null ) & & ! highlighted . IsDisposed ) selected . Add ( highlighted ) ;
2014-12-03 23:15:26 +00:00
if ( selected . Count = = 0 )
{
2013-03-18 13:52:27 +00:00
General . Interface . DisplayStatus ( StatusType . Warning , "This action requires a selection!" ) ;
return ;
}
List < Thing > toAlign = new List < Thing > ( ) ;
2014-12-03 23:15:26 +00:00
foreach ( Thing t in selected ) if ( t . IsModel ) toAlign . Add ( t ) ;
2013-04-05 12:23:50 +00:00
2014-12-03 23:15:26 +00:00
if ( toAlign . Count = = 0 )
{
2013-04-05 12:23:50 +00:00
General . Interface . DisplayStatus ( StatusType . Warning , "This action only works for things with models!" ) ;
return ;
2013-03-18 13:52:27 +00:00
}
// Make undo
2014-12-03 23:15:26 +00:00
if ( toAlign . Count > 1 )
{
2013-03-18 13:52:27 +00:00
General . Map . UndoRedo . CreateUndo ( "Align " + toAlign . Count + " things" ) ;
General . Interface . DisplayStatus ( StatusType . Action , "Aligned " + toAlign . Count + " things." ) ;
2014-12-03 23:15:26 +00:00
}
else
{
2013-03-18 13:52:27 +00:00
General . Map . UndoRedo . CreateUndo ( "Align thing" ) ;
General . Interface . DisplayStatus ( StatusType . Action , "Aligned a thing." ) ;
}
//align things
int thingsCount = General . Map . Map . Things . Count ;
2014-12-03 23:15:26 +00:00
foreach ( Thing t in toAlign )
{
2013-03-18 13:52:27 +00:00
List < Linedef > excludedLines = new List < Linedef > ( ) ;
2013-12-20 09:24:43 +00:00
bool aligned ;
2013-03-18 13:52:27 +00:00
2014-12-03 23:15:26 +00:00
do
{
2013-03-18 13:52:27 +00:00
Linedef l = General . Map . Map . NearestLinedef ( t . Position , excludedLines ) ;
aligned = Tools . TryAlignThingToLine ( t , l ) ;
2014-12-03 23:15:26 +00:00
if ( ! aligned )
{
2013-03-18 13:52:27 +00:00
excludedLines . Add ( l ) ;
2014-12-03 23:15:26 +00:00
if ( excludedLines . Count = = thingsCount )
{
2013-03-18 13:52:27 +00:00
ThingTypeInfo tti = General . Map . Data . GetThingInfo ( t . Type ) ;
2016-02-22 08:04:06 +00:00
General . ErrorLogger . Add ( ErrorType . Warning , "Unable to align " + tti . Title + " (index " + t . Index + ") to any linedef!" ) ;
2013-03-18 13:52:27 +00:00
aligned = true ;
}
}
} while ( ! aligned ) ;
}
// Update cache values
General . Map . IsChanged = true ;
// Redraw screen
General . Interface . RedrawDisplay ( ) ;
}
2013-04-08 14:37:37 +00:00
[BeginAction("thinglookatcursor")]
2014-12-03 23:15:26 +00:00
public void ThingPointAtCursor ( )
{
2013-04-08 14:37:37 +00:00
// Make list of selected things
List < Thing > selected = new List < Thing > ( General . Map . Map . GetSelectedThings ( true ) ) ;
if ( ( selected . Count = = 0 ) & & ( highlighted ! = null ) & & ! highlighted . IsDisposed )
selected . Add ( highlighted ) ;
2014-12-03 23:15:26 +00:00
if ( selected . Count = = 0 )
{
2013-04-09 10:56:05 +00:00
General . Interface . DisplayStatus ( StatusType . Warning , "This action requires a selection!" ) ;
2013-04-08 14:37:37 +00:00
return ;
}
2013-04-09 10:56:05 +00:00
//check mouse position
2014-12-03 23:15:26 +00:00
if ( ! mousemappos . IsFinite ( ) )
{
2013-04-09 10:56:05 +00:00
awaitingMouseClick = true ;
General . Interface . DisplayStatus ( StatusType . Warning , "Now click in the editing area!" ) ;
2013-04-08 14:37:37 +00:00
return ;
}
2013-04-09 10:56:05 +00:00
awaitingMouseClick = false ;
2013-04-08 14:37:37 +00:00
// Make undo
2014-12-03 23:15:26 +00:00
if ( selected . Count > 1 )
{
2013-04-08 14:37:37 +00:00
General . Map . UndoRedo . CreateUndo ( "Rotate " + selected . Count + " things" ) ;
General . Interface . DisplayStatus ( StatusType . Action , "Rotated " + selected . Count + " things." ) ;
2014-12-03 23:15:26 +00:00
}
else
{
2013-04-08 14:37:37 +00:00
General . Map . UndoRedo . CreateUndo ( "Rotate thing" ) ;
General . Interface . DisplayStatus ( StatusType . Action , "Rotated a thing." ) ;
}
//change angle
2014-12-03 23:15:26 +00:00
if ( General . Interface . CtrlState ) //point away
{
foreach ( Thing t in selected )
{
2013-04-09 10:56:05 +00:00
ThingTypeInfo info = General . Map . Data . GetThingInfo ( t . Type ) ;
if ( info = = null | | info . Category = = null | | info . Category . Arrow = = 0 )
continue ;
2013-04-11 09:27:16 +00:00
t . Rotate ( Vector2D . GetAngle ( mousemappos , t . Position ) + Angle2D . PI ) ;
2013-04-09 10:56:05 +00:00
}
2014-12-03 23:15:26 +00:00
}
else //point at
{
foreach ( Thing t in selected )
{
2013-04-09 10:56:05 +00:00
ThingTypeInfo info = General . Map . Data . GetThingInfo ( t . Type ) ;
if ( info = = null | | info . Category = = null | | info . Category . Arrow = = 0 )
continue ;
t . Rotate ( Vector2D . GetAngle ( mousemappos , t . Position ) ) ;
}
2013-04-08 14:37:37 +00:00
}
2014-04-02 10:57:52 +00:00
// Redraw screen
General . Interface . RedrawDisplay ( ) ;
}
//mxd. rotate clockwise
[BeginAction("rotateclockwise")]
2014-12-03 23:15:26 +00:00
public void RotateCW ( )
{
RotateThings ( - 5 ) ;
2014-04-02 10:57:52 +00:00
}
//mxd. rotate counterclockwise
[BeginAction("rotatecounterclockwise")]
2014-12-03 23:15:26 +00:00
public void RotateCCW ( )
{
RotateThings ( 5 ) ;
2014-04-02 10:57:52 +00:00
}
//mxd
2014-12-03 23:15:26 +00:00
private void RotateThings ( int increment )
{
2014-04-02 10:57:52 +00:00
// Make list of selected things
List < Thing > selected = new List < Thing > ( General . Map . Map . GetSelectedThings ( true ) ) ;
if ( selected . Count = = 0 & & highlighted ! = null & & ! highlighted . IsDisposed )
selected . Add ( highlighted ) ;
2014-12-03 23:15:26 +00:00
if ( selected . Count = = 0 )
{
2014-04-02 10:57:52 +00:00
General . Interface . DisplayStatus ( StatusType . Warning , "This action requires a selection!" ) ;
return ;
}
// Make undo
2014-12-03 23:15:26 +00:00
if ( selected . Count > 1 )
{
Added, Visual mode, UDMF: added "Change Pitch Clockwise", "Change Pitch Counterclockwise", "Change Roll Clockwise" and "Change Roll Counterclockwise" actions.
Added, Visual mode, UDMF: added "Increase Scale" and "Decrease Scale" actions.
Added, Visual mode, UDMF: "Reset Texture Offsets" action now resets scale when used on things.
Added, Visual mode, UDMF: "Reset Local Texture Offsets" action now resets scale, pitch and roll when used on things.
Changed, Visual mode, UDMF: "Reset Texture Offsets" action now only resets texture offsets (previously it also reset texture scale).
Changed, Visual mode, UDMF: "Reset Local Texture Offsets" action now resets texture offsets, scale and brightness of sidedefs and also rotation of floors/ceilings.
Changed, Visual mode, UDMF: thing box arrow now displays pitch and roll for things, which have attached model and appropriate MODELDEF flags.
Changed, Thing Edit Form, UDMF: negative pitch and roll can now be entered.
Updated documentation.
2015-03-30 21:44:04 +00:00
General . Map . UndoRedo . CreateUndo ( "Rotate " + selected . Count + " things" , this , UndoGroup . ThingAngleChange , CreateSelectionCRC ( selected ) ) ;
2014-04-02 10:57:52 +00:00
General . Interface . DisplayStatus ( StatusType . Action , "Rotated " + selected . Count + " things." ) ;
2014-12-03 23:15:26 +00:00
}
else
{
Added, Visual mode, UDMF: added "Change Pitch Clockwise", "Change Pitch Counterclockwise", "Change Roll Clockwise" and "Change Roll Counterclockwise" actions.
Added, Visual mode, UDMF: added "Increase Scale" and "Decrease Scale" actions.
Added, Visual mode, UDMF: "Reset Texture Offsets" action now resets scale when used on things.
Added, Visual mode, UDMF: "Reset Local Texture Offsets" action now resets scale, pitch and roll when used on things.
Changed, Visual mode, UDMF: "Reset Texture Offsets" action now only resets texture offsets (previously it also reset texture scale).
Changed, Visual mode, UDMF: "Reset Local Texture Offsets" action now resets texture offsets, scale and brightness of sidedefs and also rotation of floors/ceilings.
Changed, Visual mode, UDMF: thing box arrow now displays pitch and roll for things, which have attached model and appropriate MODELDEF flags.
Changed, Thing Edit Form, UDMF: negative pitch and roll can now be entered.
Updated documentation.
2015-03-30 21:44:04 +00:00
General . Map . UndoRedo . CreateUndo ( "Rotate thing" , this , UndoGroup . ThingAngleChange , CreateSelectionCRC ( selected ) ) ;
2014-04-02 10:57:52 +00:00
General . Interface . DisplayStatus ( StatusType . Action , "Rotated a thing." ) ;
}
//change angle
foreach ( Thing t in selected ) t . Rotate ( General . ClampAngle ( t . AngleDoom + increment ) ) ;
2013-04-08 14:37:37 +00:00
// Redraw screen
General . Interface . RedrawDisplay ( ) ;
2014-04-02 10:57:52 +00:00
General . Interface . RefreshInfo ( ) ;
2013-04-08 14:37:37 +00:00
}
2014-05-06 11:03:52 +00:00
//mxd
[BeginAction("filterselectedthings")]
2014-12-03 23:15:26 +00:00
public void ShowFilterDialog ( )
{
2014-05-06 11:03:52 +00:00
ICollection < Thing > selection = General . Map . Map . GetSelectedThings ( true ) ;
2015-12-28 15:01:53 +00:00
if ( selection . Count = = 0 )
2014-12-03 23:15:26 +00:00
{
2014-05-06 11:03:52 +00:00
General . Interface . DisplayStatus ( StatusType . Warning , "This action requires a selection!" ) ;
return ;
}
2014-05-08 09:24:32 +00:00
new FilterSelectedThingsForm ( selection , this ) . ShowDialog ( ) ;
}
//mxd
[BeginAction("selectsimilar")]
2014-12-03 23:15:26 +00:00
public void SelectSimilar ( )
{
2014-05-08 09:24:32 +00:00
ICollection < Thing > selection = General . Map . Map . GetSelectedThings ( true ) ;
2014-12-03 23:15:26 +00:00
if ( selection . Count = = 0 )
{
2014-05-08 09:24:32 +00:00
General . Interface . DisplayStatus ( StatusType . Warning , "This action requires a selection!" ) ;
return ;
}
var form = new SelectSimilarElementOptionsPanel ( ) ;
2015-12-28 15:01:53 +00:00
if ( form . Setup ( this ) ) form . ShowDialog ( ) ;
2014-05-06 11:03:52 +00:00
}
2009-04-19 18:07:22 +00:00
#endregion
}
}