Skip to content

Commit

Permalink
glUniformMatrix*v calculates size from passed array/matrix
Browse files Browse the repository at this point in the history
  • Loading branch information
snoutmate committed Dec 28, 2007
1 parent 65d5242 commit e9417f3
Show file tree
Hide file tree
Showing 8 changed files with 88 additions and 65 deletions.
26 changes: 25 additions & 1 deletion ext/common/conv.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ ARY2CTYPE(double,NUM2DBL)

/* Converts either array or object responding to #to_a to C-style array */
#define ARY2CMAT(_type_) \
static inline void ary2cmat##_type_(rary, cary, cols, rows) \
static inline void ary2cmat##_type_(rary, cary, cols, rows, count) \
VALUE rary; \
_type_ cary[]; \
int cols,rows; \
Expand All @@ -177,6 +177,30 @@ ARY2CMAT(double)
ARY2CMAT(float)
#undef ARY2CMAT

#define ARY2CMATCNT(_type_) \
static inline void ary2cmat##_type_##count(rary, cary, cols, rows) \
VALUE rary; \
_type_ cary[]; \
int cols,rows; \
{ \
int i; \
\
rary = rb_Array(rary); \
rary = rb_funcall(rary,rb_intern("flatten"),0); \
\
if (RARRAY_LEN(rary) % (cols*rows) != 0) {\
xfree(cary); \
rb_raise(rb_eArgError, "passed array/matrix must conatain n x (%i*%i) elements",cols,rows); \
} \
\
for (i=0; i < RARRAY_LEN(rary); i++) \
cary[i] = (_type_) NUM2DBL(rb_ary_entry(rary,i)); \
}

ARY2CMATCNT(double)
ARY2CMATCNT(float)
#undef ARY2CMATCNT


