2014-01-16 09:32:05 +00:00
#region = = = = = = = = = = = = = = = = = = Namespaces
using System ;
using System.Collections.Generic ;
using System.Drawing ;
using System.Windows.Forms ;
using CodeImp.DoomBuilder.Actions ;
2015-06-25 18:32:29 +00:00
using CodeImp.DoomBuilder.Controls ;
2014-01-16 09:32:05 +00:00
using CodeImp.DoomBuilder.Editing ;
using CodeImp.DoomBuilder.Geometry ;
using CodeImp.DoomBuilder.Map ;
using CodeImp.DoomBuilder.Rendering ;
using CodeImp.DoomBuilder.Windows ;
#endregion
namespace CodeImp.DoomBuilder.BuilderModes
{
[ EditMode ( DisplayName = "Draw Grid Mode" ,
SwitchAction = "drawgridmode" ,
2014-02-26 14:11:06 +00:00
ButtonImage = "DrawGridMode.png" , //mxd
ButtonOrder = int . MinValue + 5 , //mxd
ButtonGroup = "000_drawing" , //mxd
2014-01-16 09:32:05 +00:00
AllowCopyPaste = false ,
Volatile = true ,
Optional = false ) ]
public class DrawGridMode : DrawGeometryMode
{
#region = = = = = = = = = = = = = = = = = = Variables
private static int horizontalSlices = 3 ;
private static int verticalSlices = 3 ;
2014-01-17 09:44:08 +00:00
private static bool triangulate ;
private static bool gridlock ;
2015-01-16 23:37:20 +00:00
private static InterpolationTools . Mode horizontalinterpolation = InterpolationTools . Mode . LINEAR ;
private static InterpolationTools . Mode verticalinterpolation = InterpolationTools . Mode . LINEAR ;
2014-01-16 09:32:05 +00:00
2014-11-04 14:24:47 +00:00
private readonly List < DrawnVertex [ ] > gridpoints ;
2015-06-25 18:32:29 +00:00
private HintLabel hintlabel ;
2014-01-16 09:32:05 +00:00
private int width ;
private int height ;
2014-01-17 09:44:08 +00:00
private int slicesH ;
private int slicesV ;
2014-01-16 09:32:05 +00:00
private Vector2D start ;
private Vector2D end ;
//interface
2015-06-25 18:32:29 +00:00
private DrawGridOptionsPanel panel ;
private Docker docker ;
2014-01-16 09:32:05 +00:00
#endregion
#region = = = = = = = = = = = = = = = = = = Constructor
2014-11-04 14:24:47 +00:00
public DrawGridMode ( )
{
2014-01-16 09:32:05 +00:00
snaptogrid = true ;
2015-07-09 22:32:12 +00:00
usefourcardinaldirections = true ;
2014-11-04 14:24:47 +00:00
gridpoints = new List < DrawnVertex [ ] > ( ) ;
2014-01-16 09:32:05 +00:00
}
#endregion
#region = = = = = = = = = = = = = = = = = = Events
2014-11-04 14:24:47 +00:00
public override void OnEngage ( )
{
2014-01-16 09:32:05 +00:00
base . OnEngage ( ) ;
2015-06-25 18:32:29 +00:00
// Create and setup settings panel
panel = new DrawGridOptionsPanel ( ) ;
panel . MaxHorizontalSlices = ( int ) General . Map . FormatInterface . MaxCoordinate ;
panel . MaxVerticalSlices = ( int ) General . Map . FormatInterface . MaxCoordinate ;
2014-01-16 09:32:05 +00:00
panel . Triangulate = triangulate ;
2014-01-17 09:44:08 +00:00
panel . LockToGrid = gridlock ;
2014-01-16 09:32:05 +00:00
panel . HorizontalSlices = horizontalSlices - 1 ;
panel . VerticalSlices = verticalSlices - 1 ;
2015-01-16 23:37:20 +00:00
panel . HorizontalInterpolationMode = horizontalinterpolation ;
panel . VerticalInterpolationMode = verticalinterpolation ;
2015-06-25 18:32:29 +00:00
panel . OnValueChanged + = OptionsPanelOnValueChanged ;
panel . OnGridLockChanged + = OptionsPanelOnOnGridLockChanged ;
// Add docker
docker = new Docker ( "drawgrid" , "Draw Grid" , panel ) ;
General . Interface . AddDocker ( docker ) ;
General . Interface . SelectDocker ( docker ) ;
2014-01-16 09:32:05 +00:00
}
2014-11-04 14:24:47 +00:00
public override void OnDisengage ( )
{
2014-01-16 09:32:05 +00:00
base . OnDisengage ( ) ;
2015-06-25 18:32:29 +00:00
// Remove docker
General . Interface . RemoveDocker ( docker ) ;
panel . Dispose ( ) ;
panel = null ;
2014-01-16 09:32:05 +00:00
}
2014-11-04 14:24:47 +00:00
override public void OnAccept ( )
{
2014-01-16 09:32:05 +00:00
Cursor . Current = Cursors . AppStarting ;
General . Settings . FindDefaultDrawSettings ( ) ;
// When we have a shape...
2014-11-04 14:24:47 +00:00
if ( gridpoints . Count > 0 )
{
2014-01-16 09:32:05 +00:00
// Make undo for the draw
General . Map . UndoRedo . CreateUndo ( "Grid draw" ) ;
// Make an analysis and show info
string [ ] adjectives = new [ ] { "gloomy" , "sad" , "unhappy" , "lonely" , "troubled" , "depressed" , "heartsick" , "glum" , "pessimistic" , "bitter" , "downcast" } ; // aaand my english vocabulary ends here :)
string word = adjectives [ new Random ( ) . Next ( adjectives . Length - 1 ) ] ;
string a = ( word [ 0 ] = = 'u' ? "an " : "a " ) ;
General . Interface . DisplayStatus ( StatusType . Action , "Created " + a + word + " grid." ) ;
List < Sector > newsectors = new List < Sector > ( ) ;
2014-11-04 14:24:47 +00:00
foreach ( DrawnVertex [ ] shape in gridpoints )
{
if ( ! Tools . DrawLines ( shape , true , BuilderPlug . Me . AutoAlignTextureOffsetsOnCreate ) )
{
2014-01-16 09:32:05 +00:00
// Drawing failed
// NOTE: I have to call this twice, because the first time only cancels this volatile mode
General . Map . UndoRedo . WithdrawUndo ( ) ;
General . Map . UndoRedo . WithdrawUndo ( ) ;
return ;
}
// Update cached values after each step...
General . Map . Map . Update ( ) ;
newsectors . AddRange ( General . Map . Map . GetMarkedSectors ( true ) ) ;
}
// Snap to map format accuracy
General . Map . Map . SnapAllToAccuracy ( ) ;
// Clear selection
General . Map . Map . ClearAllSelected ( ) ;
// Edit new sectors?
if ( BuilderPlug . Me . EditNewSector & & ( newsectors . Count > 0 ) )
General . Interface . ShowEditSectors ( newsectors ) ;
// Update the used textures
General . Map . Data . UpdateUsedTextures ( ) ;
// Map is changed
General . Map . IsChanged = true ;
}
// Done
Cursor . Current = Cursors . Default ;
// Return to original mode
General . Editing . ChangeMode ( General . Editing . PreviousStableMode . Name ) ;
}
2014-11-04 14:24:47 +00:00
private void OptionsPanelOnValueChanged ( object sender , EventArgs eventArgs )
{
2014-01-16 09:32:05 +00:00
triangulate = panel . Triangulate ;
horizontalSlices = panel . HorizontalSlices + 1 ;
verticalSlices = panel . VerticalSlices + 1 ;
2015-01-16 23:37:20 +00:00
horizontalinterpolation = panel . HorizontalInterpolationMode ;
verticalinterpolation = panel . VerticalInterpolationMode ;
2014-01-16 09:32:05 +00:00
Update ( ) ;
}
2014-11-04 14:24:47 +00:00
private void OptionsPanelOnOnGridLockChanged ( object sender , EventArgs eventArgs )
{
2014-01-17 09:44:08 +00:00
gridlock = panel . LockToGrid ;
2014-02-28 14:32:20 +00:00
General . Hints . ShowHints ( this . GetType ( ) , ( gridlock ? "gridlockhelp" : "general" ) ) ;
2014-01-17 09:44:08 +00:00
Update ( ) ;
}
2014-11-04 14:24:47 +00:00
public override void OnHelp ( )
{
General . ShowHelp ( "/gzdb/features/classic_modes/mode_drawgrid.html" ) ;
}
2014-01-16 09:32:05 +00:00
#endregion
#region = = = = = = = = = = = = = = = = = = Methods
2014-11-04 14:24:47 +00:00
override protected void Update ( )
{
2014-01-16 09:32:05 +00:00
PixelColor stitchcolor = General . Colors . Highlight ;
PixelColor losecolor = General . Colors . Selection ;
2014-11-04 14:24:47 +00:00
// We WANT snaptogrid and DON'T WANT snaptonearest when lock to grid is enabled
2015-07-09 22:32:12 +00:00
snaptocardinaldirection = General . Interface . ShiftState & & General . Interface . AltState ; //mxd
snaptogrid = ( snaptocardinaldirection | | gridlock | | ( General . Interface . ShiftState ^ General . Interface . SnapToGrid ) ) ;
snaptonearest = ( ! gridlock & & ( General . Interface . CtrlState ^ General . Interface . AutoMerge ) ) ;
2014-11-04 14:24:47 +00:00
DrawnVertex curp ;
if ( points . Count = = 1 )
{
// Handle the case when start point is not on current grid.
Vector2D gridoffset = General . Map . Grid . SnappedToGrid ( points [ 0 ] . pos ) - points [ 0 ] . pos ;
2015-07-09 22:32:12 +00:00
curp = GetCurrentPosition ( mousemappos + gridoffset , snaptonearest , snaptogrid , snaptocardinaldirection , renderer , points ) ;
2014-11-04 14:24:47 +00:00
curp . pos - = gridoffset ;
}
else
{
curp = GetCurrentPosition ( ) ;
}
2014-01-16 09:32:05 +00:00
float vsize = ( renderer . VertexSize + 1.0f ) / renderer . Scale ;
// Render drawing lines
2014-11-04 14:24:47 +00:00
if ( renderer . StartOverlay ( true ) )
{
2014-01-16 09:32:05 +00:00
PixelColor color = snaptonearest ? stitchcolor : losecolor ;
2014-11-04 14:24:47 +00:00
if ( points . Count = = 1 )
{
2014-12-03 23:15:26 +00:00
UpdateReferencePoints ( points [ 0 ] , curp ) ;
List < Vector2D [ ] > shapes = GetShapes ( start , end ) ;
2014-01-16 09:32:05 +00:00
//render shape
2014-11-04 14:24:47 +00:00
foreach ( Vector2D [ ] shape in shapes )
{
2014-01-16 09:32:05 +00:00
for ( int i = 1 ; i < shape . Length ; i + + )
renderer . RenderLine ( shape [ i - 1 ] , shape [ i ] , LINE_THICKNESS , color , true ) ;
}
//vertices
2014-11-04 14:24:47 +00:00
foreach ( Vector2D [ ] shape in shapes )
{
2014-01-16 09:32:05 +00:00
for ( int i = 0 ; i < shape . Length ; i + + )
renderer . RenderRectangleFilled ( new RectangleF ( shape [ i ] . x - vsize , shape [ i ] . y - vsize , vsize * 2.0f , vsize * 2.0f ) , color , true ) ;
}
//and labels
Vector2D [ ] labelCoords = new [ ] { start , new Vector2D ( end . x , start . y ) , end , new Vector2D ( start . x , end . y ) , start } ;
2014-11-04 14:24:47 +00:00
for ( int i = 1 ; i < 5 ; i + + )
{
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
labels [ i - 1 ] . Move ( labelCoords [ i ] , labelCoords [ i - 1 ] ) ;
2014-01-16 09:32:05 +00:00
renderer . RenderText ( labels [ i - 1 ] . TextLabel ) ;
}
//render hint
2014-11-04 14:24:47 +00:00
if ( horizontalSlices > 1 | | verticalSlices > 1 )
{
2015-06-25 18:32:29 +00:00
hintlabel . Text = "H: " + ( slicesH - 1 ) + "; V: " + ( slicesV - 1 ) ;
if ( width > hintlabel . Text . Length * vsize & & height > 16 * vsize )
2014-11-04 14:24:47 +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
hintlabel . Move ( start , end ) ;
2015-06-25 18:32:29 +00:00
renderer . RenderText ( hintlabel . TextLabel ) ;
2014-01-16 09:32:05 +00:00
}
}
2014-11-04 14:24:47 +00:00
}
else
{
2014-01-16 09:32:05 +00:00
// Render vertex at cursor
renderer . RenderRectangleFilled ( new RectangleF ( curp . pos . x - vsize , curp . pos . y - vsize , vsize * 2.0f , vsize * 2.0f ) , color , true ) ;
}
// Done
renderer . Finish ( ) ;
}
// Done
renderer . Present ( ) ;
}
// This draws a point at a specific location
2014-11-04 14:24:47 +00:00
override public bool DrawPointAt ( Vector2D pos , bool stitch , bool stitchline )
{
2014-01-16 09:32:05 +00:00
if ( pos . x < General . Map . Config . LeftBoundary | | pos . x > General . Map . Config . RightBoundary | |
pos . y > General . Map . Config . TopBoundary | | pos . y < General . Map . Config . BottomBoundary )
return false ;
DrawnVertex newpoint = new DrawnVertex ( ) ;
newpoint . pos = pos ;
newpoint . stitch = true ;
newpoint . stitchline = stitchline ;
points . Add ( newpoint ) ;
2014-11-04 14:24:47 +00:00
if ( points . Count = = 1 )
{
// Add labels
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
labels . AddRange ( new [ ] { new LineLengthLabel ( false , true ) , new LineLengthLabel ( false , true ) , new LineLengthLabel ( false , true ) , new LineLengthLabel ( false , true ) } ) ;
hintlabel = new HintLabel ( General . Colors . InfoLine ) ;
2014-01-16 09:32:05 +00:00
Update ( ) ;
2014-11-04 14:24:47 +00:00
}
else if ( points [ 0 ] . pos = = points [ 1 ] . pos )
{
// Nothing is drawn
2014-01-16 09:32:05 +00:00
FinishDraw ( ) ;
2014-11-04 14:24:47 +00:00
}
else
{
// Handle the case when start point is not on current grid.
Vector2D gridoffset = General . Map . Grid . SnappedToGrid ( points [ 0 ] . pos ) - points [ 0 ] . pos ;
2015-07-09 22:32:12 +00:00
newpoint = GetCurrentPosition ( mousemappos + gridoffset , snaptonearest , snaptogrid , snaptocardinaldirection , renderer , new List < DrawnVertex > { points [ 0 ] } ) ;
2014-11-04 14:24:47 +00:00
newpoint . pos - = gridoffset ;
// Create vertices for final shape.
2014-12-03 23:15:26 +00:00
UpdateReferencePoints ( points [ 0 ] , newpoint ) ;
List < Vector2D [ ] > shapes = GetShapes ( start , end ) ;
2014-01-16 09:32:05 +00:00
2014-11-04 14:24:47 +00:00
foreach ( Vector2D [ ] shape in shapes )
{
2014-01-16 09:32:05 +00:00
DrawnVertex [ ] verts = new DrawnVertex [ shape . Length ] ;
2014-11-04 14:24:47 +00:00
for ( int i = 0 ; i < shape . Length ; i + + )
{
2014-01-16 09:32:05 +00:00
newpoint = new DrawnVertex ( ) ;
newpoint . pos = shape [ i ] ;
newpoint . stitch = true ;
newpoint . stitchline = stitchline ;
verts [ i ] = newpoint ;
}
gridpoints . Add ( verts ) ;
}
FinishDraw ( ) ;
}
return true ;
}
2014-12-03 23:15:26 +00:00
private List < Vector2D [ ] > GetShapes ( Vector2D s , Vector2D e )
2014-11-04 14:24:47 +00:00
{
2014-01-16 09:32:05 +00:00
//no shape
if ( s = = e ) return new List < Vector2D [ ] > ( ) ;
2014-11-04 14:24:47 +00:00
//setup slices
if ( gridlock )
{
slicesH = width / General . Map . Grid . GridSize ;
slicesV = height / General . Map . Grid . GridSize ;
}
else
{
slicesH = horizontalSlices ;
slicesV = verticalSlices ;
}
2014-01-16 09:32:05 +00:00
2014-11-04 14:24:47 +00:00
//create a segmented line
List < Vector2D [ ] > shapes ;
if ( width = = 0 | | height = = 0 )
{
if ( slicesH > 0 & & width > 0 )
{
shapes = new List < Vector2D [ ] > ( ) ;
int step = width / slicesH ;
for ( int w = 0 ; w < slicesH ; w + + )
{
shapes . Add ( new [ ] { new Vector2D ( ( int ) s . x + step * w , ( int ) s . y ) , new Vector2D ( ( int ) s . x + step * w + step , ( int ) s . y ) } ) ;
}
return shapes ;
2014-01-17 09:44:08 +00:00
}
2014-11-04 14:24:47 +00:00
if ( slicesV > 0 & & height > 0 )
{
shapes = new List < Vector2D [ ] > ( ) ;
int step = height / slicesV ;
for ( int h = 0 ; h < slicesV ; h + + )
{
shapes . Add ( new [ ] { new Vector2D ( ( int ) s . x , ( int ) s . y + step * h ) , new Vector2D ( ( int ) s . x , ( int ) s . y + step * h + step ) } ) ;
}
return shapes ;
}
//create a line
return new List < Vector2D [ ] > { new [ ] { s , e } } ;
2014-01-17 09:44:08 +00:00
}
2014-01-16 09:32:05 +00:00
//create shape
2014-11-04 14:24:47 +00:00
List < Vector2D > rect = new List < Vector2D > { s , new Vector2D ( ( int ) s . x , ( int ) e . y ) , e , new Vector2D ( ( int ) e . x , ( int ) s . y ) , s } ;
if ( ! gridlock & & slicesH = = 1 & & slicesV = = 1 )
{
2014-01-16 09:32:05 +00:00
if ( triangulate ) rect . AddRange ( new [ ] { s , e } ) ;
2014-11-04 14:24:47 +00:00
return new List < Vector2D [ ] > { rect . ToArray ( ) } ;
2014-01-16 09:32:05 +00:00
}
//create blocks
2014-11-04 14:24:47 +00:00
shapes = new List < Vector2D [ ] > { rect . ToArray ( ) } ;
2014-01-17 09:44:08 +00:00
RectangleF [ , ] blocks = new RectangleF [ slicesH , slicesV ] ;
2014-11-04 14:24:47 +00:00
for ( int w = 0 ; w < slicesH ; w + + )
{
for ( int h = 0 ; h < slicesV ; h + + )
{
2015-01-16 23:37:20 +00:00
float left = InterpolationTools . Interpolate ( s . x , e . x , ( float ) w / slicesH , horizontalinterpolation ) ;
float top = InterpolationTools . Interpolate ( s . y , e . y , ( float ) h / slicesV , verticalinterpolation ) ;
float right = InterpolationTools . Interpolate ( s . x , e . x , ( w + 1.0f ) / slicesH , horizontalinterpolation ) ;
float bottom = InterpolationTools . Interpolate ( s . y , e . y , ( h + 1.0f ) / slicesV , verticalinterpolation ) ;
blocks [ w , h ] = RectangleF . FromLTRB ( left , top , right , bottom ) ;
2014-01-16 09:32:05 +00:00
}
}
//add subdivisions
2014-11-04 14:24:47 +00:00
if ( slicesH > 1 )
{
for ( int w = 1 ; w < slicesH ; w + + )
{
2014-01-16 09:32:05 +00:00
int px = ( int ) Math . Round ( blocks [ w , 0 ] . X ) ;
shapes . Add ( new [ ] { new Vector2D ( px , s . y ) , new Vector2D ( px , e . y ) } ) ;
}
}
2014-11-04 14:24:47 +00:00
if ( slicesV > 1 )
{
for ( int h = 1 ; h < slicesV ; h + + )
{
2014-01-16 09:32:05 +00:00
int py = ( int ) Math . Round ( blocks [ 0 , h ] . Y ) ;
shapes . Add ( new [ ] { new Vector2D ( s . x , py ) , new Vector2D ( e . x , py ) } ) ;
}
}
//triangulate?
2014-11-04 14:24:47 +00:00
if ( triangulate )
{
2015-01-16 23:37:20 +00:00
bool startflip = ( ( int ) Math . Round ( ( ( s . x + e . y ) / General . Map . Grid . GridSize ) % 2 ) = = 0 ) ;
2014-11-04 14:24:47 +00:00
bool flip = startflip ;
for ( int w = 0 ; w < slicesH ; w + + )
{
for ( int h = slicesV - 1 ; h > - 1 ; h - - )
{
if ( flip )
2014-01-16 09:32:05 +00:00
shapes . Add ( new [ ] { new Vector2D ( blocks [ w , h ] . X , blocks [ w , h ] . Y ) , new Vector2D ( blocks [ w , h ] . Right , blocks [ w , h ] . Bottom ) } ) ;
2014-11-04 14:24:47 +00:00
else
2014-01-16 09:32:05 +00:00
shapes . Add ( new [ ] { new Vector2D ( blocks [ w , h ] . Right , blocks [ w , h ] . Y ) , new Vector2D ( blocks [ w , h ] . X , blocks [ w , h ] . Bottom ) } ) ;
flip = ! flip ;
}
startflip = ! startflip ;
flip = startflip ;
}
}
return shapes ;
}
2014-11-04 14:24:47 +00:00
//update bottom-left and top-right points, which define drawing shape
2014-12-03 23:15:26 +00:00
private void UpdateReferencePoints ( DrawnVertex p1 , DrawnVertex p2 )
2014-11-04 14:24:47 +00:00
{
2014-01-17 09:44:08 +00:00
if ( ! p1 . pos . IsFinite ( ) | | ! p2 . pos . IsFinite ( ) ) return ;
2014-11-04 14:24:47 +00:00
if ( p1 . pos . x < p2 . pos . x )
{
2014-01-16 09:32:05 +00:00
start . x = p1 . pos . x ;
end . x = p2 . pos . x ;
2014-11-04 14:24:47 +00:00
}
else
{
2014-01-16 09:32:05 +00:00
start . x = p2 . pos . x ;
end . x = p1 . pos . x ;
}
2014-11-04 14:24:47 +00:00
if ( p1 . pos . y < p2 . pos . y )
{
2014-01-16 09:32:05 +00:00
start . y = p1 . pos . y ;
end . y = p2 . pos . y ;
2014-11-04 14:24:47 +00:00
}
else
{
2014-01-16 09:32:05 +00:00
start . y = p2 . pos . y ;
end . y = p1 . pos . y ;
}
width = ( int ) ( end . x - start . x ) ;
height = ( int ) ( end . y - start . y ) ;
}
#endregion
#region = = = = = = = = = = = = = = = = = = Actions
[BeginAction("increasebevel")]
2014-12-03 23:15:26 +00:00
protected void IncreaseBevel ( )
2014-11-04 14:24:47 +00:00
{
if ( ! gridlock & & ( points . Count < 2 | | horizontalSlices < width - 2 ) & & horizontalSlices - 1 < panel . MaxHorizontalSlices )
{
2014-01-16 09:32:05 +00:00
horizontalSlices + + ;
panel . HorizontalSlices = horizontalSlices - 1 ;
Update ( ) ;
}
}
[BeginAction("decreasebevel")]
2014-12-03 23:15:26 +00:00
protected void DecreaseBevel ( )
2014-11-04 14:24:47 +00:00
{
if ( ! gridlock & & horizontalSlices > 1 )
{
2014-01-16 09:32:05 +00:00
horizontalSlices - - ;
panel . HorizontalSlices = horizontalSlices - 1 ;
Update ( ) ;
}
}
[BeginAction("increasesubdivlevel")]
2014-12-03 23:15:26 +00:00
protected void IncreaseSubdivLevel ( )
2014-11-04 14:24:47 +00:00
{
if ( ! gridlock & & ( points . Count < 2 | | verticalSlices < height - 2 ) & & verticalSlices - 1 < panel . MaxVerticalSlices )
{
2014-01-16 09:32:05 +00:00
verticalSlices + + ;
panel . VerticalSlices = verticalSlices - 1 ;
Update ( ) ;
}
}
[BeginAction("decreasesubdivlevel")]
2014-12-03 23:15:26 +00:00
protected void DecreaseSubdivLevel ( )
2014-11-04 14:24:47 +00:00
{
if ( ! gridlock & & verticalSlices > 1 )
{
2014-01-16 09:32:05 +00:00
verticalSlices - - ;
panel . VerticalSlices = verticalSlices - 1 ;
Update ( ) ;
}
}
#endregion
}
}