70 lines
2.6 KiB
C++
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;
|
||
|
}
|