Main Page Class Hierarchy Compound List File List Compound Members File Members

GCLApp.cc

Go to the documentation of this file.
00001 /*
00002 File: GCLApp.cc
00003 
00004 Function: 
00005 
00006 Author: Andrew Willmott
00007 
00008 Notes: 
00009 */
00010 
00011 #include "gcl/GCLApp.h"
00012 #include "gcl/Avars.h"
00013 #include "gcl/Readers.h"
00014 #include <stdlib.h>
00015 
00016  #define DBG_COUT if (0) cerr
00017 
00018 
00019 // --- GCLApp --------------------------------------------------------------
00020 
00021 
00029 Char **GCLApp::files;
00030 Int GCLApp::numFiles;
00031 StrConstArray GCLApp::avarNames;
00032 ScalarList GCLApp::avarVals;
00033 
00034  GCLApp::GCLApp() : 
00035 #ifndef GCL_NO_GL
00036 itsScenePane(0),
00037 #endif
00038 itsCamera(0),
00039 frame(1),
00040 time(0.0),
00041 fps(24.0),
00042 anim(0),
00043 avarList(0)
00044 {
00045 }
00046 
00047  Void GCLApp::ReadScene(FileName &sceneFile)
00048 {
00049 scene = SceneReader::Load(sceneFile);
00050 if (!scene)
00051 return;
00052 
00053 if (zUp)
00054 scene->Apply(Rotation(vl_x, vl_halfPi));
00055 else if (zDown)
00056 scene->Apply(Rotation(vl_x, -vl_halfPi));
00057 
00058 if (!noScale)
00059 scene->Normalise();
00060 }
00061 
00062  Void GCLApp::GetFileArgs(Int argc, Char *argv[])
00063 {
00064 // Save away a pointer to the list of file names
00065 // I've checked the source of libarg.c -- it
00066 // doesn't free anything, so this is safe.
00067 
00068 files = argv;
00069 numFiles = argc;
00070 }
00071 
00072  Void GCLApp::GetAvarArgs(Int argc, Char *argv[])
00073 {
00074 Int i;
00075 String suffix;
00076 
00077 for (i = 0; i < argc; )
00078 {
00079 StrConst avarName = argv[i++];
00080 
00081 DBG_COUT << "looking at " << avarName << " suff = " << avarName.Suffix(2) << endl;
00082 
00083 suffix = avarName.Suffix(2);
00084 if (suffix == "_c" || suffix == "_v" || suffix == "_q")
00085 {
00086 String stub, newAvar;
00087 
00088 stub = avarName.Prefix(-2);
00089 
00090 DBG_COUT << "got vector type " << stub << endl;
00091 
00092 newAvar.Printf("%s_x", stub.CString());
00093 avarNames.Append(newAvar.Detach());
00094 avarVals.Append(atof(argv[i++]));
00095 newAvar.Printf("%s_y", stub.CString());
00096 avarNames.Append(newAvar.Detach());
00097 avarVals.Append(atof(argv[i++]));
00098 if (suffix[1] == 'v' || suffix[1] == 'q')
00099 {
00100 newAvar.Printf("%s_z", stub.CString());
00101 avarNames.Append(newAvar.Detach());
00102 avarVals.Append(atof(argv[i++]));
00103 }
00104 if (suffix[1] == 'q')
00105 {
00106 newAvar.Printf("%s_w", stub.CString());
00107 avarNames.Append(newAvar.Detach());
00108 avarVals.Append(atof(argv[i++]));
00109 }
00110 }
00111 else
00112 {
00113 avarNames.Append(avarName);
00114 avarVals.Append(atof(argv[i++]));
00115 } 
00116 }
00117 
00118 if (i != argc)
00119 {
00120 cerr << "Error: wrong number of avar arguments." << endl;
00121 exit(1);
00122 }
00123 }
00124 
00125  Void GCLApp::SetAvars(scScenePtr scene)
00126 {
00127 Int i;
00128 CreateAvarList theAvarList;
00129 
00130 frame = -1;
00131 
00132 scene->ApplyAction(theAvarList);
00133 
00134 #ifdef DEBUG
00135 cout << "set avars:" << endl;
00136 for (i = 0; i < avarNames.NumItems(); i++)
00137 cout << "avar " << avarNames[i] << " = " << avarVals[i] << endl;
00138 cout << "scene avars:" << endl;
00139 for (i = 0; i < theAvarList.avarList->NumItems(); i++)
00140 cout << theAvarList.avarList->Item(i).name << " = " 
00141 << theAvarList.avarList->Item(i).value << endl;
00142 #endif
00143 
00144 scene->Set(theAvarList.avarList);
00145 
00146 for (i = 0; i < avarNames.NumItems(); i++)
00147 {
00148 StrConst avarName = avarNames[i];
00149 
00150 if (avarName == "frame")
00151 frame = (Int) avarVals[i];
00152 else if (avarName == "time")
00153 time = avarVals[i];
00154 else if (itsCamera->CheckAvar(avarName, avarVals[i]))
00155 ;
00156 else if (!theAvarList.avarList->SetAvar(avarNames[i], avarVals[i]))
00157 cerr << "No such avar in scene: " << avarNames[i] 
00158 << " (ignoring) " << endl;
00159 }
00160 
00161 itsCamera->SetupFromParams();
00162 }
00163 
00164  Void GCLApp::SetAvarsFromAnim(scScenePtr scene)
00165 {
00166 if (!avarList)
00167 {
00168 avarList = (scAvarList*) scene->FindFirst(aAvarList);
00169 
00170 if (!avarList)
00171 {
00172 CreateAvarList theAvarList;
00173 
00174 cout << "creating avar list" << endl;
00175 scene->ApplyAction(theAvarList);
00176 scene->Set(theAvarList.avarList);
00177 avarList = theAvarList.avarList;
00178 }
00179 }
00180 
00181 time = (frame - 1.0) / fps;
00182 if (anim)
00183 anim->SetAvarList(avarList, itsCamera, time);
00184 }
00185 
00186  ArgForm *GCLApp::GetOptionList()
00187 {
00188 #ifdef UNFINISHED
00189 return(arg_to_form(0,
00190 "-bgr %F", &grey,
00191 "Set background grey level",
00192 "-bgc %F %F %F", clr, clr + 1, clr + 2, 
00193 "Set colour background",
00194 "-defClr %F %F %F", defClr, defClr + 1, defClr + 2, 
00195 "Set default model colour",
00196 "-noScale", ARG_FLAG(&noScale),
00197 "Don't rescale scene.",
00198 // "-wire", ARG_FLAG(&wireFrame),
00199 // "Draw wire-frame.",
00200 "-zup", ARG_FLAG(&zUp),
00201 "Z axis is up (default is Y)",
00202 "-zdown", ARG_FLAG(&zDown),
00203 "Z axis is down",
00204 // "-noLight", ARG_FLAG(&noLight),
00205 // "no lighting",
00206 // "-showBF", ARG_FLAG(&showBF),
00207 // "show back faces of polygons",
00208 
00209 // "-anim %S", &animFile, "specify animation file",
00210 "-fps %F", &fps, "set frames per sec [default 24]",
00211 // "-start %d", &startFrame, "start frame [1]",
00212 // "-end %d", &endFrame, "end frame [24]",
00213 // "-step %d", &frameStep, "frame step [1]",
00214 
00215 "-set", ARG_SUBR(GetAvarArgs),
00216 "Set avar, e.g. -set light 0.5 height 0.2",
00217 
00218 // Output options 
00219 // "-size %d", &size,
00220 // "Set output size",
00221 "-xysize %d %d", &xsize, &ysize,
00222 "Set output size",
00223 0)
00224 );
00225 #else
00226 return(0);
00227 #endif
00228 }

Generated at Sat Aug 5 00:16:59 2000 for Graphics Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000

AltStyle によって変換されたページ (->オリジナル) /