- added new commandline options to g3d viewer for things like auto screenshots.
type --help for more info
This commit is contained in:
parent
7ef965a8db
commit
4d9cfc105e
|
@ -11,6 +11,11 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <wx/event.h>
|
#include <wx/event.h>
|
||||||
#include "game_constants.h"
|
#include "game_constants.h"
|
||||||
|
#ifndef WIN32
|
||||||
|
#define stricmp strcasecmp
|
||||||
|
#define strnicmp strncasecmp
|
||||||
|
#define _strnicmp strncasecmp
|
||||||
|
#endif
|
||||||
|
|
||||||
using namespace Shared::Platform;
|
using namespace Shared::Platform;
|
||||||
using namespace Shared::PlatformCommon;
|
using namespace Shared::PlatformCommon;
|
||||||
|
@ -31,6 +36,8 @@ const char *folderDelimiter = "/";
|
||||||
int GameConstants::updateFps= 40;
|
int GameConstants::updateFps= 40;
|
||||||
int GameConstants::cameraFps= 100;
|
int GameConstants::cameraFps= 100;
|
||||||
|
|
||||||
|
const string g3dviewerVersionString= "v1.3.6";
|
||||||
|
|
||||||
namespace Shared{ namespace G3dViewer{
|
namespace Shared{ namespace G3dViewer{
|
||||||
|
|
||||||
// ===============================================
|
// ===============================================
|
||||||
|
@ -45,11 +52,82 @@ wxString ToUnicode(const string& str) {
|
||||||
return wxString(str.c_str(), wxConvUTF8);
|
return wxString(str.c_str(), wxConvUTF8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const wxChar *GAME_ARGS[] = {
|
||||||
|
wxT("--help"),
|
||||||
|
wxT("--autoscreenshot"),
|
||||||
|
wxT("--loadmodel")
|
||||||
|
};
|
||||||
|
|
||||||
|
enum GAME_ARG_TYPE {
|
||||||
|
GAME_ARG_HELP = 0,
|
||||||
|
GAME_ARG_AUTO_SCREENSHOT,
|
||||||
|
GAME_ARG_LOAD_MODEL
|
||||||
|
};
|
||||||
|
|
||||||
|
bool hasCommandArgument(int argc, wxChar** argv,const string argName,
|
||||||
|
int *foundIndex=NULL, int startLookupIndex=1,
|
||||||
|
bool useArgParamLen=false) {
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
if(foundIndex != NULL) {
|
||||||
|
*foundIndex = -1;
|
||||||
|
}
|
||||||
|
int compareLen = strlen(argName.c_str());
|
||||||
|
|
||||||
|
for(int idx = startLookupIndex; idx < argc; idx++) {
|
||||||
|
const wxWX2MBbuf tmp_buf = wxConvCurrent->cWX2MB(argv[idx]);
|
||||||
|
//printf("tmp_buf [%s]\n",(const char *)tmp_buf);
|
||||||
|
if(useArgParamLen == true) {
|
||||||
|
compareLen = strlen(tmp_buf);
|
||||||
|
}
|
||||||
|
if(_strnicmp(argName.c_str(),tmp_buf,compareLen) == 0) {
|
||||||
|
result = true;
|
||||||
|
if(foundIndex != NULL) {
|
||||||
|
*foundIndex = idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void printParameterHelp(const char *argv0, bool foundInvalidArgs) {
|
||||||
|
if(foundInvalidArgs == true) {
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\n%s %s, usage\n",argv0,g3dviewerVersionString.c_str());
|
||||||
|
|
||||||
|
printf("\n%s [G3D FILE]\n\n",argv0);
|
||||||
|
printf("Displays glest 3D-models and unit/projectile/splash particle systems.\n");
|
||||||
|
printf("rotate with left mouse button, zoom with right mouse button or mousewheel.\n");
|
||||||
|
printf("Use ctrl to load more than one particle system.\n");
|
||||||
|
printf("Press R to restart particles, this also reloads all files if they are changed.\n\n");
|
||||||
|
|
||||||
|
printf("optionally you may use any of the following:\n");
|
||||||
|
printf("Parameter:\t\tDescription:");
|
||||||
|
printf("\n----------------------\t------------");
|
||||||
|
printf("\n%s\t\t\tdisplays this help text.",(const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_HELP]));
|
||||||
|
printf("\n%s=x\t\tAuto load the model specified in path/filename x",(const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_LOAD_MODEL]));
|
||||||
|
printf("\n \tWhere x is a G3d filename to load:");
|
||||||
|
printf("\n \texample: %s %s=techs/megapack/factions/tech/units/battle_machine/models/battle_machine_dying.g3d",argv0,(const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_LOAD_MODEL]));
|
||||||
|
printf("\n%s=x\tAutomatically takes a screenshot of the items you are loading.",(const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_AUTO_SCREENSHOT]));
|
||||||
|
printf("\n \tWhere x is a comma-delimited list of one or more of the optional settings:");
|
||||||
|
printf("\n \ttransparent, enable_grid, enable_wireframe, enable_normals,");
|
||||||
|
printf("\n \tdisable_grid, disable_wireframe, disable_normals, saveas-<filename>");
|
||||||
|
printf("\n \texample: %s %s=transparent,disable_grid,saveas-test.png %s=techs/megapack/factions/tech/units/battle_machine/models/battle_machine_dying.g3d",argv0,(const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_AUTO_SCREENSHOT]),(const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_LOAD_MODEL]));
|
||||||
|
|
||||||
|
printf("\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool autoScreenShotAndExit = false;
|
||||||
|
vector<string> autoScreenShotParams;
|
||||||
|
|
||||||
// ===============================================
|
// ===============================================
|
||||||
// class MainWindow
|
// class MainWindow
|
||||||
// ===============================================
|
// ===============================================
|
||||||
|
|
||||||
const string g3dviewerVersionString= "v1.3.6";
|
|
||||||
const string MainWindow::winHeader= "G3D viewer " + g3dviewerVersionString;
|
const string MainWindow::winHeader= "G3D viewer " + g3dviewerVersionString;
|
||||||
|
|
||||||
MainWindow::MainWindow(const string &modelPath)
|
MainWindow::MainWindow(const string &modelPath)
|
||||||
|
@ -119,6 +197,57 @@ MainWindow::MainWindow(const string &modelPath)
|
||||||
menuMode->Check(miModeGrid, true);
|
menuMode->Check(miModeGrid, true);
|
||||||
menuCustomColor->Check(miColorRed, true);
|
menuCustomColor->Check(miColorRed, true);
|
||||||
|
|
||||||
|
for(int i = 0; i < autoScreenShotParams.size(); ++i) {
|
||||||
|
if(autoScreenShotParams[i] == "transparent") {
|
||||||
|
printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str());
|
||||||
|
menuFile->Check(miFileToggleScreenshotTransparent,true);
|
||||||
|
float alpha = 0.0f;
|
||||||
|
renderer->setAlphaColor(alpha);
|
||||||
|
}
|
||||||
|
if(autoScreenShotParams[i] == "enable_grid") {
|
||||||
|
printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str());
|
||||||
|
menuMode->Check(miModeGrid,true);
|
||||||
|
if(renderer->getGrid() == false) {
|
||||||
|
renderer->toggleGrid();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(autoScreenShotParams[i] == "enable_wireframe") {
|
||||||
|
printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str());
|
||||||
|
menuMode->Check(miModeWireframe,true);
|
||||||
|
if(renderer->getWireframe() == false) {
|
||||||
|
renderer->toggleWireframe();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(autoScreenShotParams[i] == "enable_normals") {
|
||||||
|
printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str());
|
||||||
|
menuMode->Check(miModeNormals,true);
|
||||||
|
if(renderer->getNormals() == false) {
|
||||||
|
renderer->toggleNormals();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(autoScreenShotParams[i] == "disable_grid") {
|
||||||
|
printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str());
|
||||||
|
menuMode->Check(miModeGrid,false);
|
||||||
|
if(renderer->getGrid() == true) {
|
||||||
|
renderer->toggleGrid();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(autoScreenShotParams[i] == "enable_wireframe") {
|
||||||
|
printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str());
|
||||||
|
menuMode->Check(miModeWireframe,false);
|
||||||
|
if(renderer->getWireframe() == true) {
|
||||||
|
renderer->toggleWireframe();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(autoScreenShotParams[i] == "enable_normals") {
|
||||||
|
printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str());
|
||||||
|
menuMode->Check(miModeNormals,false);
|
||||||
|
if(renderer->getNormals() == true) {
|
||||||
|
renderer->toggleNormals();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SetMenuBar(menu);
|
SetMenuBar(menu);
|
||||||
|
|
||||||
//misc
|
//misc
|
||||||
|
@ -173,7 +302,7 @@ MainWindow::~MainWindow(){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::init(){
|
void MainWindow::init() {
|
||||||
glCanvas->SetCurrent();
|
glCanvas->SetCurrent();
|
||||||
renderer->init();
|
renderer->init();
|
||||||
|
|
||||||
|
@ -195,8 +324,13 @@ void MainWindow::onPaint(wxPaintEvent &event){
|
||||||
}
|
}
|
||||||
|
|
||||||
renderer->renderParticleManager();
|
renderer->renderParticleManager();
|
||||||
|
|
||||||
glCanvas->SwapBuffers();
|
glCanvas->SwapBuffers();
|
||||||
|
|
||||||
|
if(autoScreenShotAndExit == true) {
|
||||||
|
autoScreenShotAndExit = false;
|
||||||
|
saveScreenshot();
|
||||||
|
Close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::onClose(wxCloseEvent &event){
|
void MainWindow::onClose(wxCloseEvent &event){
|
||||||
|
@ -408,24 +542,45 @@ void MainWindow::onMenumFileToggleScreenshotTransparent(wxCommandEvent &event) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::onMenuFileSaveScreenshot(wxCommandEvent &event) {
|
void MainWindow::saveScreenshot() {
|
||||||
try {
|
try {
|
||||||
string path = "screens/";
|
int autoSaveScreenshotIndex = -1;
|
||||||
if(isdir(path.c_str()) == true) {
|
for(int i = 0; i < autoScreenShotParams.size(); ++i) {
|
||||||
//Config &config= Config::getInstance();
|
if(_strnicmp(autoScreenShotParams[i].c_str(),"saveas-",7) == 0) {
|
||||||
//string fileFormat = config.getString("ScreenShotFileType","png");
|
printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str());
|
||||||
string fileFormat = "png";
|
autoSaveScreenshotIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(autoSaveScreenshotIndex >= 0) {
|
||||||
|
string saveAsFilename = autoScreenShotParams[autoSaveScreenshotIndex];
|
||||||
|
saveAsFilename.erase(0,7);
|
||||||
|
FILE *f= fopen(saveAsFilename.c_str(), "rb");
|
||||||
|
if(f == NULL) {
|
||||||
|
renderer->saveScreen(saveAsFilename.c_str());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
string path = "screens/";
|
||||||
|
if(isdir(path.c_str()) == true) {
|
||||||
|
//Config &config= Config::getInstance();
|
||||||
|
//string fileFormat = config.getString("ScreenShotFileType","png");
|
||||||
|
string fileFormat = "png";
|
||||||
|
|
||||||
for(int i=0; i < 1000; ++i) {
|
for(int i=0; i < 1000; ++i) {
|
||||||
path = "screens/";
|
path = "screens/";
|
||||||
path += string("screen") + intToStr(i) + string(".") + fileFormat;
|
path += string("screen") + intToStr(i) + string(".") + fileFormat;
|
||||||
FILE *f= fopen(path.c_str(), "rb");
|
FILE *f= fopen(path.c_str(), "rb");
|
||||||
if(f == NULL) {
|
if(f == NULL) {
|
||||||
renderer->saveScreen(path);
|
renderer->saveScreen(path);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fclose(f);
|
fclose(f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -436,6 +591,10 @@ void MainWindow::onMenuFileSaveScreenshot(wxCommandEvent &event) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::onMenuFileSaveScreenshot(wxCommandEvent &event) {
|
||||||
|
saveScreenshot();
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::onMenuFileClearAll(wxCommandEvent &event) {
|
void MainWindow::onMenuFileClearAll(wxCommandEvent &event) {
|
||||||
try {
|
try {
|
||||||
modelPathList.clear();
|
modelPathList.clear();
|
||||||
|
@ -1222,17 +1381,98 @@ END_EVENT_TABLE()
|
||||||
// ===============================================
|
// ===============================================
|
||||||
|
|
||||||
bool App::OnInit(){
|
bool App::OnInit(){
|
||||||
std::string modelPath;
|
std::string modelPath="";
|
||||||
if(argc==2){
|
|
||||||
if(argv[1][0]=='-') { // any flag gives help and exits program.
|
/*
|
||||||
std::cout << "G3D viewer " << g3dviewerVersionString << std::endl << std::endl;
|
if(hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_DATA_PATH]) == true) {
|
||||||
std::cout << "glest_g3dviewer [G3D 3D-MODEL FILE]" << std::endl << std::endl;
|
int foundParamIndIndex = -1;
|
||||||
std::cout << "Displays glest 3D-models and unit/projectile/splash particle systems." << std::endl;
|
hasCommandArgument(argc, argv,string(GAME_ARGS[GAME_ARG_DATA_PATH]) + string("="),&foundParamIndIndex);
|
||||||
std::cout << "rotate with left mouse button, zoom with right mouse button or mousewheel." << std::endl;
|
if(foundParamIndIndex < 0) {
|
||||||
std::cout << "Use ctrl to load more than one particle system." << std::endl;
|
hasCommandArgument(argc, argv,string(GAME_ARGS[GAME_ARG_DATA_PATH]),&foundParamIndIndex);
|
||||||
std::cout << "Press R to restart particles, this also reloads all files if they are changed." << std::endl << std::endl;
|
}
|
||||||
exit (0);
|
string customPath = argv[foundParamIndIndex];
|
||||||
|
vector<string> paramPartTokens;
|
||||||
|
Tokenize(customPath,paramPartTokens,"=");
|
||||||
|
if(paramPartTokens.size() >= 2 && paramPartTokens[1].length() > 0) {
|
||||||
|
string customPathValue = paramPartTokens[1];
|
||||||
|
pathCache[GameConstants::path_data_CacheLookupKey]=customPathValue;
|
||||||
|
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("Using custom data path [%s]\n",customPathValue.c_str());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
printf("\nInvalid path specified on commandline [%s] value [%s]\n\n",argv[foundParamIndIndex],(paramPartTokens.size() >= 2 ? paramPartTokens[1].c_str() : NULL));
|
||||||
|
printParameterHelp(argv[0],false);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool foundInvalidArgs = false;
|
||||||
|
const int knownArgCount = sizeof(GAME_ARGS) / sizeof(GAME_ARGS[0]);
|
||||||
|
for(int idx = 1; idx < argc; ++idx) {
|
||||||
|
const wxWX2MBbuf tmp_buf = wxConvCurrent->cWX2MB(argv[idx]);
|
||||||
|
if( hasCommandArgument(knownArgCount, (wxChar**)&GAME_ARGS[0], (const char *)tmp_buf, NULL, 0, true) == false &&
|
||||||
|
argv[idx][0] == '-') {
|
||||||
|
foundInvalidArgs = true;
|
||||||
|
|
||||||
|
printf("\nInvalid argument: %s",(const char*)tmp_buf);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(foundInvalidArgs == true ||
|
||||||
|
hasCommandArgument(argc, argv,(const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_HELP])) == true) {
|
||||||
|
printParameterHelp(wxConvCurrent->cWX2MB(argv[0]),foundInvalidArgs);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(hasCommandArgument(argc, argv,(const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_AUTO_SCREENSHOT])) == true) {
|
||||||
|
autoScreenShotAndExit = true;
|
||||||
|
|
||||||
|
const wxWX2MBbuf param = (const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_AUTO_SCREENSHOT]);
|
||||||
|
//printf("param = [%s]\n",(const char*)param);
|
||||||
|
|
||||||
|
int foundParamIndIndex = -1;
|
||||||
|
hasCommandArgument(argc, argv,string((const char*)param) + string("="),&foundParamIndIndex);
|
||||||
|
if(foundParamIndIndex < 0) {
|
||||||
|
hasCommandArgument(argc, argv,(const char*)param,&foundParamIndIndex);
|
||||||
|
}
|
||||||
|
//printf("foundParamIndIndex = %d\n",foundParamIndIndex);
|
||||||
|
string options = (const char *)wxConvCurrent->cWX2MB(argv[foundParamIndIndex]);
|
||||||
|
vector<string> paramPartTokens;
|
||||||
|
Tokenize(options,paramPartTokens,"=");
|
||||||
|
if(paramPartTokens.size() >= 2 && paramPartTokens[1].length() > 0) {
|
||||||
|
string optionsValue = paramPartTokens[1];
|
||||||
|
|
||||||
|
autoScreenShotParams.clear();
|
||||||
|
Tokenize(optionsValue,autoScreenShotParams,",");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(hasCommandArgument(argc, argv,(const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_LOAD_MODEL])) == true) {
|
||||||
|
const wxWX2MBbuf param = (const char *)wxConvCurrent->cWX2MB(GAME_ARGS[GAME_ARG_LOAD_MODEL]);
|
||||||
|
//printf("param = [%s]\n",(const char*)param);
|
||||||
|
|
||||||
|
int foundParamIndIndex = -1;
|
||||||
|
hasCommandArgument(argc, argv,string((const char*)param) + string("="),&foundParamIndIndex);
|
||||||
|
if(foundParamIndIndex < 0) {
|
||||||
|
hasCommandArgument(argc, argv,(const char*)param,&foundParamIndIndex);
|
||||||
|
}
|
||||||
|
//printf("foundParamIndIndex = %d\n",foundParamIndIndex);
|
||||||
|
string customPath = (const char *)wxConvCurrent->cWX2MB(argv[foundParamIndIndex]);
|
||||||
|
vector<string> paramPartTokens;
|
||||||
|
Tokenize(customPath,paramPartTokens,"=");
|
||||||
|
if(paramPartTokens.size() >= 2 && paramPartTokens[1].length() > 0) {
|
||||||
|
string customPathValue = paramPartTokens[1];
|
||||||
|
modelPath = customPathValue;
|
||||||
|
}
|
||||||
|
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));
|
||||||
|
printParameterHelp(wxConvCurrent->cWX2MB(argv[0]),false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(argc == 2 && argv[1][0] != '-') {
|
||||||
|
|
||||||
#if defined(__MINGW32__)
|
#if defined(__MINGW32__)
|
||||||
const wxWX2MBbuf tmp_buf = wxConvCurrent->cWX2MB(wxFNCONV(argv[1]));
|
const wxWX2MBbuf tmp_buf = wxConvCurrent->cWX2MB(wxFNCONV(argv[1]));
|
||||||
|
|
|
@ -101,6 +101,8 @@ private:
|
||||||
void loadProjectileParticle(string path);
|
void loadProjectileParticle(string path);
|
||||||
void loadSplashParticle(string path);
|
void loadSplashParticle(string path);
|
||||||
|
|
||||||
|
void saveScreenshot();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MainWindow(const string &modelPath);
|
MainWindow(const string &modelPath);
|
||||||
~MainWindow();
|
~MainWindow();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user