ifeq ($(DEBUG),1)
CFLAGS := -g
+# CFLAGS := -O2 -pg
CPPFLAGS :=
else
CFLAGS := -O2
vary->uv[0].r,
vary->uv[0].r);
- glColor4fv(c);
+ glColor4f(c[0], c[1], c[2], c[3]);
mq = ball_draw(mq, ball_M, pend_M, bill_M, t);
}
glPopMatrix();
{
/* Fudge to eliminate the floor from reflection. */
- GLdouble e[4], k = -0.00001;
-
- e[0] = 0;
- e[1] = 1;
- e[2] = 0;
- e[3] = k;
-
- glClipPlane(GL_CLIP_PLANE0, e);
+ glClipPlane4f(GL_CLIP_PLANE0, 0, 1, 0, -0.00001);
}
static void game_clip_ball(const struct game_draw *gd, int d, const float *p)
pz[1] *= d;
nz[1] *= d;
- glClipPlane(GL_CLIP_PLANE1, nz);
- glClipPlane(GL_CLIP_PLANE2, pz);
+ glClipPlane4f(GL_CLIP_PLANE1, nz[0], nz[1], nz[2], nz[3]);
+ glClipPlane4f(GL_CLIP_PLANE2, pz[0], pz[1], pz[2], pz[3]);
}
static const struct d_mtrl *game_draw_fore(const struct d_mtrl *mq,
glPopMatrix();
video_pop_matrix();
- sol_draw_disable(mq);
-
/* Draw the fade overlay. */
sol_fade(&gd->draw, gd->fade_k);
+ sol_draw_disable(mq);
}
}
const struct d_mtrl *jump_draw(const struct d_mtrl *mq, float t, int h)
{
- static GLfloat jump_colors[4][4] = {
+ static GLfloat c[4][4] = {
{ 0.75f, 0.5f, 1.0f, 0.5f },
{ 0.75f, 0.5f, 1.0f, 0.8f },
};
glPushMatrix();
{
- glColor4fv(jump_colors[h]);
+ glColor4f(c[h][0], c[h][1], c[h][2], c[h][3]);
glScalef(1.0f, 2.0f, 1.0f);
const struct d_mtrl *swch_draw(const struct d_mtrl *mq, int b, int e)
{
- static GLfloat swch_colors[4][4] = {
+ static GLfloat c[4][4] = {
{ 1.0f, 0.0f, 0.0f, 0.5f }, /* red out */
{ 1.0f, 0.0f, 0.0f, 0.8f }, /* red in */
{ 0.0f, 1.0f, 0.0f, 0.5f }, /* green out */
{ 0.0f, 1.0f, 0.0f, 0.8f }, /* green in */
};
+ const int h = 2 * b + e;
+
glPushMatrix();
{
glScalef(1.0f, 2.0f, 1.0f);
- glColor4fv(swch_colors[b * 2 + e]);
+ glColor4f(c[h][0], c[h][1], c[h][2], c[h][3]);
mq = sol_draw(&beam.draw, mq, 1, 1);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
}
#ifndef CONF_OPENGLES
-PFNGLACTIVETEXTURE_PROC glActiveTexture_;
+PFNGLCLIENTACTIVETEXTURE_PROC glClientActiveTexture_;
+PFNGLACTIVETEXTURE_PROC glActiveTexture_;
-PFNGLGENBUFFERS_PROC glGenBuffers_;
-PFNGLBINDBUFFER_PROC glBindBuffer_;
-PFNGLBUFFERDATA_PROC glBufferData_;
-PFNGLBUFFERSUBDATA_PROC glBufferSubData_;
-PFNGLDELETEBUFFERS_PROC glDeleteBuffers_;
-PFNGLISBUFFER_PROC glIsBuffer_;
+PFNGLGENBUFFERS_PROC glGenBuffers_;
+PFNGLBINDBUFFER_PROC glBindBuffer_;
+PFNGLBUFFERDATA_PROC glBufferData_;
+PFNGLBUFFERSUBDATA_PROC glBufferSubData_;
+PFNGLDELETEBUFFERS_PROC glDeleteBuffers_;
+PFNGLISBUFFER_PROC glIsBuffer_;
-PFNGLPOINTPARAMETERFV_PROC glPointParameterfv_;
+PFNGLPOINTPARAMETERFV_PROC glPointParameterfv_;
#endif
/*---------------------------------------------------------------------------*/
#define SDL_GL_GFPA(fun, str) do { \
- ptr = SDL_GL_GetProcAddress(str); \
+ ptr = SDL_GL_GetProcAddress(str); \
memcpy(&fun, &ptr, sizeof (void *)); \
} while(0)
void *ptr;
if (glext_check("ARB_multitexture"))
- SDL_GL_GFPA(glActiveTexture_, "glActiveTextureARB");
+ {
+ SDL_GL_GFPA(glClientActiveTexture_, "glClientActiveTextureARB");
+ SDL_GL_GFPA(glActiveTexture_, "glActiveTextureARB");
+ }
if (glext_check("ARB_vertex_buffer_object"))
{
- SDL_GL_GFPA(glGenBuffers_, "glGenBuffersARB");
- SDL_GL_GFPA(glBindBuffer_, "glBindBufferARB");
- SDL_GL_GFPA(glBufferData_, "glBufferDataARB");
- SDL_GL_GFPA(glBufferSubData_, "glBufferSubDataARB");
- SDL_GL_GFPA(glDeleteBuffers_, "glDeleteBuffersARB");
- SDL_GL_GFPA(glIsBuffer_, "glIsBufferARB");
+ SDL_GL_GFPA(glGenBuffers_, "glGenBuffersARB");
+ SDL_GL_GFPA(glBindBuffer_, "glBindBufferARB");
+ SDL_GL_GFPA(glBufferData_, "glBufferDataARB");
+ SDL_GL_GFPA(glBufferSubData_, "glBufferSubDataARB");
+ SDL_GL_GFPA(glDeleteBuffers_, "glDeleteBuffersARB");
+ SDL_GL_GFPA(glIsBuffer_, "glIsBufferARB");
}
if (glext_check("ARB_point_parameters"))
- SDL_GL_GFPA(glPointParameterfv_, "glPointParameterfvARB");
+ SDL_GL_GFPA(glPointParameterfv_, "glPointParameterfvARB");
+
+#endif
+}
+
+/*---------------------------------------------------------------------------*/
+
+void glClipPlane4f(GLenum p, GLfloat a, GLfloat b, GLfloat c, GLfloat d)
+{
+#ifdef CONF_OPENGLES
+
+ GLfloat v[4];
+
+ v[0] = a;
+ v[1] = b;
+ v[2] = c;
+ v[3] = d;
+
+ glClipPlanef(p, v);
+
+#else
+
+ GLdouble v[4];
+
+ v[0] = a;
+ v[1] = b;
+ v[2] = c;
+ v[3] = d;
+
+ glClipPlane(p, v);
#endif
}
/*---------------------------------------------------------------------------*/
-/* Exercise extreme paranoia in defining a cross-platform OpenGL interface. */
-/* If we're compiling against OpenGL ES then we must assume native linkage */
-/* of the extensions we use. Otherwise, GetProc them regardless of whether */
-/* they need it or not. */
-
-#if defined(GL_VERSION_ES_CM_1_0) || \
- defined(GL_VERSION_ES_CM_1_1) || \
- defined(GL_OES_VERSION_1_0)
-
-#define CONF_OPENGLES 1
-
-#else /* ... define the extension API. */
-
-/*---------------------------------------------------------------------------*/
-/* ARB_multisample */
-
#ifndef GL_MULTISAMPLE
-#define GL_MULTISAMPLE 0x809D
+#define GL_MULTISAMPLE 0x809D
#endif
-/*---------------------------------------------------------------------------*/
-/* ARB_multitexture */
-
#ifndef GL_TEXTURE0
-#define GL_TEXTURE0 0x84C0
+#define GL_TEXTURE0 0x84C0
#endif
#ifndef GL_TEXTURE1
-#define GL_TEXTURE1 0x84C1
+#define GL_TEXTURE1 0x84C1
#endif
#ifndef GL_TEXTURE2
-#define GL_TEXTURE2 0x84C2
+#define GL_TEXTURE2 0x84C2
#endif
-typedef void (*PFNGLACTIVETEXTURE_PROC)(GLenum);
-
-extern PFNGLACTIVETEXTURE_PROC glActiveTexture_;
-
-/*---------------------------------------------------------------------------*/
-/* ARB_vertex_buffer_object */
-
#ifndef GL_ARRAY_BUFFER
-#define GL_ARRAY_BUFFER 0x8892
+#define GL_ARRAY_BUFFER 0x8892
#endif
#ifndef GL_ELEMENT_ARRAY_BUFFER
-#define GL_ELEMENT_ARRAY_BUFFER 0x8893
+#define GL_ELEMENT_ARRAY_BUFFER 0x8893
#endif
#ifndef GL_STATC_DRAW
-#define GL_STATIC_DRAW 0x88E4
+#define GL_STATIC_DRAW 0x88E4
#endif
#ifndef GL_DYNAMIC_DRAW
-#define GL_DYNAMIC_DRAW 0x88E8
+#define GL_DYNAMIC_DRAW 0x88E8
+#endif
+
+#ifndef GL_POINT_SPRITE
+#define GL_POINT_SPRITE 0x8861
#endif
+#ifndef GL_COORD_REPLACE
+#define GL_COORD_REPLACE 0x8862
+#endif
+
+#ifndef GL_POINT_DISTANCE_ATTENUATIAN
+#define GL_POINT_DISTANCE_ATTENUATION 0x8129
+#endif
+
+/*---------------------------------------------------------------------------*/
+
+int glext_check(const char *);
+void glext_init(void);
+
+/*---------------------------------------------------------------------------*/
+
+/* Exercise extreme paranoia in defining a cross-platform OpenGL interface. */
+/* If we're compiling against OpenGL ES then we must assume native linkage */
+/* of the extensions we use. Otherwise, GetProc them regardless of whether */
+/* they need it or not. */
+
+#if defined(GL_VERSION_ES_CM_1_0) || \
+ defined(GL_VERSION_ES_CM_1_1) || \
+ defined(GL_OES_VERSION_1_0)
+
+#define CONF_OPENGLES 1
+
+#define glClientActiveTexture_ glClientActiveTexture
+#define glActiveTexture_ glActiveTexture
+#define glGenBuffers_ glGenBuffers
+#define glBindBuffer_ glBindBuffer
+#define glBufferData_ glBufferData
+#define glBufferSubData_ glBufferSubData
+#define glDeleteBuffers_ glDeleteBuffers
+#define glIsBuffer_ glIsBuffer
+#define glPointParameterfv_ glPointParameterfv
+
+#define glOrtho_ glOrtho
+
+#else /* No native linkage? Define the extension API. */
+
+#define glOrtho_ glOrtho
+
+/*---------------------------------------------------------------------------*/
+/* ARB_multitexture */
+
+typedef void (*PFNGLACTIVETEXTURE_PROC)(GLenum);
+typedef void (*PFNGLCLIENTACTIVETEXTURE_PROC)(GLenum);
+
+extern PFNGLCLIENTACTIVETEXTURE_PROC glClientActiveTexture_;
+extern PFNGLACTIVETEXTURE_PROC glActiveTexture_;
+
+/*---------------------------------------------------------------------------*/
+/* ARB_vertex_buffer_object */
+
typedef void (*PFNGLGENBUFFERS_PROC)(GLsizei, GLuint *);
typedef void (*PFNGLBINDBUFFER_PROC)(GLenum, GLuint);
typedef void (*PFNGLBUFFERDATA_PROC)(GLenum, GLsizeiptr, const GLvoid *, GLenum);
extern PFNGLISBUFFER_PROC glIsBuffer_;
/*---------------------------------------------------------------------------*/
-/* ARB_point_sprite */
-
-#ifndef GL_POINT_SPRITE
-#define GL_POINT_SPRITE 0x8861
-#endif
-
-#ifndef GL_COORD_REPLACE
-#define GL_COORD_REPLACE 0x8862
-#endif
-
-/*---------------------------------------------------------------------------*/
/* ARB_point_parameters */
-#ifndef GL_POINT_DISTANCE_ATTENUATIAN
-#define GL_POINT_DISTANCE_ATTENUATION 0x8129
-#endif
-
typedef void (*PFNGLPOINTPARAMETERFV_PROC)(GLenum, const GLfloat *);
extern PFNGLPOINTPARAMETERFV_PROC glPointParameterfv_;
/*---------------------------------------------------------------------------*/
#endif /* !CONF_OPENGLES */
-int glext_check(const char *);
-void glext_init(void);
+void glClipPlane4f(GLenum, GLfloat, GLfloat, GLfloat, GLfloat);
/*---------------------------------------------------------------------------*/
#endif
widget[id].scale);
glBindTexture(GL_TEXTURE_2D, widget[id].image);
- glColor4ubv(gui_wht);
+ glColor4ub(gui_wht[0], gui_wht[1], gui_wht[2], gui_wht[3]);
draw_rect(id);
}
glPopMatrix();
{
switch (hp->t)
{
-
case ITEM_COIN:
if (hp->n >= 1)
c[0] = 1.0f;
c[1] = 1.0f;
c[2] = 0.2f;
+ c[3] = 1.0f;
}
if (hp->n >= 5)
{
c[0] = 1.0f;
c[1] = 0.2f;
c[2] = 0.2f;
+ c[3] = 1.0f;
}
if (hp->n >= 10)
{
c[0] = 0.2f;
c[1] = 0.2f;
c[2] = 1.0f;
+ c[3] = 1.0f;
}
break;
c[0] = 0.00f;
c[1] = 0.51f;
c[2] = 0.80f;
+ c[3] = 1.00f;
break;
c[0] = 1.00f;
c[1] = 0.76f;
c[2] = 0.00f;
+ c[3] = 1.00f;
break;
c[0] = 1.0f;
c[1] = 1.0f;
c[2] = 1.0f;
+ c[3] = 1.0f;
break;
}
const GLfloat *M, float t)
{
struct s_draw *draw = NULL;
- float c[3];
+ float c[4];
switch (hp->t)
{
item_color(hp, c);
- glColor3fv(c);
+ glColor4fv(c);
glDepthMask(GL_FALSE);
{
glBindBuffer_(GL_ARRAY_BUFFER, 0);
#endif
- glClientActiveTexture(GL_TEXTURE1);
+ glClientActiveTexture_(GL_TEXTURE1);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- glClientActiveTexture(GL_TEXTURE0);
+ glClientActiveTexture_(GL_TEXTURE0);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glClientActiveTexture(GL_TEXTURE1);
+ glClientActiveTexture_(GL_TEXTURE1);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glClientActiveTexture(GL_TEXTURE0);
+ glClientActiveTexture_(GL_TEXTURE0);
return mq;
}
const struct v_body *bp)
{
float a;
- float d[4];
float e[4];
float p[3];
float v[3];
- /* Compute the body transform. */
+ /* Apply the body position and rotation to the model-view matrix. */
sol_body_p(p, vary, bp->pi, bp->t);
sol_body_e(e, vary, bp, 0);
glTranslatef(p[0], p[1], p[2]);
glRotatef(V_DEG(a), v[0], v[1], v[2]);
- /* Compute the shadow texture transform */
+ /* Apply the shadow transform to the texture matrix. */
if (vary->uc && vary->uv->r > 0.0)
{
{
float k = 0.25f / vary->uv->r;
- v_sub(d, vary->uv->p, p);
-
glLoadIdentity();
- glTranslatef(0.5f - k * d[0],
- 0.5f - k * d[2], 0.0f);
- glScalef(k, k, 0.0f);
+
+ /* Center the shadow texture on the ball. */
+
+ glTranslatef(0.5f, 0.5f, 0.0f);
+
+ /* Transform ball XZ position to ST texture coordinate. */
+
+ glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
+
+ /* Move the shadow texture under the ball. */
+
+ glTranslatef(-vary->uv->p[0],
+ -vary->uv->p[1],
+ -vary->uv->p[2]);
+
+ /* Scale the shadow texture to the radius of the ball. */
+
+ glScalef(k, k, k);
+
+ /* Apply the body position and rotation. */
+
+ glTranslatef(p[0], p[1], p[2]);
+ glRotatef(V_DEG(a), v[0], v[1], v[2]);
}
glMatrixMode(GL_MODELVIEW);
glActiveTexture_(GL_TEXTURE0);
const size_t s = sizeof (GLfloat);
/*
glDisableClientState(GL_NORMAL_ARRAY);
- glClientActiveTexture(GL_TEXTURE1);
+ glClientActiveTexture_(GL_TEXTURE1);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- glClientActiveTexture(GL_TEXTURE0);
+ glClientActiveTexture_(GL_TEXTURE0);
*/
glBindBuffer_(GL_ARRAY_BUFFER, draw->bill);
{
/*
glEnableClientState(GL_NORMAL_ARRAY);
- glClientActiveTexture(GL_TEXTURE1);
+ glClientActiveTexture_(GL_TEXTURE1);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glClientActiveTexture(GL_TEXTURE0);
+ glClientActiveTexture_(GL_TEXTURE0);
*/
}
/* Environment mapping. */
+#ifndef CONF_OPENGLES
if ((mp_base->fl & M_ENVIRONMENT) && !(mq_base->fl & M_ENVIRONMENT))
{
glEnable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
}
+#endif
/* Additive blending. */
if ((mp_base->fl & M_TWO_SIDED) && !(mq_base->fl & M_TWO_SIDED))
{
glDisable(GL_CULL_FACE);
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1);
+ glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, 1);
}
if ((mq_base->fl & M_TWO_SIDED) && !(mp_base->fl & M_TWO_SIDED))
{
glEnable(GL_CULL_FACE);
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0);
+ glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, 0);
}
/* Decal offset. */
vp->t[0] = tq->u[0];
vp->t[1] = tq->u[1];
-
- vp->u[0] = vq->p[0];
- vp->u[1] = vq->p[2];
}
static void sol_mesh_geom(struct d_vert *vv, int *vn,
glVertexPointer (3, T, s, (GLvoid *) offsetof (struct d_vert, p));
glNormalPointer ( T, s, (GLvoid *) offsetof (struct d_vert, n));
- glClientActiveTexture(GL_TEXTURE1);
- glTexCoordPointer(2, T, s, (GLvoid *) offsetof (struct d_vert, u));
- glClientActiveTexture(GL_TEXTURE0);
+ glClientActiveTexture_(GL_TEXTURE1);
+ glTexCoordPointer(3, T, s, (GLvoid *) offsetof (struct d_vert, p));
+ glClientActiveTexture_(GL_TEXTURE0);
glTexCoordPointer(2, T, s, (GLvoid *) offsetof (struct d_vert, t));
/* Draw the mesh. */
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
- glClientActiveTexture(GL_TEXTURE1);
+ glClientActiveTexture_(GL_TEXTURE1);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glClientActiveTexture(GL_TEXTURE0);
+ glClientActiveTexture_(GL_TEXTURE0);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
return &default_draw_mtrl;
{
sol_apply_mtrl(&default_draw_mtrl, mq);
- glClientActiveTexture(GL_TEXTURE1);
+ glClientActiveTexture_(GL_TEXTURE1);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- glClientActiveTexture(GL_TEXTURE0);
+ glClientActiveTexture_(GL_TEXTURE0);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
float p[3];
float n[3];
float t[2];
- float u[2];
};
struct d_geom
glEnable(GL_LIGHTING);
glEnable(GL_BLEND);
+#ifndef CONF_OPENGLES
glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,
GL_SEPARATE_SPECULAR_COLOR);
+#endif
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDepthFunc(GL_LEQUAL);
{
glPushMatrix();
glLoadIdentity();
- glOrtho(0.0, w, 0.0, h, -1.0, +1.0);
+ glOrtho_(0.0, w, 0.0, h, -1.0, +1.0);
}
glMatrixMode(GL_MODELVIEW);
}
void video_clear(void)
{
-/*
- if (config_get_d(CONFIG_REFLECTION))
- glClear(GL_COLOR_BUFFER_BIT |
- GL_DEPTH_BUFFER_BIT |
- GL_STENCIL_BUFFER_BIT);
- else
- glClear(GL_DEPTH_BUFFER_BIT);
-*/
if (config_get_d(CONFIG_REFLECTION))
glClear(GL_DEPTH_BUFFER_BIT |
GL_STENCIL_BUFFER_BIT);