]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programcompiler.cpp
Set both min and mag filters when exporting textures
[libs/gl.git] / source / programcompiler.cpp
index 88ec6e59d88054480457be91cd0da9e14f201f02..3dc07d80fa4dd2566c069d0cae5bdb4451f7ac5d 100644 (file)
@@ -8,6 +8,8 @@
 #include "resources.h"
 #include "shader.h"
 
+#undef interface
+
 using namespace std;
 
 namespace {
@@ -543,24 +545,40 @@ void ProgramCompiler::Formatter::visit(Conditional &cond)
 
 void ProgramCompiler::Formatter::visit(Iteration &iter)
 {
-       formatted += "for(";
-       if(iter.init_statement)
-               iter.init_statement->visit(*this);
-       else
-               formatted += ';';
-       if(iter.condition)
+       if(!iter.init_statement && iter.condition && !iter.loop_expression)
        {
-               formatted += ' ';
+               formatted += "while(";
                iter.condition->visit(*this);
+               formatted += ')';
        }
-       formatted += ';';
-       if(iter.loop_expression)
+       else
        {
-               formatted += ' ';
-               iter.loop_expression->visit(*this);
+               formatted += "for(";
+               if(iter.init_statement)
+                       iter.init_statement->visit(*this);
+               else
+                       formatted += ';';
+               if(iter.condition)
+               {
+                       formatted += ' ';
+                       iter.condition->visit(*this);
+               }
+               formatted += ';';
+               if(iter.loop_expression)
+               {
+                       formatted += ' ';
+                       iter.loop_expression->visit(*this);
+               }
+               formatted += ')';
+       }
+
+       if(iter.body.body.empty())
+               formatted += " { }";
+       else
+       {
+               formatted += '\n';
+               iter.body.visit(*this);
        }
-       formatted += ')';
-       iter.body.visit(*this);
 }
 
 void ProgramCompiler::Formatter::visit(Return &ret)
@@ -1207,6 +1225,13 @@ void ProgramCompiler::FunctionInliner::visit(FunctionCall &call)
                inline_result = 0;
 }
 
+void ProgramCompiler::FunctionInliner::visit(VariableDeclaration &var)
+{
+       if(var.init_expression)
+               visit_and_inline(var.init_expression);
+       inline_result = 0;
+}
+
 void ProgramCompiler::FunctionInliner::visit(Return &ret)
 {
        TraversingVisitor::visit(ret);
@@ -1390,6 +1415,7 @@ ProgramCompiler::UnusedVariableLocator::UnusedVariableLocator():
        aggregate(0),
        assignment(0),
        assignment_target(false),
+       assign_to_subscript(false),
        global_scope(true)
 { }
 
@@ -1435,6 +1461,8 @@ void ProgramCompiler::UnusedVariableLocator::visit(BinaryExpression &binary)
 {
        if(binary.oper=="[")
        {
+               if(assignment_target)
+                       assign_to_subscript = true;
                binary.left->visit(*this);
                SetForScope<bool> set(assignment_target, false);
                binary.right->visit(*this);
@@ -1446,6 +1474,7 @@ void ProgramCompiler::UnusedVariableLocator::visit(BinaryExpression &binary)
 void ProgramCompiler::UnusedVariableLocator::visit(Assignment &assign)
 {
        {
+               assign_to_subscript = false;
                SetForScope<bool> set(assignment_target, !assign.self_referencing);
                assign.left->visit(*this);
        }
@@ -1453,10 +1482,10 @@ void ProgramCompiler::UnusedVariableLocator::visit(Assignment &assign)
        assignment = &assign;
 }
 
-void ProgramCompiler::UnusedVariableLocator::record_assignment(VariableDeclaration &var, Node &node, bool self_ref)
+void ProgramCompiler::UnusedVariableLocator::record_assignment(VariableDeclaration &var, Node &node, bool chained)
 {
        VariableInfo &var_info = variables.back()[&var];
-       if(!self_ref)
+       if(!chained)
                clear_assignments(var_info, true);
        var_info.assignments.push_back(&node);
        var_info.conditionally_assigned = false;
@@ -1477,7 +1506,7 @@ void ProgramCompiler::UnusedVariableLocator::visit(ExpressionStatement &expr)
        assignment = 0;
        TraversingVisitor::visit(expr);
        if(assignment && assignment->target_declaration)
-               record_assignment(*assignment->target_declaration, expr, assignment->self_referencing);
+               record_assignment(*assignment->target_declaration, expr, (assignment->self_referencing || assign_to_subscript));
 }
 
 void ProgramCompiler::UnusedVariableLocator::visit(StructDeclaration &strct)
@@ -1658,6 +1687,13 @@ void ProgramCompiler::NodeRemover::visit(VariableDeclaration &var)
                var.init_expression = 0;
 }
 
+void ProgramCompiler::NodeRemover::visit(Iteration &iter)
+{
+       if(to_remove.count(iter.init_statement.get()))
+               iter.init_statement = 0;
+       TraversingVisitor::visit(iter);
+}
+
 
 void ProgramCompiler::PrecisionRemover::visit(Precision &)
 {