Added Mirror and Rotation

This commit is contained in:
2025-07-22 06:21:17 +10:00
parent 95476cfd57
commit fc6fa30c85
6 changed files with 118 additions and 1 deletions

Binary file not shown.

View File

@@ -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)

View File

@@ -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

View File

@@ -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:
@@ -137,6 +145,10 @@ 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:
return
@@ -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()
@@ -262,6 +284,11 @@ func _update_all_slider_values():
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():
if Global.heldSprite == null:
@@ -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()

View File

@@ -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"]