]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/generate.cpp
Don't copy type declaration of a generated interface variable
[libs/gl.git] / source / glsl / generate.cpp
index 38eda220cee20533db6936e1b79d0831c01aefff..4230a402a0dc413b23e331a5248f3671dc412ff4 100644 (file)
@@ -228,6 +228,13 @@ void VariableResolver::visit(MemberAccess &memacc)
        }
 }
 
+void VariableResolver::visit(UnaryExpression &unary)
+{
+       TraversingVisitor::visit(unary);
+       r_members = 0;
+       r_iface_ref = 0;
+}
+
 void VariableResolver::visit(BinaryExpression &binary)
 {
        if(binary.oper->token[0]=='[')
@@ -241,13 +248,14 @@ void VariableResolver::visit(BinaryExpression &binary)
                binary.left->visit(*this);
                if(r_iface_ref)
                        binary.left = r_iface_ref;
-               r_iface_ref = 0;
        }
        else
        {
                TraversingVisitor::visit(binary);
                r_members = 0;
        }
+
+       r_iface_ref = 0;
 }
 
 void VariableResolver::visit(Assignment &assign)
@@ -263,6 +271,15 @@ void VariableResolver::visit(Assignment &assign)
 
        assign.self_referencing = (r_self_referencing || assign.oper->token[0]!='=');
        assign.target_declaration = r_assignment_target;
+       r_members = 0;
+       r_iface_ref = 0;
+}
+
+void VariableResolver::visit(FunctionCall &call)
+{
+       TraversingVisitor::visit(call);
+       r_members = 0;
+       r_iface_ref = 0;
 }
 
 void VariableResolver::visit(StructDeclaration &strct)
@@ -398,7 +415,6 @@ bool InterfaceGenerator::generate_interface(VariableDeclaration &var, const stri
        iface_var->sampling = var.sampling;
        iface_var->interface = iface;
        iface_var->type = var.type;
-       iface_var->type_declaration = var.type_declaration;
        iface_var->name = name;
        if(stage->type==Stage::GEOMETRY && !copy_block)
                iface_var->array = ((var.array && var.interface!="in") || iface=="in");
@@ -606,11 +622,10 @@ void InterfaceGenerator::visit(Passthrough &pass)
                const map<string, VariableDeclaration *> &prev_vars = stage->previous->content.variables;
                for(map<string, VariableDeclaration *>::const_iterator i=prev_vars.begin(); i!=prev_vars.end(); ++i)
                {
-                       bool linked = false;
-                       for(vector<VariableDeclaration *>::const_iterator j=pass_vars.begin(); (!linked && j!=pass_vars.end()); ++j)
-                               linked = ((*j)->linked_declaration==i->second);
+                       if(i->second->interface!="out")
+                               continue;
 
-                       if(!linked && generate_interface(*i->second, "in", i->second->name))
+                       if(!i->second->linked_declaration && generate_interface(*i->second, "in", i->second->name))
                                pass_vars.push_back(i->second);
                }
        }