X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Fglsl%2Freflect.cpp;h=688c99bf81b951ae288a23c9d5409e94fd7903c8;hb=42903b905cd3924ecc45d3cb08222bc3548cab91;hp=a3e36be8448c57eba60bd4ae6a154525e95a4b59;hpb=03d9003072e85c934f5624329fb4a34db8763db2;p=libs%2Fgl.git diff --git a/source/glsl/reflect.cpp b/source/glsl/reflect.cpp index a3e36be8..688c99bf 100644 --- a/source/glsl/reflect.cpp +++ b/source/glsl/reflect.cpp @@ -1,5 +1,7 @@ #include "reflect.h" +using namespace std; + namespace Msp { namespace GL { namespace SL { @@ -41,6 +43,50 @@ void LocationCounter::visit(VariableDeclaration &var) r_count *= literal->value.value(); } + +set DependencyCollector::apply(FunctionDeclaration &func) +{ + func.visit(*this); + return dependencies; +} + +void DependencyCollector::visit(VariableReference &var) +{ + if(var.declaration && !locals.count(var.declaration)) + { + dependencies.insert(var.declaration); + var.declaration->visit(*this); + } +} + +void DependencyCollector::visit(InterfaceBlockReference &iface) +{ + if(iface.declaration) + { + dependencies.insert(iface.declaration); + iface.declaration->visit(*this); + } +} + +void DependencyCollector::visit(FunctionCall &call) +{ + if(call.declaration) + dependencies.insert(call.declaration); + TraversingVisitor::visit(call); +} + +void DependencyCollector::visit(VariableDeclaration &var) +{ + locals.insert(&var); + if(var.type_declaration) + { + dependencies.insert(var.type_declaration); + var.type_declaration->visit(*this); + } + + TraversingVisitor::visit(var); +} + } // namespace SL } // namespace GL } // namespace Msp