state_feedback.c revision e0e0c19eefceaf5d4ec40f9466b58a771f50e799
/* Copyright (c) 2001, Stanford University
* All rights reserved
*
* See the file LICENSE.txt for information on redistributing this software.
*/
#include "state.h"
#include "state_internals.h"
#include "state/cr_statetypes.h"
#include "state/cr_feedback.h"
/*
* This file is really a complement to the feedbackSPU and as such
* has big dependencies upon it. We have to monitor a whole bunch
* of state in the feedbackSPU to be able to properly implement
* full functionality.
*
* We have to intercept glColor3f(v)/4f(v) to get state updates on
* color properties and also glTexCoord* too, as unlike the tilesortSPU
* we don't have a pincher that pulls these out as they're passing
* through.
*
* - Alan.
*/
/*
* Selection and feedback
*
* TODO:
* 1. Implement lighting for vertex colors for feedback
* 2. Implement user clip planes for points and lines
*/
/**********************************************************************/
/***** Vertex Transformation and Clipping *****/
/**********************************************************************/
/*
* Transform a point (column vector) by a matrix: Q = M * P
*/
#define TRANSFORM_POINT( Q, M, P ) \
#define TRANSFORM_POINTA( Q, M, P ) \
/*
* clip coord to window coord mapping
*/
Q.w = (GLfloat) P.w;
/*
* Linear interpolation:
*/
#define INTERPOLATE(T, A, B) ((A) + ((B) - (A)) * (T))
/*
* Interpolate vertex position, color, texcoords, etc.
*/
static void
{
vOut->attrib[VERT_ATTRIB_COLOR0][0] = INTERPOLATE(t, v0->attrib[VERT_ATTRIB_COLOR0][0], v1->attrib[VERT_ATTRIB_COLOR0][0]);
vOut->attrib[VERT_ATTRIB_COLOR0][1] = INTERPOLATE(t, v0->attrib[VERT_ATTRIB_COLOR0][1], v1->attrib[VERT_ATTRIB_COLOR0][1]);
vOut->attrib[VERT_ATTRIB_COLOR0][2] = INTERPOLATE(t, v0->attrib[VERT_ATTRIB_COLOR0][2], v1->attrib[VERT_ATTRIB_COLOR0][2]);
vOut->attrib[VERT_ATTRIB_COLOR0][3] = INTERPOLATE(t, v0->attrib[VERT_ATTRIB_COLOR0][3], v1->attrib[VERT_ATTRIB_COLOR0][3]);
vOut->attrib[VERT_ATTRIB_TEX0][0] = INTERPOLATE(t, v0->attrib[VERT_ATTRIB_TEX0][0], v1->attrib[VERT_ATTRIB_TEX0][0]);
vOut->attrib[VERT_ATTRIB_TEX0][1] = INTERPOLATE(t, v0->attrib[VERT_ATTRIB_TEX0][1], v1->attrib[VERT_ATTRIB_TEX0][0]);
vOut->attrib[VERT_ATTRIB_TEX0][2] = INTERPOLATE(t, v0->attrib[VERT_ATTRIB_TEX0][2], v1->attrib[VERT_ATTRIB_TEX0][0]);
vOut->attrib[VERT_ATTRIB_TEX0][3] = INTERPOLATE(t, v0->attrib[VERT_ATTRIB_TEX0][3], v1->attrib[VERT_ATTRIB_TEX0][0]);
}
/* clip bit codes */
#define CLIP_LEFT 1
#define CLIP_RIGHT 2
#define CLIP_BOTTOM 4
#define CLIP_TOP 8
#define CLIP_NEAR 16
#define CLIP_FAR 32
#define CLIP_USER0 64
#define CLIP_USER1 128
/*
* Apply clip testing to a point.
* Return: 0 - visible
* non-zero - clip code mask (or of above CLIP_ bits)
*/
static GLuint
clip_point(const CRVertex *v)
{
CRContext *g = GetCurrentContext();
GLuint i;
/* user-defined clip planes */
for (i = 0; i < g->limits.maxClipPlanes; i++)
{
{
mask |= (CLIP_USER0 << i);
}
}
/* view volume clipping */
mask |= CLIP_RIGHT;
mask |= CLIP_BOTTOM;
return mask;
}
/*
* Apply clipping to a line segment.
* Input: v0, v1 - incoming vertices
* Return: GL_TRUE: visible
* GL_FALSE: totally clipped
*/
static GLboolean
{
/* XXX need to do user-clip planes */
return GL_FALSE; /* totally clipped */
return GL_TRUE; /* no clipping needed */
/*
* We use 6 instances of this code to clip agains the 6 planes.
* For each plane, we define the OUTSIDE and COMPUTE_INTERSECTION
* macros apprpriately.
*/
#define GENERAL_CLIP \
/* both verts are outside ==> return 0 */ \
return 0; \
} \
else { \
/* v0 is outside, v1 is inside ==> clip */ \
} \
} \
else { \
/* v0 is inside, v1 is outside ==> clip */ \
} \
/* else both verts are inside ==> do nothing */ \
}
/*** Clip against +X side ***/
/*** Clip against -X side ***/
/*** Clip against +Y side ***/
/*** Clip against -Y side ***/
/*** Clip against +Z side ***/
/*** Clip against -Z side ***/
return GL_TRUE;
}
/*
* Apply clipping to a polygon.
* Input: vIn - array of input vertices
* inCount - number of input vertices
* Output: vOut - new vertices
* Return: number of vertices in vOut
*/
static GLuint
{
/* XXX need to do user-clip planes */
if (INCOUNT < 3) \
return GL_FALSE; \
OUTCOUNT = 0; \
/* both verts are inside ==> copy current to outlist */ \
OUTCOUNT++; \
} \
else { \
/* current is inside and previous is outside ==> clip */ \
OUTCOUNT++; \
/* Output current */ \
OUTCOUNT++; \
} \
} \
else { \
/* current is outside and previous is inside ==> clip */ \
OUTCOUNT++; \
} \
/* else both verts are outside ==> do nothing */ \
} \
/* let previous = current */ \
}
/*
* Clip against +X
*/
/*
* Clip against -X
*/
/*
* Clip against +Y
*/
/*
* Clip against -Y
*/
/*
* Clip against +Z
*/
/*
* Clip against -Z
*/
return result;
}
/**********************************************************************/
/***** Feedback *****/
/**********************************************************************/
#define FB_3D 0x01
#define FB_4D 0x02
#define FB_INDEX 0x04
#define FB_COLOR 0x08
#define FB_TEXTURE 0X10
#define FEEDBACK_TOKEN( T ) \
do { \
if (f->count < f->bufferSize) { \
} \
f->count++; \
} while (0)
/*
* Put a vertex into the feedback buffer.
*/
static void
feedback_vertex(const CRVertex *v)
{
CRContext *g = GetCurrentContext();
CRFeedbackState *f = &(g->feedback);
CRTransformState *t = &(g->transform);
FEEDBACK_TOKEN(v->winPos.x);
FEEDBACK_TOKEN(v->winPos.y);
{
FEEDBACK_TOKEN(v->winPos.z);
}
{
FEEDBACK_TOKEN(v->winPos.w);
}
/* We don't deal with color index in Chromium */
{
FEEDBACK_TOKEN(v->colorIndex);
}
{
}
if (f->mask & FB_TEXTURE)
{
/* Ugh, copy (s,t,r,q) to (x,y,z,w) */
}
}
static void
feedback_rasterpos(void)
{
CRContext *g = GetCurrentContext();
CRVertex v;
COPY_4V(v.attrib[VERT_ATTRIB_COLOR0] , g->current.rasterAttrib[VERT_ATTRIB_COLOR0]); /* XXX need to apply lighting */
/* Don't do this, we're capturing TexCoord ourselves and
* we'd miss the conversion in RasterPosUpdate */
/* v.texCoord[0] = g->current.rasterTexture; */
/* So we do this instead, and pluck it from the current vertex */
feedback_vertex(&v);
}
static void
feedback_point(const CRVertex *v)
{
CRContext *g = GetCurrentContext();
CRFeedbackState *f = &(g->feedback);
if (clip_point(v) == 0)
{
CRVertex c = *v;
feedback_vertex(&c);
}
}
static void
{
CRContext *g = GetCurrentContext();
CRFeedbackState *f = &(g->feedback);
{
if (reset)
else
}
}
static void
{
CRContext *g = GetCurrentContext();
CRFeedbackState *f = &(g->feedback);
GLuint i, n;
FEEDBACK_TOKEN( (GLfloat) n );
for (i = 0; i < n; i++) {
feedback_vertex(vclipped + i);
}
}
void STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
CRTransformState *t = &(g->transform);
CRPolygonState *p = &(g->polygon);
/* store the vertex */
v->attrib[VERT_ATTRIB_POS][0] = x;
COPY_4V(v->attrib[VERT_ATTRIB_COLOR0] , g->current.vertexAttrib[VERT_ATTRIB_COLOR0]); /* XXX need to apply lighting */
/* Don't do this, we're capturing TexCoord ourselves as
* we don't have a pincher like the tilesortSPU */
/* v->texCoord[0] = g->current.texCoord[0]; */
/* transform to eye space, then clip space */
case GL_POINTS:
feedback_point(v);
break;
case GL_LINES:
if (g->vCount == 0)
{
g->vCount = 1;
}
else
{
g->vCount = 0;
}
break;
case GL_LINE_STRIP:
if (g->vCount == 0)
{
g->vCount = 1;
}
else
{
/* leave g->vCount at 1 */
}
break;
case GL_LINE_LOOP:
if (g->vCount == 0)
{
g->vCount = 1;
}
else if (g->vCount == 1)
{
g->vCount = 2;
}
else
{
/* leave g->vCount at 2 */
}
break;
case GL_TRIANGLES:
{
g->vCount++;
}
else
{
g->vCount = 0;
}
break;
case GL_TRIANGLE_STRIP:
{
g->vCount++;
}
else if (g->vCount == 2)
{
g->vCount = 3;
}
else
{
g->vCount = 2;
}
break;
case GL_TRIANGLE_FAN:
{
g->vCount++;
}
else
{
/* leave g->vCount = 2 */
}
break;
case GL_QUADS:
if (g->vCount < 3)
{
g->vCount++;
}
else
{
g->vCount = 0;
}
break;
case GL_QUAD_STRIP:
if (g->vCount < 3)
{
g->vCount++;
}
else
{
g->vCount = 2;
}
break;
case GL_POLYGON:
switch (p->frontMode) {
case GL_POINT:
feedback_point(v);
break;
case GL_LINE:
if (g->vCount == 0)
{
g->vCount = 1;
}
else if (g->vCount == 1)
{
g->vCount = 2;
}
else
{
/* leave g->vCount at 2 */
}
break;
case GL_FILL:
/* draw as a tri-fan */
{
g->vCount++;
}
else
{
/* leave g->vCount = 2 */
}
break;
default:
; /* impossible */
}
break;
default:
; /* impossible */
}
}
void STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
g->vCount = 0;
}
void STATE_APIENTRY
crStateFeedbackEnd(void)
{
CRContext *g = GetCurrentContext();
&& g->vCount == 2 )
{
/* draw the last line segment */
if (g->lineLoop)
else
}
crStateEnd();
}
void STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
CRFeedbackState *f = &(g->feedback);
if (g->current.inBeginEnd)
{
return;
}
if (g->renderMode == GL_FEEDBACK)
{
"Invalid Operation GL_FEEDBACK");
return;
}
if (size < 0)
{
"Invalid Value size < 0");
return;
}
if (!buffer)
{
"Invalid Value buffer = NULL");
f->bufferSize = 0;
return;
}
FLUSH();
switch (type)
{
case GL_2D:
f->mask = 0;
break;
case GL_3D:
break;
case GL_3D_COLOR:
break;
case GL_3D_COLOR_TEXTURE:
break;
case GL_4D_COLOR_TEXTURE:
break;
default:
return;
}
f->bufferSize = size;
f->count = 0;
}
void STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
CRFeedbackState *f = &(g->feedback);
if (g->current.inBeginEnd)
{
return;
}
FLUSH();
if (g->renderMode == GL_FEEDBACK)
{
}
}
/*
* Although these functions are used by the feedbackSPU alone,
* I've left them here as they interface to the other functions.....
*/
void STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
switch (pname)
{
case GL_FEEDBACK_BUFFER_SIZE:
break;
case GL_FEEDBACK_BUFFER_TYPE:
break;
case GL_SELECTION_BUFFER_SIZE:
break;
default:
break;
}
}
void STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
switch (pname)
{
case GL_FEEDBACK_BUFFER_SIZE:
break;
case GL_FEEDBACK_BUFFER_TYPE:
break;
case GL_SELECTION_BUFFER_SIZE:
break;
default:
break;
}
}
void STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
switch (pname)
{
case GL_FEEDBACK_BUFFER_SIZE:
break;
case GL_FEEDBACK_BUFFER_TYPE:
break;
case GL_SELECTION_BUFFER_SIZE:
break;
default:
break;
}
}
void STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
switch (pname)
{
case GL_FEEDBACK_BUFFER_SIZE:
break;
case GL_FEEDBACK_BUFFER_TYPE:
break;
case GL_SELECTION_BUFFER_SIZE:
break;
default:
break;
}
}
void STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
CRFeedbackState *f = &(g->feedback);
(void) width;
(void) height;
(void) format;
(void) type;
(void) pixels;
}
void STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
CRFeedbackState *f = &(g->feedback);
(void) x;
(void) y;
(void) width;
(void) height;
(void) type;
}
void STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
CRFeedbackState *f = &(g->feedback);
(void) width;
(void) height;
(void) bitmap;
(void) xorig;
(void) yorig;
if (g->current.rasterValid)
{
}
}
void STATE_APIENTRY
crStateFeedbackVertex4fv(const GLfloat * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackVertex4sv(const GLshort * v)
{
(GLfloat) v[3]);
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackVertex4iv(const GLint * v)
{
(GLfloat) v[3]);
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackVertex4dv(const GLdouble * v)
{
(GLfloat) v[3]);
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackVertex2iv(const GLint * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackVertex2sv(const GLshort * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackVertex2fv(const GLfloat * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackVertex2dv(const GLdouble * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackVertex3iv(const GLint * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackVertex3sv(const GLshort * v)
{
1.0f);
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackVertex3fv(const GLfloat * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackVertex3dv(const GLdouble * v)
{
1.0f);
}
void STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
/* store the texCoord in the current vertex */
}
void STATE_APIENTRY
crStateFeedbackTexCoord4fv( const GLfloat *v )
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackTexCoord4sv( const GLshort *v )
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackTexCoord4iv( const GLint *v )
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackTexCoord4dv( const GLdouble *v )
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackTexCoord1iv( const GLint *v )
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackTexCoord1sv( const GLshort *v )
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackTexCoord1fv( const GLfloat *v )
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackTexCoord1dv( const GLdouble *v )
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackTexCoord2iv( const GLint *v )
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackTexCoord2sv( const GLshort *v )
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackTexCoord2fv( const GLfloat *v )
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackTexCoord2dv( const GLdouble *v )
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackTexCoord3iv( const GLint *v )
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackTexCoord3sv( const GLshort *v )
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackTexCoord3fv( const GLfloat *v )
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateFeedbackTexCoord3dv( const GLdouble *v )
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
{
}
/**********************************************************************/
/***** Selection *****/
/**********************************************************************/
void STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
if (g->current.inBeginEnd)
{
return;
}
if (g->renderMode == GL_SELECT)
{
"SelectBuffer called with RenderMode = GL_SELECT");
return;
}
FLUSH();
se->bufferCount = 0;
}
#define WRITE_RECORD( V ) \
} \
se->bufferCount++;
static void
{
GLuint i;
/* hitMinZ and hitMaxZ are in [0,1]. Multiply these values by */
/* 2^32-1 and round to nearest unsigned integer. */
for (i = 0; i < se->nameStackDepth; i++)
{
}
}
void STATE_APIENTRY
crStateInitNames(void)
{
CRContext *g = GetCurrentContext();
if (g->current.inBeginEnd)
{
return;
}
FLUSH();
/* Record the hit before the hitFlag is wiped out again. */
if (g->renderMode == GL_SELECT)
{
{
}
}
se->nameStackDepth = 0;
}
void STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
if (g->current.inBeginEnd)
{
return;
}
if (g->renderMode != GL_SELECT)
{
return;
}
if (se->nameStackDepth == 0)
{
"nameStackDepth = 0");
return;
}
FLUSH();
{
}
{
}
else
{
}
}
void STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
if (g->current.inBeginEnd)
{
return;
}
if (g->renderMode != GL_SELECT)
{
return;
}
FLUSH();
{
}
{
"nameStackDepth overflow");
}
else
}
void STATE_APIENTRY
crStatePopName(void)
{
CRContext *g = GetCurrentContext();
if (g->current.inBeginEnd)
{
return;
}
if (g->renderMode != GL_SELECT)
{
return;
}
FLUSH();
{
}
if (se->nameStackDepth == 0)
{
"nameStackDepth underflow");
}
else
se->nameStackDepth--;
}
static void
{
CRContext *g = GetCurrentContext();
}
static void
select_rasterpos(void)
{
CRContext *g = GetCurrentContext();
if (g->current.rasterValid)
}
static void
select_point(const CRVertex *v)
{
CRContext *g = GetCurrentContext();
if (clip_point(v) == 0)
{
CRVertex c = *v;
update_hitflag(c.winPos.z);
}
}
static void
{
CRContext *g = GetCurrentContext();
{
}
}
static void
{
CRContext *g = GetCurrentContext();
GLuint i, n;
for (i = 0; i < n; i++) {
}
}
void STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
CRTransformState *t = &(g->transform);
/* store the vertex */
v->attrib[VERT_ATTRIB_POS][0] = x;
COPY_4V(v->attrib[VERT_ATTRIB_COLOR0] , g->current.vertexAttrib[VERT_ATTRIB_COLOR0]); /* XXX need to apply lighting */
/* Don't do this, we're capturing TexCoord ourselves as
* we don't have a pincher like the tilesortSPU */
/* v->texCoord[0] = g->current.texCoord[0]; */
/* transform to eye space, then clip space */
case GL_POINTS:
select_point(v);
break;
case GL_LINES:
if (g->vCount == 0)
{
g->vCount = 1;
}
else
{
g->vCount = 0;
}
break;
case GL_LINE_STRIP:
if (g->vCount == 0)
{
g->vCount = 1;
}
else
{
/* leave g->vCount at 1 */
}
break;
case GL_LINE_LOOP:
if (g->vCount == 0)
{
g->vCount = 1;
}
else if (g->vCount == 1)
{
g->vCount = 2;
}
else
{
/* leave g->vCount at 2 */
}
break;
case GL_TRIANGLES:
{
g->vCount++;
}
else
{
g->vCount = 0;
}
break;
case GL_TRIANGLE_STRIP:
{
g->vCount++;
}
else if (g->vCount == 2)
{
g->vCount = 3;
}
else
{
g->vCount = 2;
}
break;
case GL_TRIANGLE_FAN:
{
g->vCount++;
}
else
{
/* leave g->vCount = 2 */
}
break;
case GL_QUADS:
if (g->vCount < 3)
{
g->vCount++;
}
else
{
g->vCount = 0;
}
break;
case GL_QUAD_STRIP:
if (g->vCount < 3)
{
g->vCount++;
}
else
{
g->vCount = 2;
}
break;
case GL_POLYGON:
/* draw as a tri-fan */
{
g->vCount++;
}
else
{
/* leave g->vCount = 2 */
}
break;
default:
; /* impossible */
}
}
void STATE_APIENTRY
{
crStateRasterPos4f( x, y, z, w );
}
void STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
g->vCount = 0;
}
void STATE_APIENTRY
crStateSelectEnd(void)
{
CRContext *g = GetCurrentContext();
{
/* draw the last line segment */
}
crStateEnd();
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateSelectVertex2dv(const GLdouble * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateSelectVertex2fv(const GLfloat * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateSelectVertex2iv(const GLint * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateSelectVertex2sv(const GLshort * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateSelectVertex3dv(const GLdouble * v)
{
}
void STATE_APIENTRY
{
crStateSelectVertex4f(x, y, z, 1.0);
}
void STATE_APIENTRY
crStateSelectVertex3fv(const GLfloat * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateSelectVertex3iv(const GLint * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateSelectVertex3sv(const GLshort * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateSelectVertex4dv(const GLdouble * v)
{
}
void STATE_APIENTRY
crStateSelectVertex4fv(const GLfloat * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateSelectVertex4iv(const GLint * v)
{
}
void STATE_APIENTRY
{
crStateSelectVertex4f(x, y, z, w);
}
void STATE_APIENTRY
crStateSelectVertex4sv(const GLshort * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateSelectRasterPos2dv(const GLdouble * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateSelectRasterPos2fv(const GLfloat * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateSelectRasterPos2iv(const GLint * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateSelectRasterPos2sv(const GLshort * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateSelectRasterPos3dv(const GLdouble * v)
{
}
void STATE_APIENTRY
{
crStateSelectRasterPos4f(x, y, z, 1.0);
}
void STATE_APIENTRY
crStateSelectRasterPos3fv(const GLfloat * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateSelectRasterPos3iv(const GLint * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateSelectRasterPos3sv(const GLshort * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateSelectRasterPos4dv(const GLdouble * v)
{
}
void STATE_APIENTRY
crStateSelectRasterPos4fv(const GLfloat * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateSelectRasterPos4iv(const GLint * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
crStateSelectRasterPos4sv(const GLshort * v)
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
{
}
void STATE_APIENTRY
{
}
{
CRContext *g = GetCurrentContext();
CRFeedbackState *f = &(g->feedback);
if (g->current.inBeginEnd)
{
return 0;
}
FLUSH();
switch (g->renderMode)
{
case GL_RENDER:
result = 0;
break;
case GL_SELECT:
{
}
{
/* overflow */
result = -1;
}
else
{
}
se->bufferCount = 0;
se->nameStackDepth = 0;
break;
case GL_FEEDBACK:
if (f->count > f->bufferSize)
{
/* overflow */
result = -1;
}
else
{
}
f->count = 0;
break;
default:
return 0;
}
switch (mode)
{
case GL_RENDER:
break;
case GL_SELECT:
if (se->bufferSize == 0)
{
/* haven't called glSelectBuffer yet */
"buffersize = 0");
}
break;
case GL_FEEDBACK:
if (f->bufferSize == 0)
{
/* haven't called glFeedbackBuffer yet */
"buffersize = 0");
}
break;
default:
return 0;
}
g->renderMode = mode;
return result;
}
void STATE_APIENTRY
{
(void) width;
(void) height;
(void) format;
(void) type;
(void) pixels;
}
void STATE_APIENTRY
{
(void) x;
(void) y;
(void) width;
(void) height;
(void) type;
}
void STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
(void) width;
(void) height;
(void) xorig;
(void) yorig;
(void) bitmap;
if (g->current.rasterValid)
{
}
}