/* * Copyright (C) 2007 Jan Dvorak * * This program is distributed under the terms of the MIT license. * See the included MIT-LICENSE file for the terms of this license. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifdef __APPLE__ #include #elif defined WIN32 #include #include #else #include #endif #include "../common/common.h" static void (APIENTRY * fptr_glBlendEquationSeparate)(GLenum,GLenum); static VALUE gl_BlendEquationSeparate(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLenum modeRGB; GLenum modeAlpha; LOAD_GL_FUNC(glBlendEquationSeparate) modeRGB = (GLenum)NUM2INT(arg1); modeAlpha = (GLenum)NUM2INT(arg2); fptr_glBlendEquationSeparate(modeRGB,modeAlpha); return Qnil; } static void (APIENTRY * fptr_glDrawBuffers)(GLsizei,GLenum *); static VALUE gl_DrawBuffers(obj,arg1) VALUE obj,arg1; { GLsizei size; GLenum *buffers; LOAD_GL_FUNC(glDrawBuffers) Check_Type(arg1,T_ARRAY); size = RARRAY(arg1)->len; buffers = ALLOC_N(GLenum,size); ary2cuint(arg1,buffers,size); fptr_glDrawBuffers(size,buffers); xfree(buffers); return Qnil; } static void (APIENTRY * fptr_glStencilOpSeparate)(GLenum,GLenum,GLenum,GLenum); static VALUE gl_StencilOpSeparate(obj,arg1,arg2,arg3,arg4) VALUE obj,arg1,arg2,arg3,arg4; { GLenum face; GLenum sfail; GLenum dpfail; GLenum dppass; LOAD_GL_FUNC(glStencilOpSeparate) face = (GLenum)NUM2INT(arg1); sfail = (GLenum)NUM2INT(arg2); dpfail = (GLenum)NUM2INT(arg3); dppass = (GLenum)NUM2INT(arg4); fptr_glStencilOpSeparate(face,sfail,dpfail,dppass); return Qnil; } static void (APIENTRY * fptr_glStencilFuncSeparate)(GLenum,GLenum,GLint,GLuint); static VALUE gl_StencilFuncSeparate(obj,arg1,arg2,arg3,arg4) VALUE obj,arg1,arg2,arg3,arg4; { GLenum face; GLenum func; GLint ref; GLuint mask; LOAD_GL_FUNC(glStencilFuncSeparate) face = (GLenum)NUM2INT(arg1); func = (GLenum)NUM2INT(arg2); ref = (GLint)NUM2INT(arg3); mask = (GLuint)NUM2UINT(arg4); fptr_glStencilFuncSeparate(face,func,ref,mask); return Qnil; } static void (APIENTRY * fptr_glStencilMaskSeparate)(GLenum face,GLuint mask); static VALUE gl_StencilMaskSeparate(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLenum face; GLuint mask; LOAD_GL_FUNC(glStencilMaskSeparate) face = (GLenum)NUM2INT(arg1); mask = (GLenum)NUM2INT(arg2); fptr_glStencilMaskSeparate(face,mask); return Qnil; } static void (APIENTRY * fptr_glAttachShader)(GLuint,GLuint); static VALUE gl_AttachShader(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint program; GLuint shader; LOAD_GL_FUNC(glAttachShader) program = (GLuint)NUM2UINT(arg1); shader = (GLuint)NUM2UINT(arg2); fptr_glAttachShader(program,shader); return Qnil; } static void (APIENTRY * fptr_glBindAttribLocation)(GLuint,GLuint,GLchar *); static VALUE gl_BindAttribLocation(obj,arg1,arg2,arg3) VALUE obj,arg1,arg2,arg3; { GLuint program; GLuint index; LOAD_GL_FUNC(glBindAttribLocation) program = (GLuint)NUM2UINT(arg1); index = (GLuint)NUM2UINT(arg2); Check_Type(arg3, T_STRING); fptr_glBindAttribLocation(program,index,RSTRING(arg3)->ptr); return Qnil; } static void (APIENTRY * fptr_glCompileShader)(GLuint); static VALUE gl_CompileShader(obj,arg1) VALUE obj,arg1; { GLuint shader; LOAD_GL_FUNC(glCompileShader) shader = (GLuint)NUM2UINT(arg1); fptr_glCompileShader(shader); return Qnil; } static GLuint (APIENTRY * fptr_glCreateProgram)(void); static VALUE gl_CreateProgram(obj) VALUE obj; { GLuint ret; LOAD_GL_FUNC(glCreateProgram) ret = fptr_glCreateProgram(); return INT2NUM(ret); } static GLuint (APIENTRY * fptr_glCreateShader)(GLenum); static VALUE gl_CreateShader(obj,arg1) VALUE obj,arg1; { GLenum shaderType; GLuint ret; LOAD_GL_FUNC(glCreateShader) shaderType = (GLenum)NUM2INT(arg1); ret = fptr_glCreateShader(shaderType); return INT2NUM(ret); } static void (APIENTRY * fptr_glDeleteProgram)(GLuint); static VALUE gl_DeleteProgram(obj,arg1) VALUE obj,arg1; { GLuint program; LOAD_GL_FUNC(glDeleteProgram) program = (GLuint)NUM2UINT(arg1); fptr_glDeleteProgram(program); return Qnil; } static void (APIENTRY * fptr_glDeleteShader)(GLuint); static VALUE gl_DeleteShader(obj,arg1) VALUE obj,arg1; { GLuint shader; LOAD_GL_FUNC(glDeleteShader) shader = (GLuint)NUM2UINT(arg1); fptr_glDeleteShader(shader); return Qnil; } static void (APIENTRY * fptr_glDetachShader)(GLuint,GLuint); static VALUE gl_DetachShader(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint program; GLuint shader; LOAD_GL_FUNC(glDetachShader) program=(GLuint)NUM2UINT(arg1); shader=(GLuint)NUM2UINT(arg2); fptr_glDetachShader(program,shader); return Qnil; } static void (APIENTRY * fptr_glDisableVertexAttribArray)(GLuint); static VALUE gl_DisableVertexAttribArray(obj,arg1) VALUE obj,arg1; { GLuint index; LOAD_GL_FUNC(glDisableVertexAttribArray) index=(GLuint)NUM2UINT(arg1); fptr_glDisableVertexAttribArray(index); return Qnil; } static void (APIENTRY * fptr_glEnableVertexAttribArray)(GLuint); static VALUE gl_EnableVertexAttribArray(obj,arg1) VALUE obj,arg1; { GLuint index; LOAD_GL_FUNC(glEnableVertexAttribArray) index=(GLuint)NUM2UINT(arg1); fptr_glEnableVertexAttribArray(index); return Qnil; } static void (APIENTRY * fptr_glGetProgramiv)(GLuint,GLenum,GLint *); static VALUE gl_GetProgramiv(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint program; GLenum pname; GLint params = 0; LOAD_GL_FUNC(glGetProgramiv) program = (GLuint)NUM2UINT(arg1); pname = (GLenum)NUM2INT(arg2); fptr_glGetProgramiv(program,pname,¶ms); return INT2NUM(params); } static void (APIENTRY * fptr_glGetActiveAttrib)(GLuint,GLuint,GLsizei,GLsizei *,GLint *,GLenum *,GLchar *); static VALUE gl_GetActiveAttrib(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint program; GLuint index; GLsizei max_size = 0; GLsizei written = 0; GLint attrib_size = 0; GLenum attrib_type = 0; VALUE buffer; VALUE retary; LOAD_GL_FUNC(glGetActiveAttrib) LOAD_GL_FUNC(glGetProgramiv) program = (GLuint)NUM2UINT(arg1); index = (GLuint)NUM2UINT(arg2); fptr_glGetProgramiv(program,GL_ACTIVE_ATTRIBUTE_MAX_LENGTH,&max_size); if (max_size==0) rb_raise(rb_eTypeError, "Can't determine maximum attribute name length"); buffer = allocate_buffer_with_string(max_size-1); fptr_glGetActiveAttrib(program,index,max_size,&written,&attrib_size,&attrib_type,RSTRING(buffer)->ptr); retary = rb_ary_new2(3); rb_ary_push(retary, INT2NUM(attrib_size)); rb_ary_push(retary, INT2NUM(attrib_type)); rb_ary_push(retary, buffer); return retary; } static void (APIENTRY * fptr_glGetActiveUniform)(GLuint,GLuint,GLsizei,GLsizei*,GLint*,GLenum*,GLchar*); static VALUE gl_GetActiveUniform(obj,arg1,arg2,arg3,arg4,arg5,arg6,arg7) VALUE obj,arg1,arg2,arg3,arg4,arg5,arg6,arg7; { GLuint program; GLuint index; GLsizei max_size = 0; GLsizei written = 0; GLint uniform_size = 0; GLenum uniform_type = 0; VALUE buffer; VALUE retary; LOAD_GL_FUNC(glGetActiveUniform) LOAD_GL_FUNC(glGetProgramiv) program = (GLuint)NUM2UINT(arg1); index = (GLuint)NUM2UINT(arg2); fptr_glGetProgramiv(program,GL_ACTIVE_UNIFORM_MAX_LENGTH,&max_size); if (max_size==0) rb_raise(rb_eTypeError, "Can't determine maximum uniform name length"); buffer = allocate_buffer_with_string(max_size-1); fptr_glGetActiveUniform(program,index,max_size,&written,&uniform_size,&uniform_type,RSTRING(buffer)->ptr); retary = rb_ary_new2(3); rb_ary_push(retary, INT2NUM(uniform_size)); rb_ary_push(retary, INT2NUM(uniform_type)); rb_ary_push(retary, buffer); return retary; } static void (APIENTRY * fptr_glGetAttachedShaders)(GLuint,GLsizei,GLsizei *,GLuint *); static VALUE gl_GetAttachedShaders(obj,arg1) VALUE obj,arg1; { GLuint program; GLint shaders_num = 0; GLuint *shaders; VALUE retary; GLsizei count = 0; GLint i; LOAD_GL_FUNC(glGetAttachedShaders) LOAD_GL_FUNC(glGetProgramiv) program = (GLuint)NUM2UINT(arg1); fptr_glGetProgramiv(program,GL_ATTACHED_SHADERS,&shaders_num); if (shaders_num<=0) return Qnil; shaders = ALLOC_N(GLuint,shaders_num); fptr_glGetAttachedShaders(program,shaders_num,&count,shaders); retary = rb_ary_new2(shaders_num); for(i=0;iptr); return INT2NUM(ret); } static void (APIENTRY * fptr_glGetProgramInfoLog)(GLuint,GLsizei,GLsizei *,GLchar *); static VALUE gl_GetProgramInfoLog(obj,arg1) VALUE obj,arg1; { GLuint program; GLint max_size = 0; GLsizei ret_length = 0; VALUE buffer; LOAD_GL_FUNC(glGetProgramInfoLog) LOAD_GL_FUNC(glGetProgramiv) program = (GLuint)NUM2UINT(arg1); fptr_glGetProgramiv(program,GL_INFO_LOG_LENGTH,&max_size); if (max_size<=0) return rb_str_new2(""); buffer = allocate_buffer_with_string(max_size); fptr_glGetProgramInfoLog(program,max_size,&ret_length,RSTRING(buffer)->ptr); RSTRING(buffer)->len = ret_length; return buffer; } static void (APIENTRY * fptr_glGetShaderiv)(GLuint,GLenum,GLint *); static VALUE gl_GetShaderiv(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint program; GLenum pname; GLint params = 0; LOAD_GL_FUNC(glGetShaderiv) program = (GLuint)NUM2UINT(arg1); pname = (GLenum)NUM2INT(arg2); fptr_glGetShaderiv(program,pname,¶ms); return INT2NUM(params); } static void (APIENTRY * fptr_glGetShaderInfoLog)(GLuint,GLsizei,GLsizei *,GLchar *); static VALUE gl_GetShaderInfoLog(obj,arg1) VALUE obj,arg1; { GLuint program; GLint max_size = 0; GLsizei ret_length = 0; VALUE ret_buffer; GLchar *buffer; LOAD_GL_FUNC(glGetShaderInfoLog) LOAD_GL_FUNC(glGetShaderiv) program = (GLuint)NUM2UINT(arg1); fptr_glGetShaderiv(program,GL_INFO_LOG_LENGTH,&max_size); if (max_size<=0) return rb_str_new2(""); buffer = ALLOC_N(GLchar,max_size+1); memset(buffer,0,sizeof(GLchar) * (max_size+1)); fptr_glGetShaderInfoLog(program,max_size,&ret_length,buffer); ret_buffer = rb_str_new(buffer, ret_length); xfree(buffer); return ret_buffer; } static void (APIENTRY * fptr_glGetShaderSource)(GLuint,GLsizei,GLsizei *,GLchar *); static VALUE gl_GetShaderSource(obj,arg1) VALUE obj,arg1; { GLuint shader; GLint max_size = 0; GLsizei ret_length = 0; VALUE buffer; LOAD_GL_FUNC(glGetShaderSource) LOAD_GL_FUNC(glGetShaderiv) shader = (GLuint)NUM2UINT(arg1); fptr_glGetShaderiv(shader,GL_SHADER_SOURCE_LENGTH,&max_size); if (max_size==0) rb_raise(rb_eTypeError, "Can't determine maximum shader source length"); buffer = allocate_buffer_with_string(max_size-1); fptr_glGetShaderSource(shader,max_size,&ret_length,RSTRING(buffer)->ptr); return buffer; } static GLint (APIENTRY * fptr_glGetUniformLocation)(GLuint,const GLchar*); static VALUE gl_GetUniformLocation(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint program; GLint ret; LOAD_GL_FUNC(glGetUniformLocation) program=(GLuint)NUM2UINT(arg1); Check_Type(arg2,T_STRING); ret = fptr_glGetUniformLocation(program,RSTRING(arg2)->ptr); return INT2NUM(ret); } #define GET_UNIFORM_SIZE \ switch (uniform_type) { \ case GL_FLOAT: \ case GL_INT: \ case GL_BOOL: \ case GL_SAMPLER_1D: \ case GL_SAMPLER_2D: \ case GL_SAMPLER_3D: \ case GL_SAMPLER_CUBE: \ case GL_SAMPLER_1D_SHADOW: \ case GL_SAMPLER_2D_SHADOW: \ uniform_size = 1; \ break; \ case GL_FLOAT_VEC2: \ case GL_INT_VEC2: \ case GL_BOOL_VEC2: \ uniform_size = 2; \ break; \ case GL_FLOAT_VEC3: \ case GL_INT_VEC3: \ case GL_BOOL_VEC3: \ uniform_size = 3; \ break; \ case GL_FLOAT_VEC4: \ case GL_INT_VEC4: \ case GL_BOOL_VEC4: \ case GL_FLOAT_MAT2: \ uniform_size = 4; \ break; \ case GL_FLOAT_MAT2x3: \ case GL_FLOAT_MAT3x2: \ uniform_size = 6; \ break; \ case GL_FLOAT_MAT2x4: \ case GL_FLOAT_MAT4x2: \ uniform_size = 8; \ break; \ case GL_FLOAT_MAT3: \ uniform_size = 9; \ break; \ case GL_FLOAT_MAT4x3: \ case GL_FLOAT_MAT3x4: \ uniform_size = 12; \ break; \ case GL_FLOAT_MAT4: \ uniform_size = 16; \ break; \ default: \ rb_raise(rb_eTypeError, "Unsupported type '%i'",uniform_type); \ } static void (APIENTRY * fptr_glGetUniformfv)(GLuint,GLint,GLfloat *); static VALUE gl_GetUniformfv(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint program; GLint location; GLfloat params[16]; VALUE retary; GLint i; GLint unused = 0; GLenum uniform_type = 0; GLint uniform_size = 0; LOAD_GL_FUNC(glGetUniformfv) LOAD_GL_FUNC(glGetActiveUniform) program = (GLuint)NUM2UINT(arg1); location = (GLint)NUM2INT(arg2); fptr_glGetActiveUniform(program,location,0,NULL,&unused,&uniform_type,NULL); if (uniform_type==0) rb_raise(rb_eTypeError, "Can't determine the uniform's type"); GET_UNIFORM_SIZE memset(params,0,16*sizeof(GLfloat)); fptr_glGetUniformfv(program,location,params); retary = rb_ary_new2(uniform_size); for(i=0;i_MAX_VERTEX_ATTRIBS) rb_raise(rb_eArgError, "Index too large, maximum allowed value '%i'",_MAX_VERTEX_ATTRIBS); return g_VertexAttrib_ptr[index]; } static GLboolean (APIENTRY * fptr_glIsProgram)(GLuint); static VALUE gl_IsProgram(obj,arg1) VALUE obj,arg1; { GLuint program; GLboolean ret; LOAD_GL_FUNC(glIsProgram) program = (GLuint)NUM2UINT(arg1); ret = fptr_glIsProgram(program); return INT2NUM(ret); } static GLboolean (APIENTRY * fptr_glIsShader)(GLuint); static VALUE gl_IsShader(obj,arg1) VALUE obj,arg1; { GLuint program; GLboolean ret; LOAD_GL_FUNC(glIsShader) program = (GLuint)NUM2UINT(arg1); ret = fptr_glIsShader(program); return INT2NUM(ret); } static void (APIENTRY * fptr_glLinkProgram)(GLuint); static VALUE gl_LinkProgram(obj,arg1) VALUE obj,arg1; { GLuint program; LOAD_GL_FUNC(glLinkProgram) program = (GLuint)NUM2UINT(arg1); fptr_glLinkProgram(program); return Qnil; } static void (APIENTRY * fptr_glShaderSource)(GLuint,GLsizei,GLchar**,GLint *); static VALUE gl_ShaderSource(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint shader; GLint length; GLchar *str; LOAD_GL_FUNC(glShaderSource) shader = (GLuint)NUM2UINT(arg1); Check_Type(arg2,T_STRING); str = RSTRING(arg2)->ptr; length = RSTRING(arg2)->len; fptr_glShaderSource(shader,1,&str,&length); return Qnil; } static void (APIENTRY * fptr_glUseProgram)(GLuint); static VALUE gl_UseProgram(obj,arg1) VALUE obj,arg1; { GLuint program; LOAD_GL_FUNC(glUseProgram) program = (GLuint)NUM2UINT(arg1); fptr_glUseProgram(program); return Qnil; } static void (APIENTRY * fptr_glUniform1f)(GLint,GLfloat); static VALUE gl_Uniform1f(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLint location; GLfloat v0; LOAD_GL_FUNC(glUniform1f) location = (GLint)NUM2INT(arg1); v0 = (GLfloat)NUM2DBL(arg2); fptr_glUniform1f(location,v0); return Qnil; } static void (APIENTRY * fptr_glUniform2f)(GLint,GLfloat,GLfloat); static VALUE gl_Uniform2f(obj,arg1,arg2,arg3) VALUE obj,arg1,arg2,arg3; { GLint location; GLfloat v0; GLfloat v1; LOAD_GL_FUNC(glUniform2f) location = (GLint)NUM2INT(arg1); v0 = (GLfloat)NUM2DBL(arg2); v1 = (GLfloat)NUM2DBL(arg3); fptr_glUniform2f(location,v0,v1); return Qnil; } static void (APIENTRY * fptr_glUniform3f)(GLint,GLfloat,GLfloat,GLfloat); static VALUE gl_Uniform3f(obj,arg1,arg2,arg3,arg4) VALUE obj,arg1,arg2,arg3,arg4; { GLint location; GLfloat v0; GLfloat v1; GLfloat v2; LOAD_GL_FUNC(glUniform3f) location = (GLint)NUM2INT(arg1); v0 = (GLfloat)NUM2DBL(arg2); v1 = (GLfloat)NUM2DBL(arg3); v2 = (GLfloat)NUM2DBL(arg4); fptr_glUniform3f(location,v0,v1,v2); return Qnil; } static void (APIENTRY * fptr_glUniform4f)(GLint,GLfloat,GLfloat,GLfloat,GLfloat); static VALUE gl_Uniform4f(obj,arg1,arg2,arg3,arg4,arg5) VALUE obj,arg1,arg2,arg3,arg4,arg5; { GLint location; GLfloat v0; GLfloat v1; GLfloat v2; GLfloat v3; LOAD_GL_FUNC(glUniform4f) location = (GLint)NUM2INT(arg1); v0 = (GLfloat)NUM2DBL(arg2); v1 = (GLfloat)NUM2DBL(arg3); v2 = (GLfloat)NUM2DBL(arg4); v3 = (GLfloat)NUM2DBL(arg5); fptr_glUniform4f(location,v0,v1,v2,v3); return Qnil; } static void (APIENTRY * fptr_glUniform1i)(GLint,GLint); static VALUE gl_Uniform1i(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLint location; GLint v0; LOAD_GL_FUNC(glUniform1i) location = (GLint)NUM2INT(arg1); v0 = (GLint)NUM2INT(arg2); fptr_glUniform1i(location,v0); return Qnil; } static void (APIENTRY * fptr_glUniform2i)(GLint,GLint,GLint); static VALUE gl_Uniform2i(obj,arg1,arg2,arg3) VALUE obj,arg1,arg2,arg3; { GLint location; GLint v0; GLint v1; LOAD_GL_FUNC(glUniform2i) location = (GLint)NUM2INT(arg1); v0 = (GLint)NUM2INT(arg2); v1 = (GLint)NUM2INT(arg3); fptr_glUniform2i(location,v0,v1); return Qnil; } static void (APIENTRY * fptr_glUniform3i)(GLint,GLint,GLint,GLint); static VALUE gl_Uniform3i(obj,arg1,arg2,arg3,arg4) VALUE obj,arg1,arg2,arg3,arg4; { GLint location; GLint v0; GLint v1; GLint v2; LOAD_GL_FUNC(glUniform3i) location = (GLint)NUM2INT(arg1); v0 = (GLint)NUM2INT(arg2); v1 = (GLint)NUM2INT(arg3); v2 = (GLint)NUM2INT(arg4); fptr_glUniform3i(location,v0,v1,v2); return Qnil; } static void (APIENTRY * fptr_glUniform4i)(GLint,GLint,GLint,GLint,GLint); static VALUE gl_Uniform4i(obj,arg1,arg2,arg3,arg4,arg5) VALUE obj,arg1,arg2,arg3,arg4,arg5; { GLint location; GLint v0; GLint v1; GLint v2; GLint v3; LOAD_GL_FUNC(glUniform4i) location = (GLint)NUM2INT(arg1); v0 = (GLint)NUM2INT(arg2); v1 = (GLint)NUM2INT(arg3); v2 = (GLint)NUM2INT(arg4); v3 = (GLint)NUM2INT(arg5); fptr_glUniform4i(location,v0,v1,v2,v3); return Qnil; } static void (APIENTRY * fptr_glUniform1fv)(GLint,GLsizei,GLfloat *); static VALUE gl_Uniform1fv(obj,arg1,arg2,arg3) VALUE obj,arg1,arg2,arg3; { GLint location; GLsizei count; GLfloat *value; LOAD_GL_FUNC(glUniform1fv) location = (GLint)NUM2INT(arg1); count = (GLsizei)NUM2UINT(arg2); value = ALLOC_N(GLfloat,1*count); ary2cflt(arg3,value,1*count); fptr_glUniform1fv(location,count,value); xfree(value); return Qnil; } static void (APIENTRY * fptr_glUniform2fv)(GLint,GLsizei,GLfloat *); static VALUE gl_Uniform2fv(obj,arg1,arg2,arg3) VALUE obj,arg1,arg2,arg3; { GLint location; GLsizei count; GLfloat *value; LOAD_GL_FUNC(glUniform2fv) location = (GLint)NUM2INT(arg1); count = (GLsizei)NUM2UINT(arg2); value = ALLOC_N(GLfloat,2*count); ary2cflt(arg3,value,2*count); fptr_glUniform2fv(location,count,value); xfree(value); return Qnil; } static void (APIENTRY * fptr_glUniform3fv)(GLint,GLsizei,GLfloat *); static VALUE gl_Uniform3fv(obj,arg1,arg2,arg3) VALUE obj,arg1,arg2,arg3; { GLint location; GLsizei count; GLfloat *value; LOAD_GL_FUNC(glUniform3fv) location = (GLint)NUM2INT(arg1); count = (GLsizei)NUM2UINT(arg2); value = ALLOC_N(GLfloat,3*count); ary2cflt(arg3,value,3*count); fptr_glUniform3fv(location,count,value); xfree(value); return Qnil; } static void (APIENTRY * fptr_glUniform4fv)(GLint,GLsizei,GLfloat *); static VALUE gl_Uniform4fv(obj,arg1,arg2,arg3) VALUE obj,arg1,arg2,arg3; { GLint location; GLsizei count; GLfloat *value; LOAD_GL_FUNC(glUniform4fv) location = (GLint)NUM2INT(arg1); count = (GLsizei)NUM2UINT(arg2); value = ALLOC_N(GLfloat,4*count); ary2cflt(arg3,value,4*count); fptr_glUniform4fv(location,count,value); xfree(value); return Qnil; } static void (APIENTRY * fptr_glUniform1iv)(GLint,GLsizei,GLint *); static VALUE gl_Uniform1iv(obj,arg1,arg2,arg3) VALUE obj,arg1,arg2,arg3; { GLint location; GLsizei count; GLint *value; LOAD_GL_FUNC(glUniform1iv) location = (GLint)NUM2INT(arg1); count = (GLsizei)NUM2UINT(arg2); value = ALLOC_N(GLint,1*count); ary2cint(arg3,value,1*count); fptr_glUniform1iv(location,count,value); xfree(value); return Qnil; } static void (APIENTRY * fptr_glUniform2iv)(GLint,GLsizei,GLint *); static VALUE gl_Uniform2iv(obj,arg1,arg2,arg3) VALUE obj,arg1,arg2,arg3; { GLint location; GLsizei count; GLint *value; LOAD_GL_FUNC(glUniform2iv) location = (GLint)NUM2INT(arg1); count = (GLsizei)NUM2UINT(arg2); value = ALLOC_N(GLint,2*count); ary2cint(arg3,value,2*count); fptr_glUniform2iv(location,count,value); xfree(value); return Qnil; } static void (APIENTRY * fptr_glUniform3iv)(GLint,GLsizei,GLint *); static VALUE gl_Uniform3iv(obj,arg1,arg2,arg3) VALUE obj,arg1,arg2,arg3; { GLint location; GLsizei count; GLint *value; LOAD_GL_FUNC(glUniform3iv) location = (GLint)NUM2INT(arg1); count = (GLsizei)NUM2UINT(arg2); value = ALLOC_N(GLint,3*count); ary2cint(arg3,value,3*count); fptr_glUniform3iv(location,count,value); xfree(value); return Qnil; } static void (APIENTRY * fptr_glUniform4iv)(GLint,GLsizei,GLint *); static VALUE gl_Uniform4iv(obj,arg1,arg2,arg3) VALUE obj,arg1,arg2,arg3; { GLint location; GLsizei count; GLint *value; LOAD_GL_FUNC(glUniform4iv) location = (GLint)NUM2INT(arg1); count = (GLsizei)NUM2UINT(arg2); value = ALLOC_N(GLint,4*count); ary2cint(arg3,value,4*count); fptr_glUniform4iv(location,count,value); xfree(value); return Qnil; } static void (APIENTRY * fptr_glUniformMatrix2fv)(GLint,GLsizei,GLboolean,GLfloat *); static VALUE gl_UniformMatrix2fv(obj,arg1,arg2,arg3,arg4) VALUE obj,arg1,arg2,arg3,arg4; { GLint location; GLsizei count; GLboolean transpose; GLfloat *value; LOAD_GL_FUNC(glUniformMatrix2fv) location = (GLint)NUM2INT(arg1); count = (GLint)NUM2INT(arg2); transpose = (GLboolean)NUM2INT(arg3); value = ALLOC_N(GLfloat, 2*2*count); ary2cflt(arg4,value,2*2*count); fptr_glUniformMatrix2fv(location,count,transpose,value); xfree(value); return Qnil; } static void (APIENTRY * fptr_glUniformMatrix3fv)(GLint,GLsizei,GLboolean,GLfloat *); static VALUE gl_UniformMatrix3fv(obj,arg1,arg2,arg3,arg4) VALUE obj,arg1,arg2,arg3,arg4; { GLint location; GLsizei count; GLboolean transpose; GLfloat *value; LOAD_GL_FUNC(glUniformMatrix3fv) location = (GLint)NUM2INT(arg1); count = (GLint)NUM2INT(arg2); transpose = (GLboolean)NUM2INT(arg3); value = ALLOC_N(GLfloat, 3*3*count); ary2cflt(arg4,value,3*3*count); fptr_glUniformMatrix3fv(location,count,transpose,value); xfree(value); return Qnil; } static void (APIENTRY * fptr_glUniformMatrix4fv)(GLint,GLsizei,GLboolean,GLfloat *); static VALUE gl_UniformMatrix4fv(obj,arg1,arg2,arg3,arg4) VALUE obj,arg1,arg2,arg3,arg4; { GLint location; GLsizei count; GLboolean transpose; GLfloat *value; LOAD_GL_FUNC(glUniformMatrix4fv) location = (GLint)NUM2INT(arg1); count = (GLint)NUM2INT(arg2); transpose = (GLboolean)NUM2INT(arg3); value = ALLOC_N(GLfloat, 4*4*count); ary2cflt(arg4,value,4*4*count); fptr_glUniformMatrix4fv(location,count,transpose,value); xfree(value); return Qnil; } static void (APIENTRY * fptr_glValidateProgram)(GLuint); static VALUE gl_ValidateProgram(obj,arg1) VALUE obj,arg1; { GLuint program; LOAD_GL_FUNC(glValidateProgram) program = (GLuint)NUM2UINT(arg1); fptr_glValidateProgram(program); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib1d)(GLuint,GLdouble); static VALUE gl_VertexAttrib1d(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint index; GLdouble v0; LOAD_GL_FUNC(glVertexAttrib1d) index = (GLuint)NUM2UINT(arg1); v0 = (GLdouble)NUM2DBL(arg2); fptr_glVertexAttrib1d(index,v0); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib1f)(GLuint,GLfloat); static VALUE gl_VertexAttrib1f(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint index; GLfloat v0; LOAD_GL_FUNC(glVertexAttrib1f) index = (GLuint)NUM2UINT(arg1); v0 = (GLfloat)NUM2DBL(arg2); fptr_glVertexAttrib1f(index,v0); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib1s)(GLuint,GLshort); static VALUE gl_VertexAttrib1s(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint index; GLshort v0; LOAD_GL_FUNC(glVertexAttrib1s) index = (GLuint)NUM2UINT(arg1); v0 = (GLshort)NUM2INT(arg2); fptr_glVertexAttrib1s(index,v0); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib2d)(GLuint,GLdouble,GLdouble); static VALUE gl_VertexAttrib2d(obj,arg1,arg2,arg3) VALUE obj,arg1,arg2,arg3; { GLuint index; GLdouble v0; GLdouble v1; LOAD_GL_FUNC(glVertexAttrib2d) index = (GLuint)NUM2UINT(arg1); v0 = (GLdouble)NUM2DBL(arg2); v1 = (GLdouble)NUM2DBL(arg3); fptr_glVertexAttrib2d(index,v0,v1); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib2f)(GLuint,GLfloat,GLfloat); static VALUE gl_VertexAttrib2f(obj,arg1,arg2,arg3) VALUE obj,arg1,arg2,arg3; { GLuint index; GLfloat v0; GLfloat v1; LOAD_GL_FUNC(glVertexAttrib2f) index = (GLuint)NUM2UINT(arg1); v0 = (GLfloat)NUM2DBL(arg2); v1 = (GLfloat)NUM2DBL(arg3); fptr_glVertexAttrib2f(index,v0,v1); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib2s)(GLuint,GLshort,GLshort); static VALUE gl_VertexAttrib2s(obj,arg1,arg2,arg3) VALUE obj,arg1,arg2,arg3; { GLuint index; GLshort v0; GLshort v1; LOAD_GL_FUNC(glVertexAttrib2s) index = (GLuint)NUM2UINT(arg1); v0 = (GLshort)NUM2INT(arg2); v1 = (GLshort)NUM2INT(arg3); fptr_glVertexAttrib2s(index,v0,v1); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib3d)(GLuint,GLdouble,GLdouble,GLdouble); static VALUE gl_VertexAttrib3d(obj,arg1,arg2,arg3,arg4) VALUE obj,arg1,arg2,arg3,arg4; { GLuint index; GLdouble v0; GLdouble v1; GLdouble v2; LOAD_GL_FUNC(glVertexAttrib3d) index = (GLuint)NUM2UINT(arg1); v0 = (GLdouble)NUM2DBL(arg2); v1 = (GLdouble)NUM2DBL(arg3); v2 = (GLdouble)NUM2DBL(arg4); fptr_glVertexAttrib3d(index,v0,v1,v2); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib3f)(GLuint,GLfloat,GLfloat,GLfloat); static VALUE gl_VertexAttrib3f(obj,arg1,arg2,arg3,arg4) VALUE obj,arg1,arg2,arg3,arg4; { GLuint index; GLfloat v0; GLfloat v1; GLfloat v2; LOAD_GL_FUNC(glVertexAttrib3f) index = (GLuint)NUM2UINT(arg1); v0 = (GLfloat)NUM2DBL(arg2); v1 = (GLfloat)NUM2DBL(arg3); v2 = (GLfloat)NUM2DBL(arg4); fptr_glVertexAttrib3f(index,v0,v1,v2); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib3s)(GLuint,GLshort,GLshort,GLshort); static VALUE gl_VertexAttrib3s(obj,arg1,arg2,arg3,arg4) VALUE obj,arg1,arg2,arg3,arg4; { GLuint index; GLshort v0; GLshort v1; GLshort v2; LOAD_GL_FUNC(glVertexAttrib3s) index = (GLuint)NUM2UINT(arg1); v0 = (GLshort)NUM2INT(arg2); v1 = (GLshort)NUM2INT(arg3); v2 = (GLshort)NUM2INT(arg4); fptr_glVertexAttrib3s(index,v0,v1,v2); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib4Nbv)(GLuint,GLbyte *); static VALUE gl_VertexAttrib4Nbv(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint index; GLbyte v[4]; LOAD_GL_FUNC(glVertexAttrib4Nbv) index = (GLuint)NUM2UINT(arg1); ary2cbyte(arg2,v,4); fptr_glVertexAttrib4Nbv(index,v); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib4Niv)(GLuint,GLint *); static VALUE gl_VertexAttrib4Niv(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint index; GLint v[4]; LOAD_GL_FUNC(glVertexAttrib4Niv) index = (GLuint)NUM2UINT(arg1); ary2cint(arg2,v,4); fptr_glVertexAttrib4Niv(index,v); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib4Nsv)(GLuint,GLshort *); static VALUE gl_VertexAttrib4Nsv(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint index; GLshort v[4]; LOAD_GL_FUNC(glVertexAttrib4Nsv) index = (GLuint)NUM2UINT(arg1); ary2cshort(arg2,v,4); fptr_glVertexAttrib4Nsv(index,v); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib4Nub)(GLuint,GLubyte,GLubyte,GLubyte,GLubyte); static VALUE gl_VertexAttrib4Nub(obj,arg1,arg2,arg3,arg4,arg5) VALUE obj,arg1,arg2,arg3,arg4,arg5; { GLuint index; GLubyte v0; GLubyte v1; GLubyte v2; GLubyte v3; LOAD_GL_FUNC(glVertexAttrib4Nub) index = (GLuint)NUM2UINT(arg1); v0 = (GLubyte)NUM2INT(arg2); v1 = (GLubyte)NUM2INT(arg3); v2 = (GLubyte)NUM2INT(arg4); v3 = (GLubyte)NUM2INT(arg5); fptr_glVertexAttrib4Nub(index,v0,v1,v2,v3); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib4Nubv)(GLuint,GLubyte *); static VALUE gl_VertexAttrib4Nubv(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint index; GLubyte v[4]; LOAD_GL_FUNC(glVertexAttrib4Nubv) index = (GLuint)NUM2UINT(arg1); ary2cubyte(arg2,v,4); fptr_glVertexAttrib4Nubv(index,v); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib4Nuiv)(GLuint,GLuint *); static VALUE gl_VertexAttrib4Nuiv(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint index; GLuint v[4]; LOAD_GL_FUNC(glVertexAttrib4Nuiv) index = (GLuint)NUM2UINT(arg1); ary2cuint(arg2,v,4); fptr_glVertexAttrib4Nuiv(index,v); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib4Nusv)(GLuint,GLushort *); static VALUE gl_VertexAttrib4Nusv(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint index; GLushort v[4]; LOAD_GL_FUNC(glVertexAttrib4Nusv) index = (GLuint)NUM2UINT(arg1); ary2cushort(arg2,v,4); fptr_glVertexAttrib4Nusv(index,v); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib4bv)(GLuint,GLbyte *); static VALUE gl_VertexAttrib4bv(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint index; GLbyte v[4]; LOAD_GL_FUNC(glVertexAttrib4bv) index = (GLuint)NUM2UINT(arg1); ary2cbyte(arg2,v,4); fptr_glVertexAttrib4bv(index,v); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib4d)(GLuint,GLdouble,GLdouble,GLdouble,GLdouble); static VALUE gl_VertexAttrib4d(obj,arg1,arg2,arg3,arg4,arg5) VALUE obj,arg1,arg2,arg3,arg4,arg5; { GLuint index; GLdouble v0; GLdouble v1; GLdouble v2; GLdouble v3; LOAD_GL_FUNC(glVertexAttrib4d) index = (GLuint)NUM2UINT(arg1); v0 = (GLdouble)NUM2DBL(arg2); v1 = (GLdouble)NUM2DBL(arg3); v2 = (GLdouble)NUM2DBL(arg4); v3 = (GLdouble)NUM2DBL(arg5); fptr_glVertexAttrib4d(index,v0,v1,v2,v3); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib4f)(GLuint,GLfloat,GLfloat,GLfloat,GLfloat); static VALUE gl_VertexAttrib4f(obj,arg1,arg2,arg3,arg4,arg5) VALUE obj,arg1,arg2,arg3,arg4,arg5; { GLuint index; GLfloat v0; GLfloat v1; GLfloat v2; GLfloat v3; LOAD_GL_FUNC(glVertexAttrib4f) index = (GLuint)NUM2UINT(arg1); v0 = (GLfloat)NUM2DBL(arg2); v1 = (GLfloat)NUM2DBL(arg3); v2 = (GLfloat)NUM2DBL(arg4); v3 = (GLfloat)NUM2DBL(arg5); fptr_glVertexAttrib4f(index,v0,v1,v2,v3); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib4iv)(GLuint,GLint *); static VALUE gl_VertexAttrib4iv(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint index; GLint v[4]; LOAD_GL_FUNC(glVertexAttrib4iv) index = (GLuint)NUM2UINT(arg1); ary2cint(arg2,v,4); fptr_glVertexAttrib4iv(index,v); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib4s)(GLuint,GLshort,GLshort,GLshort,GLshort); static VALUE gl_VertexAttrib4s(obj,arg1,arg2,arg3,arg4,arg5) VALUE obj,arg1,arg2,arg3,arg4,arg5; { GLuint index; GLshort v0; GLshort v1; GLshort v2; GLshort v3; LOAD_GL_FUNC(glVertexAttrib4s) index = (GLuint)NUM2UINT(arg1); v0 = (GLshort)NUM2INT(arg2); v1 = (GLshort)NUM2INT(arg3); v2 = (GLshort)NUM2INT(arg4); v3 = (GLshort)NUM2INT(arg5); fptr_glVertexAttrib4s(index,v0,v1,v2,v3); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib4ubv)(GLuint,GLubyte *); static VALUE gl_VertexAttrib4ubv(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint index; GLubyte v[4]; LOAD_GL_FUNC(glVertexAttrib4ubv) index = (GLuint)NUM2UINT(arg1); ary2cubyte(arg2,v,4); fptr_glVertexAttrib4ubv(index,v); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib4uiv)(GLuint,GLuint *); static VALUE gl_VertexAttrib4uiv(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint index; GLuint v[4]; LOAD_GL_FUNC(glVertexAttrib4uiv) index = (GLuint)NUM2UINT(arg1); ary2cuint(arg2,v,4); fptr_glVertexAttrib4uiv(index,v); return Qnil; } static void (APIENTRY * fptr_glVertexAttrib4usv)(GLuint,GLushort *); static VALUE gl_VertexAttrib4usv(obj,arg1,arg2) VALUE obj,arg1,arg2; { GLuint index; GLushort v[4]; LOAD_GL_FUNC(glVertexAttrib4usv) index = (GLuint)NUM2UINT(arg1); ary2cushort(arg2,v,4); fptr_glVertexAttrib4usv(index,v); return Qnil; } #define GLVERTEXATTRIB_VFUNC(_type_) \ static VALUE \ gl_VertexAttrib##_type_##v(argc,argv,obj) \ int argc; \ VALUE *argv; \ VALUE obj; \ { \ VALUE args[5]; \ RArray *ary; \ switch (rb_scan_args(argc, argv, "23", &args[0], &args[1], &args[2], &args[3], &args[4])) { \ case 2: \ if (TYPE(args[1]) == T_ARRAY) { \ ary = RARRAY(args[1]); \ switch (ary->len) { \ case 1: \ gl_VertexAttrib1##_type_(obj,args[0],ary->ptr[0]); \ break; \ case 2: \ gl_VertexAttrib2##_type_(obj,args[0],ary->ptr[0],ary->ptr[1]); \ break; \ case 3: \ gl_VertexAttrib3##_type_(obj,args[0],ary->ptr[0],ary->ptr[1],ary->ptr[2]); \ break; \ case 4: \ gl_VertexAttrib4##_type_(obj,args[0],ary->ptr[0],ary->ptr[1],ary->ptr[2],ary->ptr[3]); \ break; \ default: \ rb_raise(rb_eRuntimeError, "glVertex vertex num error!:%d", ary->len); \ } \ } \ else { \ gl_VertexAttrib1##_type_(obj,args[0], args[1]); \ break; \ } \ break; \ case 3: \ gl_VertexAttrib2##_type_(obj,args[0], args[1], args[2]); \ break; \ case 4: \ gl_VertexAttrib3##_type_(obj,args[0], args[1], args[2], args[3]); \ break; \ case 5: \ gl_VertexAttrib4##_type_(obj,args[0], args[1], args[2], args[3], args[4]); \ break; \ default: \ rb_raise(rb_eArgError, "Argument number error!"); \ break; \ } \ return Qnil; \ } GLVERTEXATTRIB_VFUNC(d) GLVERTEXATTRIB_VFUNC(f) GLVERTEXATTRIB_VFUNC(s) #undef GLVERTEXATTRIB_VFUNC static void (APIENTRY * fptr_glVertexAttribPointer)(GLuint,GLint,GLenum,GLboolean,GLsizei,GLvoid *); static VALUE gl_VertexAttribPointer(obj,arg1,arg2,arg3,arg4,arg5,arg6) VALUE obj,arg1,arg2,arg3,arg4,arg5,arg6; { GLuint index; GLuint size; GLenum type; GLboolean normalized; GLsizei stride; LOAD_GL_FUNC(glVertexAttribPointer) index = (GLuint)NUM2UINT(arg1); size = (GLuint)NUM2UINT(arg2); type = (GLenum)NUM2INT(arg3); normalized = (GLboolean)NUM2INT(arg4); stride = (GLsizei)NUM2UINT(arg5); if (index>_MAX_VERTEX_ATTRIBS) rb_raise(rb_eArgError, "Index too large, maximum allowed value '%i'",_MAX_VERTEX_ATTRIBS); Check_Type(arg6, T_STRING); rb_str_freeze(arg6); g_VertexAttrib_ptr[index] = arg6; fptr_glVertexAttribPointer(index,size,type,normalized,stride,(GLvoid *)RSTRING(arg6)->ptr); return Qnil; } void gl_init_functions_2_0(VALUE module) { rb_define_module_function(module, "glBlendEquationSeparate", gl_BlendEquationSeparate, 2); rb_define_module_function(module, "glDrawBuffers", gl_DrawBuffers, 1); rb_define_module_function(module, "glStencilOpSeparate", gl_StencilOpSeparate, 4); rb_define_module_function(module, "glStencilFuncSeparate", gl_StencilFuncSeparate, 4); rb_define_module_function(module, "glStencilMaskSeparate", gl_StencilMaskSeparate, 2); rb_define_module_function(module, "glAttachShader", gl_AttachShader, 2); rb_define_module_function(module, "glBindAttribLocation", gl_BindAttribLocation, 3); rb_define_module_function(module, "glCompileShader", gl_CompileShader, 1); rb_define_module_function(module, "glCreateProgram", gl_CreateProgram, 0); rb_define_module_function(module, "glCreateShader", gl_CreateShader, 1); rb_define_module_function(module, "glDeleteProgram", gl_DeleteProgram, 1); rb_define_module_function(module, "glDeleteShader", gl_DeleteShader, 1); rb_define_module_function(module, "glDetachShader", gl_DetachShader, 2); rb_define_module_function(module, "glDisableVertexAttribArray", gl_DisableVertexAttribArray, 1); rb_define_module_function(module, "glEnableVertexAttribArray", gl_EnableVertexAttribArray, 1); rb_define_module_function(module, "glGetActiveAttrib", gl_GetActiveAttrib, 2); rb_define_module_function(module, "glGetActiveUniform", gl_GetActiveUniform, 2); rb_define_module_function(module, "glGetAttachedShaders", gl_GetAttachedShaders, 1); rb_define_module_function(module, "glGetAttribLocation", gl_GetAttribLocation, 2); rb_define_module_function(module, "glGetProgramiv", gl_GetProgramiv, 2); rb_define_module_function(module, "glGetProgramInfoLog", gl_GetProgramInfoLog, 1); rb_define_module_function(module, "glGetShaderiv", gl_GetShaderiv, 2); rb_define_module_function(module, "glGetShaderInfoLog", gl_GetShaderInfoLog, 1); rb_define_module_function(module, "glGetShaderSource", gl_GetShaderSource, 1); rb_define_module_function(module, "glGetUniformLocation", gl_GetUniformLocation, 2); rb_define_module_function(module, "glGetUniformfv", gl_GetUniformfv, 2); rb_define_module_function(module, "glGetUniformiv", gl_GetUniformiv, 2); rb_define_module_function(module, "glGetVertexAttribdv", gl_GetVertexAttribdv, 2); rb_define_module_function(module, "glGetVertexAttribfv", gl_GetVertexAttribfv, 2); rb_define_module_function(module, "glGetVertexAttribiv", gl_GetVertexAttribiv, 2); rb_define_module_function(module, "glGetVertexAttribPointerv", gl_GetVertexAttribPointerv, 1); rb_define_module_function(module, "glIsProgram", gl_IsProgram, 1); rb_define_module_function(module, "glIsShader", gl_IsShader, 1); rb_define_module_function(module, "glLinkProgram", gl_LinkProgram, 1); rb_define_module_function(module, "glShaderSource", gl_ShaderSource, 2); rb_define_module_function(module, "glUseProgram", gl_UseProgram, 1); rb_define_module_function(module, "glUniform1f", gl_Uniform1f, 2); rb_define_module_function(module, "glUniform2f", gl_Uniform2f, 3); rb_define_module_function(module, "glUniform3f", gl_Uniform3f, 4); rb_define_module_function(module, "glUniform4f", gl_Uniform4f, 5); rb_define_module_function(module, "glUniform1i", gl_Uniform1i, 2); rb_define_module_function(module, "glUniform2i", gl_Uniform2i, 3); rb_define_module_function(module, "glUniform3i", gl_Uniform3i, 4); rb_define_module_function(module, "glUniform4i", gl_Uniform4i, 5); rb_define_module_function(module, "glUniform1fv", gl_Uniform1fv, 3); rb_define_module_function(module, "glUniform2fv", gl_Uniform2fv, 3); rb_define_module_function(module, "glUniform3fv", gl_Uniform3fv, 3); rb_define_module_function(module, "glUniform4fv", gl_Uniform4fv, 3); rb_define_module_function(module, "glUniform1iv", gl_Uniform1iv, 3); rb_define_module_function(module, "glUniform2iv", gl_Uniform2iv, 3); rb_define_module_function(module, "glUniform3iv", gl_Uniform3iv, 3); rb_define_module_function(module, "glUniform4iv", gl_Uniform4iv, 3); 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, "glValidateProgram", gl_ValidateProgram, 1); rb_define_module_function(module, "glVertexAttrib1d", gl_VertexAttrib1d, 2); rb_define_module_function(module, "glVertexAttrib1f", gl_VertexAttrib1f, 2); rb_define_module_function(module, "glVertexAttrib1s", gl_VertexAttrib1s, 2); rb_define_module_function(module, "glVertexAttrib2d", gl_VertexAttrib2d, 3); rb_define_module_function(module, "glVertexAttrib2f", gl_VertexAttrib2f, 3); rb_define_module_function(module, "glVertexAttrib2s", gl_VertexAttrib2s, 3); rb_define_module_function(module, "glVertexAttrib3d", gl_VertexAttrib3d, 4); rb_define_module_function(module, "glVertexAttrib3f", gl_VertexAttrib3f, 4); rb_define_module_function(module, "glVertexAttrib3s", gl_VertexAttrib3s, 4); rb_define_module_function(module, "glVertexAttrib4Nbv", gl_VertexAttrib4Nbv, 2); rb_define_module_function(module, "glVertexAttrib4Niv", gl_VertexAttrib4Niv, 2); rb_define_module_function(module, "glVertexAttrib4Nsv", gl_VertexAttrib4Nsv, 2); rb_define_module_function(module, "glVertexAttrib4Nub", gl_VertexAttrib4Nub, 5); rb_define_module_function(module, "glVertexAttrib4Nubv", gl_VertexAttrib4Nubv, 2); rb_define_module_function(module, "glVertexAttrib4Nuiv", gl_VertexAttrib4Nuiv, 2); rb_define_module_function(module, "glVertexAttrib4Nusv", gl_VertexAttrib4Nusv, 2); rb_define_module_function(module, "glVertexAttrib4bv", gl_VertexAttrib4bv, 2); rb_define_module_function(module, "glVertexAttrib4d", gl_VertexAttrib4d, 5); rb_define_module_function(module, "glVertexAttrib4f", gl_VertexAttrib4f, 5); rb_define_module_function(module, "glVertexAttrib4iv", gl_VertexAttrib4iv, 2); rb_define_module_function(module, "glVertexAttrib4s", gl_VertexAttrib4s, 5); rb_define_module_function(module, "glVertexAttrib4ubv", gl_VertexAttrib4ubv, 2); rb_define_module_function(module, "glVertexAttrib4uiv", gl_VertexAttrib4uiv, 2); rb_define_module_function(module, "glVertexAttrib4usv", gl_VertexAttrib4usv, 2); rb_define_module_function(module, "glVertexAttribPointer", gl_VertexAttribPointer, 6); /* Additional functions */ rb_define_module_function(module, "glVertexAttrib1dv", gl_VertexAttribdv, -1); rb_define_module_function(module, "glVertexAttrib1fv", gl_VertexAttribfv, -1); rb_define_module_function(module, "glVertexAttrib1sv", gl_VertexAttribsv, -1); rb_define_module_function(module, "glVertexAttrib2dv", gl_VertexAttribdv, -1); rb_define_module_function(module, "glVertexAttrib2fv", gl_VertexAttribfv, -1); rb_define_module_function(module, "glVertexAttrib2sv", gl_VertexAttribsv, -1); rb_define_module_function(module, "glVertexAttrib3dv", gl_VertexAttribdv, -1); rb_define_module_function(module, "glVertexAttrib3fv", gl_VertexAttribfv, -1); rb_define_module_function(module, "glVertexAttrib3sv", gl_VertexAttribsv, -1); rb_define_module_function(module, "glVertexAttrib4dv", gl_VertexAttribdv, -1); rb_define_module_function(module, "glVertexAttrib4fv", gl_VertexAttribfv, -1); rb_define_module_function(module, "glVertexAttrib4sv", gl_VertexAttribsv, -1); { int i; for (i=0;i<_MAX_VERTEX_ATTRIBS;i++) rb_global_variable(&g_VertexAttrib_ptr[i]); } }