#define EMPTY
#define FREE(_x_) xfree(_x_);
Expand Down
24 changes: 12 additions & 12 deletions ext/gl/gl-2.0.c
Original file line number Diff line number Diff line change
Expand Up @@ -434,8 +434,8 @@ VALUE obj,arg1,arg2; \
if (count<=0 || (count % _size_) != 0) \
rb_raise(rb_eArgError, "Parameter array size must be multiplication of %i",_size_); \
location = (GLint)NUM2INT(arg1); \
value = ALLOC_N(_type_,_size_*count); \
_conv_(arg2,value,_size_*count); \
value = ALLOC_N(_type_,count); \
_conv_(arg2,value,count); \
fptr_gl##_name_(location,count / _size_,value); \
xfree(value); \
CHECK_GLERROR \
Expand All @@ -455,20 +455,20 @@ UNIFORM_FUNC_V(Uniform4iv,GLint,ary2cint,4)
#define UNIFORMMATRIX_FUNC(_name_,_size_) \
static void (APIENTRY * fptr_gl##_name_)(GLint,GLsizei,GLboolean,GLfloat *); \
static VALUE \
gl_##_name_(obj,arg1,arg2,arg3,arg4) \
VALUE obj,arg1,arg2,arg3,arg4; \
gl_##_name_(obj,arg1,arg2,arg3) \
VALUE obj,arg1,arg2,arg3; \
{ \
GLint location; \
GLsizei count; \
GLboolean transpose; \
GLfloat *value; \
LOAD_GL_FUNC(gl##_name_,"2.0") \
location = (GLint)NUM2INT(arg1); \
count = (GLint)NUM2INT(arg2); \
transpose = (GLboolean)NUM2INT(arg3); \
value = ALLOC_N(GLfloat, _size_*_size_*count); \
ary2cmatfloat(arg4,value,_size_,_size_*count); \
fptr_gl##_name_(location,count,transpose,value); \
count = RARRAY_LEN(rb_funcall(rb_Array(arg3),rb_intern("flatten"),0)); \
transpose = (GLboolean)NUM2INT(arg2); \
value = ALLOC_N(GLfloat, count); \
ary2cmatfloatcount(arg3,value,_size_,_size_); \
fptr_gl##_name_(location,count / (_size_*_size_),transpose,value); \
xfree(value); \
CHECK_GLERROR \
return Qnil; \
Expand Down Expand Up @@ -607,9 +607,9 @@ void gl_init_functions_2_0(VALUE module)
rb_define_module_function(module, "glUniform2iv", gl_Uniform2iv, 2);
rb_define_module_function(module, "glUniform3iv", gl_Uniform3iv, 2);
rb_define_module_function(module, "glUniform4iv", gl_Uniform4iv, 2);
rb_define_module_function(module, "glUniformMatrix2fv", gl_UniformMatrix2fv, 4);
rb_define_module_function(module, "glUniformMatrix3fv", gl_UniformMatrix3fv, 4);
rb_define_module_function(module, "glUniformMatrix4fv", gl_UniformMatrix4fv, 4);
rb_define_module_function(module, "glUniformMatrix2fv", gl_UniformMatrix2fv, 3);
rb_define_module_function(module, "glUniformMatrix3fv", gl_UniformMatrix3fv, 3);
rb_define_module_function(module, "glUniformMatrix4fv", gl_UniformMatrix4fv, 3);
rb_define_module_function(module, "glValidateProgram", gl_ValidateProgram, 1);
rb_define_module_function(module, "glVertexAttrib1d", gl_VertexAttrib1d, 2);
rb_define_module_function(module, "glVertexAttrib1f", gl_VertexAttrib1f, 2);
Expand Down
26 changes: 13 additions & 13 deletions ext/gl/gl-2.1.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,20 @@
#define UNIFORMMATRIX_FUNC(_x_,_y_) \
static void (APIENTRY * fptr_glUniformMatrix##_x_##x##_y_##fv)(GLint,GLsizei,GLboolean,GLfloat *); \
static VALUE \
gl_UniformMatrix##_x_##x##_y_##fv(obj,arg1,arg2,arg3,arg4) \
VALUE obj,arg1,arg2,arg3,arg4; \
gl_UniformMatrix##_x_##x##_y_##fv(obj,arg1,arg2,arg3) \
VALUE obj,arg1,arg2,arg3; \
{ \
GLint location; \
GLsizei count; \
GLboolean transpose; \
GLfloat *value; \
LOAD_GL_FUNC(glUniformMatrix##_x_##x##_y_##fv,"2.1") \
location = (GLint)NUM2INT(arg1); \
count = (GLint)NUM2INT(arg2); \
transpose = (GLboolean)NUM2INT(arg3); \
value = ALLOC_N(GLfloat, _x_*_y_*count); \
ary2cmatfloat(arg4,value, _x_, _y_*count); \
fptr_glUniformMatrix##_x_##x##_y_##fv(location,count,transpose,value); \
count = RARRAY_LEN(rb_funcall(rb_Array(arg3),rb_intern("flatten"),0)); \
transpose = (GLboolean)NUM2INT(arg2); \
value = ALLOC_N(GLfloat, count); \
ary2cmatfloatcount(arg3,value, _x_, _y_); \
fptr_glUniformMatrix##_x_##x##_y_##fv(location,count /(_x_ * _y_),transpose,value); \
xfree(value); \
CHECK_GLERROR \
return Qnil; \
Expand All @@ -48,10 +48,10 @@ UNIFORMMATRIX_FUNC(4,3)

void gl_init_functions_2_1(VALUE module)
{
rb_define_module_function(module, "glUniformMatrix2x3fv", gl_UniformMatrix2x3fv, 4);
rb_define_module_function(module, "glUniformMatrix3x2fv", gl_UniformMatrix3x2fv, 4);
rb_define_module_function(module, "glUniformMatrix2x4fv", gl_UniformMatrix2x4fv, 4);
rb_define_module_function(module, "glUniformMatrix4x2fv", gl_UniformMatrix4x2fv, 4);
rb_define_module_function(module, "glUniformMatrix3x4fv", gl_UniformMatrix3x4fv, 4);
rb_define_module_function(module, "glUniformMatrix4x3fv", gl_UniformMatrix4x3fv, 4);
rb_define_module_function(module, "glUniformMatrix2x3fv", gl_UniformMatrix2x3fv, 3);
rb_define_module_function(module, "glUniformMatrix3x2fv", gl_UniformMatrix3x2fv, 3);
rb_define_module_function(module, "glUniformMatrix2x4fv", gl_UniformMatrix2x4fv, 3);
rb_define_module_function(module, "glUniformMatrix4x2fv", gl_UniformMatrix4x2fv, 3);
rb_define_module_function(module, "glUniformMatrix3x4fv", gl_UniformMatrix3x4fv, 3);
rb_define_module_function(module, "glUniformMatrix4x3fv", gl_UniformMatrix4x3fv, 3);
}
25 changes: 12 additions & 13 deletions ext/gl/gl-ext-arb.c
Original file line number Diff line number Diff line change
Expand Up @@ -427,8 +427,8 @@ VALUE obj,arg1,arg2; \
if (count<=0 || (count % _size_) != 0) \
rb_raise(rb_eArgError, "Parameter array size must be multiplication of %i",_size_); \
location = (GLint)NUM2INT(arg1); \
value = ALLOC_N(_type_,_size_*count); \
_conv_(arg2,value,_size_*count); \
value = ALLOC_N(_type_,count); \
_conv_(arg2,value,count); \
fptr_gl##_name_(location,count / _size_,value); \
xfree(value); \
CHECK_GLERROR \
Expand All @@ -445,24 +445,23 @@ GLUNIFORM_VFUNC(Uniform3ivARB,GLint,ary2cint,3)
GLUNIFORM_VFUNC(Uniform4ivARB,GLint,ary2cint,4)
#undef GLUNIFORM_VFUNC


#define UNIFORMMATRIX_FUNC(_name_,_size_) \
static void (APIENTRY * fptr_gl##_name_)(GLint,GLsizei,GLboolean,GLfloat *); \
static VALUE \
gl_##_name_(obj,arg1,arg2,arg3,arg4) \
VALUE obj,arg1,arg2,arg3,arg4; \
gl_##_name_(obj,arg1,arg2,arg3) \
VALUE obj,arg1,arg2,arg3; \
{ \
GLint location; \
GLsizei count; \
GLboolean transpose; \
GLfloat *value; \
LOAD_GL_FUNC(gl##_name_,"GL_ARB_shader_objects") \
location = (GLint)NUM2INT(arg1); \
count = (GLint)NUM2INT(arg2); \
transpose = (GLboolean)NUM2INT(arg3); \
value = ALLOC_N(GLfloat, _size_*_size_*count); \
ary2cmatfloat(arg4,value,_size_,_size_*count); \
fptr_gl##_name_(location,count,transpose,value); \
count = RARRAY_LEN(rb_funcall(rb_Array(arg3),rb_intern("flatten"),0)); \
transpose = (GLboolean)NUM2INT(arg2); \
value = ALLOC_N(GLfloat, count); \
ary2cmatfloatcount(arg3,value,_size_,_size_); \
fptr_gl##_name_(location,count / (_size_*_size_),transpose,value); \
xfree(value); \
CHECK_GLERROR \
return Qnil; \
Expand Down Expand Up @@ -844,9 +843,9 @@ void gl_init_functions_ext_arb(VALUE module)
rb_define_module_function(module, "glUniform2ivARB", gl_Uniform2ivARB, 2);
rb_define_module_function(module, "glUniform3ivARB", gl_Uniform3ivARB, 2);
rb_define_module_function(module, "glUniform4ivARB", gl_Uniform4ivARB, 2);
rb_define_module_function(module, "glUniformMatrix2fvARB", gl_UniformMatrix2fvARB, 4);
rb_define_module_function(module, "glUniformMatrix3fvARB", gl_UniformMatrix3fvARB, 4);
rb_define_module_function(module, "glUniformMatrix4fvARB", gl_UniformMatrix4fvARB, 4);
rb_define_module_function(module, "glUniformMatrix2fvARB", gl_UniformMatrix2fvARB, 3);
rb_define_module_function(module, "glUniformMatrix3fvARB", gl_UniformMatrix3fvARB, 3);
rb_define_module_function(module, "glUniformMatrix4fvARB", gl_UniformMatrix4fvARB, 3);
rb_define_module_function(module, "glGetObjectParameterfvARB", gl_GetObjectParameterfvARB, 2);
rb_define_module_function(module, "glGetObjectParameterivARB", gl_GetObjectParameterivARB, 2);
rb_define_module_function(module, "glGetInfoLogARB", gl_GetInfoLogARB, 1);
Expand Down
4 changes: 2 additions & 2 deletions ext/gl/gl-ext-ext.c
Original file line number Diff line number Diff line change
Expand Up @@ -568,8 +568,8 @@ VALUE obj,arg1,arg2; \
if (count<=0 || (count % _size_) != 0) \
rb_raise(rb_eArgError, "Parameter array size must be multiplication of %i",_size_); \
location = (GLint)NUM2INT(arg1); \
value = ALLOC_N(_type_,_size_*count); \
_conv_(arg2,value,_size_*count); \
value = ALLOC_N(_type_,count); \
_conv_(arg2,value,count); \
fptr_gl##_name_(location,count / _size_,value); \
xfree(value); \
CHECK_GLERROR \
Expand Down
6 changes: 3 additions & 3 deletions test/tc_ext_arb.rb
Original file line number Diff line number Diff line change
Expand Up @@ -424,13 +424,13 @@ def test_gl_arb_shader_objects_3
assert((tm3l = glGetUniformLocationARB(program,"testmat3"))>=0)
assert((tm4l = glGetUniformLocationARB(program,"testmat4"))>=0)

glUniformMatrix2fvARB(tm2l, 1, GL_TRUE, [0,1, 1,0])
glUniformMatrix2fvARB(tm2l, GL_TRUE, [0,1, 1,0])
assert_equal(glGetUniformfvARB(program,tm2l),[0,1,1,0])

glUniformMatrix3fvARB(tm3l, 1, GL_TRUE, [0,1,0, 1,0,1, 0,1,0])
glUniformMatrix3fvARB(tm3l, GL_TRUE, [0,1,0, 1,0,1, 0,1,0])
assert_equal(glGetUniformfvARB(program,tm3l),[0,1,0, 1,0,1, 0,1,0])

glUniformMatrix4fvARB(tm4l, 1, GL_TRUE, [0,1,0,1, 1,0,1,0, 0,1,0,1, 1,0,1,0])
glUniformMatrix4fvARB(tm4l, GL_TRUE, [0,1,0,1, 1,0,1,0, 0,1,0,1, 1,0,1,0])
assert_equal(glGetUniformfvARB(program,tm4l),[0,1,0,1, 1,0,1,0, 0,1,0,1, 1,0,1,0])

glDeleteObjectARB(vs)
Expand Down
6 changes: 3 additions & 3 deletions test/tc_func_20.rb
Original file line number Diff line number Diff line change
Expand Up @@ -309,13 +309,13 @@ def test_shaders_3
assert((tm3l = glGetUniformLocation(program,"testmat3"))>=0)
assert((tm4l = glGetUniformLocation(program,"testmat4"))>=0)

glUniformMatrix2fv(tm2l, 1, GL_TRUE, [0,1, 1,0])
glUniformMatrix2fv(tm2l, GL_TRUE, [0,1, 1,0])
assert_equal(glGetUniformfv(program,tm2l),[0,1,1,0])

glUniformMatrix3fv(tm3l, 1, GL_TRUE, [0,1,0, 1,0,1, 0,1,0])
glUniformMatrix3fv(tm3l, GL_TRUE, [0,1,0, 1,0,1, 0,1,0])
assert_equal(glGetUniformfv(program,tm3l),[0,1,0, 1,0,1, 0,1,0])

glUniformMatrix4fv(tm4l, 1, GL_TRUE, [0,1,0,1, 1,0,1,0, 0,1,0,1, 1,0,1,0])
glUniformMatrix4fv(tm4l, GL_TRUE, [0,1,0,1, 1,0,1,0, 0,1,0,1, 1,0,1,0])
assert_equal(glGetUniformfv(program,tm4l),[0,1,0,1, 1,0,1,0, 0,1,0,1, 1,0,1,0])
end

Expand Down
36 changes: 18 additions & 18 deletions test/tc_func_21.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,51 +49,51 @@ def test_gluniformmatrix21
assert((tm34l = glGetUniformLocation(program,"testmat34"))>=0)
assert((tm43l = glGetUniformLocation(program,"testmat43"))>=0)

glUniformMatrix2x3fv(tm23l, 1, GL_FALSE, [0,1, 1,0, 0,1])
glUniformMatrix2x3fv(tm23l, GL_FALSE, [0,1, 1,0, 0,1])
assert_equal(glGetUniformfv(program,tm23l),[0,1, 1,0, 0,1])
glUniformMatrix3x2fv(tm32l, 1, GL_FALSE, [1,0, 0,1, 1,0])
glUniformMatrix3x2fv(tm32l, GL_FALSE, [1,0, 0,1, 1,0])
assert_equal(glGetUniformfv(program,tm32l),[1,0, 0,1, 1,0])

glUniformMatrix2x4fv(tm24l, 1, GL_FALSE, [0,1, 1,0, 0,1, 1,0])
glUniformMatrix2x4fv(tm24l, GL_FALSE, [0,1, 1,0, 0,1, 1,0])
assert_equal(glGetUniformfv(program,tm24l),[0,1, 1,0, 0,1, 1,0])
glUniformMatrix4x2fv(tm42l, 1, GL_FALSE, [1,0, 0,1, 1,0, 0,1])
glUniformMatrix4x2fv(tm42l, GL_FALSE, [1,0, 0,1, 1,0, 0,1])
assert_equal(glGetUniformfv(program,tm42l),[1,0, 0,1, 1,0, 0,1])

glUniformMatrix3x4fv(tm34l, 1, GL_FALSE, [0,1,1, 1,0,1, 0,1,1, 1,0,1])
glUniformMatrix3x4fv(tm34l, GL_FALSE, [0,1,1, 1,0,1, 0,1,1, 1,0,1])
assert_equal(glGetUniformfv(program,tm34l),[0,1,1, 1,0,1, 0,1,1, 1,0,1])
glUniformMatrix4x3fv(tm43l, 1, GL_FALSE, [1,0,0, 0,1,0, 1,0,0, 0,1,0])
glUniformMatrix4x3fv(tm43l, GL_FALSE, [1,0,0, 0,1,0, 1,0,0, 0,1,0])
assert_equal(glGetUniformfv(program,tm43l),[1,0,0, 0,1,0, 1,0,0, 0,1,0])

# 2
m = Matrix.rows([[0,1],[1,0],[0,1]])
glUniformMatrix2x3fv(tm23l, 1, GL_FALSE, m)
glUniformMatrix2x3fv(tm23l, GL_FALSE, m)
assert_equal(glGetUniformfv(program,tm23l),[0,1, 1,0, 0,1])
m = Matrix.rows([[0,1,1],[0,0,1]])
glUniformMatrix3x2fv(tm32l, 1, GL_FALSE, m)
glUniformMatrix3x2fv(tm32l, GL_FALSE, m)
assert_equal(glGetUniformfv(program,tm32l),[0,1,1, 0,0,1])

m = Matrix.rows([[0,1],[1,0],[0,1],[1,0]])
glUniformMatrix2x4fv(tm24l, 1, GL_FALSE, m)
glUniformMatrix2x4fv(tm24l, GL_FALSE, m)
assert_equal(glGetUniformfv(program,tm24l),[0,1, 1,0, 0,1, 1,0])
m = Matrix.rows([[0,1,1,1],[0,0,1,1]])
glUniformMatrix4x2fv(tm42l, 1, GL_FALSE, m)
glUniformMatrix4x2fv(tm42l, GL_FALSE, m)
assert_equal(glGetUniformfv(program,tm42l),[0,1,1,1, 0,0,1,1])

m = Matrix.rows([[0,1,0],[1,0,1],[0,1,0],[1,0,1]])
glUniformMatrix3x4fv(tm34l, 1, GL_FALSE, m)
glUniformMatrix3x4fv(tm34l, GL_FALSE, m)
assert_equal(glGetUniformfv(program,tm34l),[0,1,0, 1,0,1, 0,1,0, 1,0,1])

m = Matrix.rows([[0,1,1,1],[0,0,1,1],[1,1,0,0]])
glUniformMatrix4x3fv(tm43l, 1, GL_FALSE, m)
glUniformMatrix4x3fv(tm43l, GL_FALSE, m)
assert_equal(glGetUniformfv(program,tm43l),[0,1,1,1, 0,0,1,1, 1,1,0,0])

# 3
assert_raise ArgumentError do glUniformMatrix2x3fv(tm23l, 1, GL_FALSE, [1,2,3,4]) end
assert_raise ArgumentError do glUniformMatrix3x2fv(tm32l, 1, GL_FALSE, [1,2,3,4]) end
assert_raise ArgumentError do glUniformMatrix2x4fv(tm24l, 1, GL_FALSE, [1,2,3,4]) end
assert_raise ArgumentError do glUniformMatrix4x2fv(tm42l, 1, GL_FALSE, [1,2,3,4]) end
assert_raise ArgumentError do glUniformMatrix3x4fv(tm34l, 1, GL_FALSE, [1,2,3,4]) end
assert_raise ArgumentError do glUniformMatrix4x3fv(tm43l, 1, GL_FALSE, [1,2,3,4]) end
assert_raise ArgumentError do glUniformMatrix2x3fv(tm23l, GL_FALSE, [1,2,3,4]) end
assert_raise ArgumentError do glUniformMatrix3x2fv(tm32l, GL_FALSE, [1,2,3,4]) end
assert_raise ArgumentError do glUniformMatrix2x4fv(tm24l, GL_FALSE, [1,2,3,4]) end
assert_raise ArgumentError do glUniformMatrix4x2fv(tm42l, GL_FALSE, [1,2,3,4]) end
assert_raise ArgumentError do glUniformMatrix3x4fv(tm34l, GL_FALSE, [1,2,3,4]) end
assert_raise ArgumentError do glUniformMatrix4x3fv(tm43l, GL_FALSE, [1,2,3,4]) end
end

def test_pixelunpack_bitmap
Expand Down

0 comments on commit e9417f3

Please sign in to comment.