1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-01-30 23:19:49 +00:00

Optimize previews of the ellipse selection and the shape tools

Before this commit, when these tools were being used on large areas, the software would start being very slow due to the polyline drawing. Now it simply draws an image.
TODO:
- Optimize the lasso, pixel and polygon select tools
- Mirror the previews of ellipse selection and shape tools, for consistency with the lasso, pixel and polygon select tools
- Perhaps somehow remove Previews.gd since its work is even more limited now.
This commit is contained in:
Emmanouil Papadeas 2024-07-31 18:05:22 +03:00
parent cd269c9a4e
commit 9c7effdba3
6 changed files with 64 additions and 69 deletions

View file

@ -153,26 +153,24 @@ func draw_end(pos: Vector2i) -> void:
func draw_preview() -> void: func draw_preview() -> void:
var canvas := Global.canvas.previews_sprite
if _drawing: if _drawing:
var canvas: CanvasItem = Global.canvas.previews
var indicator := BitMap.new()
var rect := _get_result_rect(_start, _dest) var rect := _get_result_rect(_start, _dest)
var points := _get_points(rect.size) var points := _get_points(rect.size)
var t_offset := _thickness - 1 var image := Image.create(
var t_offsetv := Vector2i(t_offset, t_offset) Global.current_project.size.x, Global.current_project.size.y, false, Image.FORMAT_LA8
indicator.create(rect.size + t_offsetv)
for point in points:
indicator.set_bitv(point, 1)
var transform_pos := (
rect.position - t_offsetv + Vector2i((Vector2(0.5, 0.5) * (t_offset - 1)).ceil())
) )
canvas.draw_set_transform(transform_pos, canvas.rotation, canvas.scale) var thickness_vector := (
rect.position - Vector2i((Vector2(0.5, 0.5) * (_thickness - 1)).ceil())
for line in _create_polylines(indicator): )
canvas.draw_polyline(PackedVector2Array(line), Color.BLACK) for point in points:
var draw_pos := point + thickness_vector
canvas.draw_set_transform(canvas.position, canvas.rotation, canvas.scale) if Rect2i(Vector2i.ZERO, image.get_size()).has_point(draw_pos):
image.set_pixelv(draw_pos, Color.WHITE)
var texture := ImageTexture.create_from_image(image)
canvas.texture = texture
else:
canvas.texture = null
func _draw_shape(origin: Vector2i, dest: Vector2i) -> void: func _draw_shape(origin: Vector2i, dest: Vector2i) -> void:

View file

@ -121,24 +121,24 @@ func draw_end(pos: Vector2i) -> void:
func draw_preview() -> void: func draw_preview() -> void:
var previews := Global.canvas.previews_sprite
if not _drawing: if not _drawing:
previews.texture = null
return return
var canvas: Node2D = Global.canvas.previews
var pos := canvas.position
var canvas_scale := canvas.scale
if Global.mirror_view: # This fixes previewing in mirror mode
pos.x = pos.x + Global.current_project.size.x
canvas_scale.x = -1
var points := _bezier() var points := _bezier()
canvas.draw_set_transform(pos, canvas.rotation, canvas_scale) var image := Image.create(
var indicator := _fill_bitmap_with_points(points, Global.current_project.size) Global.current_project.size.x, Global.current_project.size.y, false, Image.FORMAT_LA8
)
for line in _create_polylines(indicator): for point in points:
canvas.draw_polyline(PackedVector2Array(line), Color.BLACK) var draw_point := point
if Global.mirror_view: # This fixes previewing in mirror mode
canvas.draw_set_transform(canvas.position, canvas.rotation, canvas.scale) draw_point.x = image.get_width() - point.x - 1
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(draw_point):
image.set_pixelv(draw_point, Color.WHITE)
var texture := ImageTexture.create_from_image(image)
previews.texture = texture
var canvas := Global.canvas.previews
var circle_radius := Vector2.ONE * (5.0 / Global.camera.zoom.x) var circle_radius := Vector2.ONE * (5.0 / Global.camera.zoom.x)
if _is_hovering_first_position(_last_mouse_position) and _curve.point_count > 1: if _is_hovering_first_position(_last_mouse_position) and _curve.point_count > 1:
var circle_center := _curve.get_point_position(0) var circle_center := _curve.get_point_position(0)

