{
unsigned column_count = basic->size&0xFFFF;
unsigned row_count = basic->size>>16;
+
+ vector<RefPtr<Expression> > columns;
+ columns.reserve(column_count);
+ bool changed_columns = false;
+
if(call.arguments.size()==1)
{
/* A matrix can be constructed from a single element or another
current_block->body.insert(insert_point, temporary);
// Create expressions to build each column.
- vector<RefPtr<Expression> > columns;
- columns.reserve(column_count);
for(unsigned j=0; j<column_count; ++j)
{
RefPtr<VariableReference> ref = new VariableReference;
truncate_vector(columns.back(), row_count);
}
- call.arguments.resize(column_count);
- copy(columns.begin(), columns.end(), call.arguments.begin());
-
- /* Let VariableResolver process the new nodes and finish
- resolving the constructor on the next pass. */
- r_any_resolved = true;
- return;
+ changed_columns = true;
}
else
return;
{
/* Construct a matrix from individual components in column-major
order. Arguments must align at column boundaries. */
- vector<RefPtr<Expression> > columns;
- columns.reserve(column_count);
-
vector<RefPtr<Expression> > column_args;
column_args.reserve(row_count);
unsigned column_component_count = 0;
else if(column_component_count>row_count)
// Argument alignment mismatch.
return;
+
+ changed_columns = true;
}
}
}
else
return;
+
+ if(changed_columns)
+ {
+ call.arguments.resize(column_count);
+ copy(columns.begin(), columns.end(), call.arguments.begin());
+
+ /* Let VariableResolver process the new nodes and finish
+ resolving the constructor on the next pass. */
+ r_any_resolved = true;
+ return;
+ }
}
else
return;
--- /dev/null
+uniform Transform
+{
+ vec3 translation;
+ float rotation;
+};
+
+#pragma MSP stage(vertex)
+layout(location=0) in vec2 position;
+void main()
+{
+ float c = cos(rotation);
+ float s = sin(rotation);
+ mat3 m = mat3(c, s, 0.0, -s, c, 0.0, translation);
+ gl_Position = vec4((m*vec3(position, 1.0)).xy, 0.0, 1.0);
+}
+
+/* Expected output: vertex
+layout(binding=48) uniform Transform
+{
+ vec3 translation;
+ float rotation;
+};
+layout(location=0) in vec2 position;
+void main()
+{
+ float c = cos(rotation);
+ float s = sin(rotation);
+
+ gl_Position = vec4((mat3(vec3(c, s, 0.0), vec3(-s, c, 0.0), translation)*vec3(position, 1.0)).xy, 0.0, 1.0);
+}
+*/