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 new file mode 100644 index 0000000..60e5fe6 Binary files /dev/null and b/addons/godot-git-plugin/win64/~libgit_plugin.windows.editor.x86_64.dll differ diff --git a/bin/~libgdexample.windows.template_debug.x86_64.dll b/bin/~libgdexample.windows.template_debug.x86_64.dll new file mode 100644 index 0000000..c28b9ad Binary files /dev/null and b/bin/~libgdexample.windows.template_debug.x86_64.dll differ diff --git a/main_scenes/main.gd b/main_scenes/main.gd index 9b0a6e8..38e90d5 100644 --- a/main_scenes/main.gd +++ b/main_scenes/main.gd @@ -508,6 +508,14 @@ func _on_load_dialog_file_selected(path): if data[item].has("wobbleSyncGroup"): sprite.wobbleSyncGroup = data[item]["wobbleSyncGroup"] + # Load transform properties (with backward compatibility) + if data[item].has("staticRotation"): + sprite.staticRotation = data[item]["staticRotation"] + if data[item].has("mirrorHorizontal"): + sprite.mirrorHorizontal = data[item]["mirrorHorizontal"] + if data[item].has("mirrorVertical"): + sprite.mirrorVertical = data[item]["mirrorVertical"] + origin.add_child(sprite) sprite.position = str_to_var(data[item]["pos"]) @@ -605,6 +613,11 @@ func _on_save_dialog_file_selected(path): # Save wobble sync group data[id]["wobbleSyncGroup"] = child.wobbleSyncGroup + # Save transform properties + data[id]["staticRotation"] = child.staticRotation + data[id]["mirrorHorizontal"] = child.mirrorHorizontal + data[id]["mirrorVertical"] = child.mirrorVertical + id += 1 # Save wobble sync groups @@ -692,6 +705,11 @@ func _on_duplicate_button_pressed(): # Copy wobble sync group sprite.wobbleSyncGroup = Global.heldSprite.wobbleSyncGroup + # Copy transform properties + sprite.staticRotation = Global.heldSprite.staticRotation + sprite.mirrorHorizontal = Global.heldSprite.mirrorHorizontal + sprite.mirrorVertical = Global.heldSprite.mirrorVertical + origin.add_child(sprite) sprite.position = Global.heldSprite.position + Vector2(16,16) diff --git a/ui_scenes/selectedSprite/spriteObject.gd b/ui_scenes/selectedSprite/spriteObject.gd index cb081e6..2a4731e 100644 --- a/ui_scenes/selectedSprite/spriteObject.gd +++ b/ui_scenes/selectedSprite/spriteObject.gd @@ -100,6 +100,11 @@ var toggle = "null" #Wobble Sync Group var wobbleSyncGroup = "" +#Transform +var staticRotation = 0.0 +var mirrorHorizontal = false +var mirrorVertical = false + func _ready(): Global.main.spriteVisToggles.connect(visToggle) @@ -264,6 +269,7 @@ func _process(delta): rotationalDrag(length,delta) stretch(length,delta) + applyStaticTransform() if grabDelay > 0: grabDelay -= 1 @@ -431,7 +437,7 @@ func rotationalDrag(length, delta): var physicsMultiplier = Global.main.physicsTimeMultiplier if Global.main else 10.0 var scaledTime = time * physicsMultiplier var rotationWobble = sin(scaledTime * rFrq) * (rotationRange * rAmp * 0.01) - var totalRotation = yvel + rotationWobble + var totalRotation = yvel + rotationWobble + staticRotation # Use delta-based lerp for smooth rotation with slower speed var lerpFactor = clamp(delta * (physicsMultiplier * 1.0), 0.0, 1.0) # Reduced from 15.0 to 4.0 @@ -446,6 +452,20 @@ func stretch(length, delta): var lerpFactor = clamp(delta * (physicsMultiplier * 30.0), 0.0, 1.0) sprite.scale = lerp(sprite.scale, target, lerpFactor) +## Apply static transformation (mirroring) +func applyStaticTransform(): + var scale_x = 1.0 + var scale_y = 1.0 + + if mirrorHorizontal: + scale_x = -1.0 + if mirrorVertical: + scale_y = -1.0 + + # Apply mirror scaling while preserving the stretch scale + var current_scale = sprite.scale + sprite.scale = Vector2(abs(current_scale.x) * scale_x, abs(current_scale.y) * scale_y) + func changeCollision(enable): grabArea.monitorable = enable grabArea.monitorable = enable diff --git a/ui_scenes/spriteEditMenu/sprite_viewer.gd b/ui_scenes/spriteEditMenu/sprite_viewer.gd index f41caa8..211c919 100644 --- a/ui_scenes/spriteEditMenu/sprite_viewer.gd +++ b/ui_scenes/spriteEditMenu/sprite_viewer.gd @@ -37,6 +37,7 @@ func _setup_slider_components(): _setup_limit_sliders() _setup_animation_sliders() _setup_opacity_slider() + _setup_transform_sliders() ## Set up drag slider func _setup_drag_slider(): @@ -104,6 +105,13 @@ func _setup_opacity_slider(): slider_manager.add_slider(opacity_slider) opacity_slider.value_changed.connect(_on_opacity_slider_changed) +## Set up transform sliders +func _setup_transform_sliders(): + var rotation_slider = $VBoxContainer/TransformSection/rotationSlider + if rotation_slider: + slider_manager.add_slider(rotation_slider) + rotation_slider.value_changed.connect(_on_transform_slider_changed) + ## Generic slider change handlers func _on_drag_slider_value_changed(value: float): if Global.heldSprite: @@ -136,6 +144,10 @@ func _on_animation_slider_changed(value: float): func _on_opacity_slider_changed(value: float): # Opacity slider handles its own parameter updates via sprite_property pass + +func _on_transform_slider_changed(value: float): + # Transform sliders handle their own parameter updates via sprite_property + pass func setImage(): if Global.heldSprite == null: @@ -145,6 +157,12 @@ func setImage(): spriteSpin.pixel_size = 1.5 / Global.heldSprite.imageData.get_size().y spriteSpin.hframes = Global.heldSprite.frames + # Apply static rotation and mirroring to 3D preview + spriteSpin.rotation = Vector3(0, 0, deg_to_rad(Global.heldSprite.staticRotation)) + var scale_x = -1.0 if Global.heldSprite.mirrorHorizontal else 1.0 + var scale_y = -1.0 if Global.heldSprite.mirrorVertical else 1.0 + spriteSpin.scale = Vector3(scale_x, scale_y, 1.0) + spriteRotDisplay.texture = Global.heldSprite.tex spriteRotDisplay.offset = Global.heldSprite.offset var displaySize = Global.heldSprite.imageData.get_size().y @@ -171,6 +189,10 @@ func setImage(): $VBoxContainer/RenderingSection/affectChildrenCheck.button_pressed = Global.heldSprite.affectChildrenOpacity $VBoxContainer/RenderingSection/blendModeContainer/blendModeDropdown.selected = Global.heldSprite.blendMode + # Update transform controls + $VBoxContainer/TransformSection/MirrorControls/mirrorHorizontalCheck.button_pressed = Global.heldSprite.mirrorHorizontal + $VBoxContainer/TransformSection/MirrorControls/mirrorVerticalCheck.button_pressed = Global.heldSprite.mirrorVertical + $VBoxContainer/BoxContainer/setToggle/Label.text = "toggle: \"" + Global.heldSprite.toggle + "\"" changeRotLimit() @@ -261,6 +283,11 @@ func _update_all_slider_values(): var opacity_slider = $VBoxContainer/RenderingSection/opacitySlider if opacity_slider: opacity_slider.set_value(Global.heldSprite.spriteOpacity) + + # Update transform slider + var rotation_slider = $VBoxContainer/TransformSection/rotationSlider + if rotation_slider: + rotation_slider.set_value(Global.heldSprite.staticRotation) ## Update wobble control states based on sync status func updateWobbleControlStates(): @@ -554,6 +581,12 @@ func _on_affect_children_check_toggled(button_pressed): Global.heldSprite.affectChildrenOpacity = button_pressed Global.heldSprite.updateOpacity() +func _on_mirror_horizontal_check_toggled(button_pressed): + Global.heldSprite.mirrorHorizontal = button_pressed + +func _on_mirror_vertical_check_toggled(button_pressed): + Global.heldSprite.mirrorVertical = button_pressed + ## Set up the blend mode dropdown with all available blend modes func setupBlendModeDropdown(): blendModeDropdown.clear() diff --git a/ui_scenes/spriteEditMenu/sprite_viewer.tscn b/ui_scenes/spriteEditMenu/sprite_viewer.tscn index 02121a4..c750345 100644 --- a/ui_scenes/spriteEditMenu/sprite_viewer.tscn +++ b/ui_scenes/spriteEditMenu/sprite_viewer.tscn @@ -14529,6 +14529,48 @@ layout_mode = 2 theme = SubResource("Theme_mrbyn") text = "Affect children" +[node name="TransformSection" type="VBoxContainer" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 0 +theme_override_constants/separation = 5 + +[node name="TransformTitle" type="Label" parent="VBoxContainer/TransformSection"] +custom_minimum_size = Vector2(0, 38.93) +layout_mode = 2 +theme_override_colors/font_shadow_color = Color(0, 0, 0, 0.486275) +theme_override_constants/shadow_offset_x = 2 +theme_override_constants/shadow_offset_y = 2 +theme_override_constants/shadow_outline_size = 5 +theme_override_fonts/font = ExtResource("2_da8lk") +theme_override_font_sizes/font_size = 21 +text = "TRANSFORM" +label_settings = SubResource("LabelSettings_da8lk") +horizontal_alignment = 1 +vertical_alignment = 2 + +[node name="rotationSlider" parent="VBoxContainer/TransformSection" instance=ExtResource("3_parameter_slider")] +layout_mode = 2 +parameter_name = "staticRotation" +sprite_property = "staticRotation" +label_text = "Rotation" +min_value = -360.0 +max_value = 360.0 +value_suffix = "°" + +[node name="MirrorControls" type="HBoxContainer" parent="VBoxContainer/TransformSection"] +layout_mode = 2 +theme_override_constants/separation = 10 + +[node name="mirrorHorizontalCheck" type="CheckBox" parent="VBoxContainer/TransformSection/MirrorControls"] +layout_mode = 2 +theme = SubResource("Theme_mrbyn") +text = "Mirror H" + +[node name="mirrorVerticalCheck" type="CheckBox" parent="VBoxContainer/TransformSection/MirrorControls"] +layout_mode = 2 +theme = SubResource("Theme_mrbyn") +text = "Mirror V" + [node name="AnimationSection" type="VBoxContainer" parent="VBoxContainer"] layout_mode = 2 size_flags_vertical = 0 @@ -15072,7 +15114,11 @@ centered = false [connection signal="pressed" from="VBoxContainer/Buttons/SpeakingWrapper/Speaking/speaking" to="." method="_on_speaking_pressed"] [connection signal="pressed" from="VBoxContainer/Buttons/UnlinkWrapper/Unlink/unlink" to="." method="_on_unlink_pressed"] [connection signal="pressed" from="VBoxContainer/Buttons/TrashWrapper/Trash/trash" to="." method="_on_trash_pressed"] +[connection signal="item_selected" from="VBoxContainer/RenderingSection/blendModeContainer/blendModeDropdown" to="." method="_on_blend_mode_dropdown_item_selected"] [connection signal="toggled" from="VBoxContainer/RenderingSection/ClipLinked" to="." method="_on_clip_linked_toggled"] +[connection signal="toggled" from="VBoxContainer/RenderingSection/affectChildrenCheck" to="." method="_on_affect_children_check_toggled"] +[connection signal="toggled" from="VBoxContainer/TransformSection/MirrorControls/mirrorHorizontalCheck" to="." method="_on_mirror_horizontal_check_toggled"] +[connection signal="toggled" from="VBoxContainer/TransformSection/MirrorControls/mirrorVerticalCheck" to="." method="_on_mirror_vertical_check_toggled"] [connection signal="toggled" from="VBoxContainer/PhysicsSection/BounceVelocity" to="." method="_on_check_box_toggled"] [connection signal="pressed" from="VBoxContainer/LayersSection/HBoxContainer/Layer1Container/Layer1/layerButton1" to="." method="_on_layer_button_1_pressed"] [connection signal="pressed" from="VBoxContainer/LayersSection/HBoxContainer/Layer2Container/Layer2/layerButton2" to="." method="_on_layer_button_2_pressed"]