00001 /*
00002 File: Readers.cc
00003
00004 Function: Support for reading in various scene file formats
00005
00006 Author: Andrew Willmott
00007
00008 Notes:
00009 */
00010
00011 #include "gcl/Readers.h"
00012
00013 #include <stdio.h>
00014 #include <string.h>
00015 #include <unistd.h>
00016 #include <stdlib.h>
00017 #include "gcl/GCLConfig.h"
00018
00019 #ifdef DEBUG
00020 #define DBG_COUT if (1) cerr
00021 #else
00022 #define DBG_COUT if (0) cerr
00023 #endif
00024
00025 #define INFO_COUT cerr
00026
00027 typedef scScenePtr (*SceneParser)(const Char *filename);
00028
00029 struct SceneParserEntry
00030 {
00031 StrConst extension;
00032 SceneParser parser;
00033 StrConst description;
00034 };
00035
00036 scScenePtr ParseObjFile(const Char *filename);
00037 scScenePtr ParseSLFile(const Char *filename);
00038 scScenePtr ParseSCFile(const Char *filename);
00039 scScenePtr ParseMGFFile(const Char *filename);
00040 scScenePtr ParseMMFFile(const Char *filename);
00041 scScenePtr ParseMSDLFile(const Char *filename);
00042 scScenePtr ParsePLYFile(const Char *filename);
00043
00044 static StrConst kSceneFileExtensions[] =
00045 {
00046 "sl",
00047 "obj",
00048 "msh",
00049 "smf",
00050 "mrb",
00051 "mmf",
00052 "cmf",
00053 #ifdef GCL_PARSE_SC
00054 "sc",
00055 #endif
00056 #ifdef GCL_MGF
00057 "mgf",
00058 #endif
00059 #ifdef GCL_MSDL
00060 "msdl",
00061 #endif
00062 "ply",
00063 0
00064 };
00065
00066 static SceneParserEntry kSceneParserTable[] =
00067 {
00068 "sl", ParseSLFile, "GCL's scene language.",
00069 "obj", ParseObjFile, "Wavefront .obj text format",
00070 "msh", ParseObjFile, ".msh file",
00071 "smf", ParseObjFile, "Garland's .smf format (obj-like)",
00072 "mrb", ParseMMFFile, "binary multi-res model format",
00073 "mmf", ParseMMFFile, "ascii multi-res model",
00074 "cmf", ParseMMFFile, "ascii face cluster model",
00075 #ifdef GCL_PARSE_SC
00076 "sc", ParseSCFile, "Heckbert's .sc format",
00077 #endif
00078 #ifdef GCL_MGF
00079 "mgf", ParseMGFFile, "Ward et al.'s .mgf format",
00080 #endif
00081 #ifdef GCL_MSDL
00082 "msdl", ParseMSDLFile, "Manchester Scene Description Language",
00083 #endif
00084 "ply", ParsePLYFile, "PLY format (cyberware etc.)",
00085 0
00086 };
00087
00088 Void SceneReader::PrintSupportedFormats(ostream &s)
00089 {
00090 SceneParserEntry *sp = kSceneParserTable;
00091 Int i;
00092
00093 s << "Supported scene file extensions: " << endl;
00094
00095 while (sp->extension)
00096 {
00097 s << " " << sp->extension;
00098 for (i = 0; i < 4 - strlen(sp->extension); i++)
00099 s << ' ';
00100 s << " " << sp->description << endl;
00101 sp++;
00102 }
00103 #ifdef CL_GZIP
00104 s << "gzipped versions of these files are also acceptable." << endl;
00105 #endif
00106 }
00107
00108 scScenePtr SceneReader::Load(FileName &sceneFile)
00115 {
00116 scScenePtr result;
00117 String gunzipFile, origFile;
00118 Bool gzipFile = false;
00119 SceneParserEntry *sp;
00120 FileName filename(sceneFile);
00121 Int fileExt;
00122
00123 fileExt = filename.FindFileExtension(kSceneFileExtensions);
00124
00125 if (fileExt == kFileNotFound)
00126 INFO_COUT << filename.GetPath() <<
00127 " does not exist or is not readable." << endl;
00128 else if (fileExt == kBadExtension)
00129 INFO_COUT << filename.GetPath() << " has an unknown extension."
00130 << endl;
00131
00132 if (fileExt < 0)
00133 return(0);
00134
00135 sceneFile = filename; // set sceneFile to the file we actually found
00136
00137 if (filename.DecompressSetup() != 0)
00138 {
00139 INFO_COUT << "Error while decompressing " << origFile << endl;
00140 return(0);
00141 }
00142 INFO_COUT << "Reading " << filename.GetPath() << endl;
00143 result = (kSceneParserTable[fileExt].parser)(filename.GetPath());
00144 filename.DecompressCleanup();
00145
00146 return(result);
00147 }