{ FRAGMENT, "l_diffuse[i]", "float", "max(dot(n_zzz_normal, n_zzz_light_dir[i]), 0.0)", 0 },
{ FRAGMENT, "l_shadow", "float", "mix(1.0, shadow_sample, shadow_darkness)", 0 },
- { FRAGMENT, "shadow_sample", "float", "shadow2D(shadow, shd_vertex).r", 0 },
+ { FRAGMENT, "shadow_sample", "float", "shadow2D(shadow, shd_vertex)", 0 },
{ FRAGMENT, "zzz_reflect_dir", "vec3", "reflect(zzz_incident_dir, n_zzz_normal)", 0 },
{ FRAGMENT, "n_zzz_half_vec[i]", "vec3", "normalize(zzz_light_dir[i]-zzz_incident_dir)", 0 },
aliases["texture2D"] = "texture";
aliases["shadow2D"] = "texture";
}
+ else
+ aliases["shadow2D"] = "shadow2D(...).r";
}
void ProgramBuilder::set_optimize(bool o)
return result;
}
-string ProgramBuilder::replace_identifiers(const char *expression, const map<string, string> &replace_map)
+string ProgramBuilder::replace_identifiers(const char *expression, const map<string, string> &replace_map, bool with_functions)
{
string result;
const char *ptr = expression;
string identifier(ptr+start, length);
map<string, string>::const_iterator i = replace_map.find(identifier);
if(i!=replace_map.end())
+ {
+ if(with_functions && ptr[start+length]=='(')
+ {
+ string::size_type lparen = i->second.find('(');
+ string::size_type rparen = i->second.rfind(')');
+ if(lparen!=string::npos && rparen!=string::npos)
+ {
+ unsigned level = 1;
+ unsigned j;
+ for(j=start+length+1; (ptr[j] && level); ++j)
+ {
+ level += (ptr[j]=='(');
+ level -= (ptr[j]==')');
+ }
+
+ if(!level)
+ {
+ string subexpr(ptr+start+length, ptr+j);
+ result += i->second.substr(0, lparen);
+ result += replace_identifiers(subexpr.c_str(), replace_map, with_functions);
+ result += i->second.substr(rparen+1);
+ ptr += j;
+ continue;
+ }
+ }
+ }
+
result += i->second;
+ }
else
result += identifier;
ptr += start+length;
string ProgramBuilder::create_expression(const ShaderVariable &var, const char *loop) const
{
string expr = var.create_expression(loop);
- return replace_identifiers(expr.c_str(), aliases);
+ return replace_identifiers(expr.c_str(), aliases, true);
}
static MatchType name_match(const char *, const char *, const char ** = 0);
static bool parse_identifier(const char *, unsigned &, unsigned &);
static std::vector<std::string> extract_identifiers(const char *);
- static std::string replace_identifiers(const char *, const std::map<std::string, std::string> &);
+ static std::string replace_identifiers(const char *, const std::map<std::string, std::string> &, bool = false);
std::string create_expression(const ShaderVariable &, const char * = 0) const;
};