Acme-MITHALDU-BleedingOpenGL
view release on metacpan or search on metacpan
pogl_rpn.xs view on Meta::CPAN
oga->data_length = elements * width;
oga->data = ptr;
oga->free_data = 0;
RETVAL = oga;
}
OUTPUT:
RETVAL
#//# $oga = OpenGL::Array->new_from_pointer((CPTR)ptr, $length);
#//- Constructor for GLubyte OGA wrapper over a C pointer
OpenGL::Array
new_from_pointer(Class, ptr, length)
void * ptr
GLsizei length
CODE:
{
int oga_len = sizeof(oga_struct);
oga_struct * oga = malloc(sizeof(oga_struct));
memset(oga,0,oga_len);
oga->dimension_count = 1;
oga->dimensions[0] = length;
oga->type_count = 1;
oga->item_count = length;
oga->types = malloc(sizeof(GLenum) * oga->type_count);
oga->type_offset = malloc(sizeof(GLint) * oga->type_count);
oga->types[0] = GL_UNSIGNED_BYTE;
oga->type_offset[0] = 0;
oga->total_types_width = 1;
oga->data_length = oga->item_count;
oga->data = ptr;
oga->free_data = 0;
RETVAL = oga;
}
OUTPUT:
RETVAL
#//# $oga->update_pointer((CPTR)ptr);
#//- Replace OGA's C pointer - old one is not released
GLboolean
update_pointer(oga, ptr)
OpenGL::Array oga
void * ptr
CODE:
{
RETVAL = (oga->data != ptr);
oga->data = ptr;
}
OUTPUT:
RETVAL
#//# $oga->bind($vboID);
#//- Bind a VBO to an OGA
void
bind(oga, bind)
OpenGL::Array oga
GLint bind
INIT:
#ifdef GL_ARB_vertex_buffer_object
loadProc(glBindBufferARB,"glBindBufferARB");
#endif
CODE:
{
#ifdef GL_ARB_vertex_buffer_object
oga->bind = bind;
glBindBufferARB(GL_ARRAY_BUFFER_ARB,bind);
#else
croak("OpenGL::Array::bind requires GL_ARB_vertex_buffer_object");
#endif
}
#//# $vboID = $oga->bound();
#//- Return OGA's bound VBO ID
GLint
bound(oga)
OpenGL::Array oga
CODE:
RETVAL = oga->bind;
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);
pogl_rpn.xs view on Meta::CPAN
{
vec[j] = 0.0;
/* Iterate each matrix column */
for (k=0; k<cols; k++)
{
vec[j] += data[i+k] * mat[r+k];
}
/* Matrix translate column */
vec[j] += mat[r+cols];
}
memcpy(data+i,vec,s);
}
free(vec);
}
if (free_mat) free(mat);
}
#//# @dimensions = $oga->get_dimensions();
#//- Get OGA data array, by offset and length
void
get_dimensions(oga)
OpenGL::Array oga
PPCODE:
{
int end = oga->dimension_count;
int i = 0;
EXTEND(sp, end);
for (;i<end;i++) {
PUSHs(sv_2mortal(newSViv( oga->dimensions[i] )));
}
}
#// OGA Destructor
void
DESTROY(oga)
OpenGL::Array oga
CODE:
{
#if 0 /* Cleanup for GPU-based affine calcs */
#ifdef GL_ARB_fragment_program
if (oga->affine_handle)
{
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, 0);
glDeleteProgramsARB(1,&oga->affine_handle);
}
#endif
#ifdef GL_EXT_framebuffer_object
release_fbo(oga);
#endif
#endif
#if 0
#ifdef GL_ARB_vertex_buffer_object
if (oga->bind)
{
glBindBufferARB(GL_ARRAY_BUFFER_ARB,0);
glDeleteBuffersARB(1,&oga->bind);
}
#endif
#endif
if (oga->free_data)
{
/* To make sure dangling pointers will be obvious */
memset(oga->data, '\0', oga->data_length);
free(oga->data);
}
free(oga->types);
free(oga->type_offset);
free(oga);
}
#endif /* End IN_POGL_ARRAY_XS */
##################### GLU #########################
############################## GLUT #########################
# /* This is assigned to GLX for now. The glp*() functions should be split out */
( run in 0.682 second using v1.01-cache-2.11-cpan-2398b32b56e )