]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programcompiler.cpp
Support layout declarations on variables
[libs/gl.git] / source / programcompiler.cpp
index d65869316423d64806a23bdf3e60254d0f014ce7..ece48cf06e2606219e76e6fb86bd03577a98074a 100644 (file)
@@ -123,9 +123,8 @@ void ProgramCompiler::process()
 
 void ProgramCompiler::import(const string &name)
 {
-       if(!resources)
-               throw runtime_error("no resources");
-       RefPtr<IO::Seekable> io = resources->open_raw(name+".glsl");
+       string fn = name+".glsl";
+       RefPtr<IO::Seekable> io = (resources ? resources->open_raw(fn) : Resources::get_builtins().open(fn));
        if(!io)
                throw runtime_error(format("module %s not found", name));
        ProgramParser import_parser;
@@ -335,7 +334,13 @@ void ProgramCompiler::Formatter::visit(Layout &layout)
                if(!i->value.empty())
                        formatted += format("=%s", i->value);
        }
-       formatted += format(") %s;", layout.interface);
+       formatted += ')';
+}
+
+void ProgramCompiler::Formatter::visit(InterfaceLayout &layout)
+{
+       layout.layout.visit(*this);
+       formatted += format(" %s;", layout.interface);
 }
 
 void ProgramCompiler::Formatter::visit(StructDeclaration &strct)
@@ -347,6 +352,11 @@ void ProgramCompiler::Formatter::visit(StructDeclaration &strct)
 
 void ProgramCompiler::Formatter::visit(VariableDeclaration &var)
 {
+       if(var.layout)
+       {
+               var.layout->visit(*this);
+               formatted += ' ';
+       }
        if(var.constant)
                formatted += "const ";
        if(!var.sampling.empty())
@@ -479,6 +489,7 @@ void ProgramCompiler::DeclarationCombiner::visit(VariableDeclaration &var)
        VariableDeclaration *&ptr = variables[var.name];
        if(ptr)
        {
+               ptr->type = var.type;
                if(var.init_expression)
                        ptr->init_expression = var.init_expression;
                remove_node = true;