From: Mikko Rasa Date: Wed, 9 Nov 2016 13:35:25 +0000 (+0200) Subject: Inject the global context to the syntax tree X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=commitdiff_plain;h=70f9fe2964700fc199ab3cabb26f9b14d078c56b Inject the global context to the syntax tree ... rather than concatenating its text with the other contexts. --- diff --git a/source/programcompiler.cpp b/source/programcompiler.cpp index 19148312..1da80bab 100644 --- a/source/programcompiler.cpp +++ b/source/programcompiler.cpp @@ -19,11 +19,13 @@ ProgramCompiler::ProgramCompiler(): void ProgramCompiler::compile(const string &source) { module = &parser.parse(source); + process(); } void ProgramCompiler::compile(IO::Base &io) { module = &parser.parse(io); + process(); } void ProgramCompiler::add_shaders(Program &program) @@ -31,13 +33,13 @@ void ProgramCompiler::add_shaders(Program &program) if(!module) throw invalid_operation("ProgramCompiler::add_shaders"); - string global_source = "#version 150\n"+format_context(module->global_context); + string head = "#version 150\n"; if(module->vertex_context.present) - program.attach_shader_owned(new VertexShader(global_source+"\n"+format_context(module->vertex_context))); + program.attach_shader_owned(new VertexShader(head+format_context(module->vertex_context))); if(module->geometry_context.present) - program.attach_shader_owned(new GeometryShader(global_source+"\n"+format_context(module->geometry_context))); + program.attach_shader_owned(new GeometryShader(head+format_context(module->geometry_context))); if(module->fragment_context.present) - program.attach_shader_owned(new FragmentShader(global_source+"\n"+format_context(module->fragment_context))); + program.attach_shader_owned(new FragmentShader(head+format_context(module->fragment_context))); program.bind_attribute(VERTEX4, "vertex"); program.bind_attribute(NORMAL3, "normal"); @@ -45,6 +47,28 @@ void ProgramCompiler::add_shaders(Program &program) program.bind_attribute(TEXCOORD4, "texcoord"); } +void ProgramCompiler::process() +{ + if(module->vertex_context.present) + process(module->vertex_context); + if(module->geometry_context.present) + process(module->geometry_context); + if(module->fragment_context.present) + process(module->fragment_context); +} + +void ProgramCompiler::process(Context &context) +{ + inject_block(context.content, module->global_context.content); +} + +void ProgramCompiler::inject_block(Block &target, const Block &source) +{ + list >::iterator insert_point = target.body.begin(); + for(list >::const_iterator i=source.body.begin(); i!=source.body.end(); ++i) + target.body.insert(insert_point, (*i)->clone()); +} + string ProgramCompiler::format_context(Context &context) { Formatter formatter; @@ -135,7 +159,7 @@ void ProgramCompiler::Formatter::visit(Block &block) bool change_indent = (!formatted.empty() && !else_if); indent += change_indent; string spaces(indent*2, ' '); - for(vector >::iterator i=block.body.begin(); i!=block.body.end(); ++i) + for(list >::iterator i=block.body.begin(); i!=block.body.end(); ++i) { if(i!=block.body.begin()) formatted += '\n'; diff --git a/source/programcompiler.h b/source/programcompiler.h index 1959618f..63ead7a4 100644 --- a/source/programcompiler.h +++ b/source/programcompiler.h @@ -52,6 +52,9 @@ public: void add_shaders(Program &); private: + void process(); + void process(ProgramSyntax::Context &); + static void inject_block(ProgramSyntax::Block &, const ProgramSyntax::Block &); std::string format_context(ProgramSyntax::Context &); }; diff --git a/source/programsyntax.h b/source/programsyntax.h index 99ce8b9c..8f72a0bd 100644 --- a/source/programsyntax.h +++ b/source/programsyntax.h @@ -1,6 +1,7 @@ #ifndef MSP_GL_PROGRAMSYNTAX_H_ #define MSP_GL_PROGRAMSYNTAX_H_ +#include #include #include #include @@ -47,7 +48,7 @@ struct VariableDeclaration; struct Block: Node { - std::vector > body; + std::list > body; bool use_braces; Block();