Do you know that you can use data structures as uniform variables in GLSL?
In the last version of the code sample pack, there is a demo (host_api/RubikCube/Cube_Rotation_Quaternion/demo_v3.xml) where the vertex shader has the following code:
#version 150 in vec4 gxl3d_Position; uniform mat4 gxl3d_ViewProjectionMatrix; struct Transform { vec4 position; vec4 axis_angle; }; uniform Transform T; ... ... vec3 rotate_vertex_position(vec3 position, vec3 axis, float angle) { ... } void main() { vec3 P = rotate_vertex_position(gxl3d_Position.xyz, T.axis_angle.xyz, T.axis_angle.w); P += T.position.xyz; gl_Position = gxl3d_ViewProjectionMatrix * vec4(P, 1); ... ... }
In this vertex shader, the variable T is a structure (struct Transform {...}) and is used as an uniform variable. Setting the values of the uniforms from Lua (or Python, or in C/C++) is quite simple:
gh_gpu_program.bind(gpu_prog) gh_gpu_program.uniform4f(gpu_prog, "T.axis_angle", 1, 0, 0, angle) gh_gpu_program.uniform4f(gpu_prog, "T.position", x, y, z, 1)