From: Mikko Rasa Date: Mon, 10 Oct 2022 11:47:41 +0000 (+0300) Subject: Refactor statement creation in DepthRangeConverter into a function X-Git-Url: https://git.tdb.fi/?a=commitdiff_plain;h=6a45ca92758673cda62a6fd5f3de56647be98742;p=libs%2Fgl.git Refactor statement creation in DepthRangeConverter into a function --- diff --git a/source/glsl/finalize.cpp b/source/glsl/finalize.cpp index 469cb92d..e4d61ad1 100644 --- a/source/glsl/finalize.cpp +++ b/source/glsl/finalize.cpp @@ -260,6 +260,44 @@ void DepthRangeConverter::apply(Stage &stage, const Features &features) stage.content.visit(*this); } +NodePtr 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(var.type); @@ -296,42 +334,7 @@ void DepthRangeConverter::visit(FunctionDeclaration &func) 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()); } diff --git a/source/glsl/finalize.h b/source/glsl/finalize.h index 4fc2e1b0..510f3987 100644 --- a/source/glsl/finalize.h +++ b/source/glsl/finalize.h @@ -75,6 +75,8 @@ public: void apply(Stage &, const Features &); private: + NodePtr create_conversion_statement(); + virtual void visit(VariableReference &); virtual void visit(MemberAccess &); virtual void visit(Swizzle &);