123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- /*
- 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
|