├── .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 |
8 |
--------------------------------------------------------------------------------
/godot/icons/diff.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
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 |
9 |
--------------------------------------------------------------------------------
/godot/icons/intersect.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
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 |
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 |
--------------------------------------------------------------------------------
/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 |
14 |
--------------------------------------------------------------------------------
/godot/icons/mirror-flip.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
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 | 
16 |
17 | 
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 | | コントロールポイントを左右ドラッグ |  |
28 | | コントロールポイントの間のセグメントを上下にドラッグ |  |
29 | | コントロールポイントの間のセグメントを左右にドラッグ |  |
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 |
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 |
9 |
--------------------------------------------------------------------------------
/godot/icons/open_path.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
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 |
9 |
--------------------------------------------------------------------------------
/godot/icons/closed_path.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
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 | 
16 |
17 | 
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. |  |
28 | | Drag the segment between the control points up and down. |  |
29 | | Drag the segment between the control points left and right. |  |
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 |
--------------------------------------------------------------------------------