Repository: godotengine/godot
File: scene/resources/shader.h (C/C++)

Code before:
	virtual bool is_text_shader() const;

	_FORCE_INLINE_ StringName remap_uniform(const StringName &p_uniform) const {
		if (params_cache_dirty) {
			get_shader_uniform_list(nullptr);
		}

		const HashMap<StringName, StringName>::Iterator E = params_cache.find(p_uniform);
		if (E) {
			return E->value;
		}
		return StringName();
	}

	virtual RID get_rid() const override;

	Shader();
	~Shader();
};

VARIANT_ENUM_CAST(Shader::Mode);

class ResourceFormatLoaderShader : public ResourceFormatLoader {
public:
	virtual Ref<Resource> load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, CacheMode p_cache_mode = CACHE_MODE_REUSE);
	virtual void get_recognized_extensions(List<String> *p_extensions) const;
	virtual bool handles_type(const String &p_type) const;
	virtual String get_resource_type(const String &p_path) const;
};

class ResourceFormatSaverShader : public ResourceFormatSaver {
public:
	virtual Error save(const Ref<Resource> &p_resource, const String &p_path, uint32_t p_flags = 0);
	virtual void get_recognized_extensions(const Ref<Resource> &p_resource, List<String> *p_extensions) const;
	virtual bool recognize(const Ref<Resource> &p_resource) const;
};

#endif // SHADER_H


Review comment (suggestion):
CC @tinmanjuggernaut

How long should this compatibility last? I put in the comment beta or rc 4.0, but beta is already nearing close. It might be worth it to keep it for now, then remove _all_ compatibility in Godot 5 (shouldn't be a big deal, since I think `shader_param/` is now used in Godot 3, 4, and future versions)

Code after:
	virtual bool is_text_shader() const;

	// Finds the shader parameter name for the given property name, which should start with "shader_parameter/".
	_FORCE_INLINE_ StringName remap_parameter(const StringName &p_property) const {
		if (params_cache_dirty) {
			get_shader_uniform_list(nullptr);
		}

		String n = p_property;

		// Backwards compatibility with old shader parameter names.
		// Note: The if statements are important to make sure we are only replacing text exactly at index 0.
		if (n.find("param/") == 0) {
			n = n.replace_first("param/", "shader_parameter/");
		}
		if (n.find("shader_param/") == 0) {
			n = n.replace_first("shader_param/", "shader_parameter/");
		}
		if (n.find("shader_uniform/") == 0) {
			n = n.replace_first("shader_uniform/", "shader_parameter/");
		}

		{
			// Additional backwards compatibility for projects between #62972 and #64092 (about a month of v4.0 development).
			// These projects did not have any prefix for shader uniforms due to a bug.
			// This code should be removed during beta or rc of 4.0.
			const HashMap<StringName, StringName>::Iterator E = params_cache.find(n);
			if (E) {
				return E->value;
			}
		}

		if (n.begins_with("shader_parameter/")) {
			n = n.replace_first("shader_parameter/", "");
			const HashMap<StringName, StringName>::Iterator E = params_cache.find(n);
			if (E) {
				return E->value;
			}
		}

		return StringName();
	}

	virtual RID get_rid() const override;

	Shader();
	~Shader();
};

VARIANT_ENUM_CAST(Shader::Mode);