winamp/Src/Winamp/plush/READ_JAW.C
2024-09-24 14:54:57 +02:00

70 lines
2.6 KiB
C

/******************************************************************************
Plush Version 1.2
read_jaw.c
Jaw3D Object Reader
Copyright (c) 1996-2000, Justin Frankel
*******************************************************************************
Notes on .JAW files:
This is a file format created by Jawed Karim for Jaw3D
(http://jaw3d.home.ml.org).
-- updated 11/6/00 - www.jawed.com
It is very simple, and lets one easily create ones own models using only
a text editor. The format is pretty simple:
The first line must be "Light: (x,y,z)" where x,y, and z are the x y and
z components of the lightsource vector (I think ;)
A series of lines, numbered 0 to n, in the format of
"i: x y z", where i is the vertex number (which should be listed in
order, and x y and z are the coordinates of that vertex.
A series of lines, having the format "tri a, b, c" where a b and c are
the vertices that the face uses. It is unclear at this time which
way the vertices are listed (ccw or cw), so just make em consistent
and you can always use plFlipObjectNormals() on the loaded object.
That is it! (I told ya it was simple).
******************************************************************************/
#include "plush.h"
pl_Obj *plReadJAWObj(char *filename, pl_Mat *m) {
FILE *jawfile;
pl_Obj *obj;
pl_uInt32 i;
pl_sInt crap;
char line[256];
pl_uInt32 total_points = 0, total_polys = 0;
if ((jawfile = fopen(filename, "r")) == NULL) return 0;
fgets(line, 256, jawfile); /* Ignores lightsource info */
while (fgets(line, 256, jawfile) != NULL)
if (strstr(line, ":") != NULL) total_points++;
rewind(jawfile); fgets(line, 256, jawfile);
while (fgets(line, 256, jawfile) != NULL)
if (strstr(line, "tri") != NULL) total_polys++;
rewind(jawfile); fgets(line, 256, jawfile);
obj = plObjCreate(total_points,total_polys);
i = 0;
while (fgets(line, 256, jawfile) != NULL) if (strstr(line, ":") != NULL) {
float x, y, z;
sscanf(line, "%d: %f %f %f",&crap,&x,&y,&z);
obj->Vertices[i].x = (pl_Float) x;
obj->Vertices[i].y = (pl_Float) y;
obj->Vertices[i].z = (pl_Float) z;
i++;
}
rewind(jawfile); fgets(line, 256, jawfile);
i = 0;
while (fgets(line, 256, jawfile) != NULL) if (strstr(line, "tri") != NULL) {
pl_uInt32 a,b,c;
sscanf(line, "tri %ld, %ld, %ld", &a, &b, &c);
obj->Faces[i].Vertices[0] = obj->Vertices + a;
obj->Faces[i].Vertices[1] = obj->Vertices + c;
obj->Faces[i].Vertices[2] = obj->Vertices + b;
obj->Faces[i].Material = m;
i++;
}
fclose(jawfile);
plObjCalcNormals(obj);
return obj;
}