Acme-MITHALDU-BleedingOpenGL
view release on metacpan or search on metacpan
pogl_rpn.xs view on Meta::CPAN
OUTPUT:
RETVAL
#//# $oga->calc([@(OGA)moreOGAs,]@rpnOPs);
#//- Execute RPN instructions on one or more OGAs
void
calc(...)
CODE:
{
rpn_context * ctx;
oga_struct ** oga_list;
int oga_count = 0;
int ops_count,i;
char ** ops;
/* Determine number of OGAs passed in */
for (i=0; i<items; i++)
{
SV * sv = ST(i);
if (sv == &PL_sv_undef ||
!sv_derived_from(sv,"OpenGL::Array")) break;
oga_count++;
}
/* Grab OGA data buffers */
if (!oga_count) croak("Missing OGA parameters");
ops_count = items - oga_count;
oga_list = malloc(sizeof(oga_struct *) * oga_count);
if (!oga_list) croak("Unable to alloc oga_list");
for (i=0; i<oga_count; i++)
{
IV ref = SvIV((SV*)SvRV(ST(i)));
oga_list[i] = INT2PTR(OpenGL__Array,ref);
}
ops = malloc(sizeof(char *) * ops_count);
if (!ops) croak("Unable to alloc ops");
/* Parse parameters */
for (i=0;i<ops_count;i++)
{
SV * sv = ST(i+oga_count);
char * op = (sv != &PL_sv_undef) ?
(char *)SvPV(sv,PL_na) : "";
ops[i] = op;
}
/* Instantiate RPN context */
ctx = rpn_init(oga_count,oga_list,ops_count,ops);
rpn_exec(ctx);
rpn_term(ctx);
/* Delete lists */
free(ops);
free(oga_list);
}
#//# $oga->assign($pos,@data);
#//- Set OGA values starting from offset
void
assign(oga, pos, ...)
OpenGL::Array oga
GLint pos
CODE:
{
int i,j;
int end;
GLenum t;
char* offset;
i = pos;
end = i + items - 2;
if (end > oga->item_count)
end = oga->item_count;
/* FIXME: is this char* conversion what is intended? */
offset = ((char*)oga->data) +
(pos / oga->type_count * oga->total_types_width) +
oga->type_offset[pos % oga->type_count];
j = 2;
/* Handle multi-type OGAs */
for (;i<end;i++,j++) {
t = oga->types[i % oga->type_count];
switch (t) {
#ifdef GL_VERSION_1_2
case GL_UNSIGNED_BYTE_3_3_2:
case GL_UNSIGNED_BYTE_2_3_3_REV:
(*(GLubyte*)offset) = (GLubyte)SvIV(ST(j));
offset += sizeof(GLubyte);
break;
case GL_UNSIGNED_SHORT_5_6_5:
case GL_UNSIGNED_SHORT_5_6_5_REV:
case GL_UNSIGNED_SHORT_4_4_4_4:
case GL_UNSIGNED_SHORT_4_4_4_4_REV:
case GL_UNSIGNED_SHORT_5_5_5_1:
case GL_UNSIGNED_SHORT_1_5_5_5_REV:
(*(GLushort*)offset) = (GLushort)SvIV(ST(j));
offset += sizeof(GLushort);
break;
case GL_UNSIGNED_INT_8_8_8_8:
case GL_UNSIGNED_INT_8_8_8_8_REV:
case GL_UNSIGNED_INT_10_10_10_2:
case GL_UNSIGNED_INT_2_10_10_10_REV:
(*(GLuint*)offset) = (GLuint)SvIV(ST(j));
offset += sizeof(GLuint);
break;
#endif
case GL_UNSIGNED_BYTE:
case GL_BITMAP:
(*(GLubyte*)offset) = (GLubyte)SvIV(ST(j));
offset += sizeof(GLubyte);
break;
case GL_BYTE:
(*(GLbyte*)offset) = (GLbyte)SvIV(ST(j));
offset += sizeof(GLbyte);
break;
case GL_UNSIGNED_SHORT:
pogl_rpn.xs view on Meta::CPAN
case GL_SHORT:
(*(GLshort*)offset) = (GLshort)SvIV(ST(j));
offset += sizeof(GLshort);
break;
case GL_UNSIGNED_INT:
(*(GLuint*)offset) = (GLuint)SvIV(ST(j));
offset += sizeof(GLuint);
break;
case GL_INT:
(*(GLint*)offset) = (GLint)SvIV(ST(j));
offset += sizeof(GLint);
break;
case GL_FLOAT:
(*(GLfloat*)offset) = (GLfloat)SvNV(ST(j));
offset += sizeof(GLfloat);
break;
case GL_DOUBLE:
(*(GLdouble*)offset) = (GLdouble)SvNV(ST(j));
offset += sizeof(GLdouble);
break;
case GL_2_BYTES:
{
unsigned long v = (unsigned long)SvIV(ST(j));
(*(GLubyte*)offset) = (GLubyte)(v >> 8);
offset++;
(*(GLubyte*)offset) = (GLubyte)v & 0xff;
offset++;
break;
}
case GL_3_BYTES:
{
unsigned long v = (unsigned long)SvIV(ST(j));
(*(GLubyte*)offset) = (GLubyte)(v >> 16)& 0xff;
offset++;
(*(GLubyte*)offset) = (GLubyte)(v >> 8) & 0xff;
offset++;
(*(GLubyte*)offset) = (GLubyte)(v >> 0) & 0xff;
offset++;
break;
}
case GL_4_BYTES:
{
unsigned long v = (unsigned long)SvIV(ST(j));
(*(GLubyte*)offset) = (GLubyte)(v >> 24)& 0xff;
offset++;
(*(GLubyte*)offset) = (GLubyte)(v >> 16)& 0xff;
offset++;
(*(GLubyte*)offset) = (GLubyte)(v >> 8) & 0xff;
offset++;
(*(GLubyte*)offset) = (GLubyte)(v >> 0) & 0xff;
offset++;
break;
}
default:
croak("unknown type");
}
}
}
#//# $oga->assign_data($pos,(PACKED)data);
#//- Set OGA values by string, starting from offset
void
assign_data(oga, pos, data)
OpenGL::Array oga
GLint pos
SV * data
CODE:
{
void * offset;
void * src;
STRLEN len;
offset = ((char*)oga->data) +
(pos / oga->type_count * oga->total_types_width) +
oga->type_offset[pos % oga->type_count];
src = SvPV(data, len);
memcpy(offset, src, len);
}
#//# @data = $oga->retrieve($pos,$len);
#//- Get OGA data array, by offset and length
void
retrieve(oga, ...)
OpenGL::Array oga
PPCODE:
{
GLint pos = (items > 1) ? SvIV(ST(1)) : 0;
GLint len = (items > 2) ? SvIV(ST(2)) : (oga->item_count - pos);
char * offset;
int end = pos + len;
int i;
offset = ((char*)oga->data) +
(pos / oga->type_count * oga->total_types_width) +
oga->type_offset[pos % oga->type_count];
if (end > oga->item_count)
end = oga->item_count;
EXTEND(sp, end-pos);
i = pos;
for (;i<end;i++) {
GLenum t = oga->types[i % oga->type_count];
switch (t) {
#ifdef GL_VERSION_1_2
case GL_UNSIGNED_BYTE_3_3_2:
case GL_UNSIGNED_BYTE_2_3_3_REV:
PUSHs(sv_2mortal(newSViv( (*(GLubyte*)offset) )));
offset += sizeof(GLubyte);
break;
case GL_UNSIGNED_SHORT_5_6_5:
case GL_UNSIGNED_SHORT_5_6_5_REV:
case GL_UNSIGNED_SHORT_4_4_4_4:
case GL_UNSIGNED_SHORT_4_4_4_4_REV:
case GL_UNSIGNED_SHORT_5_5_5_1:
case GL_UNSIGNED_SHORT_1_5_5_5_REV:
PUSHs(sv_2mortal(newSViv( (*(GLushort*)offset) )));
( run in 1.189 second using v1.01-cache-2.11-cpan-5735350b133 )