├── .gitignore ├── rust ├── .gitignore ├── Cargo.toml └── src │ ├── ppw_polygon.rs │ ├── ppw_path.rs │ └── lib.rs ├── godot ├── .gitignore ├── .gitattributes ├── splash-logo.png ├── src │ ├── material │ │ ├── paint_material.gd │ │ ├── color_paint_material.gd │ │ ├── linear_gradient_paint_material.gd │ │ └── radial_gradient_paint_material.gd │ ├── serialize │ │ ├── document_material_color.gd │ │ ├── document_material.gd │ │ ├── document_layer.gd │ │ ├── document_material_linear_gradient.gd │ │ ├── document_material_radial_gradient.gd │ │ ├── document_layer_fill.gd │ │ ├── document_layer_group.gd │ │ ├── document_layer_path.gd │ │ ├── document.gd │ │ └── document_path.gd │ ├── sub_window │ │ ├── licenses_window.gd │ │ ├── document_export_window.gd │ │ ├── document_open_window.gd │ │ └── config_window.gd │ ├── node │ │ ├── list_drop_cursor.gd │ │ ├── gradient_editor_color_arrow.gd │ │ ├── material_select_popup.gd │ │ ├── linear_gradient_picker.gd │ │ ├── material_select_popup_item.gd │ │ └── scroll_space.gd │ ├── pool │ │ ├── path_pool.gd │ │ └── paint_layer_pool.gd │ └── layer │ │ ├── fill_paint_layer.gd │ │ ├── paint_layer.gd │ │ └── group_paint_layer.gd ├── RobotoMono-SemiBold.ttf ├── translation │ ├── translation.en.translation │ ├── translation.ja.translation │ ├── translation.csv.import │ └── translation.csv ├── shaders │ ├── fill.gdshader │ ├── composite │ │ ├── jfa_line.glsl.import │ │ ├── rasterize.glsl.import │ │ ├── init_jfa_line.glsl.import │ │ ├── fill_composite.glsl.import │ │ ├── mipmap_generate.glsl.import │ │ ├── path_composite.glsl.import │ │ ├── group_composite.glsl.import │ │ ├── path_composite_jfa_line.glsl.import │ │ ├── mipmap_generate.glsl │ │ ├── init_jfa_line.glsl │ │ ├── rasterize.glsl │ │ ├── fill_composite.glsl │ │ └── group_composite.glsl │ ├── linear_gradient_path.gdshader │ ├── missing_material.gdshader │ ├── fill_checker_alpha.gdshader │ ├── linear_gradient_checker_alpha.gdshader │ ├── radial_gradient_checker_alpha.gdshader │ ├── texture_checker_alpha.gdshader │ └── radial_gradient_path.gdshader ├── styles │ └── flat_color_button.tres ├── icons │ ├── font_awesome │ │ ├── circle-solid.svg │ │ ├── circle-regular.svg │ │ ├── square-solid.svg │ │ ├── slash-solid.svg │ │ ├── caret-down-solid.svg │ │ ├── caret-right-solid.svg │ │ ├── angle-right-solid.svg │ │ ├── plus-solid.svg │ │ ├── location-arrow-solid.svg │ │ ├── square-regular.svg │ │ ├── lock-solid.svg │ │ ├── lock-open-solid.svg │ │ ├── magnifying-glass-solid.svg │ │ ├── trash-solid.svg │ │ ├── arrow-pointer-solid.svg │ │ ├── up-down-solid.svg │ │ ├── folder-regular.svg │ │ ├── left-right-solid.svg │ │ ├── rotate-left-solid.svg │ │ ├── clone-regular.svg │ │ ├── pen-nib-solid.svg │ │ ├── folder-open-regular.svg │ │ ├── fill-solid.svg │ │ ├── arrow-right-arrow-left-solid.svg │ │ ├── circle-question-solid.svg │ │ ├── wrench-solid.svg │ │ ├── expand-solid.svg │ │ ├── eye-solid.svg │ │ ├── maximize-solid.svg │ │ ├── up-down-left-right-solid.svg │ │ ├── eye-slash-solid.svg │ │ ├── eye-solid.svg.import │ │ ├── fill-solid.svg.import │ │ ├── lock-solid.svg.import │ │ ├── plus-solid.svg.import │ │ ├── slash-solid.svg.import │ │ ├── trash-solid.svg.import │ │ ├── circle-solid.svg.import │ │ ├── clone-regular.svg.import │ │ ├── expand-solid.svg.import │ │ ├── pen-nib-solid.svg.import │ │ ├── square-solid.svg.import │ │ ├── wrench-solid.svg.import │ │ ├── circle-regular.svg.import │ │ ├── maximize-solid.svg.import │ │ ├── square-regular.svg.import │ │ ├── up-down-solid.svg.import │ │ ├── eye-slash-solid.svg.import │ │ ├── folder-regular.svg.import │ │ ├── lock-open-solid.svg.import │ │ ├── caret-down-solid.svg.import │ │ ├── left-right-solid.svg.import │ │ ├── angle-right-solid.svg.import │ │ ├── caret-right-solid.svg.import │ │ ├── rotate-left-solid.svg.import │ │ ├── arrow-pointer-solid.svg.import │ │ ├── folder-open-regular.svg.import │ │ ├── location-arrow-solid.svg.import │ │ ├── circle-question-solid.svg.import │ │ ├── magnifying-glass-solid.svg.import │ │ ├── up-down-left-right-solid.svg.import │ │ └── arrow-right-arrow-left-solid.svg.import │ ├── union.svg │ ├── diff.svg │ ├── xor.svg │ ├── intersect.svg │ ├── gradient-editor-color-arrow.svg │ ├── diff.svg.import │ ├── xor.svg.import │ ├── union.svg.import │ ├── mirror.svg.import │ ├── fill-plus.svg.import │ ├── intersect.svg.import │ ├── open_path.svg.import │ ├── closed_path.svg.import │ ├── folder-plus.svg.import │ ├── mirror-flip.svg.import │ ├── square-plus.svg.import │ ├── gradient-editor-color-arrow.svg.import │ ├── mirror.svg │ ├── mirror-flip.svg │ ├── square-plus.svg │ ├── folder-plus.svg │ ├── open_path.svg │ ├── fill-plus.svg │ └── closed_path.svg ├── addons │ ├── dockable_container │ │ ├── plugin.cfg │ │ ├── inspector_plugin │ │ │ ├── editor_inspector_plugin.gd │ │ │ └── layout_editor_property.gd │ │ ├── plugin.gd │ │ ├── layout_node.gd │ │ ├── icon.svg │ │ ├── icon.svg.import │ │ ├── dockable_panel_reference_control.gd │ │ ├── samples │ │ │ └── TestScene.gd │ │ ├── layout_panel.gd │ │ ├── drag_n_drop_panel.gd │ │ ├── layout_split.gd │ │ └── dockable_panel.gd │ └── uuid │ │ └── uuid.gd ├── scenes │ ├── control │ │ ├── control_segment.tscn │ │ ├── control_point.tscn │ │ └── control_linear_gradient.tscn │ ├── node │ │ ├── list_drop_cursor.tscn │ │ ├── path.tscn │ │ ├── gradient_editor_color_arrow.tscn │ │ ├── gradient_editor.tscn │ │ ├── material_select_popup.tscn │ │ └── material_select_popup_item.tscn │ └── sub_window │ │ ├── config_window.tscn │ │ └── document_export_window.tscn ├── shape.gdextension ├── RobotoMono-SemiBold.ttf.import ├── splash-logo.png.import ├── icon.svg.import └── export_presets.cfg ├── README ├── phi.gif ├── psi.gif ├── top.png ├── weight.gif ├── screenshot-0.png ├── screenshot-1.png └── README-en.md ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | -------------------------------------------------------------------------------- /rust/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | -------------------------------------------------------------------------------- /godot/.gitignore: -------------------------------------------------------------------------------- 1 | # Godot 4+ specific ignores 2 | .godot/ 3 | .vscode/ 4 | -------------------------------------------------------------------------------- /README/phi.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MatchaChoco010/AquamarinePainter/HEAD/README/phi.gif -------------------------------------------------------------------------------- /README/psi.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MatchaChoco010/AquamarinePainter/HEAD/README/psi.gif -------------------------------------------------------------------------------- /README/top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MatchaChoco010/AquamarinePainter/HEAD/README/top.png -------------------------------------------------------------------------------- /README/weight.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MatchaChoco010/AquamarinePainter/HEAD/README/weight.gif -------------------------------------------------------------------------------- /godot/.gitattributes: -------------------------------------------------------------------------------- 1 | # Normalize EOL for all files that Git considers text files. 2 | * text=auto eol=lf 3 | -------------------------------------------------------------------------------- /godot/splash-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MatchaChoco010/AquamarinePainter/HEAD/godot/splash-logo.png -------------------------------------------------------------------------------- /README/screenshot-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MatchaChoco010/AquamarinePainter/HEAD/README/screenshot-0.png -------------------------------------------------------------------------------- /README/screenshot-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MatchaChoco010/AquamarinePainter/HEAD/README/screenshot-1.png -------------------------------------------------------------------------------- /godot/src/material/paint_material.gd: -------------------------------------------------------------------------------- 1 | ## PaintMaterialの抽象クラス。 2 | class_name PaintMaterial 3 | extends RefCounted 4 | -------------------------------------------------------------------------------- /godot/RobotoMono-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MatchaChoco010/AquamarinePainter/HEAD/godot/RobotoMono-SemiBold.ttf -------------------------------------------------------------------------------- /godot/translation/translation.en.translation: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MatchaChoco010/AquamarinePainter/HEAD/godot/translation/translation.en.translation -------------------------------------------------------------------------------- /godot/translation/translation.ja.translation: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MatchaChoco010/AquamarinePainter/HEAD/godot/translation/translation.ja.translation -------------------------------------------------------------------------------- /godot/src/serialize/document_material_color.gd: -------------------------------------------------------------------------------- 1 | class_name DocumentMaterialColor 2 | extends DocumentMaterial 3 | 4 | 5 | ## マテリアルの色。 6 | @export var color: Color 7 | -------------------------------------------------------------------------------- /godot/src/material/color_paint_material.gd: -------------------------------------------------------------------------------- 1 | ## 単色塗りつぶしのマテリアル。 2 | class_name ColorPaintMaterial 3 | extends PaintMaterial 4 | 5 | 6 | ## マテリアルの色。 7 | var color: Color = Color.AQUAMARINE 8 | -------------------------------------------------------------------------------- /godot/src/serialize/document_material.gd: -------------------------------------------------------------------------------- 1 | class_name DocumentMaterial 2 | extends Resource 3 | 4 | 5 | ## マテリアルID、 6 | @export var id: String 7 | ## マテリアルの名前。 8 | @export var name: String 9 | -------------------------------------------------------------------------------- /godot/src/serialize/document_layer.gd: -------------------------------------------------------------------------------- 1 | class_name DocumentLayer 2 | extends Resource 3 | 4 | 5 | ## レイヤーのブレンドモードの列挙子。 6 | enum BlendMode { 7 | Normal, 8 | Add, 9 | Multiply, 10 | Screen, 11 | Overlay, 12 | } 13 | -------------------------------------------------------------------------------- /godot/shaders/fill.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | render_mode unshaded; 3 | 4 | uniform vec4 fill_color: source_color = vec4(1.0, 1.0, 1.0, 1.0); 5 | 6 | void fragment() { 7 | COLOR.rgb = fill_color.rgb; 8 | COLOR.a *= fill_color.a; 9 | } 10 | -------------------------------------------------------------------------------- /godot/src/sub_window/licenses_window.gd: -------------------------------------------------------------------------------- 1 | class_name LicensesWindow 2 | extends Window 3 | 4 | 5 | ## ウィンドウの閉じるリクエストがあったときの処理。 6 | func _on_close_requested() -> void: 7 | hide() 8 | 9 | 10 | ## 閉じるボタンが押されたときの処理。 11 | func _on_button_pressed() -> void: 12 | hide() 13 | -------------------------------------------------------------------------------- /godot/styles/flat_color_button.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=3 uid="uid://cvvu0fweitcpr"] 2 | 3 | [resource] 4 | bg_color = Color(0.4, 0.4, 0.4, 1) 5 | corner_radius_top_left = 3 6 | corner_radius_top_right = 3 7 | corner_radius_bottom_right = 3 8 | corner_radius_bottom_left = 3 9 | -------------------------------------------------------------------------------- /rust/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "shape" 3 | version = "0.1.0" 4 | edition = "2021" 5 | license = "MIT" 6 | 7 | [lib] 8 | crate-type = ["cdylib"] 9 | 10 | [dependencies] 11 | godot = "0.1.3" 12 | i_float = "1.3.0" 13 | i_overlay = "1.5.2" 14 | i_shape = "1.3.0" 15 | i_triangle = "0.25.2" 16 | -------------------------------------------------------------------------------- /godot/src/node/list_drop_cursor.gd: -------------------------------------------------------------------------------- 1 | ## リストのDnDの先を示すカーソルのクラス。 2 | class_name ListDropCursor 3 | extends BoxContainer 4 | 5 | 6 | @onready var _spacing: ColorRect = $Control/ColorRect 7 | 8 | 9 | ## インデントを指定する。 10 | func set_depth(depth: int) -> void: 11 | _spacing.position.x = 50 + depth * 32 12 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/circle-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/circle-regular.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/square-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/slash-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/src/serialize/document_material_linear_gradient.gd: -------------------------------------------------------------------------------- 1 | class_name DocumentMaterialLinearGradient 2 | extends DocumentMaterial 3 | 4 | 5 | ## マテリアルのグラデーションの色リスト。 6 | @export var colors: String 7 | ## マテリアルのグラデーションの位置リスト。 8 | @export var offsets: String 9 | 10 | ## マテリアルのグラデーションの開始位置。 11 | @export var start_point: Vector2 12 | ## マテリアルのグラデーションの終了位置。 13 | @export var end_point: Vector2 14 | -------------------------------------------------------------------------------- /godot/shaders/composite/jfa_line.glsl.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="glsl" 4 | type="RDShaderFile" 5 | uid="uid://b4scg4ifd6jt1" 6 | path="res://.godot/imported/jfa_line.glsl-105bdb2048aadcc72bbd2e9b55d4dddd.res" 7 | 8 | [deps] 9 | 10 | source_file="res://shaders/composite/jfa_line.glsl" 11 | dest_files=["res://.godot/imported/jfa_line.glsl-105bdb2048aadcc72bbd2e9b55d4dddd.res"] 12 | 13 | [params] 14 | 15 | -------------------------------------------------------------------------------- /godot/shaders/linear_gradient_path.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | render_mode unshaded; 3 | 4 | uniform sampler2D gradient_texture; 5 | uniform vec2 start_point = vec2(0, 0); 6 | uniform vec2 end_point = vec2(1, 0); 7 | 8 | void fragment() { 9 | vec2 v = end_point - start_point; 10 | float t = dot(SCREEN_UV - start_point, v) / dot(v, v); 11 | COLOR = texture(gradient_texture, vec2(t, 0.5)); 12 | } 13 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/caret-down-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/caret-right-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/shaders/composite/rasterize.glsl.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="glsl" 4 | type="RDShaderFile" 5 | uid="uid://doe67sucfd7sb" 6 | path="res://.godot/imported/rasterize.glsl-a916df1092d3c270aa536fde6c4ecaa3.res" 7 | 8 | [deps] 9 | 10 | source_file="res://shaders/composite/rasterize.glsl" 11 | dest_files=["res://.godot/imported/rasterize.glsl-a916df1092d3c270aa536fde6c4ecaa3.res"] 12 | 13 | [params] 14 | 15 | -------------------------------------------------------------------------------- /godot/shaders/missing_material.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | render_mode unshaded; 3 | 4 | void fragment() { 5 | vec2 checker_count = vec2(1.0) / SCREEN_PIXEL_SIZE / 24.0; 6 | float checker = mod(dot(vec2(1.0), step(vec2(0.5), fract(SCREEN_UV * checker_count))), 2.0); 7 | vec3 checker_color = mix(vec3(1.0, 0.0, 1.0), vec3(0.0, 1.0, 1.0), checker); 8 | 9 | COLOR.rgb = checker_color; 10 | COLOR.a = 1.0; 11 | } 12 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/angle-right-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/shaders/composite/init_jfa_line.glsl.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="glsl" 4 | type="RDShaderFile" 5 | uid="uid://cmq2gvcm4lhss" 6 | path="res://.godot/imported/init_jfa_line.glsl-f5884ea84b633ab94427f53e5c4a7bcd.res" 7 | 8 | [deps] 9 | 10 | source_file="res://shaders/composite/init_jfa_line.glsl" 11 | dest_files=["res://.godot/imported/init_jfa_line.glsl-f5884ea84b633ab94427f53e5c4a7bcd.res"] 12 | 13 | [params] 14 | 15 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/plus-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/shaders/composite/fill_composite.glsl.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="glsl" 4 | type="RDShaderFile" 5 | uid="uid://b3ju1dnvpywem" 6 | path="res://.godot/imported/fill_composite.glsl-35dc6e7a02efd068412c7875e53fd001.res" 7 | 8 | [deps] 9 | 10 | source_file="res://shaders/composite/fill_composite.glsl" 11 | dest_files=["res://.godot/imported/fill_composite.glsl-35dc6e7a02efd068412c7875e53fd001.res"] 12 | 13 | [params] 14 | 15 | -------------------------------------------------------------------------------- /godot/shaders/composite/mipmap_generate.glsl.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="glsl" 4 | type="RDShaderFile" 5 | uid="uid://mte48di0snd4" 6 | path="res://.godot/imported/mipmap_generate.glsl-47a90a1d5c7d46976241bcfbdd9372c4.res" 7 | 8 | [deps] 9 | 10 | source_file="res://shaders/composite/mipmap_generate.glsl" 11 | dest_files=["res://.godot/imported/mipmap_generate.glsl-47a90a1d5c7d46976241bcfbdd9372c4.res"] 12 | 13 | [params] 14 | 15 | -------------------------------------------------------------------------------- /godot/shaders/composite/path_composite.glsl.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="glsl" 4 | type="RDShaderFile" 5 | uid="uid://cio6xryo0ejm" 6 | path="res://.godot/imported/path_composite.glsl-57a968e952803a07816326f075cb0e81.res" 7 | 8 | [deps] 9 | 10 | source_file="res://shaders/composite/path_composite.glsl" 11 | dest_files=["res://.godot/imported/path_composite.glsl-57a968e952803a07816326f075cb0e81.res"] 12 | 13 | [params] 14 | 15 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/location-arrow-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/shaders/composite/group_composite.glsl.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="glsl" 4 | type="RDShaderFile" 5 | uid="uid://b7nioxxufeqwh" 6 | path="res://.godot/imported/group_composite.glsl-9304158d0cfaee1e18c82cbcc4938014.res" 7 | 8 | [deps] 9 | 10 | source_file="res://shaders/composite/group_composite.glsl" 11 | dest_files=["res://.godot/imported/group_composite.glsl-9304158d0cfaee1e18c82cbcc4938014.res"] 12 | 13 | [params] 14 | 15 | -------------------------------------------------------------------------------- /rust/src/ppw_polygon.rs: -------------------------------------------------------------------------------- 1 | use godot::prelude::*; 2 | 3 | #[derive(GodotClass)] 4 | #[class(init)] 5 | pub struct PPWPolygon { 6 | #[var] 7 | polygon: PackedVector2Array, 8 | #[var] 9 | segments: Array, 10 | } 11 | impl PPWPolygon { 12 | pub fn empty() -> Self { 13 | Self { 14 | polygon: PackedVector2Array::new(), 15 | segments: Array::new(), 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/square-regular.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/lock-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/shaders/composite/path_composite_jfa_line.glsl.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="glsl" 4 | type="RDShaderFile" 5 | uid="uid://ci8r0pixjqqwc" 6 | path="res://.godot/imported/path_composite_jfa_line.glsl-40357f493df49d726c2dde11e935d04e.res" 7 | 8 | [deps] 9 | 10 | source_file="res://shaders/composite/path_composite_jfa_line.glsl" 11 | dest_files=["res://.godot/imported/path_composite_jfa_line.glsl-40357f493df49d726c2dde11e935d04e.res"] 12 | 13 | [params] 14 | 15 | -------------------------------------------------------------------------------- /godot/src/serialize/document_material_radial_gradient.gd: -------------------------------------------------------------------------------- 1 | class_name DocumentMaterialRadialGradient 2 | extends DocumentMaterial 3 | 4 | 5 | ## マテリアルのグラデーションの色リスト。 6 | @export var colors: String 7 | ## マテリアルのグラデーションの位置リスト。 8 | @export var offsets: String 9 | 10 | ## マテリアルのグラデーションの中心位置。 11 | @export var center_point: Vector2 12 | ## マテリアルのグラデーションのハンドル1位置。 13 | @export var handle_1_point: Vector2 14 | ## マテリアルのグラデーションのハンドル2位置。 15 | @export var handle_2_point: Vector2 16 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/lock-open-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/translation/translation.csv.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="csv_translation" 4 | type="Translation" 5 | uid="uid://c66p26iuek1jd" 6 | 7 | [deps] 8 | 9 | files=["res://translation/translation.ja.translation", "res://translation/translation.en.translation"] 10 | 11 | source_file="res://translation/translation.csv" 12 | dest_files=["res://translation/translation.ja.translation", "res://translation/translation.en.translation"] 13 | 14 | [params] 15 | 16 | compress=true 17 | delimiter=0 18 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/magnifying-glass-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/trash-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/arrow-pointer-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/addons/dockable_container/plugin.cfg: -------------------------------------------------------------------------------- 1 | [plugin] 2 | 3 | name="Dockable Container" 4 | description="Container script that manages docking/tiling UI panels. 5 | 6 | Panels are composed of tabs that can be dragged around and dropped to split another panel or compose its tabs. 7 | 8 | Layout information is stored in Resource objects, so they can be saved/loaded from disk easily. 9 | 10 | This plugin also offers a replica of the Container layout to be edited directly in the inspector." 11 | author="gilzoide" 12 | version="1.1.2" 13 | script="plugin.gd" 14 | -------------------------------------------------------------------------------- /godot/src/serialize/document_layer_fill.gd: -------------------------------------------------------------------------------- 1 | class_name DocumentLayerFill 2 | extends DocumentLayer 3 | 4 | 5 | ## レイヤーのid。 6 | @export var id: String 7 | 8 | ## 下のレイヤーでクリップされているかどうか。 9 | @export var clipped: bool 10 | ## レイヤーが表示されているかどうか。 11 | @export var visible: bool 12 | ## レイヤーがロックされているかどうか。 13 | @export var locked: bool 14 | ## レイヤーのブレンドモード。 15 | @export var blend_mode: DocumentLayer.BlendMode 16 | ## alphaの%値 17 | @export var alpha: int 18 | ## レイヤーの名前。 19 | @export var layer_name: String 20 | 21 | ## fillの色。 22 | @export var fill_material_id: String 23 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/up-down-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/folder-regular.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/left-right-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/rotate-left-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/clone-regular.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/scenes/control/control_segment.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=3 uid="uid://ctlbctut31mb8"] 2 | 3 | [ext_resource type="Shader" path="res://shaders/fill.gdshader" id="1_kfr7m"] 4 | [ext_resource type="Script" path="res://src/control/control_segment.gd" id="1_vb88m"] 5 | 6 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_fcsnq"] 7 | shader = ExtResource("1_kfr7m") 8 | shader_parameter/fill_color = Color(1, 1, 1, 1) 9 | 10 | [node name="ControlSegment" type="Node2D"] 11 | script = ExtResource("1_vb88m") 12 | 13 | [node name="Line2D" type="Line2D" parent="."] 14 | material = SubResource("ShaderMaterial_fcsnq") 15 | -------------------------------------------------------------------------------- /godot/addons/dockable_container/inspector_plugin/editor_inspector_plugin.gd: -------------------------------------------------------------------------------- 1 | extends EditorInspectorPlugin 2 | 3 | const LayoutEditorProperty := preload("layout_editor_property.gd") 4 | 5 | 6 | func _can_handle(object: Object) -> bool: 7 | return object is DockableContainer 8 | 9 | 10 | func _parse_property( 11 | _object: Object, 12 | _type: Variant.Type, 13 | name: String, 14 | _hint: PropertyHint, 15 | _hint_text: String, 16 | _usage: int, 17 | _wide: bool 18 | ) -> bool: 19 | if name == "layout": 20 | var editor_property := LayoutEditorProperty.new() 21 | add_property_editor("layout", editor_property) 22 | return false 23 | -------------------------------------------------------------------------------- /godot/shaders/fill_checker_alpha.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | render_mode unshaded; 3 | 4 | uniform vec4 fill_color: source_color = vec4(1.0, 1.0, 1.0, 1.0); 5 | uniform vec2 document_size = vec2(480, 720); 6 | uniform float document_scale = 1.0; 7 | 8 | void fragment() { 9 | vec2 checker_count = document_size * document_scale / 20.0; 10 | float checker = mod(dot(vec2(1.0), step(vec2(0.5), fract(UV * checker_count))), 2.0); 11 | vec3 checker_color = mix(vec3(1.0, 1.0, 1.0), vec3(0.8, 0.8, 0.8), checker); 12 | 13 | COLOR.rgb = fill_color.rgb * fill_color.a + checker_color * (1.0 - fill_color.a); 14 | COLOR.a = 1.0; 15 | } 16 | -------------------------------------------------------------------------------- /godot/src/serialize/document_layer_group.gd: -------------------------------------------------------------------------------- 1 | class_name DocumentLayerGroup 2 | extends DocumentLayer 3 | 4 | ## レイヤーのid。 5 | @export var id: String 6 | 7 | ## 下のレイヤーでクリップされているかどうか。 8 | @export var clipped: bool 9 | ## レイヤーが表示されているかどうか。 10 | @export var visible: bool 11 | ## レイヤーがロックされているかどうか。 12 | @export var locked: bool 13 | ## レイヤーのブレンドモード。 14 | @export var blend_mode: DocumentLayer.BlendMode 15 | ## alphaの%値 16 | @export var alpha: int 17 | ## レイヤーの名前。 18 | @export var layer_name: String 19 | 20 | ## 折りたたまれているか。 21 | @export var collapsed: bool 22 | 23 | ## このグループレイヤーの子要素のレイヤー 24 | @export var child_layers: Array[DocumentLayer] = [] 25 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/pen-nib-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/addons/dockable_container/plugin.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | extends EditorPlugin 3 | 4 | const LayoutInspectorPlugin := preload("inspector_plugin/editor_inspector_plugin.gd") 5 | const Icon := preload("icon.svg") 6 | 7 | var _layout_inspector_plugin: LayoutInspectorPlugin 8 | 9 | 10 | func _enter_tree() -> void: 11 | _layout_inspector_plugin = LayoutInspectorPlugin.new() 12 | add_custom_type("DockableContainer", "Container", DockableContainer, Icon) 13 | add_inspector_plugin(_layout_inspector_plugin) 14 | 15 | 16 | func _exit_tree() -> void: 17 | remove_inspector_plugin(_layout_inspector_plugin) 18 | remove_custom_type("DockableContainer") 19 | _layout_inspector_plugin = null 20 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/folder-open-regular.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/fill-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/arrow-right-arrow-left-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/circle-question-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/wrench-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/expand-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/shaders/linear_gradient_checker_alpha.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | render_mode unshaded; 3 | 4 | uniform sampler2D gradient_texture; 5 | uniform vec2 document_size = vec2(480, 720); 6 | uniform float document_scale = 1.0; 7 | 8 | void fragment() { 9 | vec4 gradient_color = texture(gradient_texture, vec2(UV.x, 0.5)); 10 | 11 | vec2 checker_count = document_size * document_scale / 20.0; 12 | float checker = mod(dot(vec2(1.0), step(vec2(0.5), fract(UV * checker_count))), 2.0); 13 | vec3 checker_color = mix(vec3(1.0, 1.0, 1.0), vec3(0.8, 0.8, 0.8), checker); 14 | 15 | COLOR.rgb = gradient_color.rgb * gradient_color.a + checker_color * (1.0 - gradient_color.a); 16 | COLOR.a = 1.0; 17 | } 18 | -------------------------------------------------------------------------------- /godot/addons/dockable_container/layout_node.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | class_name DockableLayoutNode 3 | extends Resource 4 | ## Base class for DockableLayout tree nodes 5 | 6 | var parent: DockableLayoutSplit: 7 | get: 8 | return _parent_ref.get_ref() 9 | set(value): 10 | _parent_ref = weakref(value) 11 | 12 | var _parent_ref := WeakRef.new() 13 | 14 | 15 | func emit_tree_changed() -> void: 16 | var node := self 17 | while node: 18 | node.emit_changed() 19 | node = node.parent 20 | 21 | 22 | ## Returns whether there are any nodes 23 | func is_empty() -> bool: 24 | return true 25 | 26 | 27 | ## Returns all tab names in this node 28 | func get_names() -> PackedStringArray: 29 | return PackedStringArray() 30 | -------------------------------------------------------------------------------- /godot/shape.gdextension: -------------------------------------------------------------------------------- 1 | [configuration] 2 | entry_symbol = "gdext_rust_init" 3 | compatibility_minimum = 4.3 4 | reloadable = true 5 | 6 | [libraries] 7 | linux.debug.x86_64 = "res://../rust/target/debug/libshape.so" 8 | linux.release.x86_64 = "res://../rust/target/release/libshape.so" 9 | windows.debug.x86_64 = "res://../rust/target/debug/shape.dll" 10 | windows.release.x86_64 = "res://../rust/target/release/shape.dll" 11 | macos.debug = "res://../rust/target/debug/libshape.dylib" 12 | macos.release = "res://../rust/target/release/libshape.dylib" 13 | macos.debug.arm64 = "res://../rust/target/debug/libshape.dylib" 14 | macos.release.arm64 = "res://../rust/target/release/libshape.dylib" 15 | -------------------------------------------------------------------------------- /godot/src/pool/path_pool.gd: -------------------------------------------------------------------------------- 1 | class_name PathPool 2 | extends RefCounted 3 | 4 | 5 | const uuid_util = preload('res://addons/uuid/uuid.gd') 6 | 7 | ## Pathのプール 8 | var _path_pool: Array[Path] = [] 9 | 10 | 11 | ## PathPaintLayerを取得する。 12 | func get_path(new_path_name: bool = true) -> Path: 13 | if _path_pool.size() > 1: 14 | var path: Path = _path_pool.pop_back() 15 | if new_path_name: 16 | path.path_name = Main.layers.get_new_path_name() 17 | path.id = uuid_util.v4() 18 | return path 19 | return Path.new_path() 20 | 21 | 22 | ## Pathをプールに返却する。 23 | func free_path(path: Path) -> void: 24 | path.clear_path() 25 | _path_pool.push_back(path) 26 | 27 | 28 | ## プールをクリアする。 29 | func clear() -> void: 30 | _path_pool.clear() 31 | -------------------------------------------------------------------------------- /godot/icons/union.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /godot/icons/diff.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /godot/shaders/radial_gradient_checker_alpha.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | render_mode unshaded; 3 | 4 | uniform sampler2D gradient_texture; 5 | uniform vec2 document_size = vec2(480, 720); 6 | uniform float document_scale = 1.0; 7 | 8 | void fragment() { 9 | vec2 uv = vec2(length(UV - vec2(0.5)) * 2.0, 0.5); 10 | vec4 gradient_color = texture(gradient_texture, uv); 11 | 12 | vec2 checker_count = document_size * document_scale / 20.0; 13 | float checker = mod(dot(vec2(1.0), step(vec2(0.5), fract(UV * checker_count))), 2.0); 14 | vec3 checker_color = mix(vec3(1.0, 1.0, 1.0), vec3(0.8, 0.8, 0.8), checker); 15 | 16 | COLOR.rgb = gradient_color.rgb * gradient_color.a + checker_color * (1.0 - gradient_color.a); 17 | COLOR.a = 1.0; 18 | } 19 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/eye-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/maximize-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/shaders/texture_checker_alpha.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | render_mode unshaded; 3 | 4 | uniform sampler2D main_texture: hint_default_transparent, filter_linear_mipmap, source_color; 5 | uniform vec2 document_size = vec2(480, 720); 6 | uniform float document_scale = 1.0; 7 | 8 | void fragment() { 9 | vec4 main_color = texture(main_texture, UV); 10 | 11 | vec2 checker_count = vec2(1.0) / SCREEN_PIXEL_SIZE / 24.0; 12 | float checker = mod(dot(vec2(1.0), step(vec2(0.5), fract(SCREEN_UV * checker_count))), 2.0); 13 | vec3 checker_color = mix(vec3(1.0, 1.0, 1.0), vec3(0.8, 0.8, 0.8), checker); 14 | 15 | // Godot標準のpre-multiply alphaテクスチャではなく、 16 | // 自前のcompositeしたテクスチャを使うので通常のalpha計算を行っている 17 | COLOR.rgb = main_color.rgb * main_color.a + checker_color * (1.0 - main_color.a); 18 | COLOR.a = 1.0; 19 | } 20 | -------------------------------------------------------------------------------- /godot/shaders/composite/mipmap_generate.glsl: -------------------------------------------------------------------------------- 1 | #[compute] 2 | #version 460 3 | 4 | layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; 5 | 6 | layout(rgba8, set = 0, binding = 0) uniform image2D store_image; 7 | layout(set = 1, binding = 0) uniform sampler2D input_image; 8 | 9 | layout(push_constant, std430) uniform PushConstants { 10 | int width; 11 | int height; 12 | int padding0; 13 | int padding1; 14 | } pushConstants; 15 | 16 | void main() { 17 | ivec2 size = ivec2(pushConstants.width, pushConstants.height); 18 | ivec2 iuv = ivec2(gl_GlobalInvocationID.xy); 19 | 20 | if (iuv.x >= size.x || iuv.y >= size.y) { 21 | return; 22 | } 23 | 24 | vec2 uv = (vec2(iuv) + vec2(0.5)) / vec2(size); 25 | 26 | vec4 color = texture(input_image, uv); 27 | imageStore(store_image, iuv, color); 28 | } 29 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/up-down-left-right-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/icons/xor.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /godot/icons/intersect.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /godot/shaders/radial_gradient_path.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | render_mode unshaded; 3 | 4 | uniform sampler2D gradient_texture; 5 | uniform vec2 center_point = vec2(0, 0); 6 | uniform vec2 handle_1_point = vec2(1, 0); 7 | uniform vec2 handle_2_point = vec2(1, 0); 8 | 9 | void fragment() { 10 | vec2 a = handle_1_point - center_point; 11 | vec2 b = handle_2_point - center_point; 12 | float aLength = length(a); 13 | float bLength = length(b); 14 | vec2 aNorm = a / aLength; 15 | vec2 bNorm = b / bLength; 16 | if (aLength < 0.0001 || bLength < 0.0001) { 17 | COLOR = texture(gradient_texture, vec2(1.0, 0.5)); 18 | } else { 19 | vec2 uv = SCREEN_UV; 20 | vec2 p = uv - center_point; 21 | vec2 pp = dot(p, aNorm) * aNorm + dot(p, bNorm) * bNorm / bLength * aLength; 22 | float t = length(pp) / aLength; 23 | COLOR = texture(gradient_texture, vec2(t, 0.5)); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /godot/icons/gradient-editor-color-arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /godot/src/serialize/document_layer_path.gd: -------------------------------------------------------------------------------- 1 | class_name DocumentLayerPath 2 | extends DocumentLayer 3 | 4 | ## レイヤーのid。 5 | @export var id: String 6 | 7 | ## 下のレイヤーでクリップされているかどうか。 8 | @export var clipped: bool 9 | ## レイヤーが表示されているかどうか。 10 | @export var visible: bool 11 | ## レイヤーがロックされているかどうか。 12 | @export var locked: bool 13 | ## レイヤーのブレンドモード。 14 | @export var blend_mode: DocumentLayer.BlendMode 15 | ## alphaの%値 16 | @export var alpha: int 17 | ## レイヤーの名前。 18 | @export var layer_name: String 19 | 20 | ## fillするかどうか。 21 | @export var filled: bool 22 | ## fillの色。 23 | @export var fill_material_id: String 24 | ## outlineのオンオフ。 25 | @export var outlined: bool 26 | ## outlineの色。 27 | @export var outline_material_id: String 28 | ## outlineの幅。 29 | @export var outline_width: float 30 | ## 折りたたまれているか。 31 | @export var collapsed: bool 32 | 33 | ## レイヤーの保持するパスの配列。 34 | @export var paths: Array[DocumentPath] 35 | -------------------------------------------------------------------------------- /godot/RobotoMono-SemiBold.ttf.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="font_data_dynamic" 4 | type="FontFile" 5 | uid="uid://detoutj1j8iin" 6 | path="res://.godot/imported/RobotoMono-SemiBold.ttf-af5a063eb39e9bae115cbd93617ff3f6.fontdata" 7 | 8 | [deps] 9 | 10 | source_file="res://RobotoMono-SemiBold.ttf" 11 | dest_files=["res://.godot/imported/RobotoMono-SemiBold.ttf-af5a063eb39e9bae115cbd93617ff3f6.fontdata"] 12 | 13 | [params] 14 | 15 | Rendering=null 16 | antialiasing=1 17 | generate_mipmaps=false 18 | disable_embedded_bitmaps=true 19 | multichannel_signed_distance_field=false 20 | msdf_pixel_range=8 21 | msdf_size=48 22 | allow_system_fallback=true 23 | force_autohinter=false 24 | hinting=1 25 | subpixel_positioning=1 26 | oversampling=0.0 27 | Fallbacks=null 28 | fallbacks=[] 29 | Compress=null 30 | compress=true 31 | preload=[] 32 | language_support={} 33 | script_support={} 34 | opentype_features={} 35 | -------------------------------------------------------------------------------- /godot/splash-logo.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://ckx8xvgp5dj2f" 6 | path="res://.godot/imported/splash-logo.png-67cae680c6a5e4292ece44bb6fc55b78.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://splash-logo.png" 14 | dest_files=["res://.godot/imported/splash-logo.png-67cae680c6a5e4292ece44bb6fc55b78.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /godot/shaders/composite/init_jfa_line.glsl: -------------------------------------------------------------------------------- 1 | #[compute] 2 | #version 460 3 | 4 | layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; 5 | 6 | layout(rgba32f, set = 0, binding = 0) uniform image2D store_image; 7 | layout(rgba8, set = 1, binding = 0) uniform readonly image2D viewport_image; 8 | 9 | 10 | layout(push_constant, std430) uniform PushConstants { 11 | int width; 12 | int height; 13 | int padding0; 14 | int padding1; 15 | } pushConstants; 16 | 17 | void main() { 18 | ivec2 size = ivec2(pushConstants.width, pushConstants.height); 19 | ivec2 uv = ivec2(gl_GlobalInvocationID.xy); 20 | 21 | if (uv.x >= size.x || uv.y >= size.y) { 22 | return; 23 | } 24 | 25 | vec4 viewport = imageLoad(viewport_image, uv); 26 | 27 | vec4 init; 28 | if (viewport.r == 1.0) { 29 | init = vec4(0.0, -1.0, 1.0, 0.0); 30 | } else { 31 | init = vec4(-1.0, 0.0, 0.0, 1.0); 32 | } 33 | imageStore(store_image, uv, init); 34 | } 35 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/eye-slash-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /godot/icon.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dl5hs6rdpmoec" 6 | path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icon.svg" 14 | dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/scenes/node/list_drop_cursor.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=3 uid="uid://83wedgkgqa8o"] 2 | 3 | [ext_resource type="Script" path="res://src/node/list_drop_cursor.gd" id="1_gtl4h"] 4 | 5 | [node name="ListDropCursor" type="BoxContainer"] 6 | anchors_preset = 14 7 | anchor_top = 0.5 8 | anchor_right = 1.0 9 | anchor_bottom = 0.5 10 | offset_top = -2.0 11 | offset_bottom = -2.0 12 | grow_horizontal = 2 13 | grow_vertical = 2 14 | size_flags_vertical = 4 15 | mouse_filter = 2 16 | script = ExtResource("1_gtl4h") 17 | 18 | [node name="Control" type="Control" parent="."] 19 | layout_mode = 2 20 | size_flags_horizontal = 3 21 | mouse_filter = 2 22 | 23 | [node name="ColorRect" type="ColorRect" parent="Control"] 24 | z_index = 10 25 | layout_mode = 1 26 | anchors_preset = 4 27 | anchor_top = 0.5 28 | anchor_bottom = 0.5 29 | offset_top = -2.0 30 | offset_right = 1132.0 31 | offset_bottom = 2.0 32 | grow_vertical = 2 33 | size_flags_horizontal = 3 34 | mouse_filter = 2 35 | color = Color(0.501961, 0.8, 0.701961, 1) 36 | -------------------------------------------------------------------------------- /godot/icons/diff.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://esb812dxjhx3" 6 | path="res://.godot/imported/diff.svg-89f4448e2c6de55a354a8b2fb2217542.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/diff.svg" 14 | dest_files=["res://.godot/imported/diff.svg-89f4448e2c6de55a354a8b2fb2217542.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=0.04 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/xor.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bsxiknl4vq61y" 6 | path="res://.godot/imported/xor.svg-1f9b85d073bdcd12ca0ee263f682123e.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/xor.svg" 14 | dest_files=["res://.godot/imported/xor.svg-1f9b85d073bdcd12ca0ee263f682123e.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=0.04 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/addons/dockable_container/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /godot/icons/union.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bkls8jpsc3ps5" 6 | path="res://.godot/imported/union.svg-9be719cedb7dbb8ac653c25813c6420c.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/union.svg" 14 | dest_files=["res://.godot/imported/union.svg-9be719cedb7dbb8ac653c25813c6420c.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=0.04 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/mirror.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dyvcxrvw3yagv" 6 | path="res://.godot/imported/mirror.svg-b27b93c8da8d7d719c8a00082f3d1136.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/mirror.svg" 14 | dest_files=["res://.godot/imported/mirror.svg-b27b93c8da8d7d719c8a00082f3d1136.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/src/serialize/document.gd: -------------------------------------------------------------------------------- 1 | class_name Document 2 | extends Resource 3 | 4 | 5 | ## レイヤーのリスト。 6 | @export var layers: Array[DocumentLayer] 7 | ## ドキュメントのサイズ。 8 | @export var document_size: Vector2i 9 | 10 | ## マテリアルのリスト。 11 | @export var materials: Array[DocumentMaterial] 12 | ## 新規レイヤー作成時の塗りのマテリアルid。 13 | @export var new_path_layer_fill_material_id: String 14 | ## 新規レイヤー作成時の線のマテリアルid。 15 | @export var new_path_layer_line_material_id: String 16 | ## 新規レイヤー作成時の塗りのマテリアルid。 17 | @export var new_fill_layer_material_id: String 18 | 19 | ## 現在選択されているレイヤーのidの配列。 20 | @export var selected_layers: Array[String] 21 | ## 現在選択されているパスのidの配列。 22 | @export var selected_paths: Array[String] 23 | 24 | ## 最後に選択したPaintLayerのid。存在しない場合は空文字。 25 | @export var last_selected_layer: String 26 | ## 最後に選択したPathのid。存在しない場合は空文字。 27 | @export var last_selected_path: String 28 | ## 最後に選択したPaintLayerもしくはPathのid。存在しない場合は空文字。 29 | @export var last_selected_item: String 30 | 31 | ## 現在描画先になっているPathPaintLayerのid。存在しない場合は空文字。 32 | @export var drawing_path_layer: String 33 | -------------------------------------------------------------------------------- /godot/icons/fill-plus.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://clwpv24en3js7" 6 | path="res://.godot/imported/fill-plus.svg-3288def27577982d1d5155c9192bf46a.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/fill-plus.svg" 14 | dest_files=["res://.godot/imported/fill-plus.svg-3288def27577982d1d5155c9192bf46a.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=0.04 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/intersect.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://delwiq2ud4o5b" 6 | path="res://.godot/imported/intersect.svg-2d5fa6b43577041ecf0f2a4725e55ce1.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/intersect.svg" 14 | dest_files=["res://.godot/imported/intersect.svg-2d5fa6b43577041ecf0f2a4725e55ce1.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=0.04 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/open_path.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://mrvjp3pgu7ea" 6 | path="res://.godot/imported/open_path.svg-ac1b2a4a157ca0fc6d58aab1ec20d81a.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/open_path.svg" 14 | dest_files=["res://.godot/imported/open_path.svg-ac1b2a4a157ca0fc6d58aab1ec20d81a.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /rust/src/ppw_path.rs: -------------------------------------------------------------------------------- 1 | use godot::prelude::*; 2 | 3 | #[derive(GodotClass)] 4 | #[class(init)] 5 | pub struct PPWPath { 6 | #[var] 7 | is_closed: bool, 8 | #[var] 9 | control_points: PackedVector2Array, 10 | #[var] 11 | weights: PackedFloat32Array, 12 | #[var] 13 | phis: PackedFloat32Array, 14 | #[var] 15 | psis: PackedFloat32Array, 16 | } 17 | impl PPWPath { 18 | pub fn validate(&self) -> bool { 19 | let control_points_len = self.control_points.len(); 20 | let weights_len = self.weights.len(); 21 | let phis_len = self.phis.len(); 22 | let psis_len = self.psis.len(); 23 | if self.get_is_closed() { 24 | control_points_len == weights_len 25 | && control_points_len == phis_len 26 | && control_points_len == psis_len 27 | } else { 28 | control_points_len == weights_len 29 | && control_points_len == phis_len + 1 30 | && control_points_len == psis_len + 1 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /godot/icons/closed_path.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://b5qkp4rnmh7p5" 6 | path="res://.godot/imported/closed_path.svg-cdd564bbac96eac66182d47b2532fae5.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/closed_path.svg" 14 | dest_files=["res://.godot/imported/closed_path.svg-cdd564bbac96eac66182d47b2532fae5.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/folder-plus.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dsgcgfj17p0ih" 6 | path="res://.godot/imported/folder-plus.svg-b15e9c4a6f857cee59ac6d25bde07ea9.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/folder-plus.svg" 14 | dest_files=["res://.godot/imported/folder-plus.svg-b15e9c4a6f857cee59ac6d25bde07ea9.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=0.04 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/mirror-flip.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bsxn6okjahtn5" 6 | path="res://.godot/imported/mirror-flip.svg-a7c045dfbf76914b4fa2e83bd1a88221.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/mirror-flip.svg" 14 | dest_files=["res://.godot/imported/mirror-flip.svg-a7c045dfbf76914b4fa2e83bd1a88221.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/square-plus.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://eej4fsmgxa1d" 6 | path="res://.godot/imported/square-plus.svg-d3eaf9c1f403f080558c039da4a3cbed.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/square-plus.svg" 14 | dest_files=["res://.godot/imported/square-plus.svg-d3eaf9c1f403f080558c039da4a3cbed.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=0.04 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/addons/dockable_container/icon.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dy25danh2am23" 6 | path="res://.godot/imported/icon.svg-35635e7bbda4487d4b2942da1d987df8.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://addons/dockable_container/icon.svg" 14 | dest_files=["res://.godot/imported/icon.svg-35635e7bbda4487d4b2942da1d987df8.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/eye-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cp43s5pjuigfc" 6 | path="res://.godot/imported/eye-solid.svg-0949cc6e0b3133b24acec925654262c6.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/eye-solid.svg" 14 | dest_files=["res://.godot/imported/eye-solid.svg-0949cc6e0b3133b24acec925654262c6.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/fill-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c8eyxuhtxxx2w" 6 | path="res://.godot/imported/fill-solid.svg-6fabddf3a29a24efce44391181ea6cf0.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/fill-solid.svg" 14 | dest_files=["res://.godot/imported/fill-solid.svg-6fabddf3a29a24efce44391181ea6cf0.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/lock-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bgaugxuhl5lvm" 6 | path="res://.godot/imported/lock-solid.svg-e1766748a3d513c5c2c2cf185aa5071e.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/lock-solid.svg" 14 | dest_files=["res://.godot/imported/lock-solid.svg-e1766748a3d513c5c2c2cf185aa5071e.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/plus-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://6u0brruaecvq" 6 | path="res://.godot/imported/plus-solid.svg-889d572bfffa878592bb95dc78e95e75.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/plus-solid.svg" 14 | dest_files=["res://.godot/imported/plus-solid.svg-889d572bfffa878592bb95dc78e95e75.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/slash-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://byheik8rybqlc" 6 | path="res://.godot/imported/slash-solid.svg-88c359b4b493493b74f96a76634819f2.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/slash-solid.svg" 14 | dest_files=["res://.godot/imported/slash-solid.svg-88c359b4b493493b74f96a76634819f2.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/trash-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cfy4c56trjpcp" 6 | path="res://.godot/imported/trash-solid.svg-5ff44a104faaab9e0722ddd7e4b84d30.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/trash-solid.svg" 14 | dest_files=["res://.godot/imported/trash-solid.svg-5ff44a104faaab9e0722ddd7e4b84d30.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/src/node/gradient_editor_color_arrow.gd: -------------------------------------------------------------------------------- 1 | class_name GradientEditorColorArrow 2 | extends Panel 3 | 4 | 5 | @onready var _color_rect: ColorRect = %ColorRect; 6 | @onready var _sprite: Sprite2D = %Sprite2D; 7 | 8 | 9 | ## 色。 10 | var color: Color = Color(0, 0, 0, 1): 11 | set(value): 12 | color = value 13 | _color_rect.color = value 14 | get: 15 | return color 16 | 17 | ## 色のオフセット。 18 | var offset: float = 0.0 19 | 20 | ## ホバー状態。 21 | var hover: bool = false 22 | 23 | 24 | func _ready() -> void: 25 | _sprite.material = _sprite.material.duplicate() 26 | 27 | 28 | ## 選択する。 29 | func select() -> void: 30 | (_sprite.material as ShaderMaterial).set_shader_parameter("fill_color", Color(0.5, 0.5, 0.8, 1)) 31 | 32 | 33 | ## 選択を解除する。 34 | func deselect() -> void: 35 | (_sprite.material as ShaderMaterial).set_shader_parameter("fill_color", Color(0.1, 0.1, 0.1, 1)) 36 | 37 | 38 | ## マウスがエリアに入ったときに呼ばれるコールバック。 39 | func _on_mouse_entered() -> void: 40 | hover = true 41 | 42 | 43 | ## マウスがエリアから出たときに呼ばれるコールバック。 44 | func _on_mouse_exited() -> void: 45 | hover = false 46 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/circle-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://d4dxklmx6r8is" 6 | path="res://.godot/imported/circle-solid.svg-c861deddc622935b33913731c609265c.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/circle-solid.svg" 14 | dest_files=["res://.godot/imported/circle-solid.svg-c861deddc622935b33913731c609265c.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/clone-regular.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://ukf4j5kwqbqc" 6 | path="res://.godot/imported/clone-regular.svg-6f5da595d139f68a557b019b2cc2a636.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/clone-regular.svg" 14 | dest_files=["res://.godot/imported/clone-regular.svg-6f5da595d139f68a557b019b2cc2a636.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/expand-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://yopfar782wsm" 6 | path="res://.godot/imported/expand-solid.svg-cfd5ffe47bbe6e5ad8fb7566fbbf1dbb.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/expand-solid.svg" 14 | dest_files=["res://.godot/imported/expand-solid.svg-cfd5ffe47bbe6e5ad8fb7566fbbf1dbb.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/pen-nib-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://07j3j13jje5v" 6 | path="res://.godot/imported/pen-nib-solid.svg-3cf0ec97f9f499c26873e5fbb9a3fc00.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/pen-nib-solid.svg" 14 | dest_files=["res://.godot/imported/pen-nib-solid.svg-3cf0ec97f9f499c26873e5fbb9a3fc00.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/square-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dfnl502akgfg8" 6 | path="res://.godot/imported/square-solid.svg-2daf954ce57320ca79dd33f1f261a7f6.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/square-solid.svg" 14 | dest_files=["res://.godot/imported/square-solid.svg-2daf954ce57320ca79dd33f1f261a7f6.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/wrench-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://oqlqlwg6cqcm" 6 | path="res://.godot/imported/wrench-solid.svg-7e09ffd980998fbe06e7903373405527.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/wrench-solid.svg" 14 | dest_files=["res://.godot/imported/wrench-solid.svg-7e09ffd980998fbe06e7903373405527.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/circle-regular.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cwvu8b6n6ba6b" 6 | path="res://.godot/imported/circle-regular.svg-7041da5835c4bf1e0b8a60ad64a1b00b.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/circle-regular.svg" 14 | dest_files=["res://.godot/imported/circle-regular.svg-7041da5835c4bf1e0b8a60ad64a1b00b.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/maximize-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://q7ksryj1gucs" 6 | path="res://.godot/imported/maximize-solid.svg-094bfde1f66c027814cfa18a3879b868.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/maximize-solid.svg" 14 | dest_files=["res://.godot/imported/maximize-solid.svg-094bfde1f66c027814cfa18a3879b868.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/square-regular.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://w3jj8dsk5ee" 6 | path="res://.godot/imported/square-regular.svg-9ec8f713fc388e11940ce8e6ba39195b.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/square-regular.svg" 14 | dest_files=["res://.godot/imported/square-regular.svg-9ec8f713fc388e11940ce8e6ba39195b.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/up-down-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://b7h1663aq7quo" 6 | path="res://.godot/imported/up-down-solid.svg-864ef8087e0899dbff5bccdf96a31127.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/up-down-solid.svg" 14 | dest_files=["res://.godot/imported/up-down-solid.svg-864ef8087e0899dbff5bccdf96a31127.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/eye-slash-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bs6y5xvpid1hl" 6 | path="res://.godot/imported/eye-slash-solid.svg-578b908dc7a7469df7258eec21dcd6cd.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/eye-slash-solid.svg" 14 | dest_files=["res://.godot/imported/eye-slash-solid.svg-578b908dc7a7469df7258eec21dcd6cd.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/folder-regular.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dbdfmeeypughg" 6 | path="res://.godot/imported/folder-regular.svg-edfbe50a09d44da5a22c6f62b2daa2e3.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/folder-regular.svg" 14 | dest_files=["res://.godot/imported/folder-regular.svg-edfbe50a09d44da5a22c6f62b2daa2e3.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=0.04 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/lock-open-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dc2f1ibod6vkx" 6 | path="res://.godot/imported/lock-open-solid.svg-5bd01cc842d324d470b62d38a6fdf978.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/lock-open-solid.svg" 14 | dest_files=["res://.godot/imported/lock-open-solid.svg-5bd01cc842d324d470b62d38a6fdf978.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/caret-down-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bihym07yhfwvb" 6 | path="res://.godot/imported/caret-down-solid.svg-62e766fe9b1eca7b51f726e385c4f5c8.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/caret-down-solid.svg" 14 | dest_files=["res://.godot/imported/caret-down-solid.svg-62e766fe9b1eca7b51f726e385c4f5c8.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/left-right-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cfxa3i3lacmvf" 6 | path="res://.godot/imported/left-right-solid.svg-e85fdfd6cce6fbf75ee37d731383a00b.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/left-right-solid.svg" 14 | dest_files=["res://.godot/imported/left-right-solid.svg-e85fdfd6cce6fbf75ee37d731383a00b.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/angle-right-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dn5t4s8yc6bm3" 6 | path="res://.godot/imported/angle-right-solid.svg-15f903df9b1078a02a46c0fd3d3f7a90.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/angle-right-solid.svg" 14 | dest_files=["res://.godot/imported/angle-right-solid.svg-15f903df9b1078a02a46c0fd3d3f7a90.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/caret-right-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://1jifl7a7wmah" 6 | path="res://.godot/imported/caret-right-solid.svg-d38c22ea1063fb55fd46e0c4969af69e.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/caret-right-solid.svg" 14 | dest_files=["res://.godot/imported/caret-right-solid.svg-d38c22ea1063fb55fd46e0c4969af69e.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/rotate-left-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://x10k6c7p5yn2" 6 | path="res://.godot/imported/rotate-left-solid.svg-a893aca4dd997050aa3c72402e666513.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/rotate-left-solid.svg" 14 | dest_files=["res://.godot/imported/rotate-left-solid.svg-a893aca4dd997050aa3c72402e666513.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/arrow-pointer-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://m4cppsxsjaem" 6 | path="res://.godot/imported/arrow-pointer-solid.svg-d073a31647104f283990d10a3eaa36f8.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/arrow-pointer-solid.svg" 14 | dest_files=["res://.godot/imported/arrow-pointer-solid.svg-d073a31647104f283990d10a3eaa36f8.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/folder-open-regular.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://yof4lmve8kdo" 6 | path="res://.godot/imported/folder-open-regular.svg-d902fe499e61377e4a3542c7847083fd.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/folder-open-regular.svg" 14 | dest_files=["res://.godot/imported/folder-open-regular.svg-d902fe499e61377e4a3542c7847083fd.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=0.04 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/location-arrow-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cdcr07emv7u2m" 6 | path="res://.godot/imported/location-arrow-solid.svg-49da542b3a68ff7aaae3c453a5827a9b.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/location-arrow-solid.svg" 14 | dest_files=["res://.godot/imported/location-arrow-solid.svg-49da542b3a68ff7aaae3c453a5827a9b.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/circle-question-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://b4pppiaal50ew" 6 | path="res://.godot/imported/circle-question-solid.svg-2291510bf7318e6cfc3679aba0f33334.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/circle-question-solid.svg" 14 | dest_files=["res://.godot/imported/circle-question-solid.svg-2291510bf7318e6cfc3679aba0f33334.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=0.06 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/gradient-editor-color-arrow.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cwtuhfpnanbh8" 6 | path="res://.godot/imported/gradient-editor-color-arrow.svg-8bacc587e83374f347c0c6ceb94a6658.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/gradient-editor-color-arrow.svg" 14 | dest_files=["res://.godot/imported/gradient-editor-color-arrow.svg-8bacc587e83374f347c0c6ceb94a6658.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/magnifying-glass-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bej0ujfdimntj" 6 | path="res://.godot/imported/magnifying-glass-solid.svg-8cf6428eeedd7c2688a8bd6f78374e02.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/magnifying-glass-solid.svg" 14 | dest_files=["res://.godot/imported/magnifying-glass-solid.svg-8cf6428eeedd7c2688a8bd6f78374e02.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/up-down-left-right-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://b2g3521wwvxi5" 6 | path="res://.godot/imported/up-down-left-right-solid.svg-a97f7a62dd701b192298c5ac7af9ad04.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/up-down-left-right-solid.svg" 14 | dest_files=["res://.godot/imported/up-down-left-right-solid.svg-a97f7a62dd701b192298c5ac7af9ad04.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Orito Itsuki 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /godot/icons/font_awesome/arrow-right-arrow-left-solid.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cnqkj40h44qeh" 6 | path="res://.godot/imported/arrow-right-arrow-left-solid.svg-bd68e50487711bfc723f271487cbec4a.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icons/font_awesome/arrow-right-arrow-left-solid.svg" 14 | dest_files=["res://.godot/imported/arrow-right-arrow-left-solid.svg-bd68e50487711bfc723f271487cbec4a.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /godot/src/sub_window/document_export_window.gd: -------------------------------------------------------------------------------- 1 | class_name DocumentExportWindow 2 | extends Window 3 | 4 | 5 | ## ドキュメントの作成が押されたときのシグナル。 6 | signal on_export_document(document_size: Vector2) 7 | 8 | @onready var _width_spin_box: SpinBox = %WidthSpinBox 9 | @onready var _height_spin_box: SpinBox = %HeightSpinBox 10 | 11 | 12 | ## 表示するドキュメントサイズを変える。 13 | func set_document_size(document_size: Vector2) -> void: 14 | _width_spin_box.value = document_size.x 15 | _height_spin_box.value = document_size.y 16 | 17 | 18 | ## 作成ボタンが押された際のコールバック。 19 | func _on_create_button_pressed() -> void: 20 | hide() 21 | on_export_document.emit(Vector2(_width_spin_box.value, _height_spin_box.value)) 22 | 23 | 24 | ## キャンセルボタンが押された際のコールバック。 25 | func _on_cancel_button_pressed() -> void: 26 | hide() 27 | 28 | 29 | ## windowのcloseがリクエストされた際のコールバック。 30 | func _on_close_requested() -> void: 31 | hide() 32 | 33 | 34 | ## 幅の値が変更された際のコールバック。 35 | func _on_width_spin_box_value_changed(value: float) -> void: 36 | var new_width := roundi(value) 37 | var new_height := int(Main.document_size.y * new_width / Main.document_size.x) 38 | _height_spin_box.set_value_no_signal(new_height) 39 | 40 | 41 | ## 高さの値が変更された際のコールバック。 42 | func _on_height_spin_box_value_changed(value: float) -> void: 43 | var new_height := roundi(value) 44 | var new_width := int(Main.document_size.x * new_height / Main.document_size.y) 45 | _width_spin_box.set_value_no_signal(new_width) 46 | -------------------------------------------------------------------------------- /godot/icons/mirror.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /godot/icons/mirror-flip.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /godot/shaders/composite/rasterize.glsl: -------------------------------------------------------------------------------- 1 | #[vertex] 2 | #version 460 3 | 4 | layout(location = 0) in vec2 position; 5 | 6 | layout(push_constant, std430) uniform PushConstants { 7 | int width; 8 | int height; 9 | int booleanMode; 10 | int dummy; 11 | } pushConstants; 12 | 13 | void main() 14 | { 15 | vec2 pos = position / vec2(pushConstants.width, pushConstants.height); 16 | pos = pos * 2.0 - 1.0; 17 | gl_Position = vec4(pos, 0.0, 1.0); 18 | } 19 | 20 | 21 | #[fragment] 22 | #version 460 23 | 24 | layout (location = 0) out vec4 out_color; 25 | 26 | layout(set = 0, binding = 0) uniform sampler2D backBufferImage; 27 | 28 | layout(push_constant, std430) uniform PushConstants { 29 | int width; 30 | int height; 31 | int booleanMode; 32 | int dummy; 33 | } pushConstants; 34 | 35 | void main() 36 | { 37 | vec2 rg = texture(backBufferImage, gl_FragCoord.xy / vec2(pushConstants.width, pushConstants.height)).rg; 38 | 39 | if (pushConstants.booleanMode == 0) { 40 | // Add 41 | out_color = vec4(1, 0, 0, 0); 42 | } else if (pushConstants.booleanMode == 1) { 43 | // Diff 44 | out_color = vec4(0, 0, 0, 0); 45 | } else if (pushConstants.booleanMode == 2) { 46 | // Intersect first pass 47 | out_color = vec4(rg.r, 1, 0, 0); 48 | } else if (pushConstants.booleanMode == 3) { 49 | // Xor 50 | out_color = vec4(1 - rg.r, 0, 0, 0); 51 | } else { 52 | // Intersect second pass 53 | out_color = vec4(rg.r* rg.g, 0, 0, 0); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Aquamarine Painter

