extends Node2D const DragPoly2DScene = preload("res://DragPoly2D.tscn") # export(NodePath) onready var dottedLineNode = get_node(dottedLineNode) as Node export(PackedScene) var dottedLineScene var dottedLineSceneInstance var doOnce = false var leftMouseDragging = false var startDragPos = Vector2() var startScreenPos = Vector2() var dragRatio = 1 var startDragNode var endDragNode var polyWidth = 10.0 var polyPoints = [PoolVector2Array()] var centerPolyPt = Vector2() var dragPolyInstance : DragPoly2D var dragPolySceneArray = [DragPoly2D] var dragPolyCounter = 0 # Declare member variables here. Examples: # var a = 2 # var b = "text" # Called when the node enters the scene tree for the first time. func _ready(): set_process_input(true) pass # Replace with function body. dottedLineSceneInstance = dottedLineScene.instance() startDragNode = $StartPos endDragNode = $EndPos func _draw(): #var points = PoolVector2Array() var colour = PoolColorArray() colour = [Color(0.5,0.5,0.5,1.0)] if polyPoints.size() > 0: draw_polygon(polyPoints,colour) print("drawing!") # colour = [Color(slider.value,1,1,1)] func _process(_delta): pass # if !doOnce: # print(dottedLineSceneInstance.SayHi()) # doOnce = true func _input(event): if event.is_action("Click"): if event.is_pressed(): startDragPos = event.position startDragNode.position = startDragPos startScreenPos = position leftMouseDragging = true dottedLineSceneInstance.SetFrom(startDragNode.position) else: # create a new instance of dragPoly2D # append it to the dragPolySceneArray # modify the dragPolySceneArray[dragPolyCounter].shape dragPolySceneArray.append(CreateDragPolyInstanceAndAddAsChild()) dragPolySceneArray[dragPolyCounter].set_shape(polyPoints) print(str(dragPolySceneArray[dragPolyCounter].get_collision_layer())) update() leftMouseDragging = false startDragPos = Vector2() startScreenPos = Vector2() centerPolyPt = Vector2() polyPoints = [PoolVector2Array()] #dottedLineSceneInstance.SetFrom(Vector2()) #dottedLineSceneInstance.SetTo(Vector2()) # mouse release click... elif event.is_action("AltClick"): if event.is_pressed(): #spawn rock at mouse position var rock = $TestBoulder.duplicate() add_child(rock) rock.set_global_position(event.position) print(str(rock.get_collision_mask())) # dragging with mouse... elif event is InputEventMouseMotion and leftMouseDragging: var dragVector = Vector2() var perpLeftVector = Vector2() var perpRightVector = Vector2() var startPolyPArray = [] var endPolyPArray = [] var combinedPolyPArray = [] endDragNode.position = event.position dragVector = GetDragVector(startDragNode.position, endDragNode.position) perpLeftVector = GetCCWPerpendicularVector(dragVector) perpRightVector = GetCWPerpendicularVector(dragVector) #dottedLineSceneInstance.SetTo(endDragNode.position) startPolyPArray = CalcStartingPolyPoints(perpLeftVector,perpRightVector, startDragNode.position) endPolyPArray = CalcEndPolyPoints(perpLeftVector,perpRightVector,endDragNode.position) combinedPolyPArray = startPolyPArray + endPolyPArray # var unsortedArray = combinedPolyPArray # for p in unsortedArray.size(): # print("unsorted array + " + str(unsortedArray[p])) centerPolyPt = CalcCenterPoint((combinedPolyPArray)) combinedPolyPArray.sort_custom(self, "SortPointsCCW") # for p in combinedPolyPArray.size(): # print("sorted array + " + str(combinedPolyPArray[p])) polyPoints = combinedPolyPArray #_draw() update() # print(str(CalcCenterPoint(polyArray))) # for p in polyArray.size(): # print("whole array " + str(polyArray[p])) #dottedLineSceneInstance.DoDashedLineUpdate() # this is for camera position # position = GetPosition(event) pass func CreateDragPolyInstanceAndAddAsChild(): var m_dragPolyInstance = DragPoly2DScene.instance() add_child(m_dragPolyInstance) dragPolyCounter += 1 return m_dragPolyInstance func GetPosition(eventVar) -> Vector2: # return zoom * ((mouseStartPos - eventVar.position) * dragRatio) + screenStartPosition return (startDragPos - eventVar.position) * dragRatio + startScreenPos func GetDragVector(startPos, endPos) -> Vector2: return endPos - startPos func GetCWPerpendicularVector(vectorFromDrag) -> Vector2: var v = vectorFromDrag # rotate right (clockwise) return Vector2(-v.y, v.x).normalized() func GetCCWPerpendicularVector(vectorFromDrag) -> Vector2: var v = vectorFromDrag # rotate left (counter-clockwise) return Vector2(v.y, -v.x).normalized() func CalcStartingPolyPoints(leftVec,rightVec, startPos) -> PoolVector2Array: var startPolyPArray = [] var p1 = startPos + (leftVec * polyWidth) var p2 = startPos + (rightVec * polyWidth) startPolyPArray.push_back(p1) startPolyPArray.push_back(p2) # for p in startPolyPArray.size(): # print(str(startPolyPArray[p])) return startPolyPArray func CalcEndPolyPoints(leftVec,rightVec,endPos) -> PoolVector2Array: var endPolyPArray = [] var p1 = endPos + (leftVec * polyWidth) var p2 = endPos + (rightVec * polyWidth) endPolyPArray.push_back(p1) endPolyPArray.push_back(p2) # for p in endPolyPArray.size(): # print("end points " + str(endPolyPArray[p])) return endPolyPArray func CalcCenterPoint(pointArray) -> Vector2: var totalX = 0 var totalY = 0 for p in pointArray.size(): totalX += pointArray[p].x totalY += pointArray[p].y var centerX = totalX / pointArray.size() var centerY = totalY / pointArray.size() return Vector2(centerX, centerY) func SortPointsCCW(a, b): return (a - centerPolyPt).angle() > (b - centerPolyPt).angle()