namespace GL {
namespace SL {
-Formatter::Formatter():
- stage(0),
- source_index(0),
- source_line(1),
- indent(0),
- parameter_list(false),
- omit_builtin(false),
- r_empty_name(false)
-{ }
-
string Formatter::apply(Stage &s)
{
stage = &s;
if(ver)
{
append(format("#version %d%02d", ver.major, ver.minor));
- if(s.required_features.gl_api==OPENGL_ES2 && ver>=Version(3, 0))
+ if(s.required_features.target_api==OPENGL_ES && ver>=Version(3, 0))
append(" es");
formatted += '\n';
}
void Formatter::visit(VariableReference &var)
{
- append(var.name);
- r_empty_name = false;
-}
-
-void Formatter::visit(InterfaceBlockReference &iface)
-{
- r_empty_name = iface.declaration->instance_name.empty();
+ r_empty_name = var.name.find(' ')!=string::npos;
if(!r_empty_name)
- append(iface.declaration->instance_name);
+ append(var.name);
}
void Formatter::visit(MemberAccess &memacc)
visit_expression(*ternary.condition, ternary.oper, false);
append(ternary.oper->token);
visit_expression(*ternary.true_expr, ternary.oper, false);
- if(ternary.oper->token2)
+ if(ternary.oper->token2[0])
append(ternary.oper->token2);
visit_expression(*ternary.false_expr, ternary.oper, true);
}
void Formatter::visit(StructDeclaration &strct)
{
+ if(!strct.block_name.empty())
+ return;
+
append(format("struct %s\n", strct.name));
strct.members.visit(*this);
append(';');
}
if(!var.precision.empty())
append(format("%s ", var.precision));
- string type_name = var.type_declaration->name;
- if(var.array)
- type_name = type_name.substr(0, type_name.find('['));
- append(format("%s %s", type_name, var.name));
+
+ if(var.block_declaration)
+ {
+ append(format("%s\n", var.block_declaration->block_name));
+ var.block_declaration->members.visit(*this);
+ if(var.name.find(' ')==string::npos)
+ append(format(" %s", var.name));
+ }
+ else
+ {
+ string type_name = var.type_declaration->name;
+ if(var.array)
+ type_name = type_name.substr(0, type_name.find('['));
+ append(format("%s %s", type_name, var.name));
+ }
+
if(var.array)
{
append('[');
append(';');
}
-void Formatter::visit(InterfaceBlock &iface)
-{
- if(iface.layout)
- {
- iface.layout->visit(*this);
- append(' ');
- }
- append(format("%s %s\n", iface.interface, iface.block_name));
- if(iface.struct_declaration)
- iface.struct_declaration->members.visit(*this);
- if(!iface.instance_name.empty())
- {
- append(' ');
- append(iface.instance_name);
- if(iface.array)
- append("[]");
- }
- append(';');
-}
-
void Formatter::visit(FunctionDeclaration &func)
{
append(format("%s %s(", func.return_type_declaration->name, func.name));