Пример #1
0
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());
	}
}
Пример #2
0
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());
	}
}