From cc0ab5949f7ff2aa6f538ed193774e07e73496f4 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Sat, 7 Dec 2024 23:41:44 +0200 Subject: [PATCH] Initial work on audio layers --- project.godot | 4 --- src/Autoload/ExtensionsApi.gd | 2 +- src/Autoload/Global.gd | 2 +- src/Autoload/Tools.gd | 5 +++- src/Classes/Cels/AudioCel.gd | 18 +++++++++++++ src/Classes/Layers/AudioLayer.gd | 36 ++++++++++++++++++++++++++ src/Classes/Project.gd | 4 +-- src/UI/Timeline/AnimationTimeline.gd | 2 ++ src/UI/Timeline/AnimationTimeline.tscn | 4 ++- src/UI/Timeline/LayerButton.gd | 13 +++++++++- src/UI/Timeline/LayerButton.tscn | 1 - 11 files changed, 79 insertions(+), 12 deletions(-) create mode 100644 src/Classes/Cels/AudioCel.gd create mode 100644 src/Classes/Layers/AudioLayer.gd diff --git a/project.godot b/project.godot index aa3a195ef..0d3ae5115 100644 --- a/project.godot +++ b/project.godot @@ -27,10 +27,6 @@ config/windows_native_icon="res://assets/graphics/icons/icon.ico" config/ExtensionsAPI_Version=5 config/Pxo_Version=4 -[audio] - -driver/driver="Dummy" - [autoload] Global="*res://src/Autoload/Global.gd" diff --git a/src/Autoload/ExtensionsApi.gd b/src/Autoload/ExtensionsApi.gd index 2ef1820aa..65686e618 100644 --- a/src/Autoload/ExtensionsApi.gd +++ b/src/Autoload/ExtensionsApi.gd @@ -631,7 +631,7 @@ class ProjectAPI: ## Returns the current cel. ## Cel type can be checked using function [method get_class_name] inside the cel - ## type can be GroupCel, PixelCel, Cel3D, or BaseCel. + ## type can be GroupCel, PixelCel, Cel3D, CelTileMap, AudioCel or BaseCel. func get_current_cel() -> BaseCel: return current_project.get_current_cel() diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd index 295ec1457..00e17c014 100644 --- a/src/Autoload/Global.gd +++ b/src/Autoload/Global.gd @@ -14,7 +14,7 @@ signal cel_switched ## Emitted whenever you select a different cel. signal project_data_changed(project: Project) ## Emitted when project data is modified. signal font_loaded ## Emitted when a new font has been loaded, or an old one gets unloaded. -enum LayerTypes { PIXEL, GROUP, THREE_D, TILEMAP } +enum LayerTypes { PIXEL, GROUP, THREE_D, TILEMAP, AUDIO } enum GridTypes { CARTESIAN, ISOMETRIC, ALL } ## ## Used to tell whether a color is being taken from the current theme, ## or if it is a custom color. diff --git a/src/Autoload/Tools.gd b/src/Autoload/Tools.gd index 2b7b13455..7a330724d 100644 --- a/src/Autoload/Tools.gd +++ b/src/Autoload/Tools.gd @@ -800,7 +800,10 @@ func _cel_switched() -> void: var layer: BaseLayer = Global.current_project.layers[Global.current_project.current_layer] var layer_type := layer.get_layer_type() # Do not make any changes when its the same type of layer, or a group layer - if layer_type == _curr_layer_type or layer_type == Global.LayerTypes.GROUP: + if ( + layer_type == _curr_layer_type + or layer_type in [Global.LayerTypes.GROUP, Global.LayerTypes.AUDIO] + ): return _show_relevant_tools(layer_type) diff --git a/src/Classes/Cels/AudioCel.gd b/src/Classes/Cels/AudioCel.gd new file mode 100644 index 000000000..8f992c0fa --- /dev/null +++ b/src/Classes/Cels/AudioCel.gd @@ -0,0 +1,18 @@ +class_name AudioCel +extends BaseCel +## A class for the properties of cels in AudioLayers. +## The term "cel" comes from "celluloid" (https://en.wikipedia.org/wiki/Cel). + + +func _init(_opacity := 1.0) -> void: + opacity = _opacity + image_texture = ImageTexture.new() + + +func get_image() -> Image: + var image := Global.current_project.new_empty_image() + return image + + +func get_class_name() -> String: + return "AudioCel" diff --git a/src/Classes/Layers/AudioLayer.gd b/src/Classes/Layers/AudioLayer.gd new file mode 100644 index 000000000..9d677e014 --- /dev/null +++ b/src/Classes/Layers/AudioLayer.gd @@ -0,0 +1,36 @@ +class_name AudioLayer +extends BaseLayer + +signal audio_changed + +var audio: AudioStream: + set(value): + audio = value + audio_changed.emit() + + +func _init(_project: Project, _name := "") -> void: + project = _project + name = _name + + +# Overridden Methods: +func serialize() -> Dictionary: + var data := {"name": name, "type": get_layer_type()} + return data + + +func deserialize(dict: Dictionary) -> void: + super.deserialize(dict) + + +func get_layer_type() -> int: + return Global.LayerTypes.AUDIO + + +func new_empty_cel() -> AudioCel: + return AudioCel.new() + + +func set_name_to_default(number: int) -> void: + name = tr("Audio track") + " %s" % number diff --git a/src/Classes/Project.gd b/src/Classes/Project.gd index 3d8ab17a1..f7d92dd77 100644 --- a/src/Classes/Project.gd +++ b/src/Classes/Project.gd @@ -640,10 +640,10 @@ func find_first_drawable_cel(frame := frames[current_frame]) -> BaseCel: var result: BaseCel var cel := frame.cels[0] var i := 0 - while cel is GroupCel and i < layers.size(): + while (cel is GroupCel or cel is AudioCel) and i < layers.size(): cel = frame.cels[i] i += 1 - if not cel is GroupCel: + if cel is not GroupCel and cel is not AudioCel: result = cel return result diff --git a/src/UI/Timeline/AnimationTimeline.gd b/src/UI/Timeline/AnimationTimeline.gd index 2cf58ce6c..e9232d3ec 100644 --- a/src/UI/Timeline/AnimationTimeline.gd +++ b/src/UI/Timeline/AnimationTimeline.gd @@ -855,6 +855,8 @@ func _on_add_layer_list_id_pressed(id: int) -> void: Global.LayerTypes.THREE_D: layer = Layer3D.new(project) SteamManager.set_achievement("ACH_3D_LAYER") + Global.LayerTypes.AUDIO: + layer = AudioLayer.new(project) add_layer(layer, project) diff --git a/src/UI/Timeline/AnimationTimeline.tscn b/src/UI/Timeline/AnimationTimeline.tscn index 622135afa..a13e6896b 100644 --- a/src/UI/Timeline/AnimationTimeline.tscn +++ b/src/UI/Timeline/AnimationTimeline.tscn @@ -240,7 +240,7 @@ offset_left = -22.0 offset_top = -10.0 offset_bottom = 10.0 mouse_default_cursor_shape = 2 -item_count = 4 +item_count = 5 popup/item_0/text = "Add Pixel Layer" popup/item_1/text = "Add Group Layer" popup/item_1/id = 1 @@ -248,6 +248,8 @@ popup/item_2/text = "Add 3D Layer" popup/item_2/id = 2 popup/item_3/text = "Add Tilemap Layer" popup/item_3/id = 3 +popup/item_4/text = "Add Audio Layer" +popup/item_4/id = 4 [node name="TextureRect" type="TextureRect" parent="TimelineContainer/TimelineButtons/LayerTools/MarginContainer/LayerSettingsContainer/LayerButtons/AddLayer/AddLayerList"] layout_mode = 0 diff --git a/src/UI/Timeline/LayerButton.gd b/src/UI/Timeline/LayerButton.gd index 800fea1e7..7c2aa0896 100644 --- a/src/UI/Timeline/LayerButton.gd +++ b/src/UI/Timeline/LayerButton.gd @@ -15,6 +15,7 @@ var button_pressed := false: get: return main_button.button_pressed +var audio_player: AudioStreamPlayer @onready var properties: AcceptDialog = Global.control.find_child("LayerProperties") @onready var main_button := %LayerMainButton as Button @onready var expand_button := %ExpandButton as BaseButton @@ -31,7 +32,7 @@ var button_pressed := false: func _ready() -> void: main_button.layer_index = layer_index main_button.hierarchy_depth_pixel_shift = HIERARCHY_DEPTH_PIXEL_SHIFT - Global.cel_switched.connect(func(): z_index = 1 if button_pressed else 0) + Global.cel_switched.connect(_on_cel_switched) var layer := Global.current_project.layers[layer_index] layer.name_changed.connect(func(): label.text = layer.name) layer.visibility_changed.connect(update_buttons) @@ -39,6 +40,10 @@ func _ready() -> void: linked_button.visible = true elif layer is GroupLayer: expand_button.visible = true + elif layer is AudioLayer: + audio_player = AudioStreamPlayer.new() + audio_player.stream = layer.audio + add_child(audio_player) custom_minimum_size.y = Global.animation_timeline.cel_size label.text = layer.name line_edit.text = layer.name @@ -56,6 +61,12 @@ func _ready() -> void: update_buttons() +func _on_cel_switched() -> void: + z_index = 1 if button_pressed else 0 + if is_instance_valid(audio_player): + audio_player.play(Global.current_project.current_frame / Global.current_project.fps) + + func update_buttons() -> void: var layer := Global.current_project.layers[layer_index] if layer is GroupLayer: diff --git a/src/UI/Timeline/LayerButton.tscn b/src/UI/Timeline/LayerButton.tscn index 57e0881bf..02267e664 100644 --- a/src/UI/Timeline/LayerButton.tscn +++ b/src/UI/Timeline/LayerButton.tscn @@ -169,7 +169,6 @@ caret_blink_interval = 0.5 disable_3d = true item_count = 2 item_0/text = "Properties" -item_0/id = 0 item_1/text = "Clipping mask" item_1/checkable = 1 item_1/id = 1