pack_client.c revision 4aef33e90cfa798b2e6db5b45f02c2a6c8bbc4ae
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync/* Copyright (c) 2001, Stanford University
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync * All rights reserved
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync * See the file LICENSE.txt for information on redistributing this software.
1a9a76385f412e8c5762baadaa30afe308b1cd12vboxsync/*Convert from GLint to GLfloat in [-1.f,1.f]*/
1a9a76385f412e8c5762baadaa30afe308b1cd12vboxsync#define CRP_I2F_NORM(i) ((2.f*((GLint)(i))+1.f) * (1.f/4294967294.f))
1a9a76385f412e8c5762baadaa30afe308b1cd12vboxsync/*Convert from GLshort to GLfloat in [-1.f,1.f]*/
1a9a76385f412e8c5762baadaa30afe308b1cd12vboxsync#define CRP_S2F_NORM(s) ((2.f*((GLshort)(s))+1.f) * (1.f/65535.f))
1a9a76385f412e8c5762baadaa30afe308b1cd12vboxsyncstatic void crPackVertexAttrib(const CRVertexArrays *array, unsigned int attr, GLint index)
1a9a76385f412e8c5762baadaa30afe308b1cd12vboxsync unsigned char *p = array->a[attr].p + index * array->a[attr].stride;
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync if (array->a[attr].buffer && array->a[attr].buffer->data)
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync p = (unsigned char *)(array->a[attr].buffer->data) + (unsigned long)p;
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync crPackVertexAttrib1fARB(attr, CRP_S2F_NORM(sPtr[0]));
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync crPackVertexAttrib2fARB(attr, CRP_S2F_NORM(sPtr[0]), CRP_S2F_NORM(sPtr[1]));
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync crPackVertexAttrib3fARB(attr, CRP_S2F_NORM(sPtr[0]), CRP_S2F_NORM(sPtr[1]), CRP_S2F_NORM(sPtr[2]));
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync crPackVertexAttrib1fARB(attr, CRP_I2F_NORM(iPtr[0]));
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync crPackVertexAttrib2fARB(attr, CRP_I2F_NORM(iPtr[0]), CRP_I2F_NORM(iPtr[1]));
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync crPackVertexAttrib3fARB(attr, CRP_I2F_NORM(iPtr[0]), CRP_I2F_NORM(iPtr[1]), CRP_I2F_NORM(iPtr[2]));
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync crPackVertexAttrib3fARB(attr, iPtr[0], iPtr[1], iPtr[2]);
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync crPackVertexAttrib4fARB(attr, iPtr[0], iPtr[1], iPtr[2], iPtr[3]);
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync case 1: crPackVertexAttrib1fvARB(attr, (GLfloat *)p); break;
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync case 2: crPackVertexAttrib2fvARB(attr, (GLfloat *)p); break;
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync case 3: crPackVertexAttrib3fvARB(attr, (GLfloat *)p); break;
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync case 4: crPackVertexAttrib4fvARB(attr, (GLfloat *)p); break;
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync case 1: crPackVertexAttrib1dvARB(attr, (GLdouble *)p); break;
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync case 2: crPackVertexAttrib2dvARB(attr, (GLdouble *)p); break;
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync case 3: crPackVertexAttrib3dvARB(attr, (GLdouble *)p); break;
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync case 4: crPackVertexAttrib4dvARB(attr, (GLdouble *)p); break;
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync crWarning("Bad datatype for vertex attribute [%d] array: 0x%x\n",
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync * Expand glArrayElement into crPackVertex/Color/Normal/etc.
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsynccrPackExpandArrayElement(GLint index, CRClientState *c)
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync unsigned char *p;
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync const GLboolean vpEnabled = crStateGetCurrent()->program.vpEnabled;
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync if (array->n.enabled && !(vpEnabled && array->a[VERT_ATTRIB_NORMAL].enabled))
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync p = (unsigned char *)(array->n.buffer->data) + (unsigned long)p;
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync case GL_SHORT: crPackNormal3sv((GLshort *)p); break;
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync case GL_FLOAT: crPackNormal3fv((GLfloat *)p); break;
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync case GL_DOUBLE: crPackNormal3dv((GLdouble *)p); break;
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync if (array->c.enabled && !(vpEnabled && array->a[VERT_ATTRIB_COLOR0].enabled))
38b0f04a36431d57eed1de01653dd0a015eae4c3vboxsync p = (unsigned char *)(array->c.buffer->data) + (unsigned long)p;
#ifdef CR_EXT_secondary_color
#ifdef CR_ARB_vertex_buffer_object
case GL_BYTE:
case GL_UNSIGNED_BYTE:
case GL_SHORT:
case GL_UNSIGNED_SHORT:
case GL_INT:
case GL_UNSIGNED_INT:
case GL_FLOAT:
case GL_DOUBLE:
#ifdef CR_EXT_fog_coord
#ifdef CR_ARB_vertex_buffer_object
#ifdef CR_ARB_vertex_buffer_object
case GL_SHORT:
case GL_INT:
case GL_FLOAT:
case GL_DOUBLE:
#ifdef CR_ARB_vertex_buffer_object
#ifdef CR_ARB_vertex_buffer_object
crPackEdgeFlagv(p);
#ifdef CR_ARB_vertex_buffer_object
case GL_SHORT:
case GL_INT:
case GL_FLOAT:
case GL_DOUBLE:
if (count < 0)
for (i=0; i<count; i++)
crPackEnd();
switch (type)
case GL_UNSIGNED_BYTE:
return sizeof(GLubyte);
case GL_UNSIGNED_SHORT:
return sizeof(GLushort);
case GL_UNSIGNED_INT:
return sizeof(GLuint);
void PACK_APIENTRY
#ifdef CR_ARB_vertex_buffer_object
indexsize = 0;
#ifdef CR_ARB_vertex_buffer_object
if (indexsize>0)
void PACK_APIENTRY
#ifdef CR_ARB_vertex_buffer_object
indexsize = 0;
#ifdef CR_ARB_vertex_buffer_object
if (indexsize>0)
* Expand glDrawElements into crPackBegin/Vertex/End, etc commands.
#ifdef CR_ARB_vertex_buffer_object
if (count < 0)
#ifdef CR_ARB_vertex_buffer_object
switch (type)
case GL_UNSIGNED_BYTE:
for (i=0; i<count; i++)
case GL_UNSIGNED_SHORT:
for (i=0; i<count; i++)
p+=sizeof (GLushort);
case GL_UNSIGNED_INT:
for (i=0; i<count; i++)
p+=sizeof (GLuint);
crPackEnd();
switch (type) {
case GL_UNSIGNED_BYTE:
for (i = 0; i < count; i++)
crPackArrayElement(p[i]);
case GL_UNSIGNED_SHORT:
for (i = 0; i < count; i++)
crPackArrayElement(p[i]);
case GL_UNSIGNED_INT:
for (i = 0; i < count; i++)
crPackArrayElement(p[i]);
* glDrawRangeElements, expanded into crPackBegin/Vertex/End/etc.
crPackExpandDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, CRClientState *c)
#ifdef CR_EXT_multi_draw_arrays
void PACK_APIENTRY
GLint i;
for (i = 0; i < primcount; i++) {
if (count[i] > 0) {
* Pack with crPackBegin/Vertex/End/etc.
GLint i;
for (i = 0; i < primcount; i++) {
if (count[i] > 0) {
void PACK_APIENTRY
GLint i;
for (i = 0; i < primcount; i++) {
if (count[i] > 0) {
* Pack with crPackBegin/Vertex/End/etc.
GLint i;
for (i = 0; i < primcount; i++) {
if (count[i] > 0) {