00001 /*
00002 File: SceneConvert.cc
00003
00004 Function: command-line program to convert scene files
00005
00006 Author: Andrew Willmott
00007
00008 Notes:
00009 */
00010
00011 #include <stdlib.h>
00012
00013 #include "cl/ArgParse.h"
00014 #include "gcl/SceneLang.h"
00015 #include "gcl/Readers.h"
00016 #include "gcl/Writers.h"
00017 #include "gcl/MRModel.h"
00018 #include "gcl/Avars.h"
00019
00020 static StrConstArray gAvarNames;
00021 static ScalarList gAvarVals;
00022
00023 static Int avarArg(Int argc, Char **argv)
00024 {
00025 Int i;
00026 GCLReal val;
00027
00028 if (argc % 2 == 1)
00029 {
00030 cerr << "Error: wrong number of avar arguments." << endl;
00031 exit(1);
00032 }
00033
00034 for (i = 0; i < argc; i += 2)
00035 {
00036 gAvarNames.Append(argv[i]);
00037 val = atof(argv[i + 1]);
00038 gAvarVals.Append(val);
00039 }
00040
00041 return(0);
00042 }
00043
00044 Void SetAvars(scScenePtr scene)
00045 {
00046 Int i;
00047 CreateAvarList makeAvarList;
00048
00049 for (i = 0; i < gAvarNames.NumItems(); i++)
00050 cout << "avar " << gAvarNames[i] << " = " << gAvarVals[i] << endl;
00051
00052 scene->ApplyAction(makeAvarList);
00053 #ifdef DEBUG
00054 cout << "scene avars:" << endl;
00055 for (i = 0; i < makeAvarList.avarList->NumItems(); i++)
00056 cout << makeAvarList.avarList->Item(i).name << " = "
00057 << makeAvarList.avarList->Item(i).value << endl;
00058 #endif
00059
00060 scene->Set(makeAvarList.avarList);
00061
00062 for (i = 0; i < gAvarNames.NumItems(); i++)
00063 if (!makeAvarList.avarList->SetAvar(gAvarNames[i], gAvarVals[i]))
00064 cerr << "No such avar in scene: " << gAvarNames[i]
00065 << " (ignoring) " << endl;
00066 }
00067
00068 static Void PrintSceneInfo(scScenePtr scene)
00069 {
00070 FindDecInfo decInfo;
00071
00072 scene->Decimate(decInfo, DecTris);
00073
00074 cout << "polygons " << decInfo.numPolys << endl;
00075 cout << "triangles " << decInfo.numTris << endl;
00076 }
00077
00078 Int main(Int argc, Char *argv[])
00079 {
00080 FileName inPath, outPath;
00081 Char *file1 = 0, *file2 = 0;
00082 Int formats, noRescale, writeCMB;
00083 scScenePtr scene;
00084 Double meshComp;
00085 ArgForm *arg_format;
00086
00087 // command-line options
00088
00089 meshComp = 1.0;
00090
00091 arg_format = arg_to_form(0,
00092 "", "Usage: slconv [options]",
00093
00094 "[%S]", &file1, "Input scene file",
00095 "[%S]", &file2, "Output scene file",
00096 "-set", ARG_SUBR(avarArg), "Set avar, e.g. -set light 0.5 height 0.2",
00097 "-meshComp %F", &meshComp, "Set mesh complexity for MR models",
00098 "-writeMRB", ARG_FLAG(&writeCMB), "Write multires model(s) in binary format",
00099 "-noRescale", ARG_FLAG(&noRescale), "Don't rescale the scene",
00100 "-formats", ARG_FLAG(&formats), "List supported file formats",
00101 0);
00102
00103 if (arg_parse_argv(argc, argv, arg_format) < 0)
00104 return(1);
00105
00106 if (formats)
00107 {
00108 cout << "Input formats:" << endl;
00109 SceneReader::PrintSupportedFormats(cout);
00110 cout << "Output formats:" << endl;
00111 SceneWriter::PrintSupportedFormats(cout);
00112 return(0);
00113 }
00114
00115 if (!file1)
00116 {
00117 arg_form_print(arg_format);
00118 return(0);
00119 }
00120
00121 inPath.SetPath(file1);
00122 if (file2)
00123 outPath.SetPath(file2);
00124
00125 // normalise or not?
00126
00127 slInit();
00128 scMRModel::SetComplexity(meshComp);
00129 scene = SceneReader::Load(inPath);
00130 if (!scene)
00131 return(1);
00132
00133 if (!noRescale)
00134 scene->Normalise();
00135
00136 SetAvars(scene);
00137
00138 if (writeCMB)
00139 {
00140 // write out models as binary
00141 MRModelsFinder models;
00142 Int i;
00143
00144 scene->ApplyAction(models);
00145
00146 for (i = 0; i < models.NumModels(); i++)
00147 {
00148 cout << "writing model " << models.Model(i)->modelFile.GetFile() << endl;
00149 models.Model(i)->WriteBinary();
00150 }
00151 }
00152 else
00153 if (!file2)
00154 // dump information
00155 PrintSceneInfo(scene);
00156 else
00157 // write out scene
00158 SceneWriter::Save(scene, outPath);
00159
00160 return(0);
00161 }