1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-02-25 06:53:14 +00:00

Initial work on audio layers

This commit is contained in:
Emmanouil Papadeas 2024-12-07 23:41:44 +02:00
parent 11e05ac471
commit cc0ab5949f
11 changed files with 79 additions and 12 deletions

View file

@ -27,10 +27,6 @@ config/windows_native_icon="res://assets/graphics/icons/icon.ico"
config/ExtensionsAPI_Version=5 config/ExtensionsAPI_Version=5
config/Pxo_Version=4 config/Pxo_Version=4
[audio]
driver/driver="Dummy"
[autoload] [autoload]
Global="*res://src/Autoload/Global.gd" Global="*res://src/Autoload/Global.gd"

View file

@ -631,7 +631,7 @@ class ProjectAPI:
## Returns the current cel. ## Returns the current cel.
## Cel type can be checked using function [method get_class_name] inside the 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: func get_current_cel() -> BaseCel:
return current_project.get_current_cel() return current_project.get_current_cel()

View file

@ -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 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. 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 } enum GridTypes { CARTESIAN, ISOMETRIC, ALL }
## ## Used to tell whether a color is being taken from the current theme, ## ## Used to tell whether a color is being taken from the current theme,
## or if it is a custom color. ## or if it is a custom color.

View file

@ -800,7 +800,10 @@ func _cel_switched() -> void:
var layer: BaseLayer = Global.current_project.layers[Global.current_project.current_layer] var layer: BaseLayer = Global.current_project.layers[Global.current_project.current_layer]
var layer_type := layer.get_layer_type() var layer_type := layer.get_layer_type()
# Do not make any changes when its the same type of layer, or a group layer # 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 return
_show_relevant_tools(layer_type) _show_relevant_tools(layer_type)

View file

@ -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"

View file

@ -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

View file

@ -640,10 +640,10 @@ func find_first_drawable_cel(frame := frames[current_frame]) -> BaseCel:
var result: BaseCel var result: BaseCel
var cel := frame.cels[0] var cel := frame.cels[0]
var i := 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] cel = frame.cels[i]
i += 1 i += 1
if not cel is GroupCel: if cel is not GroupCel and cel is not AudioCel:
result = cel result = cel
return result return result

View file

@ -855,6 +855,8 @@ func _on_add_layer_list_id_pressed(id: int) -> void:
Global.LayerTypes.THREE_D: Global.LayerTypes.THREE_D:
layer = Layer3D.new(project) layer = Layer3D.new(project)
SteamManager.set_achievement("ACH_3D_LAYER") SteamManager.set_achievement("ACH_3D_LAYER")
Global.LayerTypes.AUDIO:
layer = AudioLayer.new(project)
add_layer(layer, project) add_layer(layer, project)

View file

@ -240,7 +240,7 @@ offset_left = -22.0
offset_top = -10.0 offset_top = -10.0
offset_bottom = 10.0 offset_bottom = 10.0
mouse_default_cursor_shape = 2 mouse_default_cursor_shape = 2
item_count = 4 item_count = 5
popup/item_0/text = "Add Pixel Layer" popup/item_0/text = "Add Pixel Layer"
popup/item_1/text = "Add Group Layer" popup/item_1/text = "Add Group Layer"
popup/item_1/id = 1 popup/item_1/id = 1
@ -248,6 +248,8 @@ popup/item_2/text = "Add 3D Layer"
popup/item_2/id = 2 popup/item_2/id = 2
popup/item_3/text = "Add Tilemap Layer" popup/item_3/text = "Add Tilemap Layer"
popup/item_3/id = 3 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"] [node name="TextureRect" type="TextureRect" parent="TimelineContainer/TimelineButtons/LayerTools/MarginContainer/LayerSettingsContainer/LayerButtons/AddLayer/AddLayerList"]
layout_mode = 0 layout_mode = 0

View file

@ -15,6 +15,7 @@ var button_pressed := false:
get: get:
return main_button.button_pressed return main_button.button_pressed
var audio_player: AudioStreamPlayer
@onready var properties: AcceptDialog = Global.control.find_child("LayerProperties") @onready var properties: AcceptDialog = Global.control.find_child("LayerProperties")
@onready var main_button := %LayerMainButton as Button @onready var main_button := %LayerMainButton as Button
@onready var expand_button := %ExpandButton as BaseButton @onready var expand_button := %ExpandButton as BaseButton
@ -31,7 +32,7 @@ var button_pressed := false:
func _ready() -> void: func _ready() -> void:
main_button.layer_index = layer_index main_button.layer_index = layer_index
main_button.hierarchy_depth_pixel_shift = HIERARCHY_DEPTH_PIXEL_SHIFT 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] var layer := Global.current_project.layers[layer_index]
layer.name_changed.connect(func(): label.text = layer.name) layer.name_changed.connect(func(): label.text = layer.name)
layer.visibility_changed.connect(update_buttons) layer.visibility_changed.connect(update_buttons)
@ -39,6 +40,10 @@ func _ready() -> void:
linked_button.visible = true linked_button.visible = true
elif layer is GroupLayer: elif layer is GroupLayer:
expand_button.visible = true 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 custom_minimum_size.y = Global.animation_timeline.cel_size
label.text = layer.name label.text = layer.name
line_edit.text = layer.name line_edit.text = layer.name
@ -56,6 +61,12 @@ func _ready() -> void:
update_buttons() 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: func update_buttons() -> void:
var layer := Global.current_project.layers[layer_index] var layer := Global.current_project.layers[layer_index]
if layer is GroupLayer: if layer is GroupLayer:

View file

@ -169,7 +169,6 @@ caret_blink_interval = 0.5
disable_3d = true disable_3d = true
item_count = 2 item_count = 2
item_0/text = "Properties" item_0/text = "Properties"
item_0/id = 0
item_1/text = "Clipping mask" item_1/text = "Clipping mask"
item_1/checkable = 1 item_1/checkable = 1
item_1/id = 1 item_1/id = 1