Merge pull request #69600 from Chaosus/fix_global_shader_crash

Fix setting a global shader variable in the project settings
This commit is contained in:
Rémi Verschelde 2022-12-05 18:06:05 +01:00
commit fd5142769b
No known key found for this signature in database
GPG Key ID: C3336907360768E1
1 changed files with 24 additions and 19 deletions

View File

@ -69,28 +69,12 @@ static const char *global_var_type_names[RS::GLOBAL_VAR_TYPE_MAX] = {
class ShaderGlobalsEditorInterface : public Object {
GDCLASS(ShaderGlobalsEditorInterface, Object)
void _var_changed() {
emit_signal(SNAME("var_changed"));
}
protected:
static void _bind_methods() {
ClassDB::bind_method("_var_changed", &ShaderGlobalsEditorInterface::_var_changed);
ADD_SIGNAL(MethodInfo("var_changed"));
}
bool _set(const StringName &p_name, const Variant &p_value) {
Variant existing = RS::get_singleton()->global_shader_parameter_get(p_name);
if (existing.get_type() == Variant::NIL) {
return false;
}
void _set_var(const StringName &p_name, const Variant &p_value, const Variant &p_prev_value) {
Ref<EditorUndoRedoManager> &undo_redo = EditorNode::get_undo_redo();
undo_redo->create_action(TTR("Set Shader Global Variable"));
undo_redo->add_do_method(RS::get_singleton(), "global_shader_parameter_set", p_name, p_value);
undo_redo->add_undo_method(RS::get_singleton(), "global_shader_parameter_set", p_name, existing);
undo_redo->add_undo_method(RS::get_singleton(), "global_shader_parameter_set", p_name, p_prev_value);
RS::GlobalShaderParameterType type = RS::get_singleton()->global_shader_parameter_get_type(p_name);
Dictionary gv;
gv["type"] = global_var_type_names[type];
@ -111,8 +95,29 @@ protected:
undo_redo->add_do_method(this, "_var_changed");
undo_redo->add_undo_method(this, "_var_changed");
block_update = true;
undo_redo->commit_action(false);
undo_redo->commit_action();
block_update = false;
}
void _var_changed() {
emit_signal(SNAME("var_changed"));
}
protected:
static void _bind_methods() {
ClassDB::bind_method("_set_var", &ShaderGlobalsEditorInterface::_set_var);
ClassDB::bind_method("_var_changed", &ShaderGlobalsEditorInterface::_var_changed);
ADD_SIGNAL(MethodInfo("var_changed"));
}
bool _set(const StringName &p_name, const Variant &p_value) {
Variant existing = RS::get_singleton()->global_shader_parameter_get(p_name);
if (existing.get_type() == Variant::NIL) {
return false;
}
call_deferred("_set_var", p_name, p_value, existing);
return true;
}