From 95daf86ce299eb71823b8e4e7ac96aea0b4fc0a6 Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Sat, 29 Jan 2011 08:46:28 +0000 Subject: [PATCH] - more bugfixes related to g3d viewer commandline options --- source/g3d_viewer/main.cpp | 180 +++++++++++++++++++++++++------------ 1 file changed, 123 insertions(+), 57 deletions(-) diff --git a/source/g3d_viewer/main.cpp b/source/g3d_viewer/main.cpp index c166a3d7..daddfdde 100644 --- a/source/g3d_viewer/main.cpp +++ b/source/g3d_viewer/main.cpp @@ -131,7 +131,7 @@ void printParameterHelp(const char *argv0, bool foundInvalidArgs) { printf("\n%s=x\t\t\tAuto load the unit / skill information specified in path/filename x",(const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_LOAD_UNIT])); printf("\n \t\tWhere x is a g3d filename to load seperated with a comma and one or more skill names to try loading:"); - printf("\n \t\texample: %s %s=techs/megapack/factions/tech/units/battle_machine,attack_skill,stop_skill",argv0,(const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_LOAD_MODEL])); + printf("\n \t\texample: %s %s=techs/megapack/factions/tech/units/battle_machine,attack_skill,stop_skill",argv0,(const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_LOAD_UNIT])); printf("\n%s=x\t\t\tAuto load the model specified in path/filename x",(const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_LOAD_MODEL])); printf("\n \t\tWhere x is a g3d filename to load:"); @@ -187,16 +187,19 @@ MainWindow::MainWindow( std::pair > unitToLoad, float defaultAnimation, int defaultParticleLoopStart, float defaultZoom,float defaultXRot, float defaultYRot) - : wxFrame(NULL, -1, ToUnicode(winHeader),wxPoint(Renderer::windowX, Renderer::windowY), - wxSize(Renderer::windowW, Renderer::windowH)) + : wxFrame(NULL, -1, ToUnicode(winHeader), + wxPoint(Renderer::windowX, Renderer::windowY), + wxSize(Renderer::windowW, Renderer::windowH)) { //getGlPlatformExtensions(); renderer= Renderer::getInstance(); + model= NULL; unitPath = unitToLoad; if(modelPath != "") { this->modelPathList.push_back(modelPath); + printf("Startup Adding model [%s] list size %d\n",modelPath.c_str(),this->modelPathList.size()); } if(particlePath != "") { this->particlePathList.push_back(particlePath); @@ -216,8 +219,6 @@ MainWindow::MainWindow( std::pair > unitToLoad, rotX= defaultXRot; rotY= defaultYRot; zoom= defaultZoom; - - model= NULL; playerColor= Renderer::pcRed; speed= 0.025f; @@ -326,7 +327,6 @@ MainWindow::MainWindow( std::pair > unitToLoad, SetMenuBar(menu); //misc - model= NULL; backBrightness= 0.3f; gridBrightness= 1.0f; lightBrightness= 0.3f; @@ -368,9 +368,13 @@ MainWindow::MainWindow( std::pair > unitToLoad, MainWindow::~MainWindow(){ delete renderer; + renderer = NULL; delete model; + model = NULL; delete timer; + timer = NULL; delete glCanvas; + glCanvas = NULL; } @@ -383,6 +387,9 @@ void MainWindow::init() { } void MainWindow::onPaint(wxPaintEvent &event){ + //printf("Start onPaint\n"); + //fflush(stdout); + renderer->reset(GetClientSize().x, GetClientSize().y, playerColor); renderer->transform(rotX, rotY, zoom); @@ -392,7 +399,6 @@ void MainWindow::onPaint(wxPaintEvent &event){ renderer->renderTheModel(model, anim); - //int updateLoops = 100; int updateLoops = particleLoopStart; particleLoopStart = 1; @@ -403,25 +409,54 @@ void MainWindow::onPaint(wxPaintEvent &event){ renderer->renderParticleManager(); glCanvas->SwapBuffers(); + bool haveLoadedParticles = (particleProjectilePathList.size() > 0 || particleSplashPathList.size() > 0); + if(autoScreenShotAndExit == true) { + printf("Auto exiting app...\n"); + fflush(stdout); + autoScreenShotAndExit = false; saveScreenshot(); Close(); + return; } - else if(resetAnimation) { - bool haveLoadedParticles = (particleProjectilePathList.size() > 0 || particleSplashPathList.size() > 0); - if(haveLoadedParticles) { - // renderer->hasActiveParticleSystem(ParticleSystem::pst_ProjectileParticleSystem) == false && - // renderer->hasActiveParticleSystem(ParticleSystem::pst_SplashParticleSystem) == false) { + else if((modelPathList.size() > 0) && resetAnimation && haveLoadedParticles) { + if(anim >= resetAnim && resetAnim > 0) { + printf("RESETTING EVERYTHING [%f][%f]...\n",anim,resetAnim); + fflush(stdout); - if(anim >= resetAnim) { - resetAnimation = false; - //anim = resetAnim; - particleLoopStart = resetParticleLoopStart; + resetAnimation = false; + particleLoopStart = resetParticleLoopStart; + + wxCommandEvent event; + if(unitPath.first != "") { + //onMenuFileClearAll(event); + + modelPathList.clear(); + particlePathList.clear(); + particleProjectilePathList.clear(); + particleSplashPathList.clear(); // as above - wxCommandEvent event; onMenuRestart(event); } + else { + onMenuRestart(event); + } + } + } + else if(modelPathList.size() == 0 && haveLoadedParticles) { + if(renderer->hasActiveParticleSystem(ParticleSystem::pst_ProjectileParticleSystem) == false && + renderer->hasActiveParticleSystem(ParticleSystem::pst_SplashParticleSystem) == false) { + + printf("RESETTING PARTICLES...\n"); + fflush(stdout); + + resetAnimation = false; + anim = 0.f; + particleLoopStart = resetParticleLoopStart; + + wxCommandEvent event; + onMenuRestart(event); } } } @@ -429,6 +464,9 @@ void MainWindow::onPaint(wxPaintEvent &event){ void MainWindow::onClose(wxCloseEvent &event){ // release memory first (from onMenuFileClearAll) + printf("OnClose START\n"); + fflush(stdout); + modelPathList.clear(); particlePathList.clear(); particleProjectilePathList.clear(); @@ -448,6 +486,9 @@ void MainWindow::onClose(wxCloseEvent &event){ delete model; model = NULL; + printf("OnClose about to END\n"); + fflush(stdout); + delete this; } @@ -703,6 +744,9 @@ void MainWindow::onMenuFileSaveScreenshot(wxCommandEvent &event) { void MainWindow::onMenuFileClearAll(wxCommandEvent &event) { try { + printf("Start onMenuFileClearAll\n"); + fflush(stdout); + modelPathList.clear(); particlePathList.clear(); particleProjectilePathList.clear(); @@ -722,14 +766,19 @@ void MainWindow::onMenuFileClearAll(wxCommandEvent &event) { delete model; model = NULL; + loadUnit("",""); loadModel(""); loadParticle(""); loadProjectileParticle(""); loadSplashParticle(""); // as above GetStatusBar()->SetStatusText(ToUnicode(statusbarText.c_str())); - timer->Start(100); isControlKeyPressed = false; + + printf("END onMenuFileClearAll\n"); + fflush(stdout); + + timer->Start(100); } catch(std::runtime_error e) { std::cout << e.what() << std::endl; @@ -742,10 +791,6 @@ void MainWindow::onMenuFileExit(wxCommandEvent &event) { } void MainWindow::loadUnit(string path, string skillName) { - timer->Stop(); - wxCommandEvent event; - onMenuFileClearAll(event); - if(path != "" && fileExists(path) == true) { // std::cout << "Clearing list..." << std::endl; this->unitPath.first = path; @@ -754,7 +799,10 @@ void MainWindow::loadUnit(string path, string skillName) { try{ if(this->unitPath.first != "") { - string titlestring = winHeader; + timer->Stop(); + renderer->end(); + + string titlestring = winHeader; string unitPath = this->unitPath.first; string dir = unitPath; @@ -782,15 +830,18 @@ void MainWindow::loadUnit(string path, string skillName) { string lookipForSkillName = this->unitPath.second[skillIdx]; const XmlNode *skillsNode= unitNode->getChild("skills"); - for(int i = 0; i < skillsNode->getChildCount(); ++i) { + for(int i = 0; foundSkillName == false && i < skillsNode->getChildCount(); ++i) { const XmlNode *sn= skillsNode->getChild("skill", i); const XmlNode *typeNode= sn->getChild("type"); const XmlNode *nameNode= sn->getChild("name"); string skillXmlName = nameNode->getAttribute("value")->getRestrictedValue(); if(skillXmlName == lookipForSkillName) { + printf("Found skill [%s]\n",lookipForSkillName.c_str()); foundSkillName = true; + if(sn->getChild("animation") != NULL) { skillModelFile = unitPath + '/' + sn->getChild("animation")->getAttribute("path")->getRestrictedValue(); + printf("Found skill model [%s]\n",skillModelFile.c_str()); } if(sn->hasChild("particles") == true) { @@ -802,7 +853,7 @@ void MainWindow::loadUnit(string path, string skillName) { const XmlNode *pf= particlesNode->getChild("particle-file"); if(pf != NULL) { skillParticleFile = unitPath + '/' + pf->getAttribute("path")->getRestrictedValue(); - break; + printf("Found skill skill particle [%s]\n",skillParticleFile.c_str()); } } } @@ -815,6 +866,7 @@ void MainWindow::loadUnit(string path, string skillName) { const XmlNode *pf= particlesProjectileNode->getChild("particle"); if(pf != NULL && pf->getAttribute("value")->getRestrictedValue() == "true") { skillParticleProjectileFile = unitPath + '/' + pf->getAttribute("path")->getRestrictedValue(); + printf("Found skill skill projectile particle [%s]\n",skillParticleProjectileFile.c_str()); } } } @@ -827,29 +879,33 @@ void MainWindow::loadUnit(string path, string skillName) { const XmlNode *pf= particlesSplashNode->getChild("particle"); if(pf != NULL && pf->getAttribute("value")->getRestrictedValue() == "true") { skillParticleSplashFile = unitPath + '/' + pf->getAttribute("path")->getRestrictedValue(); + printf("Found skill skill splash particle [%s]\n",skillParticleSplashFile.c_str()); } } } - break; } } } if(skillModelFile != "") { this->modelPathList.push_back(skillModelFile); + printf("Added skill model [%s]\n",skillModelFile.c_str()); } if(skillParticleFile != "") { this->particlePathList.push_back(skillParticleFile); + printf("Added skill particle [%s]\n",skillParticleFile.c_str()); } if(skillParticleProjectileFile != "") { this->particleProjectilePathList.push_back(skillParticleProjectileFile); + printf("Added skill projectile particle [%s]\n",skillParticleProjectileFile.c_str()); } if(skillParticleSplashFile != "") { this->particleSplashPathList.push_back(skillParticleSplashFile); + printf("Added skill splash particle [%s]\n",skillParticleSplashFile.c_str()); } - glCanvas->SetCurrent(); - renderer->init(); + //glCanvas->SetCurrent(); + //renderer->init(); //wxCommandEvent event; //onMenuRestart(event); @@ -861,19 +917,22 @@ void MainWindow::loadUnit(string path, string skillName) { std::cout << e.what() << std::endl; wxMessageDialog(NULL, ToUnicode(e.what()), ToUnicode("Not a Mega-Glest particle XML file, or broken"), wxOK | wxICON_ERROR).ShowModal(); } - timer->Start(100); + //timer->Start(100); } void MainWindow::loadModel(string path) { try { if(path != "" && fileExists(path) == true) { this->modelPathList.push_back(path); + printf("Adding model [%s] list size %d\n",path.c_str(),this->modelPathList.size()); } string titlestring=winHeader; for(unsigned int idx =0; idx < this->modelPathList.size(); idx++) { string modelPath = this->modelPathList[idx]; + printf("Loading model [%s] %d of %d\n",modelPath.c_str(),idx, this->modelPathList.size()); + timer->Stop(); delete model; Model *tmpModel= new ModelGl(); @@ -920,7 +979,7 @@ void MainWindow::loadParticle(string path) { string dir= extractDirectoryPathFromFile(particlePath); size_t pos = dir.find_last_of(folderDelimiter); - if(pos == dir.length()-1) { + if(pos == dir.length() - 1 && dir.length() > 0) { dir.erase(dir.length() -1); } @@ -941,33 +1000,34 @@ void MainWindow::loadParticle(string path) { size= parametersNode->getChild("size")->getAttribute("value")->getIntValue(); //height height= parametersNode->getChild("height")->getAttribute("value")->getIntValue(); - } - // std::cout << "About to load [" << particlePath << "] from [" << dir << "] unit [" << unitXML << "]" << std::endl; - UnitParticleSystemType *unitParticleSystemType= new UnitParticleSystemType(); - unitParticleSystemType->load(dir, dir + folderDelimiter + particlePath, renderer); - unitParticleSystemTypes.push_back(unitParticleSystemType); + // std::cout << "About to load [" << particlePath << "] from [" << dir << "] unit [" << unitXML << "]" << std::endl; - for(std::vector::const_iterator it= unitParticleSystemTypes.begin(); it != unitParticleSystemTypes.end(); ++it) { - UnitParticleSystem *ups= new UnitParticleSystem(200); - (*it)->setValues(ups); - if(size > 0) { - //getCurrVectorFlat() + Vec3f(0.f, type->getHeight()/2.f, 0.f); - Vec3f vec = Vec3f(0.f, height / 2.f, 0.f); - ups->setPos(vec); - } - //ups->setFactionColor(getFaction()->getTexture()->getPixmap()->getPixel3f(0,0)); - ups->setFactionColor(renderer->getPlayerColorTexture(playerColor)->getPixmap()->getPixel3f(0,0)); - unitParticleSystems.push_back(ups); - renderer->manageParticleSystem(ups); + UnitParticleSystemType *unitParticleSystemType= new UnitParticleSystemType(); + unitParticleSystemType->load(dir, dir + folderDelimiter + particlePath, renderer); + unitParticleSystemTypes.push_back(unitParticleSystemType); - ups->setVisible(true); - } + for(std::vector::const_iterator it= unitParticleSystemTypes.begin(); it != unitParticleSystemTypes.end(); ++it) { + UnitParticleSystem *ups= new UnitParticleSystem(200); + (*it)->setValues(ups); + if(size > 0) { + //getCurrVectorFlat() + Vec3f(0.f, type->getHeight()/2.f, 0.f); + Vec3f vec = Vec3f(0.f, height / 2.f, 0.f); + ups->setPos(vec); + } + //ups->setFactionColor(getFaction()->getTexture()->getPixmap()->getPixel3f(0,0)); + ups->setFactionColor(renderer->getPlayerColorTexture(playerColor)->getPixmap()->getPixel3f(0,0)); + unitParticleSystems.push_back(ups); + renderer->manageParticleSystem(ups); - if(path != "" && fileExists(path) == true) { - renderer->initModelManager(); - renderer->initTextureManager(); + ups->setVisible(true); + } + + if(path != "" && fileExists(path) == true) { + renderer->initModelManager(); + renderer->initTextureManager(); + } } } SetTitle(ToUnicode(titlestring)); @@ -1416,7 +1476,7 @@ void MainWindow::onKeyDown(wxKeyEvent &e) { try { // std::cout << "e.ControlDown() = " << e.ControlDown() << " e.GetKeyCode() = " << e.GetKeyCode() << " isCtrl = " << (e.GetKeyCode() == WXK_CONTROL) << std::endl; - // Note: This ctrl-key handling is buggy since it never resests when ctrl is released later, so I reset it at end of loadcommands for now. + // Note: This ctrl-key handling is buggy since it never resets when ctrl is released later, so I reset it at end of loadcommands for now. if(e.ControlDown() == true || e.GetKeyCode() == WXK_CONTROL) { isControlKeyPressed = true; } @@ -1446,7 +1506,7 @@ void MainWindow::onKeyDown(wxKeyEvent &e) { string statusTextValue = statusbarText + " animation speed: " + floatToStr(speed * 1000.0) + " zoom: " + floatToStr(zoom) + " rotX: " + floatToStr(rotX) + " rotY: " + floatToStr(rotY); GetStatusBar()->SetStatusText(ToUnicode(statusTextValue.c_str())); } - else if (e.GetKeyCode() == 87) { + else if (e.GetKeyCode() == 'W') { glClearColor(0.6f, 0.6f, 0.6f, 1.0f); //w key //backgroundcolor constant 0.3 -> 0.6 } @@ -1478,6 +1538,8 @@ void MainWindow::onKeyDown(wxKeyEvent &e) { Vec4f ambientNEW= Vec4f(lightBrightness, lightBrightness, lightBrightness, 1.0f); glLightfv(GL_LIGHT0,GL_AMBIENT, ambientNEW.ptr()); } + + std::cout << "pressed " << e.GetKeyCode() << std::endl; } catch(std::runtime_error e) { std::cout << e.what() << std::endl; @@ -1488,6 +1550,7 @@ void MainWindow::onKeyDown(wxKeyEvent &e) { void MainWindow::onMenuRestart(wxCommandEvent &event) { try { // std::cout << "pressed R (restart particle animation)" << std::endl; + timer->Stop(); renderer->end(); unitParticleSystems.clear(); @@ -1505,6 +1568,7 @@ void MainWindow::onMenuRestart(wxCommandEvent &event) { renderer->initModelManager(); renderer->initTextureManager(); + timer->Start(100); } catch(std::runtime_error e) { std::cout << e.what() << std::endl; @@ -1689,7 +1753,8 @@ bool App::OnInit(){ } } - if(hasCommandArgument(argc, argv,(const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_LOAD_MODEL])) == true) { + if(hasCommandArgument(argc, argv,(const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_LOAD_MODEL])) == true && + hasCommandArgument(argc, argv,(const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_LOAD_MODEL_ANIMATION_VALUE])) == false) { const wxWX2MBbuf param = (const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_LOAD_MODEL]); //printf("param = [%s]\n",(const char*)param); @@ -1713,7 +1778,8 @@ bool App::OnInit(){ } } - if(hasCommandArgument(argc, argv,(const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_LOAD_PARTICLE])) == true) { + if(hasCommandArgument(argc, argv,(const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_LOAD_PARTICLE])) == true && + hasCommandArgument(argc, argv,(const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_LOAD_PARTICLE_LOOP_VALUE])) == false) { const wxWX2MBbuf param = (const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_LOAD_PARTICLE]); //printf("param = [%s]\n",(const char*)param); @@ -1800,7 +1866,7 @@ bool App::OnInit(){ Tokenize(value,paramPartTokens,"="); if(paramPartTokens.size() >= 2 && paramPartTokens[1].length() > 0) { newAnimValue = strToFloat(paramPartTokens[1]); - //printf("newAnimValue = %f\n",newAnimValue); + printf("newAnimValue = %f\n",newAnimValue); } else { printf("\nInvalid path specified on commandline [%s] value [%s]\n\n",(const char *)wxConvCurrent->cWX2MB(argv[foundParamIndIndex]),(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL));