stage.content.visit(*this);
}
+NodePtr<Statement> DepthRangeConverter::create_conversion_statement()
+{
+ VariableReference *position = new VariableReference;
+ position->name = "gl_Position";
+
+ MemberAccess *z = new MemberAccess;
+ z->left = position;
+ z->member = "z";
+
+ Literal *scale = new Literal;
+ scale->token = "2.0";
+ scale->value = 2.0f;
+
+ BinaryExpression *multiply = new BinaryExpression;
+ multiply->oper = &Operator::get_operator("*", Operator::BINARY);
+ multiply->left = z;
+ multiply->right = scale;
+
+ MemberAccess *w = new MemberAccess;
+ w->left = position->clone();
+ w->member = "w";
+
+ BinaryExpression *subtract = new BinaryExpression;
+ subtract->oper = &Operator::get_operator("-", Operator::BINARY);
+ subtract->left = multiply;
+ subtract->right = w;
+
+ Assignment *assign = new Assignment;
+ assign->oper = &Operator::get_operator("=", Operator::BINARY);
+ assign->left = z->clone();
+ assign->right = subtract;
+
+ ExpressionStatement *statement = new ExpressionStatement;
+ statement->expression = assign;
+
+ return statement;
+}
+
void DepthRangeConverter::visit(VariableReference &var)
{
const StructDeclaration *strct = dynamic_cast<const StructDeclaration *>(var.type);
TraversingVisitor::visit(func);
if(func.definition==&func && func.name=="main" && !r_position_z_assigned)
- {
- VariableReference *position = new VariableReference;
- position->name = "gl_Position";
-
- MemberAccess *z = new MemberAccess;
- z->left = position;
- z->member = "z";
-
- Literal *scale = new Literal;
- scale->token = "2.0";
- scale->value = 2.0f;
-
- BinaryExpression *multiply = new BinaryExpression;
- multiply->oper = &Operator::get_operator("*", Operator::BINARY);
- multiply->left = z;
- multiply->right = scale;
-
- MemberAccess *w = new MemberAccess;
- w->left = position->clone();
- w->member = "w";
-
- BinaryExpression *subtract = new BinaryExpression;
- subtract->oper = &Operator::get_operator("-", Operator::BINARY);
- subtract->left = multiply;
- subtract->right = w;
-
- Assignment *assign = new Assignment;
- assign->oper = &Operator::get_operator("=", Operator::BINARY);
- assign->left = z->clone();
- assign->right = subtract;
-
- ExpressionStatement *statement = new ExpressionStatement;
- statement->expression = assign;
-
- func.body.body.push_back(statement);
- }
+ func.body.body.push_back_nocopy(create_conversion_statement());
}