]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/finalize.cpp
Refactor projection matrix handling
[libs/gl.git] / source / glsl / finalize.cpp
index 29eef60fb3342d12c31374441ed7a076d343ea2c..fb136e33c7dbc79fd03706ba6ef3450d4906fe5c 100644 (file)
@@ -239,6 +239,56 @@ void LocationAllocator::visit(VariableDeclaration &var)
 }
 
 
+void DepthRangeConverter::apply(Stage &stage, const Features &features)
+{
+       if(stage.type!=Stage::VERTEX || features.target_api==VULKAN)
+               return;
+
+       stage.content.visit(*this);
+}
+
+void DepthRangeConverter::visit(FunctionDeclaration &func)
+{
+       if(func.definition==&func && func.name=="main")
+       {
+               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);
+       }
+}
+
+
 void PrecisionConverter::apply(Stage &s)
 {
        stage = &s;