Compare commits
136 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 06a270e916 | |||
| b621df5435 | |||
| 03dbc08293 | |||
| 8676bbb2f6 | |||
| 6e998810b6 | |||
| c96be7467e | |||
| 6aa7530502 | |||
| d7ac1c6c22 | |||
| 0170a53b5a | |||
| abc33fd06c | |||
| 2fbeb93018 | |||
| 9253a78a06 | |||
| 0008b16d48 | |||
| 8e0dced918 | |||
| 2e21fb7e98 | |||
| b69191e7f7 | |||
| 8f75b5b644 | |||
| 6275bea52c | |||
| 279cac22ee | |||
| e88ba2e1ef | |||
| f01143e887 | |||
| 18711776bb | |||
| 0f246825fc | |||
| 19e30dd0b8 | |||
| 730c4999d7 | |||
| cfe604d3b7 | |||
| ad16b86171 | |||
| 5ee295256b | |||
| ab23d41496 | |||
| ae0944fe00 | |||
| 486cfb5546 | |||
| b92eb909ad | |||
| d2c7302ab2 | |||
| 5affc48dc5 | |||
| cdb6b83124 | |||
| a4f9511892 | |||
| cc7e8c5c4b | |||
| 7a3e96d679 | |||
| e38c391e1c | |||
| c0e002f783 | |||
| e8850ca7c5 | |||
| eaedf8c396 | |||
| ffa20bbdf8 | |||
| b77b6e3a52 | |||
| 69cb63ad89 | |||
| 11790434f5 | |||
| c7d56301fc | |||
| 8bd2b09232 | |||
| 480d149ede | |||
| c6fc400994 | |||
| 16251db248 | |||
| 4752002caf | |||
| 0e028a2cb9 | |||
| 01a281c2aa | |||
| 2a46d363e9 | |||
| 92c3f5e054 | |||
| 6727339e9a | |||
| e3d67722de | |||
| b6fd6292e3 | |||
| e8c24e18be | |||
| 199d0873c8 | |||
| e84ef716f6 | |||
| 135ba0d198 | |||
| 2940475062 | |||
| 202f8809aa | |||
| 28bb81c0b0 | |||
| b9c5de6dc3 | |||
| 8c18688a69 | |||
| 2429958741 | |||
| 6b5a8ee126 | |||
| 8d40529349 | |||
| 9e97cc3b80 | |||
| ebc3ee9cf9 | |||
| a1bbe44105 | |||
| 3ce10c8ba9 | |||
| 7e6163ed68 | |||
| 55d6222698 | |||
| d7ad2ba072 | |||
| 9c50a63dc3 | |||
| 746ac58329 | |||
| a9cb20c8bc | |||
| 32249fde86 | |||
| 27e137bc02 | |||
| 01daddee3b | |||
| ba512508f8 | |||
| ec653aa847 | |||
| 9acea54f28 | |||
| 2f5296e05a | |||
| e8a58655ad | |||
| aa3789566c | |||
| 9c7ae20c18 | |||
| 9f04c8819f | |||
| 6cd7be196b | |||
| ab2cf3f497 | |||
| bf096aa716 | |||
| 09ef508f49 | |||
| 6de8368414 | |||
| d20085a67c | |||
| a54003c658 | |||
| 648ae8395b | |||
| fbad33213c | |||
| b68eb0953e | |||
| 35c7e9a25e | |||
| 57896e37df | |||
| 242879159a | |||
| 7ef9fe53b2 | |||
| 600d9cfca1 | |||
| 48796de1ba | |||
| 4a0b2cd550 | |||
| ba429d7b84 | |||
| e33776daeb | |||
| 9cfd3bd6f4 | |||
| 7eb18caaaf | |||
| e65e82f421 | |||
| c36d0b5866 | |||
| bcdba7b812 | |||
| 7467ec56d9 | |||
| 990494e8b0 | |||
| c6e0cfe4d9 | |||
| 691e613a5c | |||
| 4e010220bf | |||
| ccc4eb759e | |||
| 250f0d07ca | |||
| f481f5bea7 | |||
| 58c65fc928 | |||
| 937e54e47a | |||
| b8cb60aec9 | |||
| 55a3e56791 | |||
| 1629862759 | |||
| a53b4c4010 | |||
| 4261789f13 | |||
| ce18c89c09 | |||
| 7643cccebf | |||
| 7e4d733d7c | |||
| 1dcd900737 | |||
| 74c3540c96 |
@@ -1,5 +1,12 @@
|
||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AArea3D_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F8a54226fa2e1c9371a8091f24cfd744aef11fe6869527dc23b9b837623a29b9_003FArea3D_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAudioStreamPlayer2D_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F848324b1c23114c3f5e8bbb5a42c4ade394c59a7a7a133a66b76581ca571_003FAudioStreamPlayer2D_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ABabushka_002Escripts_002ECSharp_002ECommon_002EFarming_002EVesnaBehaviour2D_005FScriptProperties_002Egenerated_002Ecs_002Fl_003AC_0021_003FUsers_003FJonathan_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F4298b0f293f987511fc1b7956ee691fd778f8378_003FBabushka_002Escripts_002ECSharp_002ECommon_002EFarming_002EVesnaBehaviour2D_005FScriptProperties_002Egenerated_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ABabushka_002Escripts_002ECSharp_002ECommon_002EQuest_002EQuestListItemUi_005FScriptMethods_002Egenerated_002Ecs_002Fl_003AC_0021_003FUsers_003FJonathan_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F48fad7e7f3c9e292b3fdbddf9d363f0d1752aa_003FBabushka_002Escripts_002ECSharp_002ECommon_002EQuest_002EQuestListItemUi_005FScriptMethods_002Egenerated_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACastHelpers_002Ecs_002Fl_003AC_0021_003FUsers_003FJonathan_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F3c92637ae2e83da0a63791071c41eae291d594156062866d8621b7ed7245c_003FCastHelpers_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACastHelpers_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fd111abf504bf42b5968a609b168fd093b2e200_003Fbb_003F1c116fcd_003FCastHelpers_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANode_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003Ff1d69ec2da76ccf9bc8a75c8e0fdca9a7ba1adf8c8c9d5047e2fa5991c02eca_003FNode_002Ecs/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACharacterBody2D_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003Fbba0bbd7a98ee58286e9484fbe86e01afff6232283f6efd3556eb7116453_003FCharacterBody2D_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADictionary_00602_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003Fhome_003Fjonathan_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fe37dc1faf08a4d5ea030ad59bdf77522523400_003Fd4_003Fbd338aeb_003FDictionary_00602_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANode_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003Ff1d69ec2da76ccf9bc8a75c8e0fdca9a7ba1adf8c8c9d5047e2fa5991c02eca_003FNode_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AResourceLoader_002Ecs_002Fl_003AC_0021_003FUsers_003FJonathan_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F9f4e8eb124d11f8219cb513a19bed22b2120ed29f9d6785ba56e3367b48d581_003FResourceLoader_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003AC_0021_003FUsers_003FJonathan_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003Fc7102cd0ffb8973777e61b1942c3fffac7e14016a511d055c3adf73ff91748_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>
|
||||
@@ -0,0 +1 @@
|
||||
<svg height="24" viewBox="0 0 16 16" width="24" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a1 1 0 0 0 -1 1v5h-2c-1.108 0-2 .892-2 2v1h10v-1c0-1.108-.892-2-2-2h-2v-5a1 1 0 0 0 -1-1zm-5 10v4l10-1v-3z" fill="#e0e0e0"/></svg>
|
||||
|
After Width: | Height: | Size: 227 B |
@@ -0,0 +1,37 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bmnff63evbdhv"
|
||||
path="res://.godot/imported/Clear.svg-d661617e27b91e3580171e3447fde514.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/SignalVisualizer/Clear.svg"
|
||||
dest_files=["res://.godot/imported/Clear.svg-d661617e27b91e3580171e3447fde514.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
@@ -0,0 +1,58 @@
|
||||
class_name SignalConnection extends Object
|
||||
|
||||
# Properties
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
var signal_id: int
|
||||
var source_node_name: String
|
||||
var destination_node_name: String
|
||||
var method_signature: String
|
||||
|
||||
var description: String :
|
||||
get:
|
||||
return "ID: {signal_id} Source: {source_node_name} Destination: {destination_node_name} Method: {method_signature}".format({
|
||||
"signal_id": signal_id,
|
||||
"source_node_name": source_node_name,
|
||||
"destination_node_name": destination_node_name,
|
||||
"method_signature": method_signature,
|
||||
})
|
||||
|
||||
var dictionary_key: String :
|
||||
get:
|
||||
return "{signal_id}__{source_node_name}__{destination_node_name}__{method_signature}".format({ "signal_id": signal_id, "source_node_name": source_node_name, "destination_node_name": destination_node_name, "method_signature": method_signature.replace("::", "_") })
|
||||
|
||||
var dictionary_representation: Dictionary :
|
||||
get:
|
||||
return {
|
||||
"signal_id": signal_id,
|
||||
"source_node_name": source_node_name,
|
||||
"destination_node_name": destination_node_name,
|
||||
"method_signature": method_signature,
|
||||
}
|
||||
|
||||
# Lifecycle
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func _init(signal_id: int, source_node_name: String, destination_node_name: String, method_signature: String):
|
||||
self.signal_id = signal_id
|
||||
self.source_node_name = source_node_name
|
||||
self.destination_node_name = destination_node_name
|
||||
self.method_signature = method_signature
|
||||
|
||||
# Signals
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
|
||||
|
||||
# Methods
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
uid://dm613ct57qfwa
|
||||
@@ -0,0 +1,56 @@
|
||||
class_name SignalDescription extends Object
|
||||
|
||||
# Properties
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
var id: int:
|
||||
get:
|
||||
if _source_id != null:
|
||||
return _source_id
|
||||
return get_instance_id()
|
||||
|
||||
var node_name: String
|
||||
var signal_name: String
|
||||
|
||||
var description: String :
|
||||
get:
|
||||
return "ID: {id} Node: {node_name} Signal: {signal_name}".format({
|
||||
"id": id,
|
||||
"node_name": node_name,
|
||||
"signal_name": signal_name,
|
||||
})
|
||||
|
||||
var dictionary_representation: Dictionary :
|
||||
get:
|
||||
return {
|
||||
"id": id,
|
||||
"node_name": node_name,
|
||||
"signal_name": signal_name,
|
||||
}
|
||||
|
||||
var _source_id = null
|
||||
|
||||
# Lifecycle
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func _init(node_name: String, signal_name: String):
|
||||
self.node_name = node_name
|
||||
self.signal_name = signal_name
|
||||
|
||||
# Signals
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
|
||||
|
||||
# Methods
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
uid://dvgsocxisw3ae
|
||||
@@ -0,0 +1,53 @@
|
||||
class_name SignalGraph extends Object
|
||||
|
||||
# Properties
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
var name: String
|
||||
var signals: Array[SignalDescription]
|
||||
var edges: Array[SignalConnection]
|
||||
|
||||
var description: String :
|
||||
get:
|
||||
return "Signals: {signals}\nEdges: {edges}".format({
|
||||
"signals": signals.map(func (item): return item.description),
|
||||
"edges": edges.map(func (item): return item.description),
|
||||
})
|
||||
|
||||
var dictionary_representation: Dictionary :
|
||||
get:
|
||||
return {
|
||||
"name": name,
|
||||
"signals": signals.map(func (element): return element.dictionary_representation),
|
||||
"edges": edges.map(func (element): return element.dictionary_representation),
|
||||
}
|
||||
|
||||
# Lifecycle
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func _init(name: String, signals: Array[SignalDescription] = [], edges: Array[SignalConnection] = []):
|
||||
self.name = name
|
||||
self.signals = signals
|
||||
self.edges = edges
|
||||
|
||||
# Signals
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
|
||||
|
||||
# Methods
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func get_source_signal_for_edge(edge: SignalConnection) -> SignalDescription:
|
||||
var result = signals.filter(func (item): return item.id == edge.signal_id)
|
||||
if result.size() > 0:
|
||||
return result[0]
|
||||
return null
|
||||
@@ -0,0 +1 @@
|
||||
uid://2qj81iy1le0a
|
||||
@@ -0,0 +1,170 @@
|
||||
@tool
|
||||
class_name SignalGraphUtility
|
||||
|
||||
static var SignalGraphNode = preload("res://addons/SignalVisualizer/Visualizer/signal_graph_node.tscn")
|
||||
static var GraphNodeItem = preload("res://addons/SignalVisualizer/Visualizer/signal_graph_node_item.tscn")
|
||||
|
||||
const SOURCE_COLOR: Color = Color.SKY_BLUE
|
||||
const DESTINATION_COLOR: Color = Color.CORAL
|
||||
const CONNECTION_TYPE: int = 0
|
||||
|
||||
#region Methods
|
||||
|
||||
static func create_signal_graph(name: String, signals: Array, edges: Array) -> SignalGraph:
|
||||
var signal_graph = SignalGraph.new(name)
|
||||
|
||||
for signal_item in signals:
|
||||
var new_signal_description = SignalDescription.new(signal_item.node_name, signal_item.signal_name)
|
||||
new_signal_description._source_id = signal_item.id
|
||||
signal_graph.signals.append(new_signal_description)
|
||||
|
||||
for connection in edges:
|
||||
var new_edge = SignalConnection.new(connection.signal_id, connection.source_node_name, connection.destination_node_name, connection.method_signature)
|
||||
signal_graph.edges.append(new_edge)
|
||||
|
||||
return signal_graph
|
||||
|
||||
static func create_signal_graph_from_node(root_node: Node, is_persistent_only: bool = false):
|
||||
var signal_graph = SignalGraph.new(root_node.scene_file_path)
|
||||
var all_nodes: Array[Node] = _gather_nodes_from_node(root_node)
|
||||
var signals: Array[SignalDescription] = []
|
||||
var edges: Array[SignalConnection] = []
|
||||
|
||||
for node in all_nodes:
|
||||
for signal_item in node.get_signal_list():
|
||||
var existing_signals = []
|
||||
var connection_list = node.get_signal_connection_list(signal_item["name"] as String)
|
||||
if connection_list.size() > 0:
|
||||
for connection in connection_list:
|
||||
var enabled_flags = connection["flags"] == CONNECT_PERSIST if is_persistent_only else true
|
||||
var should_display_connection = "name" in connection["callable"].get_object() and not connection["callable"].get_object().name.begins_with("@") and enabled_flags
|
||||
if should_display_connection:
|
||||
var signal_description: SignalDescription
|
||||
var filtered_signals = existing_signals.filter(func (element): return element.signal_name == signal_item.name and element.node_name == node.name)
|
||||
if filtered_signals.size() == 1:
|
||||
signal_description = filtered_signals[0]
|
||||
else:
|
||||
signal_description = SignalDescription.new(node.name, signal_item.name)
|
||||
existing_signals.append(signal_description)
|
||||
signals.append(signal_description)
|
||||
|
||||
var signal_edge = SignalConnection.new(signal_description.id, signal_description.node_name, connection["callable"].get_object().name, connection["callable"].get_method())
|
||||
if not signal_graph.edges.any(func (element): return element.signal_id == signal_description.id):
|
||||
edges.append(signal_edge)
|
||||
|
||||
var temp_signals = {}
|
||||
for item in signals:
|
||||
temp_signals[item.id] = item
|
||||
|
||||
var temp_edges = {}
|
||||
for item in edges:
|
||||
temp_edges[item.dictionary_key] = item
|
||||
|
||||
signal_graph.signals.assign(temp_signals.keys().map(func (key): return temp_signals[key]))
|
||||
signal_graph.edges.assign(temp_edges.keys().map(func (key): return temp_edges[key]))
|
||||
|
||||
return signal_graph
|
||||
|
||||
static func generate_signal_graph_nodes(signal_graph: SignalGraph, graph_node: GraphEdit, open_script_callable: Callable):
|
||||
var graph_nodes: Dictionary = {}
|
||||
|
||||
for signal_item in signal_graph.signals:
|
||||
var current_graph_node: SignalGraphNode
|
||||
if graph_nodes.has(signal_item.node_name):
|
||||
current_graph_node = graph_nodes[signal_item.node_name]
|
||||
if not current_graph_node:
|
||||
current_graph_node = SignalGraphNode.instantiate()
|
||||
current_graph_node.title = signal_item.node_name
|
||||
current_graph_node.name = _get_graph_node_name(signal_item.node_name)
|
||||
graph_node.add_child(current_graph_node)
|
||||
graph_nodes[signal_item.node_name] = current_graph_node
|
||||
|
||||
for edge in signal_graph.edges:
|
||||
var destination_graph_node: SignalGraphNode
|
||||
if graph_nodes.has(edge.destination_node_name):
|
||||
destination_graph_node = graph_nodes[edge.destination_node_name]
|
||||
else:
|
||||
destination_graph_node = SignalGraphNode.instantiate()
|
||||
destination_graph_node.title = edge.destination_node_name
|
||||
destination_graph_node.name = _get_graph_node_name(edge.destination_node_name)
|
||||
graph_node.add_child(destination_graph_node)
|
||||
graph_nodes[edge.destination_node_name] = destination_graph_node
|
||||
|
||||
var source_signal = signal_graph.get_source_signal_for_edge(edge)
|
||||
if source_signal != null:
|
||||
var source_graph_node: SignalGraphNode = graph_nodes[edge.source_node_name] as SignalGraphNode
|
||||
|
||||
if not source_graph_node.has_source_signal_description(source_signal.signal_name, edge.destination_node_name):
|
||||
var source_signal_label = Label.new()
|
||||
source_signal_label.text = source_signal.signal_name
|
||||
source_signal_label.name = "source_" + source_signal.signal_name + "_" + edge.destination_node_name
|
||||
source_graph_node.add_child(source_signal_label)
|
||||
|
||||
var destination_signal_name = "destination_" + source_signal.signal_name + "_" + edge.method_signature.replace("::", "__")
|
||||
var has_destination = destination_graph_node.has_destination_signal_description(source_signal.signal_name, edge.method_signature)
|
||||
if not has_destination:
|
||||
var destination_signal_item = GraphNodeItem.instantiate()
|
||||
destination_signal_item.signal_data = SignalGraphNodeItem.Metadata.new(source_signal.signal_name, edge.method_signature, edge.destination_node_name)
|
||||
destination_signal_item.text = edge.method_signature
|
||||
destination_signal_item.name = destination_signal_name
|
||||
destination_signal_item.open_script.connect(open_script_callable)
|
||||
destination_graph_node.add_child(destination_signal_item)
|
||||
|
||||
for edge in signal_graph.edges:
|
||||
var source_signal = signal_graph.get_source_signal_for_edge(edge)
|
||||
if source_signal != null:
|
||||
var source_graph_node: SignalGraphNode = graph_nodes[edge.source_node_name] as SignalGraphNode
|
||||
var destination_graph_node: SignalGraphNode = graph_nodes[edge.destination_node_name] as SignalGraphNode
|
||||
|
||||
var from_port = source_graph_node.get_source_slot(source_signal.signal_name, edge.destination_node_name)
|
||||
var to_port = destination_graph_node.get_destination_slot(source_signal.signal_name, edge.method_signature)
|
||||
|
||||
source_graph_node.set_slot(from_port, false, CONNECTION_TYPE, Color.BLACK, true, CONNECTION_TYPE, SOURCE_COLOR)
|
||||
destination_graph_node.set_slot(to_port, true, CONNECTION_TYPE, DESTINATION_COLOR, false, CONNECTION_TYPE, Color.BLACK)
|
||||
|
||||
var from_slot_index = source_graph_node.get_next_source_slot(source_signal.signal_name, edge.destination_node_name)
|
||||
var to_slot_index = destination_graph_node.get_next_destination_slot(source_signal.signal_name, edge.method_signature)
|
||||
|
||||
if from_port >= 0 and to_port >= 0:
|
||||
graph_node.connect_node(source_graph_node.name, from_slot_index, destination_graph_node.name, to_slot_index)
|
||||
else:
|
||||
print(">>> Invalid Connection Request")
|
||||
|
||||
static func generate_signal_graph_tree(signal_graph: SignalGraph, tree_node: Tree):
|
||||
var root = tree_node.create_item()
|
||||
root.set_text(0, signal_graph.name)
|
||||
|
||||
var tree_items: Dictionary = {}
|
||||
|
||||
for signal_item in signal_graph.signals:
|
||||
var node_tree_item: TreeItem
|
||||
if tree_items.has(signal_item.node_name):
|
||||
node_tree_item = tree_items[signal_item.node_name] as TreeItem
|
||||
else:
|
||||
node_tree_item = tree_node.create_item(root)
|
||||
node_tree_item.set_text(0, signal_item.node_name)
|
||||
tree_items[signal_item.node_name] = node_tree_item
|
||||
|
||||
var signal_tree_item = tree_node.create_item(node_tree_item)
|
||||
signal_tree_item.set_text(0, signal_item.signal_name)
|
||||
|
||||
for edge in signal_graph.edges.filter(func (item): return item.signal_id == signal_item.id):
|
||||
var signal_connection_tree_item = tree_node.create_item(signal_tree_item)
|
||||
signal_connection_tree_item.set_text(0, edge.destination_node_name + "::" + edge.method_signature)
|
||||
|
||||
static func _get_graph_node_name(name: String) -> String:
|
||||
return "{node_name}_graph_node".format({ "node_name": name })
|
||||
|
||||
static func _gather_nodes_from_node(root_node: Node) -> Array[Node]:
|
||||
var node_list: Array[Node] = [root_node]
|
||||
return node_list + __gather_nodes_from_node(root_node)
|
||||
|
||||
static func __gather_nodes_from_node(node: Node) -> Array[Node]:
|
||||
var nodes: Array[Node] = []
|
||||
for child in node.get_children(false):
|
||||
nodes.append(child)
|
||||
nodes += __gather_nodes_from_node(child)
|
||||
|
||||
return nodes
|
||||
|
||||
#endregion
|
||||
@@ -0,0 +1 @@
|
||||
uid://csw8uccbs0vuk
|
||||
@@ -0,0 +1,146 @@
|
||||
extends Node
|
||||
|
||||
# Properties
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
var _signal_graph: SignalGraph
|
||||
var _lambda_map: Dictionary = {}
|
||||
|
||||
# Lifecycle
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func _ready():
|
||||
if OS.is_debug_build():
|
||||
EngineDebugger.register_message_capture("signal_debugger", _on_signal_debugger_message_capture)
|
||||
|
||||
# Signals
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func _on_signal_debugger_message_capture(message: String, data: Array) -> bool:
|
||||
if message == "start":
|
||||
_signal_graph = generate_signal_graph()
|
||||
for signal_item in _signal_graph.signals:
|
||||
_connect_to_signal(signal_item)
|
||||
EngineDebugger.send_message(
|
||||
"signal_debugger:generated_graph",
|
||||
[[_signal_graph.signals.map(func (item): return item.dictionary_representation), _signal_graph.edges.map(func (item): return item.dictionary_representation)]]
|
||||
)
|
||||
if message == "stop" and _signal_graph:
|
||||
for signal_item in _signal_graph.signals:
|
||||
_disconnect_from_signal(signal_item)
|
||||
|
||||
if message == "invoke_signal" and data.size() == 2:
|
||||
var node_name = data[0]
|
||||
var signal_name = data[1]
|
||||
|
||||
var root_node = get_tree().current_scene
|
||||
var node = root_node if root_node.name == node_name else root_node.find_child(node_name)
|
||||
if node:
|
||||
var connection_list = node.get_signal_connection_list(signal_name)
|
||||
for connection in connection_list:
|
||||
var callable = connection["callable"]
|
||||
var bound_args = callable.get_bound_arguments()
|
||||
var bound_args_count = callable.get_bound_arguments_count()
|
||||
var method = callable.get_method()
|
||||
callable.callv([node])
|
||||
|
||||
return true
|
||||
|
||||
func _on_signal_execution(signal_name: String, node_name: String, args):
|
||||
EngineDebugger.send_message(
|
||||
"signal_debugger:signal_executed",
|
||||
[Time.get_datetime_string_from_system(), node_name, signal_name]
|
||||
)
|
||||
|
||||
# Methods
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func generate_signal_graph() -> SignalGraph:
|
||||
var graph = SignalGraphUtility.create_signal_graph_from_node(get_tree().current_scene)
|
||||
return graph
|
||||
#var signal_graph = SignalGraph.new(get_tree().current_scene.name)
|
||||
#var all_nodes: Array[Node] = _gather_nodes_in_scene()
|
||||
#var signals: Array[SignalDescription] = []
|
||||
#var edges: Array[SignalConnection] = []
|
||||
#
|
||||
#for node in all_nodes:
|
||||
#for signal_item in node.get_signal_list():
|
||||
#var existing_signals = []
|
||||
#var connection_list = node.get_signal_connection_list(signal_item["name"] as String)
|
||||
#if connection_list.size() > 0:
|
||||
#for connection in connection_list:
|
||||
#var should_display_connection = "name" in connection["callable"].get_object() and not connection["callable"].get_object().name.begins_with("@")
|
||||
#if should_display_connection:
|
||||
#var signal_description: SignalDescription
|
||||
#var filtered_signals = existing_signals.filter(func (element): return element.signal_name == signal_item.name and element.node_name == node.name)
|
||||
#if filtered_signals.size() == 1:
|
||||
#signal_description = filtered_signals[0]
|
||||
#else:
|
||||
#signal_description = SignalDescription.new(node.name, signal_item.name)
|
||||
#existing_signals.append(signal_description)
|
||||
#signals.append(signal_description)
|
||||
#
|
||||
#var signal_edge = SignalConnection.new(signal_description.id, signal_description.node_name, connection["callable"].get_object().name, connection["callable"].get_method())
|
||||
#if not signal_graph.edges.any(func (element): return element.signal_id == signal_description.id):
|
||||
#edges.append(signal_edge)
|
||||
#
|
||||
#var temp_signals = {}
|
||||
#for item in signals:
|
||||
#temp_signals[item.id] = item
|
||||
#
|
||||
#var temp_edges = {}
|
||||
#for item in edges:
|
||||
#temp_edges[item.dictionary_key] = item
|
||||
#
|
||||
#signal_graph.signals.assign(temp_signals.keys().map(func (key): return temp_signals[key]))
|
||||
#signal_graph.edges.assign(temp_edges.keys().map(func (key): return temp_edges[key]))
|
||||
#
|
||||
#return signal_graph
|
||||
|
||||
#func _gather_nodes_in_scene() -> Array[Node]:
|
||||
#var scene_root = get_tree().current_scene
|
||||
#var node_list: Array[Node] = [scene_root]
|
||||
#return node_list + _gather_nodes_from_node(scene_root)
|
||||
#
|
||||
#func _gather_nodes_from_node(node: Node) -> Array[Node]:
|
||||
#var nodes: Array[Node] = []
|
||||
#for child in node.get_children(false):
|
||||
#nodes.append(child)
|
||||
#nodes += _gather_nodes_from_node(child)
|
||||
#
|
||||
#return nodes
|
||||
|
||||
func _connect_to_signal(signal_item: SignalDescription):
|
||||
var root_node = get_tree().current_scene
|
||||
var _execute: Callable = func (args = []): _on_signal_execution(signal_item.signal_name, signal_item.node_name, args)
|
||||
if root_node.name == signal_item.node_name:
|
||||
root_node.connect(signal_item.signal_name, _execute)
|
||||
_lambda_map[signal_item] = _execute
|
||||
else:
|
||||
var child = root_node.find_child(signal_item.node_name)
|
||||
if child:
|
||||
child.connect(signal_item.signal_name, _execute)
|
||||
_lambda_map[signal_item] = _execute
|
||||
|
||||
func _disconnect_from_signal(signal_item: SignalDescription):
|
||||
var root_node = get_tree().current_scene
|
||||
if root_node.name == signal_item.node_name:
|
||||
var callable = _lambda_map[signal_item]
|
||||
if callable:
|
||||
root_node.disconnect(signal_item.signal_name, callable)
|
||||
_lambda_map.erase(signal_item)
|
||||
else:
|
||||
var child = root_node.find_child(signal_item.node_name)
|
||||
if child:
|
||||
var callable = _lambda_map[signal_item]
|
||||
if callable:
|
||||
child.disconnect(signal_item.signal_name, callable)
|
||||
_lambda_map.erase(signal_item)
|
||||
@@ -0,0 +1 @@
|
||||
uid://bmsqdh2cnmgw8
|
||||
@@ -0,0 +1,97 @@
|
||||
[gd_scene load_steps=5 format=3 uid="uid://cbsmvov8u78q"]
|
||||
|
||||
[ext_resource type="Script" path="res://addons/SignalVisualizer/Debugger/signal_debugger_panel.gd" id="1_66cpc"]
|
||||
[ext_resource type="Texture2D" uid="uid://be3nwoioa311t" path="res://addons/SignalVisualizer/Play.svg" id="2_2wkuv"]
|
||||
[ext_resource type="Texture2D" uid="uid://oo1oq2colx5b" path="res://addons/SignalVisualizer/Stop.svg" id="3_bg5eu"]
|
||||
[ext_resource type="Texture2D" uid="uid://bmnff63evbdhv" path="res://addons/SignalVisualizer/Clear.svg" id="4_vg63r"]
|
||||
|
||||
[node name="SignalDebugger" type="Control"]
|
||||
clip_contents = true
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("1_66cpc")
|
||||
start_icon = ExtResource("2_2wkuv")
|
||||
stop_icon = ExtResource("3_bg5eu")
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="."]
|
||||
clip_contents = true
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
|
||||
custom_minimum_size = Vector2(2.08165e-12, 50)
|
||||
layout_mode = 2
|
||||
theme_override_constants/separation = 8
|
||||
|
||||
[node name="ActionButton" type="Button" parent="VBoxContainer/HBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
disabled = true
|
||||
text = "Start"
|
||||
icon = ExtResource("2_2wkuv")
|
||||
|
||||
[node name="ClearAllButton" type="Button" parent="VBoxContainer/HBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
text = "Clear All"
|
||||
icon = ExtResource("4_vg63r")
|
||||
|
||||
[node name="Spacer" type="Control" parent="VBoxContainer/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="ClearLogsButton" type="Button" parent="VBoxContainer/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Clear Logs"
|
||||
icon = ExtResource("4_vg63r")
|
||||
|
||||
[node name="HSplitContainer" type="HSplitContainer" parent="VBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="SignalTree" type="Tree" parent="VBoxContainer/HSplitContainer"]
|
||||
unique_name_in_owner = true
|
||||
custom_minimum_size = Vector2(250, 2.08165e-12)
|
||||
layout_mode = 2
|
||||
columns = 2
|
||||
allow_reselect = true
|
||||
allow_rmb_select = true
|
||||
hide_root = true
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HSplitContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="TabBar" type="TabBar" parent="VBoxContainer/HSplitContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
tab_count = 2
|
||||
tab_0/title = "Signal Log"
|
||||
tab_1/title = "Signal Graph"
|
||||
|
||||
[node name="LogLabel" type="RichTextLabel" parent="VBoxContainer/HSplitContainer/VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
theme_override_colors/default_color = Color(0.690196, 0.690196, 0.690196, 1)
|
||||
bbcode_enabled = true
|
||||
scroll_following = true
|
||||
|
||||
[node name="Graph" type="GraphEdit" parent="VBoxContainer/HSplitContainer/VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
|
||||
[connection signal="pressed" from="VBoxContainer/HBoxContainer/ActionButton" to="." method="_on_action_button_pressed"]
|
||||
[connection signal="pressed" from="VBoxContainer/HBoxContainer/ClearAllButton" to="." method="_on_clear_all_button_pressed"]
|
||||
[connection signal="pressed" from="VBoxContainer/HBoxContainer/ClearLogsButton" to="." method="_on_clear_logs_button_pressed"]
|
||||
[connection signal="item_selected" from="VBoxContainer/HSplitContainer/SignalTree" to="." method="_on_signal_tree_item_selected"]
|
||||
[connection signal="tab_changed" from="VBoxContainer/HSplitContainer/VBoxContainer/TabBar" to="." method="_on_tab_bar_tab_changed"]
|
||||
@@ -0,0 +1,192 @@
|
||||
@tool
|
||||
class_name SignalDebuggerPanel extends Control
|
||||
|
||||
signal open_script(node_name: String, method_signature: String)
|
||||
|
||||
signal start_signal_debugging
|
||||
signal stop_signal_debugging
|
||||
|
||||
var SignalGraphNode = preload("res://addons/SignalVisualizer/Visualizer/signal_graph_node.tscn")
|
||||
var GraphNodeItem = preload("res://addons/SignalVisualizer/Visualizer/signal_graph_node_item.tscn")
|
||||
|
||||
const SOURCE_COLOR: Color = Color.SKY_BLUE
|
||||
const DESTINATION_COLOR: Color = Color.CORAL
|
||||
const CONNECTION_TYPE: int = 0
|
||||
|
||||
enum Tabs {
|
||||
LOG,
|
||||
GRAPH
|
||||
}
|
||||
|
||||
# Properties
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
@export var start_icon: Texture2D
|
||||
@export var stop_icon: Texture2D
|
||||
|
||||
@onready var action_button: Button = %ActionButton
|
||||
@onready var clear_all_button: Button = %ClearAllButton
|
||||
@onready var signal_tree: Tree = %SignalTree
|
||||
@onready var log_label: RichTextLabel = %LogLabel
|
||||
@onready var graph_node: GraphEdit = %Graph
|
||||
|
||||
var is_started: bool = false :
|
||||
get: return is_started
|
||||
set(new_value):
|
||||
is_started = new_value
|
||||
_update_action_button()
|
||||
|
||||
var _signals: Array = []
|
||||
var _signal_filter: Array = []
|
||||
var _is_stack_trace_enabled: bool = false
|
||||
var _debugger_tab_state: Tabs = Tabs.LOG
|
||||
var _graph: SignalGraph
|
||||
|
||||
# Lifecycle
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func _ready():
|
||||
disable()
|
||||
_handle_tab_update(0)
|
||||
|
||||
# Signals
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func _on_action_button_pressed():
|
||||
if is_started:
|
||||
stop()
|
||||
else:
|
||||
start()
|
||||
|
||||
func _on_clear_all_button_pressed():
|
||||
log_label.clear()
|
||||
signal_tree.clear()
|
||||
graph_node.clear_connections()
|
||||
for child in graph_node.get_children():
|
||||
if child is SignalGraphNode:
|
||||
child.queue_free()
|
||||
|
||||
func _on_clear_logs_button_pressed():
|
||||
log_label.clear()
|
||||
|
||||
func _on_signal_tree_item_selected():
|
||||
# Updates the checkmark button
|
||||
var selected_item = signal_tree.get_selected()
|
||||
var is_checked = selected_item.is_checked(1)
|
||||
selected_item.set_checked(1, (not is_checked))
|
||||
|
||||
# Add / Remove signal from filters
|
||||
var selected_signal = _signals.filter(func (element): return element.signal_name == selected_item.get_text(0))[0]
|
||||
if _signal_filter.has(selected_signal.signal_name):
|
||||
var selected_index = _signal_filter.find(selected_signal.signal_name)
|
||||
_signal_filter.remove_at(selected_index)
|
||||
else:
|
||||
_signal_filter.append(selected_signal.signal_name)
|
||||
|
||||
func _on_tab_bar_tab_changed(tab: int):
|
||||
_handle_tab_update(tab)
|
||||
|
||||
func _on_stack_trace_button_pressed():
|
||||
_is_stack_trace_enabled = not _is_stack_trace_enabled
|
||||
|
||||
func _on_open_signal_in_script(data: SignalGraphNodeItem.Metadata):
|
||||
open_script.emit(data.node_name, data.method_signature)
|
||||
|
||||
# Methods
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func enable():
|
||||
action_button.disabled = false
|
||||
|
||||
func disable():
|
||||
action_button.disabled = true
|
||||
|
||||
func start():
|
||||
if not is_started:
|
||||
is_started = true
|
||||
action_button.icon = stop_icon
|
||||
start_signal_debugging.emit()
|
||||
log_label.append_text("[color=#B0B0B0]Signal Debugging Started...[/color]")
|
||||
log_label.newline()
|
||||
log_label.newline()
|
||||
|
||||
func stop():
|
||||
if is_started:
|
||||
is_started = false
|
||||
action_button.icon = start_icon
|
||||
stop_signal_debugging.emit()
|
||||
log_label.newline()
|
||||
log_label.append_text("[color=#B0B0B0]Signal Debugging Stopped[/color]")
|
||||
log_label.newline()
|
||||
log_label.newline()
|
||||
|
||||
func create_tree_from_signals(signals: Array):
|
||||
_signals = signals
|
||||
var root = signal_tree.create_item()
|
||||
root.set_text(0, "Signals")
|
||||
|
||||
var tree_items: Dictionary = {}
|
||||
|
||||
for signal_item in signals:
|
||||
var node_tree_item: TreeItem
|
||||
if tree_items.has(signal_item.node_name):
|
||||
node_tree_item = tree_items[signal_item.node_name] as TreeItem
|
||||
else:
|
||||
node_tree_item = signal_tree.create_item(root)
|
||||
node_tree_item.set_text(0, signal_item.node_name)
|
||||
node_tree_item.set_selectable(0, false)
|
||||
node_tree_item.set_selectable(1, false)
|
||||
tree_items[signal_item.node_name] = node_tree_item
|
||||
|
||||
var signal_tree_item = signal_tree.create_item(node_tree_item)
|
||||
signal_tree_item.set_text(0, signal_item.signal_name)
|
||||
signal_tree_item.set_cell_mode(1, TreeItem.CELL_MODE_CHECK)
|
||||
signal_tree_item.set_checked(1, true)
|
||||
signal_tree_item.set_selectable(0, false)
|
||||
signal_tree_item.set_selectable(1, true)
|
||||
|
||||
func create_signal_graph(signals: Array, edges: Array):
|
||||
_graph = SignalGraphUtility.create_signal_graph(get_tree().edited_scene_root.scene_file_path, signals, edges)
|
||||
SignalGraphUtility.generate_signal_graph_nodes(_graph, graph_node, _on_open_signal_in_script)
|
||||
|
||||
func log_signal_execution(time: String, node_name: String, signal_name: String):
|
||||
if _signal_filter != null and _signal_filter.has(signal_name):
|
||||
return
|
||||
|
||||
if not log_label.text.is_empty():
|
||||
log_label.newline()
|
||||
log_label.append_text(
|
||||
"[color=#FFCC00]{time}[/color]\t\t{node_name}\t\t{signal_name}".format({ "time": time, "node_name": node_name, "signal_name": signal_name })
|
||||
)
|
||||
log_label.newline()
|
||||
|
||||
func _handle_tab_update(selected_tab_index: int):
|
||||
match selected_tab_index:
|
||||
1:
|
||||
_debugger_tab_state = Tabs.GRAPH
|
||||
_:
|
||||
_debugger_tab_state = Tabs.LOG
|
||||
|
||||
match _debugger_tab_state:
|
||||
Tabs.LOG:
|
||||
log_label.show()
|
||||
graph_node.hide()
|
||||
Tabs.GRAPH:
|
||||
log_label.hide()
|
||||
graph_node.show()
|
||||
|
||||
func _update_action_button():
|
||||
if is_started:
|
||||
action_button.text = "Stop"
|
||||
action_button.modulate = Color("#ff3b30")
|
||||
else:
|
||||
action_button.text = "Start"
|
||||
action_button.modulate = Color.WHITE
|
||||
@@ -0,0 +1 @@
|
||||
uid://yg8cqm6f1prd
|
||||
@@ -0,0 +1 @@
|
||||
<svg height="24" width="24" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M11 1a1 1 0 0 0-1 1v3a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1zM6.732 5A2 2 0 0 1 7 6v1.117L9.268 6A2 2 0 0 1 9 5V3.883zM2 5a1 1 0 0 0-1 1v4a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1zm5 3.883V10a2 2 0 0 1-.268 1L9 12.117V11a2 2 0 0 1 .268-1zM11 10a1 1 0 0 0-1 1v3a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-3a1 1 0 0 0-1-1z" fill="#8eef97"/></svg>
|
||||
|
After Width: | Height: | Size: 437 B |
@@ -0,0 +1,37 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bxj8ep08wbnm6"
|
||||
path="res://.godot/imported/GraphEdit.svg-90dae61e8e0b157ab8eff95fe4b91e53.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/SignalVisualizer/GraphEdit.svg"
|
||||
dest_files=["res://.godot/imported/GraphEdit.svg-90dae61e8e0b157ab8eff95fe4b91e53.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
@@ -0,0 +1 @@
|
||||
<svg height="24" viewBox="0 0 16 16" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M4 12a1 1 0 0 0 1.555.832l6-4a1 1 0 0 0 0-1.664l-6-4A1 1 0 0 0 4 4z" fill="#e0e0e0"/></svg>
|
||||
|
After Width: | Height: | Size: 184 B |
@@ -0,0 +1,37 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://be3nwoioa311t"
|
||||
path="res://.godot/imported/Play.svg-a446691ffcef211028bb160b5a2d6ff1.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/SignalVisualizer/Play.svg"
|
||||
dest_files=["res://.godot/imported/Play.svg-a446691ffcef211028bb160b5a2d6ff1.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
@@ -0,0 +1,162 @@
|
||||
@tool
|
||||
extends EditorPlugin
|
||||
|
||||
class SignalDebuggerPlugin extends EditorDebuggerPlugin:
|
||||
var SignalDebuggerPanelScene = preload("res://addons/SignalVisualizer/Debugger/SignalDebugger.tscn")
|
||||
|
||||
signal open_script
|
||||
signal start_signal_debugging
|
||||
signal stop_signal_debugging
|
||||
|
||||
var debugger_panel
|
||||
|
||||
func _has_capture(prefix) -> bool:
|
||||
return prefix == "signal_debugger"
|
||||
|
||||
func _capture(message, data, session_id) -> bool:
|
||||
if message == "signal_debugger:signal_executed":
|
||||
if data.size() == 3:
|
||||
var time = data[0]
|
||||
var node_name = data[1]
|
||||
var signal_name = data[2]
|
||||
debugger_panel.log_signal_execution(time, node_name, signal_name)
|
||||
return true
|
||||
|
||||
if message == "signal_debugger:generated_graph":
|
||||
if data.size() == 1:
|
||||
var signals = data[0][0] as Array
|
||||
var edges = data[0][1] as Array
|
||||
debugger_panel.create_tree_from_signals(signals)
|
||||
debugger_panel.create_signal_graph(signals, edges)
|
||||
return true
|
||||
|
||||
return false
|
||||
|
||||
func _setup_session(session_id):
|
||||
debugger_panel = SignalDebuggerPanelScene.instantiate()
|
||||
var session = get_session(session_id)
|
||||
|
||||
debugger_panel.name = "Signal Debugger"
|
||||
debugger_panel.open_script.connect(func (arg1, arg2): open_script.emit(arg1, arg2))
|
||||
debugger_panel.start_signal_debugging.connect(func (): start_signal_debugging.emit())
|
||||
debugger_panel.stop_signal_debugging.connect(func (): stop_signal_debugging.emit())
|
||||
|
||||
session.started.connect(
|
||||
func ():
|
||||
debugger_panel.enable()
|
||||
)
|
||||
session.stopped.connect(
|
||||
func ():
|
||||
debugger_panel.stop()
|
||||
debugger_panel.disable()
|
||||
stop_signal_debugging.emit()
|
||||
)
|
||||
|
||||
session.add_session_tab(debugger_panel)
|
||||
|
||||
var SignalVisualizerDockScene = preload("res://addons/SignalVisualizer/Visualizer/signal_visualizer_dock.tscn")
|
||||
|
||||
class ScriptMethodReference:
|
||||
var script_reference: Script
|
||||
var line_number: int
|
||||
|
||||
# Properties
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
var dock: Control
|
||||
var debugger: SignalDebuggerPlugin
|
||||
|
||||
# Lifecycle
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func _enter_tree():
|
||||
dock = SignalVisualizerDockScene.instantiate()
|
||||
debugger = SignalDebuggerPlugin.new()
|
||||
|
||||
dock.open_script.connect(_on_open_signal_in_script)
|
||||
add_control_to_bottom_panel(dock, "Signal Visualizer")
|
||||
|
||||
debugger.start_signal_debugging.connect(_on_debugger_start_signal_debugging)
|
||||
debugger.stop_signal_debugging.connect(_on_debugger_stop_signal_debugging)
|
||||
debugger.open_script.connect(_on_open_signal_in_script)
|
||||
add_debugger_plugin(debugger)
|
||||
|
||||
if not ProjectSettings.has_setting("autoload/Signal_Debugger"):
|
||||
add_autoload_singleton("Signal_Debugger", "res://addons/SignalVisualizer/Debugger/SignalDebugger.gd")
|
||||
|
||||
func _exit_tree():
|
||||
remove_control_from_bottom_panel(dock)
|
||||
dock.free()
|
||||
|
||||
remove_debugger_plugin(debugger)
|
||||
remove_autoload_singleton("Signal_Debugger")
|
||||
|
||||
# Signals
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func _on_open_signal_in_script(node_name: String, method_signature: String):
|
||||
var node: Node
|
||||
if get_tree().edited_scene_root.name == node_name:
|
||||
node = get_tree().edited_scene_root
|
||||
else:
|
||||
node = get_tree().edited_scene_root.find_child(node_name)
|
||||
|
||||
if node != null:
|
||||
var script: Script = node.get_script()
|
||||
if script != null:
|
||||
var editor = get_editor_interface()
|
||||
var method_reference = _find_method_reference_in_script(script, method_signature)
|
||||
|
||||
if method_reference != null:
|
||||
editor.edit_script(method_reference.script_reference, method_reference.line_number, 0)
|
||||
editor.set_main_screen_editor("Script")
|
||||
else:
|
||||
push_warning("Requested method in script ({script}) for node ({name}) is not available.".format({ "name": node_name, "script": script.name }))
|
||||
else:
|
||||
push_warning("Requested script for node ({name}) is not available.".format({ "name": node_name }))
|
||||
else:
|
||||
push_warning("Requested script for node ({name}) is not available.".format({ "name": node_name }))
|
||||
|
||||
func _on_debugger_start_signal_debugging():
|
||||
for session in debugger.get_sessions():
|
||||
session.send_message("signal_debugger:start", [])
|
||||
|
||||
func _on_debugger_stop_signal_debugging():
|
||||
for session in debugger.get_sessions():
|
||||
session.send_message("signal_debugger:stop", [])
|
||||
|
||||
# Methods
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func _find_method_reference_in_script(script: Script, method_signature: String) -> ScriptMethodReference:
|
||||
var line_number = __find_method_line_number_in_script(script, method_signature)
|
||||
|
||||
if line_number == -1:
|
||||
var base_script = script.get_base_script()
|
||||
if base_script:
|
||||
return _find_method_reference_in_script(base_script, method_signature)
|
||||
|
||||
var reference = ScriptMethodReference.new()
|
||||
reference.script_reference = script
|
||||
reference.line_number = line_number
|
||||
|
||||
return reference
|
||||
|
||||
func __find_method_line_number_in_script(script: Script, method_signature: String) -> int:
|
||||
var line_number = 0
|
||||
var found = false
|
||||
for line in script.source_code.split("\n", true):
|
||||
line_number += 1
|
||||
if line.contains(method_signature):
|
||||
found = true
|
||||
return line_number
|
||||
|
||||
return -1
|
||||
@@ -0,0 +1 @@
|
||||
uid://43lcsn3nt3ri
|
||||
@@ -0,0 +1 @@
|
||||
<svg height="24" viewBox="0 0 16 16" width="24" xmlns="http://www.w3.org/2000/svg"><rect x="3" y="3" height="10" width="10" rx="1" fill="#e0e0e0"/></svg>
|
||||
|
After Width: | Height: | Size: 154 B |
@@ -0,0 +1,37 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://oo1oq2colx5b"
|
||||
path="res://.godot/imported/Stop.svg-e085086fb31c334bc2f02ca2bffba522.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/SignalVisualizer/Stop.svg"
|
||||
dest_files=["res://.godot/imported/Stop.svg-e085086fb31c334bc2f02ca2bffba522.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
@@ -0,0 +1,31 @@
|
||||
@tool
|
||||
extends Label
|
||||
|
||||
# Properties
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
|
||||
|
||||
# Lifecycle
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
|
||||
|
||||
# Signals
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
|
||||
|
||||
# Methods
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func get_text_size() -> Vector2:
|
||||
return get_theme_default_font().get_string_size(text)
|
||||
@@ -0,0 +1 @@
|
||||
uid://d3lyqancfvwup
|
||||
@@ -0,0 +1,94 @@
|
||||
@tool
|
||||
class_name SignalGraphNode extends GraphNode
|
||||
|
||||
# Properties
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
var connections: Array = [] :
|
||||
get: return connections
|
||||
set(new_value):
|
||||
connections = new_value
|
||||
|
||||
# Lifecycle
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func _ready():
|
||||
selectable = true
|
||||
resizable = true
|
||||
draggable = true
|
||||
|
||||
# Signals
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func _on_resize_request(new_minsize):
|
||||
size = new_minsize
|
||||
|
||||
# Methods
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func has_source_signal_description(signal_name: String, destination_node_name: String) -> bool:
|
||||
for child in get_children():
|
||||
if child.name == "source_" + signal_name + "_" + destination_node_name:
|
||||
return true
|
||||
|
||||
return false
|
||||
|
||||
func get_source_slot(signal_name: String, destination_node_name: String) -> int:
|
||||
var index = 0
|
||||
for child in get_children():
|
||||
if child.name == "source_" + signal_name + "_" + destination_node_name:
|
||||
return index
|
||||
|
||||
index += 1
|
||||
|
||||
return -1
|
||||
|
||||
func get_next_source_slot(signal_name: String, destination_node_name: String) -> int:
|
||||
var index = 0
|
||||
for child in get_children():
|
||||
if child.name.begins_with("source_"):
|
||||
if child.name == "source_" + signal_name + "_" + destination_node_name:
|
||||
return index
|
||||
|
||||
index += 1
|
||||
|
||||
return -1
|
||||
|
||||
func has_destination_signal_description(signal_name: String, method_signature: String) -> bool:
|
||||
for child in get_children():
|
||||
if child.name == "destination_" + signal_name + "_" + _sanitize_method_signature(method_signature):
|
||||
return true
|
||||
|
||||
return false
|
||||
|
||||
func get_destination_slot(signal_name: String, method_signature: String) -> int:
|
||||
var index = 0
|
||||
for child in get_children():
|
||||
if child.name == "destination_" + signal_name + "_" + _sanitize_method_signature(method_signature):
|
||||
return index
|
||||
|
||||
index += 1
|
||||
|
||||
return -1
|
||||
|
||||
func get_next_destination_slot(signal_name: String, method_signature: String) -> int:
|
||||
var index = 0
|
||||
for child in get_children():
|
||||
if child.name.begins_with("destination_"):
|
||||
if child.name == "destination_" + signal_name + "_" + _sanitize_method_signature(method_signature):
|
||||
return index
|
||||
|
||||
index += 1
|
||||
|
||||
return -1
|
||||
|
||||
func _sanitize_method_signature(signature: String) -> String:
|
||||
return signature.replace("::", "__")
|
||||
@@ -0,0 +1 @@
|
||||
uid://bdwkkgkhgfrtk
|
||||
@@ -0,0 +1,12 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://cq10iaub18e54"]
|
||||
|
||||
[ext_resource type="Script" path="res://addons/SignalVisualizer/Visualizer/signal_graph_node.gd" id="1_ovklj"]
|
||||
|
||||
[node name="SignalGraphNode" type="GraphNode"]
|
||||
custom_minimum_size = Vector2(100, 50)
|
||||
offset_right = 232.0
|
||||
offset_bottom = 54.0
|
||||
resizable = true
|
||||
script = ExtResource("1_ovklj")
|
||||
|
||||
[connection signal="resize_request" from="." to="." method="_on_resize_request"]
|
||||
@@ -0,0 +1,57 @@
|
||||
@tool
|
||||
class_name SignalGraphNodeItem extends Control
|
||||
|
||||
signal open_script(metadata: SignalGraphNodeItem.Metadata)
|
||||
|
||||
class Metadata:
|
||||
var signal_name: String
|
||||
var method_signature: String
|
||||
var node_name: String
|
||||
|
||||
func _init(signal_name: String, method_signature: String, node_name: String):
|
||||
self.signal_name = signal_name
|
||||
self.method_signature = method_signature
|
||||
self.node_name = node_name
|
||||
|
||||
# Properties
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
@onready var label: Label = %DescriptionLabel
|
||||
|
||||
var signal_data: Metadata = null
|
||||
|
||||
var text: String = "" :
|
||||
get: return text
|
||||
set(new_value):
|
||||
text = new_value
|
||||
if label:
|
||||
label.text = text
|
||||
|
||||
# Lifecycle
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func _ready():
|
||||
_update()
|
||||
|
||||
# Signals
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func _on_open_signal_in_script_button_pressed():
|
||||
open_script.emit(signal_data)
|
||||
|
||||
# Methods
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func _update():
|
||||
label.text = text
|
||||
|
||||
var text_size = label.get_text_size()
|
||||
custom_minimum_size = Vector2((text_size.x * 2) + 50, text_size.y * 3)
|
||||
@@ -0,0 +1 @@
|
||||
uid://c0n3sifmbiih0
|
||||
@@ -0,0 +1,43 @@
|
||||
[gd_scene load_steps=3 format=3 uid="uid://b2lwtwp6kpwtb"]
|
||||
|
||||
[ext_resource type="Script" path="res://addons/SignalVisualizer/Visualizer/signal_graph_node_item.gd" id="1_jrd34"]
|
||||
[ext_resource type="Script" path="res://addons/SignalVisualizer/Visualizer/resizable_label.gd" id="2_4wwd5"]
|
||||
|
||||
[node name="SignalItem" type="Control"]
|
||||
clip_contents = true
|
||||
custom_minimum_size = Vector2(51, 23)
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
script = ExtResource("1_jrd34")
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="."]
|
||||
custom_minimum_size = Vector2(100, 50)
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="DescriptionLabel" type="Label" parent="HBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
custom_minimum_size = Vector2(100, 50)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 1
|
||||
vertical_alignment = 1
|
||||
clip_text = true
|
||||
script = ExtResource("2_4wwd5")
|
||||
|
||||
[node name="OpenSignalInScriptButton" type="Button" parent="HBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Open"
|
||||
flat = true
|
||||
|
||||
[connection signal="pressed" from="HBoxContainer/OpenSignalInScriptButton" to="." method="_on_open_signal_in_script_button_pressed"]
|
||||
@@ -0,0 +1,67 @@
|
||||
@tool
|
||||
extends Control
|
||||
|
||||
signal open_script(node_name: String, method_signature: String)
|
||||
|
||||
var SignalGraphNode = preload("res://addons/SignalVisualizer/Visualizer/signal_graph_node.tscn")
|
||||
var GraphNodeItem = preload("res://addons/SignalVisualizer/Visualizer/signal_graph_node_item.tscn")
|
||||
|
||||
# Properties
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
const SOURCE_COLOR: Color = Color.SKY_BLUE
|
||||
const DESTINATION_COLOR: Color = Color.CORAL
|
||||
const CONNECTION_TYPE: int = 0
|
||||
|
||||
@onready var arrange_nodes_checkbox: CheckBox = %ArrangeNodesCheckBox
|
||||
@onready var signal_details_checkbox: CheckBox = %SignalDetailsCheckBox
|
||||
@onready var signal_tree: Tree = %SignalTree
|
||||
@onready var graph: GraphEdit = %Graph
|
||||
|
||||
# Lifecycle
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
|
||||
|
||||
# Signals
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func _on_clear_graph_button_pressed():
|
||||
clear()
|
||||
|
||||
func _on_generate_graph_button_pressed():
|
||||
clear()
|
||||
|
||||
var scene_signal_graph = SignalGraphUtility.create_signal_graph_from_node(get_tree().edited_scene_root, true)
|
||||
SignalGraphUtility.generate_signal_graph_nodes(scene_signal_graph, graph, _on_open_signal_in_script)
|
||||
SignalGraphUtility.generate_signal_graph_tree(scene_signal_graph, signal_tree)
|
||||
|
||||
if arrange_nodes_checkbox.button_pressed:
|
||||
graph.arrange_nodes()
|
||||
|
||||
func _on_open_signal_in_script(data: SignalGraphNodeItem.Metadata):
|
||||
open_script.emit(data.node_name, data.method_signature)
|
||||
|
||||
# Methods
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
# |===================================|
|
||||
|
||||
func clear():
|
||||
_clear_graph_nodes()
|
||||
_clear_tree()
|
||||
|
||||
func _clear_graph_nodes():
|
||||
graph.clear_connections()
|
||||
for child in graph.get_children():
|
||||
if child is SignalGraphNode:
|
||||
child.queue_free()
|
||||
|
||||
func _clear_tree():
|
||||
signal_tree.clear()
|
||||
@@ -0,0 +1 @@
|
||||
uid://bbd48wbihmuos
|
||||
@@ -0,0 +1,78 @@
|
||||
[gd_scene load_steps=5 format=3 uid="uid://dppfamjc0ji40"]
|
||||
|
||||
[ext_resource type="Script" path="res://addons/SignalVisualizer/Visualizer/signal_visualizer_dock.gd" id="1_akar5"]
|
||||
[ext_resource type="Texture2D" uid="uid://bmnff63evbdhv" path="res://addons/SignalVisualizer/Clear.svg" id="2_m8bsv"]
|
||||
[ext_resource type="Texture2D" uid="uid://bxj8ep08wbnm6" path="res://addons/SignalVisualizer/GraphEdit.svg" id="3_dtmqs"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ae0jg"]
|
||||
|
||||
[node name="SignalVisualizerDock" type="Control"]
|
||||
clip_contents = true
|
||||
custom_minimum_size = Vector2(2.08165e-12, 200)
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("1_akar5")
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="."]
|
||||
clip_contents = true
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
|
||||
clip_contents = true
|
||||
custom_minimum_size = Vector2(2.08165e-12, 50)
|
||||
layout_mode = 2
|
||||
theme_override_constants/separation = 8
|
||||
alignment = 2
|
||||
|
||||
[node name="ArrangeNodesCheckBox" type="CheckBox" parent="VBoxContainer/HBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
text = "Arrange Nodes"
|
||||
|
||||
[node name="SignalDetailsCheckBox" type="CheckBox" parent="VBoxContainer/HBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
text = "Signal Details"
|
||||
|
||||
[node name="Panel" type="Panel" parent="VBoxContainer/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
theme_override_styles/panel = SubResource("StyleBoxEmpty_ae0jg")
|
||||
|
||||
[node name="ClearGraphButton" type="Button" parent="VBoxContainer/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Clear Graph"
|
||||
icon = ExtResource("2_m8bsv")
|
||||
|
||||
[node name="GenerateGraphButton" type="Button" parent="VBoxContainer/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Generate Graph"
|
||||
icon = ExtResource("3_dtmqs")
|
||||
|
||||
[node name="HSplitContainer" type="HSplitContainer" parent="VBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="SignalTree" type="Tree" parent="VBoxContainer/HSplitContainer"]
|
||||
unique_name_in_owner = true
|
||||
custom_minimum_size = Vector2(200, 2.08165e-12)
|
||||
layout_mode = 2
|
||||
column_titles_visible = true
|
||||
|
||||
[node name="Graph" type="GraphEdit" parent="VBoxContainer/HSplitContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
|
||||
[connection signal="pressed" from="VBoxContainer/HBoxContainer/ClearGraphButton" to="." method="_on_clear_graph_button_pressed"]
|
||||
[connection signal="pressed" from="VBoxContainer/HBoxContainer/GenerateGraphButton" to="." method="_on_generate_graph_button_pressed"]
|
||||
@@ -0,0 +1,7 @@
|
||||
[plugin]
|
||||
|
||||
name="SignalVisualizer"
|
||||
description="Visual the current scene's signal connections as a graph. Debug the current running scene's signals with automatic logging in a new debugger panel."
|
||||
author="MiniGameDev"
|
||||
version="1.7.0"
|
||||
script="SignalVisualizer.gd"
|
||||
@@ -0,0 +1,22 @@
|
||||
@tool
|
||||
extends EditorPlugin
|
||||
|
||||
|
||||
func _enter_tree() -> void:
|
||||
if !ProjectSettings.has_setting("babushka/hacks/speed_hack"):
|
||||
ProjectSettings.set_setting("babushka/hacks/speed_hack",-1)
|
||||
|
||||
var property_info = {
|
||||
"name": "babushka/hacks/speed_hack",
|
||||
"type": TYPE_FLOAT,
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "-1,20,0.5"
|
||||
}
|
||||
|
||||
ProjectSettings.add_property_info(property_info)
|
||||
ProjectSettings.set_initial_value("babushka/hacks/speed_hack",-1)
|
||||
|
||||
|
||||
func _exit_tree() -> void:
|
||||
# Clean-up of the plugin goes here.
|
||||
pass
|
||||
@@ -0,0 +1 @@
|
||||
uid://buwfplh0xji8q
|
||||
@@ -0,0 +1,7 @@
|
||||
[plugin]
|
||||
|
||||
name="BabushkaHelpers"
|
||||
description=""
|
||||
author="Cozy Raven"
|
||||
version=""
|
||||
script="babushkahelpers.gd"
|
||||
@@ -21,5 +21,5 @@ anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
mouse_filter = 2
|
||||
color = Color(1, 1, 1, 0)
|
||||
color = Color(0, 0, 0, 0.658824)
|
||||
script = ExtResource("2_ghan2")
|
||||
|
||||
@@ -10,3 +10,4 @@ corner_radius_top_left = 5
|
||||
corner_radius_top_right = 5
|
||||
corner_radius_bottom_right = 5
|
||||
corner_radius_bottom_left = 5
|
||||
shadow_color = Color(0, 0, 0, 0.772549)
|
||||
|
||||
@@ -95,6 +95,8 @@ func _make_visible(visible:bool) -> void:
|
||||
func _save_external_data() -> void:
|
||||
if _editor_view_and_manager_exist():
|
||||
editor_view.editors_manager.save_current_resource()
|
||||
|
||||
DialogicResourceUtil.update_directory('.tres')
|
||||
|
||||
|
||||
func _get_unsaved_status(for_scene:String) -> String:
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
@tool
|
||||
extends DialogicEvent
|
||||
class_name DialogicQuestActivateEvent
|
||||
|
||||
|
||||
# Define properties of the event here
|
||||
var quest_resource: String
|
||||
|
||||
func _execute() -> void:
|
||||
var resource = ResourceLoader.load(quest_resource)
|
||||
QuestManager.ChangeQuestStatus(resource,QuestEventUtils.QuestStatus.AVAILABLE)
|
||||
QuestManager.SetActiveQuest(resource)
|
||||
finish() # called to continue with the next event
|
||||
|
||||
|
||||
#region INITIALIZE
|
||||
################################################################################
|
||||
# Set fixed settings of this event
|
||||
func _init() -> void:
|
||||
event_name = "Activate Quest"
|
||||
event_category = "Quest"
|
||||
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region SAVING/LOADING
|
||||
################################################################################
|
||||
func get_shortcode() -> String:
|
||||
return "quest_activate"
|
||||
|
||||
func get_shortcode_parameters() -> Dictionary:
|
||||
return {
|
||||
#param_name : property_info
|
||||
"quest_resource" : {"property": "quest_resource", "default": ""},
|
||||
}
|
||||
|
||||
# You can alternatively overwrite these 3 functions: to_text(), from_text(), is_valid_event()
|
||||
#endregion
|
||||
|
||||
|
||||
#region EDITOR REPRESENTATION
|
||||
################################################################################
|
||||
|
||||
func build_event_editor() -> void:
|
||||
add_header_label("Activate Quest")
|
||||
add_header_edit(
|
||||
"quest_resource",
|
||||
ValueType.DYNAMIC_OPTIONS,
|
||||
{
|
||||
"mode":2,
|
||||
"suggestions_func":QuestEventUtils.quest_resource_suggestrions
|
||||
})
|
||||
|
||||
#endregion
|
||||
@@ -0,0 +1 @@
|
||||
uid://br3a7napsjmg3
|
||||
@@ -0,0 +1,55 @@
|
||||
@tool
|
||||
extends DialogicEvent
|
||||
class_name DialogicQuestCompleteEvent
|
||||
|
||||
|
||||
# Define properties of the event here
|
||||
var quest_resource: String
|
||||
|
||||
func _execute() -> void:
|
||||
var resource = ResourceLoader.load(quest_resource)
|
||||
QuestManager.ChangeQuestStatus(resource,QuestEventUtils.QuestStatus.DONE)
|
||||
QuestManager.SetActiveQuest(null)
|
||||
finish() # called to continue with the next event
|
||||
|
||||
|
||||
#region INITIALIZE
|
||||
################################################################################
|
||||
# Set fixed settings of this event
|
||||
func _init() -> void:
|
||||
event_name = "Complete Quest"
|
||||
event_category = "Quest"
|
||||
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region SAVING/LOADING
|
||||
################################################################################
|
||||
func get_shortcode() -> String:
|
||||
return "quest_complete"
|
||||
|
||||
func get_shortcode_parameters() -> Dictionary:
|
||||
return {
|
||||
#param_name : property_info
|
||||
"quest_resource" : {"property": "quest_resource", "default": ""},
|
||||
}
|
||||
|
||||
# You can alternatively overwrite these 3 functions: to_text(), from_text(), is_valid_event()
|
||||
#endregion
|
||||
|
||||
|
||||
#region EDITOR REPRESENTATION
|
||||
################################################################################
|
||||
|
||||
func build_event_editor() -> void:
|
||||
add_header_label("Complete Quest")
|
||||
add_header_edit(
|
||||
"quest_resource",
|
||||
ValueType.DYNAMIC_OPTIONS,
|
||||
{
|
||||
"mode":2,
|
||||
"suggestions_func":QuestEventUtils.quest_resource_suggestrions
|
||||
})
|
||||
|
||||
#endregion
|
||||
@@ -0,0 +1 @@
|
||||
uid://c8mtjwpe7c0h
|
||||
@@ -0,0 +1,163 @@
|
||||
@tool
|
||||
extends DialogicEvent
|
||||
class_name DialogicQuestConditionEvent
|
||||
|
||||
## Event that allows branching a timeline based on a condition.
|
||||
|
||||
#enum ConditionTypes {IF, ELIF, ELSE}
|
||||
|
||||
### Settings
|
||||
## condition type (see [ConditionTypes]). Defaults to if.
|
||||
#var condition_type := ConditionTypes.IF
|
||||
## The condition as a string. Will be executed as an Expression.
|
||||
#var condition := ""
|
||||
var quest_resource: String
|
||||
var compare_status: QuestEventUtils.QuestStatusOrActive
|
||||
|
||||
################################################################################
|
||||
## EXECUTE
|
||||
################################################################################
|
||||
|
||||
func _execute() -> void:
|
||||
var resource = ResourceLoader.load(quest_resource)
|
||||
|
||||
var result: bool
|
||||
if compare_status == QuestEventUtils.QuestStatusOrActive.ACTIVE:
|
||||
result = QuestManager.GetActiveQuest() == resource
|
||||
elif compare_status == QuestEventUtils.QuestStatusOrActive.NOT_ACTIVE:
|
||||
result = QuestManager.GetActiveQuest() != resource
|
||||
else:
|
||||
result = QuestManager.GetQuestStatus(resource).status == compare_status
|
||||
|
||||
if not result:
|
||||
var idx: int = dialogic.current_event_idx
|
||||
var ignore := 1
|
||||
while true:
|
||||
idx += 1
|
||||
if not dialogic.current_timeline.get_event(idx) or ignore == 0:
|
||||
break
|
||||
elif dialogic.current_timeline.get_event(idx).can_contain_events:
|
||||
ignore += 1
|
||||
elif dialogic.current_timeline.get_event(idx) is DialogicEndBranchEvent:
|
||||
ignore -= 1
|
||||
|
||||
dialogic.current_event_idx = idx-1
|
||||
finish()
|
||||
|
||||
|
||||
## only called if the previous event was an end-branch event
|
||||
## return true if this event should be executed if the previous event was an end-branch event
|
||||
func should_execute_this_branch() -> bool:
|
||||
return true
|
||||
|
||||
|
||||
################################################################################
|
||||
## INITIALIZE
|
||||
################################################################################
|
||||
|
||||
func _init() -> void:
|
||||
event_name = "Quest Condition"
|
||||
set_default_color('Color3')
|
||||
event_category = "Quest"
|
||||
event_sorting_index = 1
|
||||
can_contain_events = true
|
||||
|
||||
|
||||
# return a control node that should show on the END BRANCH node
|
||||
func get_end_branch_control() -> Control:
|
||||
return load(get_script().resource_path.get_base_dir().path_join('ui_quest_condition_end.tscn')).instantiate()
|
||||
|
||||
################################################################################
|
||||
## SAVING/LOADING
|
||||
################################################################################
|
||||
|
||||
func to_text() -> String:
|
||||
return 'ifquest ' + quest_resource + ', ' + str(compare_status) + ':'
|
||||
|
||||
|
||||
func from_text(string:String) -> void:
|
||||
#if string.strip_edges().begins_with('if'):
|
||||
# condition = string.strip_edges().trim_prefix('if ').trim_suffix(':').strip_edges()
|
||||
# condition_type = ConditionTypes.IF
|
||||
var strings:Array[String]
|
||||
strings.assign(string.strip_edges().trim_prefix('ifquest ').trim_suffix(':').strip_edges().split(','))
|
||||
quest_resource = strings[0].strip_edges()
|
||||
var compare_string: String = strings[1].strip_edges()
|
||||
if compare_string.is_valid_int():
|
||||
compare_status = compare_string.to_int()
|
||||
else:
|
||||
compare_status = QuestEventUtils.QuestStatusOrActive.get(compare_string)
|
||||
|
||||
|
||||
func is_valid_event(string:String) -> bool:
|
||||
if string.strip_edges().begins_with('ifquest '):
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
################################################################################
|
||||
## EDITOR REPRESENTATION
|
||||
################################################################################
|
||||
|
||||
func build_event_editor() -> void:
|
||||
add_header_label("IF")
|
||||
add_header_edit(
|
||||
"quest_resource",
|
||||
ValueType.DYNAMIC_OPTIONS,
|
||||
{
|
||||
"mode":2,
|
||||
"suggestions_func":QuestEventUtils.quest_resource_suggestrions
|
||||
})
|
||||
add_header_label("IS")
|
||||
add_header_edit("compare_status",ValueType.FIXED_OPTIONS,{
|
||||
'options': [
|
||||
{
|
||||
'label': 'HIDDEN',
|
||||
'value': QuestEventUtils.QuestStatusOrActive.HIDDEN,
|
||||
},
|
||||
{
|
||||
'label': 'AVAILABLE',
|
||||
'value': QuestEventUtils.QuestStatusOrActive.AVAILABLE,
|
||||
},
|
||||
{
|
||||
'label': 'DONE',
|
||||
'value': QuestEventUtils.QuestStatusOrActive.DONE,
|
||||
},
|
||||
{
|
||||
'label': 'CANCLED',
|
||||
'value': QuestEventUtils.QuestStatusOrActive.CANCLED,
|
||||
},
|
||||
{
|
||||
'label': 'ACTIVE',
|
||||
'value': QuestEventUtils.QuestStatusOrActive.ACTIVE,
|
||||
},
|
||||
{
|
||||
'label': 'NOT_ACTIVE',
|
||||
'value': QuestEventUtils.QuestStatusOrActive.NOT_ACTIVE,
|
||||
}
|
||||
]})
|
||||
|
||||
func _get_icon() -> Resource:
|
||||
return load("res://addons/dialogic/Modules/Condition/icon.svg")
|
||||
|
||||
####################### CODE COMPLETION ########################################
|
||||
################################################################################
|
||||
|
||||
func _get_code_completion(CodeCompletionHelper:Node, TextNode:TextEdit, line:String, _word:String, symbol:String) -> void:
|
||||
pass
|
||||
|
||||
|
||||
func _get_start_code_completion(_CodeCompletionHelper:Node, TextNode:TextEdit) -> void:
|
||||
TextNode.add_code_completion_option(CodeEdit.KIND_PLAIN_TEXT, 'ifquest', 'ifquest ', TextNode.syntax_highlighter.code_flow_color)
|
||||
|
||||
|
||||
#################### SYNTAX HIGHLIGHTING #######################################
|
||||
################################################################################
|
||||
|
||||
|
||||
func _get_syntax_highlighting(Highlighter:SyntaxHighlighter, dict:Dictionary, line:String) -> Dictionary:
|
||||
var word := line.get_slice(' ', 0)
|
||||
dict[line.find(word)] = {"color":Highlighter.code_flow_color}
|
||||
dict[line.find(word)+len(word)] = {"color":Highlighter.normal_color}
|
||||
dict = Highlighter.color_condition(dict, line)
|
||||
return dict
|
||||
@@ -0,0 +1 @@
|
||||
uid://b2ggc2f5kh61j
|
||||
@@ -0,0 +1,43 @@
|
||||
@tool
|
||||
class_name QuestEventUtils
|
||||
|
||||
enum QuestStatus{
|
||||
HIDDEN = 0,
|
||||
AVAILABLE = 1,
|
||||
DONE = 2,
|
||||
CANCLED = 3
|
||||
}
|
||||
|
||||
enum QuestStatusOrActive{
|
||||
HIDDEN = 0,
|
||||
AVAILABLE = 1,
|
||||
DONE = 2,
|
||||
CANCLED = 3,
|
||||
ACTIVE = 4,
|
||||
NOT_ACTIVE = 5
|
||||
}
|
||||
|
||||
|
||||
static func quest_resource_suggestrions(search_text:String) -> Dictionary:
|
||||
var ret_val = {}
|
||||
var quest_paths = get_all_file_paths("res://resources/quests")
|
||||
|
||||
for path in quest_paths:
|
||||
var res = ResourceLoader.load(path)
|
||||
ret_val[res.id]= {"value":path, "tooltip":res.title + "\n\n" + res.description}
|
||||
|
||||
return ret_val
|
||||
|
||||
static func get_all_file_paths(path: String) -> Array[String]:
|
||||
var file_paths: Array[String] = []
|
||||
var dir = DirAccess.open(path)
|
||||
dir.list_dir_begin()
|
||||
var file_name = dir.get_next()
|
||||
while file_name != "":
|
||||
var file_path = path + "/" + file_name
|
||||
if dir.current_is_dir():
|
||||
file_paths += get_all_file_paths(file_path)
|
||||
else:
|
||||
file_paths.append(file_path)
|
||||
file_name = dir.get_next()
|
||||
return file_paths
|
||||
@@ -0,0 +1 @@
|
||||
uid://d1x2343wpkdku
|
||||
@@ -0,0 +1,9 @@
|
||||
@tool
|
||||
extends DialogicIndexer
|
||||
|
||||
func _get_events() -> Array:
|
||||
return [
|
||||
this_folder.path_join('event_quest_activate.gd'),
|
||||
this_folder.path_join('event_quest_complete.gd'),
|
||||
this_folder.path_join('event_quest_condition.gd')
|
||||
]
|
||||
@@ -0,0 +1 @@
|
||||
uid://wup1fvm05rqv
|
||||
@@ -0,0 +1,51 @@
|
||||
@tool
|
||||
extends HBoxContainer
|
||||
|
||||
var parent_resource: DialogicEvent = null
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
$AddElif.button_up.connect(add_elif)
|
||||
$AddElse.button_up.connect(add_else)
|
||||
|
||||
|
||||
func refresh() -> void:
|
||||
if parent_resource is DialogicQuestConditionEvent:
|
||||
# hide add elif and add else button on ELSE event
|
||||
$AddElif.visible = false# parent_resource.condition_type != DialogicConditionEvent.ConditionTypes.ELSE
|
||||
$AddElse.visible = true# parent_resource.condition_type != DialogicConditionEvent.ConditionTypes.ELSE
|
||||
$Label.text = "End of If Quest" #"End of "+["IF", "ELIF", "ELSE"][parent_resource.condition_type]+" ("+parent_resource.condition+")"
|
||||
|
||||
# hide add add else button if followed by ELIF or ELSE event
|
||||
var timeline_editor := find_parent('VisualEditor')
|
||||
if timeline_editor:
|
||||
var next_event: DialogicEvent = null
|
||||
if timeline_editor.get_block_below(get_parent()):
|
||||
next_event = timeline_editor.get_block_below(get_parent()).resource
|
||||
if next_event is DialogicConditionEvent:
|
||||
if next_event.condition_type != DialogicConditionEvent.ConditionTypes.IF:
|
||||
$AddElse.hide()
|
||||
#if parent_resource.condition_type == DialogicConditionEvent.ConditionTypes.ELSE:
|
||||
# $Label.text = "End of ELSE"
|
||||
else:
|
||||
hide()
|
||||
|
||||
|
||||
func add_elif() -> void:
|
||||
var timeline := find_parent('VisualEditor')
|
||||
if timeline:
|
||||
var resource := DialogicConditionEvent.new()
|
||||
resource.condition_type = DialogicConditionEvent.ConditionTypes.ELIF
|
||||
timeline.add_event_undoable(resource, get_parent().get_index()+1)
|
||||
timeline.indent_events()
|
||||
timeline.something_changed()
|
||||
|
||||
|
||||
func add_else() -> void:
|
||||
var timeline := find_parent('VisualEditor')
|
||||
if timeline:
|
||||
var resource := DialogicConditionEvent.new()
|
||||
resource.condition_type = DialogicConditionEvent.ConditionTypes.ELSE
|
||||
timeline.add_event_undoable(resource, get_parent().get_index()+1)
|
||||
timeline.indent_events()
|
||||
timeline.something_changed()
|
||||
@@ -0,0 +1 @@
|
||||
uid://dlrnhnnonum4o
|
||||
@@ -0,0 +1,20 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://dnrpcgjkyoiau"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dlrnhnnonum4o" path="res://addons/dialogic_additions/Quest/ui_condition_end.gd" id="1_f3miq"]
|
||||
|
||||
[node name="Condition_End" type="HBoxContainer"]
|
||||
offset_right = 90.0
|
||||
offset_bottom = 23.0
|
||||
script = ExtResource("1_f3miq")
|
||||
|
||||
[node name="Label" type="Label" parent="."]
|
||||
layout_mode = 2
|
||||
text = "End of condition X"
|
||||
|
||||
[node name="AddElif" type="Button" parent="."]
|
||||
layout_mode = 2
|
||||
text = "Add Elif"
|
||||
|
||||
[node name="AddElse" type="Button" parent="."]
|
||||
layout_mode = 2
|
||||
text = "Add Else"
|
||||
|
After Width: | Height: | Size: 138 KiB |
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://hvchk6t0xe7j"
|
||||
path="res://.godot/imported/Ente.png-21ead71377d82aa0401b2345b9713a4b.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://art/animals/Ente.png"
|
||||
dest_files=["res://.godot/imported/Ente.png-21ead71377d82aa0401b2345b9713a4b.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
|
After Width: | Height: | Size: 39 KiB |
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://c4q12jiligcl7"
|
||||
path="res://.godot/imported/katze.png-0faf4775b24cd38949e4c4160b5ed047.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://art/animals/katze.png"
|
||||
dest_files=["res://.godot/imported/katze.png-0faf4775b24cd38949e4c4160b5ed047.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
|
After Width: | Height: | Size: 1.5 MiB |
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bexymddkb6l0o"
|
||||
path="res://.godot/imported/mavkha.png-ab393dd20d4b3f3a305dd600f518b5fe.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://art/characters/Mavka/mavkha.png"
|
||||
dest_files=["res://.godot/imported/mavkha.png-ab393dd20d4b3f3a305dd600f518b5fe.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
|
After Width: | Height: | Size: 476 KiB |
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bgba1uv0muxat"
|
||||
path="res://.godot/imported/chugeist_tmp.png-ff2e3a6be0ff4b186834b14d159443da.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://art/characters/chugeist_tmp.png"
|
||||
dest_files=["res://.godot/imported/chugeist_tmp.png-ff2e3a6be0ff4b186834b14d159443da.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
|
After Width: | Height: | Size: 266 KiB |
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://65e44yde224q"
|
||||
path="res://.godot/imported/Babushka_house_01.png-2abdaa4b7145961a1de62ba9271ec19d.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://art/farm/Babushka_house_01.png"
|
||||
dest_files=["res://.godot/imported/Babushka_house_01.png-2abdaa4b7145961a1de62ba9271ec19d.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 4.0 KiB |
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://ccy6bwunhfvrf"
|
||||
path="res://.godot/imported/Babushka_house_frontDoor.png-345830acb7ae8cbbb97011f89455fd91.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://art/farm/Babushka_house_frontDoor.png"
|
||||
dest_files=["res://.godot/imported/Babushka_house_frontDoor.png-345830acb7ae8cbbb97011f89455fd91.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
|
After Width: | Height: | Size: 48 KiB |
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://b5ade1s2ijunu"
|
||||
path="res://.godot/imported/beetroot_icon.png-aef760d681bd7ef4c12802c6da8d93f5.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://art/farm/farming/farmobjekte/beetroot/beetroot_icon.png"
|
||||
dest_files=["res://.godot/imported/beetroot_icon.png-aef760d681bd7ef4c12802c6da8d93f5.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
|
After Width: | Height: | Size: 123 KiB |
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://xtci0n8tquc0"
|
||||
path="res://.godot/imported/beetroot_00.png-0c2234fc9109ef4b2bb1c7f568ee2fc7.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://art/farm/farming/farmobjekte/beetroot_00.png"
|
||||
dest_files=["res://.godot/imported/beetroot_00.png-0c2234fc9109ef4b2bb1c7f568ee2fc7.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
|
After Width: | Height: | Size: 6.5 KiB |
|
After Width: | Height: | Size: 1.0 MiB |
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://blb3agipyxnal"
|
||||
path="res://.godot/imported/fence_door.png-19eb021073131bf04d1c242c32b3c026.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://art/farm/farming/farmobjekte/zaun/fence_door.png"
|
||||
dest_files=["res://.godot/imported/fence_door.png-19eb021073131bf04d1c242c32b3c026.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
@@ -0,0 +1,35 @@
|
||||
[remap]
|
||||
|
||||
importer="font_data_dynamic"
|
||||
type="FontFile"
|
||||
uid="uid://bgmdn7uo215q2"
|
||||
path="res://.godot/imported/RuslanDisplay-Regular.ttf-b21277db87f732a1d4e67ed29c642ff3.fontdata"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://art/fonts/RuslanDisplay-Regular.ttf"
|
||||
dest_files=["res://.godot/imported/RuslanDisplay-Regular.ttf-b21277db87f732a1d4e67ed29c642ff3.fontdata"]
|
||||
|
||||
[params]
|
||||
|
||||
Rendering=null
|
||||
antialiasing=1
|
||||
generate_mipmaps=false
|
||||
disable_embedded_bitmaps=true
|
||||
multichannel_signed_distance_field=false
|
||||
msdf_pixel_range=8
|
||||
msdf_size=48
|
||||
allow_system_fallback=true
|
||||
force_autohinter=false
|
||||
hinting=1
|
||||
subpixel_positioning=4
|
||||
keep_rounding_remainders=true
|
||||
oversampling=0.0
|
||||
Fallbacks=null
|
||||
fallbacks=[]
|
||||
Compress=null
|
||||
compress=true
|
||||
preload=[]
|
||||
language_support={}
|
||||
script_support={}
|
||||
opentype_features={}
|
||||
|
After Width: | Height: | Size: 739 KiB |
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://cugtxcfuds31r"
|
||||
path="res://.godot/imported/Babushka_bg_01.png-0c232a7f5bf4d34c794d027da500ca6b.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://art/indoor/Babushka_bg_01.png"
|
||||
dest_files=["res://.godot/imported/Babushka_bg_01.png-0c232a7f5bf4d34c794d027da500ca6b.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
|
Before Width: | Height: | Size: 852 KiB After Width: | Height: | Size: 299 KiB |
|
After Width: | Height: | Size: 852 KiB |
@@ -0,0 +1,102 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 5687 1551" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(1,0,0,1,-2967,0)">
|
||||
<g id="Cozy-Raven-Logo-breit" serif:id="Cozy Raven Logo breit" transform="matrix(2.29248,0,0,0.625226,2967.64,0)">
|
||||
<rect x="0" y="0" width="2480.32" height="2480.32" style="fill:none;"/>
|
||||
<g transform="matrix(0.436208,0,0,1.59942,166.053,-1670.67)">
|
||||
<g transform="matrix(0.206025,0,0,0.289757,-1186.1,-352.084)">
|
||||
<g id="rabe" transform="matrix(11.4916,0,0,8.17082,3293.63,-8360.45)">
|
||||
<g transform="matrix(0.44279,0,0,0.44279,-2784.62,911.446)">
|
||||
<path d="M9093.2,2236.52L9115.98,2240.43C9167.2,2253.76 9168.8,2284.95 9189.66,2329.1C9138.91,2343.37 9117.71,2368.99 9109.42,2396.97C9107.81,2402.4 9106.69,2407.91 9105.93,2413.44C9104.99,2417.49 9104.54,2421.39 9104.58,2425.14C9104.48,2429.06 9104.51,2443.26 9104.58,2462.99C9104.58,2511.29 9104.59,2574.25 9104.6,2636.4C9103.54,2634.38 9102.52,2632.31 9101.55,2630.19C9099.08,2624.78 9096.93,2619.01 9095.19,2612.78C9091.98,2600.57 9090.17,2586.65 9090.2,2573.24C9090.38,2508.74 9096.85,2433.25 8986.93,2406.91C8989.55,2405.7 8992.14,2404.43 8994.7,2403.13C9011.35,2394.63 9026.82,2384.15 9040.81,2372C9055.93,2358.87 9069.32,2343.78 9080.57,2327.14C9085.77,2319.44 9090.52,2311.41 9094.78,2303.08C9093.73,2300.03 9092.69,2296.57 9091.67,2292.52C9087.98,2277.85 9087.23,2256.61 9087.4,2239.07C9089.31,2238.28 9091.25,2237.43 9093.2,2236.52Z" style="fill:rgb(242,135,183);"/>
|
||||
</g>
|
||||
<g id="Tasse">
|
||||
<g transform="matrix(0.44279,0,0,0.44279,-1189.24,911.446)">
|
||||
<path d="M5586.66,2329.1C5613.12,2321.66 5647.62,2317.3 5692.51,2317.3C5819.54,2317.3 5874.08,2340.4 5893.03,2392.34C5897.93,2405.8 5900.45,2421.19 5901.22,2438.61L5901.25,2475.31C6048.49,2529.94 5987.72,2703.16 5901.44,2733.12L5901.48,2793.24C5901.52,2845.18 5862.12,2888.66 5810.44,2893.73C5735.82,2901.17 5659.53,2899.87 5581.53,2889.53C5568.38,2887.82 5556.18,2883.38 5545.48,2876.82C5552.57,2868.87 5558.27,2860.45 5562.81,2851.86C5586.85,2806.44 5578.83,2756.42 5576.47,2748.78C5560.49,2697.11 5522.49,2676.14 5501.59,2636.4C5501.58,2574.25 5501.57,2511.29 5501.57,2462.99L5501.57,2433.06C5501.65,2426.56 5502.03,2419.99 5502.93,2413.44C5503.69,2407.91 5504.81,2402.4 5506.41,2396.97C5514.7,2368.99 5535.91,2343.37 5586.66,2329.1ZM5692.88,2437.58C5622.87,2439.34 5553.73,2427.99 5545.97,2392.92C5538.69,2360.07 5581.36,2345.57 5628.34,2339.39L5705.61,2335.1C5721.88,2335.16 5733.77,2335.7 5737.28,2335.86C5740.73,2336.15 5860.41,2329.11 5846.43,2400.22C5842.92,2418.11 5774.35,2434.11 5703.54,2437.21C5706.38,2492.15 5706.65,2510.71 5702.06,2581.99C5726.51,2578.57 5750.55,2577.23 5762.55,2582.38C5776.99,2588.58 5776.71,2737.16 5775.69,2739.33C5775.22,2740.31 5645.24,2755.2 5636.28,2738.1C5623.36,2713.44 5628.31,2650.92 5629.36,2596.55C5634.69,2595.22 5662.12,2588.36 5691.39,2583.61C5691.33,2583.23 5691.32,2582.84 5691.34,2582.44C5695.97,2510.77 5695.71,2492.49 5692.88,2437.62C5692.88,2437.61 5692.88,2437.59 5692.88,2437.58ZM5901.3,2546.46L5901.39,2659.7C5910.03,2651.39 5917.71,2642.46 5922,2632.7C5947.15,2575.5 5919.22,2554.13 5901.3,2546.46Z" style="fill:rgb(64,41,123);"/>
|
||||
</g>
|
||||
<g transform="matrix(0.489303,0,0,0.489303,-1454.2,806.259)">
|
||||
<path d="M5693.21,2420.84C5629.85,2422.43 5567.29,2412.16 5560.26,2380.42C5553.68,2350.69 5592.29,2337.57 5634.8,2331.99L5704.73,2328.1C5719.46,2328.15 5730.22,2328.64 5733.39,2328.79C5736.51,2329.05 5844.82,2322.68 5832.17,2387.03C5828.98,2403.22 5766.94,2417.69 5702.86,2420.51C5702.85,2420.46 5702.85,2420.42 5702.85,2420.38C5702.71,2417.72 5700.44,2415.67 5697.78,2415.81C5695.13,2415.94 5693.09,2418.19 5693.21,2420.84Z" style="fill:rgb(41,39,83);"/>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(0.44279,0,0,0.44279,-1189.24,911.446)">
|
||||
<path d="M5545.48,2876.82C5534.85,2888.72 5521.08,2899.53 5503.3,2908.2C5360.7,2977.71 5254.29,2939.17 5207.49,2928.16C5089.61,2970.2 4942.84,2958.57 4877.96,2883.54C4743.74,2728.31 4893.53,2543.12 4902.3,2526.15C4972.1,2391.04 4822.28,2286.46 5030.99,2142.75C5024.02,2151.03 5017.67,2162.31 5022.02,2173.08C5028.66,2189.52 5045.73,2184.78 5060.02,2179.45C5063.64,2178.1 5067.08,2176.71 5070.12,2175.62C5066.04,2181.56 5062.37,2186.89 5059.3,2191.75C5046.79,2211.55 5044.04,2223.78 5062.64,2239.08C5081.51,2346.37 5175.26,2428 5287.92,2428C5313.26,2428 5337.63,2423.87 5360.41,2416.25C5368.46,2413.56 5376.3,2410.44 5383.92,2406.91C5493.84,2433.25 5487.37,2508.74 5487.2,2573.24C5487.15,2588.41 5488.99,2601.37 5492.18,2612.78C5494.59,2621.93 5497.79,2630.12 5501.59,2636.4C5522.49,2676.14 5560.49,2697.11 5576.47,2748.78C5578.83,2756.42 5586.85,2806.44 5562.81,2851.86C5558.27,2860.45 5552.57,2868.87 5545.48,2876.82Z" style="fill:rgb(247,183,211);"/>
|
||||
</g>
|
||||
<g transform="matrix(0.44279,0,0,0.44279,-1189.24,911.446)">
|
||||
<path d="M5501.59,2636.4C5497.79,2630.12 5494.59,2621.93 5492.18,2612.78C5493.93,2619.01 5496.07,2624.78 5498.55,2630.19C5499.51,2632.31 5500.53,2634.38 5501.59,2636.4Z" style="fill:rgb(247,183,211);"/>
|
||||
</g>
|
||||
<g id="Kopf">
|
||||
<g transform="matrix(0.44279,0,0,0.44279,-2784.62,911.446)">
|
||||
<path d="M8634,2142.75C8639.51,2136.21 8645.4,2131.55 8646.73,2130.51L8648.09,2128.55C8660.73,2114.49 8677.4,2100.8 8690.01,2089.88C8696.11,2084.6 8701.27,2079.96 8704.55,2076.25C8702.07,2076.59 8699.75,2076.84 8697.58,2077.02C8668.48,2079.43 8666.21,2068.32 8663.7,2063.84C8662.94,2062.49 8660.74,2050.62 8695.41,2034.55C8719.86,2023.23 8742.36,2016.15 8759.96,2011.72C8780.33,2006.6 8794.16,2005.03 8796.91,2004.52L8796.95,2003.86C8791.7,2000.81 8792.22,2000.17 8786.72,1997.9C8786.3,1997.73 8785.45,1997.38 8784.32,1996.84C8778.66,1994.17 8765.84,1986.84 8763.93,1973.78C8761.04,1954.09 8829.52,1951.68 8852.1,1954.24C8875.33,1956.87 8874.69,1960.25 8902.35,1962.91C8863.96,1922.8 8881.86,1915.36 8885.88,1915.41C8908.45,1915.73 8950.69,1953.98 8958.87,1959.54C8962.77,1962.19 8963.58,1960.59 9000.24,1980.31C9014.56,1988.02 9040.2,1995.42 9071.78,2057.28C9039.59,2060.12 8999.68,2078.14 8951.13,2124.98C8920.24,2154.79 8935.43,2160.47 8937.01,2203.49C8985,2231.95 9028.37,2263.39 9087.4,2239.07C9087.23,2256.61 9087.98,2277.85 9091.67,2292.52C9092.69,2296.57 9093.73,2300.03 9094.78,2303.08C9090.52,2311.41 9085.77,2319.44 9080.57,2327.14C9069.32,2343.78 9055.93,2358.87 9040.81,2372C9026.82,2384.15 9011.35,2394.63 8994.7,2403.13C8992.14,2404.43 8989.55,2405.7 8986.93,2406.91C8979.31,2410.44 8971.46,2413.56 8963.42,2416.25C8940.64,2423.87 8916.26,2428 8890.93,2428C8778.27,2428 8684.52,2346.37 8665.64,2239.08C8647.05,2223.78 8649.8,2211.55 8662.3,2191.75C8665.38,2186.89 8669.05,2181.56 8673.13,2175.62C8670.09,2176.71 8666.65,2178.1 8663.03,2179.45C8648.74,2184.78 8631.66,2189.52 8625.02,2173.08C8620.67,2162.31 8627.02,2151.03 8634,2142.75ZM8810.9,2143.97C8813.04,2149.66 8809.97,2157.32 8804.34,2159.62C8779.35,2169.86 8765.58,2085.96 8826.5,2071.15C8913.02,2050.11 8909.28,2172.06 8878.18,2145.57C8868.9,2137.66 8882.59,2095.39 8849.06,2093.16C8815.2,2090.91 8800.55,2116.5 8810.9,2143.97ZM8851.47,2202C8850.75,2201.13 8844.88,2195.36 8837.84,2194.64C8829.2,2193.76 8823.67,2198.88 8823.2,2199.12C8821.91,2197.88 8815.31,2191.23 8810.74,2189.4C8806.16,2187.57 8797.65,2187.93 8795.76,2188.14C8791.75,2183.81 8788.72,2181.5 8785.51,2179.95C8781.01,2177.77 8775.69,2177.22 8763.45,2176.61C8755.84,2176.23 8749.36,2182.1 8748.98,2189.71C8748.59,2197.32 8754.47,2203.8 8762.07,2204.18C8767.3,2204.45 8772.28,2204.81 8773.49,2204.9C8774.02,2205.41 8777.98,2211.27 8783.93,2213.69C8789.62,2216 8798.38,2215.66 8800.35,2215.43C8803.84,2218.87 8811.62,2227.47 8819.92,2227.62C8824.8,2227.7 8828.12,2227.36 8834.21,2224.48C8834.48,2224.8 8840.76,2233.51 8850.3,2233.41C8859.4,2233.32 8865.18,2228.58 8871.14,2221.37C8876,2215.5 8876.48,2207.22 8871.08,2201.85C8865.67,2196.48 8856.92,2196.51 8851.55,2201.91L8851.47,2202Z" style="fill:rgb(64,41,123);"/>
|
||||
</g>
|
||||
<g transform="matrix(-0.764042,-0.00207054,-0.00207054,0.764042,1545.62,1586.69)">
|
||||
<path d="M536.732,393.815C537.15,393.314 540.56,389.977 544.641,389.572C549.649,389.074 552.846,392.051 553.117,392.189C553.867,391.472 557.704,387.629 560.358,386.576C563.012,385.524 567.942,385.745 569.041,385.874C571.371,383.369 573.131,382.034 574.994,381.14C577.605,379.887 580.684,379.575 587.781,379.24C592.191,379.031 595.941,382.443 596.149,386.853C596.358,391.264 592.946,395.014 588.536,395.222C585.505,395.365 582.621,395.568 581.916,395.619C581.61,395.915 579.304,399.304 575.853,400.696C572.553,402.028 567.478,401.813 566.333,401.679C564.311,403.667 559.787,408.641 554.975,408.712C552.149,408.754 550.222,408.552 546.698,406.874C546.543,407.057 542.886,412.095 537.361,412.022C532.088,411.953 528.743,409.197 525.301,405.01C522.497,401.599 522.229,396.799 525.37,393.696C528.511,390.593 533.581,390.624 536.683,393.766L536.732,393.815Z" style="fill:rgb(242,135,183);"/>
|
||||
</g>
|
||||
<g transform="matrix(0.801288,0.0280515,-0.0280515,0.801288,291.021,326.878)">
|
||||
<path d="M1096.18,1875.91C1097.48,1879.01 1095.93,1883.3 1092.87,1884.68C1079.27,1890.81 1070.05,1844.77 1103.39,1835.42C1150.74,1822.14 1151.02,1889.52 1133.35,1875.5C1128.07,1871.31 1134.81,1847.72 1116.26,1847.14C1097.53,1846.55 1089.94,1860.95 1096.18,1875.91Z" style="fill:rgb(247,183,211);"/>
|
||||
</g>
|
||||
<g transform="matrix(0.632697,0,0,0.594867,-2235.6,594.043)">
|
||||
<g transform="matrix(0.845639,0,0,0.899416,890.266,150.218)">
|
||||
<path d="M5441.99,2268.76C5390.67,2271.13 5379.45,2270.73 5337.65,2239.18C5373.06,2221.12 5381.6,2218.77 5417.32,2185.65C5418.86,2184.22 5420.44,2182.74 5422.08,2181.2C5435.24,2168.84 5469.33,2167.8 5491.89,2168.6C5458.33,2189.75 5456.66,2203.69 5433.66,2219.17C5453.07,2237.82 5454.18,2243.09 5463.35,2267.79C5455.51,2268.12 5448.43,2268.46 5441.99,2268.76Z" style="fill:rgb(255,137,0);"/>
|
||||
</g>
|
||||
<g transform="matrix(0.845639,0,0,0.899416,890.266,150.218)">
|
||||
<path d="M5441.76,2279.26C5392.91,2299.39 5357.01,2273.37 5317.3,2249.81C5315.99,2214.21 5303.42,2209.51 5328.98,2184.84C5369.16,2146.07 5402.2,2131.16 5428.83,2128.81C5473.76,2124.85 5500.48,2156.63 5512.57,2169.96C5510.28,2169.74 5502.32,2168.97 5491.89,2168.6C5469.33,2167.8 5435.24,2168.84 5422.08,2181.2C5420.44,2182.74 5418.86,2184.22 5417.32,2185.65C5381.6,2218.77 5373.06,2221.12 5337.65,2239.18C5379.45,2270.73 5390.67,2271.13 5441.99,2268.76C5448.43,2268.46 5455.51,2268.12 5463.35,2267.79C5457.58,2271.52 5451.99,2274.62 5446.56,2277.15C5444.95,2277.91 5443.34,2278.61 5441.76,2279.26Z" style="fill:rgb(255,205,0);"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Etikett">
|
||||
<g transform="matrix(0.44279,0,0,0.44279,-1189.24,911.446)">
|
||||
<path d="M5702.06,2581.99C5726.51,2578.57 5750.55,2577.23 5762.55,2582.38C5776.99,2588.58 5776.71,2737.16 5775.69,2739.33C5775.22,2740.31 5645.24,2755.2 5636.28,2738.1C5623.36,2713.44 5628.31,2650.92 5629.36,2596.55C5634.69,2595.22 5662.12,2588.36 5691.39,2583.61C5691.77,2586.02 5693.78,2587.94 5696.32,2588.11C5699.26,2588.3 5701.8,2586.06 5701.98,2583.13C5702.01,2582.75 5702.03,2582.37 5702.06,2581.99ZM5652.42,2670.94C5641.83,2660.2 5641.95,2642.88 5652.69,2632.29C5663.43,2621.7 5680.75,2621.81 5691.34,2632.55L5697.65,2638.94L5705.75,2627.84C5714.64,2615.65 5731.76,2612.98 5743.94,2621.87C5756.13,2630.77 5758.8,2647.88 5749.91,2660.07L5707.91,2717.61C5706.91,2718.98 5705.35,2719.85 5703.65,2719.97C5701.96,2720.1 5700.29,2719.47 5699.09,2718.26L5652.42,2670.94Z" style="fill:rgb(255,205,0);"/>
|
||||
</g>
|
||||
<g transform="matrix(1,0,0,1.11432,0,-234.945)">
|
||||
<path d="M1331.5,1997.38C1331.45,1996.22 1332.45,1995.23 1333.74,1995.17C1335.04,1995.11 1336.15,1996.01 1336.22,1997.17C1336.22,1997.19 1336.22,1997.21 1336.23,1997.23C1335.17,1997.27 1334.11,1997.31 1333.05,1997.34C1332.53,1997.35 1332.02,1997.37 1331.5,1997.38Z" style="fill:rgb(255,205,0);"/>
|
||||
</g>
|
||||
<g transform="matrix(1,0,0,1.11432,0,-234.945)">
|
||||
<path d="M1330.85,2055.41C1331.62,2055.29 1332.4,2055.18 1333.18,2055.08C1333.98,2054.97 1334.77,2054.86 1335.57,2054.76C1335.56,2054.91 1335.55,2055.06 1335.54,2055.21C1335.45,2056.38 1334.33,2057.27 1333.03,2057.19C1331.9,2057.13 1331.02,2056.36 1330.85,2055.41Z" style="fill:rgb(255,205,0);"/>
|
||||
</g>
|
||||
<g transform="matrix(1,0,0,1.11432,0,-234.945)">
|
||||
<path d="M1336.23,1997.23C1337.48,2019.06 1337.6,2026.44 1335.57,2054.76C1334.77,2054.86 1333.98,2054.97 1333.18,2055.08C1332.4,2055.18 1331.62,2055.29 1330.85,2055.41C1330.82,2055.25 1330.81,2055.1 1330.82,2054.94C1332.87,2026.46 1332.76,2019.2 1331.51,1997.39C1331.5,1997.39 1331.5,1997.38 1331.5,1997.38C1332.02,1997.37 1332.53,1997.35 1333.05,1997.34C1334.11,1997.31 1335.17,1997.27 1336.23,1997.23Z" style="fill:rgb(255,205,0);"/>
|
||||
</g>
|
||||
<g transform="matrix(0.44279,0,0,0.44279,-1189.72,902.025)">
|
||||
<path d="M5653.49,2692.22C5642.89,2681.48 5643.01,2664.16 5653.75,2653.56C5664.49,2642.97 5681.82,2643.09 5692.41,2653.83L5698.71,2660.22L5706.82,2649.11C5715.71,2636.93 5732.82,2634.26 5745.01,2643.15C5757.19,2652.04 5759.86,2669.16 5750.97,2681.34L5708.98,2738.88C5707.97,2740.26 5706.41,2741.12 5704.72,2741.25C5703.02,2741.38 5701.35,2740.75 5700.16,2739.54L5653.49,2692.22Z" style="fill:rgb(64,41,123);"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(1.62827,0,0,1.15775,11647.7,4084.19)">
|
||||
<path d="M4321.82,2650.17C4335.16,2589.55 4341.48,2548.68 4303.97,2512.3C4237.93,2448.23 3913.01,2168.16 3887.94,1890.96C3874.93,1747.08 3935.52,1570.85 4121.8,1440.01C4173.9,1403.4 4397.02,1274.75 4432.21,1231.5C4504.25,1142.98 4538.6,1064.83 4542.29,1048.12C4550.57,1010.66 4560.73,991.471 4569.86,988.633C4583.78,984.306 4596.96,995.036 4599.38,1002.89C4658.05,1194.08 4629.33,1500.27 4413.17,1606.53C4362.44,1631.47 4311.24,1655.48 4260.39,1680.18C4215.16,1702.15 4095.32,1765.74 4111.32,1894.08C4119.02,1955.8 4203.45,2048.47 4213.96,2060.01C4344.52,2203.31 4556.28,2384.6 4573.53,2484.21C4575.72,2496.87 4588.84,2572.62 4556.75,2643.85C4536.49,2688.84 4528.96,2683.49 4430.93,2778.62C4413.09,2795.93 4374.13,2841.24 4369.34,2846.81C4333.24,2888.8 4336.16,2896.86 4320.63,2894.32C4318.14,2893.92 4302.54,2891.37 4299.77,2870.7C4290.31,2800.04 4318.01,2667.48 4321.82,2650.17Z" style="fill:rgb(247,183,211);"/>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(0.614148,0,0,0.863747,-8279.46,-6589.16)">
|
||||
<g transform="matrix(1.62827,0,0,1.18976,-34044.1,-276.538)">
|
||||
<path d="M29148.3,8369.47C29311.3,8302.85 29383.5,8371.68 29414.3,8300.09C29486.9,8131.31 28924.8,8113.93 28925,8731.37C28925.1,9192.96 29452.3,9066.77 29321.6,8911.81C29263,8842.28 29111.2,8943.43 29065.4,8822.3C28982.5,8603.03 29092.4,8392.3 29148.3,8369.47Z" style="fill:rgb(64,41,123);"/>
|
||||
</g>
|
||||
<g transform="matrix(1.62827,0,0,1.12835,-34037.5,287.009)">
|
||||
<path d="M29700.5,8256.51C29734.3,8261.78 29949.3,8490.54 29838.7,8755.6C29823.3,8792.52 29586.9,9415.61 29354.9,8716.56C29330.1,8641.78 29388.2,8207.8 29700.5,8256.51ZM29622.2,8391.95C29317.7,8551.37 29551,8941.4 29616.7,8904.4C29836.1,8780.72 29720.3,8340.62 29622.2,8391.95Z" style="fill:rgb(64,41,123);"/>
|
||||
</g>
|
||||
<g transform="matrix(1.62827,0,0,1.15775,-34021.3,-14.4309)">
|
||||
<path d="M30237.4,8200.58C30126.9,8165.78 30029.7,8240.31 29857.9,8224.64C29843.2,8223.31 29754,8269 29848,8342.53C29942.4,8416.5 30205.2,8287.39 30115.1,8450.36C29912.9,8815.91 29654.4,9057.23 30069.1,9081.25C30305.2,9094.92 30441.8,8879.44 30371.9,8840.54C30317,8809.93 29993.7,9077.88 30016.1,8804.54C30022.2,8730.54 30470.4,8273.91 30237.4,8200.58Z" style="fill:rgb(64,41,123);"/>
|
||||
</g>
|
||||
<g transform="matrix(1.62827,0,0,1.19425,-34005,-317.682)">
|
||||
<path d="M30500.3,8306.84C30329.7,8264.78 30217.8,8613.62 30340.6,8650.96C30520,8705.51 30485.3,8752.93 30499.4,8938.28C30510.9,9089.91 30682.8,9082.11 30666,8972.85C30641.6,8814.77 30581.4,8757.53 30736.4,8718.88C30897.2,8678.81 30936.3,8187.72 30760.8,8345.76C30688.7,8410.72 30805.5,8581.82 30661.9,8626.45C30510.2,8673.61 30428.3,8545.86 30439.1,8505.03C30468.6,8393.92 30588.2,8328.52 30500.3,8306.84Z" style="fill:rgb(64,41,123);"/>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(0.614148,0,0,0.863747,-8003.93,-6589.16)">
|
||||
<g transform="matrix(1.62827,0,0,1.20505,-34005,-468.246)">
|
||||
<path d="M32086.6,8251.22C32157.8,8254.15 32477.7,8423.34 32280.7,8697.07C32247,8743.96 32313.8,8834.76 32330.4,8903.65C32354.5,9003.74 32384.1,9089.96 32325.4,9097.5C32169,9117.58 32257.3,8827.15 32127.1,8833.91C32057.1,8837.53 32080.9,9097.12 31971.3,9101.97C31856.1,9107.08 31968.4,8812.56 31967.2,8756.93C31962,8516.36 31759.6,8237.78 32086.6,8251.22ZM32098.8,8395C31958.7,8318.67 32040.2,8691.92 32114.1,8694.85C32179.8,8697.45 32325,8518.34 32098.8,8395Z" style="fill:rgb(64,41,123);"/>
|
||||
</g>
|
||||
<g transform="matrix(1.62827,0,0,1.0591,-34070.1,878.801)">
|
||||
<path d="M32631.1,8843.75C32508.8,8868.32 32692.6,9085.46 32564.6,9073.59C32244.9,9043.94 32616.9,7718.13 32868.6,8665.88C32888,8738.99 32922.5,9077.09 32869.7,9083.6C32729.5,9100.93 32802,8809.45 32631.1,8843.75ZM32582.6,8738.08C32654.9,8710.18 32716.1,8743.72 32740.1,8718.69C32798.7,8657.31 32714.5,8520.97 32664.8,8526.23C32585.3,8534.64 32511.9,8765.32 32582.6,8738.08Z" style="fill:rgb(64,41,123);"/>
|
||||
</g>
|
||||
<g transform="matrix(1.62827,0,0,1.36008,-34102.7,-1827.28)">
|
||||
<path d="M33026.4,8550.27C32977.4,8383.16 32834,8271.69 32784.7,8347.52C32758.6,8387.61 32912.6,8395.92 33035.2,8989.39C33052.3,9072.25 33179.2,9126.91 33200.4,8922.24C33252.8,8415.98 33387.5,8298.73 33235.3,8316.62C33093.4,8333.31 33160.2,8765.88 33109.9,8768.02C33065.9,8769.89 33048.9,8627.05 33026.4,8550.27Z" style="fill:rgb(64,41,123);"/>
|
||||
</g>
|
||||
<g transform="matrix(1.62827,0,0,1.24265,-34119,-832.44)">
|
||||
<path d="M33701.5,8300.06C33391.9,8265.58 33401.3,8422.23 33373.1,8623.8C33356.5,8742.87 33256.3,8991.83 33298.2,9070.23C33341.4,9151.04 33781.3,9124.86 33623.2,8985.18C33579.4,8946.47 33327.3,9081.2 33431.3,8823.7C33480.3,8702.31 33588,8786 33600.1,8674.91C33606.2,8618.56 33393.1,8653.76 33501.4,8464.6C33556.1,8368.97 33625.6,8426.08 33720.2,8422.39C33800.5,8419.26 33863.7,8318.14 33701.5,8300.06Z" style="fill:rgb(64,41,123);"/>
|
||||
</g>
|
||||
<g transform="matrix(1.62827,0,0,1.15775,-34143.4,-37.5607)">
|
||||
<path d="M33814.7,8430.06C33689.4,8510.35 33713.9,9051.12 33763.9,9081.07C33935,9183.4 33789.8,8606.13 33866,8692.8C33945.8,8783.43 34007.9,9254.38 34115.9,9016.18C34175.2,8885.4 34174.7,8324.05 34076.5,8296.13C33919.4,8251.45 34100.8,8803.81 34033.2,8737.82C33896.5,8604.46 33878.8,8389.04 33814.7,8430.06Z" style="fill:rgb(64,41,123);"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 20 KiB |
@@ -0,0 +1,37 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://blbplxfx41f8t"
|
||||
path="res://.godot/imported/Cozy Raven Logo breit.svg-f5cfe115294b9e3edf05578239074286.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://art/logos/Cozy Raven Logo breit.svg"
|
||||
dest_files=["res://.godot/imported/Cozy Raven Logo breit.svg-f5cfe115294b9e3edf05578239074286.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
|
After Width: | Height: | Size: 19 KiB |
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://cwbv2i8ntq15d"
|
||||
path="res://.godot/imported/FS_Logo_2zeilig_rot.png-d7f9780942dbf9fad2bbeca2da59457f.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://art/logos/FS_Logo_2zeilig_rot.png"
|
||||
dest_files=["res://.godot/imported/FS_Logo_2zeilig_rot.png-d7f9780942dbf9fad2bbeca2da59457f.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
|
After Width: | Height: | Size: 5.6 KiB |
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://cgmu3qlovdr22"
|
||||
path="res://.godot/imported/field_outline_1.png-6d3fddc82592de77807ed60581b515c5.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://art/masks/field_outline_1.png"
|
||||
dest_files=["res://.godot/imported/field_outline_1.png-6d3fddc82592de77807ed60581b515c5.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
|
After Width: | Height: | Size: 6.8 KiB |
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://eg5ej0mtuac"
|
||||
path="res://.godot/imported/field_outline_2.png-e3ddb80217ba93d880ff746f003587ee.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://art/masks/field_outline_2.png"
|
||||
dest_files=["res://.godot/imported/field_outline_2.png-e3ddb80217ba93d880ff746f003587ee.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
|
After Width: | Height: | Size: 7.0 KiB |
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://djpigvoyadvjs"
|
||||
path="res://.godot/imported/field_outline_3.png-1ae7ea2c620df01f38d55e21a86cbf92.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://art/masks/field_outline_3.png"
|
||||
dest_files=["res://.godot/imported/field_outline_3.png-1ae7ea2c620df01f38d55e21a86cbf92.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
@@ -0,0 +1,9 @@
|
||||
[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://bv3m12duf0dj6"]
|
||||
|
||||
[ext_resource type="Shader" uid="uid://dsa3lv2as7q3b" path="res://shader/outline.gdshader" id="1_fxlom"]
|
||||
|
||||
[resource]
|
||||
shader = ExtResource("1_fxlom")
|
||||
shader_parameter/allow_out_of_bounds = true
|
||||
shader_parameter/outline_thickness = 8.0
|
||||
shader_parameter/outline_color = Color(0.88, 0.54208, 0.4576, 1)
|
||||
@@ -0,0 +1,9 @@
|
||||
[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://blch5kdhkbj75"]
|
||||
|
||||
[ext_resource type="Shader" uid="uid://dsa3lv2as7q3b" path="res://shader/outline.gdshader" id="1_ovtva"]
|
||||
|
||||
[resource]
|
||||
shader = ExtResource("1_ovtva")
|
||||
shader_parameter/allow_out_of_bounds = true
|
||||
shader_parameter/outline_thickness = 8.0
|
||||
shader_parameter/outline_color = Color(0.88, 0.79684, 0.3256, 1)
|
||||
|
Before Width: | Height: | Size: 258 KiB After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 258 KiB |
|
Before Width: | Height: | Size: 696 KiB After Width: | Height: | Size: 208 KiB |
|
After Width: | Height: | Size: 696 KiB |
|
Before Width: | Height: | Size: 895 KiB After Width: | Height: | Size: 395 KiB |
|
After Width: | Height: | Size: 895 KiB |