sales@scenomics.com +1 650 396 9674


Release Notes

Release details are described below.

Table 1.1. Description of Changes.

Change Log

Fixed a bug in <Float32MatrixArrayNode> and <Float64MatrixArrayNode>. The ::GetValueString() method incorrectly printed the matrices in row order.

Added data interfaces to <AddChannelModifier> that allow you to easily determine the type of vertex attribute it represents.

AddChannelModifier m;
if( m.IsPositionAttribute() )
{
   // Do something...
}
else
if( m.IsNormalAttribute() )
{
   // Do something else...
}

Added Color::GetCount() data interface. This allows you to have a reliable way to iterate over the members of a <Color> object.

auto Color a_oValue;

for( int c = 0; c < a_oValue.GetCount(); ++c )
{
   a_oValue.SetComponent( c, 255 );
}

Added a new Scenome Scripting Language library TYPE_VARIABLE_NODE_GENERATE_GL_DATA_UTIL.SSL. This library uses the values stored in <VariableNode> objects marked as uniform to generate static declarations. For example, the library generates declarations that make it possible to create C/C++ code such as the following:

#pragma once
#include "UniformData.h"

#include <GL/gl.h>

// sab = static (storage duration) array (of) bools
// sai = static (storage duration) array (of) integers
// sau = static (storage duration) array (of) unsigned integers
// saf = static (storage duration) array (of) floats

const GLint sai_width_height[] = { 0, 0 }; // Generated by Scenome Scripting Language... and all others as well.

const GLint sai_aspect_ratio[] = { 0, 1 };

const GLfloat saf_mesh_min[] = { -32.000000, -32.000000, 0.000000, 1.000000 };

const GLfloat saf_mesh_max[] = { 32.000000, 32.000000, 0.000000, 1.000000 };

const GLfloat saf_background_color[] = { 0.501960784314, 0.501960784314, 0.501960784314, 0.00000000000 };

const GLfloat saf_tint_color[] = { 1.00000000000, 1.00000000000, 1.00000000000, 1.00000000000 };

const GLfloat saf_temp_mat2x3_array[4][2][3] = {
   { { 0, 1, 2 }, { 4, 5, 6 } },
   { { 16, 17, 18 }, { 20, 21, 22 } },
   { { 32, 33, 34 }, { 36, 37, 38 } },
   { { 48, 49, 50 }, { 52, 53, 54 } } };

const GLfloat saf_temp_mat2x2_array[4][2][2] = {
   { { 0, 1 }, { 4, 5 } },
   { { 16, 17 }, { 20, 21 } },
   { { 32, 33 }, { 36, 37 } },
   { { 48, 49 }, { 52, 53 } } };

const GLfloat saf_temp_mat2x4_array[4][2][4] = {
   { { 0, 1, 2, 3 }, { 4, 5, 6, 7 } },
   { { 16, 17, 18, 19 }, { 20, 21, 22, 23 } },
   { { 32, 33, 34, 35 }, { 36, 37, 38, 39 } },
   { { 48, 49, 50, 51 }, { 52, 53, 54, 55 } } };

const GLfloat saf_temp_mat3x2_array[4][3][2] =
   { { { 0, 1 }, { 4, 5 }, { 8, 9 } },
   { { 16, 17 }, { 20, 21 }, { 24, 25 } },
   { { 32, 33 }, { 36, 37 }, { 40, 41 } },
   { { 48, 49 }, { 52, 53 }, { 56, 57 } } };

const GLfloat saf_temp_mat3x3_array[4][3][3] = {
   { { 0, 1, 2 }, { 4, 5, 6 }, { 8, 9, 10 } },
   { { 16, 17, 18 }, { 20, 21, 22 }, { 24, 25, 26 } },
   { { 32, 33, 34 }, { 36, 37, 38 }, { 40, 41, 42 } },
   { { 48, 49, 50 }, { 52, 53, 54 }, { 56, 57, 58 } } };

const GLfloat saf_temp_mat3x4_array[4][3][4] = {
   { { 0, 1, 2, 3 }, { 4, 5, 6, 7 }, { 8, 9, 10, 11 } },
   { { 16, 17, 18, 19 }, { 20, 21, 22, 23 }, { 24, 25, 26, 27 } },
   { { 32, 33, 34, 35 }, { 36, 37, 38, 39 }, { 40, 41, 42, 43 } },
   { { 48, 49, 50, 51 }, { 52, 53, 54, 55 }, { 56, 57, 58, 59 } } };

