editor now in a separate executable

main
Martin Felis (berta) 2011-02-12 17:04:44 +01:00
parent ce66a791af
commit 5359374304
7 changed files with 284 additions and 35 deletions

View File

@ -11,6 +11,7 @@ engine/libraries/oglft/liboglft/OGLFT.h
start start
runtests runtests
fysxasteroids fysxasteroids
fysxasteroidseditor
config.rc config.rc
Debug/ Debug/

View File

@ -38,13 +38,35 @@ SET ( ASTEROIDS_SOURCES
asteroids/View.cc asteroids/View.cc
) )
SET ( ASTEROIDSEDITOR_SOURCES
asteroids/AsteroidEntity.cc
asteroids/Controller.cc
asteroids/ControllerCommands.cc
asteroids/EntityFactory.cc
asteroids/EnumToString.cc
asteroids/Game.cc
asteroids/editormain.cc
asteroids/Model.cc
asteroids/ModelCommands.cc
asteroids/Physics.cc
asteroids/RocketEntity.cc
asteroids/ShipEntity.cc
asteroids/View.cc
)
ADD_EXECUTABLE ( fysxasteroids ${ASTEROIDS_SOURCES} ) ADD_EXECUTABLE ( fysxasteroids ${ASTEROIDS_SOURCES} )
ADD_EXECUTABLE ( fysxasteroidseditor ${ASTEROIDSEDITOR_SOURCES} )
TARGET_LINK_LIBRARIES ( fysxasteroids TARGET_LINK_LIBRARIES ( fysxasteroids
Engine Engine
oglft oglft
) )
TARGET_LINK_LIBRARIES ( fysxasteroidseditor
Engine
oglft
)
SET ( DATA_DIR SET ( DATA_DIR
data/ data/
) )
@ -54,6 +76,11 @@ INSTALL (TARGETS fysxasteroids
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
) )
INSTALL (TARGETS fysxasteroidseditor
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
)
INSTALL (DIRECTORY ${DATA_DIR} INSTALL (DIRECTORY ${DATA_DIR}
DESTINATION share/fysxasteroids/data DESTINATION share/fysxasteroids/data
) )

View File

