Acme-MITHALDU-BleedingOpenGL
view release on metacpan or search on metacpan
pogl_rpn.xs view on Meta::CPAN
case RPN_MIN:
{
//printf("RPN_MIN\n");
if (stack->count > 1)
{
v1 = rpn_pop(stack);
if (stack->data[--pos] > v1)
stack->data[pos] = v1;
}
break;
}
case RPN_MAX:
{
//printf("RPN_MAX\n");
if (stack->count > 1)
{
v1 = rpn_pop(stack);
if (stack->data[--pos] < v1)
stack->data[pos] = v1;
}
break;
}
case RPN_SIN:
{
//printf("RPN_SIN\n");
stack->data[pos] = (float)sin(stack->data[pos]);
break;
}
case RPN_COS:
{
//printf("RPN_COS\n");
stack->data[pos] = (float)cos(stack->data[pos]);
break;
}
case RPN_TAN:
{
//printf("RPN_TAN\n");
stack->data[pos] = (float)tan(stack->data[pos]);
break;
}
case RPN_AT2:
{
//printf("RPN_AT2\n");
v2 = rpn_pop(stack);
v1 = rpn_pop(stack);
if (v1 != 0.0 || v2 != 0.0)
rpn_push(stack,(float)atan2(v1,v2));
break;
}
case RPN_DMP:
{
//printf("RPN_DMP\n");
rpn_dump(stack, i, j, ctx->store[j]);
break;
}
case RPN_NOP:
{
//printf("RPN_NOP\n");
break;
}
default:
{
croak("Unknown RPN op: %d\n",ops->op);
}
}
ops = ops->next;
}
if (!flow) { /* RPNF_CONTINUE */
((GLfloat *)ctx->oga_list[0]->data)[r+j] = rpn_pop(stack);
}
else {
switch(flow)
{
case RPNF_RETURN:
{
((GLfloat *)ctx->oga_list[0]->data)[r+j] = rpn_pop(stack);
break;
}
case RPNF_RETURNROW:
{
((GLfloat *)ctx->oga_list[0]->data)[r+j] = rpn_pop(stack);
j = ctx->cols;
break;
}
case RPNF_ENDROW:
{
j = ctx->cols;
break;
}
}
}
}
r += ctx->cols;
}
}
#endif /* End IN_POGL_RPN_XS */
MODULE = Acme::MITHALDU::BleedingOpenGL::RPN PACKAGE = OpenGL::Array
#ifdef IN_POGL_ARRAY_XS
#//# $oga = OpenGL::Array->new($count, @types);
#//- Constructor for multi-type OGA - unpopulated
OpenGL::Array
new(Class, count, type, ...)
GLsizei count
GLenum type
CODE:
{
int oga_len = sizeof(oga_struct);
oga_struct * oga = malloc(oga_len);
int i,j;
memset(oga,0,oga_len);
pogl_rpn.xs view on Meta::CPAN
(*(GLbyte*)offset) = (GLbyte)SvIV(ST(j));
offset += sizeof(GLbyte);
break;
case GL_UNSIGNED_SHORT:
(*(GLushort*)offset) = (GLushort)SvIV(ST(j));
offset += sizeof(GLushort);
break;
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) )));
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:
PUSHs(sv_2mortal(newSViv( (*(GLuint*)offset) )));
offset += sizeof(GLuint);
break;
#endif
case GL_UNSIGNED_BYTE:
case GL_BITMAP:
PUSHs(sv_2mortal(newSViv( (*(GLubyte*)offset) )));
offset += sizeof(GLubyte);
break;
case GL_BYTE:
PUSHs(sv_2mortal(newSViv( (*(GLbyte*)offset) )));
offset += sizeof(GLbyte);
break;
case GL_UNSIGNED_SHORT:
PUSHs(sv_2mortal(newSViv( (*(GLushort*)offset) )));
offset += sizeof(GLushort);
break;
case GL_SHORT:
PUSHs(sv_2mortal(newSViv( (*(GLshort*)offset) )));
offset += sizeof(GLshort);
break;
case GL_UNSIGNED_INT:
PUSHs(sv_2mortal(newSViv( (*(GLuint*)offset) )));
offset += sizeof(GLuint);
break;
case GL_INT:
PUSHs(sv_2mortal(newSViv( (*(GLint*)offset) )));
offset += sizeof(GLint);
break;
case GL_FLOAT:
PUSHs(sv_2mortal(newSVnv( (*(GLfloat*)offset) )));
offset += sizeof(GLfloat);
break;
case GL_DOUBLE:
PUSHs(sv_2mortal(newSVnv( (*(GLdouble*)offset) )));
offset += sizeof(GLdouble);
break;
case GL_2_BYTES:
case GL_3_BYTES:
case GL_4_BYTES:
default:
croak("unknown type");
}
}
}
#//# $data = $oga->retrieve_data($pos,$len);
#//- Get OGA data as packed string, by offset and length
SV *
retrieve_data(oga, ...)
OpenGL::Array oga
CODE:
{
GLint pos = (items > 1) ? SvIV(ST(1)) : 0;
GLint len = (items > 2) ? SvIV(ST(2)) : (oga->item_count - pos);
void * offset;
offset = ((char*)oga->data) +
(pos / oga->type_count * oga->total_types_width) +
oga->type_offset[pos % oga->type_count];
RETVAL = newSVpv((char*)offset, len);
}
OUTPUT:
RETVAL
#//# $count = $oga->elements();
#//- Get number of OGA elements
GLsizei
elements(oga)
OpenGL::Array oga
CODE:
RETVAL = oga->item_count;
OUTPUT:
RETVAL
#//# $len = $oga->length();
#//- Get size of OGA in bytes
GLsizei
length(oga)
OpenGL::Array oga
CODE:
RETVAL = oga->data_length;
OUTPUT:
RETVAL
#//# (CPTR)ptr = $oga->ptr();
#//- Get C pointer to OGA data
void *
ptr(oga)
OpenGL::Array oga
CODE:
RETVAL = oga->data;
OUTPUT:
RETVAL
#//# (CPTR)ptr = $oga->offset($pos);
#//- Get C pointer to OGA data, by element offset
void *
offset(oga, pos)
OpenGL::Array oga
( run in 1.910 second using v1.01-cache-2.11-cpan-98e64b0badf )