diff --git a/src/Classes/BaseLayer.gd b/src/Classes/BaseLayer.gd index 6531fa4ce..0332d1dee 100644 --- a/src/Classes/BaseLayer.gd +++ b/src/Classes/BaseLayer.gd @@ -206,12 +206,16 @@ func display_effects(cel: BaseCel) -> Image: ## Returns a curated [Dictionary] containing the layer data. func serialize() -> Dictionary: assert(index == project.layers.find(self)) + var effect_data: Array[Dictionary] = [] + for effect in effects: + effect_data.append(effect.serialize()) var dict := { "name": name, "visible": visible, "locked": locked, "blend_mode": blend_mode, - "parent": parent.index if is_instance_valid(parent) else -1 + "parent": parent.index if is_instance_valid(parent) else -1, + "effects": effect_data } if not cel_link_sets.is_empty(): var cels := [] # Cels array for easy finding of the frame index for link_set saving @@ -246,6 +250,14 @@ func deserialize(dict: Dictionary) -> void: var linked_cel: BaseCel = link_set["cels"][0] cel.set_content(linked_cel.get_content(), linked_cel.image_texture) cel_link_sets.append(link_set) + if dict.has("effects"): + for effect_dict in dict["effects"]: + if not typeof(effect_dict) == TYPE_DICTIONARY: + print("Loading effect failed, not a dictionary.") + continue + var effect := LayerEffect.new() + effect.deserialize(effect_dict) + effects.append(effect) ## Returns a layer type that is one of the [param LayerTypes] diff --git a/src/Classes/LayerEffect.gd b/src/Classes/LayerEffect.gd index 9a2ea211f..bf613217f 100644 --- a/src/Classes/LayerEffect.gd +++ b/src/Classes/LayerEffect.gd @@ -7,7 +7,7 @@ var params := {} var enabled := true -func _init(_name: String, _shader: Shader, _params := {}) -> void: +func _init(_name := "", _shader: Shader = null, _params := {}) -> void: name = _name shader = _shader params = _params @@ -15,3 +15,27 @@ func _init(_name: String, _shader: Shader, _params := {}) -> void: func duplicate() -> LayerEffect: return LayerEffect.new(name, shader, params.duplicate()) + + +func serialize() -> Dictionary: + var p_str := {} + for param in params: + p_str[param] = var_to_str(params[param]) + return {"name": name, "shader_path": shader.resource_path, "params": p_str, "enabled": enabled} + + +func deserialize(dict: Dictionary) -> void: + if dict.has("name"): + name = dict["name"] + if dict.has("shader_path"): + var path: String = dict["shader_path"] + var shader_to_load = load(path) + if is_instance_valid(shader_to_load) and shader_to_load is Shader: + shader = shader_to_load + if dict.has("params"): + for param in dict["params"]: + if typeof(dict["params"][param]) == TYPE_STRING: + dict["params"][param] = str_to_var(dict["params"][param]) + params = dict["params"] + if dict.has("enabled"): + enabled = dict["enabled"]