diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 4399061..4c185cb 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -4,7 +4,7 @@ { "label": "Build PNGTuber-Plus", "type": "shell", - "command": "cd c:\\DEV\\Sync\\PNGTuber-Plus && .\\build-windows.bat", + "command": "cd c:\\DEV\\Sync\\PNGTuber-Plus; .\\build-windows.bat", "group": "build" } ] diff --git a/addons/godot-git-plugin/win64/~libgit_plugin.windows.editor.x86_64.dll b/addons/godot-git-plugin/win64/~libgit_plugin.windows.editor.x86_64.dll~RF19a1f65d.TMP similarity index 100% rename from addons/godot-git-plugin/win64/~libgit_plugin.windows.editor.x86_64.dll rename to addons/godot-git-plugin/win64/~libgit_plugin.windows.editor.x86_64.dll~RF19a1f65d.TMP diff --git a/autoload/global.gd b/autoload/global.gd index da52eb6..aaad2df 100644 --- a/autoload/global.gd +++ b/autoload/global.gd @@ -106,7 +106,7 @@ func _process(delta): heldSprite.z += 1 heldSprite.setZIndex() pushUpdate("Moved sprite layer.") - if main.editMode: + if main and main.editMode: if Input.is_action_just_pressed("reparent"): reparentMode = !reparentMode Global.chain.enable(reparentMode) @@ -115,7 +115,7 @@ func _process(delta): reparentMode = false Global.chain.enable(reparentMode) - if main.editMode: + if main and main.editMode: if reparentMode: RenderingServer.set_default_clear_color(Color.POWDER_BLUE) else: @@ -126,7 +126,7 @@ func _process(delta): scrollSprites() - if !main.fileSystemOpen: + if !main or main.fileSystemOpen: if Input.is_action_just_pressed("refresh"): refresh() @@ -222,7 +222,7 @@ func scrollSprites(): if Input.is_action_pressed("control"): return - if !main.editMode: + if !main or !main.editMode: return if main.fileSystemOpen: diff --git a/bin/~libgdexample.windows.template_debug.x86_64.dll b/bin/~libgdexample.windows.template_debug.x86_64.dll~RF19a1f65d.TMP similarity index 100% rename from bin/~libgdexample.windows.template_debug.x86_64.dll rename to bin/~libgdexample.windows.template_debug.x86_64.dll~RF19a1f65d.TMP diff --git a/main_scenes/main.gd b/main_scenes/main.gd index 56a7e63..2e2427f 100644 --- a/main_scenes/main.gd +++ b/main_scenes/main.gd @@ -43,6 +43,12 @@ var bounceOnCostumeChange = false #Zooming var scaleOverall = 100 +#Camera Panning +var isPanning = false +var initialPanPosition = Vector2.ZERO +var initialCameraOffset = Vector2.ZERO +var cameraOffset = Vector2.ZERO + var bounceChange = 0.0 #IMPORTANT @@ -130,7 +136,7 @@ func _ready(): var s = get_viewport().get_visible_rect().size origin.position = s*0.5 - camera.position = origin.position + updateCameraPosition() func _process(delta): var hold = origin.get_parent().position.y @@ -152,6 +158,43 @@ func _process(delta): followShadow() +## Handle input events, especially for camera panning +func _input(event): + # Handle middle mouse button for camera panning/reset + if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_MIDDLE: + if editMode: + if event.pressed: + # Start panning in edit mode + isPanning = true + initialPanPosition = event.global_position + initialCameraOffset = cameraOffset + else: + # Stop panning + isPanning = false + else: + if event.pressed: + # Reset camera in view mode + resetCameraPosition() + + # Handle mouse movement during panning + elif editMode and event is InputEventMouseMotion and isPanning: + var totalDelta = event.global_position - initialPanPosition + + # Calculate new camera offset from initial position plus total movement + cameraOffset = initialCameraOffset - totalDelta + + # Update camera position immediately + var s = get_viewport().get_visible_rect().size + camera.position = origin.position + cameraOffset + + # Update UI positions + controlPanel.position = camera.position + (s/(camera.zoom*2.0)) + tutorial.position = controlPanel.position + editControls.position = camera.position - (s/(camera.zoom*2.0)) + viewerArrows.position = editControls.position + pushUpdates.position.y = controlPanel.position.y + pushUpdates.position.x = editControls.position.x + func followShadow(): # Shadow disabled for selected sprites shadow.visible = false @@ -189,14 +232,8 @@ func onWindowSizeChange(): lines.position = s*0.5 lines.drawLine() - camera.position = origin.position - controlPanel.position = camera.position + (s/(camera.zoom*2.0)) - tutorial.position = controlPanel.position - editControls.position = camera.position - (s/(camera.zoom*2.0)) - viewerArrows.position = editControls.position + updateCameraPosition() spriteList.position.x = s.x - 233 - pushUpdates.position.y = controlPanel.position.y - pushUpdates.position.x = editControls.position.x func zoomScene(): #Handles Zooming @@ -228,7 +265,29 @@ func changeZoom(): $ControlPanel/ZoomLabel.text = "Zoom : " + str(scaleOverall) + "%" Global.pushUpdate("Set zoom to " + str(scaleOverall) + "%") - onWindowSizeChange() + +## Update camera position with current offset +func updateCameraPosition(): + var s = get_viewport().get_visible_rect().size + + # Only update if not currently panning to avoid conflicts + if !isPanning: + camera.position = origin.position + cameraOffset + + # Update UI element positions relative to new camera position + controlPanel.position = camera.position + (s/(camera.zoom*2.0)) + tutorial.position = controlPanel.position + editControls.position = camera.position - (s/(camera.zoom*2.0)) + viewerArrows.position = editControls.position + pushUpdates.position.y = controlPanel.position.y + pushUpdates.position.x = editControls.position.x + +## Reset camera position to center +func resetCameraPosition(): + cameraOffset = Vector2.ZERO + isPanning = false + updateCameraPosition() + Global.pushUpdate("Camera reset to center.") #When the user speaks! func onSpeak(): @@ -243,6 +302,10 @@ func swapMode(): editMode = !editMode Global.pushUpdate("Toggled editing mode.") + # Reset camera when entering view mode + if !editMode: + resetCameraPosition() + get_viewport().transparent_bg = !editMode if Global.backgroundColor.a != 0.0: get_viewport().transparent_bg = false diff --git a/project.godot b/project.godot index ed8db17..ccf6086 100644 --- a/project.godot +++ b/project.godot @@ -136,6 +136,11 @@ control={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194326,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } +mouse_middle={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":3,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} saveImages={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":76,"key_label":0,"unicode":108,"location":0,"echo":false,"script":null) diff --git a/ui_scenes/mouse/mouse_cursor.gd b/ui_scenes/mouse/mouse_cursor.gd index c958d13..91b4eb1 100644 --- a/ui_scenes/mouse/mouse_cursor.gd +++ b/ui_scenes/mouse/mouse_cursor.gd @@ -9,7 +9,7 @@ func _ready(): Global.mouse = self func _process(delta): - if Global.main.editMode: + if Global.main and Global.main.editMode: if text != "": label.text = text visible = true diff --git a/ui_scenes/selectedSprite/spriteObject.gd b/ui_scenes/selectedSprite/spriteObject.gd index 0353874..a8ab514 100644 --- a/ui_scenes/selectedSprite/spriteObject.gd +++ b/ui_scenes/selectedSprite/spriteObject.gd @@ -269,7 +269,7 @@ func setZIndex(): sprite.z_index = z func talkBlink(): - var faded = 0.2 * int(Global.main.editMode) + var faded = 0.2 * int(Global.main and Global.main.editMode) var value = (showOnTalk + (showOnBlink*3)) + (int(Global.speaking)*10) + (int(Global.blink)*20) var yes = [0,10,20,30,1,21,12,32,3,13,4,15,26,36,27,38].has(int(value)) var baseAlpha = max(int(yes), faded)