diff options
| -rw-r--r-- | vec2ddes.bmx | 209 | 
1 files changed, 146 insertions, 63 deletions
diff --git a/vec2ddes.bmx b/vec2ddes.bmx index 2782d93..a63cd75 100644 --- a/vec2ddes.bmx +++ b/vec2ddes.bmx @@ -176,7 +176,7 @@ Type TDesLine Extends TDesObj  		EndIf  		SetColor(r,g,b) -		DrawLine(p1.x*scale,p1.y*scale,p2.x*scale,p2.y*scale) +		DrawLine(p1.lx()*scale,p1.ly()*scale,p2.lx()*scale,p2.ly()*scale)  	End Method  	Method DrawSelect() @@ -236,6 +236,8 @@ End Type  Type TDesPoint Extends TDesObj  	Field x:Int  	Field y:Int +	Field dx:Double +	Field dy:Double  	Function Create:TDesObj(x:Int, y:Int)  		Local o:TDesPoint=New TDesPoint @@ -265,11 +267,11 @@ Type TDesPoint Extends TDesObj  	Method Draw(normals:Int)  		SetColor(255,255,255) -		DrawRect(x*scale-1,y*scale-1,3,3) +		DrawRect(lx()*scale-1,ly()*scale-1,3,3)  	End Method  	Method DrawSelect() -		DrawSelBox(x,y) +		DrawSelBox(lx(),ly())  	End Method  	Method MouseOver:Int(x:Int, y:Int) @@ -284,6 +286,18 @@ Type TDesPoint Extends TDesObj  		EndIf  	End Method +	Method DragDelta(x:Double, y:Double) +		dx=x +		dy=y +	End Method + +	Method CompleteDragDelta() +		x=lx() +		y=ly() +		dx=0 +		dy=0 +	End Method +  	Method Edit()  	End Method @@ -295,6 +309,14 @@ Type TDesPoint Extends TDesObj  		x=CalcSnap(x)  		y=CalcSnap(y)  	End Method +	 +	Method lx:Int() +		Return x+dx +	End Method +	 +	Method ly:Int() +		Return y+dy +	End Method  End Type  ' **** Globals @@ -433,11 +455,18 @@ Function DoDesigner()  	Const DOT_TO_DOT_SNAP_MODE:Int=3  	Const LINE_TO_LINE_MODE:Int=4 +	Const DRAG_NONE:Int=0 +	Const DRAG_SINGLE:Int=1 +	Const DRAG_MULTI:Int=2 +	  	Local sel:TDesObj=Null -	Local drag:Int=False -	Local sel1:TDesObj=Null +	Local drag:Int=DRAG_NONE +	Local sellist:TList=CreateList()  	Local mode:Int=NORMAL_MODE +	Local dragx:Double +	Local dragy:Double +	  	While Not Designer.done  		Cls @@ -479,7 +508,7 @@ Function DoDesigner()  		Local x:Int=(MouseX()-GraphicsWidth()/2)  		Local y:Int=(MouseY()-GraphicsHeight()/2) -		If Not drag +		If drag=DRAG_NONE  			sel=Null  		EndIf @@ -493,116 +522,170 @@ Function DoDesigner()  		If sel<>Null  			sel.SetInfo(Designer.info) -			sel.DrawSelect()  			Select mode  				Case LINE_MODE  					If IsPoint(sel) -						If sel1=Null -							sel1=sel +						If sellist.Count()=0 +							sellist.AddLast(sel)  						Else -							If sel1<>sel +							If sel<>sellist.ValueAtIndex(0)  								mode=NORMAL_MODE -								Designer.obj.AddLast(TDesLine.Create(TDesPoint(sel1),TDesPoint(sel))) +								Designer.obj.AddLast(TDesLine.Create(TDesPoint(sellist.ValueAtIndex(0)),TDesPoint(sel))) +								sellist.Clear()  							EndIf  						EndIf  					EndIf  				Case LINE_TO_LINE_MODE  					If IsPoint(sel) -						If sel1=Null -							sel1=sel +						If sellist.Count()=0 +							sellist.AddLast(sel)  						Else -							If sel1<>sel -								Designer.obj.AddLast(TDesLine.Create(TDesPoint(sel1),TDesPoint(sel))) -								sel1=sel +							If sel<>sellist.ValueAtIndex(0) +								Designer.obj.AddLast(TDesLine.Create(TDesPoint(sellist.ValueAtIndex(0)),TDesPoint(sel))) +								sellist.Clear()  							EndIf  						EndIf  					EndIf +				Case NORMAL_MODE +					If KeyDown(KEY_LSHIFT) Or KeyDown(KEY_RSHIFT) +						If IsPoint(sel) And Not sellist.Contains(sel) +							sellist.AddLast(sel) +						EndIf +					Else +						sellist.Clear() +						sellist.AddLast(sel) +					EndIf  			End Select +		Else +			If Not KeyDown(KEY_LSHIFT) And Not KeyDown(KEY_RSHIFT) +				sellist.Clear() +			EndIf  		EndIf -		If drag +					 +		For Local o:TDesObj=EachIn sellist +			o.DrawSelect() +		Next +		 +		If drag=DRAG_SINGLE  			sel.Drag(x/scale,y/scale,True) +		ElseIf drag=DRAG_MULTI +			For Local o:TDesPoint=EachIn sellist +				o.DragDelta((x-dragx)/scale,(y-dragy)/scale) +			Next  		EndIf  		SetOrigin(0,0)  		'  		' **** END CENTRED -		If Not drag And mode=NORMAL_MODE +		If drag=DRAG_NONE And mode=NORMAL_MODE  			Designer.gui.EventLoop()  		EndIf  		If mode=NORMAL_MODE And KeyHit(KEY_MOUSERIGHT) -			If sel<>Null -				If IsPoint(sel) -					Select GUIMenu("Point Menu",["Snap to grid","Delete"],MouseX(),MouseY(),pointer) -						Case 0 -							sel.Snap() -						Case 1 -							Designer.obj.Remove(sel) +			If sellist.Count()>0 +				Select GUIMenu("Point Menu",["Snap to grid","Delete"],MouseX(),MouseY(),pointer) +					Case 0 +						For Local o:TDesPoint=EachIn sellist +							o.Snap() +						Next +						sellist.Clear() +					Case 1 +						For Local o:TDesPoint=EachIn sellist +							Designer.obj.Remove(o)  							For Local d:TDesLine=EachIn Designer.obj -								If d<>Null And (d.p1=sel Or d.p2=sel) +								If d<>Null And (d.p1=o Or d.p2=o)  									Designer.obj.Remove(d)  								EndIf  							Next -					End Select +						Next +						sellist.Clear() +				EndSelect +			Else +				If sel<>Null +					If IsPoint(sel) +						Select GUIMenu("Point Menu",["Snap to grid","Delete"],MouseX(),MouseY(),pointer) +							Case 0 +								sel.Snap() +							Case 1 +								Designer.obj.Remove(sel) +								 +								For Local d:TDesLine=EachIn Designer.obj +									If d<>Null And (d.p1=sel Or d.p2=sel) +										Designer.obj.Remove(d) +									EndIf +								Next +						End Select +					Else +						Local l:TDesLine=TDesLine(sel) +						Select GUIMenu("Line Menu",["Edit","Snap to grid","Flip","Delete"],MouseX(),MouseY(),pointer) +							Case 0 +								l.Edit() +							Case 1 +								l.Snap() +							Case 2 +								l.FlipNormal() +							Case 3 +								Designer.obj.Remove(l) +						End Select +					EndIf  				Else -					Local l:TDesLine=TDesLine(sel) -					Select GUIMenu("Line Menu",["Edit","Snap to grid","Flip","Delete"],MouseX(),MouseY(),pointer) +					Select GUIMenu("Create Menu",["Create Point","Create Line","Create Points","Create Points (Snapped)","Create Lines"],MouseX(),MouseY(),pointer)  						Case 0 -							l.Edit() +							Designer.obj.AddLast(TDesPoint.Create(x/scale,y/scale))  						Case 1 -							l.Snap() +							sellist.Clear() +							sel=Null +							mode=LINE_MODE  						Case 2 -							l.FlipNormal() +							sellist.Clear() +							sel=Null +							mode=DOT_TO_DOT_MODE  						Case 3 -							Designer.obj.Remove(l) +							sellist.Clear() +							sel=Null +							mode=DOT_TO_DOT_SNAP_MODE +						Case 4 +							sellist.Clear() +							sel=Null +							mode=LINE_TO_LINE_MODE  					End Select -				EndIf -			Else -				Select GUIMenu("Create Menu",["Create Point","Create Line","Create Points","Create Points (Snapped)","Create Lines"],MouseX(),MouseY(),pointer) -					Case 0 -						Designer.obj.AddLast(TDesPoint.Create(x/scale,y/scale)) -					Case 1 -						sel1=Null -						sel=Null -						mode=LINE_MODE -					Case 2 -						sel1=Null -						sel=Null -						mode=DOT_TO_DOT_MODE -					Case 3 -						sel1=Null -						sel=Null -						mode=DOT_TO_DOT_SNAP_MODE -					Case 4 -						sel1=Null -						sel=Null -						mode=LINE_TO_LINE_MODE -				End Select +				EndIf				 +				sel=Null  			EndIf -			sel=Null  		EndIf  		SetColor(255,255,255)  		Select mode  			Case NORMAL_MODE -				If Not drag -					If KeyDown(KEY_MOUSELEFT) And sel<>Null -						mode=NORMAL_MODE -						drag=True +				If drag=DRAG_NONE +					If KeyDown(KEY_MOUSELEFT) +						If sel<>Null And Not KeyDown(KEY_LSHIFT) And Not KeyDown(KEY_RSHIFT) +							drag=DRAG_SINGLE +						ElseIf (KeyDown(KEY_LSHIFT) Or KeyDown(KEY_RSHIFT)) And sellist.Count()>0 +							drag=DRAG_MULTI +							dragx=x +							dragy=y +						EndIf  					EndIf  				Else  					If Not KeyDown(KEY_MOUSELEFT) -						drag=False +						If drag=DRAG_MULTI +							For Local o:TDesPoint=EachIn sellist +								o.CompleteDragDelta() +							Next +						EndIf + +						drag=DRAG_NONE  					EndIf  				EndIf  			Case LINE_MODE -				If Not sel1 +				If sellist.Count()=0  					Tip("Move to first point")  				Else  					Tip("Move to second point") @@ -624,7 +707,7 @@ Function DoDesigner()  				EndIf  			Case LINE_TO_LINE_MODE -				If Not sel1 +				If sellist.Count()=0  					Tip("Move to first point")  				Else  					Tip("Move to next point")  | 