2 | 3 |

4 | 5 |

6 | 7 |

8 | [ja | en] 9 |

10 | 11 | ## スクリーンショット 12 | 13 | https://github.com/user-attachments/assets/64b61a46-360f-4107-a62b-e9491fa3b449 14 | 15 | ![screenshot](./README/screenshot-0.png) 16 | 17 | ![screenshot](./README/screenshot-1.png) 18 | 19 | ## PPW Curves 20 | 21 | このソフトウェアでは[PPW Curves](https://www.jstage.jst.go.jp/article/transinf/E105.D/10/E105.D_2022PCP0006/_pdf)というスプライン曲線を利用しています。 22 | 23 | この曲線はすべてのコントロールポイントを通る曲線で、調整ツールを利用することで以下のようなパラメータの調整ができます。 24 | 25 | | 操作 | gif | 26 | | --- | --- | 27 | | コントロールポイントを左右ドラッグ | ![weight](./README/weight.gif) | 28 | | コントロールポイントの間のセグメントを上下にドラッグ | ![phi](./README/phi.gif) | 29 | | コントロールポイントの間のセグメントを左右にドラッグ | ![psi](./README/psi.gif) | 30 | 31 | ## キーボードショートカット 32 | 33 | | キー | 機能 | 34 | | --- | --- | 35 | | `Ctrl` + `Z` | アンドゥ | 36 | | `Ctrl` + `Shift` + `Z` | リドゥ | 37 | | `Ctrl` + `C` | 選択中のマテリアル or レイヤーのコピー | 38 | | `Ctrl` + `V` | ペースト | 39 | | `1` | 描画ツール | 40 | | `2` | 操作ツール | 41 | | `3` | 調整ツール | 42 | | `4` | 枠内に収める | 43 | | `5` | 拡大率を100%に戻す | 44 | | `6` | 左右反転 | 45 | | `Space` | コントローラーの一時非表示 | 46 | 47 | ## 免責事項 48 | 49 | このアプリは個人用に作成したものであり、OSSプロジェクトとして機能追加・要望対応などを行っていく予定はありません。 50 | このアプリのソースコードはMITライセンスで配布しているので、必要があればforkして自分で機能を追加してください。 51 | 52 | ## LICENSE 53 | 54 | このアプリのソースコードはMITライセンスで配布しています。 55 | 56 | 一部にMPL-2.0ライセンスのプログラムを利用しています。 57 | -------------------------------------------------------------------------------- /godot/scenes/node/path.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=8 format=3 uid="uid://biwyb60wav3xb"] 2 | 3 | [ext_resource type="Script" path="res://src/layer/path.gd" id="1_jh877"] 4 | [ext_resource type="Shader" path="res://shaders/missing_material.gdshader" id="2_dd7m4"] 5 | [ext_resource type="Shader" path="res://shaders/linear_gradient_path.gdshader" id="3_tec1e"] 6 | [ext_resource type="Shader" path="res://shaders/radial_gradient_path.gdshader" id="4_2ehwr"] 7 | 8 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_h2vc1"] 9 | shader = ExtResource("2_dd7m4") 10 | 11 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_yd0m4"] 12 | shader = ExtResource("3_tec1e") 13 | shader_parameter/start_point = Vector2(0, 0) 14 | shader_parameter/end_point = Vector2(1, 0) 15 | 16 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_b7tlp"] 17 | shader = ExtResource("4_2ehwr") 18 | shader_parameter/center_point = Vector2(0, 0) 19 | shader_parameter/handle_1_point = Vector2(1, 0) 20 | shader_parameter/handle_2_point = Vector2(1, 0) 21 | 22 | [node name="Path" type="SubViewport"] 23 | transparent_bg = true 24 | msaa_2d = 1 25 | canvas_item_default_texture_filter = 2 26 | render_target_update_mode = 0 27 | script = ExtResource("1_jh877") 28 | missing_material = SubResource("ShaderMaterial_h2vc1") 29 | linear_gradient_material = SubResource("ShaderMaterial_yd0m4") 30 | radial_gradient_material = SubResource("ShaderMaterial_b7tlp") 31 | 32 | [node name="Line2D" type="Line2D" parent="."] 33 | 34 | [node name="Polygon2D" type="Polygon2D" parent="."] 35 | -------------------------------------------------------------------------------- /godot/scenes/node/gradient_editor_color_arrow.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=6 format=3 uid="uid://dmry8668lobcy"] 2 | 3 | [ext_resource type="Script" path="res://src/node/gradient_editor_color_arrow.gd" id="1_awnen"] 4 | [ext_resource type="Texture2D" uid="uid://cwtuhfpnanbh8" path="res://icons/gradient-editor-color-arrow.svg" id="1_dexvh"] 5 | [ext_resource type="Shader" path="res://shaders/fill.gdshader" id="1_smwwm"] 6 | 7 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_y3k24"] 8 | 9 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_1ntfu"] 10 | shader = ExtResource("1_smwwm") 11 | shader_parameter/fill_color = Color(0.0980392, 0.0980392, 0.0980392, 1) 12 | 13 | [node name="GradientEditorColorArrow" type="Panel"] 14 | offset_left = -12.0 15 | offset_right = 12.0 16 | offset_bottom = 48.0 17 | theme_override_styles/panel = SubResource("StyleBoxEmpty_y3k24") 18 | script = ExtResource("1_awnen") 19 | 20 | [node name="Sprite2D" type="Sprite2D" parent="."] 21 | unique_name_in_owner = true 22 | material = SubResource("ShaderMaterial_1ntfu") 23 | position = Vector2(12, 32) 24 | scale = Vector2(0.05, 0.05) 25 | texture = ExtResource("1_dexvh") 26 | 27 | [node name="ColorRect" type="ColorRect" parent="."] 28 | unique_name_in_owner = true 29 | layout_mode = 0 30 | offset_left = 4.0 31 | offset_top = 30.0 32 | offset_right = 20.0 33 | offset_bottom = 46.0 34 | mouse_filter = 2 35 | 36 | [connection signal="mouse_entered" from="." to="." method="_on_mouse_entered"] 37 | [connection signal="mouse_exited" from="." to="." method="_on_mouse_exited"] 38 | -------------------------------------------------------------------------------- /godot/icons/square-plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /godot/src/layer/fill_paint_layer.gd: -------------------------------------------------------------------------------- 1 | ## 塗りつぶしレイヤーを表現するクラス。 2 | class_name FillPaintLayer 3 | extends PaintLayer 4 | 5 | 6 | ## マテリアルmissing時の表示用マテリアル。 7 | @export var missing_material: ShaderMaterial 8 | 9 | ## fillの色。 10 | var fill_material_id: String = "" 11 | 12 | 13 | ## 初期化する。 14 | func _construct() -> void: 15 | Main.on_change_material_parameters_changed.connect(func() -> void: (self as PaintLayer).need_composite = true) 16 | (self as PaintLayer).need_composite = true 17 | 18 | 19 | ## ルートから親の表示状態を更新する。 20 | func update_parent_visible(new_parent_visible: bool) -> void: 21 | parent_visible = new_parent_visible 22 | 23 | 24 | ## ルートから親のロック状態を更新する。 25 | func update_parent_locked(new_parent_locked: bool) -> void: 26 | parent_locked = new_parent_locked 27 | 28 | 29 | ## マテリアルがmissingかどうか。 30 | func is_material_missing() -> bool: 31 | var fill_material := Main.materials.get_material(fill_material_id) 32 | if fill_material == null: 33 | return true 34 | return false 35 | 36 | 37 | ## レイヤーをクリアする。 38 | func clear_layer() -> void: 39 | clipped = false 40 | visible = true 41 | parent_visible = true 42 | locked = false 43 | parent_locked = false 44 | blend_mode = BlendMode.Normal 45 | alpha = 100 46 | layer_name = "" 47 | 48 | fill_material_id = "" 49 | 50 | 51 | ## レイヤーを作成する。 52 | static func new_layer() -> FillPaintLayer: 53 | var fill_layer := FillPaintLayer.new() 54 | fill_layer._construct() 55 | fill_layer.layer_name = Main.layers.get_new_layer_name() 56 | fill_layer.fill_material_id = Main.materials.new_fill_layer_material_id 57 | return fill_layer 58 | -------------------------------------------------------------------------------- /rust/src/lib.rs: -------------------------------------------------------------------------------- 1 | use godot::engine::Engine; 2 | use godot::prelude::*; 3 | 4 | mod ppw_curve; 5 | mod ppw_path; 6 | mod ppw_polygon; 7 | mod shape_util; 8 | 9 | struct PPWPExtension; 10 | 11 | #[gdextension] 12 | unsafe impl ExtensionLibrary for PPWPExtension { 13 | fn on_level_init(level: InitLevel) { 14 | if level == InitLevel::Scene { 15 | Engine::singleton().register_singleton( 16 | StringName::from("PPWCurve"), 17 | ppw_curve::PPWCurve::new_alloc().upcast(), 18 | ); 19 | Engine::singleton().register_singleton( 20 | StringName::from("ShapeUtil"), 21 | shape_util::ShapeUtil::new_alloc().upcast(), 22 | ); 23 | } 24 | } 25 | 26 | fn on_level_deinit(level: InitLevel) { 27 | if level == InitLevel::Scene { 28 | let mut engine = Engine::singleton(); 29 | 30 | let singleton_name = StringName::from("PPWCurve"); 31 | let singleton = engine 32 | .get_singleton(singleton_name.clone()) 33 | .expect("cannot retrieve the singleton"); 34 | engine.unregister_singleton(singleton_name); 35 | singleton.free(); 36 | 37 | let singleton_name = StringName::from("ShapeUtil"); 38 | let singleton = engine 39 | .get_singleton(singleton_name.clone()) 40 | .expect("cannot retrieve the singleton"); 41 | engine.unregister_singleton(singleton_name); 42 | singleton.free(); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /godot/addons/dockable_container/dockable_panel_reference_control.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | class_name DockableReferenceControl 3 | extends Container 4 | ## Control that mimics its own visibility and rect into another Control. 5 | 6 | var reference_to: Control: 7 | get: 8 | return _reference_to 9 | set(control): 10 | if _reference_to != control: 11 | if is_instance_valid(_reference_to): 12 | _reference_to.renamed.disconnect(_on_reference_to_renamed) 13 | _reference_to.minimum_size_changed.disconnect(update_minimum_size) 14 | _reference_to = control 15 | 16 | minimum_size_changed.emit() 17 | if not is_instance_valid(_reference_to): 18 | return 19 | _reference_to.renamed.connect(_on_reference_to_renamed) 20 | _reference_to.minimum_size_changed.connect(update_minimum_size) 21 | _reference_to.visible = visible 22 | _reposition_reference() 23 | 24 | var _reference_to: Control = null 25 | 26 | 27 | func _ready() -> void: 28 | mouse_filter = MOUSE_FILTER_IGNORE 29 | set_notify_transform(true) 30 | 31 | 32 | func _notification(what: int) -> void: 33 | if what == NOTIFICATION_VISIBILITY_CHANGED and _reference_to: 34 | _reference_to.visible = visible 35 | elif what == NOTIFICATION_TRANSFORM_CHANGED and _reference_to: 36 | _reposition_reference() 37 | 38 | 39 | func _get_minimum_size() -> Vector2: 40 | return _reference_to.get_combined_minimum_size() if _reference_to else Vector2.ZERO 41 | 42 | 43 | func _reposition_reference() -> void: 44 | _reference_to.global_position = global_position 45 | _reference_to.size = size 46 | 47 | 48 | func _on_reference_to_renamed() -> void: 49 | name = _reference_to.name 50 | -------------------------------------------------------------------------------- /godot/icons/folder-plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /godot/icons/open_path.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /godot/scenes/control/control_point.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=8 format=3 uid="uid://dbiofgdsmekqi"] 2 | 3 | [ext_resource type="Script" path="res://src/control/control_point.gd" id="1_iu2b2"] 4 | [ext_resource type="Texture2D" uid="uid://cwvu8b6n6ba6b" path="res://icons/font_awesome/circle-regular.svg" id="2_6i2pg"] 5 | [ext_resource type="Shader" path="res://shaders/fill.gdshader" id="2_bxe8b"] 6 | [ext_resource type="Texture2D" uid="uid://d4dxklmx6r8is" path="res://icons/font_awesome/circle-solid.svg" id="3_qylmn"] 7 | 8 | [sub_resource type="CircleShape2D" id="CircleShape2D_mps6y"] 9 | 10 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_2yy3u"] 11 | shader = ExtResource("2_bxe8b") 12 | shader_parameter/fill_color = Color(1, 1, 1, 1) 13 | 14 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_45gnb"] 15 | shader = ExtResource("2_bxe8b") 16 | shader_parameter/fill_color = Color(0, 0, 0, 1) 17 | 18 | [node name="ControlPoint" type="Node2D"] 19 | script = ExtResource("1_iu2b2") 20 | 21 | [node name="Area2D" type="Area2D" parent="."] 22 | 23 | [node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"] 24 | shape = SubResource("CircleShape2D_mps6y") 25 | 26 | [node name="Sprite2D" type="Sprite2D" parent="."] 27 | material = SubResource("ShaderMaterial_2yy3u") 28 | scale = Vector2(0.025, 0.025) 29 | texture = ExtResource("3_qylmn") 30 | 31 | [node name="Sprite2D2" type="Sprite2D" parent="."] 32 | material = SubResource("ShaderMaterial_45gnb") 33 | scale = Vector2(0.025, 0.025) 34 | texture = ExtResource("2_6i2pg") 35 | 36 | [connection signal="mouse_entered" from="Area2D" to="." method="_on_area_2d_mouse_entered"] 37 | [connection signal="mouse_exited" from="Area2D" to="." method="_on_area_2d_mouse_exited"] 38 | -------------------------------------------------------------------------------- /godot/icons/fill-plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /godot/icons/closed_path.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /README/README-en.md: -------------------------------------------------------------------------------- 1 |