const GLfloat saf_temp_mat4x2_array[4][4][2] = {
   { { 0, 1 }, { 4, 5 }, { 8, 9 }, { 12, 13 } },
   { { 16, 17 }, { 20, 21 }, { 24, 25 }, { 28, 29 } },
   { { 32, 33 }, { 36, 37 }, { 40, 41 }, { 44, 45 } },
   { { 48, 49 }, { 52, 53 }, { 56, 57 }, { 60, 61 } } };

const GLfloat saf_temp_mat4x3_array[4][4][3] = {
   { { 0, 1, 2 }, { 4, 5, 6 }, { 8, 9, 10 }, { 12, 13, 14 } },
   { { 16, 17, 18 }, { 20, 21, 22 }, { 24, 25, 26 }, { 28, 29, 30 } },
   { { 32, 33, 34 }, { 36, 37, 38 }, { 40, 41, 42 }, { 44, 45, 46 } },
   { { 48, 49, 50 }, { 52, 53, 54 }, { 56, 57, 58 }, { 60, 61, 62 } } };

const GLfloat saf_temp_mat4x4_array[4][4][4] = {
   { { 0, 1, 2, 3 }, { 4, 5, 6, 7 }, { 8, 9, 10, 11 }, { 12, 13, 14, 15 } },
   { { 16, 17, 18, 19 }, { 20, 21, 22, 23 }, { 24, 25, 26, 27 }, { 28, 29, 30, 31 } },
   { { 32, 33, 34, 35 }, { 36, 37, 38, 39 }, { 40, 41, 42, 43 }, { 44, 45, 46, 47 } },
   { { 48, 49, 50, 51 }, { 52, 53, 54, 55 }, { 56, 57, 58, 59 }, { 60, 61, 62, 63 } } };

const GLint sb_bcounter = 1;

const GLint sab_bcount_data[] = { false, false, false, false, false, false, false };

const GLint sab_temp_bvec2[] = { true, false };

const GLint sab_temp_bvec3[] = { true, false, true };

const GLint sab_temp_bvec4[] = { true, false, true, false };

const GLint sab_temp_bvec2_array[][4] = {
   { false, false },
   { false, false },
   { false, false },
   { false, false } };

const GLint sab_temp_bvec3_array[][4] = {
   { false, false, false },
   { false, false, false },
   { false, false, false },
   { false, false, false } };

const GLint sab_temp_bvec4_array[][4] = {
   { false, false, false, false },
   { false, false, false, false },
   { false, false, false, false },
   { false, false, false, false } };

const GLint si_icounter = -1;

const GLint sai_icount_data[] = { 0, 0, 0, 0, 0, 0, 0 };

const GLint sai_temp_ivec2[] = { 0, 1 };

const GLint sai_temp_ivec3[] = { 0, 1, 2 };

const GLint sai_temp_ivec4[] = { 0, 1, 2, 3 };

const GLint sai_temp_ivec2_array[][4] = {
   { 0, 1 },
   { 4, 5 },
   { 8, 9 },
   { 12, 13 } };

const GLint sai_temp_ivec3_array[][4] = {
   { 0, 1, 2 },
   { 4, 5, 6 },
   { 8, 9, 10 },
   { 12, 13, 14 } };

const GLint sai_temp_ivec4_array[][4] = {
   { 0, 1, 2, 3 },
   { 4, 5, 6, 7 },
   { 8, 9, 10, 11 },
   { 12, 13, 14, 15 } };

const GLuint su_ucounter = 0;

const GLuint sau_ucount_data[] = { 0, 0, 0, 0, 0, 0, 0 };

const GLuint sau_temp_uvec2[] = { 0, 1 };

const GLuint sau_temp_uvec3[] = { 0, 1, 2 };

const GLuint sau_temp_uvec4[] = { 0, 1, 2, 3 };

const GLuint sau_temp_uvec2_array[][4] = {
   { 0, 1 },
   { 4, 5 },
   { 8, 9 },
   { 12, 13 } };

