home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 1996 December
/
PCWKCD1296.iso
/
sharewar
/
quake106
/
utils
/
texmake
/
texmake.c
next >
Wrap
C/C++ Source or Header
|
1996-09-12
|
3KB
|
223 lines
#include "cmdlib.h"
#include "mathlib.h"
#include "lbmlib.h"
#include "trilib.h"
triangle_t *faces;
int numfaces;
byte pic[64000];
byte *palette;
int width, height;
int iwidth, iheight;
float scale;
char texname[20];
/*
================
BoundFaces
================
*/
vec3_t mins, maxs;
void BoundFaces (void)
{
int i,j,k;
triangle_t *pol;
float v;
for (i=0 ; i<numfaces ; i++)
{
pol = &faces[i];
for (j=0 ; j<3 ; j++)
for (k=0 ; k<3 ; k++)
{
v = pol->verts[j][k];
if (v<mins[k])
mins[k] = v;
if (v>maxs[k])
maxs[k] = v;
}
}
for (i=0 ; i<3 ; i++)
{
mins[i] = floor(mins[i]);
maxs[i] = ceil(maxs[i]);
}
width = maxs[0] - mins[0];
height = maxs[2] - mins[2];
printf ("width: %i height: %i\n",width, height);
scale = 8;
if (width*scale >= 150)
scale = 150.0 / width;
if (height*scale >= 190)
scale = 190.0 / height;
iwidth = ceil(width*scale) + 4;
iheight = ceil(height*scale) + 4;
printf ("scale: %f\n",scale);
printf ("iwidth: %i iheight: %i\n",iwidth, iheight);
}
/*
============
DrawLine
Draw a fat line
============
*/
void DrawLine (int x1, int y1, int x2, int y2)
{
int dx, dy;
int adx, ady;
int count;
float xfrac, yfrac, xstep, ystep;
unsigned sx, sy;
float u, v;
dx = x2 - x1;
dy = y2 - y1;
adx = abs(dx);
ady = abs(dy);
count = adx > ady ? adx : ady;
count ++;
if (count > 300)
return; // don't ever hang up on bad data
xfrac = x1;
yfrac = y1;
xstep = (float)dx / count;
ystep = (float)dy / count;
do
{
for (u=-0.1 ; u<=0.9 ; u+=0.999)
for (v=-0.1 ; v<=0.9 ; v+=0.999)
{
sx = xfrac+u;
sy = yfrac+v;
if (sx < 320 && sy < 200)
pic[sy*320+sx] = 255;
}
xfrac += xstep;
yfrac += ystep;
count--;
} while (count > 0);
}
/*
============
AddFace
============
*/
void AddFace (triangle_t *f)
{
vec3_t v1, v2, normal;
int basex, basey;
int i, j;
int coords[3][2];
//
// determine which side to map the teture to
//
VectorSubtract (f->verts[0], f->verts[1], v1);
VectorSubtract (f->verts[2], f->verts[1], v2);
CrossProduct (v1, v2, normal);
if (normal[1] > 0)
basex = iwidth + 2;
else
basex = 2;
basey = 2;
for (i=0 ; i<3 ; i++)
{
coords[i][0] = Q_rint((f->verts[i][0] - mins[0])*scale + basex);
coords[i][1] = Q_rint( (maxs[2] - f->verts[i][2])*scale + basey);
}
//
// draw lines
//
for (i=0 ; i<3 ; i++)
{
j = (i+1)%3;
DrawLine (coords[i][0], coords[i][1],
coords[j][0], coords[j][1]);
}
}
/*
============
CalcPalette
============
*/
void CalcPalette (void)
{
byte *picture;
LoadLBM (ExpandPath("id1/gfx/gamepal.lbm"), &picture, &palette);
}
/*
============
main
============
*/
void main (int argc, char **argv)
{
int i;
char filename[1024];
if (argc == 1)
Error ("texmake polfile[.idpol]\nGenerates polfile.lbm and polfile_t.idpol\n");
//
// read the polfile
//
strcpy (filename, argv[1]);
DefaultExtension (filename, ".tri");
SetQdirFromPath (filename);
LoadTriangleList (filename, &faces, &numfaces);
printf ("numfaces: %i\n",numfaces);
//
// generate the texture coordinates
//
BoundFaces ();
//
// generate the lbm
//
for (i=0 ; i<numfaces ; i++)
AddFace (&faces[i]);
//
// save the lbm
//
strcpy (filename, argv[1]);
StripExtension (filename);
strcat (filename, ".lbm");
printf ("output file: %s\n",filename);
CalcPalette ();
WriteLBMfile (filename, pic, 320, 200, palette);
}