Aquamarine Painter

2 | 3 |

4 | 5 |

6 | 7 |

8 | [ja | en] 9 |

10 | 11 | ## Screenshots 12 | 13 | https://github.com/user-attachments/assets/64b61a46-360f-4107-a62b-e9491fa3b449 14 | 15 | ![screenshot](./screenshot-0.png) 16 | 17 | ![screenshot](./screenshot-1.png) 18 | 19 | ## PPW Curves 20 | 21 | This software uses a spline curve called [PPW Curves](https://www.jstage.jst.go.jp/article/transinf/E105.D/10/E105.D_2022PCP0006/_pdf). 22 | 23 | This curve passes through all the control points, and you can adjust the following parameters using the adjustment tool. 24 | 25 | | Operation | gif | 26 | | --- | --- | 27 | | Drag the control points left and right. | ![weight](./weight.gif) | 28 | | Drag the segment between the control points up and down. | ![phi](./phi.gif) | 29 | | Drag the segment between the control points left and right. | ![psi](./psi.gif) | 30 | 31 | ## Keyboard Shortcuts 32 | 33 | | Key | Function | 34 | | --- | --- | 35 | | `Ctrl` + `Z` | Undo | 36 | | `Ctrl` + `Shift` + `Z` | Redo | 37 | | `Ctrl` + `C` | Copy selected material or layer | 38 | | `Ctrl` + `V` | Paste | 39 | | `1` | Painting Tools | 40 | | `2` | Operation Tools | 41 | | `3` | Adjustment Tools | 42 | | `4` | Fit in Frame | 43 | | `5` | Reset Zoom to 100% | 44 | | `6` | Flip Horizontal | 45 | | `Space` | Temporary hiding of controllers | 46 | 47 | ## Disclaimer 48 | 49 | This app was created for personal use, and there are no plans to add features or respond to requests as an OSS project. 50 | The source code for this app is distributed under the MIT license, so if you need to, please fork it and add your own functions. 51 | 52 | ## LICENSE 53 | 54 | The source code for this application is distributed under the MIT license. 55 | 56 | This program uses MPL-2.0 licensed programs. 57 | -------------------------------------------------------------------------------- /godot/src/sub_window/document_open_window.gd: -------------------------------------------------------------------------------- 1 | class_name DocumentOpenWindow 2 | extends Window 3 | 4 | 5 | ## ドキュメントの作成が押されたときのシグナル。 6 | signal on_create_document(document_size: Vector2) 7 | 8 | @onready var _preset_menu: MenuButton = %MenuButton 9 | @onready var _width_spin_box: SpinBox = %WidthSpinBox 10 | @onready var _height_spin_box: SpinBox = %HeightSpinBox 11 | 12 | 13 | func _ready() -> void: 14 | _preset_menu.get_popup().id_pressed.connect(_on_preset) 15 | 16 | 17 | ## 表示するドキュメントサイズを変える。 18 | func set_document_size(document_size: Vector2) -> void: 19 | _width_spin_box.value = document_size.x 20 | _height_spin_box.value = document_size.y 21 | 22 | 23 | ## プリセットの選択。 24 | func _on_preset(id: int) -> void: 25 | match id: 26 | 0: 27 | _width_spin_box.value = 800 28 | _height_spin_box.value = 600 29 | 1: 30 | _width_spin_box.value = 1024 31 | _height_spin_box.value = 600 32 | 2: 33 | _width_spin_box.value = 1024 34 | _height_spin_box.value = 768 35 | 3: 36 | _width_spin_box.value = 1280 37 | _height_spin_box.value = 720 38 | 4: 39 | _width_spin_box.value = 1280 40 | _height_spin_box.value = 960 41 | 5: 42 | _width_spin_box.value = 1600 43 | _height_spin_box.value = 900 44 | 6: 45 | _width_spin_box.value = 1600 46 | _height_spin_box.value = 1200 47 | 7: 48 | _width_spin_box.value = 1920 49 | _height_spin_box.value = 1080 50 | 51 | 52 | ## 作成ボタンが押された際のコールバック。 53 | func _on_create_button_pressed() -> void: 54 | hide() 55 | on_create_document.emit(Vector2(_width_spin_box.value, _height_spin_box.value)) 56 | 57 | 58 | ## キャンセルボタンが押された際のコールバック。 59 | func _on_cancel_button_pressed() -> void: 60 | hide() 61 | 62 | 63 | ## windowのcloseがリクエストされた際のコールバック。 64 | func _on_close_requested() -> void: 65 | hide() 66 | 67 | 68 | ## サイズの縦横入れ替えのコールバック。 69 | func _on_switch_button_pressed() -> void: 70 | var prev_size := Vector2(_width_spin_box.value, _height_spin_box.value) 71 | _width_spin_box.value = prev_size.y 72 | _height_spin_box.value = prev_size.x 73 | -------------------------------------------------------------------------------- /godot/src/node/material_select_popup.gd: -------------------------------------------------------------------------------- 1 | ## マテリアル選択ポップアップのクラス。 2 | class_name MaterialSelectPopup 3 | extends Popup 4 | 5 | 6 | @onready var _container: VBoxContainer = %ListContainer 7 | @onready var _search: LineEdit = %LineEdit 8 | 9 | ## マテリアル選択時のシグナル。 10 | ## 引数はマテリアルのidの文字列。 11 | signal on_material_selected(material_id: String) 12 | 13 | ## リストアイテムのシーン。 14 | const _list_item: PackedScene = preload("res://scenes/node/material_select_popup_item.tscn") 15 | 16 | ## 検索文字列。 17 | var _search_text: String = "" 18 | 19 | 20 | ## マテリアルリストポップアップの中身を更新する。 21 | func _update_content() -> void: 22 | for child in _container.get_children(): 23 | child.queue_free() 24 | 25 | for index in Main.materials.list.size(): 26 | var item := Main.materials.list[index] 27 | 28 | if not item.name.substr(0, _search_text.length()) == _search_text: 29 | continue 30 | 31 | var node := _list_item.instantiate() as MaterialSelectPopupItem 32 | _container.add_child(node) 33 | 34 | node.set_material_name(item.name) 35 | 36 | if item.material is ColorPaintMaterial: 37 | var color_mat := item.material as ColorPaintMaterial 38 | node.set_color(color_mat.color) 39 | elif item.material is LinearGradientPaintMaterial: 40 | var linear_gradient_mat := item.material as LinearGradientPaintMaterial 41 | node.set_linear_gradient(linear_gradient_mat.gradient_texture) 42 | elif item.material is RadialGradientPaintMaterial: 43 | var radial_gradient_mat := item.material as RadialGradientPaintMaterial 44 | node.set_radial_gradient(radial_gradient_mat.gradient_texture) 45 | 46 | node.on_clicked.connect(_on_clicked_item.bind(index)) 47 | 48 | 49 | ## 表示非表示が切り替わったときに呼び出されるコールバック。 50 | func _on_visibility_changed() -> void: 51 | if visible: 52 | _search_text = "" 53 | _search.text = "" 54 | _update_content() 55 | 56 | 57 | ## アイテムがクリックされたときに呼び出されるコールバック。 58 | func _on_clicked_item(index: int) -> void: 59 | var material_id := Main.materials.list[index].id 60 | on_material_selected.emit(material_id) 61 | hide() 62 | 63 | 64 | ## 検索も列が変更されたときに呼び出されるコールバック。 65 | func _on_line_edit_text_changed(new_text: String) -> void: 66 | _search_text = new_text 67 | _update_content() 68 | -------------------------------------------------------------------------------- /godot/addons/dockable_container/samples/TestScene.gd: -------------------------------------------------------------------------------- 1 | extends VBoxContainer 2 | 3 | const SAVED_LAYOUT_PATH := "user://layout.tres" 4 | 5 | @onready var _container := $DockableContainers/DockableContainer as DockableContainer 6 | @onready var _clone_control := $HBoxContainer/ControlPrefab as ColorRect 7 | @onready var _checkbox_container := $HBoxContainer as HBoxContainer 8 | 9 | 10 | func _ready() -> void: 11 | if not OS.is_userfs_persistent(): 12 | $HBoxContainer/SaveLayoutButton.visible = false 13 | $HBoxContainer/LoadLayoutButton.visible = false 14 | 15 | var tabs := _container.get_tabs() 16 | for i in tabs.size(): 17 | var checkbox := CheckBox.new() 18 | checkbox.text = str(i) 19 | checkbox.button_pressed = not _container.is_control_hidden(tabs[i]) 20 | checkbox.toggled.connect(_on_CheckButton_toggled.bind(tabs[i])) 21 | _checkbox_container.add_child(checkbox) 22 | 23 | 24 | func _on_add_pressed() -> void: 25 | var control := _clone_control.duplicate() 26 | control.get_node("Buttons/Rename").pressed.connect( 27 | _on_control_rename_button_pressed.bind(control) 28 | ) 29 | control.get_node("Buttons/Remove").pressed.connect( 30 | _on_control_remove_button_pressed.bind(control) 31 | ) 32 | control.color = Color(randf(), randf(), randf()) 33 | control.name = "Control0" 34 | 35 | _container.add_child(control, true) 36 | await _container.sort_children 37 | _container.set_control_as_current_tab(control) 38 | 39 | 40 | func _on_save_pressed() -> void: 41 | if ResourceSaver.save(_container.layout, SAVED_LAYOUT_PATH) != OK: 42 | print("ERROR") 43 | 44 | 45 | func _on_load_pressed() -> void: 46 | var res = load(SAVED_LAYOUT_PATH) 47 | if res: 48 | _container.set_layout(res.clone()) 49 | else: 50 | print("Error") 51 | 52 | 53 | func _on_control_rename_button_pressed(control: Control) -> void: 54 | control.name = StringName(str(control.name) + " =D") 55 | 56 | 57 | func _on_control_remove_button_pressed(control: Control) -> void: 58 | control.get_parent().remove_child(control) 59 | control.queue_free() 60 | 61 | 62 | func _on_CheckButton_toggled(button_pressed: bool, tab: Control) -> void: 63 | _container.set_control_hidden(tab, not button_pressed) 64 | -------------------------------------------------------------------------------- /godot/scenes/node/gradient_editor.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=3 uid="uid://bdyvforlk3gff"] 2 | 3 | [ext_resource type="Script" path="res://src/node/gradient_editor.gd" id="1_lkn08"] 4 | [ext_resource type="Shader" path="res://shaders/linear_gradient_checker_alpha.gdshader" id="2_octm4"] 5 | 6 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_pppqu"] 7 | shader = ExtResource("2_octm4") 8 | shader_parameter/document_size = Vector2(240, 40) 9 | shader_parameter/document_scale = 1.0 10 | 11 | [node name="GradientEditor" type="VBoxContainer"] 12 | offset_right = 350.0 13 | offset_bottom = 650.0 14 | script = ExtResource("1_lkn08") 15 | 16 | [node name="Panel" type="Control" parent="."] 17 | custom_minimum_size = Vector2(0, 64) 18 | layout_mode = 2 19 | 20 | [node name="ColorRect" type="ColorRect" parent="Panel"] 21 | unique_name_in_owner = true 22 | material = SubResource("ShaderMaterial_pppqu") 23 | layout_mode = 0 24 | offset_left = 12.0 25 | offset_top = 12.0 26 | offset_right = 302.0 27 | offset_bottom = 52.0 28 | 29 | [node name="PlusButton" type="Button" parent="Panel"] 30 | layout_mode = 0 31 | offset_left = 310.0 32 | offset_top = 12.0 33 | offset_right = 350.0 34 | offset_bottom = 32.0 35 | 36 | [node name="Label" type="Label" parent="Panel/PlusButton"] 37 | layout_mode = 0 38 | offset_right = 40.0 39 | offset_bottom = 23.0 40 | text = "+" 41 | horizontal_alignment = 1 42 | 43 | [node name="MinusButton" type="Button" parent="Panel"] 44 | layout_mode = 0 45 | offset_left = 310.0 46 | offset_top = 32.0 47 | offset_right = 350.0 48 | offset_bottom = 52.0 49 | 50 | [node name="Label" type="Label" parent="Panel/MinusButton"] 51 | layout_mode = 0 52 | offset_top = -8.0 53 | offset_right = 40.0 54 | offset_bottom = 26.0 55 | theme_override_font_sizes/font_size = 24 56 | text = "-" 57 | horizontal_alignment = 1 58 | vertical_alignment = 1 59 | 60 | [node name="ColorPicker" type="ColorPicker" parent="."] 61 | unique_name_in_owner = true 62 | layout_mode = 2 63 | 64 | [connection signal="pressed" from="Panel/PlusButton" to="." method="_on_plus_button_pressed"] 65 | [connection signal="pressed" from="Panel/MinusButton" to="." method="_on_minus_button_pressed"] 66 | [connection signal="color_changed" from="ColorPicker" to="." method="_on_color_picker_color_changed"] 67 | -------------------------------------------------------------------------------- /godot/src/serialize/document_path.gd: -------------------------------------------------------------------------------- 1 | class_name DocumentPath 2 | extends Resource 3 | 4 | ## パスのブーリアンの列挙子 5 | enum Boolean { 6 | Union, 7 | Diff, 8 | Intersect, 9 | Xor, 10 | } 11 | 12 | 13 | ## パスのid。 14 | @export var id: String 15 | 16 | ## パスが表示されているかどうか。 17 | @export var visible: bool 18 | ## パスがロックされているかどうか。 19 | @export var locked: bool 20 | ## closed pathかどうか。 21 | @export var closed: bool 22 | ## パスのブーリアンの種類。 23 | @export var boolean: Boolean 24 | ## パスの名前。 25 | @export var path_name: String 26 | 27 | ## ControlPointの配列。 28 | @export var control_points: String 29 | ## weightの配列。 30 | @export var weights: String 31 | ## phiの配列。 32 | @export var phis: String 33 | ## psiの配列。 34 | @export var psis: String 35 | ## パスのポリゴン形状のPackedVector2Array。 36 | @export var polygon: String 37 | ## polygonの頂点列のPackedVector2Array。 38 | @export var vertices: String 39 | ## polygonのindicesのPackedInt32Array。 40 | @export var indices: String 41 | ## polygonのthumbnail_indicesのPackedInt32Array。 42 | @export var thumbnail_indices: Array[String] 43 | ## polygonの頂点列のPackedVector2Array。 44 | @export var line_vertices: String 45 | ## polygonのindicesのPackedInt32Array。 46 | @export var line_indices: String 47 | ## segmentsのPackedVector2Arrayの配列。 48 | @export var segments: Array[String] 49 | 50 | ## ControlPointの配列。 51 | var control_points_raw: PackedVector2Array = PackedVector2Array() 52 | ## weightの配列。 53 | var weights_raw: PackedFloat32Array = PackedFloat32Array() 54 | ## phiの配列。 55 | var phis_raw: PackedFloat32Array = PackedFloat32Array() 56 | ## psiの配列。 57 | var psis_raw: PackedFloat32Array = PackedFloat32Array() 58 | ## パスのポリゴン形状のPackedVector2Array。 59 | var polygon_raw: PackedVector2Array = PackedVector2Array() 60 | ## polygonの頂点列のPackedVector2Array。 61 | var vertices_raw: PackedVector2Array = PackedVector2Array() 62 | ## polygonのindicesのPackedInt32Array。 63 | var indices_raw: PackedInt32Array = PackedInt32Array() 64 | ## パスのサムネ用のindices 65 | var thumbnail_indices_raw: Array[PackedInt32Array] = [] 66 | ## polygonの頂点列のPackedVector2Array。 67 | var line_vertices_raw: PackedVector2Array = PackedVector2Array() 68 | ## polygonのindicesのPackedInt32Array。 69 | var line_indices_raw: PackedInt32Array = PackedInt32Array() 70 | ## segmentsのPackedVector2Arrayの配列。 71 | var segments_raw: Array[PackedVector2Array] = [] 72 | -------------------------------------------------------------------------------- /godot/src/layer/paint_layer.gd: -------------------------------------------------------------------------------- 1 | ## レイヤーを表す基底クラス。 2 | class_name PaintLayer 3 | extends Node 4 | 5 | 6 | const uuid_util = preload('res://addons/uuid/uuid.gd') 7 | 8 | ## レイヤーのID。 9 | var id: String 10 | 11 | ## 下のレイヤーでクリップされているかどうか。 12 | var clipped: bool = false 13 | 14 | ## レイヤーが表示されているかどうか。 15 | var visible: bool = true 16 | ## 親のレイヤーが表示されているかどうか。 17 | var parent_visible: bool = true 18 | 19 | ## レイヤーがロックされているかどうか。 20 | var locked: bool = false 21 | ## 親のレイヤーがロックされているかどうか。 22 | var parent_locked: bool = false 23 | 24 | 25 | ## このレイヤーのコンポジットが必要かどうか。 26 | var need_composite: bool = false 27 | ## このレイヤーの親のコンポジットが必要かどうか。 28 | var need_parent_composite: bool = false 29 | ## コンポジットをする場合にオンにするマーク。 30 | var mark_composite: bool = false 31 | 32 | ## レイヤーのブレンドモードの列挙子。 33 | enum BlendMode { 34 | Normal, 35 | Add, 36 | Multiply, 37 | Screen, 38 | Overlay, 39 | } 40 | 41 | ## レイヤーのブレンドモード。 42 | var blend_mode: BlendMode = BlendMode.Normal 43 | 44 | ## alphaの%値 45 | var alpha: int = 100 46 | 47 | ## レイヤーの名前。 48 | var layer_name: String = tr("LAYER") 49 | 50 | ## レイヤーの拡大縮小の基準の列挙子。 51 | enum ScaleAnchor { 52 | TopLeft, 53 | TopCenter, 54 | TopRight, 55 | Left, 56 | Center, 57 | Right, 58 | BottomLeft, 59 | BottomCenter, 60 | BottomRight, 61 | } 62 | 63 | 64 | func _init() -> void: 65 | id = uuid_util.v4() 66 | 67 | 68 | ## 表示状態を更新する。 69 | func update_visible(new_visible: bool) -> void: 70 | visible = new_visible 71 | need_parent_composite = true 72 | Main.layers.update_parent_visible() 73 | 74 | 75 | ## クリッピング状態を変更する。 76 | func update_clipped(new_clipped: bool) -> void: 77 | clipped = new_clipped 78 | need_parent_composite = true 79 | 80 | 81 | ## ブレンドモードを更新する。 82 | func update_blend_mode(new_blend_mode: BlendMode) -> void: 83 | blend_mode = new_blend_mode 84 | need_parent_composite = true 85 | 86 | 87 | ## アルファを更新する。 88 | func update_alpha(new_alpha: int) -> void: 89 | alpha = new_alpha 90 | need_parent_composite = true 91 | 92 | 93 | ## ロック状態を更新する。 94 | func update_locked(new_locked: bool) -> void: 95 | locked = new_locked 96 | 97 | 98 | ## ロック状態かどうかを返す。 99 | func is_locked() -> bool: 100 | if locked or parent_locked: 101 | return true 102 | return false 103 | -------------------------------------------------------------------------------- /godot/addons/dockable_container/layout_panel.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | class_name DockableLayoutPanel 3 | extends DockableLayoutNode 4 | ## DockableLayout leaf nodes, defining tabs 5 | 6 | @export var names: PackedStringArray: 7 | get: 8 | return get_names() 9 | set(value): 10 | _names = value 11 | emit_tree_changed() 12 | @export var current_tab: int: 13 | get: 14 | return int(clamp(_current_tab, 0, _names.size() - 1)) 15 | set(value): 16 | if value != _current_tab: 17 | _current_tab = value 18 | emit_tree_changed() 19 | 20 | var _names := PackedStringArray() 21 | var _current_tab := 0 22 | 23 | 24 | func _init() -> void: 25 | resource_name = "Tabs" 26 | 27 | 28 | ## Returns all tab names in this node 29 | func get_names() -> PackedStringArray: 30 | return _names 31 | 32 | 33 | func push_name(name: String) -> void: 34 | _names.append(name) 35 | emit_tree_changed() 36 | 37 | 38 | func insert_node(position: int, node: Node) -> void: 39 | _names.insert(position, node.name) 40 | emit_tree_changed() 41 | 42 | 43 | func find_name(node_name: String) -> int: 44 | for i in _names.size(): 45 | if _names[i] == node_name: 46 | return i 47 | return -1 48 | 49 | 50 | func find_child(node: Node) -> int: 51 | return find_name(node.name) 52 | 53 | 54 | func remove_node(node: Node) -> void: 55 | var i := find_child(node) 56 | if i >= 0: 57 | _names.remove_at(i) 58 | emit_tree_changed() 59 | else: 60 | push_warning("Remove failed, node '%s' was not found" % node) 61 | 62 | 63 | func rename_node(previous_name: String, new_name: String) -> void: 64 | var i := find_name(previous_name) 65 | if i >= 0: 66 | _names.set(i, new_name) 67 | emit_tree_changed() 68 | else: 69 | push_warning("Rename failed, name '%s' was not found" % previous_name) 70 | 71 | 72 | ## Returns whether there are any nodes 73 | func is_empty() -> bool: 74 | return _names.is_empty() 75 | 76 | 77 | func update_nodes(node_names: PackedStringArray, data: Dictionary) -> void: 78 | var i := 0 79 | var removed_any := false 80 | while i < _names.size(): 81 | var current := _names[i] 82 | if not current in node_names or data.has(current): 83 | _names.remove_at(i) 84 | removed_any = true 85 | else: 86 | data[current] = self 87 | i += 1 88 | if removed_any: 89 | emit_tree_changed() 90 | -------------------------------------------------------------------------------- /godot/src/material/linear_gradient_paint_material.gd: -------------------------------------------------------------------------------- 1 | ## 線形グラデーションのマテリアル。 2 | class_name LinearGradientPaintMaterial 3 | extends PaintMaterial 4 | 5 | 6 | ## グラデーション。 7 | var gradient: Gradient = Gradient.new() 8 | ## グラデーションのテクスチャ。 9 | var gradient_texture: GradientTexture1D = GradientTexture1D.new() 10 | 11 | ## グラデーションの始点。 12 | var start_point: Vector2 = Vector2(0, 0) 13 | ## グラデーションの終点。 14 | var end_point: Vector2 = Vector2(1, 0) 15 | 16 | 17 | func _init() -> void: 18 | gradient_texture.set_gradient(gradient) 19 | gradient_texture.set_width(512) 20 | 21 | gradient.colors = PackedColorArray([Color(1, 1, 1, 1), Color(1, 0, 0, 1), Color(0, 0, 0, 1)]) 22 | gradient.offsets = PackedFloat32Array([0, 0.5, 1]) 23 | 24 | var quater_size := Main.document_size / 4 25 | start_point = quater_size 26 | end_point = quater_size * 3 27 | 28 | 29 | ## ドキュメントサイズの変更を適用する。 30 | func change_document_size(new_document_size: Vector2, anchor: PaintLayer.ScaleAnchor) -> void: 31 | var prev_document_size := Main.document_size 32 | 33 | var delta_x := 0.0 34 | var delta_y := 0.0 35 | match anchor: 36 | PaintLayer.ScaleAnchor.TopLeft: 37 | pass 38 | PaintLayer.ScaleAnchor.TopCenter: 39 | delta_x = (new_document_size.x - prev_document_size.x) / 2 40 | PaintLayer.ScaleAnchor.TopRight: 41 | delta_x = new_document_size.x - prev_document_size.x 42 | PaintLayer.ScaleAnchor.Left: 43 | delta_y = (new_document_size.y - prev_document_size.y) / 2 44 | PaintLayer.ScaleAnchor.Center: 45 | delta_x = (new_document_size.x - prev_document_size.x) / 2 46 | delta_y = (new_document_size.y - prev_document_size.y) / 2 47 | PaintLayer.ScaleAnchor.Right: 48 | delta_x = new_document_size.x - prev_document_size.x 49 | delta_y = (new_document_size.y - prev_document_size.y) / 2 50 | PaintLayer.ScaleAnchor.BottomLeft: 51 | delta_y = new_document_size.y - prev_document_size.y 52 | PaintLayer.ScaleAnchor.BottomCenter: 53 | delta_x = (new_document_size.x - prev_document_size.x) / 2 54 | delta_y = new_document_size.y - prev_document_size.y 55 | PaintLayer.ScaleAnchor.BottomRight: 56 | delta_x = new_document_size.x - prev_document_size.x 57 | delta_y = new_document_size.y - prev_document_size.y 58 | 59 | start_point += Vector2(delta_x, delta_y) 60 | end_point += Vector2(delta_x, delta_y) 61 | -------------------------------------------------------------------------------- /godot/src/sub_window/config_window.gd: -------------------------------------------------------------------------------- 1 | class_name ConfigWindow 2 | extends Window 3 | 4 | 5 | @onready var _language_menu_button: MenuButton = %LanguageMenuButton 6 | @onready var _auto_save_check_box: CheckBox = %AutoSaveCheckBox 7 | @onready var _auto_save_spin_box: SpinBox = %AutoSaveSpinBox 8 | 9 | 10 | func _ready() -> void: 11 | _language_menu_button.get_popup().id_pressed.connect(_on_language_menu_button_id_pressed) 12 | 13 | ## 設定値を表示する。 14 | func show_config() -> void: 15 | var config := ConfigFile.new() 16 | 17 | var ret := config.load("user://config.cfg") 18 | if ret == OK: 19 | if config.has_section_key("auto_save", "enabled"): 20 | _auto_save_check_box.button_pressed = config.get_value("auto_save", "enabled") 21 | if config.has_section_key("auto_save", "interval"): 22 | _auto_save_spin_box.value = config.get_value("auto_save", "interval") 23 | 24 | show() 25 | 26 | 27 | ## 言語が変更されたときの処理。 28 | func _on_language_menu_button_id_pressed(id: int) -> void: 29 | var config := ConfigFile.new() 30 | config.load("user://config.cfg") 31 | match id: 32 | 0: 33 | TranslationServer.set_locale("ja") 34 | config.set_value("language", "locale", "ja") 35 | 1: 36 | TranslationServer.set_locale("en") 37 | config.set_value("language", "locale", "en") 38 | config.save("user://config.cfg") 39 | Main.emit_locale_changed() 40 | 41 | 42 | ## オートセーブのチェックボックスをトグルしたときの処理。 43 | func _on_auto_save_check_box_toggled(toggled_on: bool) -> void: 44 | var config := ConfigFile.new() 45 | 46 | config.load("user://config.cfg") 47 | config.set_value("auto_save", "enabled", toggled_on) 48 | config.save("user://config.cfg") 49 | 50 | _auto_save_check_box.button_pressed = toggled_on 51 | Main.auto_save_enabled = toggled_on 52 | 53 | 54 | ## オートセーブの間隔を変更したときの処理。 55 | func _on_auto_save_spin_box_value_changed(value: float) -> void: 56 | var config := ConfigFile.new() 57 | 58 | config.load("user://config.cfg") 59 | config.set_value("auto_save", "interval", int(value)) 60 | config.save("user://config.cfg") 61 | 62 | _auto_save_spin_box.value = int(value) 63 | Main.auto_save_interval = int(value) 64 | 65 | 66 | ## ウィンドウが閉じられるときの処理。 67 | func _on_close_requested() -> void: 68 | hide() 69 | 70 | 71 | ## 閉じるボタンが押されたときの処理。 72 | func _on_close_button_pressed() -> void: 73 | hide() 74 | -------------------------------------------------------------------------------- /godot/scenes/node/material_select_popup.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=6 format=3 uid="uid://bctakxrfgwaor"] 2 | 3 | [ext_resource type="Script" path="res://src/node/material_select_popup.gd" id="1_26x0c"] 4 | [ext_resource type="Shader" path="res://shaders/fill.gdshader" id="2_2bwdp"] 5 | [ext_resource type="Texture2D" uid="uid://bej0ujfdimntj" path="res://icons/font_awesome/magnifying-glass-solid.svg" id="3_3on70"] 6 | 7 | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_rgyto"] 8 | bg_color = Color(0.133333, 0.133333, 0.133333, 1) 9 | border_width_left = 2 10 | border_width_top = 2 11 | border_width_right = 2 12 | border_width_bottom = 2 13 | border_color = Color(0.529067, 0.529067, 0.529066, 1) 14 | 15 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_fw16f"] 16 | shader = ExtResource("2_2bwdp") 17 | shader_parameter/fill_color = Color(1, 1, 1, 1) 18 | 19 | [node name="MaterialSelectPopup" type="Popup"] 20 | size = Vector2i(240, 320) 21 | visible = true 22 | wrap_controls = false 23 | script = ExtResource("1_26x0c") 24 | 25 | [node name="PanelContainer" type="PanelContainer" parent="."] 26 | anchors_preset = 15 27 | anchor_right = 1.0 28 | anchor_bottom = 1.0 29 | grow_horizontal = 2 30 | grow_vertical = 2 31 | theme_override_styles/panel = SubResource("StyleBoxFlat_rgyto") 32 | 33 | [node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"] 34 | layout_mode = 2 35 | 36 | [node name="LineEdit" type="LineEdit" parent="PanelContainer/VBoxContainer"] 37 | unique_name_in_owner = true 38 | auto_translate_mode = 2 39 | layout_mode = 2 40 | placeholder_text = "Search..." 41 | 42 | [node name="Sprite2D" type="Sprite2D" parent="PanelContainer/VBoxContainer/LineEdit"] 43 | material = SubResource("ShaderMaterial_fw16f") 44 | position = Vector2(222, 16) 45 | scale = Vector2(0.04, 0.04) 46 | texture = ExtResource("3_3on70") 47 | 48 | [node name="ScrollContainer" type="ScrollContainer" parent="PanelContainer/VBoxContainer"] 49 | layout_mode = 2 50 | size_flags_vertical = 3 51 | 52 | [node name="ListContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/ScrollContainer"] 53 | unique_name_in_owner = true 54 | layout_mode = 2 55 | size_flags_horizontal = 3 56 | 57 | [connection signal="visibility_changed" from="." to="." method="_on_visibility_changed"] 58 | [connection signal="text_changed" from="PanelContainer/VBoxContainer/LineEdit" to="." method="_on_line_edit_text_changed"] 59 | -------------------------------------------------------------------------------- /godot/addons/dockable_container/drag_n_drop_panel.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | extends Control 3 | 4 | enum { MARGIN_LEFT, MARGIN_RIGHT, MARGIN_TOP, MARGIN_BOTTOM, MARGIN_CENTER } 5 | 6 | const DRAW_NOTHING := -1 7 | const DRAW_CENTERED := -2 8 | const MARGIN_NONE := -1 9 | 10 | var _draw_margin := DRAW_NOTHING 11 | var _should_split := false 12 | 13 | 14 | func _notification(what: int) -> void: 15 | if what == NOTIFICATION_MOUSE_EXIT: 16 | _draw_margin = DRAW_NOTHING 17 | queue_redraw() 18 | elif what == NOTIFICATION_MOUSE_ENTER and not _should_split: 19 | _draw_margin = DRAW_CENTERED 20 | queue_redraw() 21 | 22 | 23 | func _gui_input(event: InputEvent) -> void: 24 | if _should_split and event is InputEventMouseMotion: 25 | _draw_margin = _find_hover_margin(event.position) 26 | queue_redraw() 27 | 28 | 29 | func _draw() -> void: 30 | var rect: Rect2 31 | if _draw_margin == DRAW_NOTHING: 32 | return 33 | elif _draw_margin == DRAW_CENTERED: 34 | rect = Rect2(Vector2.ZERO, size) 35 | elif _draw_margin == MARGIN_LEFT: 36 | rect = Rect2(0, 0, size.x * 0.5, size.y) 37 | elif _draw_margin == MARGIN_TOP: 38 | rect = Rect2(0, 0, size.x, size.y * 0.5) 39 | elif _draw_margin == MARGIN_RIGHT: 40 | var half_width = size.x * 0.5 41 | rect = Rect2(half_width, 0, half_width, size.y) 42 | elif _draw_margin == MARGIN_BOTTOM: 43 | var half_height = size.y * 0.5 44 | rect = Rect2(0, half_height, size.x, half_height) 45 | var stylebox := get_theme_stylebox("panel", "TooltipPanel") 46 | draw_style_box(stylebox, rect) 47 | 48 | 49 | func set_enabled(enabled: bool, should_split: bool = true) -> void: 50 | visible = enabled 51 | _should_split = should_split 52 | if enabled: 53 | _draw_margin = DRAW_NOTHING 54 | queue_redraw() 55 | 56 | 57 | func get_hover_margin() -> int: 58 | return _draw_margin 59 | 60 | 61 | func _find_hover_margin(point: Vector2) -> int: 62 | var half_size := size * 0.5 63 | 64 | var left := point.distance_squared_to(Vector2(0, half_size.y)) 65 | var lesser := left 66 | var lesser_margin := MARGIN_LEFT 67 | 68 | var top := point.distance_squared_to(Vector2(half_size.x, 0)) 69 | if lesser > top: 70 | lesser = top 71 | lesser_margin = MARGIN_TOP 72 | 73 | var right := point.distance_squared_to(Vector2(size.x, half_size.y)) 74 | if lesser > right: 75 | lesser = right 76 | lesser_margin = MARGIN_RIGHT 77 | 78 | var bottom := point.distance_squared_to(Vector2(half_size.x, size.y)) 79 | if lesser > bottom: 80 | #lesser = bottom # unused result 81 | lesser_margin = MARGIN_BOTTOM 82 | return lesser_margin 83 | -------------------------------------------------------------------------------- /godot/src/node/linear_gradient_picker.gd: -------------------------------------------------------------------------------- 1 | class_name LinearGradientPicker 2 | extends Popup 3 | 4 | 5 | @onready var _start_x: SpinBox = %StartX 6 | @onready var _start_y: SpinBox = %StartY 7 | @onready var _end_x: SpinBox = %EndX 8 | @onready var _end_y: SpinBox = %EndY 9 | @onready var _gradient_editor: GradientEditor = %GradientEditor 10 | 11 | ## グラデーションが変更したときのシグナル。 12 | signal on_gradient_changed(gradient_material: LinearGradientPaintMaterial) 13 | 14 | ## 現在編集中のマテリアル。 15 | var _gradient_material: LinearGradientPaintMaterial 16 | 17 | 18 | func _ready() -> void: 19 | _gradient_editor.on_gradient_changed.connect(_on_gradient_editor_on_gradient_changed) 20 | 21 | 22 | ## ピッカーを表示する。 23 | func show_picker(gradient_material: LinearGradientPaintMaterial) -> void: 24 | _gradient_editor.set_gradient(gradient_material.gradient) 25 | _start_x.set_value_no_signal(gradient_material.start_point.x) 26 | _start_y.set_value_no_signal(gradient_material.start_point.y) 27 | _end_x.set_value_no_signal(gradient_material.end_point.x) 28 | _end_y.set_value_no_signal(gradient_material.end_point.y) 29 | _gradient_material = gradient_material 30 | show() 31 | 32 | 33 | ## グラデーションが変化したときのコールバック。 34 | func _on_gradient_editor_on_gradient_changed(gradient: Gradient) -> void: 35 | _gradient_material.gradient = gradient 36 | _gradient_material.gradient_texture.gradient = gradient 37 | on_gradient_changed.emit(_gradient_material) 38 | Main.on_change_material_parameters_changed.emit() 39 | 40 | 41 | ## ピッカーが非表示になったときに呼び出されるコールバック。 42 | func _on_popup_hide() -> void: 43 | _gradient_editor.remove_color_arrow() 44 | _gradient_material = null 45 | 46 | 47 | ## 開始点のXの値が変わったときのコールバック。 48 | func _on_start_x_value_changed(value: float) -> void: 49 | _gradient_material.start_point.x = value 50 | Main.on_change_material_parameters_changed.emit() 51 | 52 | 53 | ## 開始点のYの値が変わったときのコールバック。 54 | func _on_start_y_value_changed(value: float) -> void: 55 | _gradient_material.start_point.y = value 56 | Main.on_change_material_parameters_changed.emit() 57 | 58 | 59 | ## 終了点のXの値が変わったときのコールバック。 60 | func _on_end_x_value_changed(value: float) -> void: 61 | _gradient_material.end_point.x = value 62 | Main.on_change_material_parameters_changed.emit() 63 | 64 | 65 | ## 終了点のYの値が変わったときのコールバック。 66 | func _on_end_y_value_changed(value: float) -> void: 67 | _gradient_material.end_point.y = value 68 | Main.on_change_material_parameters_changed.emit() 69 | 70 | 71 | ## 編集ボタンが押されたときのコールバック。 72 | func _on_edit_button_pressed() -> void: 73 | Main.emit_start_edit_linear_gradient(_gradient_material) 74 | -------------------------------------------------------------------------------- /godot/src/material/radial_gradient_paint_material.gd: -------------------------------------------------------------------------------- 1 | class_name RadialGradientPaintMaterial 2 | extends PaintMaterial 3 | 4 | 5 | ## グラデーション。 6 | var gradient: Gradient = Gradient.new() 7 | ## グラデーションのテクスチャ。 8 | var gradient_texture: GradientTexture1D = GradientTexture1D.new() 9 | 10 | ## グラデーションの中心点。 11 | var center_point: Vector2 = Vector2(0, 0) 12 | ## グラデーションのハンドル1。 13 | var handle_1_point: Vector2 = Vector2(1, 0) 14 | ## グラデーションのハンドル2。 15 | var handle_2_point: Vector2 = Vector2(0, 1) 16 | 17 | 18 | func _init() -> void: 19 | gradient_texture.set_gradient(gradient) 20 | gradient_texture.set_width(512) 21 | 22 | gradient.colors = PackedColorArray([Color(1, 1, 1, 1), Color(1, 0, 0, 1), Color(0, 0, 0, 1)]) 23 | gradient.offsets = PackedFloat32Array([0, 0.5, 1]) 24 | 25 | var quater_size := Main.document_size / 4 26 | center_point = quater_size * 2 27 | handle_1_point = quater_size * 2 + Vector2(quater_size.x, 0) 28 | handle_2_point = quater_size * 2 - Vector2(0, quater_size.y) 29 | 30 | 31 | ## ドキュメントサイズの変更を適用する。 32 | func change_document_size(new_document_size: Vector2, anchor: PaintLayer.ScaleAnchor) -> void: 33 | var prev_document_size := Main.document_size 34 | 35 | var delta_x := 0.0 36 | var delta_y := 0.0 37 | match anchor: 38 | PaintLayer.ScaleAnchor.TopLeft: 39 | pass 40 | PaintLayer.ScaleAnchor.TopCenter: 41 | delta_x = (new_document_size.x - prev_document_size.x) / 2 42 | PaintLayer.ScaleAnchor.TopRight: 43 | delta_x = new_document_size.x - prev_document_size.x 44 | PaintLayer.ScaleAnchor.Left: 45 | delta_y = (new_document_size.y - prev_document_size.y) / 2 46 | PaintLayer.ScaleAnchor.Center: 47 | delta_x = (new_document_size.x - prev_document_size.x) / 2 48 | delta_y = (new_document_size.y - prev_document_size.y) / 2 49 | PaintLayer.ScaleAnchor.Right: 50 | delta_x = new_document_size.x - prev_document_size.x 51 | delta_y = (new_document_size.y - prev_document_size.y) / 2 52 | PaintLayer.ScaleAnchor.BottomLeft: 53 | delta_y = new_document_size.y - prev_document_size.y 54 | PaintLayer.ScaleAnchor.BottomCenter: 55 | delta_x = (new_document_size.x - prev_document_size.x) / 2 56 | delta_y = new_document_size.y - prev_document_size.y 57 | PaintLayer.ScaleAnchor.BottomRight: 58 | delta_x = new_document_size.x - prev_document_size.x 59 | delta_y = new_document_size.y - prev_document_size.y 60 | 61 | center_point += Vector2(delta_x, delta_y) 62 | handle_1_point += Vector2(delta_x, delta_y) 63 | handle_2_point += Vector2(delta_x, delta_y) 64 | -------------------------------------------------------------------------------- /godot/addons/dockable_container/layout_split.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | class_name DockableLayoutSplit 3 | extends DockableLayoutNode 4 | ## DockableLayout binary tree nodes, defining subtrees and leaf panels 5 | 6 | enum Direction { HORIZONTAL, VERTICAL } 7 | 8 | @export var direction := Direction.HORIZONTAL: 9 | get: 10 | return get_direction() 11 | set(value): 12 | set_direction(value) 13 | @export_range(0, 1) var percent := 0.5: 14 | get = get_percent, 15 | set = set_percent 16 | @export var first: DockableLayoutNode = DockableLayoutPanel.new(): 17 | get: 18 | return get_first() 19 | set(value): 20 | set_first(value) 21 | @export var second: DockableLayoutNode = DockableLayoutPanel.new(): 22 | get: 23 | return get_second() 24 | set(value): 25 | set_second(value) 26 | 27 | var _direction := Direction.HORIZONTAL 28 | var _percent := 0.5 29 | var _first: DockableLayoutNode 30 | var _second: DockableLayoutNode 31 | 32 | 33 | func _init() -> void: 34 | resource_name = "Split" 35 | 36 | 37 | func set_first(value: DockableLayoutNode) -> void: 38 | if value == null: 39 | _first = DockableLayoutPanel.new() 40 | else: 41 | _first = value 42 | _first.parent = self 43 | emit_tree_changed() 44 | 45 | 46 | func get_first() -> DockableLayoutNode: 47 | return _first 48 | 49 | 50 | func set_second(value: DockableLayoutNode) -> void: 51 | if value == null: 52 | _second = DockableLayoutPanel.new() 53 | else: 54 | _second = value 55 | _second.parent = self 56 | emit_tree_changed() 57 | 58 | 59 | func get_second() -> DockableLayoutNode: 60 | return _second 61 | 62 | 63 | func set_direction(value: Direction) -> void: 64 | if value != _direction: 65 | _direction = value 66 | emit_tree_changed() 67 | 68 | 69 | func get_direction() -> Direction: 70 | return _direction 71 | 72 | 73 | func set_percent(value: float) -> void: 74 | var clamped_value := clampf(value, 0, 1) 75 | if not is_equal_approx(_percent, clamped_value): 76 | _percent = clamped_value 77 | emit_tree_changed() 78 | 79 | 80 | func get_percent() -> float: 81 | return _percent 82 | 83 | 84 | func get_names() -> PackedStringArray: 85 | var names := _first.get_names() 86 | names.append_array(_second.get_names()) 87 | return names 88 | 89 | 90 | ## Returns whether there are any nodes 91 | func is_empty() -> bool: 92 | return _first.is_empty() and _second.is_empty() 93 | 94 | 95 | func is_horizontal() -> bool: 96 | return _direction == Direction.HORIZONTAL 97 | 98 | 99 | func is_vertical() -> bool: 100 | return _direction == Direction.VERTICAL 101 | -------------------------------------------------------------------------------- /godot/src/node/material_select_popup_item.gd: -------------------------------------------------------------------------------- 1 | ## マテリアル選択ポップアップのアイテムのノード。 2 | class_name MaterialSelectPopupItem 3 | extends PanelContainer 4 | 5 | 6 | @onready var _node: PanelContainer = $"." 7 | @onready var _color_panel: Panel = %Color 8 | @onready var _name_label: Label = %Label 9 | 10 | ## この要素がクリックされたときに発火するシグナル。 11 | signal on_clicked() 12 | 13 | ## マウスオーバーしているかどうか。 14 | var mouse_over: bool = false 15 | ## このマテリアルのマテリアルid。 16 | var material_id: String = "" 17 | 18 | ## マテリアルの単一色の表示マテリアル。 19 | @export var _color_material: ShaderMaterial 20 | ## マテリアルの線形グラデーションの表示マテリアル。 21 | @export var _linear_gradient_material: ShaderMaterial 22 | ## マテリアルの放射グラデーションの表示マテリアル。 23 | @export var _radial_gradient_material: ShaderMaterial 24 | 25 | 26 | func _ready() -> void: 27 | _node.add_theme_stylebox_override("panel", _node.get_theme_stylebox("panel").duplicate() as StyleBox) 28 | 29 | 30 | func _input(event: InputEvent) -> void: 31 | if event is InputEventMouseButton: 32 | var mouse_event := event as InputEventMouseButton 33 | var node_mouse_position := _node.get_local_mouse_position() 34 | var rect := Rect2(Vector2.ZERO, _node.size) 35 | if rect.has_point(node_mouse_position) and mouse_event.button_index == MOUSE_BUTTON_LEFT and mouse_event.pressed: 36 | on_clicked.emit() 37 | 38 | 39 | ## マテリアルの色を設定する。 40 | func set_color(color: Color) -> void: 41 | var mat := _color_material.duplicate() as ShaderMaterial 42 | mat.set_shader_parameter("fill_color", color) 43 | _color_panel.material = mat 44 | 45 | 46 | ## マテリアルの線形グラデーションを設定する。 47 | func set_linear_gradient(gradient_texture: GradientTexture1D) -> void: 48 | var mat := _linear_gradient_material.duplicate() as ShaderMaterial 49 | mat.set_shader_parameter("gradient_texture", gradient_texture) 50 | _color_panel.material = mat 51 | 52 | 53 | ## マテリアルの放射グラデーションを設定する。 54 | func set_radial_gradient(gradient_texture: GradientTexture1D) -> void: 55 | var mat := _radial_gradient_material.duplicate() as ShaderMaterial 56 | mat.set_shader_parameter("gradient_texture", gradient_texture) 57 | _color_panel.material = mat 58 | 59 | 60 | ## マテリアルの名前を設定する。 61 | func set_material_name(new_name: String) -> void: 62 | _name_label.text = new_name 63 | 64 | 65 | ## マウスオーバーしたときに呼び出されるコールバック。 66 | func _on_mouse_entered() -> void: 67 | mouse_over = true 68 | var style_box := _node.get_theme_stylebox("panel") as StyleBoxFlat 69 | style_box.bg_color = Color(0.5, 0.8, 0.9, 0.25) 70 | 71 | 72 | ## マウスが外れたときに呼び出されるコールバック。 73 | func _on_mouse_exited() -> void: 74 | mouse_over = false 75 | var style_box := _node.get_theme_stylebox("panel") as StyleBoxFlat 76 | style_box.bg_color = Color.TRANSPARENT 77 | -------------------------------------------------------------------------------- /godot/export_presets.cfg: -------------------------------------------------------------------------------- 1 | [preset.0] 2 | 3 | name="Windows Desktop" 4 | platform="Windows Desktop" 5 | runnable=true 6 | advanced_options=false 7 | dedicated_server=false 8 | custom_features="" 9 | export_filter="all_resources" 10 | include_filter="" 11 | exclude_filter="" 12 | export_path="../build/AquamarinePainter.exe" 13 | encryption_include_filters="" 14 | encryption_exclude_filters="" 15 | encrypt_pck=false 16 | encrypt_directory=false 17 | script_export_mode=2 18 | 19 | [preset.0.options] 20 | 21 | custom_template/debug="" 22 | custom_template/release="" 23 | debug/export_console_wrapper=0 24 | binary_format/embed_pck=true 25 | texture_format/s3tc_bptc=true 26 | texture_format/etc2_astc=false 27 | binary_format/architecture="x86_64" 28 | codesign/enable=false 29 | codesign/timestamp=true 30 | codesign/timestamp_server_url="" 31 | codesign/digest_algorithm=1 32 | codesign/description="" 33 | codesign/custom_options=PackedStringArray() 34 | application/modify_resources=true 35 | application/icon="res://icon.svg" 36 | application/console_wrapper_icon="" 37 | application/icon_interpolation=4 38 | application/file_version="" 39 | application/product_version="" 40 | application/company_name="Aquamarine Painter" 41 | application/product_name="Aquamarine Painter" 42 | application/file_description="Aquamarine Painter" 43 | application/copyright="©2024 ORITO Itsuki" 44 | application/trademarks="" 45 | application/export_angle=0 46 | application/export_d3d12=0 47 | application/d3d12_agility_sdk_multiarch=true 48 | ssh_remote_deploy/enabled=false 49 | ssh_remote_deploy/host="user@host_ip" 50 | ssh_remote_deploy/port="22" 51 | ssh_remote_deploy/extra_args_ssh="" 52 | ssh_remote_deploy/extra_args_scp="" 53 | ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}' 54 | $action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}' 55 | $trigger = New-ScheduledTaskTrigger -Once -At 00:00 56 | $settings = New-ScheduledTaskSettingsSet 57 | $task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings 58 | Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true 59 | Start-ScheduledTask -TaskName godot_remote_debug 60 | while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 } 61 | Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue" 62 | ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue 63 | Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue 64 | Remove-Item -Recurse -Force '{temp_dir}'" 65 | -------------------------------------------------------------------------------- /godot/shaders/composite/fill_composite.glsl: -------------------------------------------------------------------------------- 1 | #[compute] 2 | #version 460 3 | 4 | layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; 5 | 6 | layout(rgba8, set = 0, binding = 0) uniform image2D store_image; 7 | layout(set = 1, binding = 0) uniform sampler2D gradientTexture; 8 | 9 | layout(push_constant, std430) uniform PushConstants { 10 | int width; 11 | int height; 12 | int materialType; 13 | int r8; 14 | int g8; 15 | int b8; 16 | int a8; 17 | int padding1; 18 | vec2 pos0; 19 | vec2 pos1; 20 | vec2 pos2; 21 | int padding2[2]; 22 | } pushConstants; 23 | 24 | vec4 getColor() { 25 | vec4 color; 26 | if (pushConstants.materialType == 0) { 27 | color.r = float(pushConstants.r8) / 255.0; 28 | color.g = float(pushConstants.g8) / 255.0; 29 | color.b = float(pushConstants.b8) / 255.0; 30 | color.a = float(pushConstants.a8) / 255.0; 31 | } else if (pushConstants.materialType == 1) { 32 | vec2 v = pushConstants.pos1 - pushConstants.pos0; 33 | vec2 uv = vec2(gl_GlobalInvocationID.xy); 34 | float t = dot(uv - pushConstants.pos0, v) / dot(v, v); 35 | color = texture(gradientTexture, vec2(t, 0.5)); 36 | } else if (pushConstants.materialType == 2) { 37 | vec2 a = pushConstants.pos1 - pushConstants.pos0; 38 | vec2 b = pushConstants.pos2 - pushConstants.pos0; 39 | float aLength = length(a); 40 | float bLength = length(b); 41 | vec2 aNorm = a / aLength; 42 | vec2 bNorm = b / bLength; 43 | if (aLength < 0.0001 || bLength < 0.0001) { 44 | color = texture(gradientTexture, vec2(1.0, 0.5)); 45 | } else { 46 | vec2 uv = vec2(gl_GlobalInvocationID.xy); 47 | vec2 p = uv - pushConstants.pos0; 48 | vec2 pp = dot(p, aNorm) * aNorm + dot(p, bNorm) * bNorm / bLength * aLength; 49 | float t = length(pp) / aLength; 50 | color = texture(gradientTexture, vec2(t, 0.5)); 51 | } 52 | } else if (pushConstants.materialType == 3) { 53 | vec2 checker_count = vec2(pushConstants.width, pushConstants.height) / 48.0; 54 | vec2 uv = vec2(gl_GlobalInvocationID.xy) / vec2(pushConstants.width, pushConstants.height); 55 | float checker = mod(dot(vec2(1.0), step(vec2(0.5), fract(uv * checker_count))), 2.0); 56 | color.rgb = mix(vec3(1.0, 0.0, 1.0), vec3(0.0, 1.0, 1.0), checker); 57 | color.a = 1.0; 58 | } 59 | return color; 60 | } 61 | 62 | void main() { 63 | ivec2 size = ivec2(pushConstants.width, pushConstants.height); 64 | ivec2 iuv = ivec2(gl_GlobalInvocationID.xy); 65 | 66 | if (iuv.x >= size.x || iuv.y >= size.y) { 67 | return; 68 | } 69 | 70 | vec2 uv = (vec2(iuv) + vec2(0.5)) / vec2(size); 71 | 72 | vec4 color = getColor(); 73 | 74 | imageStore(store_image, iuv, color); 75 | } 76 | -------------------------------------------------------------------------------- /godot/shaders/composite/group_composite.glsl: -------------------------------------------------------------------------------- 1 | #[compute] 2 | #version 460 3 | 4 | layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; 5 | 6 | layout(rgba8, set = 0, binding = 0) uniform image2D base_image; 7 | layout(rgba8, set = 1, binding = 0) uniform readonly image2D foreground_image; 8 | layout(rgba8, set = 2, binding = 0) uniform readonly image2D clipping_image; 9 | 10 | layout(push_constant, std430) uniform PushConstants { 11 | int blendMode; 12 | int clipping; 13 | int width; 14 | int height; 15 | int alpha; 16 | int clippingAlpha; 17 | int mirror; 18 | } pushConstants; 19 | 20 | void main() { 21 | ivec2 size = ivec2(pushConstants.width, pushConstants.height); 22 | ivec2 uv = ivec2(gl_GlobalInvocationID.xy); 23 | 24 | if (uv.x >= size.x || uv.y >= size.y) { 25 | return; 26 | } 27 | 28 | vec4 base = imageLoad(base_image, uv); 29 | 30 | if (pushConstants.mirror == 1) { 31 | uv.x = size.x - uv.x - 1; 32 | } 33 | 34 | vec4 foreground = imageLoad(foreground_image, uv); 35 | vec4 clipping = imageLoad(clipping_image, uv); 36 | 37 | foreground.a *= float(pushConstants.alpha) / 100.0; 38 | clipping.a *= float(pushConstants.clippingAlpha) / 100.0; 39 | if (pushConstants.clipping == 1) { 40 | foreground.a *= clipping.a; 41 | } 42 | 43 | // Porter Dugg, Source Over 44 | float f_b = 1 - foreground.a; 45 | float f_f = 1; 46 | 47 | 48 | vec4 color; 49 | color.a = base.a * f_b + foreground.a * f_f; 50 | 51 | vec3 blendColor; 52 | 53 | switch (pushConstants.blendMode) { 54 | case 0: // Normal 55 | blendColor = foreground.rgb; 56 | break; 57 | case 1: // Add 58 | blendColor =min(vec3(1), base.rgb + foreground.rgb); 59 | break; 60 | case 2: // Multiply 61 | blendColor = base.rgb * foreground.rgb; 62 | break; 63 | case 3: // Screen 64 | blendColor = 1 - (1 - base.rgb) * (1 - foreground.rgb); 65 | break; 66 | case 4: // Overlay 67 | if (base.a < 0.5) { 68 | blendColor = 2 * base.rgb * foreground.rgb; 69 | } else { 70 | blendColor = 1 - 2 * (1 - base.rgb) * (1 - foreground.rgb); 71 | } 72 | break; 73 | } 74 | 75 | vec3 color_prime = blendColor * base.a + foreground.rgb * (1 - base.a); 76 | color.rgb = (base.rgb * f_b * base.a + color_prime * f_f * foreground.a) / color.a; 77 | 78 | if (pushConstants.clipping == 0) { 79 | if (color.a == 0.0) { 80 | color.rgb = vec3(0.0); 81 | } 82 | } else { 83 | if (color.a == 0.0) { 84 | return; 85 | } 86 | } 87 | 88 | 89 | if (pushConstants.mirror == 1) { 90 | uv.x = size.x - uv.x - 1; 91 | } 92 | 93 | imageStore(base_image, uv, color); 94 | } 95 | -------------------------------------------------------------------------------- /godot/addons/dockable_container/inspector_plugin/layout_editor_property.gd: -------------------------------------------------------------------------------- 1 | extends EditorProperty 2 | 3 | var _container := DockableContainer.new() 4 | var _hidden_menu_button := MenuButton.new() 5 | var _hidden_menu_popup: PopupMenu 6 | var _hidden_menu_list: PackedStringArray 7 | 8 | 9 | func _ready() -> void: 10 | custom_minimum_size = Vector2(128, 256) 11 | 12 | _hidden_menu_button.text = "Visible nodes" 13 | add_child(_hidden_menu_button) 14 | _hidden_menu_popup = _hidden_menu_button.get_popup() 15 | _hidden_menu_popup.hide_on_checkable_item_selection = false 16 | _hidden_menu_popup.about_to_popup.connect(_on_hidden_menu_popup_about_to_show) 17 | _hidden_menu_popup.id_pressed.connect(_on_hidden_menu_popup_id_pressed) 18 | 19 | _container.clone_layout_on_ready = false 20 | _container.custom_minimum_size = custom_minimum_size 21 | 22 | var value := _get_layout().clone() # The layout gets reset when selecting it without clone 23 | for n in value.get_names(): 24 | var child := _create_child_control(n) 25 | _container.add_child(child) 26 | _container.set(get_edited_property(), value) 27 | add_child(_container) 28 | set_bottom_editor(_container) 29 | 30 | 31 | func _exit_tree() -> void: # Not sure if this is needed, but just to be sure 32 | queue_free() 33 | 34 | 35 | func _update_property() -> void: 36 | var value := _get_layout() 37 | _container.set(get_edited_property(), value) 38 | 39 | 40 | func _get_layout() -> DockableLayout: 41 | var original_container := get_edited_object() as DockableContainer 42 | return original_container.get(get_edited_property()) 43 | 44 | 45 | func _create_child_control(named: String) -> Label: 46 | var new_control := Label.new() 47 | new_control.name = named 48 | new_control.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER 49 | new_control.vertical_alignment = VERTICAL_ALIGNMENT_CENTER 50 | new_control.clip_text = true 51 | new_control.text = named 52 | return new_control 53 | 54 | 55 | func _on_hidden_menu_popup_about_to_show() -> void: 56 | var layout := _get_layout().clone() 57 | _hidden_menu_popup.clear() 58 | _hidden_menu_list = layout.get_names() 59 | for i in _hidden_menu_list.size(): 60 | var tab_name := _hidden_menu_list[i] 61 | _hidden_menu_popup.add_check_item(tab_name, i) 62 | _hidden_menu_popup.set_item_checked(i, not layout.is_tab_hidden(tab_name)) 63 | 64 | 65 | func _on_hidden_menu_popup_id_pressed(id: int) -> void: 66 | var layout := _get_layout().clone() 67 | var tab_name := _hidden_menu_list[id] 68 | var new_hidden := not layout.is_tab_hidden(tab_name) 69 | _get_layout().set_tab_hidden(tab_name, new_hidden) 70 | _hidden_menu_popup.set_item_checked(id, not new_hidden) 71 | emit_changed(get_edited_property(), _get_layout()) # This line may not be needed 72 | -------------------------------------------------------------------------------- /godot/src/layer/group_paint_layer.gd: -------------------------------------------------------------------------------- 1 | ## レイヤーグループのレイヤーを表現するクラス。 2 | class_name GroupPaintLayer 3 | extends PaintLayer 4 | 5 | 6 | ## 折りたたまれているか。 7 | var collapsed: bool = false 8 | 9 | ## このグループレイヤーの子要素のレイヤー 10 | var child_layers: Array[PaintLayer] = [] 11 | 12 | 13 | ## 初期化する。 14 | func _construct() -> void: 15 | (self as PaintLayer).need_composite = true 16 | 17 | 18 | ## ルートから親の表示状態を更新する。 19 | func update_parent_visible(new_parent_visible: bool) -> void: 20 | parent_visible = new_parent_visible 21 | 22 | var child_visible := visible and parent_visible 23 | for child_layer in child_layers: 24 | if child_layer is PathPaintLayer: 25 | var path_layer := child_layer as PathPaintLayer 26 | path_layer.update_parent_visible(child_visible) 27 | elif child_layer is FillPaintLayer: 28 | var fill_layer := child_layer as FillPaintLayer 29 | fill_layer.update_parent_visible(child_visible) 30 | elif child_layer is GroupPaintLayer: 31 | var group_layer := child_layer as GroupPaintLayer 32 | group_layer.update_parent_visible(child_visible) 33 | 34 | 35 | ## ルートから親のロック状態を更新する。 36 | func update_parent_locked(new_parent_locked: bool) -> void: 37 | parent_locked = new_parent_locked 38 | 39 | var child_locked := locked or parent_locked 40 | for child_layer in child_layers: 41 | if child_layer is PathPaintLayer: 42 | var path_layer := child_layer as PathPaintLayer 43 | path_layer.update_parent_locked(child_locked) 44 | elif child_layer is FillPaintLayer: 45 | var fill_layer := child_layer as FillPaintLayer 46 | fill_layer.update_parent_locked(child_locked) 47 | elif child_layer is GroupPaintLayer: 48 | var group_layer := child_layer as GroupPaintLayer 49 | group_layer.update_parent_locked(child_locked) 50 | 51 | 52 | ## ドキュメントサイズの変更を適用する。 53 | func change_document_size(new_document_size: Vector2, _anchor: PaintLayer.ScaleAnchor) -> void: 54 | for layer in child_layers: 55 | if layer is PathPaintLayer: 56 | var path_layer := layer as PathPaintLayer 57 | path_layer.change_document_size(new_document_size, _anchor) 58 | elif layer is GroupPaintLayer: 59 | var group_layer := layer as GroupPaintLayer 60 | group_layer.change_document_size(new_document_size, _anchor) 61 | 62 | 63 | ## レイヤーをクリアする。 64 | func clear_layer() -> void: 65 | clipped = false 66 | visible = true 67 | parent_visible = true 68 | locked = false 69 | parent_locked = false 70 | blend_mode = BlendMode.Normal 71 | alpha = 100 72 | layer_name = "" 73 | 74 | collapsed = false 75 | child_layers = [] 76 | 77 | 78 | ## レイヤーを作成する。 79 | static func new_layer() -> GroupPaintLayer: 80 | var group_layer := GroupPaintLayer.new() 81 | group_layer._construct() 82 | group_layer.layer_name = Main.layers.get_new_layer_name() 83 | return group_layer 84 | -------------------------------------------------------------------------------- /godot/src/pool/paint_layer_pool.gd: -------------------------------------------------------------------------------- 1 | class_name PaintLayerPool 2 | extends RefCounted 3 | 4 | 5 | const uuid_util = preload('res://addons/uuid/uuid.gd') 6 | 7 | ## PathPaintLayerのプール 8 | var _path_layer_pool: Array[PathPaintLayer] = [] 9 | ## FillPaintLayerのプール 10 | var _fill_layer_pool: Array[FillPaintLayer] = [] 11 | ## GroupPaintLayerのプール 12 | var _group_layer_pool: Array[GroupPaintLayer] = [] 13 | 14 | 15 | ## PathPaintLayerを取得する。 16 | func get_path_layer(new_layer_name: bool = true) -> PathPaintLayer: 17 | if _path_layer_pool.size() > 1: 18 | var path_layer: PathPaintLayer = _path_layer_pool.pop_back() 19 | path_layer.fill_material_id = Main.materials.new_path_layer_fill_material_id 20 | path_layer.outline_material_id = Main.materials.new_path_layer_line_material_id 21 | if new_layer_name: 22 | path_layer.layer_name = Main.layers.get_new_layer_name() 23 | path_layer.id = uuid_util.v4() 24 | return path_layer 25 | return PathPaintLayer.new_layer() 26 | 27 | 28 | ## FillPaintLayerを取得する。 29 | func get_fill_layer(new_layer_name: bool = true) -> FillPaintLayer: 30 | if _fill_layer_pool.size() > 1: 31 | var fill_layer: FillPaintLayer = _fill_layer_pool.pop_back() 32 | fill_layer.fill_material_id = Main.materials.new_fill_layer_material_id 33 | if new_layer_name: 34 | fill_layer.layer_name = Main.layers.get_new_layer_name() 35 | fill_layer.id = uuid_util.v4() 36 | return fill_layer 37 | return FillPaintLayer.new_layer() 38 | 39 | 40 | ## GroupPaintLayerを取得する。 41 | func get_group_layer(new_layer_name: bool = true) -> GroupPaintLayer: 42 | if _group_layer_pool.size() > 1: 43 | var group_layer: GroupPaintLayer = _group_layer_pool.pop_back() 44 | if new_layer_name: 45 | group_layer.layer_name = Main.layers.get_new_layer_name() 46 | group_layer.id = uuid_util.v4() 47 | return group_layer 48 | return GroupPaintLayer.new_layer() 49 | 50 | 51 | ## レイヤーをプールに返却する。 52 | func free_layer(layer: PaintLayer) -> void: 53 | if layer is PathPaintLayer: 54 | var path_layer := layer as PathPaintLayer 55 | path_layer.clear_layer() 56 | _path_layer_pool.push_back(path_layer) 57 | elif layer is FillPaintLayer: 58 | var fill_layer := layer as FillPaintLayer 59 | fill_layer.clear_layer() 60 | _fill_layer_pool.push_back(fill_layer) 61 | elif layer is GroupPaintLayer: 62 | var group_layer := layer as GroupPaintLayer 63 | for l in group_layer.child_layers: 64 | var already_free := false 65 | if l is PathPaintLayer: 66 | already_free = already_free or l in _path_layer_pool 67 | if l is FillPaintLayer: 68 | already_free = already_free or l in _fill_layer_pool 69 | if l is GroupPaintLayer: 70 | already_free = already_free or l in _group_layer_pool 71 | if not already_free: 72 | free_layer(l) 73 | group_layer.clear_layer() 74 | _group_layer_pool.push_back(group_layer) 75 | 76 | 77 | ## プールをクリアする。 78 | func clear() -> void: 79 | _path_layer_pool.clear() 80 | _fill_layer_pool.clear() 81 | _group_layer_pool.clear() 82 | -------------------------------------------------------------------------------- /godot/scenes/control/control_linear_gradient.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=8 format=3 uid="uid://be2jf3flgfqum"] 2 | 3 | [ext_resource type="Shader" path="res://shaders/fill.gdshader" id="1_hlr76"] 4 | [ext_resource type="Script" path="res://src/control/control_linear_gradient.gd" id="1_tmiqw"] 5 | [ext_resource type="Texture2D" uid="uid://d4dxklmx6r8is" path="res://icons/font_awesome/circle-solid.svg" id="2_qxkbt"] 6 | [ext_resource type="Texture2D" uid="uid://cwvu8b6n6ba6b" path="res://icons/font_awesome/circle-regular.svg" id="3_itlt2"] 7 | 8 | [sub_resource type="CircleShape2D" id="CircleShape2D_vx16l"] 9 | 10 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_r8oe2"] 11 | shader = ExtResource("1_hlr76") 12 | shader_parameter/fill_color = Color(1, 1, 1, 1) 13 | 14 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_i3wlg"] 15 | shader = ExtResource("1_hlr76") 16 | shader_parameter/fill_color = Color(0, 0, 0, 1) 17 | 18 | [node name="ControlLinearGradient" type="Node2D"] 19 | script = ExtResource("1_tmiqw") 20 | 21 | [node name="Line2D" type="Line2D" parent="."] 22 | unique_name_in_owner = true 23 | points = PackedVector2Array(0, 0, 100, 0) 24 | width = 5.0 25 | default_color = Color(1, 1, 1, 0.501961) 26 | 27 | [node name="StartPoint" type="Node2D" parent="."] 28 | unique_name_in_owner = true 29 | 30 | [node name="StartArea2D" type="Area2D" parent="StartPoint"] 31 | 32 | [node name="CollisionShape2D" type="CollisionShape2D" parent="StartPoint/StartArea2D"] 33 | shape = SubResource("CircleShape2D_vx16l") 34 | 35 | [node name="StartSprite2D" type="Sprite2D" parent="StartPoint"] 36 | unique_name_in_owner = true 37 | material = SubResource("ShaderMaterial_r8oe2") 38 | scale = Vector2(0.025, 0.025) 39 | texture = ExtResource("2_qxkbt") 40 | 41 | [node name="StartSprite2D2" type="Sprite2D" parent="StartPoint"] 42 | unique_name_in_owner = true 43 | material = SubResource("ShaderMaterial_i3wlg") 44 | scale = Vector2(0.025, 0.025) 45 | texture = ExtResource("3_itlt2") 46 | 47 | [node name="EndPoint" type="Node2D" parent="."] 48 | unique_name_in_owner = true 49 | position = Vector2(100, 0) 50 | 51 | [node name="EndArea2D" type="Area2D" parent="EndPoint"] 52 | 53 | [node name="CollisionShape2D" type="CollisionShape2D" parent="EndPoint/EndArea2D"] 54 | shape = SubResource("CircleShape2D_vx16l") 55 | 56 | [node name="EndSprite2D" type="Sprite2D" parent="EndPoint"] 57 | unique_name_in_owner = true 58 | material = SubResource("ShaderMaterial_r8oe2") 59 | scale = Vector2(0.025, 0.025) 60 | texture = ExtResource("2_qxkbt") 61 | 62 | [node name="EndSprite2D2" type="Sprite2D" parent="EndPoint"] 63 | unique_name_in_owner = true 64 | material = SubResource("ShaderMaterial_i3wlg") 65 | scale = Vector2(0.025, 0.025) 66 | texture = ExtResource("3_itlt2") 67 | 68 | [connection signal="mouse_entered" from="StartPoint/StartArea2D" to="." method="_on_start_area_2d_mouse_entered"] 69 | [connection signal="mouse_exited" from="StartPoint/StartArea2D" to="." method="_on_start_area_2d_mouse_exited"] 70 | [connection signal="mouse_entered" from="EndPoint/EndArea2D" to="." method="_on_end_area_2d_mouse_entered"] 71 | [connection signal="mouse_exited" from="EndPoint/EndArea2D" to="." method="_on_end_area_2d_mouse_exited"] 72 | -------------------------------------------------------------------------------- /godot/addons/dockable_container/dockable_panel.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | extends TabContainer 3 | 4 | signal tab_layout_changed(tab) 5 | 6 | var leaf: DockableLayoutPanel: 7 | get: 8 | return get_leaf() 9 | set(value): 10 | set_leaf(value) 11 | var show_tabs := true: 12 | get: 13 | return _show_tabs 14 | set(value): 15 | _show_tabs = value 16 | _handle_tab_visibility() 17 | var hide_single_tab := false: 18 | get: 19 | return _hide_single_tab 20 | set(value): 21 | _hide_single_tab = value 22 | _handle_tab_visibility() 23 | 24 | var _leaf: DockableLayoutPanel 25 | var _show_tabs := true 26 | var _hide_single_tab := false 27 | 28 | 29 | func _ready() -> void: 30 | drag_to_rearrange_enabled = true 31 | 32 | 33 | func _enter_tree() -> void: 34 | active_tab_rearranged.connect(_on_tab_changed) 35 | tab_selected.connect(_on_tab_selected) 36 | tab_changed.connect(_on_tab_changed) 37 | 38 | 39 | func _exit_tree() -> void: 40 | active_tab_rearranged.disconnect(_on_tab_changed) 41 | tab_selected.disconnect(_on_tab_selected) 42 | tab_changed.disconnect(_on_tab_changed) 43 | 44 | 45 | func track_nodes(nodes: Array[Control], new_leaf: DockableLayoutPanel) -> void: 46 | _leaf = null # avoid using previous leaf in tab_changed signals 47 | var min_size := mini(nodes.size(), get_child_count()) 48 | # remove spare children 49 | for i in range(min_size, get_child_count()): 50 | var child := get_child(min_size) as DockableReferenceControl 51 | child.reference_to = null 52 | remove_child(child) 53 | child.queue_free() 54 | # add missing children 55 | for i in range(min_size, nodes.size()): 56 | var ref_control := DockableReferenceControl.new() 57 | add_child(ref_control) 58 | assert(nodes.size() == get_child_count(), "FIXME") 59 | # setup children 60 | for i in nodes.size(): 61 | var ref_control := get_child(i) as DockableReferenceControl 62 | ref_control.reference_to = nodes[i] 63 | set_tab_title(i, nodes[i].name) 64 | set_leaf(new_leaf) 65 | _handle_tab_visibility() 66 | 67 | 68 | func get_child_rect() -> Rect2: 69 | var control := get_current_tab_control() 70 | return Rect2(position + control.position, control.size) 71 | 72 | 73 | func set_leaf(value: DockableLayoutPanel) -> void: 74 | if get_tab_count() > 0 and value: 75 | current_tab = clampi(value.current_tab, 0, get_tab_count() - 1) 76 | _leaf = value 77 | 78 | 79 | func get_leaf() -> DockableLayoutPanel: 80 | return _leaf 81 | 82 | 83 | func get_layout_minimum_size() -> Vector2: 84 | return get_combined_minimum_size() 85 | 86 | 87 | func _on_tab_selected(tab: int) -> void: 88 | if _leaf: 89 | _leaf.current_tab = tab 90 | 91 | 92 | func _on_tab_changed(tab: int) -> void: 93 | if not _leaf: 94 | return 95 | var control := get_tab_control(tab) 96 | if not control: 97 | return 98 | var tab_name := control.name 99 | var name_index_in_leaf := _leaf.find_name(tab_name) 100 | if name_index_in_leaf != tab: # NOTE: this handles added tabs (index == -1) 101 | tab_layout_changed.emit(tab) 102 | 103 | 104 | func _handle_tab_visibility() -> void: 105 | if _hide_single_tab and get_tab_count() == 1: 106 | tabs_visible = false 107 | else: 108 | tabs_visible = _show_tabs 109 | -------------------------------------------------------------------------------- /godot/scenes/sub_window/config_window.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=3 uid="uid://dd4oq7jxlensx"] 2 | 3 | [ext_resource type="Script" path="res://src/sub_window/config_window.gd" id="1_p462n"] 4 | 5 | [node name="ConfigWindow" type="Window"] 6 | title = "CONFIG_TITLE" 7 | initial_position = 2 8 | size = Vector2i(420, 160) 9 | transient = true 10 | unresizable = true 11 | popup_window = true 12 | script = ExtResource("1_p462n") 13 | 14 | [node name="VBoxContainer" type="VBoxContainer" parent="."] 15 | anchors_preset = 15 16 | anchor_right = 1.0 17 | anchor_bottom = 1.0 18 | grow_horizontal = 2 19 | grow_vertical = 2 20 | size_flags_horizontal = 3 21 | size_flags_vertical = 3 22 | theme_override_constants/separation = 12 23 | alignment = 1 24 | 25 | [node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer"] 26 | layout_mode = 2 27 | size_flags_horizontal = 4 28 | alignment = 1 29 | 30 | [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/VBoxContainer"] 31 | layout_mode = 2 32 | 33 | [node name="Label" type="Label" parent="VBoxContainer/VBoxContainer/HBoxContainer"] 34 | layout_mode = 2 35 | text = "CONFIG_LANGUAGE" 36 | 37 | [node name="LanguageMenuButton" type="MenuButton" parent="VBoxContainer/VBoxContainer/HBoxContainer"] 38 | unique_name_in_owner = true 39 | layout_mode = 2 40 | text = "CONFIG_CURRENT_LANGUAGE" 41 | flat = false 42 | item_count = 2 43 | popup/item_0/text = "日本語" 44 | popup/item_1/text = "English" 45 | popup/item_1/id = 1 46 | 47 | [node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/VBoxContainer"] 48 | layout_mode = 2 49 | 50 | [node name="Label" type="Label" parent="VBoxContainer/VBoxContainer/HBoxContainer3"] 51 | layout_mode = 2 52 | text = "CONFIG_ENABLE_AUTO_SAVE" 53 | 54 | [node name="AutoSaveCheckBox" type="CheckBox" parent="VBoxContainer/VBoxContainer/HBoxContainer3"] 55 | unique_name_in_owner = true 56 | layout_mode = 2 57 | 58 | [node name="HBoxContainer4" type="HBoxContainer" parent="VBoxContainer/VBoxContainer"] 59 | layout_mode = 2 60 | 61 | [node name="Label" type="Label" parent="VBoxContainer/VBoxContainer/HBoxContainer4"] 62 | layout_mode = 2 63 | text = "CONFIG_AUTO_SAVE_INTERVAL" 64 | 65 | [node name="AutoSaveSpinBox" type="SpinBox" parent="VBoxContainer/VBoxContainer/HBoxContainer4"] 66 | unique_name_in_owner = true 67 | layout_mode = 2 68 | min_value = 1.0 69 | max_value = 3600.0 70 | value = 300.0 71 | 72 | [node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"] 73 | layout_mode = 2 74 | alignment = 2 75 | 76 | [node name="CloseButton" type="Button" parent="VBoxContainer/HBoxContainer2"] 77 | layout_mode = 2 78 | text = "CONFIG_CLOSE" 79 | 80 | [node name="Space" type="Control" parent="VBoxContainer/HBoxContainer2"] 81 | custom_minimum_size = Vector2(24, 0) 82 | layout_mode = 2 83 | 84 | [connection signal="close_requested" from="." to="." method="_on_close_requested"] 85 | [connection signal="toggled" from="VBoxContainer/VBoxContainer/HBoxContainer3/AutoSaveCheckBox" to="." method="_on_auto_save_check_box_toggled"] 86 | [connection signal="value_changed" from="VBoxContainer/VBoxContainer/HBoxContainer4/AutoSaveSpinBox" to="." method="_on_auto_save_spin_box_value_changed"] 87 | [connection signal="pressed" from="VBoxContainer/HBoxContainer2/CloseButton" to="." method="_on_close_button_pressed"] 88 | -------------------------------------------------------------------------------- /godot/src/node/scroll_space.gd: -------------------------------------------------------------------------------- 1 | ## キャンバスタブ内部のdocumentのプレビューの平行移動や拡大縮小の挙動を記述するクラス。 2 | class_name ScrollSpace 3 | extends Panel 4 | 5 | 6 | @onready var _space: Panel = $"." 7 | @onready var _document: Panel = $Document 8 | @onready var _control_layer: Panel = $ControlLayer 9 | 10 | ## documentのビューポートでの拡大率。 11 | var document_scale: float = 1.0 12 | 13 | var _document_position_delta: Vector2 = Vector2() 14 | var _middle_pressed: bool = false 15 | 16 | const WHEEL_SCALE_SPEED: float = 0.1 17 | const DOCUMENT_SCALE_MIN: float = 0.01 18 | const DOCUMENT_SCALE_MAX: float = 100 19 | const SPACE_SCALE: float = 2.8 20 | 21 | 22 | func _process(_delta: float) -> void: 23 | _document.scale = Vector2(document_scale, document_scale) 24 | _control_layer.scale = Vector2(document_scale, document_scale) 25 | _document.position = _space.size / 2 - document_scale * _document.size / 2 \ 26 | + _document_position_delta 27 | _control_layer.position = _space.size / 2 - document_scale * _document.size / 2 \ 28 | + _document_position_delta 29 | 30 | 31 | func _input(event: InputEvent) -> void: 32 | if not Main.document_opened: 33 | return 34 | 35 | if event is InputEventMouseButton: 36 | var mouse_button_event := event as InputEventMouseButton 37 | var hover_space := Rect2(Vector2.ZERO, _space.size).has_point(_space.get_local_mouse_position()) 38 | 39 | # Wheelでdocument scaleを変更 40 | if mouse_button_event.button_index == MOUSE_BUTTON_WHEEL_DOWN and hover_space: 41 | document_scale *= 1 - WHEEL_SCALE_SPEED 42 | if document_scale < DOCUMENT_SCALE_MIN or document_scale > DOCUMENT_SCALE_MAX: 43 | document_scale = clampf(document_scale, DOCUMENT_SCALE_MIN, DOCUMENT_SCALE_MAX) 44 | else: 45 | var mouse_pos := _space.get_local_mouse_position() - _space.size / 2 46 | _document_position_delta = \ 47 | (_document_position_delta - mouse_pos) * (1 - WHEEL_SCALE_SPEED) + mouse_pos 48 | Main.viewport_scale = document_scale 49 | if mouse_button_event.button_index == MOUSE_BUTTON_WHEEL_UP and hover_space: 50 | document_scale *= 1 + WHEEL_SCALE_SPEED 51 | if document_scale < DOCUMENT_SCALE_MIN or document_scale > DOCUMENT_SCALE_MAX: 52 | document_scale = clampf(document_scale, DOCUMENT_SCALE_MIN, DOCUMENT_SCALE_MAX) 53 | else: 54 | var mouse_pos := _space.get_local_mouse_position() - _space.size / 2 55 | _document_position_delta = \ 56 | (_document_position_delta - mouse_pos) * (1 + WHEEL_SCALE_SPEED) + mouse_pos 57 | Main.viewport_scale = document_scale 58 | 59 | # Middle Buttonがpressedでドキュメントの平行移動状態 60 | if mouse_button_event.button_index == MOUSE_BUTTON_MIDDLE: 61 | if event.is_pressed() and hover_space: 62 | _middle_pressed = true 63 | else: 64 | _middle_pressed = false 65 | 66 | if event is InputEventMouseMotion: 67 | var mouse_motion_event := event as InputEventMouseMotion 68 | if _middle_pressed: 69 | _document_position_delta += mouse_motion_event.relative 70 | 71 | 72 | ## 画面内中央にdocumentを納めます。 73 | func expand_document() -> void: 74 | _document_position_delta = Vector2() 75 | var x_scale := _space.size.x / _document.size.x 76 | var y_scale := _space.size.y / _document.size.y 77 | document_scale = minf(minf(x_scale, y_scale), 1.0) 78 | Main.viewport_scale = document_scale 79 | 80 | 81 | ## documentのサイズを100%にします。 82 | func reset_document_scale() -> void: 83 | document_scale = 1.0 84 | Main.viewport_scale = document_scale 85 | -------------------------------------------------------------------------------- /godot/scenes/sub_window/document_export_window.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=3 uid="uid://dferwtnot6vxw"] 2 | 3 | [ext_resource type="Script" path="res://src/sub_window/document_export_window.gd" id="1_tdgkl"] 4 | 5 | [node name="DocumentExportWindow" type="Window"] 6 | title = "EXPORT_TITLE" 7 | initial_position = 2 8 | size = Vector2i(420, 100) 9 | transient = true 10 | unresizable = true 11 | popup_window = true 12 | script = ExtResource("1_tdgkl") 13 | 14 | [node name="VBoxContainer" type="VBoxContainer" parent="."] 15 | anchors_preset = 15 16 | anchor_right = 1.0 17 | anchor_bottom = 1.0 18 | grow_horizontal = 2 19 | grow_vertical = 2 20 | size_flags_horizontal = 3 21 | size_flags_vertical = 3 22 | theme_override_constants/separation = 12 23 | alignment = 1 24 | 25 | [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] 26 | layout_mode = 2 27 | alignment = 1 28 | 29 | [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/HBoxContainer"] 30 | layout_mode = 2 31 | 32 | [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/HBoxContainer/HBoxContainer"] 33 | layout_mode = 2 34 | 35 | [node name="Label" type="Label" parent="VBoxContainer/HBoxContainer/HBoxContainer/HBoxContainer"] 36 | layout_mode = 2 37 | text = "EXPORT_WIDTH" 38 | 39 | [node name="WidthSpinBox" type="SpinBox" parent="VBoxContainer/HBoxContainer/HBoxContainer/HBoxContainer"] 40 | unique_name_in_owner = true 41 | layout_mode = 2 42 | min_value = 1.0 43 | max_value = 2048.0 44 | value = 1.0 45 | select_all_on_focus = true 46 | 47 | [node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/HBoxContainer/HBoxContainer"] 48 | layout_mode = 2 49 | 50 | [node name="Label" type="Label" parent="VBoxContainer/HBoxContainer/HBoxContainer/HBoxContainer2"] 51 | layout_mode = 2 52 | text = "EXPORT_HEIGHT" 53 | 54 | [node name="HeightSpinBox" type="SpinBox" parent="VBoxContainer/HBoxContainer/HBoxContainer/HBoxContainer2"] 55 | unique_name_in_owner = true 56 | layout_mode = 2 57 | min_value = 1.0 58 | max_value = 2048.0 59 | value = 1.0 60 | select_all_on_focus = true 61 | 62 | [node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"] 63 | layout_mode = 2 64 | alignment = 2 65 | 66 | [node name="ExportButton" type="Button" parent="VBoxContainer/HBoxContainer2"] 67 | layout_mode = 2 68 | text = "EXPORT_EXPORT" 69 | 70 | [node name="Space2" type="Control" parent="VBoxContainer/HBoxContainer2"] 71 | custom_minimum_size = Vector2(4, 0) 72 | layout_mode = 2 73 | 74 | [node name="CancelButton" type="Button" parent="VBoxContainer/HBoxContainer2"] 75 | layout_mode = 2 76 | text = "EXPORT_CANCEL" 77 | 78 | [node name="Space" type="Control" parent="VBoxContainer/HBoxContainer2"] 79 | custom_minimum_size = Vector2(24, 0) 80 | layout_mode = 2 81 | 82 | [connection signal="close_requested" from="." to="." method="_on_close_requested"] 83 | [connection signal="value_changed" from="VBoxContainer/HBoxContainer/HBoxContainer/HBoxContainer/WidthSpinBox" to="." method="_on_width_spin_box_value_changed"] 84 | [connection signal="value_changed" from="VBoxContainer/HBoxContainer/HBoxContainer/HBoxContainer2/HeightSpinBox" to="." method="_on_height_spin_box_value_changed"] 85 | [connection signal="pressed" from="VBoxContainer/HBoxContainer2/ExportButton" to="." method="_on_create_button_pressed"] 86 | [connection signal="pressed" from="VBoxContainer/HBoxContainer2/CancelButton" to="." method="_on_cancel_button_pressed"] 87 | -------------------------------------------------------------------------------- /godot/scenes/node/material_select_popup_item.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=12 format=3 uid="uid://b20uvm65bbdew"] 2 | 3 | [ext_resource type="Script" path="res://src/node/material_select_popup_item.gd" id="1_13an1"] 4 | [ext_resource type="Shader" path="res://shaders/fill_checker_alpha.gdshader" id="2_nxm34"] 5 | [ext_resource type="Shader" path="res://shaders/linear_gradient_checker_alpha.gdshader" id="3_au23s"] 6 | [ext_resource type="Shader" path="res://shaders/radial_gradient_checker_alpha.gdshader" id="4_3lpqx"] 7 | 8 | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_l0331"] 9 | bg_color = Color(0.6, 0.6, 0.6, 0) 10 | 11 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_pete5"] 12 | shader = ExtResource("2_nxm34") 13 | shader_parameter/fill_color = Color(1, 1, 1, 1) 14 | shader_parameter/document_size = Vector2(480, 720) 15 | shader_parameter/document_scale = 1.0 16 | 17 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_86o67"] 18 | shader = ExtResource("3_au23s") 19 | shader_parameter/document_size = Vector2(480, 720) 20 | shader_parameter/document_scale = 1.0 21 | 22 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_y1hs2"] 23 | shader = ExtResource("4_3lpqx") 24 | shader_parameter/document_size = Vector2(480, 720) 25 | shader_parameter/document_scale = 1.0 26 | 27 | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ync7d"] 28 | content_margin_left = 4.0 29 | content_margin_top = 4.0 30 | content_margin_right = 4.0 31 | content_margin_bottom = 4.0 32 | bg_color = Color(0.6, 0.6, 0.6, 0) 33 | 34 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_erkst"] 35 | shader = ExtResource("2_nxm34") 36 | shader_parameter/fill_color = Color(1, 1, 1, 0) 37 | shader_parameter/document_size = Vector2(64, 24) 38 | shader_parameter/document_scale = 1.0 39 | 40 | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_l7so6"] 41 | bg_color = Color(1, 1, 1, 1) 42 | corner_radius_top_left = 4 43 | corner_radius_top_right = 4 44 | corner_radius_bottom_right = 4 45 | corner_radius_bottom_left = 4 46 | 47 | [node name="MaterialSelectPopupItem" type="PanelContainer"] 48 | anchors_preset = 14 49 | anchor_top = 0.5 50 | anchor_right = 1.0 51 | anchor_bottom = 0.5 52 | offset_top = -12.5 53 | offset_bottom = 19.5 54 | grow_horizontal = 2 55 | grow_vertical = 2 56 | size_flags_horizontal = 3 57 | theme_override_styles/panel = SubResource("StyleBoxFlat_l0331") 58 | script = ExtResource("1_13an1") 59 | _color_material = SubResource("ShaderMaterial_pete5") 60 | _linear_gradient_material = SubResource("ShaderMaterial_86o67") 61 | _radial_gradient_material = SubResource("ShaderMaterial_y1hs2") 62 | 63 | [node name="Padding" type="PanelContainer" parent="."] 64 | layout_mode = 2 65 | size_flags_horizontal = 3 66 | mouse_filter = 1 67 | theme_override_styles/panel = SubResource("StyleBoxFlat_ync7d") 68 | 69 | [node name="HBoxContainer" type="HBoxContainer" parent="Padding"] 70 | layout_mode = 2 71 | mouse_filter = 2 72 | 73 | [node name="Color" type="Panel" parent="Padding/HBoxContainer"] 74 | unique_name_in_owner = true 75 | material = SubResource("ShaderMaterial_erkst") 76 | custom_minimum_size = Vector2(64, 0) 77 | layout_mode = 2 78 | size_flags_horizontal = 0 79 | mouse_filter = 2 80 | theme_override_styles/panel = SubResource("StyleBoxFlat_l7so6") 81 | 82 | [node name="Label" type="Label" parent="Padding/HBoxContainer"] 83 | unique_name_in_owner = true 84 | auto_translate_mode = 2 85 | layout_mode = 2 86 | size_flags_horizontal = 3 87 | text = "Material" 88 | 89 | [connection signal="mouse_entered" from="." to="." method="_on_mouse_entered"] 90 | [connection signal="mouse_exited" from="." to="." method="_on_mouse_exited"] 91 | -------------------------------------------------------------------------------- /godot/addons/uuid/uuid.gd: -------------------------------------------------------------------------------- 1 | # Note: The code might not be as pretty it could be, since it's written 2 | # in a way that maximizes performance. Methods are inlined and loops are avoided. 3 | extends Node 4 | 5 | const BYTE_MASK: int = 0b11111111 6 | 7 | static func uuidbin(): 8 | # 16 random bytes with the bytes on index 6 and 8 modified 9 | return [ 10 | randi() & BYTE_MASK, randi() & BYTE_MASK, randi() & BYTE_MASK, randi() & BYTE_MASK, 11 | randi() & BYTE_MASK, randi() & BYTE_MASK, ((randi() & BYTE_MASK) & 0x0f) | 0x40, randi() & BYTE_MASK, 12 | ((randi() & BYTE_MASK) & 0x3f) | 0x80, randi() & BYTE_MASK, randi() & BYTE_MASK, randi() & BYTE_MASK, 13 | randi() & BYTE_MASK, randi() & BYTE_MASK, randi() & BYTE_MASK, randi() & BYTE_MASK, 14 | ] 15 | 16 | static func uuidbinrng(rng: RandomNumberGenerator): 17 | return [ 18 | rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, 19 | rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, ((rng.randi() & BYTE_MASK) & 0x0f) | 0x40, rng.randi() & BYTE_MASK, 20 | ((rng.randi() & BYTE_MASK) & 0x3f) | 0x80, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, 21 | rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, 22 | ] 23 | 24 | static func v4(): 25 | # 16 random bytes with the bytes on index 6 and 8 modified 26 | var b = uuidbin() 27 | 28 | return '%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x' % [ 29 | # low 30 | b[0], b[1], b[2], b[3], 31 | 32 | # mid 33 | b[4], b[5], 34 | 35 | # hi 36 | b[6], b[7], 37 | 38 | # clock 39 | b[8], b[9], 40 | 41 | # clock 42 | b[10], b[11], b[12], b[13], b[14], b[15] 43 | ] 44 | 45 | static func v4_rng(rng: RandomNumberGenerator): 46 | # 16 random bytes with the bytes on index 6 and 8 modified 47 | var b = uuidbinrng(rng) 48 | 49 | return '%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x' % [ 50 | # low 51 | b[0], b[1], b[2], b[3], 52 | 53 | # mid 54 | b[4], b[5], 55 | 56 | # hi 57 | b[6], b[7], 58 | 59 | # clock 60 | b[8], b[9], 61 | 62 | # clock 63 | b[10], b[11], b[12], b[13], b[14], b[15] 64 | ] 65 | 66 | var _uuid: Array 67 | 68 | func _init(rng := RandomNumberGenerator.new()) -> void: 69 | _uuid = uuidbinrng(rng) 70 | 71 | func as_array() -> Array: 72 | return _uuid.duplicate() 73 | 74 | func as_dict(big_endian := true) -> Dictionary: 75 | if big_endian: 76 | return { 77 | "low" : (_uuid[0] << 24) + (_uuid[1] << 16) + (_uuid[2] << 8 ) + _uuid[3], 78 | "mid" : (_uuid[4] << 8 ) + _uuid[5], 79 | "hi" : (_uuid[6] << 8 ) + _uuid[7], 80 | "clock": (_uuid[8] << 8 ) + _uuid[9], 81 | "node" : (_uuid[10] << 40) + (_uuid[11] << 32) + (_uuid[12] << 24) + (_uuid[13] << 16) + (_uuid[14] << 8 ) + _uuid[15] 82 | } 83 | else: 84 | return { 85 | "low" : _uuid[0] + (_uuid[1] << 8 ) + (_uuid[2] << 16) + (_uuid[3] << 24), 86 | "mid" : _uuid[4] + (_uuid[5] << 8 ), 87 | "hi" : _uuid[6] + (_uuid[7] << 8 ), 88 | "clock": _uuid[8] + (_uuid[9] << 8 ), 89 | "node" : _uuid[10] + (_uuid[11] << 8 ) + (_uuid[12] << 16) + (_uuid[13] << 24) + (_uuid[14] << 32) + (_uuid[15] << 40) 90 | } 91 | 92 | func as_string() -> String: 93 | return '%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x' % [ 94 | # low 95 | _uuid[0], _uuid[1], _uuid[2], _uuid[3], 96 | 97 | # mid 98 | _uuid[4], _uuid[5], 99 | 100 | # hi 101 | _uuid[6], _uuid[7], 102 | 103 | # clock 104 | _uuid[8], _uuid[9], 105 | 106 | # node 107 | _uuid[10], _uuid[11], _uuid[12], _uuid[13], _uuid[14], _uuid[15] 108 | ] 109 | 110 | func is_equal(other) -> bool: 111 | # Godot Engine compares Array recursively 112 | # There's no need for custom comparison here. 113 | return _uuid == other._uuid 114 | -------------------------------------------------------------------------------- /godot/translation/translation.csv: -------------------------------------------------------------------------------- 1 | keys,ja,en 2 | MENU_FILE,ファイル,File 3 | MENU_EDIT,編集,Edit 4 | MENU_TOOL,ツール,Tool 5 | FILE_NEW_DOCUMENT,新規ドキュメント,New Document 6 | FILE_OPEN_DOCUMENT,ドキュメントを開く,Open Document 7 | FILE_SAVE,上書き保存,Save 8 | FILE_SAVE_AS,別名で保存,Save As 9 | FILE_CLOSE_DOCUMENT,ドキュメントを閉じる,Close Document 10 | FILE_EXPORT_IMAGE,画像のエクスポート,Export Image 11 | EDIT_UNDO,もとに戻す,Undo 12 | EDIT_REDO,やり直し,Redo 13 | EDIT_CHANGE_DOCUMENT_SIZE,ドキュメントサイズの変更,Change Document Size 14 | TOOL_CONFIG,環境設定,Config 15 | TOOL_LICENSES,ライセンス,Licenses 16 | BLEND_MODE_NORMAL,通常,Normal 17 | BLEND_MODE_ADD,加算,Add 18 | BLEND_MODE_MULTIPLY,乗算,Multiply 19 | BLEND_MODE_SCREEN,スクリーン,Screen 20 | BLEND_MODE_OVERLAY,オーバーレイ,Overlay 21 | BOOLEAN_UNION,結合,Union 22 | BOOLEAN_DIFF,除外,Diff 23 | BOOLEAN_INTERSECT,交差,Intersect 24 | BOOLEAN_XOR,中マド,Xor 25 | LAYER_SETTINGS_FILL,"塗り: ","Fill: " 26 | LAYER_SETTINGS_LINE,"線: ","Line: " 27 | LAYER_SETTINGS_LINE_WIDTH,"線幅: ","Line Width: " 28 | MATERIAL_SOLID,単色,Solid Color 29 | MATERIAL_LINEAR_GRADIENT,線形グラデーション,Linear Gradiation 30 | MATERIAL_RADIAL_GRADIENT,放射グラデーション,Radial Gradiation 31 | MATERIAL_CONFIRM_DELETE_TITLE,マテリアルの削除の確認,Confirmation of Material Deletion 32 | MATERIAL_CONFIRM_DELETE_TEXT,マテリアルを削除します。,Delete material. 33 | MATERIAL_CONFIRM_DELETE_OK,OK,Confirm 34 | MATERIAL_CONFIRM_DELETE_CANCEL,キャンセル,Cacnel 35 | CONFIG_TITLE,環境設定,Config 36 | CONFIG_LANGUAGE,"言語設定: ","Language: " 37 | CONFIG_CURRENT_LANGUAGE,日本語,English 38 | CONFIG_ENABLE_AUTO_SAVE,"自動保存を有効にする: ","Enable Auto Save: " 39 | CONFIG_AUTO_SAVE_INTERVAL,"自動保存の間隔 (秒): ","Auto save interval (seconds): " 40 | CONFIG_CLOSE,閉じる,Close 41 | EXPORT_TITLE,エクスポート,Export 42 | EXPORT_WIDTH,"幅: ","Width: " 43 | EXPORT_HEIGHT,"高さ: ","Height: " 44 | EXPORT_EXPORT,エクスポート,Export 45 | EXPORT_CANCEL,キャンセル,Cancel 46 | NEW_DOCUMENT_TITLE,新規ドキュメント,New Document 47 | NEW_DOCUMENT_SIZE_PRESET,サイズプリセット,Size Presets 48 | NEW_DOCUMENT_WIDTH,"幅: ","Width: " 49 | NEW_DOCUMENT_HEIGHT,"高さ: ","Height: " 50 | NEW_DOCUMENT_CREATE,作成,Create 51 | NEW_DOCUMENT_CANCEL,キャンセル,Cancel 52 | DOCUMENT_SIZE_TITLE,ドキュメントサイズ変更,Change Document Size 53 | DOCUMENT_SIZE_WIDTH,"幅: ","Width: " 54 | DOCUMENT_SIZE_HEIGHT,"高さ: ","Height: " 55 | DOCUMENT_SIZE_ANCHOR,"アンカー: ","Anchor: " 56 | DOCUMENT_SIZE_CHANGE_SIZE,サイズ変更,Change Size 57 | DOCUMENT_SIZE_CANCEL,キャンセル,Cancel 58 | LINEAR_GRADIENT_START_POINT,"開始点: ","Start Point: " 59 | LINEAR_GRADIENT_END_POINT,"終了点: ","End Point: " 60 | LINEAR_GRADIENT_EDIT,編集,Edit 61 | RADIAL_GRADIENT_CENTER_POINT,"中心点: ","Center Point: " 62 | RADIAL_GRADIENT_HANDLE_1,"ハンドル1: ","Handle 1: " 63 | RADIAL_GRADIENT_HANDLE_2,"ハンドル2: ","Handle 2: " 64 | RADIAL_GRADIENT_EDIT,編集,Edit 65 | TOOLTIP_DRAWING_TOOL,描画ツール,Drawing Tool 66 | TOOLTIP_MANIPULATE_TOOL,操作ツール,Manipulate Tool 67 | TOOLTIP_PARAMETER_TUNING_TOOL,調整ツール,Parameter Tuning Tool 68 | TOOLTIP_EXPAND,枠内に収める,Expand 69 | TOOLTIP_RESET_ZOOM,拡大率をリセット,Reset Zoom 70 | TOOLTIP_MIRROR,左右反転,Mirror 71 | TOOLTIP_BLEND_MODE,ブレンドモード,Blend Mode 72 | TOOLTIP_ALPHA,透明度,Alpha 73 | TOOLTIP_NEW_PATH_LAYER,新規パスレイヤーの追加,Add New Path Layer 74 | TOOLTIP_NEW_FILL_LAYER,新規塗りつぶしレイヤーの追加,Add New Fill Layer 75 | TOOLTIP_NEW_GROUP_LAYER,新規フォルダーレイヤーの追加,Add New Group Layer 76 | TOOLTIP_DELETE_LAYER,レイヤーの削除,Delete Layer 77 | TOOLTIP_CLIPPING,下のレイヤーでクリッピング,Clipping on the lower layer 78 | TOOLTIP_LAYER_LOCK,レイヤーのロック,Layer Lock 79 | TOOLTIP_PATH_OPEN_CLOSE,パスのOpen/Closed切り替え,Open/Closed path switching 80 | TOOLTIP_BOOLEAN,パスのブーリアン演算,Boolean operations on paths 81 | TOOLTIP_SHOW_FILL_MATERIAL,塗りのマテリアルを表示,Show fill material 82 | TOOLTIP_HIDE_FILL_MATERIAL,塗りのマテリアルを非表示,Hide fill material 83 | TOOLTIP_SELECT_FILL_MATERIAL,塗りのマテリアルの選択,Select fill material 84 | TOOLTIP_SHOE_LINE_MATERIAL,線のマテリアルを表示,Show line material 85 | TOOLTIP_HIDE_LINE_MATERIAL,線のマテリアルを非表示,Hide line material 86 | TOOLTIP_SELECT_LINE_MATERIAL,線のマテリアルの選択,Select line material 87 | TOOLTIP_LINE_WIDTH,線の幅,Line width 88 | TOOLTIP_SELECT_FILL_LAYER_MATERIAL,塗りつぶしのマテリアルの選択,Select fill layer material 89 | TOOLTIP_ADD_MATERIAL,マテリアルの追加,Add Material 90 | TOOLTIP_DELETE_MATERIAL,マテリアルの削除,Delete Material 91 | TOOLTIP_MATRERIAL_DELETED,マテリアルが削除されています。,The material is deleted. 92 | LAYER,レイヤー,Layer 93 | PATH,パス,Path 94 | MATERIAL,マテリアル,Material 95 | COPY,コピー,Copy 96 | --------------------------------------------------------------------------------