const GLuint sau_temp_uvec3_array[][4] = {
   { 0, 1, 2 },
   { 4, 5, 6 },
   { 8, 9, 10 },
   { 12, 13, 14 } };

const GLuint sau_temp_uvec4_array[][4] = {
   { 0, 1, 2, 3 },
   { 4, 5, 6, 7 },
   { 8, 9, 10, 11 },
   { 12, 13, 14, 15 } };

const GLfloat sf_fcounter = 0;

const GLfloat saf_fcount_data[] = { 0, 0, 0, 0, 0, 0, 0 };

const GLfloat saf_temp_vec2[] = { 0.000000, 1.000000 };

const GLfloat saf_temp_vec3[] = { 0.000000, 1.000000, 2.000000 };

const GLfloat saf_temp_vec4[] = { 0.000000, 1.000000, 2.000000, 3.000000 };

const GLfloat saf_temp_vec2_array[][4] = {
   { 0.000000, 1.000000 },
   { 4.000000, 5.000000 },
   { 8.000000, 9.000000 },
   { 12.000000, 13.000000 } };

const GLfloat saf_temp_vec3_array[][4] = {
   { 0.000000, 1.000000, 2.000000 },
   { 4.000000, 5.000000, 6.000000 },
   { 8.000000, 9.000000, 10.000000 },
   { 12.000000, 13.000000, 14.000000 } };

const GLfloat saf_temp_vec4_array[][4] = {
   { 0.000000, 1.000000, 2.000000, 3.000000 },
   { 4.000000, 5.000000, 6.000000, 7.000000 },
   { 8.000000, 9.000000, 10.000000, 11.000000 },
   { 12.000000, 13.000000, 14.000000, 15.000000 } };

const GLfloat saf_temp_mat2x2[2][2] = {
   { 0.000000, 1.000000 },
   { 4.000000, 5.000000 } };

const GLfloat saf_temp_mat2x3[2][3] = {
   { 0.000000, 1.000000, 2.000000 },
   { 4.000000, 5.000000, 6.000000 } };

const GLfloat saf_temp_mat2x4[2][4] = {
   { 0.000000, 1.000000, 2.000000, 3.000000 },
   { 4.000000, 5.000000, 6.000000, 7.000000 } };

const GLfloat saf_temp_mat3x2[3][2] = {
   { 0.000000, 1.000000 },
   { 4.000000, 5.000000 },
   { 8.000000, 9.000000 } };

const GLfloat saf_temp_mat3x3[3][3] = {
   { 0.000000, 1.000000, 2.000000 },
   { 4.000000, 5.000000, 6.000000 },
   { 8.000000, 9.000000, 10.000000 } };

const GLfloat saf_temp_mat3x4[3][4] = {
   { 0.000000, 1.000000, 2.000000, 3.000000 },
   { 4.000000, 5.000000, 6.000000, 7.000000 },
   { 8.000000, 9.000000, 10.000000, 11.000000 } };

const GLfloat saf_temp_mat4x2[4][2] = {
   { 0.000000, 1.000000 },
   { 4.000000, 5.000000 },
   { 8.000000, 9.000000 },
   { 12.000000, 13.000000 } };

const GLfloat saf_temp_mat4x3[4][3] = {
   { 0.000000, 1.000000, 2.000000 },
   { 4.000000, 5.000000, 6.000000 },
   { 8.000000, 9.000000, 10.000000 },
   { 12.000000, 13.000000, 14.000000 } };

const GLfloat saf_temp_mat4x4[4][4] = {
   { 0.000000, 1.000000, 2.000000, 3.000000 },
   { 4.000000, 5.000000, 6.000000, 7.000000 },
   { 8.000000, 9.000000, 10.000000, 11.000000 },
   { 12.000000, 13.000000, 14.000000, 15.000000 } };

Added a new Scenome Scripting Language library TYPE_VARIABLE_NODE_GENERATE_GL_SET_UNIFORM_CALL_UTIL.SSL. This library uses <VariableNode> objects marked as uniform to generate GL calls that set the uniform on the GPU. It's very easy to make changes to either library. For example, the library generates small snippets such as the following:

