1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCopyright (C) 1996-1997 Id Software, Inc.
3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is free software; you can redistribute it and/or
5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodify it under the terms of the GNU General Public License
6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichas published by the Free Software Foundation; either version 2
7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichof the License, or (at your option) any later version.
8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is distributed in the hope that it will be useful,
10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbut WITHOUT ANY WARRANTY; without even the implied warranty of
11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSee the GNU General Public License for more details.
14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichYou should have received a copy of the GNU General Public License
16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichalong with this program; if not, write to the Free Software
17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
20cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// gl_mesh.c: triangle model functions
21cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
22cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include "quakedef.h"
23cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
24cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
25cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=================================================================
26cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
27cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichALIAS MODEL DISPLAY LIST GENERATION
28cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
29cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=================================================================
30cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
31cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
32cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodel_t		*aliasmodel;
33cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichaliashdr_t	*paliashdr;
34cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
35cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqboolean	used[8192];
36cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
37cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// the command list holds counts and s/t values that are valid for
38cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// every frame
39cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint		commands[8192];
40cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint		numcommands;
41cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
42cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// all frames will have their vertexes rearranged and expanded
43cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// so they are in the order expected by the command list
44cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint		vertexorder[8192];
45cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint		numorder;
46cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
47cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint		allverts, alltris;
48cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
49cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint		stripverts[128];
50cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint		striptris[128];
51cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint		stripcount;
52cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
53cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
54cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================
55cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichStripLength
56cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================
57cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
58cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint	StripLength (int starttri, int startv)
59cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
60cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			m1, m2;
61cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			j;
62cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	mtriangle_t	*last, *check;
63cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			k;
64cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
65cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	used[starttri] = 2;
66cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
67cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	last = &triangles[starttri];
68cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
69cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	stripverts[0] = last->vertindex[(startv)%3];
70cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	stripverts[1] = last->vertindex[(startv+1)%3];
71cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	stripverts[2] = last->vertindex[(startv+2)%3];
72cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
73cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	striptris[0] = starttri;
74cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	stripcount = 1;
75cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
76cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	m1 = last->vertindex[(startv+2)%3];
77cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	m2 = last->vertindex[(startv+1)%3];
78cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
79cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	// look for a matching triangle
80cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichnexttri:
81cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	for (j=starttri+1, check=&triangles[starttri+1] ; j<pheader->numtris ; j++, check++)
82cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	{
83cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		if (check->facesfront != last->facesfront)
84cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			continue;
85cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		for (k=0 ; k<3 ; k++)
86cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		{
87cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			if (check->vertindex[k] != m1)
88cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				continue;
89cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			if (check->vertindex[ (k+1)%3 ] != m2)
90cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				continue;
91cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
92cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			// this is the next part of the fan
93cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
94cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			// if we can't use this triangle, this tristrip is done
95cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			if (used[j])
96cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				goto done;
97cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
98cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			// the new edge
99cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			if (stripcount & 1)
100cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				m2 = check->vertindex[ (k+2)%3 ];
101cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			else
102cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				m1 = check->vertindex[ (k+2)%3 ];
103cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
104cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			stripverts[stripcount+2] = check->vertindex[ (k+2)%3 ];
105cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			striptris[stripcount] = j;
106cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			stripcount++;
107cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
108cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			used[j] = 2;
109cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			goto nexttri;
110cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		}
111cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	}
112cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichdone:
113cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
114cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	// clear the temp used flags
115cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	for (j=starttri+1 ; j<pheader->numtris ; j++)
116cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		if (used[j] == 2)
117cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			used[j] = 0;
118cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
119cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	return stripcount;
120cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
121cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
122cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
123cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich===========
124cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFanLength
125cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich===========
126cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
127cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint	FanLength (int starttri, int startv)
128cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
129cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int		m1, m2;
130cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int		j;
131cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	mtriangle_t	*last, *check;
132cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int		k;
133cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
134cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	used[starttri] = 2;
135cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
136cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	last = &triangles[starttri];
137cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
138cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	stripverts[0] = last->vertindex[(startv)%3];
139cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	stripverts[1] = last->vertindex[(startv+1)%3];
140cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	stripverts[2] = last->vertindex[(startv+2)%3];
141cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
142cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	striptris[0] = starttri;
143cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	stripcount = 1;
144cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
145cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	m1 = last->vertindex[(startv+0)%3];
146cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	m2 = last->vertindex[(startv+2)%3];
147cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
148cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
149cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	// look for a matching triangle
150cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichnexttri:
151cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	for (j=starttri+1, check=&triangles[starttri+1] ; j<pheader->numtris ; j++, check++)
152cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	{
153cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		if (check->facesfront != last->facesfront)
154cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			continue;
155cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		for (k=0 ; k<3 ; k++)
156cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		{
157cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			if (check->vertindex[k] != m1)
158cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				continue;
159cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			if (check->vertindex[ (k+1)%3 ] != m2)
160cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				continue;
161cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
162cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			// this is the next part of the fan
163cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
164cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			// if we can't use this triangle, this tristrip is done
165cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			if (used[j])
166cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				goto done;
167cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
168cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			// the new edge
169cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			m2 = check->vertindex[ (k+2)%3 ];
170cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
171cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			stripverts[stripcount+2] = m2;
172cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			striptris[stripcount] = j;
173cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			stripcount++;
174cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
175cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			used[j] = 2;
176cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			goto nexttri;
177cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		}
178cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	}
179cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichdone:
180cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
181cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	// clear the temp used flags
182cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	for (j=starttri+1 ; j<pheader->numtris ; j++)
183cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		if (used[j] == 2)
184cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			used[j] = 0;
185cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
186cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	return stripcount;
187cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
188cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
189cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
190cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
191cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================
192cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichBuildTris
193cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
194cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichGenerate a list of trifans or strips
195cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichfor the model, which holds for all frames
196cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================
197cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
198cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid BuildTris (void)
199cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
200cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int		i, j, k;
201cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int		startv;
202cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	mtriangle_t	*last, *check;
203cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int		m1, m2;
204cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int		striplength;
205cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	trivertx_t	*v;
206cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	mtriangle_t *tv;
207cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	float	s, t;
208cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int		index;
209cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int		len, bestlen, besttype;
210cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int		bestverts[1024];
211cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int		besttris[1024];
212cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int		type;
213cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
214cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	union {
215cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	    float f;
216cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	    int i;
217cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	} temp;
218cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	//
219cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	// build tristrips
220cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	//
221cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	numorder = 0;
222cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	numcommands = 0;
223cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	memset (used, 0, sizeof(used));
224cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	for (i=0 ; i<pheader->numtris ; i++)
225cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	{
226cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		// pick an unused triangle and start the trifan
227cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		if (used[i])
228cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			continue;
229cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
230cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		bestlen = 0;
231cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		besttype = 0;
232cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		for (type = 0 ; type < 2 ; type++)
233cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//	type = 1;
234cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		{
235cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			for (startv =0 ; startv < 3 ; startv++)
236cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			{
237cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				if (type == 1)
238cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich					len = StripLength (i, startv);
239cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				else
240cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich					len = FanLength (i, startv);
241cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				if (len > bestlen)
242cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				{
243cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich					besttype = type;
244cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich					bestlen = len;
245cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich					for (j=0 ; j<bestlen+2 ; j++)
246cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich						bestverts[j] = stripverts[j];
247cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich					for (j=0 ; j<bestlen ; j++)
248cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich						besttris[j] = striptris[j];
249cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				}
250cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			}
251cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		}
252cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
253cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		// mark the tris on the best strip as used
254cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		for (j=0 ; j<bestlen ; j++)
255cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			used[besttris[j]] = 1;
256cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
257cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		if (besttype == 1)
258cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			commands[numcommands++] = (bestlen+2);
259cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		else
260cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			commands[numcommands++] = -(bestlen+2);
261cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
262cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		for (j=0 ; j<bestlen+2 ; j++)
263cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		{
264cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			// emit a vertex into the reorder buffer
265cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			k = bestverts[j];
266cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			vertexorder[numorder++] = k;
267cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
268cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			// emit s/t coords into the commands stream
269cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			s = stverts[k].s;
270cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			t = stverts[k].t;
271cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			if (!triangles[besttris[0]].facesfront && stverts[k].onseam)
272cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				s += pheader->skinwidth / 2;	// on back side
273cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			s = (s + 0.5) / pheader->skinwidth;
274cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			t = (t + 0.5) / pheader->skinheight;
275cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
276cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			temp.f = s;
277cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			commands[numcommands++] = temp.i;
278cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			temp.f = t;
279cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			commands[numcommands++] = temp.i;
280cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		}
281cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	}
282cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
283cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	commands[numcommands++] = 0;		// end of list marker
284cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
285cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	Con_DPrintf ("%3i tri %3i vert %3i cmd\n", pheader->numtris, numorder, numcommands);
286cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
287cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	allverts += numorder;
288cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	alltris += pheader->numtris;
289cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
290cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
291cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
292cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
293cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================
294cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichGL_MakeAliasModelDisplayLists
295cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================
296cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
297cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid GL_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr)
298cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
299cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int		i, j;
300cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	maliasgroup_t	*paliasgroup;
301cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int			*cmds;
302cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	trivertx_t	*verts;
303cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	char	cache[MAX_QPATH], fullpath[MAX_OSPATH], *c;
304cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	FILE	*f;
305cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int		len;
306cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	byte	*data;
307cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
308cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	aliasmodel = m;
309cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	paliashdr = hdr;	// (aliashdr_t *)Mod_Extradata (m);
310cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
311cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	//
312cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	// look for a cached version
313cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	//
314cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	strcpy (cache, "glquake/");
315cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	COM_StripExtension (m->name+strlen("progs/"), cache+strlen("glquake/"));
316cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	strcat (cache, ".ms2");
317cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
318cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	COM_FOpenFile (cache, &f);
319cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	if (f)
320cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	{
321cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		fread (&numcommands, 4, 1, f);
322cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		fread (&numorder, 4, 1, f);
323cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		fread (&commands, numcommands * sizeof(commands[0]), 1, f);
324cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		fread (&vertexorder, numorder * sizeof(vertexorder[0]), 1, f);
325cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		fclose (f);
326cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	}
327cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	else
328cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	{
329cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		//
330cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		// build it from scratch
331cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		//
332cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		Con_Printf ("meshing %s...\n",m->name);
333cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
334cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		BuildTris ();		// trifans or lists
335cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
336cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		//
337cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		// save out the cached version
338cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		//
339cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		sprintf (fullpath, "%s/%s", com_gamedir, cache);
340cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		f = fopen (fullpath, "wb");
341cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		if (f)
342cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		{
343cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			fwrite (&numcommands, 4, 1, f);
344cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			fwrite (&numorder, 4, 1, f);
345cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			fwrite (&commands, numcommands * sizeof(commands[0]), 1, f);
346cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			fwrite (&vertexorder, numorder * sizeof(vertexorder[0]), 1, f);
347cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			fclose (f);
348cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		}
349cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	}
350cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
351cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
352cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	// save the data out
353cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
354cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	paliashdr->poseverts = numorder;
355cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
356cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	cmds = (int*) Hunk_Alloc (numcommands * 4);
357cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	paliashdr->commands = (byte *)cmds - (byte *)paliashdr;
358cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	memcpy (cmds, commands, numcommands * 4);
359cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
360cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	verts = (trivertx_t*)  Hunk_Alloc (paliashdr->numposes * paliashdr->poseverts
361cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		* sizeof(trivertx_t) );
362cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	paliashdr->posedata = (byte *)verts - (byte *)paliashdr;
363cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	for (i=0 ; i<paliashdr->numposes ; i++)
364cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		for (j=0 ; j<numorder ; j++)
365cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			*verts++ = poseverts[i][vertexorder[j]];
366cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
367cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
368