1 /*
2 Copyright (C) 1996-1997 Id Software, Inc.
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13 See the GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
19 */
20
21 #include "quakedef.h"
22
23 #ifdef GLTEST
24
25 typedef struct
26 {
27 plane_t *plane;
28 vec3_t origin;
29 vec3_t normal;
30 vec3_t up;
31 vec3_t right;
32 vec3_t reflect;
33 float length;
34 } puff_t;
35
36 #define MAX_PUFFS 64
37
38 puff_t puffs[MAX_PUFFS];
39
40
Test_Init(void)41 void Test_Init (void)
42 {
43 }
44
45
46
47 plane_t junk;
HitPlane(vec3_t start,vec3_t end)48 plane_t *HitPlane (vec3_t start, vec3_t end)
49 {
50 trace_t trace;
51
52 // fill in a default trace
53 memset (&trace, 0, sizeof(trace_t));
54 trace.fraction = 1;
55 trace.allsolid = true;
56 VectorCopy (end, trace.endpos);
57
58 SV_RecursiveHullCheck (cl.worldmodel->hulls, 0, 0, 1, start, end, &trace);
59
60 junk = trace.plane;
61 return &junk;
62 }
63
Test_Spawn(vec3_t origin)64 void Test_Spawn (vec3_t origin)
65 {
66 int i;
67 puff_t *p;
68 vec3_t temp;
69 vec3_t normal;
70 vec3_t incoming;
71 plane_t *plane;
72 float d;
73
74 for (i=0,p=puffs ; i<MAX_PUFFS ; i++,p++)
75 {
76 if (p->length <= 0)
77 break;
78 }
79 if (i == MAX_PUFFS)
80 return;
81
82 VectorSubtract (r_refdef.vieworg, origin, incoming);
83 VectorSubtract (origin, incoming, temp);
84 plane = HitPlane (r_refdef.vieworg, temp);
85
86 VectorNormalize (incoming);
87 d = DotProduct (incoming, plane->normal);
88 VectorSubtract (vec3_origin, incoming, p->reflect);
89 VectorMA (p->reflect, d*2, plane->normal, p->reflect);
90
91 VectorCopy (origin, p->origin);
92 VectorCopy (plane->normal, p->normal);
93
94 CrossProduct (incoming, p->normal, p->up);
95
96 CrossProduct (p->up, p->normal, p->right);
97
98 p->length = 8;
99 }
100
DrawPuff(puff_t * p)101 void DrawPuff (puff_t *p)
102 {
103 vec3_t pts[2][3];
104 int i, j;
105 float s, d;
106
107 for (i=0 ; i<2 ; i++)
108 {
109 if (i == 1)
110 {
111 s = 6;
112 d = p->length;
113 }
114 else
115 {
116 s = 2;
117 d = 0;
118 }
119
120 for (j=0 ; j<3 ; j++)
121 {
122 pts[i][0][j] = p->origin[j] + p->up[j]*s + p->reflect[j]*d;
123 pts[i][1][j] = p->origin[j] + p->right[j]*s + p->reflect[j]*d;
124 pts[i][2][j] = p->origin[j] + -p->right[j]*s + p->reflect[j]*d;
125 }
126 }
127
128 glColor3f (1, 0, 0);
129
130 #if 0
131 glBegin (GL_LINES);
132 glVertex3fv (p->origin);
133 glVertex3f (p->origin[0] + p->length*p->reflect[0],
134 p->origin[1] + p->length*p->reflect[1],
135 p->origin[2] + p->length*p->reflect[2]);
136
137 glVertex3fv (pts[0][0]);
138 glVertex3fv (pts[1][0]);
139
140 glVertex3fv (pts[0][1]);
141 glVertex3fv (pts[1][1]);
142
143 glVertex3fv (pts[0][2]);
144 glVertex3fv (pts[1][2]);
145
146 glEnd ();
147 #endif
148
149 glBegin (GL_QUADS);
150 for (i=0 ; i<3 ; i++)
151 {
152 j = (i+1)%3;
153 glVertex3fv (pts[0][j]);
154 glVertex3fv (pts[1][j]);
155 glVertex3fv (pts[1][i]);
156 glVertex3fv (pts[0][i]);
157 }
158 glEnd ();
159
160 glBegin (GL_TRIANGLES);
161 glVertex3fv (pts[1][0]);
162 glVertex3fv (pts[1][1]);
163 glVertex3fv (pts[1][2]);
164 glEnd ();
165
166 p->length -= host_frametime*2;
167 }
168
169
Test_Draw(void)170 void Test_Draw (void)
171 {
172 int i;
173 puff_t *p;
174
175 for (i=0, p=puffs ; i<MAX_PUFFS ; i++,p++)
176 {
177 if (p->length > 0)
178 DrawPuff (p);
179 }
180 }
181
182 #endif
183