// apb = automatic (storage duration) pointer to an array (of) bools
// api = automatic (storage duration) pointer to an array (of) integers
// apu = automatic (storage duration) pointer to an array (of) unsigned integers
// apf = automatic (storage duration) pointer to an array (of) floats

// sab = static (storage duration) array (of) bools
// sai = static (storage duration) array (of) integers
// sau = static (storage duration) array (of) unsigned integers
// saf = static (storage duration) array (of) floats

// ivec
GLuint width_height_location = p_roBind.c_pfn_glGetUniformLocation( program, "width_height" );
printf( "uniform 'width_height' location: %d\n", width_height_location );
const GLint * api_width_height = sai_width_height;
p_roBind.c_pfn_glUniform2iv( width_height_location, 1, api_width_height );

// ivec
GLuint aspect_ratio_location = p_roBind.c_pfn_glGetUniformLocation( program, "aspect_ratio" );
printf( "uniform 'aspect_ratio' location: %d\n", aspect_ratio_location );
const GLint * api_aspect_ratio = sai_aspect_ratio;
p_roBind.c_pfn_glUniform2iv( aspect_ratio_location, 1, api_aspect_ratio );

// vec
GLuint mesh_min_location = p_roBind.c_pfn_glGetUniformLocation( program, "mesh_min" );
printf( "uniform 'mesh_min' location: %d\n", mesh_min_location );
const GLfloat * apf_mesh_min = saf_mesh_min;
p_roBind.c_pfn_glUniform4fv( mesh_min_location, 1, apf_mesh_min );

// vec
GLuint mesh_max_location = p_roBind.c_pfn_glGetUniformLocation( program, "mesh_max" );
printf( "uniform 'mesh_max' location: %d\n", mesh_max_location );
const GLfloat * apf_mesh_max = saf_mesh_max;
p_roBind.c_pfn_glUniform4fv( mesh_max_location, 1, apf_mesh_max );

// vec
GLuint background_color_location = p_roBind.c_pfn_glGetUniformLocation( program, "background_color" );
printf( "uniform 'background_color' location: %d\n", background_color_location );
const GLfloat * apf_background_color = saf_background_color;
p_roBind.c_pfn_glUniform4fv( background_color_location, 1, apf_background_color );

// vec
GLuint tint_color_location = p_roBind.c_pfn_glGetUniformLocation( program, "tint_color" );
printf( "uniform 'tint_color' location: %d\n", tint_color_location );
const GLfloat * apf_tint_color = saf_tint_color;
p_roBind.c_pfn_glUniform4fv( tint_color_location, 1, apf_tint_color );

// mat2x3
GLuint temp_mat2x3_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_mat2x3_array" );
printf( "uniform 'temp_mat2x3_array' location: %d\n", temp_mat2x3_array_location );
const GLfloat * apf_temp_mat2x3_array = saf_temp_mat2x3_array[0][0];
p_roBind.c_pfn_glUniformMatrix2x3fv( temp_mat2x3_array_location, 6, false, apf_temp_mat2x3_array );

// mat2
GLuint temp_mat2x2_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_mat2x2_array" );
printf( "uniform 'temp_mat2x2_array' location: %d\n", temp_mat2x2_array_location );
const GLfloat * apf_temp_mat2x2_array = saf_temp_mat2x2_array[0][0];
p_roBind.c_pfn_glUniformMatrix2fv( temp_mat2x2_array_location, 4, false, apf_temp_mat2x2_array );

// mat2x4
GLuint temp_mat2x4_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_mat2x4_array" );
printf( "uniform 'temp_mat2x4_array' location: %d\n", temp_mat2x4_array_location );
const GLfloat * apf_temp_mat2x4_array = saf_temp_mat2x4_array[0][0];
p_roBind.c_pfn_glUniformMatrix2x4fv( temp_mat2x4_array_location, 8, false, apf_temp_mat2x4_array );

// mat3x2
GLuint temp_mat3x2_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_mat3x2_array" );
printf( "uniform 'temp_mat3x2_array' location: %d\n", temp_mat3x2_array_location );
const GLfloat * apf_temp_mat3x2_array = saf_temp_mat3x2_array[0][0];
p_roBind.c_pfn_glUniformMatrix3x2fv( temp_mat3x2_array_location, 6, false, apf_temp_mat3x2_array );

