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:
parent
cd269c9a4e
commit
9c7effdba3
|
@ -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:
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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")
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue