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 ;
2014-10-20 12:16:51 +00:00
using CodeImp.DoomBuilder.Config ;
2009-04-19 18:07:22 +00:00
using CodeImp.DoomBuilder.Data ;
2015-05-27 12:38:03 +00:00
using CodeImp.DoomBuilder.Geometry ;
2013-04-11 11:04:16 +00:00
using CodeImp.DoomBuilder.GZBuilder.Data ; //mxd
2015-05-27 12:38:03 +00:00
using CodeImp.DoomBuilder.Map ;
using CodeImp.DoomBuilder.Rendering ;
using SlimDX ;
using SlimDX.Direct3D9 ;
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
using Plane = CodeImp . DoomBuilder . Geometry . Plane ;
2012-04-17 19:13:47 +00:00
2009-04-19 18:07:22 +00:00
#endregion
namespace CodeImp.DoomBuilder.VisualModes
{
2015-09-27 21:09:14 +00:00
public abstract class VisualThing : IVisualPickable , ID3DResource
2009-04-19 18:07:22 +00:00
{
#region = = = = = = = = = = = = = = = = = = Constants
2013-03-18 13:52:27 +00:00
protected const int FIXED_RADIUS = 8 ; //mxd. Used to render things with zero width and radius
2015-10-02 14:47:34 +00:00
internal const float LIT_FOG_DENSITY_SCALER = 255 * VisualGeometry . FOG_DENSITY_SCALER ; //mxd
2013-03-18 13:52:27 +00:00
2009-04-19 18:07:22 +00:00
#endregion
#region = = = = = = = = = = = = = = = = = = Variables
// Thing
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 readonly Thing thing ;
//mxd. Info
protected ThingTypeInfo info ;
2009-04-19 18:07:22 +00:00
// Texture
private ImageData texture ;
// Geometry
private WorldVertex [ ] vertices ;
private VertexBuffer geobuffer ;
2015-10-02 14:47:34 +00:00
private VertexBuffer cagebuffer ; //mxd
private int cagelength ; //mxd
2009-04-19 18:07:22 +00:00
private bool updategeo ;
private int triangles ;
// Rendering
2015-09-27 21:09:14 +00:00
private RenderPass renderpass ;
2009-04-19 18:07:22 +00:00
private Matrix position ;
2015-09-27 21:09:14 +00:00
private int cameradistance ;
private Color4 cagecolor ;
2013-03-18 13:52:27 +00:00
protected bool sizeless ; //mxd. Used to render visual things with 0 width and height
2015-10-02 14:47:34 +00:00
protected float fogfactor ; //mxd
2009-05-01 20:31:17 +00:00
// Selected?
protected bool selected ;
2009-04-19 18:07:22 +00:00
// Disposing
2014-02-21 14:42:12 +00:00
private bool isdisposed ;
2012-04-17 19:13:47 +00:00
2013-09-11 09:47:53 +00:00
//mxd
2015-10-02 14:47:34 +00:00
protected float thingheight ;
2012-04-17 19:13:47 +00:00
2013-09-11 09:47:53 +00:00
//mxd. light properties
private DynamicLightType lightType ;
private DynamicLightRenderStyle lightRenderStyle ;
private Color4 lightColor ;
private float lightRadius ; //current radius. used in light animation
private float lightPrimaryRadius ;
private float lightSecondaryRadius ;
private Vector3 position_v3 ;
private float lightDelta ; //used in light animation
2015-09-27 21:09:14 +00:00
private Vector3D [ ] boundingBox ;
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
2013-09-11 09:47:53 +00:00
//gldefs light
private Vector3 lightOffset ;
private int lightInterval ;
private bool isGldefsLight ;
2009-04-19 18:07:22 +00:00
#endregion
#region = = = = = = = = = = = = = = = = = = Properties
internal VertexBuffer GeometryBuffer { get { return geobuffer ; } }
2015-10-02 14:47:34 +00:00
internal VertexBuffer CageBuffer { get { return cagebuffer ; } } //mxd
internal int CageLength { get { return cagelength ; } } //mxd
2009-04-19 18:07:22 +00:00
internal bool NeedsUpdateGeo { get { return updategeo ; } }
internal int Triangles { get { return triangles ; } }
internal Matrix Position { get { return position ; } }
2015-09-27 21:09:14 +00:00
internal Color4 CageColor { get { return cagecolor ; } }
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 ThingTypeInfo Info { get { return info ; } } //mxd
2013-09-11 09:47:53 +00:00
//mxd
internal int VertexColor { get { return vertices . Length > 0 ? vertices [ 0 ] . c : 0 ; } }
2015-09-27 21:09:14 +00:00
public int CameraDistance { get { return cameradistance ; } }
2015-10-02 14:47:34 +00:00
public float FogFactor { get { return fogfactor ; } }
2015-09-27 21:09:14 +00:00
public Vector3 Center
{
get
{
if ( isGldefsLight ) return position_v3 + lightOffset ;
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
return new Vector3 ( position_v3 . X , position_v3 . Y , position_v3 . Z + thingheight / 2f ) ;
2013-09-11 09:47:53 +00:00
}
}
2013-08-08 11:04:13 +00:00
public Vector3D CenterV3D { get { return D3DDevice . V3D ( Center ) ; } }
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 float LocalCenterZ { get { return thingheight / 2f ; } } //mxd
2013-09-11 09:47:53 +00:00
public Vector3 PositionV3 { get { return position_v3 ; } }
2015-09-27 21:09:14 +00:00
public Vector3D [ ] BoundingBox { get { return boundingBox ; } }
Added, Visual mode, GLDEFS, GLOOME: subtractive glow is now supported.
Changed, Visual mode: changed thing fog calculation logic. Should be closer to GZDoom now.
Fixed, GLDEFS parser: "height" texture parameter was not treated as optional.
Fixed, text lump parsers: in some cases incorrect line number was displayed in error and warning messages.
Fixed, Visual mode: glow effect was not applied to sectors with 3 sidedefs.
Fixed, Visual mode: in some cases glow effect was not updated when replacing textures.
Fixed, general interface: "Full Brightness" button state was not updated during map loading.
Fixed, Drag Linedefs/Vertices/Sectors/Things modes: positions of line length labels were not updated while panning the view.
Cosmetic: added a bunch of new icons.
Cosmetic: changed Visual mode crosshair.
2015-08-27 20:46:49 +00:00
2013-09-11 09:47:53 +00:00
//mxd. light properties
public DynamicLightType LightType { get { return lightType ; } }
public float LightRadius { get { return lightRadius ; } }
public DynamicLightRenderStyle LightRenderStyle { get { return lightRenderStyle ; } }
public Color4 LightColor { get { return lightColor ; } }
2009-04-19 18:07:22 +00:00
/// <summary>
/// Returns the Thing that this VisualThing is created for.
/// </summary>
public Thing Thing { get { return thing ; } }
/// <summary>
2015-09-27 21:09:14 +00:00
/// Render pass in which this geometry must be rendered. Default is Mask.
2009-04-19 18:07:22 +00:00
/// </summary>
2015-09-27 21:09:14 +00:00
public RenderPass RenderPass { get { return renderpass ; } set { renderpass = value ; } }
2009-04-19 18:07:22 +00:00
/// <summary>
/// Image to use as texture on the geometry.
/// </summary>
public ImageData Texture { get { return texture ; } set { texture = value ; } }
/// <summary>
/// Disposed or not?
/// </summary>
public bool IsDisposed { get { return isdisposed ; } }
2009-05-01 20:31:17 +00:00
/// <summary>
/// Selected or not? This is only used by the core to determine what color to draw it with.
/// </summary>
public bool Selected { get { return selected ; } set { selected = value ; } }
2009-04-19 18:07:22 +00:00
#endregion
#region = = = = = = = = = = = = = = = = = = Constructor / Destructor
// Constructor
2015-05-27 12:38:03 +00:00
protected VisualThing ( Thing t )
2009-04-19 18:07:22 +00:00
{
// Initialize
this . thing = t ;
2015-09-27 21:09:14 +00:00
this . renderpass = RenderPass . Mask ;
2009-04-19 18:07:22 +00:00
this . position = Matrix . Identity ;
2012-04-17 19:13:47 +00:00
2013-09-11 09:47:53 +00:00
//mxd
lightType = DynamicLightType . NONE ;
lightRenderStyle = DynamicLightRenderStyle . NONE ;
lightPrimaryRadius = - 1 ;
lightSecondaryRadius = - 1 ;
lightInterval = - 1 ;
lightColor = new Color4 ( ) ;
2015-09-27 21:09:14 +00:00
boundingBox = new Vector3D [ 9 ] ;
2009-04-19 18:07:22 +00:00
// Register as resource
General . Map . Graphics . RegisterResource ( this ) ;
}
// Disposer
public virtual void Dispose ( )
{
// Not already disposed?
if ( ! isdisposed )
{
// Clean up
if ( geobuffer ! = null ) geobuffer . Dispose ( ) ;
geobuffer = null ;
2015-10-02 14:47:34 +00:00
if ( cagebuffer ! = null ) cagebuffer . Dispose ( ) ; //mxd
cagebuffer = null ; //mxd
2009-04-19 18:07:22 +00:00
// Unregister resource
General . Map . Graphics . UnregisterResource ( this ) ;
// Done
isdisposed = true ;
}
}
#endregion
#region = = = = = = = = = = = = = = = = = = Methods
2012-04-17 19:13:47 +00:00
2013-09-11 09:47:53 +00:00
//mxd
2015-09-27 21:09:14 +00:00
internal void CalculateCameraDistance ( Vector3D campos )
2014-12-03 23:15:26 +00:00
{
2015-09-27 21:09:14 +00:00
cameradistance = ( int ) ( ( CenterV3D - campos ) . GetLengthSq ( ) ) ;
2013-09-11 09:47:53 +00:00
}
2009-04-19 18:07:22 +00:00
2015-09-27 21:09:14 +00:00
// This is called before a device is reset (when resized or display adapter was changed)
2009-04-19 18:07:22 +00:00
public void UnloadResource ( )
{
// Trash geometry buffer
if ( geobuffer ! = null ) geobuffer . Dispose ( ) ;
geobuffer = null ;
updategeo = true ;
}
// This is called resets when the device is reset
// (when resized or display adapter was changed)
public void ReloadResource ( )
{
// Make new geometry
//Update();
}
/// <summary>
/// Sets the color of the cage around the thing geometry.
/// </summary>
2015-09-27 21:09:14 +00:00
protected void SetCageColor ( PixelColor color )
2009-04-19 18:07:22 +00:00
{
2015-09-27 21:09:14 +00:00
cagecolor = color . ToColorValue ( ) ;
2009-04-19 18:07:22 +00:00
}
/// <summary>
/// This sets the position to use for the thing geometry.
/// </summary>
public void SetPosition ( Vector3D pos )
{
2014-12-10 22:50:16 +00:00
position_v3 = D3DDevice . V3 ( pos ) ; //mxd
2013-09-11 09:47:53 +00:00
position = Matrix . Translation ( position_v3 ) ;
2015-06-22 19:52:23 +00:00
//mxd. update bounding box?
if ( lightType ! = DynamicLightType . NONE & & lightRadius > thing . Size )
2014-12-03 23:15:26 +00:00
{
UpdateBoundingBox ( lightRadius , lightRadius * 2 ) ;
}
2009-04-19 18:07:22 +00:00
}
// This sets the vertices for the thing sprite
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
protected void SetVertices ( ICollection < WorldVertex > verts , Plane floor , Plane ceiling )
2009-04-19 18:07:22 +00:00
{
2013-09-11 09:47:53 +00:00
// Copy vertices
2009-04-19 18:07:22 +00:00
vertices = new WorldVertex [ verts . Count ] ;
verts . CopyTo ( vertices , 0 ) ;
triangles = vertices . Length / 3 ;
updategeo = 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
//mxd. Do some GLOOME shenanigans...
2015-08-31 22:06:44 +00:00
if ( triangles < 2 ) return ;
float localcenterz = vertices [ 1 ] . z * 0.5f ;
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
Matrix m ;
2015-08-31 22:06:44 +00:00
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
switch ( info . RenderMode )
{
2015-08-31 22:06:44 +00:00
// TODO: Currently broken in GLOOME...
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
case Thing . SpriteRenderMode . WALL_SPRITE :
m = Matrix . Translation ( 0f , 0f , - localcenterz ) * Matrix . RotationY ( Thing . RollRad ) * Matrix . RotationZ ( thing . Angle ) * Matrix . Translation ( 0f , 0f , localcenterz ) ;
for ( int i = 0 ; i < vertices . Length ; i + + )
{
Vector4 transformed = Vector3 . Transform ( new Vector3 ( vertices [ i ] . x , vertices [ i ] . y , vertices [ i ] . z ) , m ) ;
vertices [ i ] . x = transformed . X ;
vertices [ i ] . y = transformed . Y ;
vertices [ i ] . z = transformed . Z ;
}
break ;
case Thing . SpriteRenderMode . FLOOR_SPRITE :
2015-08-31 22:06:44 +00:00
Matrix floorrotation = Matrix . RotationZ ( info . RollSprite ? Thing . RollRad : 0f )
* Matrix . RotationY ( Thing . Angle )
* Matrix . RotationX ( Angle2D . PIHALF ) ;
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
m = Matrix . Translation ( 0f , 0f , - localcenterz ) * floorrotation * Matrix . Translation ( 0f , 0f , localcenterz ) ;
2015-08-31 22:06:44 +00:00
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
for ( int i = 0 ; i < vertices . Length ; i + + )
{
Vector4 transformed = Vector3 . Transform ( new Vector3 ( vertices [ i ] . x , vertices [ i ] . y , vertices [ i ] . z ) , m ) ;
vertices [ i ] . x = transformed . X ;
vertices [ i ] . y = transformed . Y ;
vertices [ i ] . z = transformed . Z ;
}
// TODO: this won't work on things with AbsoluteZ flag
2015-08-31 22:06:44 +00:00
// TODO: +ROLLSPRITE implies +STICKTOPLANE?
if ( info . StickToPlane | | info . RollSprite )
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
{
// Calculate vertical offset
float floorz = floor . GetZ ( Thing . Position ) ;
float ceilz = ceiling . GetZ ( Thing . Position ) ;
if ( ! float . IsNaN ( floorz ) & & ! float . IsNaN ( ceilz ) )
{
float voffset ;
if ( info . Hangs )
{
float thingz = ceilz - Thing . Position . z + Thing . Height ;
voffset = 0.01f - floorz - General . Clamp ( thingz , 0 , ceilz - floorz ) ;
}
else
{
voffset = 0.01f - floorz - General . Clamp ( Thing . Position . z , 0 , ceilz - floorz ) ;
}
// Apply it
for ( int i = 0 ; i < vertices . Length ; i + + )
vertices [ i ] . z = floor . GetZ ( vertices [ i ] . x + Thing . Position . x , vertices [ i ] . y + Thing . Position . y ) + voffset ;
}
}
break ;
case Thing . SpriteRenderMode . CEILING_SPRITE :
2015-08-31 22:06:44 +00:00
Matrix ceilrotation = Matrix . RotationZ ( info . RollSprite ? Thing . RollRad : 0f )
* Matrix . RotationY ( Thing . Angle )
* Matrix . RotationX ( Angle2D . PIHALF ) ;
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
m = Matrix . Translation ( 0f , 0f , - localcenterz ) * ceilrotation * Matrix . Translation ( 0f , 0f , localcenterz ) ;
2015-08-31 22:06:44 +00:00
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
for ( int i = 0 ; i < vertices . Length ; i + + )
{
Vector4 transformed = Vector3 . Transform ( new Vector3 ( vertices [ i ] . x , vertices [ i ] . y , vertices [ i ] . z ) , m ) ;
vertices [ i ] . x = transformed . X ;
vertices [ i ] . y = transformed . Y ;
vertices [ i ] . z = transformed . Z ;
}
// TODO: this won't work on things with AbsoluteZ flag
2015-08-31 22:06:44 +00:00
// TODO: +ROLLSPRITE implies +STICKTOPLANE?
if ( info . StickToPlane | | info . RollSprite )
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
{
// Calculate vertical offset
float floorz = floor . GetZ ( Thing . Position ) ;
float ceilz = ceiling . GetZ ( Thing . Position ) ;
if ( ! float . IsNaN ( floorz ) & & ! float . IsNaN ( ceilz ) )
{
float voffset ;
if ( info . Hangs )
{
float thingz = ceilz - Math . Max ( 0 , Thing . Position . z ) - Thing . Height ;
voffset = - 0.01f - General . Clamp ( thingz , 0 , ceilz - floorz ) ;
}
else
{
voffset = - 0.01f - floorz - General . Clamp ( Thing . Position . z , 0 , ceilz - floorz ) ;
}
// Apply it
for ( int i = 0 ; i < vertices . Length ; i + + )
vertices [ i ] . z = ceiling . GetZ ( vertices [ i ] . x + Thing . Position . x , vertices [ i ] . y + Thing . Position . y ) + voffset ;
}
}
break ;
default :
if ( info . RollSprite )
{
m = Matrix . Translation ( 0f , 0f , - localcenterz ) * Matrix . RotationY ( Thing . RollRad ) * Matrix . Translation ( 0f , 0f , localcenterz ) ;
for ( int i = 0 ; i < vertices . Length ; i + + )
{
Vector4 transformed = Vector3 . Transform ( new Vector3 ( vertices [ i ] . x , vertices [ i ] . y , vertices [ i ] . z ) , m ) ;
vertices [ i ] . x = transformed . X ;
vertices [ i ] . y = transformed . Y ;
vertices [ i ] . z = transformed . Z ;
}
}
break ;
}
2009-04-19 18:07:22 +00:00
}
// This updates the visual thing
public virtual void Update ( )
{
2013-09-11 09:47:53 +00:00
// Do we need to update the geometry buffer?
2015-10-02 14:47:34 +00:00
if ( updategeo )
2009-04-19 18:07:22 +00:00
{
2013-09-11 09:47:53 +00:00
// Trash geometry buffer
if ( geobuffer ! = null ) geobuffer . Dispose ( ) ;
geobuffer = null ;
// Any vertics?
2015-10-02 14:47:34 +00:00
if ( vertices . Length > 0 )
2014-12-03 23:15:26 +00:00
{
2013-09-11 09:47:53 +00:00
// Make a new buffer
geobuffer = new VertexBuffer ( General . Map . Graphics . Device , WorldVertex . Stride * vertices . Length ,
Usage . WriteOnly | Usage . Dynamic , VertexFormat . None , Pool . Default ) ;
// Fill the buffer
DataStream bufferstream = geobuffer . Lock ( 0 , WorldVertex . Stride * vertices . Length , LockFlags . Discard ) ;
bufferstream . WriteRange ( vertices ) ;
geobuffer . Unlock ( ) ;
bufferstream . Dispose ( ) ;
}
2015-10-02 14:47:34 +00:00
// Trash cage buffer
if ( cagebuffer ! = null ) cagebuffer . Dispose ( ) ;
cagebuffer = null ;
// Make a new cage
List < WorldVertex > cageverts ;
if ( sizeless )
{
WorldVertex v0 = new WorldVertex ( - info . Radius + position_v3 . X , - info . Radius + position_v3 . Y , position_v3 . Z ) ;
WorldVertex v1 = new WorldVertex ( info . Radius + position_v3 . X , info . Radius + position_v3 . Y , position_v3 . Z ) ;
WorldVertex v2 = new WorldVertex ( info . Radius + position_v3 . X , - info . Radius + position_v3 . Y , position_v3 . Z ) ;
WorldVertex v3 = new WorldVertex ( - info . Radius + position_v3 . X , info . Radius + position_v3 . Y , position_v3 . Z ) ;
WorldVertex v4 = new WorldVertex ( position_v3 . X , position_v3 . Y , info . Radius + position_v3 . Z ) ;
WorldVertex v5 = new WorldVertex ( position_v3 . X , position_v3 . Y , - info . Radius + position_v3 . Z ) ;
cageverts = new List < WorldVertex > ( new [ ] { v0 , v1 , v2 , v3 , v4 , v5 } ) ;
}
else
{
float top = position_v3 . Z + info . Height ;
float bottom = position_v3 . Z ;
WorldVertex v0 = new WorldVertex ( - info . Radius + position_v3 . X , - info . Radius + position_v3 . Y , bottom ) ;
WorldVertex v1 = new WorldVertex ( - info . Radius + position_v3 . X , info . Radius + position_v3 . Y , bottom ) ;
WorldVertex v2 = new WorldVertex ( info . Radius + position_v3 . X , info . Radius + position_v3 . Y , bottom ) ;
WorldVertex v3 = new WorldVertex ( info . Radius + position_v3 . X , - info . Radius + position_v3 . Y , bottom ) ;
WorldVertex v4 = new WorldVertex ( - info . Radius + position_v3 . X , - info . Radius + position_v3 . Y , top ) ;
WorldVertex v5 = new WorldVertex ( - info . Radius + position_v3 . X , info . Radius + position_v3 . Y , top ) ;
WorldVertex v6 = new WorldVertex ( info . Radius + position_v3 . X , info . Radius + position_v3 . Y , top ) ;
WorldVertex v7 = new WorldVertex ( info . Radius + position_v3 . X , - info . Radius + position_v3 . Y , top ) ;
cageverts = new List < WorldVertex > ( new [ ] { v0 , v1 ,
v1 , v2 ,
v2 , v3 ,
v3 , v0 ,
v4 , v5 ,
v5 , v6 ,
v6 , v7 ,
v7 , v4 ,
v0 , v4 ,
v1 , v5 ,
v2 , v6 ,
v3 , v7 } ) ;
}
// Make new arrow
if ( Thing . IsDirectional )
{
Matrix transform = Matrix . Scaling ( info . Radius , info . Radius , info . Radius )
* ( Matrix . RotationY ( - Thing . RollRad ) * Matrix . RotationX ( - Thing . PitchRad ) * Matrix . RotationZ ( Thing . Angle ) )
* ( sizeless ? position : position * Matrix . Translation ( 0.0f , 0.0f , thingheight / 2f ) ) ;
WorldVertex a0 = new WorldVertex ( Vector3D . Transform ( 0.0f , 0.0f , 0.0f , transform ) ) ; //start
WorldVertex a1 = new WorldVertex ( Vector3D . Transform ( 0.0f , - 1.5f , 0.0f , transform ) ) ; //end
WorldVertex a2 = new WorldVertex ( Vector3D . Transform ( 0.2f , - 1.1f , 0.2f , transform ) ) ;
WorldVertex a3 = new WorldVertex ( Vector3D . Transform ( - 0.2f , - 1.1f , 0.2f , transform ) ) ;
WorldVertex a4 = new WorldVertex ( Vector3D . Transform ( 0.2f , - 1.1f , - 0.2f , transform ) ) ;
WorldVertex a5 = new WorldVertex ( Vector3D . Transform ( - 0.2f , - 1.1f , - 0.2f , transform ) ) ;
cageverts . AddRange ( new [ ] { a0 , a1 ,
a1 , a2 ,
a1 , a3 ,
a1 , a4 ,
a1 , a5 } ) ;
}
// Create buffer
WorldVertex [ ] cv = cageverts . ToArray ( ) ;
cagelength = cv . Length / 2 ;
cagebuffer = new VertexBuffer ( General . Map . Graphics . Device , WorldVertex . Stride * cv . Length , Usage . WriteOnly | Usage . Dynamic , VertexFormat . None , Pool . Default ) ;
cagebuffer . Lock ( 0 , WorldVertex . Stride * cv . Length , LockFlags . None ) . WriteRange ( cv ) ;
cagebuffer . Unlock ( ) ;
2013-09-11 09:47:53 +00:00
//mxd. Check if thing is light
2014-12-03 23:15:26 +00:00
CheckLightState ( ) ;
2009-04-19 18:07:22 +00:00
// Done
updategeo = false ;
}
}
2012-04-17 19:13:47 +00:00
2013-09-11 09:47:53 +00:00
//mxd
2014-12-03 23:15:26 +00:00
protected void CheckLightState ( )
{
2013-09-11 09:47:53 +00:00
//mxd. Check if thing is light
int light_id = Array . IndexOf ( GZBuilder . GZGeneral . GZ_LIGHTS , thing . Type ) ;
2014-12-03 23:15:26 +00:00
if ( light_id ! = - 1 )
{
2013-09-11 09:47:53 +00:00
isGldefsLight = false ;
lightInterval = - 1 ;
2014-12-03 23:15:26 +00:00
UpdateLight ( light_id ) ;
UpdateBoundingBox ( lightRadius , lightRadius * 2 ) ;
}
//check if we have light from GLDEFS
else if ( General . Map . Data . GldefsEntries . ContainsKey ( thing . Type ) )
{
2013-09-11 09:47:53 +00:00
isGldefsLight = true ;
2014-12-03 23:15:26 +00:00
UpdateGldefsLight ( ) ;
UpdateBoundingBox ( lightRadius , lightRadius * 2 ) ;
}
else
{
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
UpdateBoundingBox ( ( int ) thing . Size , thingheight ) ;
2014-12-03 23:15:26 +00:00
2013-09-11 09:47:53 +00:00
lightType = DynamicLightType . NONE ;
lightRadius = - 1 ;
lightPrimaryRadius = - 1 ;
lightSecondaryRadius = - 1 ;
lightRenderStyle = DynamicLightRenderStyle . NONE ;
lightInterval = - 1 ;
isGldefsLight = false ;
}
}
2015-09-27 21:09:14 +00:00
//mxd. Used in ColorPicker to update light
2014-12-03 23:15:26 +00:00
public void UpdateLight ( )
{
2013-09-11 09:47:53 +00:00
int light_id = Array . IndexOf ( GZBuilder . GZGeneral . GZ_LIGHTS , thing . Type ) ;
2014-12-03 23:15:26 +00:00
if ( light_id ! = - 1 )
{
UpdateLight ( light_id ) ;
UpdateBoundingBox ( lightRadius , lightRadius * 2 ) ;
2013-09-11 09:47:53 +00:00
}
}
2015-09-27 21:09:14 +00:00
//mxd. Update light info
2014-12-03 23:15:26 +00:00
private void UpdateLight ( int lightId )
{
2013-09-11 09:47:53 +00:00
float scaled_intensity = 255.0f / General . Settings . GZDynamicLightIntensity ;
2014-12-03 23:15:26 +00:00
if ( lightId < GZBuilder . GZGeneral . GZ_LIGHT_TYPES [ 2 ] ) //if it's gzdoom light
{
2013-09-11 09:47:53 +00:00
int n ;
2014-12-03 23:15:26 +00:00
if ( lightId < GZBuilder . GZGeneral . GZ_LIGHT_TYPES [ 0 ] )
{
2013-09-11 09:47:53 +00:00
n = 0 ;
lightRenderStyle = DynamicLightRenderStyle . NORMAL ;
//lightColor.Alpha used in shader to perform some calculations based on light type
2014-01-03 10:33:45 +00:00
lightColor = new Color4 ( ( float ) lightRenderStyle / 100.0f , thing . Args [ 0 ] / scaled_intensity , thing . Args [ 1 ] / scaled_intensity , thing . Args [ 2 ] / scaled_intensity ) ;
2014-12-03 23:15:26 +00:00
}
else if ( lightId < GZBuilder . GZGeneral . GZ_LIGHT_TYPES [ 1 ] )
{
2013-09-11 09:47:53 +00:00
n = 10 ;
lightRenderStyle = DynamicLightRenderStyle . ADDITIVE ;
2014-01-03 10:33:45 +00:00
lightColor = new Color4 ( ( float ) lightRenderStyle / 100.0f , thing . Args [ 0 ] / scaled_intensity , thing . Args [ 1 ] / scaled_intensity , thing . Args [ 2 ] / scaled_intensity ) ;
2014-12-03 23:15:26 +00:00
}
else
{
2013-09-11 09:47:53 +00:00
n = 20 ;
lightRenderStyle = DynamicLightRenderStyle . NEGATIVE ;
2014-01-03 10:33:45 +00:00
lightColor = new Color4 ( ( float ) lightRenderStyle / 100.0f , thing . Args [ 0 ] / scaled_intensity , thing . Args [ 1 ] / scaled_intensity , thing . Args [ 2 ] / scaled_intensity ) ;
2013-09-11 09:47:53 +00:00
}
lightType = ( DynamicLightType ) ( thing . Type - 9800 - n ) ;
2014-12-03 23:15:26 +00:00
if ( lightType = = DynamicLightType . SECTOR )
{
2013-09-11 09:47:53 +00:00
int scaler = 1 ;
2014-12-03 23:15:26 +00:00
if ( thing . Sector ! = null ) scaler = thing . Sector . Brightness / 4 ;
2014-01-03 10:33:45 +00:00
lightPrimaryRadius = ( thing . Args [ 3 ] * scaler ) * General . Settings . GZDynamicLightRadius ;
2014-12-03 23:15:26 +00:00
}
else
{
2014-01-03 10:33:45 +00:00
lightPrimaryRadius = ( thing . Args [ 3 ] * 2 ) * General . Settings . GZDynamicLightRadius ; //works... that.. way in GZDoom
2014-12-03 23:15:26 +00:00
if ( lightType > 0 ) lightSecondaryRadius = ( thing . Args [ 4 ] * 2 ) * General . Settings . GZDynamicLightRadius ;
2013-09-11 09:47:53 +00:00
}
2015-09-27 21:09:14 +00:00
}
else //it's one of vavoom lights
2014-12-03 23:15:26 +00:00
{
2013-09-11 09:47:53 +00:00
lightRenderStyle = DynamicLightRenderStyle . VAVOOM ;
2013-07-29 08:50:50 +00:00
lightType = ( DynamicLightType ) thing . Type ;
2013-09-11 09:47:53 +00:00
if ( lightType = = DynamicLightType . VAVOOM_COLORED )
2014-01-03 10:33:45 +00:00
lightColor = new Color4 ( ( float ) lightRenderStyle / 100.0f , thing . Args [ 1 ] / scaled_intensity , thing . Args [ 2 ] / scaled_intensity , thing . Args [ 3 ] / scaled_intensity ) ;
2013-09-11 09:47:53 +00:00
else
lightColor = new Color4 ( ( float ) lightRenderStyle / 100.0f , General . Settings . GZDynamicLightIntensity , General . Settings . GZDynamicLightIntensity , General . Settings . GZDynamicLightIntensity ) ;
2014-01-03 10:33:45 +00:00
lightPrimaryRadius = ( thing . Args [ 0 ] * 8 ) * General . Settings . GZDynamicLightRadius ;
2013-09-11 09:47:53 +00:00
}
2015-09-27 21:09:14 +00:00
2013-09-11 09:47:53 +00:00
UpdateLightRadius ( ) ;
}
//mxd
2014-12-03 23:15:26 +00:00
private void UpdateGldefsLight ( )
{
2013-09-11 09:47:53 +00:00
DynamicLightData light = General . Map . Data . GldefsEntries [ thing . Type ] ;
float intensity_mod = General . Settings . GZDynamicLightIntensity ;
float scale_mod = General . Settings . GZDynamicLightRadius ;
//apply settings
lightRenderStyle = light . Subtractive ? DynamicLightRenderStyle . NEGATIVE : DynamicLightRenderStyle . NORMAL ;
lightColor = new Color4 ( ( float ) lightRenderStyle / 100.0f , light . Color . Red * intensity_mod , light . Color . Green * intensity_mod , light . Color . Blue * intensity_mod ) ;
2015-08-28 19:22:28 +00:00
Vector2D o = new Vector2D ( light . Offset . X , light . Offset . Y ) . GetRotated ( thing . Angle - Angle2D . PIHALF ) ;
lightOffset = new Vector3 ( o . x , o . y , light . Offset . Z ) ;
2013-09-11 09:47:53 +00:00
lightType = light . Type ;
2014-12-03 23:15:26 +00:00
if ( lightType = = DynamicLightType . SECTOR )
{
2015-08-28 19:22:28 +00:00
lightPrimaryRadius = light . Interval * thing . Sector . Brightness / 5.0f ;
2014-12-03 23:15:26 +00:00
}
else
{
2013-09-11 09:47:53 +00:00
lightPrimaryRadius = light . PrimaryRadius * scale_mod ;
lightSecondaryRadius = light . SecondaryRadius * scale_mod ;
}
lightInterval = light . Interval ;
2014-12-03 23:15:26 +00:00
UpdateLightRadius ( lightInterval ) ;
2013-09-11 09:47:53 +00:00
}
//mxd
2014-12-03 23:15:26 +00:00
public void UpdateLightRadius ( )
{
UpdateLightRadius ( ( lightInterval ! = - 1 ? lightInterval : thing . AngleDoom ) ) ;
2013-09-11 09:47:53 +00:00
}
//mxd
2014-12-03 23:15:26 +00:00
private void UpdateLightRadius ( int interval )
{
if ( lightType = = DynamicLightType . NONE )
{
2013-09-11 09:47:53 +00:00
General . ErrorLogger . Add ( ErrorType . Error , "Please check that thing is light before accessing it's PositionAndRadius! You can use lightType, which is -1 if thing isn't light" ) ;
return ;
}
2014-12-03 23:15:26 +00:00
if ( General . Settings . GZDrawLightsMode = = LightRenderMode . ALL | | Array . IndexOf ( GZBuilder . GZGeneral . GZ_ANIMATED_LIGHT_TYPES , lightType ) = = - 1 )
{
2013-09-11 09:47:53 +00:00
lightRadius = lightPrimaryRadius ;
return ;
}
2014-12-03 23:15:26 +00:00
if ( interval = = 0 )
{
2014-03-11 09:44:39 +00:00
lightRadius = 0 ;
return ;
}
2014-05-20 09:09:28 +00:00
float time = Clock . CurrentTime ;
2013-09-11 09:47:53 +00:00
float rMin = Math . Min ( lightPrimaryRadius , lightSecondaryRadius ) ;
float rMax = Math . Max ( lightPrimaryRadius , lightSecondaryRadius ) ;
float diff = rMax - rMin ;
2014-12-03 23:15:26 +00:00
switch ( lightType )
{
2014-03-10 14:35:38 +00:00
case DynamicLightType . PULSE :
lightDelta = ( ( float ) Math . Sin ( time / ( interval * 4.0f ) ) + 1.0f ) / 2.0f ; //just playing by the eye here... in [0.0 ... 1.0] interval
lightRadius = rMin + diff * lightDelta ;
break ;
case DynamicLightType . FLICKER :
float fdelta = ( float ) Math . Sin ( time / 0.1f ) ; //just playing by the eye here...
2014-12-03 23:15:26 +00:00
if ( Math . Sign ( fdelta ) ! = Math . Sign ( lightDelta ) )
{
2014-03-10 14:35:38 +00:00
lightDelta = fdelta ;
lightRadius = ( General . Random ( 0 , 359 ) < interval ? rMax : rMin ) ;
}
break ;
case DynamicLightType . RANDOM :
float rdelta = ( float ) Math . Sin ( time / ( interval * 9.0f ) ) ; //just playing by the eye here...
2014-12-03 23:15:26 +00:00
if ( Math . Sign ( rdelta ) ! = Math . Sign ( lightDelta ) )
{
2014-03-10 14:35:38 +00:00
lightRadius = rMin + ( General . Random ( 0 , ( int ) ( diff * 10 ) ) ) / 10.0f ;
}
lightDelta = rdelta ;
break ;
2013-09-11 09:47:53 +00:00
}
}
//mxd. update bounding box
2014-12-03 23:15:26 +00:00
public void UpdateBoundingBox ( )
{
2015-06-22 19:52:23 +00:00
if ( lightType ! = DynamicLightType . NONE & & lightRadius > thing . Size )
2014-12-03 23:15:26 +00:00
UpdateBoundingBox ( lightRadius , lightRadius * 2 ) ;
2013-09-11 09:47:53 +00:00
}
2014-12-03 23:15:26 +00:00
private void UpdateBoundingBox ( float width , float height )
{
2015-09-27 21:09:14 +00:00
boundingBox = new Vector3D [ 9 ] ;
boundingBox [ 0 ] = CenterV3D ;
2013-09-11 09:47:53 +00:00
float h2 = height / 2.0f ;
2015-09-27 21:09:14 +00:00
boundingBox [ 1 ] = new Vector3D ( position_v3 . X - width , position_v3 . Y - width , Center . Z - h2 ) ;
boundingBox [ 2 ] = new Vector3D ( position_v3 . X + width , position_v3 . Y - width , Center . Z - h2 ) ;
boundingBox [ 3 ] = new Vector3D ( position_v3 . X - width , position_v3 . Y + width , Center . Z - h2 ) ;
boundingBox [ 4 ] = new Vector3D ( position_v3 . X + width , position_v3 . Y + width , Center . Z - h2 ) ;
2013-09-11 09:47:53 +00:00
2015-09-27 21:09:14 +00:00
boundingBox [ 5 ] = new Vector3D ( position_v3 . X - width , position_v3 . Y - width , Center . Z + h2 ) ;
boundingBox [ 6 ] = new Vector3D ( position_v3 . X + width , position_v3 . Y - width , Center . Z + h2 ) ;
boundingBox [ 7 ] = new Vector3D ( position_v3 . X - width , position_v3 . Y + width , Center . Z + h2 ) ;
boundingBox [ 8 ] = new Vector3D ( position_v3 . X + width , position_v3 . Y + width , Center . Z + h2 ) ;
2013-09-11 09:47:53 +00:00
}
2009-04-19 18:07:22 +00:00
/// <summary>
/// This is called when the thing must be tested for line intersection. This should reject
/// as fast as possible to rule out all geometry that certainly does not touch the line.
/// </summary>
public virtual bool PickFastReject ( Vector3D from , Vector3D to , Vector3D dir )
{
return false ;
}
/// <summary>
/// This is called when the thing must be tested for line intersection. This should perform
/// accurate hit detection and set u_ray to the position on the ray where this hits the geometry.
/// </summary>
public virtual bool PickAccurate ( Vector3D from , Vector3D to , Vector3D dir , ref float u_ray )
{
return false ;
}
#endregion
}
}