diff options
Diffstat (limited to 'src/VBox/GuestHost/OpenGL/state_tracker/state_rasterpos.c')
-rw-r--r-- | src/VBox/GuestHost/OpenGL/state_tracker/state_rasterpos.c | 327 |
1 files changed, 327 insertions, 0 deletions
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/state_rasterpos.c b/src/VBox/GuestHost/OpenGL/state_tracker/state_rasterpos.c new file mode 100644 index 00000000..29b23970 --- /dev/null +++ b/src/VBox/GuestHost/OpenGL/state_tracker/state_rasterpos.c @@ -0,0 +1,327 @@ +/* Copyright (c) 2001, Stanford University + * All rights reserved + * + * See the file LICENSE.txt for information on redistributing this software. + */ + +#include <stdio.h> +#include "state.h" +#include "state/cr_statetypes.h" +#include "state_internals.h" + + +/* + * Apply modelview, projection, viewport transformations to (x,y,z,w) + * and update the current raster position attributes. + * Do NOT set dirty state. + */ +void +crStateRasterPosUpdate(GLfloat x, GLfloat y, GLfloat z, GLfloat w) +{ + CRContext *g = GetCurrentContext(); + CRCurrentState *c = &(g->current); + CRTransformState *t = &(g->transform); + CRViewportState *v = &(g->viewport); + GLvectorf p; + int i; + + if (g->current.inBeginEnd) + { + crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, "RasterPos called in Begin/End"); + return; + } + + FLUSH(); + + /* update current color, texcoord, etc from the CurrentStatePointers */ + crStateCurrentRecover(); + + p.x = x; + p.y = y; + p.z = z; + p.w = w; + + /* Apply modelview and projection matrix */ + crStateTransformXformPoint(t, &p); + + /* clip test */ + if (p.x > p.w || p.y > p.w || p.z > p.w || + p.x < -p.w || p.y < -p.w || p.z < -p.w) + { + c->rasterValid = GL_FALSE; + return; + } + + /* divide by W (perspective projection) */ + p.x /= p.w; + p.y /= p.w; + p.z /= p.w; + p.w = 1.0f; + + /* map from NDC to window coords */ + crStateViewportApply(v, &p); + + c->rasterValid = GL_TRUE; + ASSIGN_4V(c->rasterAttrib[VERT_ATTRIB_POS], p.x, p.y, p.z, p.w); + ASSIGN_4V(c->rasterAttribPre[VERT_ATTRIB_POS], p.x, p.y, p.z, p.w); + for (i = 1; i < CR_MAX_VERTEX_ATTRIBS; i++) { + COPY_4V(c->rasterAttrib[i] , c->vertexAttrib[i]); + } + + /* XXX need to update raster distance... */ + /* from Mesa... */ +#ifdef CR_EXT_fog_coord + if (g->fog.fogCoordinateSource == GL_FOG_COORDINATE_EXT) + c->rasterAttrib[VERT_ATTRIB_FOG][0] = c->vertexAttrib[VERT_ATTRIB_FOG][0]; + else +#endif + c->rasterAttrib[VERT_ATTRIB_FOG][0] = 0.0; /*(GLfloat) + sqrt( eye[0]*eye[0] + eye[1]*eye[1] + eye[2]*eye[2] );*/ +} + + +/* As above, but set dirty flags */ +static void RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) +{ + CRContext *g = GetCurrentContext(); + CRStateBits *sb = GetCurrentBits(); + CRCurrentBits *cb = &(sb->current); + + crStateRasterPosUpdate(x, y, z, w); + + DIRTY(cb->dirty, g->neg_bitid); + DIRTY(cb->rasterPos, g->neg_bitid); +} + +void STATE_APIENTRY crStateRasterPos2d(GLdouble x, GLdouble y) +{ + RasterPos4f((GLfloat) x, (GLfloat) y, 0.0f, 1.0f); +} + +void STATE_APIENTRY crStateRasterPos2f(GLfloat x, GLfloat y) +{ + RasterPos4f(x, y, 0.0f, 1.0f); +} + +void STATE_APIENTRY crStateRasterPos2i(GLint x, GLint y) +{ + RasterPos4f((GLfloat) x, (GLfloat) y, 0.0f, 1.0f); +} + +void STATE_APIENTRY crStateRasterPos2s(GLshort x, GLshort y) +{ + RasterPos4f((GLfloat) x, (GLfloat) y, 0.0f, 1.0f); +} + +void STATE_APIENTRY crStateRasterPos3d(GLdouble x, GLdouble y, GLdouble z) +{ + RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0f); +} + +void STATE_APIENTRY crStateRasterPos3f(GLfloat x, GLfloat y, GLfloat z) +{ + RasterPos4f(x, y, z, 1.0f); +} + +void STATE_APIENTRY crStateRasterPos3i(GLint x, GLint y, GLint z) +{ + RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0f); +} + +void STATE_APIENTRY crStateRasterPos3s(GLshort x, GLshort y, GLshort z) +{ + RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0f); +} + +void STATE_APIENTRY crStateRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) +{ + RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); +} + +void STATE_APIENTRY crStateRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) +{ + RasterPos4f(x, y, z, w); +} + +void STATE_APIENTRY crStateRasterPos4i(GLint x, GLint y, GLint z, GLint w) +{ + RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); +} + +void STATE_APIENTRY crStateRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w) +{ + RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); +} + +void STATE_APIENTRY crStateRasterPos2dv(const GLdouble *v) +{ + RasterPos4f((GLfloat) v[0], (GLfloat) v[1], 0.0f, 1.0f); +} + +void STATE_APIENTRY crStateRasterPos2fv(const GLfloat *v) +{ + RasterPos4f(v[0], v[1], 0.0f, 1.0f); +} + +void STATE_APIENTRY crStateRasterPos2iv(const GLint *v) +{ + RasterPos4f((GLfloat) v[0], (GLfloat) v[1], 0.0f, 1.0f); +} + +void STATE_APIENTRY crStateRasterPos2sv(const GLshort *v) +{ + RasterPos4f((GLfloat) v[0], (GLfloat) v[1], 0.0f, 1.0f); +} + +void STATE_APIENTRY crStateRasterPos3dv(const GLdouble *v) +{ + RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0f); +} + +void STATE_APIENTRY crStateRasterPos3fv(const GLfloat *v) +{ + RasterPos4f(v[0], v[1], v[2], 1.0f); +} + +void STATE_APIENTRY crStateRasterPos3iv(const GLint *v) +{ + RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0f); +} + +void STATE_APIENTRY crStateRasterPos3sv(const GLshort *v) +{ + RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0f); +} + +void STATE_APIENTRY crStateRasterPos4dv(const GLdouble *v) +{ + RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]); +} + +void STATE_APIENTRY crStateRasterPos4fv(const GLfloat *v) +{ + RasterPos4f(v[0], v[1], v[2], v[3]); +} + +void STATE_APIENTRY crStateRasterPos4iv(const GLint *v) +{ + RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]); +} + +void STATE_APIENTRY crStateRasterPos4sv(const GLshort *v) +{ + RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]); +} + + +/**********************************************************************/ + + +static void +crStateWindowPosUpdate(GLfloat x, GLfloat y, GLfloat z) +{ + CRContext *g = GetCurrentContext(); + CRCurrentState *c = &(g->current); + CRStateBits *sb = GetCurrentBits(); + CRCurrentBits *cb = &(sb->current); + int i; + + if (g->current.inBeginEnd) + { + crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, "WindowPos called in Begin/End"); + return; + } + + FLUSH(); + DIRTY(cb->dirty, g->neg_bitid); + DIRTY(cb->rasterPos, g->neg_bitid); + + c->rasterValid = GL_TRUE; + ASSIGN_4V(c->rasterAttrib[VERT_ATTRIB_POS], x, y , z, 1.0); + ASSIGN_4V(c->rasterAttribPre[VERT_ATTRIB_POS], x, y, z, 1.0); + for (i = 1; i < CR_MAX_VERTEX_ATTRIBS; i++) { + COPY_4V(c->rasterAttrib[i] , c->vertexAttrib[i]); + } +} + + +void STATE_APIENTRY crStateWindowPos2dARB (GLdouble x, GLdouble y) +{ + crStateWindowPosUpdate((GLfloat) x, (GLfloat) y, 0.0); +} + +void STATE_APIENTRY crStateWindowPos2dvARB (const GLdouble *v) +{ + crStateWindowPosUpdate((GLfloat) v[0], (GLfloat) v[1], 0.0); +} + +void STATE_APIENTRY crStateWindowPos2fARB (GLfloat x, GLfloat y) +{ + crStateWindowPosUpdate(x, y, 0.0); +} + +void STATE_APIENTRY crStateWindowPos2fvARB (const GLfloat *v) +{ + crStateWindowPosUpdate(v[0], v[1], 0.0); +} + +void STATE_APIENTRY crStateWindowPos2iARB (GLint x, GLint y) +{ + crStateWindowPosUpdate((GLfloat) x, (GLfloat) y, 0.0); +} + +void STATE_APIENTRY crStateWindowPos2ivARB (const GLint *v) +{ + crStateWindowPosUpdate((GLfloat) v[0], (GLfloat) v[1], 0.0); +} + +void STATE_APIENTRY crStateWindowPos2sARB (GLshort x, GLshort y) +{ + crStateWindowPosUpdate((GLfloat) x, (GLfloat) y, 0.0); +} + +void STATE_APIENTRY crStateWindowPos2svARB (const GLshort *v) +{ + crStateWindowPosUpdate((GLfloat) v[0], (GLfloat) v[1], 0.0); +} + +void STATE_APIENTRY crStateWindowPos3dARB (GLdouble x, GLdouble y, GLdouble z) +{ + crStateWindowPosUpdate((GLfloat) x, (GLfloat) y, (GLfloat) z); +} + +void STATE_APIENTRY crStateWindowPos3dvARB (const GLdouble *v) +{ + crStateWindowPosUpdate((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2]); +} + +void STATE_APIENTRY crStateWindowPos3fARB (GLfloat x, GLfloat y, GLfloat z) +{ + crStateWindowPosUpdate(x, y, z); +} + +void STATE_APIENTRY crStateWindowPos3fvARB (const GLfloat *v) +{ + crStateWindowPosUpdate(v[0], v[1], v[2]); +} + +void STATE_APIENTRY crStateWindowPos3iARB (GLint x, GLint y, GLint z) +{ + crStateWindowPosUpdate((GLfloat) x, (GLfloat) y, (GLfloat) z); +} + +void STATE_APIENTRY crStateWindowPos3ivARB (const GLint *v) +{ + crStateWindowPosUpdate((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2]); +} + +void STATE_APIENTRY crStateWindowPos3sARB (GLshort x, GLshort y, GLshort z) +{ + crStateWindowPosUpdate((GLfloat) x, (GLfloat) y, (GLfloat) z); +} + +void STATE_APIENTRY crStateWindowPos3svARB (const GLshort *v) +{ + crStateWindowPosUpdate((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2]); +} + |