@ -31,6 +31,39 @@ class View : public Engine::ViewBase {
public: public:
virtual ~View() {}; virtual ~View() {};
/** \brief Pushes the given state onto mViewStateStack */
void PushViewState (const ViewState state) {
Engine::LogDebug ("Pushing ViewState %s", GetStringViewState(state));
mViewStateStack.push(state);
// Fire the view state change event to properly clear the IMGUI state
Engine::EventBasePtr changeviewstate_event (new Engine::EventBase());
changeviewstate_event->mEventType = EventChangeViewState;
QueueEvent (changeviewstate_event);
}
/** \brief Returns the current ViewState */
ViewState GetViewState () {
return mViewStateStack.top();
}
/** \brief Removes the top element of the current ViewState stack */
void PopViewState () {
// Warning: you must not query for an invalid enum with
// GetStringENUM_NAME!
std::string popped_name = GetStringViewState(mViewStateStack.top());
mViewStateStack.pop();
std::string current_name ("None");
if (mViewStateStack.size() > 0)
current_name = GetStringViewState(mViewStateStack.top());
Engine::LogDebug("Popped ViewState: %s current %s remaining: %u", popped_name.c_str(), current_name.c_str(), mViewStateStack.size());
// Fire the view state change event to properly clear the IMGUI state
Engine::EventBasePtr changeviewstate_event (new Engine::EventBase());
changeviewstate_event->mEventType = EventChangeViewState;
QueueEvent (changeviewstate_event);
}
protected: protected:
/** \brief Initializes the system */ /** \brief Initializes the system */
virtual int OnInit (int argc, char* argv[]); virtual int OnInit (int argc, char* argv[]);
@ -74,38 +107,6 @@ class View : public Engine::ViewBase {
/** \brief The ViewState stack that is used for non-linear menus */ /** \brief The ViewState stack that is used for non-linear menus */
std::stack<ViewState> mViewStateStack; std::stack<ViewState> mViewStateStack;
/** \brief Pushes the given state onto mViewStateStack */
void PushViewState (const ViewState state) {
Engine::LogDebug ("Pushing ViewState %s", GetStringViewState(state));
mViewStateStack.push(state);
// Fire the view state change event to properly clear the IMGUI state
Engine::EventBasePtr changeviewstate_event (new Engine::EventBase());
changeviewstate_event->mEventType = EventChangeViewState;
QueueEvent (changeviewstate_event);
}
/** \brief Returns the current ViewState */
ViewState GetViewState () {
return mViewStateStack.top();
}
/** \brief Removes the top element of the current ViewState stack */
void PopViewState () {
// Warning: you must not query for an invalid enum with
// GetStringENUM_NAME!
std::string popped_name = GetStringViewState(mViewStateStack.top());
mViewStateStack.pop();
std::string current_name ("None");
if (mViewStateStack.size() > 0)
current_name = GetStringViewState(mViewStateStack.top());
Engine::LogDebug("Popped ViewState: %s current %s remaining: %u", popped_name.c_str(), current_name.c_str(), mViewStateStack.size());
// Fire the view state change event to properly clear the IMGUI state
Engine::EventBasePtr changeviewstate_event (new Engine::EventBase());
changeviewstate_event->mEventType = EventChangeViewState;
QueueEvent (changeviewstate_event);
}
/** \brief Removes all elements of the ViewState stack */ /** \brief Removes all elements of the ViewState stack */
void ResetViewState() { void ResetViewState() {
Engine::LogDebug ("Resetting ViewState stack"); Engine::LogDebug ("Resetting ViewState stack");

176
asteroids/editormain.cc Normal file
View File

@ -0,0 +1,176 @@
#include <cstdlib>
#include <iostream>
#include "Engine.h"
#include "Controller.h"
#include "View.h"
#include "Model.h"
#include "Physics.h"
#include "EntityFactory.h"
#include "Game.h"
#include <boost/filesystem.hpp>
#ifdef WIN32
#include <Windows.h>
#endif
using namespace std;
/* Returns a path where files such as logs and config files can be
* written to
*/
std::string create_user_path () {
std::string result_dir = ".";
std::string test_file_path = result_dir;
// first we check in $HOME/.fysxasteroids
char* env_home_dir = getenv("HOME");
result_dir = env_home_dir;
result_dir += "/.fysxasteroids";
boost::filesystem::path result_dir_path(result_dir);
if(!boost::filesystem::is_directory (result_dir_path)) {
if (!boost::filesystem::create_directory(result_dir_path)) {
cerr << "Warning: could not create user data directory " << result_dir<< endl;
result_dir = "";
}
}
test_file_path = result_dir;
test_file_path += "/game.log";
ofstream test_file (test_file_path.c_str(), ios_base::app);
if (!test_file) {
test_file.close();
cerr << "Warning: user data directory not writable! " << result_dir << endl;
result_dir = "";
} else {
test_file.close();
return result_dir;
}
// then we check the local directory
result_dir = ".";
test_file_path = result_dir;
test_file_path += "/game.log";
test_file.open (test_file_path.c_str(), ios_base::out);
if (test_file) {
test_file.close();
return result_dir;
} else {
cerr << "Warning could not find suitable user data directory" << endl;
result_dir = "";
}
test_file.close();
return result_dir;
}
std::string find_game_data_dir () {
std::string result;
std::vector<std::string> paths;
paths.push_back(".");
paths.push_back("/usr/local/share/fysxasteroids");
paths.push_back("/usr/share/fysxasteroids");
std::vector<std::string>::iterator iter = paths.begin();
for (iter; iter != paths.end(); iter++) {
std::string test_path = *iter;
if (!boost::filesystem::is_directory(test_path + "/data/fonts"))
continue;
if (!boost::filesystem::is_directory(test_path + "/data/levels"))
continue;
if (!boost::filesystem::is_directory(test_path + "/data/sounds"))
continue;
if (!boost::filesystem::is_directory(test_path + "/data/textures"))
continue;
break;
}
if (iter != paths.end())
return *iter;
cerr << "Could not find game data" << endl;
return result;
}
int main (int argc, char* argv[]) {
cout << "Game Start" << endl;
#ifdef WIN32
HWND hWnd = GetConsoleWindow();
ShowWindow( hWnd, SW_HIDE );
#endif
Engine::Engine engine;
engine.SetEntityFactory (new asteroids::EntityFactory);
engine.SetController (new asteroids::Controller);
engine.SetModel (new asteroids::Model);
engine.SetPhysics (new asteroids::Physics);
engine.SetView (new asteroids::View);
SetLogPrintLevel (Engine::LogLevelMessage);
// we assume the user path to be local folder
std::string user_path = create_user_path();
std::string log_file_path = user_path;
log_file_path += "/editor.log";
cout << "User Data Dir = " << user_path << endl;
engine.SetUserDataPath (user_path);
Engine::SetLogFilename (log_file_path.c_str());
std::string game_data_path = find_game_data_dir();
engine.SetGameDataPath (game_data_path);
cout << "Game Data Dir = " << game_data_path << endl;
if (engine.Init (argc, argv) != 0) {
cout << "Could not start engine!" << endl;
exit (-1);
}
Engine::SetMusicVolume (0.);
// Load the icon
Uint32 colorkey;
SDL_Surface *image = NULL;
image = SDL_LoadBMP("./data/textures/icon.bmp");
if (!image)
Engine::LogWarning("Could not load icon: ./data/textures/icon.bmp");
else
SDL_WM_SetIcon(image,NULL);
SDL_WM_SetCaption("Asteroids -BETA1-","Asteroids -BETA 1-");
engine.GetView()->SetGridSize (8,8);
/// \todo get rid of the world settings in asteroids
dynamic_cast<asteroids::Physics*>(engine.GetPhysics())->SetWorldSize (26, 20);
engine.GetPhysics()->SetWorldBounds (vector3d (-13, 0, -10), vector3d (13, 0, 10));
engine.GetPhysics()->EnableWorldWarp(Engine::PhysicsBase::WorldWarpModeX);
engine.GetPhysics()->EnableWorldWarp(Engine::PhysicsBase::WorldWarpModeZ);
// run the default commands and load the configuration
Engine::RunCommand ("exec asteroids.rc");
Engine::RunCommand ("exec config.rc");
asteroids::GetView()->PopViewState();
asteroids::GetView()->PushViewState(asteroids::ViewStateEditor);
engine.MainLoop ();
SDL_WM_SetIcon(NULL,NULL);
SDL_FreeSurface (image);
engine.Destroy ();
cout << "Game Quit" << endl;
return 0;
}

View File

@ -105,9 +105,6 @@ int main (int argc, char* argv[]) {
ShowWindow( hWnd, SW_HIDE ); ShowWindow( hWnd, SW_HIDE );
#endif #endif
create_dir ("./root");
create_dir ("./root/blaa");
Engine::Engine engine; Engine::Engine engine;
engine.SetEntityFactory (new asteroids::EntityFactory); engine.SetEntityFactory (new asteroids::EntityFactory);

38
engine/Utils.cc Normal file
View File

@ -0,0 +1,38 @@
#include "Utils.h"
#include <iostream>
#include <string>
#include <fstream>
#include <boost/filesystem.hpp>
#include <cstdlib>
std::string strip_whitespaces (const std::string input_str) {
std::string result = input_str.substr(input_str.find_first_not_of (" \t\n\r"), input_str.size());
return result.substr (0, result.find_last_not_of(" \t\n\r") + 1);
}
bool create_dir (const std::string &dir_str) {
boost::filesystem::path dir_str_path(dir_str);
if(!boost::filesystem::is_directory (dir_str_path)) {
if (!boost::filesystem::create_directory(dir_str_path)) {
std::cerr << "Warning: could not create directory " << dir_str<< std::endl;
return false;
}
}
std::string test_file_path = dir_str;
test_file_path += "/fysxasteroids_write_test_delete_me.txt";
std::ofstream test_file (test_file_path.c_str(), std::ios_base::app);
if (!test_file) {
test_file.close();
std::cerr << "Warning: directory not writable! " << dir_str << std::endl;
return false;
} else {
test_file.close();
boost::filesystem::remove (test_file_path);
return true;
}
return false;
}

9
engine/Utils.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef _UTILS_H
#define _UTILS_H
#include <string>
std::string strip_whitespaces (const std::string input_str);
bool create_dir (const std::string &dir_str);
#endif /* _UTILS_H */