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