View file

@ -147,30 +147,19 @@ func draw_end(pos: Vector2i) -> void:
func draw_preview() -> void: func draw_preview() -> void:
var canvas := Global.canvas.previews_sprite
if _drawing: if _drawing:
var canvas: CanvasItem = Global.canvas.previews
var indicator := BitMap.new()
var start := _start
if _start.x > _dest.x:
start.x = _dest.x
if _start.y > _dest.y:
start.y = _dest.y
var points := _get_points() var points := _get_points()
var t_offset := _thickness - 1 var image := Image.create(
var t_offsetv := Vector2i(t_offset, t_offset) Global.current_project.size.x, Global.current_project.size.y, false, Image.FORMAT_LA8
indicator.create((_dest - _start).abs() + t_offsetv * 2 + Vector2i.ONE) )
for point in points: for point in points:
var p := point - start + t_offsetv if Rect2i(Vector2i.ZERO, image.get_size()).has_point(point):
indicator.set_bitv(p, 1) image.set_pixelv(point, Color.WHITE)
var texture := ImageTexture.create_from_image(image)
canvas.draw_set_transform(start - t_offsetv, canvas.rotation, canvas.scale) canvas.texture = texture
else:
for line in _create_polylines(indicator): canvas.texture = null
canvas.draw_polyline(PackedVector2Array(line), Color.BLACK)
canvas.draw_set_transform(canvas.position, canvas.rotation, canvas.scale)
func _draw_shape() -> void: func _draw_shape() -> void:

View file

@ -48,24 +48,24 @@ func draw_end(pos: Vector2i) -> void:
func draw_preview() -> void: func draw_preview() -> void:
var canvas := Global.canvas.previews_sprite
if !_move && _rect.has_area(): if !_move && _rect.has_area():
var canvas: Node2D = Global.canvas.previews
var pos := canvas.position
var canvas_scale := canvas.scale
var temp_rect := _rect var temp_rect := _rect
if Global.mirror_view:
pos.x = pos.x + Global.current_project.size.x
temp_rect.position.x = Global.current_project.size.x - temp_rect.position.x
canvas_scale.x = -1
var border := DrawingAlgos.get_ellipse_points_filled(Vector2.ZERO, temp_rect.size) var points := DrawingAlgos.get_ellipse_points(Vector2.ZERO, temp_rect.size)
var indicator := _fill_bitmap_with_points(border, temp_rect.size) var image := Image.create(
Global.current_project.size.x, Global.current_project.size.y, false, Image.FORMAT_LA8
canvas.draw_set_transform(temp_rect.position, canvas.rotation, canvas_scale) )
for line in _create_polylines(indicator): for point in points:
canvas.draw_polyline(PackedVector2Array(line), Color.BLACK) var draw_point := point + temp_rect.position
if Global.mirror_view: # This fixes previewing in mirror mode
canvas.draw_set_transform(canvas.position, canvas.rotation, canvas.scale) draw_point.x = image.get_width() - draw_point.x - 1
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(draw_point):
image.set_pixelv(draw_point, Color.WHITE)
var texture := ImageTexture.create_from_image(image)
canvas.texture = texture
else:
canvas.texture = null
func apply_selection(_position: Vector2i) -> void: func apply_selection(_position: Vector2i) -> void:

View file

