/*
* $Date: 2000/02/15 16:31:59 $
* $Author: kusano $
*/
#if defined (WIN32)
# include "windows.h"
#endif
#include "rbogl.h"
#include "GL/gl.h"
#ifdef _NO_NUM2DBL_
extern double
num2double(val)
VALUE val;
{
struct RFloat* flt;
if (NIL_P(val)) return 0;
flt = RFLOAT(f_float(0, val));
return flt->value;
}
#endif
extern int
ary2cint(arg, cary, maxlen)
VALUE arg;
int cary[];
int maxlen;
{
int i;
struct RArray* ary;
ary = RARRAY(rb_Array(arg));
if (maxlen < 1)
maxlen = ary->len;
else
maxlen = maxlen < ary->len ? maxlen : ary->len;
for (i=0; i < maxlen; i++)
cary[i] = NUM2INT(rb_ary_entry((VALUE)ary,i));
return i;
}
extern int
ary2cflt(arg, cary, maxlen)
VALUE arg;
float cary[];
int maxlen;
{
int i;
struct RArray* ary;
ary = RARRAY(rb_Array(arg));
if (maxlen < 1)
maxlen = ary->len;
else
maxlen = maxlen < ary->len ? maxlen : ary->len;
for (i=0; i < maxlen; i++)
cary[i] = (float)NUM2DBL(rb_ary_entry((VALUE)ary,i));
return i;
}
extern int
ary2cdbl(arg, cary, maxlen)
VALUE arg;
double cary[];
int maxlen;
{
int i;
struct RArray* ary;
ary = RARRAY(rb_Array(arg));
if (maxlen < 1)
maxlen = ary->len;
else
maxlen = maxlen < ary->len ? maxlen : ary->len;
for (i=0; i < maxlen; i++)
cary[i] = NUM2DBL(rb_ary_entry((VALUE)ary,i));
return i;
}
extern void
mary2ary(src, ary)
VALUE src;
VALUE ary;
{
struct RArray* tmp_ary;
int i;
tmp_ary = RARRAY(rb_Array(src));
for (i = 0; i < tmp_ary->len; i++) {
if (TYPE(tmp_ary->ptr[i]) == T_ARRAY)
mary2ary((VALUE)tmp_ary, ary);
else
rb_ary_push(ary, tmp_ary->ptr[i]);
}
}
extern void
ary2cmat4x4(ary, cary)
VALUE ary;
double cary[];
{
int i,j;
RArray *ary_r,*ary_c;
memset(cary, 0x0, sizeof(double[4*4]));
ary_c = RARRAY(rb_Array(ary));
if (TYPE(ary_c->ptr[0]) != T_ARRAY)
ary2cdbl((VALUE)ary_c, cary, 16);
else {
for (i = 0; i < ary_c->len && i < 4; i++) {
ary_r = RARRAY(rb_Array(ary_c->ptr[i]));
for(j = 0; j < ary_r->len && j < 4; j++)
cary[i*4+j] = (GLdouble)NUM2DBL(ary_r->ptr[j]);
}
}
}
/*Need to find proper size for glReadPixels array*/
int glformat_size(GLenum format) {
switch(format) {
case GL_COLOR_INDEX:
case GL_RED:
case GL_GREEN:
case GL_BLUE:
case GL_ALPHA:
case GL_STENCIL_INDEX:
case GL_DEPTH_COMPONENT:
case GL_LUMINANCE:
return 1;
case GL_LUMINANCE_ALPHA:
return 2;
case GL_RGB:
#ifdef GL_BGR_EXT
case GL_BGR_EXT:
#endif
return 3;
case GL_RGBA:
#ifdef GL_BGRA_EXT
case GL_BGRA_EXT:
#endif
#ifdef GL_ABGR_EXT
case GL_ABGR_EXT:
#endif
return 4;
case 1:
case 2:
case 3:
case 4:
return format;
default:
return -1;
}
}
int gltype_size(GLenum type) {
switch(type) {
case GL_BYTE:
case GL_UNSIGNED_BYTE:
return 8;
case GL_SHORT:
case GL_UNSIGNED_SHORT:
return 16;
case GL_INT:
case GL_UNSIGNED_INT:
case GL_FLOAT:
return 32;
case GL_BITMAP:
return 1;
default:
return -1;
}
}
VALUE
allocate_buffer_with_string(size)
int size;
{
NEWOBJ(buffer, struct RString);
OBJSETUP(buffer, rb_cString, T_STRING);
buffer->ptr = (char*)xmalloc(sizeof(char)*(size+1));
buffer->len = size;
buffer->ptr[buffer->len] = '\0';
return (VALUE)buffer;
}
void
Init_opengl()
{
InitializeGL();
InitializeGLU();
}
syntax highlighted by Code2HTML, v. 0.9.1