summaryrefslogtreecommitdiffstats
path: root/src/VBox/GuestHost/OpenGL/state_tracker/state_rasterpos.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/GuestHost/OpenGL/state_tracker/state_rasterpos.c')
-rw-r--r--src/VBox/GuestHost/OpenGL/state_tracker/state_rasterpos.c327
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]);
+}
+