@ -23,6 +23,7 @@ var layer_metadata_texture := ImageTexture.new()
@onready var crop_rect := $CropRect as CropRect @onready var crop_rect := $CropRect as CropRect
@onready var indicators := $Indicators as Node2D @onready var indicators := $Indicators as Node2D
@onready var previews := $Previews as Node2D @onready var previews := $Previews as Node2D
@onready var previews_sprite := $PreviewsSprite as Sprite2D
@onready var mouse_guide_container := $MouseGuideContainer as Node2D @onready var mouse_guide_container := $MouseGuideContainer as Node2D
@onready var gizmos_3d := $Gizmos3D as Node2D @onready var gizmos_3d := $Gizmos3D as Node2D
@onready var measurements := $Measurements as Node2D @onready var measurements := $Measurements as Node2D

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=22 format=3 uid="uid://ba24iuv55m4l3"] [gd_scene load_steps=23 format=3 uid="uid://ba24iuv55m4l3"]
[ext_resource type="Script" path="res://src/UI/Canvas/Canvas.gd" id="1"] [ext_resource type="Script" path="res://src/UI/Canvas/Canvas.gd" id="1"]
[ext_resource type="Shader" path="res://src/Shaders/BlendLayers.gdshader" id="1_253dh"] [ext_resource type="Shader" path="res://src/Shaders/BlendLayers.gdshader" id="1_253dh"]
@ -10,12 +10,12 @@
[ext_resource type="Script" path="res://src/UI/Canvas/Previews.gd" id="7"] [ext_resource type="Script" path="res://src/UI/Canvas/Previews.gd" id="7"]
[ext_resource type="Script" path="res://src/UI/Canvas/Selection.gd" id="8"] [ext_resource type="Script" path="res://src/UI/Canvas/Selection.gd" id="8"]
[ext_resource type="Shader" path="res://src/Shaders/MarchingAntsOutline.gdshader" id="9"] [ext_resource type="Shader" path="res://src/Shaders/MarchingAntsOutline.gdshader" id="9"]
[ext_resource type="Shader" path="res://src/Shaders/AutoInvertColors.gdshader" id="10"]
[ext_resource type="PackedScene" uid="uid://no3w7e2264u4" path="res://src/UI/Canvas/MouseGuideContainer.tscn" id="11"] [ext_resource type="PackedScene" uid="uid://no3w7e2264u4" path="res://src/UI/Canvas/MouseGuideContainer.tscn" id="11"]
[ext_resource type="Script" path="res://src/UI/Canvas/OnionSkinning.gd" id="12"] [ext_resource type="Script" path="res://src/UI/Canvas/OnionSkinning.gd" id="12"]
[ext_resource type="Script" path="res://src/UI/Canvas/CropRect.gd" id="13"] [ext_resource type="Script" path="res://src/UI/Canvas/CropRect.gd" id="13"]
[ext_resource type="Script" path="res://src/UI/Canvas/Gizmos3D.gd" id="14"] [ext_resource type="Script" path="res://src/UI/Canvas/Gizmos3D.gd" id="14"]
[ext_resource type="Script" path="res://src/UI/Canvas/Measurements.gd" id="16_nxilb"] [ext_resource type="Script" path="res://src/UI/Canvas/Measurements.gd" id="16_nxilb"]
[ext_resource type="Shader" path="res://src/Shaders/AutoInvertColors.gdshader" id="17_lowhf"]
[ext_resource type="Script" path="res://src/UI/Canvas/ReferenceImages.gd" id="17_qfjb4"] [ext_resource type="Script" path="res://src/UI/Canvas/ReferenceImages.gd" id="17_qfjb4"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_6b0ox"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_6b0ox"]
@ -36,7 +36,10 @@ shader_parameter/frequency = 200.0
shader_parameter/stripe_direction = 0.5 shader_parameter/stripe_direction = 0.5
[sub_resource type="ShaderMaterial" id="3"] [sub_resource type="ShaderMaterial" id="3"]
shader = ExtResource("10") shader = ExtResource("17_lowhf")
[sub_resource type="ShaderMaterial" id="ShaderMaterial_tb70k"]
shader = ExtResource("17_lowhf")
[node name="Canvas" type="Node2D"] [node name="Canvas" type="Node2D"]
material = SubResource("ShaderMaterial_6b0ox") material = SubResource("ShaderMaterial_6b0ox")
@ -81,6 +84,10 @@ script = ExtResource("3")
material = SubResource("3") material = SubResource("3")
script = ExtResource("7") script = ExtResource("7")
[node name="PreviewsSprite" type="Sprite2D" parent="."]
material = SubResource("ShaderMaterial_tb70k")
centered = false
[node name="OnionPast" type="Node2D" parent="."] [node name="OnionPast" type="Node2D" parent="."]
script = ExtResource("12") script = ExtResource("12")