X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fresolve.cpp;h=8bfe635ee73b8d2f3c0dd1bd9dd7414313117263;hb=3773733011653d67e47768cf031e95f8f68cf714;hp=05aead3c5fa369f55529c02c05c34fe7a6997dba;hpb=bbe2fb7bc1384d7683f1795b5cfa9168df18c580;p=libs%2Fgl.git diff --git a/source/glsl/resolve.cpp b/source/glsl/resolve.cpp index 05aead3c..8bfe635e 100644 --- a/source/glsl/resolve.cpp +++ b/source/glsl/resolve.cpp @@ -225,7 +225,7 @@ void VariableResolver::visit(VariableReference &var) if(!declaration) { const map &blocks = stage->interface_blocks; - map::const_iterator i = blocks.find("_"+var.name); + map::const_iterator i = blocks.find(var.name); if(i!=blocks.end()) { /* The name refers to an interface block with an instance name rather @@ -259,7 +259,7 @@ void VariableResolver::visit(VariableReference &var) void VariableResolver::visit(InterfaceBlockReference &iface) { - map::iterator i = stage->interface_blocks.find("_"+iface.name); + map::iterator i = stage->interface_blocks.find(iface.name); InterfaceBlock *declaration = (i!=stage->interface_blocks.end() ? i->second : 0); r_any_resolved |= (declaration!=iface.declaration); iface.declaration = declaration; @@ -279,21 +279,18 @@ void VariableResolver::visit(MemberAccess &memacc) TraversingVisitor::visit(memacc); VariableDeclaration *declaration = 0; + int index = -1; if(StructDeclaration *strct = dynamic_cast(memacc.left->type)) { map::iterator i = strct->members.variables.find(memacc.member); if(i!=strct->members.variables.end()) { declaration = i->second; + for(NodeList::const_iterator j=strct->members.body.begin(); (j!=strct->members.body.end() && j->get()!=i->second); ++j) + ++index; if(record_target) - { - unsigned index = 0; - for(NodeList::const_iterator j=strct->members.body.begin(); (j!=strct->members.body.end() && j->get()!=i->second); ++j) - ++index; - add_to_chain(Assignment::Target::MEMBER, index); - } } } else if(BasicTypeDeclaration *basic = dynamic_cast(memacc.left->type)) @@ -324,8 +321,9 @@ void VariableResolver::visit(MemberAccess &memacc) } } - r_any_resolved |= (declaration!=memacc.declaration); + r_any_resolved |= (declaration!=memacc.declaration || index!=memacc.index); memacc.declaration = declaration; + memacc.index = index; } void VariableResolver::visit(Swizzle &swizzle) @@ -432,9 +430,9 @@ void VariableResolver::visit(InterfaceBlock &iface) { /* Block names can be reused in different interfaces. Prefix the name with the first character of the interface to avoid conflicts. */ - stage->interface_blocks.insert(make_pair(iface.interface+iface.block_name, &iface)); + stage->interface_blocks.insert(make_pair(format("%s %s", iface.interface, iface.block_name), &iface)); if(!iface.instance_name.empty()) - stage->interface_blocks.insert(make_pair("_"+iface.instance_name, &iface)); + stage->interface_blocks.insert(make_pair(iface.instance_name, &iface)); TraversingVisitor::visit(iface); }