// mat3
GLuint temp_mat3x3_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_mat3x3_array" );
printf( "uniform 'temp_mat3x3_array' location: %d\n", temp_mat3x3_array_location );
const GLfloat * apf_temp_mat3x3_array = saf_temp_mat3x3_array[0][0];
p_roBind.c_pfn_glUniformMatrix3fv( temp_mat3x3_array_location, 9, false, apf_temp_mat3x3_array );

// mat3x4
GLuint temp_mat3x4_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_mat3x4_array" );
printf( "uniform 'temp_mat3x4_array' location: %d\n", temp_mat3x4_array_location );
const GLfloat * apf_temp_mat3x4_array = saf_temp_mat3x4_array[0][0];
p_roBind.c_pfn_glUniformMatrix3x4fv( temp_mat3x4_array_location, 12, false, apf_temp_mat3x4_array );

// mat4x2
GLuint temp_mat4x2_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_mat4x2_array" );
printf( "uniform 'temp_mat4x2_array' location: %d\n", temp_mat4x2_array_location );
const GLfloat * apf_temp_mat4x2_array = saf_temp_mat4x2_array[0][0];
p_roBind.c_pfn_glUniformMatrix4x2fv( temp_mat4x2_array_location, 8, false, apf_temp_mat4x2_array );

// mat4x3
GLuint temp_mat4x3_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_mat4x3_array" );
printf( "uniform 'temp_mat4x3_array' location: %d\n", temp_mat4x3_array_location );
const GLfloat * apf_temp_mat4x3_array = saf_temp_mat4x3_array[0][0];
p_roBind.c_pfn_glUniformMatrix4x3fv( temp_mat4x3_array_location, 12, false, apf_temp_mat4x3_array );

// mat4
GLuint temp_mat4x4_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_mat4x4_array" );
printf( "uniform 'temp_mat4x4_array' location: %d\n", temp_mat4x4_array_location );
const GLfloat * apf_temp_mat4x4_array = saf_temp_mat4x4_array[0][0];
p_roBind.c_pfn_glUniformMatrix4fv( temp_mat4x4_array_location, 16, false, apf_temp_mat4x4_array );

// int
GLuint bcounter_location = p_roBind.c_pfn_glGetUniformLocation( program, "bcounter" );
printf( "uniform 'bcounter' location: %d\n", bcounter_location );
p_roBind.c_pfn_glUniform1i( bcounter_location, sb_bcounter );

// bool[]
GLuint bcount_data_location = p_roBind.c_pfn_glGetUniformLocation( program, "bcount_data" );
printf( "uniform 'bcount_data' location: %d\n", bcount_data_location );
const GLint * apb_bcount_data = sab_bcount_data;
p_roBind.c_pfn_glUniform1iv( bcount_data_location, 7, apb_bcount_data );

// bvec
GLuint temp_bvec2_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_bvec2" );
printf( "uniform 'temp_bvec2' location: %d\n", temp_bvec2_location );
const GLint * apb_temp_bvec2 = sab_temp_bvec2;
p_roBind.c_pfn_glUniform2iv( temp_bvec2_location, 1, apb_temp_bvec2 );

// bvec
GLuint temp_bvec3_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_bvec3" );
printf( "uniform 'temp_bvec3' location: %d\n", temp_bvec3_location );
const GLint * apb_temp_bvec3 = sab_temp_bvec3;
p_roBind.c_pfn_glUniform3iv( temp_bvec3_location, 1, apb_temp_bvec3 );

// bvec
GLuint temp_bvec4_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_bvec4" );
printf( "uniform 'temp_bvec4' location: %d\n", temp_bvec4_location );
const GLint * apb_temp_bvec4 = sab_temp_bvec4;
p_roBind.c_pfn_glUniform4iv( temp_bvec4_location, 1, apb_temp_bvec4 );

// bvec[]
GLuint temp_bvec2_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_bvec2_array" );
printf( "uniform 'temp_bvec2_array' location: %d\n", temp_bvec2_array_location );
const GLint * apb_temp_bvec2_array = sab_temp_bvec2_array[0];
p_roBind.c_pfn_glUniform2iv( temp_bvec2_array_location, 4, apb_temp_bvec2_array );

