summaryrefslogtreecommitdiffstats
path: root/scene/resources/shader.cpp
diff options
context:
space:
mode:
authorMagian <zang_magian@163.com>2024-04-26 17:48:11 +0800
committerMagian <zang_magian@163.com>2024-04-26 17:48:11 +0800
commite3a7c751f284347fe97a940af74352da65bbf8ec (patch)
tree6b054758a8ae9c63093df6e37126057209708f35 /scene/resources/shader.cpp
parent4a0160241fd0c1e874e297f6b08676cf0761e5e8 (diff)
downloadredot-engine-e3a7c751f284347fe97a940af74352da65bbf8ec.tar.gz
Implement tooltips for shader uniform in the inspector.
using regular expressions
Diffstat (limited to 'scene/resources/shader.cpp')
-rw-r--r--scene/resources/shader.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/scene/resources/shader.cpp b/scene/resources/shader.cpp
index 5b375905cc..296c914c65 100644
--- a/scene/resources/shader.cpp
+++ b/scene/resources/shader.cpp
@@ -37,6 +37,15 @@
#include "servers/rendering_server.h"
#include "texture.h"
+#ifdef TOOLS_ENABLED
+#include "editor/editor_help.h"
+
+#include "modules/modules_enabled.gen.h" // For regex.
+#ifdef MODULE_REGEX_ENABLED
+#include "modules/regex/regex.h"
+#endif
+#endif
+
Shader::Mode Shader::get_mode() const {
return mode;
}
@@ -121,6 +130,11 @@ void Shader::get_shader_uniform_list(List<PropertyInfo> *p_params, bool p_get_gr
List<PropertyInfo> local;
RenderingServer::get_singleton()->get_shader_parameter_list(shader, &local);
+#ifdef TOOLS_ENABLED
+ DocData::ClassDoc class_doc;
+ class_doc.name = get_path();
+ class_doc.is_script_doc = true;
+#endif
for (PropertyInfo &pi : local) {
bool is_group = pi.usage == PROPERTY_USAGE_GROUP || pi.usage == PROPERTY_USAGE_SUBGROUP;
if (!p_get_groups && is_group) {
@@ -136,9 +150,38 @@ void Shader::get_shader_uniform_list(List<PropertyInfo> *p_params, bool p_get_gr
if (pi.type == Variant::RID) {
pi.type = Variant::OBJECT;
}
+#ifdef TOOLS_ENABLED
+ if (Engine::get_singleton()->is_editor_hint()) {
+#ifdef MODULE_REGEX_ENABLED
+ const RegEx pattern("/\\*\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/\\s*uniform\\s+\\w+\\s+" + pi.name + "(?=[\\s:;=])");
+ Ref<RegExMatch> pattern_ref = pattern.search(code);
+ if (pattern_ref != nullptr) {
+ RegExMatch *match = pattern_ref.ptr();
+ const RegEx pattern_tip("\\/\\*\\*([\\s\\S]*?)\\*/");
+ Ref<RegExMatch> pattern_tip_ref = pattern_tip.search(match->get_string(0));
+ RegExMatch *match_tip = pattern_tip_ref.ptr();
+ const RegEx pattern_stripped("\\n\\s*\\*\\s*");
+ DocData::PropertyDoc prop_doc;
+ prop_doc.name = "shader_parameter/" + pi.name;
+ prop_doc.description = pattern_stripped.sub(match_tip->get_string(1), "\n", true);
+ class_doc.properties.push_back(prop_doc);
+ }
+#else
+ DocData::PropertyDoc prop_doc;
+ prop_doc.name = "shader_parameter/" + pi.name;
+ // prop_doc.description = "(Regex module is not enabled, shader parameter documentation will not be available.)";
+ class_doc.properties.push_back(prop_doc);
+#endif
+ }
+#endif
p_params->push_back(pi);
}
}
+#ifdef TOOLS_ENABLED
+ if (!class_doc.name.is_empty() && p_params) {
+ EditorHelp::get_doc_data()->add_doc(class_doc);
+ }
+#endif
}
RID Shader::get_rid() const {