1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-02-20 12:33:14 +00:00

Small optimization in CanvasPreview

On large canvases (like 4096x4096), simply moving the mouse around was laggy. It turns out that texture_to_draw = current_cels[i].image_texture was causing the lag, but I'm not sure why. It could be that texture_to_draw was a Texture and not an ImageTexture.

There is still some room for optimization, both the second canvas and canvas preview are being drawn on _input(), which is unnecessary.
This commit is contained in:
Emmanouil Papadeas 2023-04-19 20:35:27 +03:00
parent 72a7b277fb
commit 0ffd34a4d6
2 changed files with 54 additions and 56 deletions

View file

@ -1,51 +1,47 @@
extends Node2D
enum Mode { TIMELINE, SPRITESHEET }
var mode = Mode.TIMELINE
var mode: int = Mode.TIMELINE
var h_frames: int = 1
var v_frames: int = 1
var start_sprite_sheet_frame: int = 1
var end_sprite_sheet_frame: int = 1
var sprite_frames = []
var h_frames := 1
var v_frames := 1
var start_sprite_sheet_frame := 1
var end_sprite_sheet_frame := 1
var sprite_frames := []
var frame_index := 0
var frame: int = 0
onready var animation_timer: Timer = $AnimationTimer
onready var animation_timer := $AnimationTimer as Timer
onready var transparent_checker = get_parent().get_node("TransparentChecker") as ColorRect
func _draw() -> void:
var current_project: Project = Global.current_project
var texture_to_draw: Texture
var modulate_color := Color.white
match mode:
Mode.TIMELINE:
if frame >= current_project.frames.size():
frame = current_project.current_frame
$AnimationTimer.wait_time = (
current_project.frames[frame].duration
* (1 / Global.current_project.fps)
)
var modulate_color := Color.white
if frame_index >= current_project.frames.size():
frame_index = current_project.current_frame
if animation_timer.is_stopped():
frame = current_project.current_frame
var current_cels: Array = current_project.frames[frame].cels
frame_index = current_project.current_frame
var frame: Frame = current_project.frames[frame_index]
animation_timer.wait_time = frame.duration * (1 / current_project.fps)
var current_cels: Array = frame.cels
# Draw current frame layers
for i in range(current_cels.size()):
if current_cels[i] is GroupCel:
var cel: BaseCel = current_cels[i]
if cel is GroupCel:
continue
modulate_color = Color(1, 1, 1, current_cels[i].opacity)
modulate_color = Color(1, 1, 1, cel.opacity)
if (
i < current_project.layers.size()
and current_project.layers[i].is_visible_in_hierarchy()
):
texture_to_draw = current_cels[i].image_texture
draw_texture(texture_to_draw, Vector2.ZERO, modulate_color)
draw_texture(cel.image_texture, Vector2.ZERO, modulate_color)
Mode.SPRITESHEET:
var target_frame = current_project.frames[current_project.current_frame]
var frame_image = Image.new()
var texture_to_draw: ImageTexture
var target_frame: Frame = current_project.frames[current_project.current_frame]
var frame_image := Image.new()
frame_image.create(
current_project.size.x, current_project.size.y, false, Image.FORMAT_RGBA8
)
@ -58,23 +54,21 @@ func _draw() -> void:
if start_sprite_sheet_frame < 0:
start_sprite_sheet_frame = 0
# reset frame if required
if frame >= end_sprite_sheet_frame:
frame = start_sprite_sheet_frame - 1
texture_to_draw = sprite_frames[frame]
draw_texture(texture_to_draw, Vector2.ZERO, modulate_color)
if frame_index >= end_sprite_sheet_frame:
frame_index = start_sprite_sheet_frame - 1
texture_to_draw = sprite_frames[frame_index]
draw_texture(texture_to_draw, Vector2.ZERO)
if not texture_to_draw:
return
var rect := Rect2(Vector2.ZERO, texture_to_draw.get_data().get_size())
get_parent().get_node("TransparentChecker").fit_rect(rect)
var rect := Rect2(Vector2.ZERO, texture_to_draw.get_data().get_size())
transparent_checker.fit_rect(rect)
func _on_AnimationTimer_timeout() -> void:
match mode:
Mode.TIMELINE:
var first_frame := 0
var last_frame: int = Global.current_project.frames.size() - 1
var current_project: Project = Global.current_project
var first_frame := 0
var last_frame: int = current_project.frames.size() - 1
if Global.play_only_tags:
for tag in current_project.animation_tags:
@ -85,26 +79,26 @@ func _on_AnimationTimer_timeout() -> void:
first_frame = tag.from - 1
last_frame = min(current_project.frames.size() - 1, tag.to - 1)
if frame < last_frame:
frame += 1
if frame_index < last_frame:
frame_index += 1
else:
frame = first_frame
frame_index = first_frame
$AnimationTimer.wait_time = (
Global.current_project.frames[frame].duration
* (1 / Global.current_project.fps)
animation_timer.wait_time = (
current_project.frames[frame_index].duration
* (1 / current_project.fps)
)
Mode.SPRITESHEET:
frame += 1
$AnimationTimer.wait_time = (1 / Global.current_project.fps)
$AnimationTimer.set_one_shot(true)
$AnimationTimer.start()
frame_index += 1
animation_timer.wait_time = (1 / Global.current_project.fps)
animation_timer.set_one_shot(true)
animation_timer.start()
update()
func split_spritesheet(image: Image, horiz: int, vert: int) -> Array:
var result = []
var result := []
horiz = min(horiz, image.get_size().x)
vert = min(vert, image.get_size().y)
var frame_width := image.get_size().x / horiz
@ -113,9 +107,8 @@ func split_spritesheet(image: Image, horiz: int, vert: int) -> Array:
for xx in range(horiz):
var tex := ImageTexture.new()
var cropped_image := Image.new()
cropped_image = image.get_rect(
Rect2(frame_width * xx, frame_height * yy, frame_width, frame_height)
)
var rect := Rect2(frame_width * xx, frame_height * yy, frame_width, frame_height)
cropped_image = image.get_rect(rect)
cropped_image.convert(Image.FORMAT_RGBA8)
tex.create_from_image(cropped_image, 0)
result.append(tex)

View file

@ -1,9 +1,8 @@
extends PanelContainer
onready var canvas_preview: Node2D = $"%CanvasPreview"
onready var camera: Camera2D = $"%CameraPreview"
onready var play_button: Button = $"%PlayButton"
onready var canvas_preview := $"%CanvasPreview" as Node2D
onready var camera := $"%CameraPreview" as Camera2D
onready var play_button := $"%PlayButton" as Button
onready var start_frame := $"%StartFrame" as ValueSlider
onready var end_frame := $"%EndFrame" as ValueSlider
@ -34,7 +33,13 @@ func _on_PlayButton_toggled(button_pressed: bool) -> void:
func _on_OptionButton_item_selected(index: int) -> void:
play_button.pressed = false
canvas_preview.mode = index
$VBox/Animation/VBoxContainer/Options.visible = bool(index == 1)
if index == 0:
$VBox/Animation/VBoxContainer/Options.visible = false
canvas_preview.transparent_checker.fit_rect(
Rect2(Vector2.ZERO, Global.current_project.size)
)
else:
$VBox/Animation/VBoxContainer/Options.visible = true
canvas_preview.update()