/* | |
Copyright (C) 1996-1997 Id Software, Inc. | |
This program is free software; you can redistribute it and/or | |
modify it under the terms of the GNU General Public License | |
as published by the Free Software Foundation; either version 2 | |
of the License, or (at your option) any later version. | |
This program is distributed in the hope that it will be useful, | |
but WITHOUT ANY WARRANTY; without even the implied warranty of | |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | |
See the GNU General Public License for more details. | |
You should have received a copy of the GNU General Public License | |
along with this program; if not, write to the Free Software | |
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
*/ | |
#include "quakedef.h" | |
#ifdef GLTEST | |
typedef struct | |
{ | |
plane_t *plane; | |
vec3_t origin; | |
vec3_t normal; | |
vec3_t up; | |
vec3_t right; | |
vec3_t reflect; | |
float length; | |
} puff_t; | |
#define MAX_PUFFS 64 | |
puff_t puffs[MAX_PUFFS]; | |
void Test_Init (void) | |
{ | |
} | |
plane_t junk; | |
plane_t *HitPlane (vec3_t start, vec3_t end) | |
{ | |
trace_t trace; | |
// fill in a default trace | |
memset (&trace, 0, sizeof(trace_t)); | |
trace.fraction = 1; | |
trace.allsolid = true; | |
VectorCopy (end, trace.endpos); | |
SV_RecursiveHullCheck (cl.worldmodel->hulls, 0, 0, 1, start, end, &trace); | |
junk = trace.plane; | |
return &junk; | |
} | |
void Test_Spawn (vec3_t origin) | |
{ | |
int i; | |
puff_t *p; | |
vec3_t temp; | |
vec3_t normal; | |
vec3_t incoming; | |
plane_t *plane; | |
float d; | |
for (i=0,p=puffs ; i<MAX_PUFFS ; i++,p++) | |
{ | |
if (p->length <= 0) | |
break; | |
} | |
if (i == MAX_PUFFS) | |
return; | |
VectorSubtract (r_refdef.vieworg, origin, incoming); | |
VectorSubtract (origin, incoming, temp); | |
plane = HitPlane (r_refdef.vieworg, temp); | |
VectorNormalize (incoming); | |
d = DotProduct (incoming, plane->normal); | |
VectorSubtract (vec3_origin, incoming, p->reflect); | |
VectorMA (p->reflect, d*2, plane->normal, p->reflect); | |
VectorCopy (origin, p->origin); | |
VectorCopy (plane->normal, p->normal); | |
CrossProduct (incoming, p->normal, p->up); | |
CrossProduct (p->up, p->normal, p->right); | |
p->length = 8; | |
} | |
void DrawPuff (puff_t *p) | |
{ | |
vec3_t pts[2][3]; | |
int i, j; | |
float s, d; | |
for (i=0 ; i<2 ; i++) | |
{ | |
if (i == 1) | |
{ | |
s = 6; | |
d = p->length; | |
} | |
else | |
{ | |
s = 2; | |
d = 0; | |
} | |
for (j=0 ; j<3 ; j++) | |
{ | |
pts[i][0][j] = p->origin[j] + p->up[j]*s + p->reflect[j]*d; | |
pts[i][1][j] = p->origin[j] + p->right[j]*s + p->reflect[j]*d; | |
pts[i][2][j] = p->origin[j] + -p->right[j]*s + p->reflect[j]*d; | |
} | |
} | |
glColor3f (1, 0, 0); | |
#if 0 | |
glBegin (GL_LINES); | |
glVertex3fv (p->origin); | |
glVertex3f (p->origin[0] + p->length*p->reflect[0], | |
p->origin[1] + p->length*p->reflect[1], | |
p->origin[2] + p->length*p->reflect[2]); | |
glVertex3fv (pts[0][0]); | |
glVertex3fv (pts[1][0]); | |
glVertex3fv (pts[0][1]); | |
glVertex3fv (pts[1][1]); | |
glVertex3fv (pts[0][2]); | |
glVertex3fv (pts[1][2]); | |
glEnd (); | |
#endif | |
glBegin (GL_QUADS); | |
for (i=0 ; i<3 ; i++) | |
{ | |
j = (i+1)%3; | |
glVertex3fv (pts[0][j]); | |
glVertex3fv (pts[1][j]); | |
glVertex3fv (pts[1][i]); | |
glVertex3fv (pts[0][i]); | |
} | |
glEnd (); | |
glBegin (GL_TRIANGLES); | |
glVertex3fv (pts[1][0]); | |
glVertex3fv (pts[1][1]); | |
glVertex3fv (pts[1][2]); | |
glEnd (); | |
p->length -= host_frametime*2; | |
} | |
void Test_Draw (void) | |
{ | |
int i; | |
puff_t *p; | |
for (i=0, p=puffs ; i<MAX_PUFFS ; i++,p++) | |
{ | |
if (p->length > 0) | |
DrawPuff (p); | |
} | |
} | |
#endif |