editor now in a separate executable
parent
ce66a791af
commit
5359374304
|
@ -11,6 +11,7 @@ engine/libraries/oglft/liboglft/OGLFT.h
|
||||||
start
|
start
|
||||||
runtests
|
runtests
|
||||||
fysxasteroids
|
fysxasteroids
|
||||||
|
fysxasteroidseditor
|
||||||
config.rc
|
config.rc
|
||||||
|
|
||||||
Debug/
|
Debug/
|
||||||
|
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -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 */
|
Loading…
Reference in New Issue