/************* * DESCRIPTION: read a LWOB-file * INPUT: rc context * filename name of LWOB-file * link link structure * pos object position * ox, oy, oz object orientation * actor pointer to actor * replacesurf pointer to surface to replace object surface * with * version version number * OUTPUT: NULL if ok else errorstring *************/ extern "C" char* SAVEDS objRead(rsiCONTEXT *rc, char *filename, OBJLINK *link, VECTOR *pos, VECTOR *ox, VECTOR *oy, VECTOR *oz, VECTOR *scale, ACTOR *actor, SURFACE *replacesurf, ULONG *version, void (*SetProgress)(rsiCONTEXT*, float)) { long error = 0; struct ContextNode *cn; char *err; HANDLER_DATA data; data.link = link; data.iff = NULL; data.points = NULL; data.rc = rc; data.surfaces = NULL; data.pos = *pos; data.ox = *ox; data.oy = *oy; data.oz = *oz; data.size = *scale; data.replacesurf = replacesurf; data.SetProgress = SetProgress; data.size_done = 0; err = OpenIFF(&data.iff, filename, &data.filesize); if(err) { readLWOB_cleanup(&data); return err; } while (!error || error == IFFERR_EOC) { error = ParseIFF(data.iff, IFFPARSE_RAWSTEP); if (error != IFFERR_EOC) { // Get a pointer to the context node describing the current context cn = CurrentChunk(data.iff); if (cn) { switch (cn->cn_ID) { case ID_SRFS: err = ReadSurfaces(&data, cn); if(err) { readLWOB_cleanup(&data); return err; } break; case ID_SURF: if(!data.replacesurf) { err = ReadSurface(&data, cn); if(err) { readLWOB_cleanup(&data); return err; } } break; case ID_PNTS: err = ReadPoints(&data, cn); if(err) { readLWOB_cleanup(&data); return err; } break; case ID_POLS: err = ReadPolygons(&data, cn, actor); if(err) { readLWOB_cleanup(&data); return err; } break; } if(SetProgress) { data.size_done += cn->cn_Size; (*SetProgress)(rc, (float)data.size_done/(float)data.filesize); } } } } readLWOB_cleanup(&data); if (error != IFFERR_EOF) { return errors[ERR_LWOBFILE]; } return NULL; }
/************* * DESCRIPTION: parse a sphere from a RSCN file * INPUT: iff iff handler * where where to insert after * dir insert direction * OUTPUT: created object *************/ OBJECT *ParseSphere(struct IFFHandle *iff, OBJECT *where, int dir) { SPHERE *sphere; struct ContextNode *cn; long error = 0; sphere = new SPHERE; if(!sphere) return NULL; if(!sphere->ReadAxis(iff)) { delete sphere; return NULL; } sphere->surf = GetSurfaceByName(SURF_DEFAULTNAME); while(!error) { error = ParseIFF(iff, IFFPARSE_RAWSTEP); if(error < 0 && error != IFFERR_EOC) { delete sphere; return NULL; } // Get a pointer to the context node describing the current context cn = CurrentChunk(iff); if(!cn) continue; if((cn->cn_ID == ID_FORM) && (cn->cn_Type == ID_SPHR)) break; if(error == IFFERR_EOC) { error = 0; continue; } switch (cn->cn_ID) { case ID_FORM: switch(cn->cn_Type) { case ID_SURF: if(!ReadSurface(iff, &sphere->surf, (OBJECT*)sphere)) { delete sphere; return NULL; } break; } break; case ID_NAME: if(!sphere->ReadName(iff)) { delete sphere; return NULL; } break; case ID_TRCK: if(!sphere->ReadTrack(iff)) { delete sphere; return NULL; } break; case ID_FLGS: if(!sphere->ReadFlags(iff)) { delete sphere; return NULL; } break; } } SetVector(&sphere->bboxmin, -sphere->size.x, -sphere->size.y, -sphere->size.z); sphere->bboxmax = sphere->size; sphere->Insert(where, dir); return (OBJECT*)sphere; }
void clGeometryReader::ReadGeometry(fstream &file, clGeometry &geometry) const { int numberSurfaces = 0; int EndOfBlock = 0; // Read line char line[LINE_SIZE]; file.getline(line, LINE_SIZE); while(!file.eof() && file.good() && !EndOfBlock) { // Check first character in trimmed line switch(*strtrim(line)) { case '#': case '*': // Comment line file.getline(line, LINE_SIZE); break; case '$': case '&': { // Block specifier int blockCommand = GetBlockSpec(line); switch(blockCommand) { case UNKNOWN_SPEC: throw clExceptionTree("clGeometryReader", "ReadGeometry", "Unknown block specifier."); break; case POINT_SPEC: // Start of point block throw clExceptionTree("clGeometryReader", "ReadGeometry", "Unexpected start of block POINT."); break; case PATCH_SPEC: // Start of patch block throw clExceptionTree("clGeometryReader", "ReadGeometry", "Unexpected start of block PATCH."); break; case SURFACE_SPEC: { // Start of surface block clSurface *surface = new clSurface(numberSurfaces++); ReadSurface(file, *surface); geometry.AddSurface(surface); file.getline(line, LINE_SIZE); break; } case GEOMETRY_SPEC: // Start of geometry block throw clExceptionTree("clGeometryReader", "ReadGeometry", "Unexpected start of block GEOMETRY."); break; case END_SPEC: // End of geometry block specification EndOfBlock = 1; break; default: throw clExceptionTree("clGeometryReader", "ReadGeometry", "Function GetBlockSpec returned unknown value."); break; } break; } case '/': // End of geometry block specification EndOfBlock = 1; break; default: file.getline(line, LINE_SIZE); break; } } }