X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMain.cc;h=13681ee0625fa74d578fd1dcdb24f49db5e5129e;hp=91a8d080ba04d14df9114e8a112f3ba179e4a63c;hb=6f1b787a10d8ab1a3117a4b8c004dd2d90599608;hpb=837bae9f2bf7b25e1d3d2625eeaf39c1d2f48827 diff --git a/src/Main.cc b/src/Main.cc index 91a8d08..13681ee 100644 --- a/src/Main.cc +++ b/src/Main.cc @@ -9,62 +9,67 @@ * **************************************************************************/ -#include // atexit, getenv +#include "config.h" + +#include // atexit +#include +#include #include #include -#include // access -#include -#include -#include -#include -#include -#include -#include +#if !defined(__WIN32) +#include +#else +int isatty(int dummy) { return 0; } +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include +#include -#include "ErrorHandler.hh" #include "GameLayer.hh" #include "Main.hh" #include "TitleLayer.hh" - -#if HAVE_CONFIG_H -#include "config.h" -#endif #include "version.h" -Main::Main() -{ - mDispatchHandler = Mf::core.addHandler("video.newcontext", - boost::bind(&Main::contextCreated)); - setupGL(); -} - -void Main::addedToCore() +Main::Main(moof::settings& settings, moof::video& video) : + moof::view(settings, video) { - //Mf::Scalar coeff[] = {0.0, 1.0}; - //Mf::Lerp interp(coeff, 0.25); - - //Mf::LayerP gameLayer = GameLayer::alloc(); - //Mf::Transition::Ptr transition = - //Mf::Transition::alloc(gameLayer, Mf::LayerP(), interp); - //core.push(transition); - //core.push(GameLayer::alloc()); - Mf::core.push(TitleLayer::alloc()); + moof::dispatcher& dispatcher = moof::dispatcher::global(); + video_reloaded_ = dispatcher.add_target("video.newcontext", + boost::bind(&Main::setup_opengl)); + setup_opengl(); + +#if USE_HOTLOADING + hotload_timer_.init(boost::bind(&moof::resource::reload_as_needed), + SCALAR(0.25), + moof::timer::repeat); +#endif } -void Main::update(Mf::Scalar t, Mf::Scalar dt) +void Main::update(moof::scalar t, moof::scalar dt) { - if (Mf::core.getSize() == 1) + if (children().size() == 0) { - // this is the only layer left on the stack - //Mf::core.push(TitleLayer::alloc()); - Mf::core.clear(); + //moof::log_warning("main view has no children"); + //stop(); + //return; + add_child(TitleLayer::alloc()); } + + moof::view::update(t, dt); } -void Main::draw(Mf::Scalar alpha) const +void Main::draw(moof::scalar alpha) const { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -73,25 +78,25 @@ void Main::draw(Mf::Scalar alpha) const glMatrixMode(GL_MODELVIEW); glLoadIdentity(); + + moof::view::draw(alpha); } -bool Main::handleEvent(const Mf::Event& event) +bool Main::handle_event(const moof::event& event) { + if (moof::view::handle_event(event)) return true; + switch (event.type) { case SDL_KEYUP: - if (event.key.keysym.sym == SDLK_ESCAPE) + if (event.key.keysym.sym == SDLK_f) { - Mf::core.clear(); - } - else if (event.key.keysym.sym == SDLK_f) - { - Mf::video->toggleFull(); + video().toggle_fullscreen(); } else if (event.key.keysym.sym == SDLK_l) { - Mf::video->toggleCursorGrab(); - Mf::video->toggleCursorVisible(); + video().toggle_cursor_captured(); + video().toggle_cursor_visible(); } break; @@ -100,26 +105,25 @@ bool Main::handleEvent(const Mf::Event& event) break; case SDL_QUIT: - Mf::core.clear(); - break; + stop(); + return true; } return false; } -std::string Main::getSearchPath() +std::string Main::search_paths() { // Add search paths; they should be searched in this order: // 1. YOINK_DATADIR (environment) // 2. YOINK_DATADIR (configure) std::string path; - - char* dataDir = getenv("YOINK_DATADIR"); - if (dataDir) + std::string datadir = stlplus::env_vector()["YOINK_DATADIR"]; + if (!datadir.empty()) { - path += dataDir; + path += datadir; path += ":"; } path += YOINK_DATADIR; @@ -127,7 +131,7 @@ std::string Main::getSearchPath() return path; } -std::string Main::getConfigPath() +std::string Main::config_paths() { // Build the list of config files to search for, in this order: // 1. YOINK_DATADIR/yoinkrc @@ -135,31 +139,33 @@ std::string Main::getConfigPath() // 3. $HOME/.yoinkrc // 4. YOINKRC (environment) - std::string path = Mf::Resource::getPath("yoinkrc"); + std::string path = moof::resource::find_file("yoinkrc"); -#if !defined(_WIN32) && !defined(__WIN32__) +#if !defined(_WIN32) path += ":/etc/yoinkrc"; #endif path += ":$HOME/.yoinkrc"; - char* configFile = getenv("YOINKRC"); - if (configFile) + std::string rc_file = stlplus::env_vector()["YOINKRC"]; + if (!rc_file.empty()) { path += ":"; - path += configFile; + path += rc_file; } return path; } -void Main::setupGL() +void Main::setup_opengl() { glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); + //glEnable(GL_CULL_FACE); - glEnable(GL_LINE_SMOOTH); - glEnable(GL_POLYGON_SMOOTH); + //glEnable(GL_POINT_SMOOTH); + //glEnable(GL_LINE_SMOOTH); + //glEnable(GL_POLYGON_SMOOTH); glShadeModel(GL_SMOOTH); //glEnable(GL_BLEND); @@ -169,25 +175,24 @@ void Main::setupGL() glClearColor(0.0, 0.0, 0.0, 1.0); - //glMatrixMode(GL_PROJECTION); - //glLoadIdentity(); - //Mf::Scalar ratio = Mf::core.getVideo()->getWidth() / - //Mf::core.getVideo()->getHeight(); - //gluPerspective(60.0, ratio, 1.0, 250.0); + //glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); - //glMatrixMode(GL_MODELVIEW); -} + glEnable(GL_COLOR_MATERIAL); + glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); -void Main::contextCreated() -{ - // whenever the context is destroyed and a new one created, it probably - // won't contain our state so we need to set that up again - setupGL(); -} + float amb[] = {0.1f, 0.1f, 0.1f, 1.0f}; + float dif[] = {0.6f, 0.6f, 0.6f, 1.0f}; + //glLightModelfv(GL_LIGHT_MODEL_AMBIENT, light); + glLightfv(GL_LIGHT0, GL_AMBIENT, amb); + glLightfv(GL_LIGHT0, GL_DIFFUSE, dif); + float spec[] = {1.0f, 1.0f, 1.0f, 1.0f}; + glLightfv(GL_LIGHT0, GL_SPECULAR, spec); +} -void Main::printUsage() +void Main::print_usage() { std::cout << "Usage: " << PACKAGE" [-h|--help] [-i|--info] [OPTION=VALUE]..." @@ -209,93 +214,136 @@ void Main::printUsage() << "See documentation for more options." << std::endl; } -void Main::printInfo(int argc, char* argv[]) + +void Main::print_info(int argc, char* argv[]) { - std::string assets; - std::string datadir; - std::string config; + bool color = (isatty(1) == 1); + + stlplus::env_vector environment; + std::string assets; assets.assign(YOINK_DATADIR); - int accessible = access(assets.c_str(), R_OK); - if (accessible != 0) assets += " (no access)"; + if (!stlplus::file_readable(assets)) + { + assets += " "; + if (color) assets += "\033[1;91m"; + assets += "(no access)"; + if (color) assets += "\033[0m"; + } - char* temp = getenv("YOINK_DATADIR"); - if (temp) + std::string datadir = environment["YOINK_DATADIR"]; + if (!datadir.empty()) { - datadir = temp; - accessible = access(temp, R_OK); - if (accessible != 0) datadir += " (no access)"; + if (!stlplus::folder_readable(datadir)) + { + datadir += " "; + if (color) datadir += "\033[1;91m"; + datadir += "(no access)"; + if (color) datadir += "\033[0m"; + } } - temp = getenv("YOINKRC"); - if (temp) + std::string rc_file = environment["YOINKRC"]; + if (!rc_file.empty()) { - config = temp; - accessible = access(temp, R_OK); - if (accessible != 0) config += " (no access)"; + if (!stlplus::file_readable(rc_file)) rc_file += " (no access)"; } std::cout << " Executable: " << argv[0] << std::endl - << " Version: "VERSION << std::endl +#ifdef YOINK_GITHEAD + << " Commit: "YOINK_GITHEAD << std::endl +#endif + << " Version: " << PACKAGE_VERSION << std::endl << " Built: " << COMPILE_TIME << std::endl - << " Compiler: "COMPILER_STRING << std::endl + << " Compiler: " << COMPILER_STRING << std::endl << " Assets: " << assets << std::endl - << "Build options: " -#ifdef NDEBUG - << "-" + << "Build options: "; + +#if USE_CLOCK_GETTIME + print_option("clock_gettime", true); +#else + print_option("clock_gettime", false); +#endif +#if DEBUG + print_option("debug", true); +#else + print_option("debug", false); #endif - << "debug " -#ifndef USE_DOUBLE_PRECISION - << "-" +#if USE_GTK + print_option("gtk", true); +#else + print_option("gtk", false); #endif - << "double-precision " -#ifndef USE_GTK - << "-" +#if USE_HOTLOADING + print_option("hotload", true); +#else + print_option("hotload", false); #endif - << "gtk " -#ifndef PROFILING_ENABLED - << "-" +#if PROFILING_ENABLED + print_option("profile", true); +#else + print_option("profile", false); #endif - << "profile " -#ifndef USE_QT4 - << "-" +#if USE_QT4 + print_option("qt4", true); +#else + print_option("qt4", false); #endif - << "qt4 " -#ifndef USE_THREADS - << "-" +#if USE_THREADS + print_option("threads", true); +#else + print_option("threads", false); #endif - << "threads" << std::endl - << " YOINKRC: " << config << std::endl + std::cout << std::endl; + std::cout << " YOINKRC: " << rc_file << std::endl << "YOINK_DATADIR: " << datadir << std::endl; } +void Main::print_option(const std::string& option, bool enabled) +{ + if (isatty(1) == 1) + { + if (enabled) std::cout << "\033[1;94m"; + else std::cout << "\033[1m"; + } + if (!enabled) std::cout << "-"; + std::cout << option; + if (isatty(1) == 1) std::cout << "\033[0m"; + std::cout << " "; +} + void hello() { + if (isatty(1) == 1) std::cout << "\033[94m"; std::cout << std::endl << PACKAGE_STRING << std::endl << "Compiled " << __TIME__ " " __DATE__ << std::endl << "Send patches and bug reports to <" - PACKAGE_BUGREPORT << ">." << std::endl << std::endl; + PACKAGE_BUGREPORT << ">." << std::endl << moof::log::endl; } void goodbye() { - std::cout << std::endl << "Goodbye..." << std::endl << std::endl; + if (isatty(1) == 1) std::cout << "\033[94m"; + std::cout << std::endl << "Goodbye." << std::endl << moof::log::endl; } + int main(int argc, char* argv[]) { + moof::backend backend; + if (argc > 1) { std::string arg(argv[1]); if (arg == "-h" || arg == "--help") { - Main::printUsage(); + Main::print_usage(); return 0; } else if (arg == "-i" || arg == "--info") { - Main::printInfo(argc, argv); + Main::print_info(argc, argv); return 0; } } @@ -303,35 +351,47 @@ int main(int argc, char* argv[]) hello(); atexit(goodbye); - Mf::Resource::addSearchPaths(Main::getSearchPath()); + moof::resource::set_search_paths(Main::search_paths()); - Mf::settings.loadFromFiles(Main::getConfigPath()); - Mf::settings.parseArgs(argc, argv); + moof::settings settings(argc, argv, Main::config_paths()); - Mf::Log::Level logLevel = Mf::Log::INFO; - Mf::settings.get("loglevel", logLevel); - Mf::Log::setLevel(logLevel); + enum moof::log::level logLevel = moof::log::info; + settings.get("loglevel", logLevel); + moof::log::level(logLevel); try { - Mf::Video video(PACKAGE_STRING, - Mf::Resource::getPath(PACKAGE".png")); - MainP app = Main::alloc(); - Mf::core.push(app); - Mf::core.run(); + //std::string iconPath(PACKAGE".png"); + //iconPath = moof::resource::find_file(iconPath); + //moof::image icon(iconPath); + //icon.set_as_icon(); + moof::image_handle icon(PACKAGE, "png"); + if (icon) icon->set_as_icon(); + else moof::log_error("no icon loaded"); + icon.unload(); + + class moof::video::attributes attributes(settings); + moof::video video(PACKAGE_STRING, attributes); + Main mainView(settings, video); + + mainView.run(); + return 0; } - catch (const Mf::Error& error) + catch (const std::exception& e) { - Mf::ModalDialog dialog; - dialog.title = PACKAGE_STRING; - dialog.text1 = "Unhandled Exception"; - dialog.text2 = getErrorString(error); - dialog.type = Mf::ModalDialog::CRITICAL; + moof::modal_dialog dialog(moof::modal_dialog::error, + PACKAGE_STRING, "unhandled exception", + e.what()); + dialog.run(); + } + catch (const char* e) + { + moof::modal_dialog dialog(moof::modal_dialog::error, + PACKAGE_STRING, "unhandled exception", + e); dialog.run(); - - return 1; } - return 0; + return 1; }