// bvec[]
GLuint temp_bvec3_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_bvec3_array" );
printf( "uniform 'temp_bvec3_array' location: %d\n", temp_bvec3_array_location );
const GLint * apb_temp_bvec3_array = sab_temp_bvec3_array[0];
p_roBind.c_pfn_glUniform3iv( temp_bvec3_array_location, 4, apb_temp_bvec3_array );

// bvec[]
GLuint temp_bvec4_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_bvec4_array" );
printf( "uniform 'temp_bvec4_array' location: %d\n", temp_bvec4_array_location );
const GLint * apb_temp_bvec4_array = sab_temp_bvec4_array[0];
p_roBind.c_pfn_glUniform4iv( temp_bvec4_array_location, 4, apb_temp_bvec4_array );

// int
GLuint icounter_location = p_roBind.c_pfn_glGetUniformLocation( program, "icounter" );
printf( "uniform 'icounter' location: %d\n", icounter_location );
p_roBind.c_pfn_glUniform1i( icounter_location, si_icounter );

// int[]
GLuint icount_data_location = p_roBind.c_pfn_glGetUniformLocation( program, "icount_data" );
printf( "uniform 'icount_data' location: %d\n", icount_data_location );
const GLint * api_icount_data = sai_icount_data;
p_roBind.c_pfn_glUniform1iv( icount_data_location, 7, api_icount_data );

// ivec
GLuint temp_ivec2_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_ivec2" );
printf( "uniform 'temp_ivec2' location: %d\n", temp_ivec2_location );
const GLint * api_temp_ivec2 = sai_temp_ivec2;
p_roBind.c_pfn_glUniform2iv( temp_ivec2_location, 1, api_temp_ivec2 );

// ivec
GLuint temp_ivec3_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_ivec3" );
printf( "uniform 'temp_ivec3' location: %d\n", temp_ivec3_location );
const GLint * api_temp_ivec3 = sai_temp_ivec3;
p_roBind.c_pfn_glUniform3iv( temp_ivec3_location, 1, api_temp_ivec3 );

// ivec
GLuint temp_ivec4_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_ivec4" );
printf( "uniform 'temp_ivec4' location: %d\n", temp_ivec4_location );
const GLint * api_temp_ivec4 = sai_temp_ivec4;
p_roBind.c_pfn_glUniform4iv( temp_ivec4_location, 1, api_temp_ivec4 );

// ivec[]
GLuint temp_ivec2_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_ivec2_array" );
printf( "uniform 'temp_ivec2_array' location: %d\n", temp_ivec2_array_location );
const GLint * api_temp_ivec2_array = sai_temp_ivec2_array[0];
p_roBind.c_pfn_glUniform2iv( temp_ivec2_array_location, 4, api_temp_ivec2_array );

// ivec[]
GLuint temp_ivec3_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_ivec3_array" );
printf( "uniform 'temp_ivec3_array' location: %d\n", temp_ivec3_array_location );
const GLint * api_temp_ivec3_array = sai_temp_ivec3_array[0];
p_roBind.c_pfn_glUniform3iv( temp_ivec3_array_location, 4, api_temp_ivec3_array );

// ivec[]
GLuint temp_ivec4_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_ivec4_array" );
printf( "uniform 'temp_ivec4_array' location: %d\n", temp_ivec4_array_location );
const GLint * api_temp_ivec4_array = sai_temp_ivec4_array[0];
p_roBind.c_pfn_glUniform4iv( temp_ivec4_array_location, 4, api_temp_ivec4_array );

// uint
GLuint ucounter_location = p_roBind.c_pfn_glGetUniformLocation( program, "ucounter" );
printf( "uniform 'ucounter' location: %d\n", ucounter_location );
p_roBind.c_pfn_glUniform1ui( ucounter_location, su_ucounter );

// uint[]
GLuint ucount_data_location = p_roBind.c_pfn_glGetUniformLocation( program, "ucount_data" );
printf( "uniform 'ucount_data' location: %d\n", ucount_data_location );
const GLuint * apu_ucount_data = sau_ucount_data;
p_roBind.c_pfn_glUniform1uiv( ucount_data_location, 7, apu_ucount_data );

