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