123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- /******************************************************************************
- 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;
- }
|