void ShaderCompilerGLES2::_dump_function_deps(SL::ShaderNode *p_node, const StringName &p_for_func, const Map<StringName, String> &p_func_code, StringBuilder &r_to_add, Set<StringName> &r_added) { int fidx = -1; for (int i = 0; i < p_node->functions.size(); i++) { if (p_node->functions[i].name == p_for_func) { fidx = i; break; } } ERR_FAIL_COND(fidx == -1); for (Set<StringName>::Element *E = p_node->functions[fidx].uses_function.front(); E; E = E->next()) { if (r_added.has(E->get())) { continue; } _dump_function_deps(p_node, E->get(), p_func_code, r_to_add, r_added); SL::FunctionNode *fnode = NULL; for (int i = 0; i < p_node->functions.size(); i++) { if (p_node->functions[i].name == E->get()) { fnode = p_node->functions[i].function; break; } } ERR_FAIL_COND(!fnode); r_to_add += "\n"; StringBuffer<128> header; header += _typestr(fnode->return_type); header += " "; header += _mkid(fnode->name); header += "("; for (int i = 0; i < fnode->arguments.size(); i++) { if (i > 0) header += ", "; header += _qualstr(fnode->arguments[i].qualifier); header += _prestr(fnode->arguments[i].precision); header += _typestr(fnode->arguments[i].type); header += " "; header += _mkid(fnode->arguments[i].name); } header += ")\n"; r_to_add += header.as_string(); r_to_add += p_func_code[E->get()]; r_added.insert(E->get()); } }
void ShaderCompilerGLES3::_dump_function_deps(SL::ShaderNode *p_node, const StringName &p_for_func, const Map<StringName, String> &p_func_code, String &r_to_add, Set<StringName> &added) { int fidx = -1; for (int i = 0; i < p_node->functions.size(); i++) { if (p_node->functions[i].name == p_for_func) { fidx = i; break; } } ERR_FAIL_COND(fidx == -1); for (Set<StringName>::Element *E = p_node->functions[fidx].uses_function.front(); E; E = E->next()) { print_line(String(p_node->functions[fidx].name) + " uses function: " + String(E->get())); if (added.has(E->get())) { continue; //was added already } _dump_function_deps(p_node, E->get(), p_func_code, r_to_add, added); SL::FunctionNode *fnode = NULL; for (int i = 0; i < p_node->functions.size(); i++) { if (p_node->functions[i].name == E->get()) { fnode = p_node->functions[i].function; break; } } ERR_FAIL_COND(!fnode); r_to_add += "\n"; String header; header = _typestr(fnode->return_type) + " " + _mkid(fnode->name) + "("; for (int i = 0; i < fnode->arguments.size(); i++) { if (i > 0) header += ", "; header += _qualstr(fnode->arguments[i].qualifier) + _prestr(fnode->arguments[i].precision) + _typestr(fnode->arguments[i].type) + " " + _mkid(fnode->arguments[i].name); } header += ")\n"; r_to_add += header; r_to_add += p_func_code[E->get()]; added.insert(E->get()); } }