// uvec
GLuint temp_uvec2_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_uvec2" );
printf( "uniform 'temp_uvec2' location: %d\n", temp_uvec2_location );
const GLuint * apu_temp_uvec2 = sau_temp_uvec2;
p_roBind.c_pfn_glUniform2uiv( temp_uvec2_location, 1, apu_temp_uvec2 );

// uvec
GLuint temp_uvec3_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_uvec3" );
printf( "uniform 'temp_uvec3' location: %d\n", temp_uvec3_location );
const GLuint * apu_temp_uvec3 = sau_temp_uvec3;
p_roBind.c_pfn_glUniform3uiv( temp_uvec3_location, 1, apu_temp_uvec3 );

// uvec
GLuint temp_uvec4_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_uvec4" );
printf( "uniform 'temp_uvec4' location: %d\n", temp_uvec4_location );
const GLuint * apu_temp_uvec4 = sau_temp_uvec4;
p_roBind.c_pfn_glUniform4uiv( temp_uvec4_location, 1, apu_temp_uvec4 );

// uvec[]
GLuint temp_uvec2_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_uvec2_array" );
printf( "uniform 'temp_uvec2_array' location: %d\n", temp_uvec2_array_location );
const GLuint * apu_temp_uvec2_array = sau_temp_uvec2_array[0];
p_roBind.c_pfn_glUniform2uiv( temp_uvec2_array_location, 4, apu_temp_uvec2_array );

// uvec[]
GLuint temp_uvec3_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_uvec3_array" );
printf( "uniform 'temp_uvec3_array' location: %d\n", temp_uvec3_array_location );
const GLuint * apu_temp_uvec3_array = sau_temp_uvec3_array[0];
p_roBind.c_pfn_glUniform3uiv( temp_uvec3_array_location, 4, apu_temp_uvec3_array );

// uvec[]
GLuint temp_uvec4_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_uvec4_array" );
printf( "uniform 'temp_uvec4_array' location: %d\n", temp_uvec4_array_location );
const GLuint * apu_temp_uvec4_array = sau_temp_uvec4_array[0];
p_roBind.c_pfn_glUniform4uiv( temp_uvec4_array_location, 4, apu_temp_uvec4_array );

// float
GLuint fcounter_location = p_roBind.c_pfn_glGetUniformLocation( program, "fcounter" );
printf( "uniform 'fcounter' location: %d\n", fcounter_location );
p_roBind.c_pfn_glUniform1f( fcounter_location, sf_fcounter );

// float[]
GLuint fcount_data_location = p_roBind.c_pfn_glGetUniformLocation( program, "fcount_data" );
printf( "uniform 'fcount_data' location: %d\n", fcount_data_location );
const GLfloat * apf_fcount_data = saf_fcount_data;
p_roBind.c_pfn_glUniform1fv( fcount_data_location, 7, apf_fcount_data );

// vec
GLuint temp_vec2_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_vec2" );
printf( "uniform 'temp_vec2' location: %d\n", temp_vec2_location );
const GLfloat * apf_temp_vec2 = saf_temp_vec2;
p_roBind.c_pfn_glUniform2fv( temp_vec2_location, 1, apf_temp_vec2 );

// vec
GLuint temp_vec3_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_vec3" );
printf( "uniform 'temp_vec3' location: %d\n", temp_vec3_location );
const GLfloat * apf_temp_vec3 = saf_temp_vec3;
p_roBind.c_pfn_glUniform3fv( temp_vec3_location, 1, apf_temp_vec3 );

// vec
GLuint temp_vec4_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_vec4" );
printf( "uniform 'temp_vec4' location: %d\n", temp_vec4_location );
const GLfloat * apf_temp_vec4 = saf_temp_vec4;
p_roBind.c_pfn_glUniform4fv( temp_vec4_location, 1, apf_temp_vec4 );

// vec[]
GLuint temp_vec2_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_vec2_array" );
printf( "uniform 'temp_vec2_array' location: %d\n", temp_vec2_array_location );
const GLfloat * apf_temp_vec2_array = saf_temp_vec2_array[0];
p_roBind.c_pfn_glUniform2fv( temp_vec2_array_location, 4, apf_temp_vec2_array );

