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 ;
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
using System.Drawing ;
2009-04-19 18:07:22 +00:00
using CodeImp.DoomBuilder.Config ;
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
using CodeImp.DoomBuilder.Geometry ;
using CodeImp.DoomBuilder.GZBuilder.Data ;
2009-04-19 18:07:22 +00:00
using CodeImp.DoomBuilder.IO ;
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
using CodeImp.DoomBuilder.Rendering ;
2015-05-30 10:26:16 +00:00
using CodeImp.DoomBuilder.Types ;
2009-04-19 18:07:22 +00:00
using CodeImp.DoomBuilder.VisualModes ;
2018-02-03 20:31:34 +00:00
using CodeImp.DoomBuilder.GZBuilder ;
2009-04-19 18:07:22 +00:00
#endregion
namespace CodeImp.DoomBuilder.Map
{
2016-04-09 23:18:39 +00:00
public sealed class Thing : SelectableElement , ITaggedMapElement
2009-04-19 18:07:22 +00:00
{
#region = = = = = = = = = = = = = = = = = = Constants
2022-12-30 16:53:17 +00:00
public const int NUM_ARGS = 10 ;
2022-12-30 17:37:26 +00:00
public const int NUM_STRING_ARGS = 2 ;
2016-07-11 22:13:43 +00:00
public static readonly HashSet < ThingRenderMode > AlignableRenderModes = new HashSet < ThingRenderMode >
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
{
2016-07-04 18:25:47 +00:00
ThingRenderMode . FLATSPRITE , ThingRenderMode . WALLSPRITE , ThingRenderMode . MODEL
} ;
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
#endregion
2009-04-19 18:07:22 +00:00
#region = = = = = = = = = = = = = = = = = = Variables
// Map
private MapSet map ;
// Sector
2014-02-21 14:42:12 +00:00
private Sector sector ;
2009-04-19 18:07:22 +00:00
// List items
private LinkedListNode < Thing > selecteditem ;
// Properties
private int type ;
2018-02-03 20:31:34 +00:00
private GZGeneral . LightData dynamiclighttype ;
2009-04-19 18:07:22 +00:00
private Vector3D pos ;
2010-10-05 08:31:27 +00:00
private int angledoom ; // Angle as entered / stored in file
2020-05-18 16:14:54 +00:00
private double anglerad ; // Angle in radians
2009-04-19 18:07:22 +00:00
private Dictionary < string , bool > flags ;
private int tag ;
private int action ;
private int [ ] args ;
2020-05-21 12:20:02 +00:00
private double scaleX ; //mxd
private double scaleY ; //mxd
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
private SizeF spritescale ; //mxd
private int pitch ; //mxd. Used in model rendering
private int roll ; //mxd. Used in model rendering
2020-05-18 16:14:54 +00:00
private double pitchrad ; //mxd
private double rollrad ; //mxd
2015-08-03 22:02:39 +00:00
private bool highlighted ; //mxd
2009-04-19 18:07:22 +00:00
2016-07-04 18:25:47 +00:00
//mxd. GZDoom rendering properties
private ThingRenderMode rendermode ;
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 bool rollsprite ; //mxd
2009-04-19 18:07:22 +00:00
// Configuration
private float size ;
2019-09-05 10:37:31 +00:00
private float rendersize ;
2015-05-30 10:26:16 +00:00
private float height ; //mxd
2009-04-19 18:07:22 +00:00
private PixelColor color ;
private bool fixedsize ;
2013-11-27 12:45:28 +00:00
private bool directional ; //mxd. If true, we need to render an arrow
2009-04-19 18:07:22 +00:00
2021-06-03 10:02:51 +00:00
// biwa. This should only ever be used for temporary player starts for the "test from current position" action
private bool recordundo ;
2019-12-21 04:43:16 +00:00
// Rendering
private int lastProcessed ;
#endregion
2009-04-19 18:07:22 +00:00
2019-12-21 04:43:16 +00:00
#region = = = = = = = = = = = = = = = = = = Properties
2009-04-19 18:07:22 +00:00
2019-12-21 04:43:16 +00:00
public MapSet Map { get { return map ; } }
2014-12-22 21:36:49 +00:00
public int Type { get { return type ; } set { BeforePropsChange ( ) ; type = value ; } } //mxd
2018-02-03 20:31:34 +00:00
public GZGeneral . LightData DynamicLightType { get { return dynamiclighttype ; } internal set { BeforePropsChange ( ) ; dynamiclighttype = value ; } }
2009-04-19 18:07:22 +00:00
public Vector3D Position { get { return pos ; } }
2020-05-21 12:20:02 +00:00
public double ScaleX { get { return scaleX ; } } //mxd. This is UDMF property, not actual scale!
public double ScaleY { get { return scaleY ; } } //mxd. This is UDMF property, not actual scale!
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
public int Pitch { get { return pitch ; } } //mxd
2020-05-18 16:14:54 +00:00
public double PitchRad { get { return pitchrad ; } }
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
public int Roll { get { return roll ; } } //mxd
2020-05-18 16:14:54 +00:00
public double RollRad { get { return rollrad ; } }
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
public SizeF ActorScale { get { return spritescale ; } } //mxd. Actor scale set in DECORATE
2020-05-18 16:14:54 +00:00
public double Angle { get { return anglerad ; } }
2010-10-05 08:31:27 +00:00
public int AngleDoom { get { return angledoom ; } }
2009-06-11 21:21:20 +00:00
internal Dictionary < string , bool > Flags { get { return flags ; } }
public int Action { get { return action ; } set { BeforePropsChange ( ) ; action = value ; } }
2009-04-19 18:07:22 +00:00
public int [ ] Args { get { return args ; } }
public float Size { get { return size ; } }
2019-09-05 10:37:31 +00:00
public float RenderSize { get { return rendersize ; } }
2015-05-30 10:26:16 +00:00
public float Height { get { return height ; } } //mxd
2009-04-19 18:07:22 +00:00
public PixelColor Color { get { return color ; } }
public bool FixedSize { get { return fixedsize ; } }
2009-06-11 21:21:20 +00:00
public int Tag { get { return tag ; } set { BeforePropsChange ( ) ; tag = value ; if ( ( tag < General . Map . FormatInterface . MinTag ) | | ( tag > General . Map . FormatInterface . MaxTag ) ) throw new ArgumentOutOfRangeException ( "Tag" , "Invalid tag number" ) ; } }
2009-04-19 18:07:22 +00:00
public Sector Sector { get { return sector ; } }
2016-07-04 18:25:47 +00:00
public ThingRenderMode RenderMode { get { return rendermode ; } } //mxd
2013-11-27 12:45:28 +00:00
public bool IsDirectional { get { return directional ; } } //mxd
2015-08-03 22:02:39 +00:00
public bool Highlighted { get { return highlighted ; } set { highlighted = value ; } } //mxd
2019-12-21 04:43:16 +00:00
internal int LastProcessed { get { return lastProcessed ; } set { lastProcessed = value ; } }
2023-06-10 14:08:38 +00:00
public bool Flip { get { return General . Map . UDMF & & IsFlagSet ( "flip" ) ; } }
public bool AbsoluteZ { get { return General . Map . UDMF & & IsFlagSet ( "absolutez" ) ; } }
public bool IsFlipped
{
get
{
ThingTypeInfo ti = General . Map . Data . GetThingInfo ( Type ) ;
return ti . Hangs ^ Flip ;
}
}
2009-04-19 18:07:22 +00:00
2023-06-10 14:08:38 +00:00
#endregion
2009-04-19 18:07:22 +00:00
2023-06-10 14:08:38 +00:00
#region = = = = = = = = = = = = = = = = = = Constructor / Disposer
2009-04-19 18:07:22 +00:00
2023-06-10 14:08:38 +00:00
// Constructor
internal Thing ( MapSet map , int listindex , bool recordundo = true )
2009-04-19 18:07:22 +00:00
{
// Initialize
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
this . elementtype = MapElementType . THING ; //mxd
2009-04-19 18:07:22 +00:00
this . map = map ;
2009-06-05 19:03:56 +00:00
this . listindex = listindex ;
2014-02-26 14:11:06 +00:00
this . flags = new Dictionary < string , bool > ( StringComparer . Ordinal ) ;
2009-04-19 18:07:22 +00:00
this . args = new int [ NUM_ARGS ] ;
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
this . scaleX = 1.0f ;
this . scaleY = 1.0f ;
this . spritescale = new SizeF ( 1.0f , 1.0f ) ;
2021-06-03 10:02:51 +00:00
this . recordundo = recordundo ;
2009-04-19 18:07:22 +00:00
2021-06-03 10:02:51 +00:00
if ( map = = General . Map . Map & & recordundo )
2009-06-11 21:21:20 +00:00
General . Map . UndoRedo . RecAddThing ( this ) ;
2009-04-19 18:07:22 +00:00
// We have no destructor
GC . SuppressFinalize ( this ) ;
}
// Disposer
public override void Dispose ( )
{
// Not already disposed?
if ( ! isdisposed )
{
2021-06-03 10:02:51 +00:00
if ( map = = General . Map . Map & & recordundo )
2009-06-11 21:21:20 +00:00
General . Map . UndoRedo . RecRemThing ( this ) ;
2009-04-19 18:07:22 +00:00
// Remove from main list
2009-06-05 19:03:56 +00:00
map . RemoveThing ( listindex ) ;
2009-04-19 18:07:22 +00:00
// Clean up
map = null ;
sector = null ;
// Dispose base
base . Dispose ( ) ;
}
}
#endregion
#region = = = = = = = = = = = = = = = = = = Management
2009-06-11 21:21:20 +00:00
// Call this before changing properties
protected override void BeforePropsChange ( )
{
if ( map = = General . Map . Map )
General . Map . UndoRedo . RecPrpThing ( this ) ;
}
2009-04-19 18:07:22 +00:00
// Serialize / deserialize
2013-03-18 13:52:27 +00:00
new internal void ReadWrite ( IReadWriteStream s )
2009-04-19 18:07:22 +00:00
{
2009-06-11 21:21:20 +00:00
if ( ! s . IsWriting ) BeforePropsChange ( ) ;
2009-04-19 18:07:22 +00:00
base . ReadWrite ( s ) ;
if ( s . IsWriting )
{
s . wInt ( flags . Count ) ;
foreach ( KeyValuePair < string , bool > f in flags )
{
s . wString ( f . Key ) ;
s . wBool ( f . Value ) ;
}
}
else
{
int c ; s . rInt ( out c ) ;
2014-02-26 14:11:06 +00:00
flags = new Dictionary < string , bool > ( c , StringComparer . Ordinal ) ;
2009-04-19 18:07:22 +00:00
for ( int i = 0 ; i < c ; i + + )
{
string t ; s . rString ( out t ) ;
bool b ; s . rBool ( out b ) ;
flags . Add ( t , b ) ;
}
}
2010-10-05 08:31:27 +00:00
2009-04-19 18:07:22 +00:00
s . rwInt ( ref type ) ;
s . rwVector3D ( ref pos ) ;
2010-10-05 08:31:27 +00:00
s . rwInt ( ref angledoom ) ;
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
s . rwInt ( ref pitch ) ; //mxd
s . rwInt ( ref roll ) ; //mxd
2020-05-21 12:20:02 +00:00
s . rwDouble ( ref scaleX ) ; //mxd
s . rwDouble ( ref scaleY ) ; //mxd
2009-04-19 18:07:22 +00:00
s . rwInt ( ref tag ) ;
s . rwInt ( ref action ) ;
2022-12-28 22:04:32 +00:00
for ( int i = 0 ; i < args . Length ; i + + ) s . rwInt ( ref args [ i ] ) ;
2013-07-29 08:50:50 +00:00
2014-12-03 23:15:26 +00:00
if ( ! s . IsWriting )
{
2010-10-05 08:31:27 +00:00
anglerad = Angle2D . DoomToReal ( angledoom ) ;
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
UpdateCache ( ) ; //mxd
2013-07-29 08:50:50 +00:00
}
2009-04-19 18:07:22 +00:00
}
// This copies all properties to another thing
public void CopyPropertiesTo ( Thing t )
{
2009-06-11 21:21:20 +00:00
t . BeforePropsChange ( ) ;
2009-04-19 18:07:22 +00:00
// Copy properties
t . type = type ;
2017-03-01 22:21:08 +00:00
t . dynamiclighttype = dynamiclighttype ;
2010-10-05 08:31:27 +00:00
t . anglerad = anglerad ;
t . angledoom = angledoom ;
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
t . roll = roll ; //mxd
t . pitch = pitch ; //mxd
t . rollrad = rollrad ; //mxd
t . pitchrad = pitchrad ; //mxd
t . scaleX = scaleX ; //mxd
t . scaleY = scaleY ; //mxd
t . spritescale = spritescale ; //mxd
2009-04-19 18:07:22 +00:00
t . pos = pos ;
t . flags = new Dictionary < string , bool > ( flags ) ;
t . tag = tag ;
t . action = action ;
t . args = ( int [ ] ) args . Clone ( ) ;
t . size = size ;
2019-09-05 10:37:31 +00:00
t . rendersize = rendersize ;
2015-05-30 10:26:16 +00:00
t . height = height ; //mxd
2009-04-19 18:07:22 +00:00
t . color = color ;
2013-11-27 12:45:28 +00:00
t . directional = directional ;
2009-04-19 18:07:22 +00:00
t . fixedsize = fixedsize ;
2016-07-04 18:25:47 +00:00
t . rendermode = rendermode ; //mxd
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
t . rollsprite = rollsprite ; //mxd
2012-04-17 19:13:47 +00:00
2009-04-19 18:07:22 +00:00
base . CopyPropertiesTo ( t ) ;
}
// This determines which sector the thing is in and links it
public void DetermineSector ( )
{
2012-06-07 01:06:37 +00:00
//mxd
2013-09-11 09:47:53 +00:00
sector = map . GetSectorByCoordinates ( pos ) ;
2009-04-19 18:07:22 +00:00
}
2020-06-21 10:52:36 +00:00
/// <summary>
/// Determines what sector a thing is in, given a blockmap
/// </summary>
/// <param name="blockmap">The blockmap to use</param>
public void DetermineSector ( BlockMap < BlockEntry > blockmap )
{
BlockEntry be = blockmap . GetBlockAt ( pos ) ;
2021-04-05 17:15:14 +00:00
List < Sector > sectors = new List < Sector > ( 1 ) ;
2020-06-21 10:52:36 +00:00
foreach ( Sector s in be . Sectors )
if ( s . Intersect ( pos ) )
2021-04-05 17:15:14 +00:00
sectors . Add ( s ) ;
if ( sectors . Count = = 0 )
{
sector = null ;
}
2021-04-09 05:26:15 +00:00
else if ( sectors . Count = = 1 )
2021-04-05 17:15:14 +00:00
{
sector = sectors [ 0 ] ;
}
else
{
// Having multiple intersections indicates that there are self-referencing sectors in this spot.
// In this case we have to check which side of the nearest linedef pos is on, and then use that sector
HashSet < Linedef > linedefs = new HashSet < Linedef > ( sectors [ 0 ] . Sidedefs . Count * sectors . Count ) ;
foreach ( Sector s in sectors )
foreach ( Sidedef sd in s . Sidedefs )
linedefs . Add ( sd . Line ) ;
Linedef nearest = MapSet . NearestLinedef ( linedefs , pos ) ;
double d = nearest . SideOfLine ( pos ) ;
if ( d < = 0.0 & & nearest . Front ! = null )
sector = nearest . Front . Sector ;
else if ( nearest . Back ! = null )
sector = nearest . Back . Sector ;
else
sector = null ;
}
2020-06-21 10:52:36 +00:00
}
2009-04-19 18:07:22 +00:00
// This determines which sector the thing is in and links it
public void DetermineSector ( VisualBlockMap blockmap )
{
2021-04-05 17:15:14 +00:00
sector = blockmap . GetSectorAt ( pos ) ;
2009-04-19 18:07:22 +00:00
}
// This translates the flags into UDMF fields
internal void TranslateToUDMF ( )
{
// First make a single integer with all flags
int bits = 0 ;
2014-02-21 14:42:12 +00:00
int flagbit ;
2009-04-19 18:07:22 +00:00
foreach ( KeyValuePair < string , bool > f in flags )
if ( int . TryParse ( f . Key , out flagbit ) & & f . Value ) bits | = flagbit ;
// Now make the new flags
flags . Clear ( ) ;
foreach ( FlagTranslation f in General . Map . Config . ThingFlagsTranslation )
{
// Flag found in bits?
if ( ( bits & f . Flag ) = = f . Flag )
{
// Add fields and remove bits
bits & = ~ f . Flag ;
for ( int i = 0 ; i < f . Fields . Count ; i + + )
flags [ f . Fields [ i ] ] = f . FieldValues [ i ] ;
}
else
{
// Add fields with inverted value
for ( int i = 0 ; i < f . Fields . Count ; i + + )
flags [ f . Fields [ i ] ] = ! f . FieldValues [ i ] ;
}
}
}
// This translates UDMF fields back into the normal flags
internal void TranslateFromUDMF ( )
{
2014-09-16 20:26:42 +00:00
//mxd. Clear UDMF-related properties
this . Fields . Clear ( ) ;
scaleX = 1.0f ;
scaleY = 1.0f ;
pitch = 0 ;
pitchrad = 0 ;
roll = 0 ;
rollrad = 0 ;
2009-04-19 18:07:22 +00:00
// Make copy of the flags
Dictionary < string , bool > oldfields = new Dictionary < string , bool > ( flags ) ;
// Make the flags
flags . Clear ( ) ;
foreach ( KeyValuePair < string , string > f in General . Map . Config . ThingFlags )
{
// Flag must be numeric
2014-02-21 14:42:12 +00:00
int flagbit ;
2009-04-19 18:07:22 +00:00
if ( int . TryParse ( f . Key , out flagbit ) )
{
foreach ( FlagTranslation ft in General . Map . Config . ThingFlagsTranslation )
{
if ( ft . Flag = = flagbit )
{
// Only set this flag when the fields match
bool fieldsmatch = true ;
for ( int i = 0 ; i < ft . Fields . Count ; i + + )
{
if ( ! oldfields . ContainsKey ( ft . Fields [ i ] ) | | ( oldfields [ ft . Fields [ i ] ] ! = ft . FieldValues [ i ] ) )
{
fieldsmatch = false ;
break ;
}
}
// Field match? Then add the flag.
if ( fieldsmatch )
{
flags . Add ( f . Key , true ) ;
break ;
}
}
}
}
}
}
// Selected
protected override void DoSelect ( )
{
base . DoSelect ( ) ;
selecteditem = map . SelectedThings . AddLast ( this ) ;
}
// Deselect
protected override void DoUnselect ( )
{
base . DoUnselect ( ) ;
if ( selecteditem . List ! = null ) selecteditem . List . Remove ( selecteditem ) ;
selecteditem = null ;
}
#endregion
#region = = = = = = = = = = = = = = = = = = Changes
// This moves the thing
// NOTE: This does not update sector! (call DetermineSector)
public void Move ( Vector3D newpos )
{
2021-10-24 22:32:10 +00:00
if ( newpos ! = pos )
{
BeforePropsChange ( ) ;
// Change position
this . pos = newpos ;
if ( type ! = General . Map . Config . Start3DModeThingType )
General . Map . IsChanged = true ;
}
2009-04-19 18:07:22 +00:00
}
// This moves the thing
// NOTE: This does not update sector! (call DetermineSector)
public void Move ( Vector2D newpos )
{
2021-10-24 22:32:10 +00:00
Vector3D p = new Vector3D ( newpos . x , newpos . y , pos . z ) ;
if ( p ! = pos )
{
BeforePropsChange ( ) ;
// Change position
this . pos = p ;
if ( type ! = General . Map . Config . Start3DModeThingType )
General . Map . IsChanged = true ;
}
2009-04-19 18:07:22 +00:00
}
// This moves the thing
// NOTE: This does not update sector! (call DetermineSector)
2020-05-18 16:14:54 +00:00
public void Move ( double x , double y , double zoffset )
2009-04-19 18:07:22 +00:00
{
2021-10-24 22:32:10 +00:00
Move ( new Vector3D ( x , y , zoffset ) ) ;
2009-04-19 18:07:22 +00:00
}
// This rotates the thing
2020-05-18 16:14:54 +00:00
public void Rotate ( double newangle )
2009-04-19 18:07:22 +00:00
{
2009-06-11 21:21:20 +00:00
BeforePropsChange ( ) ;
2009-04-19 18:07:22 +00:00
// Change angle
2010-10-05 08:31:27 +00:00
this . anglerad = newangle ;
this . angledoom = Angle2D . RealToDoom ( newangle ) ;
if ( type ! = General . Map . Config . Start3DModeThingType )
General . Map . IsChanged = true ;
}
// This rotates the thing
public void Rotate ( int newangle )
{
BeforePropsChange ( ) ;
// Change angle
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
anglerad = Angle2D . DoomToReal ( newangle ) ;
angledoom = newangle ;
2010-09-09 15:12:31 +00:00
if ( type ! = General . Map . Config . Start3DModeThingType )
General . Map . IsChanged = true ;
2009-04-19 18:07:22 +00:00
}
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
//mxd
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
public void SetPitch ( int newpitch )
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
{
BeforePropsChange ( ) ;
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
pitch = General . ClampAngle ( newpitch ) ;
2016-07-17 23:07:58 +00:00
2017-05-29 03:38:11 +00:00
switch ( rendermode )
2016-07-17 23:07:58 +00:00
{
case ThingRenderMode . MODEL :
2020-05-18 16:14:54 +00:00
double pmult = General . Map . Config . BuggyModelDefPitch ? 1 : - 1 ;
2017-05-29 03:38:11 +00:00
ModelData md = General . Map . Data . ModeldefEntries [ type ] ;
if ( md . InheritActorPitch | | md . UseActorPitch )
pitchrad = Angle2D . DegToRad ( pmult * ( md . InheritActorPitch ? - pitch : pitch ) ) ;
else
pitchrad = 0 ;
2016-07-17 23:07:58 +00:00
break ;
case ThingRenderMode . FLATSPRITE :
pitchrad = Angle2D . DegToRad ( pitch ) ;
break ;
default :
pitchrad = 0 ;
break ;
}
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
2015-12-28 15:01:53 +00:00
if ( type ! = General . Map . Config . Start3DModeThingType )
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
General . Map . IsChanged = true ;
}
//mxd
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
public void SetRoll ( int newroll )
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
{
BeforePropsChange ( ) ;
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
roll = General . ClampAngle ( newroll ) ;
2016-07-17 00:00:29 +00:00
rollrad = ( ( rollsprite | | ( rendermode = = ThingRenderMode . MODEL & & General . Map . Data . ModeldefEntries [ type ] . UseActorRoll ) )
2016-07-04 18:25:47 +00:00
? Angle2D . DegToRad ( roll ) : 0 ) ;
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
2015-12-28 15:01:53 +00:00
if ( type ! = General . Map . Config . Start3DModeThingType )
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
General . Map . IsChanged = true ;
}
//mxd
2020-05-21 12:20:02 +00:00
public void SetScale ( double scalex , double scaley )
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
{
BeforePropsChange ( ) ;
scaleX = scalex ;
scaleY = scaley ;
2015-12-28 15:01:53 +00:00
if ( type ! = General . Map . Config . Start3DModeThingType )
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
General . Map . IsChanged = true ;
}
2009-04-19 18:07:22 +00:00
// This updates all properties
// NOTE: This does not update sector! (call DetermineSector)
2020-05-22 19:39:18 +00:00
public void Update ( int type , double x , double y , double zoffset , int angle , int pitch , int roll , double scaleX , double scaleY ,
2009-04-19 18:07:22 +00:00
Dictionary < string , bool > flags , int tag , int action , int [ ] args )
{
// Apply changes
this . type = type ;
2010-10-05 08:31:27 +00:00
this . anglerad = Angle2D . DoomToReal ( angle ) ;
this . angledoom = angle ;
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
this . pitch = pitch ; //mxd
this . roll = roll ; //mxd
this . scaleX = ( scaleX = = 0 ? 1.0f : scaleX ) ; //mxd
this . scaleY = ( scaleY = = 0 ? 1.0f : scaleY ) ; //mxd
2009-04-19 18:07:22 +00:00
this . flags = new Dictionary < string , bool > ( flags ) ;
this . tag = tag ;
this . action = action ;
this . args = new int [ NUM_ARGS ] ;
args . CopyTo ( this . args , 0 ) ;
this . Move ( x , y , zoffset ) ;
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
UpdateCache ( ) ; //mxd
2009-04-19 18:07:22 +00:00
}
// This updates the settings from configuration
public void UpdateConfiguration ( )
{
// Lookup settings
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
ThingTypeInfo ti = General . Map . Data . GetThingInfo ( type ) ;
2017-03-01 22:21:08 +00:00
// Apply size
2018-02-03 20:31:34 +00:00
dynamiclighttype = GZGeneral . GetGZLightTypeByClass ( ti . Actor ) ;
if ( dynamiclighttype = = null )
dynamiclighttype = ti . DynamicLightType ;
//General.ErrorLogger.Add(ErrorType.Warning, string.Format("thing dynamiclighttype is {0}; class is {1}", dynamiclighttype, ti.Actor.ClassName));
2009-04-19 18:07:22 +00:00
size = ti . Radius ;
2019-09-05 10:37:31 +00:00
rendersize = ti . RenderRadius ;
2015-05-30 10:26:16 +00:00
height = ti . Height ; //mxd
2009-04-19 18:07:22 +00:00
fixedsize = ti . FixedSize ;
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
spritescale = ti . SpriteScale ; //mxd
2015-05-30 10:26:16 +00:00
//mxd. Apply radius and height overrides?
for ( int i = 0 ; i < ti . Args . Length ; i + + )
{
2015-05-31 21:11:21 +00:00
if ( ti . Args [ i ] = = null ) continue ;
2015-05-30 10:26:16 +00:00
if ( ti . Args [ i ] . Type = = ( int ) UniversalType . ThingRadius & & args [ i ] > 0 )
size = args [ i ] ;
else if ( ti . Args [ i ] . Type = = ( int ) UniversalType . ThingHeight & & args [ i ] > 0 )
height = args [ i ] ;
}
2009-04-19 18:07:22 +00:00
// Color valid?
if ( ( ti . Color > = 0 ) & & ( ti . Color < ColorCollection . NUM_THING_COLORS ) )
{
// Apply color
color = General . Colors . Colors [ ti . Color + ColorCollection . THING_COLORS_OFFSET ] ;
}
else
{
// Unknown thing color
color = General . Colors . Colors [ ColorCollection . THING_COLORS_OFFSET ] ;
}
2013-11-27 12:45:28 +00:00
directional = ti . Arrow ; //mxd
2016-07-04 18:25:47 +00:00
rendermode = ti . RenderMode ; //mxd
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
rollsprite = ti . RollSprite ; //mxd
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
UpdateCache ( ) ; //mxd
}
2016-07-04 18:25:47 +00:00
//mxd. This checks if the thing has model override and whether pitch/roll values should be used
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
internal void UpdateCache ( )
{
2016-07-04 18:25:47 +00:00
if ( General . Map . Data = = null ) return ;
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
2016-07-04 18:25:47 +00:00
// Check if the thing has model override
if ( General . Map . Data . ModeldefEntries . ContainsKey ( type ) )
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
{
2016-07-11 22:13:43 +00:00
ModelData md = General . Map . Data . ModeldefEntries [ type ] ;
if ( ( md . LoadState = = ModelLoadState . None & & General . Map . Data . ProcessModel ( type ) ) | | md . LoadState ! = ModelLoadState . None )
rendermode = ( General . Map . Data . ModeldefEntries [ type ] . IsVoxel ? ThingRenderMode . VOXEL : ThingRenderMode . MODEL ) ;
2017-03-04 00:13:39 +00:00
}
else // reset rendermode if we SUDDENLY became a sprite out of a model. otherwise it crashes violently.
{
ThingTypeInfo ti = General . Map . Data . GetThingInfo ( Type ) ;
rendermode = ( ti ! = null ) ? ti . RenderMode : ThingRenderMode . NORMAL ;
}
2016-07-04 18:25:47 +00:00
// Update radian versions of pitch and roll
switch ( rendermode )
2014-12-03 23:15:26 +00:00
{
2016-07-04 18:25:47 +00:00
case ThingRenderMode . MODEL :
2017-05-29 03:38:11 +00:00
float pmult = General . Map . Config . BuggyModelDefPitch ? 1 : - 1 ;
ModelData md = General . Map . Data . ModeldefEntries [ type ] ;
2016-07-17 00:00:29 +00:00
rollrad = ( md . UseActorRoll ? Angle2D . DegToRad ( roll ) : 0 ) ;
2017-05-29 03:38:11 +00:00
pitchrad = ( ( md . InheritActorPitch | | md . UseActorPitch ) ? Angle2D . DegToRad ( pmult * ( md . InheritActorPitch ? - pitch : pitch ) ) : 0 ) ;
2016-07-04 18:25:47 +00:00
break ;
case ThingRenderMode . FLATSPRITE :
2016-10-04 21:02:43 +00:00
rollrad = Angle2D . DegToRad ( roll ) ;
2016-07-04 18:25:47 +00:00
pitchrad = Angle2D . DegToRad ( pitch ) ;
break ;
case ThingRenderMode . WALLSPRITE :
2016-10-04 21:02:43 +00:00
rollrad = Angle2D . DegToRad ( roll ) ;
pitchrad = 0 ;
break ;
2016-07-04 18:25:47 +00:00
case ThingRenderMode . NORMAL :
rollrad = ( rollsprite ? Angle2D . DegToRad ( roll ) : 0 ) ;
pitchrad = 0 ;
break ;
2016-07-11 22:13:43 +00:00
case ThingRenderMode . VOXEL :
rollrad = 0 ;
pitchrad = 0 ;
break ;
2016-07-04 18:25:47 +00:00
default : throw new NotImplementedException ( "Unknown ThingRenderMode" ) ;
Model rendering (all modes): UDMF scale, pitch and roll are now displayed.
Thing Edit Form, UDMF: added controls for setting pitch, roll, scale, render style, fill color, alpha, health and score.
Visual mode, UDMF: UDMF scale is now applied when rendering sprites.
Added Thing Statistics form (Edit -> View Thing Types...), which shows all loaded thing types with some additional info.
Visual mode: sprites with negative ScaleX and positive ScaleY were not rendered properly.
Classic modes: display was not updated after loading a sprite.
Current testing engine change was not saved on closing the program when no other game configuration settings were changed.
2014-04-30 10:01:22 +00:00
}
2009-04-19 18:07:22 +00:00
}
#endregion
#region = = = = = = = = = = = = = = = = = = Methods
2009-06-11 21:21:20 +00:00
// This checks and returns a flag without creating it
public bool IsFlagSet ( string flagname )
{
2016-07-04 18:25:47 +00:00
return flags . ContainsKey ( flagname ) & & flags [ flagname ] ;
2009-06-11 21:21:20 +00:00
}
// This sets a flag
public void SetFlag ( string flagname , bool value )
{
if ( ! flags . ContainsKey ( flagname ) | | ( IsFlagSet ( flagname ) ! = value ) )
{
BeforePropsChange ( ) ;
2009-04-19 18:07:22 +00:00
2009-06-11 21:21:20 +00:00
flags [ flagname ] = value ;
}
}
// This returns a copy of the flags dictionary
public Dictionary < string , bool > GetFlags ( )
{
return new Dictionary < string , bool > ( flags ) ;
}
2016-06-15 22:57:39 +00:00
//mxd. This returns enabled flags
public HashSet < string > GetEnabledFlags ( )
{
HashSet < string > result = new HashSet < string > ( ) ;
foreach ( KeyValuePair < string , bool > group in flags )
if ( group . Value ) result . Add ( group . Key ) ;
return result ;
}
2009-06-11 21:21:20 +00:00
// This clears all flags
public void ClearFlags ( )
{
BeforePropsChange ( ) ;
flags . Clear ( ) ;
}
2009-04-19 18:07:22 +00:00
// This snaps the vertex to the grid
public void SnapToGrid ( )
{
// Calculate nearest grid coordinates
2014-02-21 14:42:12 +00:00
this . Move ( General . Map . Grid . SnappedToGrid ( pos ) ) ;
2009-04-19 18:07:22 +00:00
}
// This snaps the vertex to the map format accuracy
public void SnapToAccuracy ( )
2015-06-19 19:19:41 +00:00
{
SnapToAccuracy ( true ) ;
}
// This snaps the vertex to the map format accuracy
public void SnapToAccuracy ( bool usepreciseposition )
2009-04-19 18:07:22 +00:00
{
// Round the coordinates
2020-05-22 19:39:18 +00:00
Vector3D newpos = new Vector3D ( Math . Round ( pos . x , ( usepreciseposition ? General . Map . FormatInterface . VertexDecimals : 0 ) ) ,
Math . Round ( pos . y , ( usepreciseposition ? General . Map . FormatInterface . VertexDecimals : 0 ) ) ,
Math . Round ( pos . z , ( usepreciseposition ? General . Map . FormatInterface . VertexDecimals : 0 ) ) ) ;
2009-04-19 18:07:22 +00:00
this . Move ( newpos ) ;
}
// This returns the distance from given coordinates
2020-05-18 16:14:54 +00:00
public double DistanceToSq ( Vector2D p )
2009-04-19 18:07:22 +00:00
{
return Vector2D . DistanceSq ( p , pos ) ;
}
// This returns the distance from given coordinates
2020-05-18 16:14:54 +00:00
public double DistanceTo ( Vector2D p )
2009-04-19 18:07:22 +00:00
{
return Vector2D . Distance ( p , pos ) ;
}
2023-06-09 09:17:01 +00:00
/// <summary>
/// Changes the thing's index to a new index.
/// </summary>
/// <param name="newindex">The new index to set</param>
public void ChangeIndex ( int newindex )
{
General . Map . UndoRedo . RecIndexThing ( Index , newindex ) ;
map ? . ChangeThingIndex ( Index , newindex ) ;
}
2009-04-19 18:07:22 +00:00
#endregion
}
}