throw invalid_operation("ProgramCompiler::add_shaders");
string head = "#version 150\n";
- if(module->vertex_stage.present)
- program.attach_shader_owned(new VertexShader(head+format_stage(module->vertex_stage)));
- if(module->geometry_stage.present)
- program.attach_shader_owned(new GeometryShader(head+format_stage(module->geometry_stage)));
- if(module->fragment_stage.present)
- program.attach_shader_owned(new FragmentShader(head+format_stage(module->fragment_stage)));
+ for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
+ {
+ if(i->type==VERTEX)
+ program.attach_shader_owned(new VertexShader(head+create_source(*i)));
+ else if(i->type==GEOMETRY)
+ program.attach_shader_owned(new GeometryShader(head+create_source(*i)));
+ else if(i->type==FRAGMENT)
+ program.attach_shader_owned(new FragmentShader(head+create_source(*i)));
+ }
program.bind_attribute(VERTEX4, "vertex");
program.bind_attribute(NORMAL3, "normal");
void ProgramCompiler::process()
{
- if(module->vertex_stage.present)
- generate(module->vertex_stage);
- if(module->geometry_stage.present)
- generate(module->geometry_stage);
- if(module->fragment_stage.present)
- generate(module->fragment_stage);
-
- if(module->vertex_stage.present)
- optimize(module->vertex_stage);
- if(module->geometry_stage.present)
- optimize(module->geometry_stage);
- if(module->fragment_stage.present)
- optimize(module->fragment_stage);
+ for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
+ generate(*i);
+ for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
+ optimize(*i);
}
void ProgramCompiler::generate(Stage &stage)
stage.content.visit(resolver);
}
-string ProgramCompiler::format_stage(Stage &stage)
+string ProgramCompiler::create_source(Stage &stage)
{
Formatter formatter;
stage.content.visit(formatter);