mirror of
https://github.com/Orama-Interactive/Pixelorama.git
synced 2025-02-07 10:59:49 +00:00
Transformation preview should now work for all selected cels
Prior to this commit, the transformation (moving/scaling content with selections) of only one of the selected cels would appear, and the rest would only have a visible effect on transformation confirm.
This commit is contained in:
parent
403539bb47
commit
5cb0eddae5
|
@ -7,6 +7,7 @@ var opacity: float
|
||||||
var image_texture: ImageTexture
|
var image_texture: ImageTexture
|
||||||
# If the cel is linked a ref to the link set Dictionary this cel is in, or null if not linked:
|
# If the cel is linked a ref to the link set Dictionary this cel is in, or null if not linked:
|
||||||
var link_set = null # { "cels": Array, "hue": float } or null
|
var link_set = null # { "cels": Array, "hue": float } or null
|
||||||
|
var transformed_content: Image # Used in transformations (moving, scaling etc with selections)
|
||||||
|
|
||||||
# Methods to Override:
|
# Methods to Override:
|
||||||
|
|
||||||
|
|
|
@ -123,7 +123,6 @@ func draw_start(position: Vector2) -> void:
|
||||||
selection_node.undo_data = selection_node.get_undo_data(true)
|
selection_node.undo_data = selection_node.get_undo_data(true)
|
||||||
else:
|
else:
|
||||||
selection_node.transform_content_start()
|
selection_node.transform_content_start()
|
||||||
selection_node.clear_in_selected_cels = false
|
|
||||||
for image in _get_selected_draw_images():
|
for image in _get_selected_draw_images():
|
||||||
image.blit_rect_mask(
|
image.blit_rect_mask(
|
||||||
selection_node.preview_image,
|
selection_node.preview_image,
|
||||||
|
|
|
@ -28,7 +28,6 @@ var gizmos := [] # Array of Gizmos
|
||||||
var dragged_gizmo: Gizmo = null
|
var dragged_gizmo: Gizmo = null
|
||||||
var prev_angle := 0
|
var prev_angle := 0
|
||||||
var mouse_pos_on_gizmo_drag := Vector2.ZERO
|
var mouse_pos_on_gizmo_drag := Vector2.ZERO
|
||||||
var clear_in_selected_cels := true
|
|
||||||
|
|
||||||
onready var canvas: Canvas = get_parent()
|
onready var canvas: Canvas = get_parent()
|
||||||
onready var marching_ants_outline: Sprite = $MarchingAntsOutline
|
onready var marching_ants_outline: Sprite = $MarchingAntsOutline
|
||||||
|
@ -507,20 +506,13 @@ func transform_content_confirm() -> void:
|
||||||
if not is_moving_content:
|
if not is_moving_content:
|
||||||
return
|
return
|
||||||
var project: Project = Global.current_project
|
var project: Project = Global.current_project
|
||||||
for cel_index in project.selected_cels:
|
for cel in _get_selected_draw_cels():
|
||||||
var frame: int = cel_index[0]
|
var cel_image: Image = cel.get_image()
|
||||||
var layer: int = cel_index[1]
|
|
||||||
if frame >= project.frames.size() or layer >= project.layers.size():
|
|
||||||
continue
|
|
||||||
if not Global.current_project.layers[layer].can_layer_get_drawn():
|
|
||||||
continue
|
|
||||||
var cel_image: Image = project.frames[frame].cels[layer].image
|
|
||||||
var src: Image = preview_image
|
var src: Image = preview_image
|
||||||
if (
|
if not is_pasting:
|
||||||
not is_pasting
|
src = Image.new()
|
||||||
and not (frame == project.current_frame and layer == project.current_layer)
|
src.copy_from(cel.transformed_content)
|
||||||
):
|
cel.transformed_content = null
|
||||||
src = _get_selected_image(cel_image, clear_in_selected_cels)
|
|
||||||
src.resize(
|
src.resize(
|
||||||
big_bounding_rectangle.size.x,
|
big_bounding_rectangle.size.x,
|
||||||
big_bounding_rectangle.size.y,
|
big_bounding_rectangle.size.y,
|
||||||
|
@ -548,7 +540,6 @@ func transform_content_confirm() -> void:
|
||||||
original_bitmap = SelectionMap.new()
|
original_bitmap = SelectionMap.new()
|
||||||
is_moving_content = false
|
is_moving_content = false
|
||||||
is_pasting = false
|
is_pasting = false
|
||||||
clear_in_selected_cels = true
|
|
||||||
update()
|
update()
|
||||||
|
|
||||||
|
|
||||||
|
@ -563,15 +554,18 @@ func transform_content_cancel() -> void:
|
||||||
project.selection_map = original_bitmap
|
project.selection_map = original_bitmap
|
||||||
project.selection_map_changed()
|
project.selection_map_changed()
|
||||||
preview_image = original_preview_image
|
preview_image = original_preview_image
|
||||||
if !is_pasting:
|
for cel in _get_selected_draw_cels():
|
||||||
var cel_image: Image = project.get_current_cel().get_image()
|
var cel_image: Image = cel.get_image()
|
||||||
cel_image.blit_rect_mask(
|
if !is_pasting:
|
||||||
preview_image,
|
cel_image.blit_rect_mask(
|
||||||
preview_image,
|
cel.transformed_content,
|
||||||
Rect2(Vector2.ZERO, Global.current_project.selection_map.get_size()),
|
cel.transformed_content,
|
||||||
big_bounding_rectangle.position
|
Rect2(Vector2.ZERO, Global.current_project.selection_map.get_size()),
|
||||||
)
|
big_bounding_rectangle.position
|
||||||
canvas.update_texture(project.current_layer)
|
)
|
||||||
|
cel.transformed_content = null
|
||||||
|
for cel_index in project.selected_cels:
|
||||||
|
canvas.update_texture(cel_index[1])
|
||||||
original_preview_image = Image.new()
|
original_preview_image = Image.new()
|
||||||
preview_image = Image.new()
|
preview_image = Image.new()
|
||||||
original_bitmap = SelectionMap.new()
|
original_bitmap = SelectionMap.new()
|
||||||
|
@ -639,7 +633,19 @@ func get_undo_data(undo_image: bool) -> Dictionary:
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
func _get_selected_draw_images() -> Array: # Array of Images
|
func _get_selected_draw_cels() -> Array: # Array of BaseCel(s)
|
||||||
|
var cels := []
|
||||||
|
var project: Project = Global.current_project
|
||||||
|
for cel_index in project.selected_cels:
|
||||||
|
var cel: BaseCel = project.frames[cel_index[0]].cels[cel_index[1]]
|
||||||
|
if not cel is PixelCel:
|
||||||
|
continue
|
||||||
|
if project.layers[cel_index[1]].can_layer_get_drawn():
|
||||||
|
cels.append(cel)
|
||||||
|
return cels
|
||||||
|
|
||||||
|
|
||||||
|
func _get_selected_draw_images() -> Array: # Array of Image(s)
|
||||||
var images := []
|
var images := []
|
||||||
var project: Project = Global.current_project
|
var project: Project = Global.current_project
|
||||||
for cel_index in project.selected_cels:
|
for cel_index in project.selected_cels:
|
||||||
|
@ -908,9 +914,11 @@ func clear_selection(use_undo := false) -> void:
|
||||||
|
|
||||||
func _get_preview_image() -> void:
|
func _get_preview_image() -> void:
|
||||||
var project: Project = Global.current_project
|
var project: Project = Global.current_project
|
||||||
var cel_image: Image = project.get_current_cel().get_image()
|
var blended_image := Image.new()
|
||||||
|
blended_image.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8)
|
||||||
|
Export.blend_selected_cels(blended_image, project.frames[project.current_frame])
|
||||||
if original_preview_image.is_empty():
|
if original_preview_image.is_empty():
|
||||||
original_preview_image = cel_image.get_rect(big_bounding_rectangle)
|
original_preview_image = blended_image.get_rect(big_bounding_rectangle)
|
||||||
original_preview_image.lock()
|
original_preview_image.lock()
|
||||||
# For non-rectangular selections
|
# For non-rectangular selections
|
||||||
for x in range(0, big_bounding_rectangle.size.x):
|
for x in range(0, big_bounding_rectangle.size.x):
|
||||||
|
@ -933,44 +941,30 @@ func _get_preview_image() -> void:
|
||||||
false,
|
false,
|
||||||
Image.FORMAT_RGBA8
|
Image.FORMAT_RGBA8
|
||||||
)
|
)
|
||||||
cel_image.blit_rect_mask(
|
for cel in _get_selected_draw_cels():
|
||||||
clear_image,
|
var cel_image: Image = cel.get_image()
|
||||||
original_preview_image,
|
cel.transformed_content = _get_selected_image(cel_image)
|
||||||
Rect2(Vector2.ZERO, Global.current_project.selection_map.get_size()),
|
cel_image.blit_rect_mask(
|
||||||
big_bounding_rectangle.position
|
clear_image,
|
||||||
)
|
cel.transformed_content,
|
||||||
canvas.update_texture(project.current_layer)
|
Rect2(Vector2.ZERO, Global.current_project.selection_map.get_size()),
|
||||||
|
big_bounding_rectangle.position
|
||||||
|
)
|
||||||
|
for cel_index in project.selected_cels:
|
||||||
|
canvas.update_texture(cel_index[1])
|
||||||
|
|
||||||
|
|
||||||
func _get_selected_image(cel_image: Image, clear := true) -> Image:
|
func _get_selected_image(cel_image: Image) -> Image:
|
||||||
var project: Project = Global.current_project
|
var project: Project = Global.current_project
|
||||||
var image := Image.new()
|
var image := Image.new()
|
||||||
image = cel_image.get_rect(original_big_bounding_rectangle)
|
image = cel_image.get_rect(big_bounding_rectangle)
|
||||||
image.lock()
|
image.lock()
|
||||||
# For non-rectangular selections
|
# For non-rectangular selections
|
||||||
for x in range(0, original_big_bounding_rectangle.size.x):
|
for x in range(0, big_bounding_rectangle.size.x):
|
||||||
for y in range(0, original_big_bounding_rectangle.size.y):
|
for y in range(0, big_bounding_rectangle.size.y):
|
||||||
var pos := Vector2(x, y)
|
var pos := Vector2(x, y)
|
||||||
if !project.can_pixel_get_drawn(
|
if !project.can_pixel_get_drawn(pos + big_bounding_rectangle.position):
|
||||||
pos + original_big_bounding_rectangle.position,
|
|
||||||
original_bitmap,
|
|
||||||
original_big_bounding_rectangle.position
|
|
||||||
):
|
|
||||||
image.set_pixelv(pos, Color(0, 0, 0, 0))
|
image.set_pixelv(pos, Color(0, 0, 0, 0))
|
||||||
|
|
||||||
image.unlock()
|
image.unlock()
|
||||||
if image.is_invisible():
|
|
||||||
return image
|
|
||||||
|
|
||||||
if clear:
|
|
||||||
var clear_image := Image.new()
|
|
||||||
clear_image.create(image.get_width(), image.get_height(), false, Image.FORMAT_RGBA8)
|
|
||||||
cel_image.blit_rect_mask(
|
|
||||||
clear_image,
|
|
||||||
image,
|
|
||||||
Rect2(Vector2.ZERO, Global.current_project.selection_map.get_size()),
|
|
||||||
original_big_bounding_rectangle.position
|
|
||||||
)
|
|
||||||
canvas.update_texture(project.current_layer)
|
|
||||||
|
|
||||||
return image
|
return image
|
||||||
|
|
Loading…
Reference in a new issue