00001 #include "Basis/CmdOptions.h"
00002 #include "Basis/Timer.h"
00003 #include "Core/Array/MakeFromData.h"
00004 #include "Core/Array/RGB2Intensity.h"
00005 #include "Core/Array/PixMin.h"
00006 #include "Core/Array/PixMax.h"
00007 #include "Core/Array/GetRgbPixels.h"
00008 #include "Core/Array/GaussDerivative.h"
00009 #include "Core/Array/Mul.h"
00010 #include "Core/Array/Add.h"
00011 #include "Core/Array/ColorSpace.h"
00012 #include "Core/Array/ProjectRange.h"
00013 #include "Core/Array/Sub.h"
00014 #include "Core/Array/Norm2Sqr.h"
00015 #include "Core/Array/InvLvvLw2.h"
00016 #include "Core/Array/InvEw.h"
00017 #include "Core/Array/InvWw.h"
00018 #include "Core/Array/InvCw.h"
00019 #include "Core/Array/InvNw.h"
00020 #include "Core/Array/InvHw.h"
00021 #include "Core/Array/InvRGBw.h"
00022 #include "Core/Array/InvANGw.h"
00023 #include "Core/Array/InvANG2w.h"
00024 #include "Core/Array/InvJOSAw.h"
00025 #include "Core/Array/InvOBw.h"
00026 #include "Core/Array/InvHUEw.h"
00027 #include "Core/Array/InvCompDer.h"
00028 #include "Core/Array/ArrayListDelete.h"
00029 #include "Core/Stream/RgbDataSrcFactory.h"
00030 #include "Visualization/Window.h"
00031 #include "Visualization/AppControlSrc.h"
00032
00033
00034 #include "OglGui/OglLib.cpp"
00035 #include "Link/ImpalaLib.cpp"
00036
00037 namespace Impala
00038 {
00039 namespace Application
00040 {
00041 namespace DemoCamera2d
00042 {
00043
00044
00045 using namespace Impala::Visualization;
00046 using namespace Impala::Core::Array;
00047 using namespace Impala::Core::Stream;
00048
00049 Impala::Visualization::Window* oglWnd = 0;
00050
00051
00052 int verbose = 0;
00053 Real64 sigma = 2.0;
00054 Real64 precision = 3.0;
00055 std::string demo[10] = {"source", "njet", "e", "einv", "rgb", "rgbinv", "compinv"};
00056 int nrDemo = 7;
00057 int curDemo = 0;
00058 std::string disp0Mode("Stretch");
00059 std::string disp1Mode("Stretch");
00060 std::string disp2Mode("LogMagnitude");
00061 Real64 logScale = 32.0;
00062
00063
00064 Array2dVec3Real64* srcV;
00065 std::vector<Array2dScalarReal64*> lList;
00066 std::vector<Array2dScalarReal64*> eList;
00067 std::vector<Array2dScalarReal64*> rgbList;
00068 Array2dScalarReal64* funcRes;
00069
00070
00071
00072
00073 void
00074 DoLw2()
00075 {
00076 if (verbose == 1)
00077 std::cout << "DoLw2 " << std::endl;
00078
00079 funcRes = 0;
00080 Norm2Sqr(funcRes, lList[1], lList[2]);
00081 }
00082
00083 void
00084 DoLvvLw2()
00085 {
00086 if (verbose == 1)
00087 std::cout << "DoLvvLw2 " << std::endl;
00088 funcRes = 0;
00089 InvLvvLw2<Array2dScalarReal64>(funcRes, lList);
00090 }
00091
00092
00093
00094 void
00095 DoEw()
00096 {
00097 if (verbose == 1)
00098 std::cout << "DoEw " << std::endl;
00099 funcRes = 0;
00100 InvEw<Array2dScalarReal64>(funcRes, eList);
00101 }
00102
00103 void
00104 DoWw()
00105 {
00106 if (verbose == 1)
00107 std::cout << "DoWw " << std::endl;
00108 funcRes = 0;
00109 InvWw<Array2dScalarReal64>(funcRes, eList, sigma);
00110 }
00111
00112 void
00113 DoCw()
00114 {
00115 if (verbose == 1)
00116 std::cout << "DoCw " << std::endl;
00117 funcRes = 0;
00118 InvCw<Array2dScalarReal64>(funcRes, eList, sigma);
00119 }
00120
00121 void
00122 DoNw()
00123 {
00124 if (verbose == 1)
00125 std::cout << "DoNw " << std::endl;
00126 funcRes = 0;
00127 InvNw<Array2dScalarReal64>(funcRes, eList, sigma);
00128 }
00129
00130 void
00131 DoHw()
00132 {
00133 if (verbose == 1)
00134 std::cout << "DoHw " << std::endl;
00135 funcRes = 0;
00136 InvHw<Array2dScalarReal64>(funcRes, eList, sigma);
00137 }
00138
00139 void
00140 DoCw_log()
00141 {
00142 if (verbose == 1)
00143 std::cout << "DoCw_log " << std::endl;
00144 funcRes = 0;
00145 InvCw_log<Array2dScalarReal64>(funcRes, eList, sigma);
00146 }
00147
00148 void
00149 DoNw_log()
00150 {
00151 if (verbose == 1)
00152 std::cout << "DoNw_log " << std::endl;
00153 funcRes = 0;
00154 InvNw_log<Array2dScalarReal64>(funcRes, eList, sigma);
00155 }
00156
00157 void
00158 DoHw_log()
00159 {
00160 if (verbose == 1)
00161 std::cout << "DoHw_log " << std::endl;
00162 funcRes = 0;
00163 InvHw_log<Array2dScalarReal64>(funcRes, eList, sigma);
00164 }
00165
00166
00167
00168 void
00169 DoRGBw()
00170 {
00171 if (verbose == 1)
00172 std::cout << "DoRGBw " << std::endl;
00173 funcRes = 0;
00174 InvRGBw<Array2dScalarReal64>(funcRes, rgbList);
00175 }
00176
00177 void
00178 DoANGw()
00179 {
00180 if (verbose == 1)
00181 std::cout << "DoANGw " << std::endl;
00182 funcRes = 0;
00183 InvANGw<Array2dScalarReal64>(funcRes, rgbList);
00184 }
00185
00186 void
00187 DoANG2w()
00188 {
00189 if (verbose == 1)
00190 std::cout << "DoANG2w " << std::endl;
00191 funcRes = 0;
00192 InvANG2w<Array2dScalarReal64>(funcRes, rgbList);
00193 }
00194
00195 void
00196 DoJOSAw()
00197 {
00198 if (verbose == 1)
00199 std::cout << "DoJOSAw " << std::endl;
00200 funcRes = 0;
00201 InvJOSAw<Array2dScalarReal64>(funcRes, rgbList);
00202 }
00203
00204 void
00205 DoOBw()
00206 {
00207 if (verbose == 1)
00208 std::cout << "DoOBw " << std::endl;
00209 funcRes = 0;
00210 InvOBw<Array2dScalarReal64>(funcRes, rgbList);
00211 }
00212
00213 void
00214 DoHUEw()
00215 {
00216 if (verbose == 1)
00217 std::cout << "DoHUEw " << std::endl;
00218 funcRes = 0;
00219 InvHUEw<Array2dScalarReal64>(funcRes, rgbList);
00220 }
00221
00222
00223 typedef void (*PINVF)();
00224
00225
00226 class InvInfo
00227 {
00228 public:
00229 InvInfo()
00230 {
00231 mActive = false;
00232 }
00233
00234 InvInfo(std::string name, int imIdx, bool reqL, bool reqE, bool reqRGB,
00235 PINVF func, std::string displayMode)
00236 {
00237 mName = name;
00238 mImIdx = imIdx;
00239 mReqL = reqL;
00240 mReqE = reqE;
00241 mReqRGB = reqRGB;
00242 mFunc = func;
00243 mDisplayMode = displayMode;
00244 mActive = true;
00245 }
00246
00247 bool mActive;
00248 std::string mName;
00249 int mImIdx;
00250 bool mReqL;
00251 bool mReqE;
00252 bool mReqRGB;
00253 PINVF mFunc;
00254 std::string mDisplayMode;
00255 };
00256
00257
00258
00259 InvInfo basicInvs[] = {
00260 InvInfo("Source", 0, false, false, false, 0, ""),
00261 InvInfo("L", 0, true, false, false, 0, "DirectNC"),
00262 InvInfo("Lx", 1, true, false, false, 0, disp1Mode),
00263 InvInfo("Ly", 2, true, false, false, 0, disp1Mode),
00264 InvInfo("Lxx", 3, true, false, false, 0, disp1Mode),
00265 InvInfo("Lxy", 4, true, false, false, 0, disp1Mode),
00266 InvInfo("Lyy", 5, true, false, false, 0, disp1Mode),
00267 InvInfo("E", 0, false, true, false, 0, disp0Mode),
00268 InvInfo("El", 3, false, true, false, 0, disp0Mode),
00269 InvInfo("Ell", 6, false, true, false, 0, disp0Mode),
00270 InvInfo("Ex", 1, false, true, false, 0, disp1Mode),
00271 InvInfo("Elx", 4, false, true, false, 0, disp1Mode),
00272 InvInfo("Ellx", 7, false, true, false, 0, disp1Mode),
00273 InvInfo("Ey", 2, false, true, false, 0, disp1Mode),
00274 InvInfo("Ely", 5, false, true, false, 0, disp1Mode),
00275 InvInfo("Elly", 8, false, true, false, 0, disp1Mode),
00276 InvInfo("R", 0, false, false, true, 0, disp0Mode),
00277 InvInfo("G", 3, false, false, true, 0, disp0Mode),
00278 InvInfo("B", 6, false, false, true, 0, disp0Mode),
00279 InvInfo("Rx", 1, false, false, true, 0, disp1Mode),
00280 InvInfo("Gx", 4, false, false, true, 0, disp1Mode),
00281 InvInfo("Bx", 7, false, false, true, 0, disp1Mode),
00282 InvInfo("Ry", 2, false, false, true, 0, disp1Mode),
00283 InvInfo("Gy", 5, false, false, true, 0, disp1Mode),
00284 InvInfo("By", 8, false, false, true, 0, disp1Mode)
00285 };
00286 int nrBasicInvs = 25;
00287
00288
00289 InvInfo compoundInvs[] = {
00290 InvInfo("Lw2", -1, true, false, false, DoLw2, disp2Mode),
00291 InvInfo("LvvLw2", -1, true, false, false, DoLvvLw2, disp1Mode),
00292 InvInfo("Ew", -1, false, true, false, DoEw, disp2Mode),
00293 InvInfo("Ww", -1, false, true, false, DoWw, disp2Mode),
00294 InvInfo("Cw", -1, false, true, false, DoCw, disp2Mode),
00295 InvInfo("Nw", -1, false, true, false, DoNw, disp2Mode),
00296 InvInfo("Hw", -1, false, true, false, DoHw, disp2Mode),
00297 InvInfo("Cw_log", -1, false, true, false, DoCw_log, disp2Mode),
00298 InvInfo("Nw_log", -1, false, true, false, DoNw_log, disp2Mode),
00299 InvInfo("Hw_log", -1, false, true, false, DoHw_log, disp2Mode),
00300 InvInfo("RGBw", -1, false, false, true, DoRGBw, disp2Mode),
00301 InvInfo("ANGw", -1, false, false, true, DoANGw, disp2Mode),
00302 InvInfo("ANG2w", -1, false, false, true, DoANG2w, disp2Mode),
00303 InvInfo("JOSAw", -1, false, false, true, DoJOSAw, disp2Mode),
00304 InvInfo("OBw", -1, false, false, true, DoOBw, disp2Mode),
00305 InvInfo("HUEw", -1, false, false, true, DoHUEw, disp2Mode)
00306 };
00307 int nrCompoundInvs = 16;
00308
00309
00310
00311 std::vector<InvInfo> curInvList;
00312
00313
00314
00315 void
00316 DemoSource()
00317 {
00318
00319 }
00320
00321 void
00322 DemoCompInv()
00323 {
00324 curInvList.push_back(basicInvs[1]);
00325 curInvList.push_back(compoundInvs[0]);
00326 curInvList.push_back(compoundInvs[2]);
00327 curInvList.push_back(compoundInvs[3]);
00328 curInvList.push_back(compoundInvs[4]);
00329 curInvList.push_back(compoundInvs[12]);
00330 curInvList.push_back(compoundInvs[11]);
00331 curInvList.push_back(compoundInvs[14]);
00332 }
00333
00334 void
00335 DemoNJet()
00336 {
00337 curInvList.push_back(basicInvs[0]);
00338 curInvList.push_back(basicInvs[1]);
00339 curInvList.push_back(basicInvs[2]);
00340 curInvList.push_back(basicInvs[3]);
00341 curInvList.push_back(basicInvs[4]);
00342 curInvList.push_back(basicInvs[5]);
00343 curInvList.push_back(basicInvs[6]);
00344
00345 curInvList.push_back(compoundInvs[0]);
00346 curInvList.push_back(compoundInvs[1]);
00347 }
00348
00349 void
00350 DemoE()
00351 {
00352 curInvList.push_back(basicInvs[7]);
00353 curInvList.push_back(basicInvs[8]);
00354 curInvList.push_back(basicInvs[9]);
00355 curInvList.push_back(basicInvs[10]);
00356 curInvList.push_back(basicInvs[11]);
00357 curInvList.push_back(basicInvs[12]);
00358 curInvList.push_back(basicInvs[13]);
00359 curInvList.push_back(basicInvs[14]);
00360 curInvList.push_back(basicInvs[15]);
00361 }
00362
00363 void
00364 DemoEinv()
00365 {
00366 curInvList.push_back(basicInvs[0]);
00367 curInvList.push_back(compoundInvs[2]);
00368 curInvList.push_back(compoundInvs[3]);
00369 curInvList.push_back(compoundInvs[4]);
00370 curInvList.push_back(compoundInvs[5]);
00371 curInvList.push_back(compoundInvs[6]);
00372 curInvList.push_back(compoundInvs[7]);
00373 curInvList.push_back(compoundInvs[8]);
00374 curInvList.push_back(compoundInvs[9]);
00375 }
00376
00377 void
00378 DemoRGB()
00379 {
00380 curInvList.push_back(basicInvs[16]);
00381 curInvList.push_back(basicInvs[17]);
00382 curInvList.push_back(basicInvs[18]);
00383 curInvList.push_back(basicInvs[19]);
00384 curInvList.push_back(basicInvs[20]);
00385 curInvList.push_back(basicInvs[21]);
00386 curInvList.push_back(basicInvs[22]);
00387 curInvList.push_back(basicInvs[23]);
00388 curInvList.push_back(basicInvs[24]);
00389 }
00390
00391 void
00392 DemoRGBinv()
00393 {
00394 curInvList.push_back(basicInvs[0]);
00395 curInvList.push_back(compoundInvs[10]);
00396 curInvList.push_back(compoundInvs[11]);
00397 curInvList.push_back(compoundInvs[12]);
00398 curInvList.push_back(compoundInvs[13]);
00399 curInvList.push_back(compoundInvs[14]);
00400 curInvList.push_back(compoundInvs[15]);
00401 curInvList.push_back(basicInvs[0]);
00402 curInvList.push_back(basicInvs[0]);
00403 }
00404
00405 void
00406 SetCurDemo(std::string d)
00407 {
00408 curInvList.clear();
00409 if (oglWnd)
00410 oglWnd->DeleteViewers();
00411
00412 for (int i=0 ; i<nrDemo ; i++)
00413 if (demo[i] == d)
00414 curDemo = i;
00415
00416 switch (curDemo) {
00417 case 0: DemoSource(); break;
00418 case 1: DemoNJet(); break;
00419 case 2: DemoE(); break;
00420 case 3: DemoEinv(); break;
00421 case 4: DemoRGB(); break;
00422 case 5: DemoRGBinv(); break;
00423 case 6: DemoCompInv(); break;
00424 default: DemoCompInv(); break;
00425 }
00426 }
00427
00428
00429 class WindowCamera2d : public Window, public AppControlSrc
00430 {
00431 public:
00432
00433 WindowCamera2d(RgbDataSrc* src) :
00434 Window(0, 0, SuggestWndWidth(3, src->FrameWidth()),
00435 SuggestWndHeight(3, src->FrameHeight()) + 25, true),
00436 AppControlSrc(1)
00437 {
00438 CmdOptions& options = CmdOptions::GetInstance();
00439 SetSrc(src);
00440 AppController::Instance().AddControl((AppControlSrc*) this, true);
00441 mViewScale = options.GetDouble("viewScale");
00442 AppController::Instance().MainLoop();
00443 }
00444
00445
00446 template<class ArrayT>
00447 void
00448 DisplayIm(ArrayT* im, std::string displayMode, std::string viewName)
00449 {
00450 UpdateView(mCurView, im, displayMode, mViewScale);
00451 SetViewText(mCurView, viewName);
00452 mCurView++;
00453 }
00454
00455 void
00456 HandleNewFrame()
00457 {
00458 UpdateView(0, GetSrc()->DataPtr(), GetSrc()->FrameWidth(),
00459 GetSrc()->FrameHeight(), mViewScale);
00460
00461 ArraySystem& aSys = ArraySystem::Instance();
00462 aSys.MarkMemoryUsage(verbose > 0);
00463
00464 MakeFromData2<Array2dVec3Real64,Array2dVec3UInt8>(srcV, GetSrc()->DataPtr());
00465
00466 bool oneReqL = false;
00467 bool oneReqE = false;
00468 bool oneReqRGB = false;
00469 int i;
00470 for (i=0 ; i<curInvList.size() ; i++)
00471 {
00472 if (curInvList[i].mReqL)
00473 oneReqL = true;
00474 if (curInvList[i].mReqE)
00475 oneReqE = true;
00476 if (curInvList[i].mReqRGB)
00477 oneReqRGB = true;
00478 }
00479 if (oneReqL)
00480 {
00481 Array2dScalarReal64* l = 0;
00482 RGB2Intensity(l, srcV);
00483 lList = InvCompDer(l, sigma, precision, false);
00484 delete l;
00485 }
00486 if (oneReqE)
00487 {
00488 Array2dVec3Real64* ooo = 0;
00489 ColorSpace(ooo, srcV, Element::RGB, Element::OOO);
00490 eList = InvCompDer(ooo, sigma, precision, false);
00491 delete ooo;
00492 }
00493 if (oneReqRGB)
00494 rgbList = InvCompDer(srcV, sigma, precision, false);
00495 mCurView = 1;
00496 for (i=0 ; i<curInvList.size() ; i++)
00497 {
00498 InvInfo cI = curInvList[i];
00499 if (cI.mFunc)
00500 cI.mFunc();
00501 if (verbose == 1)
00502 std::cout << "Displaying " << i << " = " << cI.mName << std::endl;
00503 if (cI.mFunc)
00504 {
00505 DisplayIm(funcRes, cI.mDisplayMode, cI.mName);
00506 delete funcRes;
00507 }
00508 else
00509 {
00510 if (cI.mReqL)
00511 DisplayIm(lList[cI.mImIdx], cI.mDisplayMode, cI.mName);
00512 if (cI.mReqE)
00513 DisplayIm(eList[cI.mImIdx], cI.mDisplayMode, cI.mName);
00514 if (cI.mReqRGB)
00515 DisplayIm(rgbList[cI.mImIdx], cI.mDisplayMode, cI.mName);
00516 }
00517 }
00518 ArrayListDelete(&lList);
00519 ArrayListDelete(&eList);
00520 ArrayListDelete(&rgbList);
00521
00522 aSys.CheckMemoryUsageSinceMark(verbose > 0);
00523 }
00524
00525 void
00526 HandleCycleSrc()
00527 {
00528 mOglWnd->updateScene = 1;
00529 SetStatusStr((char*) GetFpsString().c_str());
00530 }
00531
00532
00533
00534 virtual void
00535 MouseFunc(INT msg, INT but, INT state, INT x, INT y)
00536 {
00537 Window::MouseFunc(msg, but, state, x, y);
00538
00539 if ((msg == oglMouseDown) && (but == oglRightButton))
00540 {
00541 OGLMENU menu, subMenu1, subMenu2, subMenu3;
00542 int choice, i;
00543 menu = oglSys.MenuCreate();
00544 subMenu1 = oglSys.MenuCreate();
00545 oglSys.MenuAdd(menu, "demo preset", subMenu1, 0);
00546 for (i=0 ; i<nrDemo ; i++)
00547 {
00548 oglSys.MenuAdd(subMenu1, (char *) demo[i].c_str(), 0, 1000+i);
00549 if (curDemo == i)
00550 oglSys.MenuCheck(menu, 1000+i, 1);
00551 }
00552 subMenu2 = oglSys.MenuCreate();
00553 oglSys.MenuAdd(menu, "add basic", subMenu2, 0);
00554 for (i=0 ; i<nrBasicInvs ; i++)
00555 {
00556 oglSys.MenuAdd(subMenu2, (char *) basicInvs[i].mName.c_str(), 0,
00557 2000+i);
00558 }
00559 subMenu3 = oglSys.MenuCreate();
00560 oglSys.MenuAdd(menu, "add compound", subMenu3, 0);
00561 for (i=0 ; i<nrCompoundInvs ; i++)
00562 {
00563 oglSys.MenuAdd(subMenu3, (char *) compoundInvs[i].mName.c_str(), 0,
00564 3000+i);
00565 }
00566 oglSys.MenuAdd(menu, NULL, 0, 0);
00567 oglSys.MenuAdd(menu, "fps reset", 0, 2);
00568
00569 choice = oglSys.MenuPopUp(mOglWnd, menu);
00570
00571 if (choice >= 3000)
00572 {
00573 int cInv = choice - 3000;
00574 curInvList.push_back(compoundInvs[cInv]);
00575 }
00576 else if (choice >= 2000)
00577 {
00578 int bInv = choice - 2000;
00579 curInvList.push_back(basicInvs[bInv]);
00580 }
00581 else if (choice >= 1000)
00582 {
00583 curDemo = choice - 1000;
00584 SetCurDemo(demo[curDemo]);
00585 }
00586 else
00587 {
00588 switch (choice)
00589 {
00590 case 2:
00591 FpsReset();
00592 break;
00593 }
00594 }
00595
00596
00597 oglSys.MenuDestroy(menu);
00598 oglSys.MenuDestroy(subMenu1);
00599 oglSys.MenuDestroy(subMenu2);
00600 oglSys.MenuDestroy(subMenu3);
00601 oglSys.UpdateSceneFlag(mOglWnd, 1);
00602 }
00603 }
00604
00605 private:
00606
00607 double mViewScale;
00608 int mCurView;
00609
00610 };
00611
00612 int
00613 mainDemoCamera2d(int argc, char* argv[])
00614 {
00615 CmdOptions& options = CmdOptions::GetInstance();
00616 options.Initialise(true, true);
00617 std::string demoAlt("");
00618 for (int i=0 ; i<nrDemo ; i++)
00619 {
00620 demoAlt += demo[i];
00621 if (i != nrDemo-1)
00622 demoAlt += "|";
00623 }
00624 options.AddOption(0, "demo", "name", "compinv", (char*) demoAlt.c_str());
00625 options.AddOption(0, "file", "name", "camera");
00626
00627 if (! options.ParseArgs(argc, argv, "", 0))
00628 return 1;
00629
00630 SetCurDemo(options.GetString("demo"));
00631 verbose = options.GetInt("verb");
00632 sigma = options.GetDouble("sigma");
00633 precision = options.GetDouble("precision");
00634 logScale = options.GetDouble("logScale");
00635 std::string srcName = options.GetString("file");
00636
00637 RgbDataSrcFactory& factory = RgbDataSrcFactory::Instance();
00638 RgbDataSrc* src = factory.Construct(srcName, options.GetString("src"));
00639 if (! src->Valid())
00640 {
00641 std::cout << "RgbDataSrc failed" << std::endl;
00642 return 0;
00643 }
00644 std::cout << src->LastFrame()+1 << " frames of " << src->FrameWidth()
00645 << " x " << src->FrameHeight() << std::endl;
00646
00647 std::cout << "demo = " << demo[curDemo] << std::endl;
00648 std::cout << "sigma = " << sigma << ", precision = " << precision << std::endl;
00649 std::cout << "logScale = " << logScale << std::endl;
00650
00651 Array2dScalarReal64* g = 0;
00652 g = MakeGaussian1d(sigma, 2, precision, 100);
00653 int borderSize = g->CW();
00654 delete g;
00655
00656 srcV = ArrayCreate<Array2dVec3Real64>(src->FrameWidth(), src->FrameHeight(),
00657 borderSize, borderSize);
00658
00659
00660 oglWnd = new WindowCamera2d(src);
00661 if (! oglWnd->Valid())
00662 {
00663 std::cout << "WindowCamera2d failed" << std::endl;
00664 return 0;
00665 }
00666 return 1;
00667 }
00668
00669 }
00670 }
00671 }
00672
00673 int
00674 main(int argc, char* argv[])
00675 {
00676 return Impala::Application::DemoCamera2d::mainDemoCamera2d(argc, argv);
00677 }