]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/generate.cpp
Store functions definitions in Stage
[libs/gl.git] / source / glsl / generate.cpp
index 13b62aa32296a3d6c93c851827387205c08bfed1..ff863824055ae76ef51cc9fdd08521b2b3548aa2 100644 (file)
@@ -309,28 +309,42 @@ void VariableResolver::visit(InterfaceBlock &iface)
 }
 
 
+void FunctionResolver::apply(Stage &s)
+{
+       stage = &s;
+       s.content.visit(*this);
+}
+
 void FunctionResolver::visit(FunctionCall &call)
 {
-       map<string, vector<FunctionDeclaration *> >::iterator i = functions.find(call.name);
-       if(i!=functions.end())
-               call.declaration = i->second.back();
+       map<string, FunctionDeclaration *>::iterator i = stage->functions.find(call.name);
+       if(i!=stage->functions.end())
+               call.declaration = i->second;
 
        TraversingVisitor::visit(call);
 }
 
 void FunctionResolver::visit(FunctionDeclaration &func)
 {
-       vector<FunctionDeclaration *> &decls = functions[func.name];
+       FunctionDeclaration *&stage_decl = stage->functions[func.name];
+       vector<FunctionDeclaration *> &decls = declarations[func.name];
        if(func.definition==&func)
        {
+               stage_decl = &func;
+
                for(vector<FunctionDeclaration *>::iterator i=decls.begin(); i!=decls.end(); ++i)
                {
                        (*i)->definition = func.definition;
                        (*i)->body.body.clear();
                }
        }
-       else if(!decls.empty() && decls.back()->definition)
-               func.definition = decls.back()->definition;
+       else
+       {
+               if(!stage_decl)
+                       stage_decl = &func;
+
+               func.definition = stage_decl->definition;
+       }
        decls.push_back(&func);
 
        TraversingVisitor::visit(func);