// vec[]
GLuint temp_vec3_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_vec3_array" );
printf( "uniform 'temp_vec3_array' location: %d\n", temp_vec3_array_location );
const GLfloat * apf_temp_vec3_array = saf_temp_vec3_array[0];
p_roBind.c_pfn_glUniform3fv( temp_vec3_array_location, 4, apf_temp_vec3_array );

// vec[]
GLuint temp_vec4_array_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_vec4_array" );
printf( "uniform 'temp_vec4_array' location: %d\n", temp_vec4_array_location );
const GLfloat * apf_temp_vec4_array = saf_temp_vec4_array[0];
p_roBind.c_pfn_glUniform4fv( temp_vec4_array_location, 4, apf_temp_vec4_array );

// mat2
GLuint temp_mat2x2_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_mat2x2" );
printf( "uniform 'temp_mat2x2' location: %d\n", temp_mat2x2_location );
const GLfloat * apf_temp_mat2x2 = saf_temp_mat2x2[0];
p_roBind.c_pfn_glUniformMatrix2fv( temp_mat2x2_location, 4, false, apf_temp_mat2x2 );

// mat2x3
GLuint temp_mat2x3_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_mat2x3" );
printf( "uniform 'temp_mat2x3' location: %d\n", temp_mat2x3_location );
const GLfloat * apf_temp_mat2x3 = saf_temp_mat2x3[0];
p_roBind.c_pfn_glUniformMatrix2x3fv( temp_mat2x3_location, 6, false, apf_temp_mat2x3 );

// mat2x4
GLuint temp_mat2x4_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_mat2x4" );
printf( "uniform 'temp_mat2x4' location: %d\n", temp_mat2x4_location );
const GLfloat * apf_temp_mat2x4 = saf_temp_mat2x4[0];
p_roBind.c_pfn_glUniformMatrix2x4fv( temp_mat2x4_location, 8, false, apf_temp_mat2x4 );

// mat3x2
GLuint temp_mat3x2_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_mat3x2" );
printf( "uniform 'temp_mat3x2' location: %d\n", temp_mat3x2_location );
const GLfloat * apf_temp_mat3x2 = saf_temp_mat3x2[0];
p_roBind.c_pfn_glUniformMatrix3x2fv( temp_mat3x2_location, 6, false, apf_temp_mat3x2 );

// mat3
GLuint temp_mat3x3_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_mat3x3" );
printf( "uniform 'temp_mat3x3' location: %d\n", temp_mat3x3_location );
const GLfloat * apf_temp_mat3x3 = saf_temp_mat3x3[0];
p_roBind.c_pfn_glUniformMatrix3fv( temp_mat3x3_location, 9, false, apf_temp_mat3x3 );

// mat3x4
GLuint temp_mat3x4_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_mat3x4" );
printf( "uniform 'temp_mat3x4' location: %d\n", temp_mat3x4_location );
const GLfloat * apf_temp_mat3x4 = saf_temp_mat3x4[0];
p_roBind.c_pfn_glUniformMatrix3x4fv( temp_mat3x4_location, 12, false, apf_temp_mat3x4 );

// mat4x2
GLuint temp_mat4x2_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_mat4x2" );
printf( "uniform 'temp_mat4x2' location: %d\n", temp_mat4x2_location );
const GLfloat * apf_temp_mat4x2 = saf_temp_mat4x2[0];
p_roBind.c_pfn_glUniformMatrix4x2fv( temp_mat4x2_location, 8, false, apf_temp_mat4x2 );

// mat4x3
GLuint temp_mat4x3_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_mat4x3" );
printf( "uniform 'temp_mat4x3' location: %d\n", temp_mat4x3_location );
const GLfloat * apf_temp_mat4x3 = saf_temp_mat4x3[0];
p_roBind.c_pfn_glUniformMatrix4x3fv( temp_mat4x3_location, 12, false, apf_temp_mat4x3 );

// mat4
GLuint temp_mat4x4_location = p_roBind.c_pfn_glGetUniformLocation( program, "temp_mat4x4" );
printf( "uniform 'temp_mat4x4' location: %d\n", temp_mat4x4_location );
const GLfloat * apf_temp_mat4x4 = saf_temp_mat4x4[0];
p_roBind.c_pfn_glUniformMatrix4fv( temp_mat4x4_location, 16, false, apf_temp_mat4x4 );