X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMainLayer.cc;fp=src%2FYoinkApp.cc;h=51881a770d0e03d8f6d2846c96542c4a2e265d34;hp=8690143d16b7356439849753bff0468ec8575a83;hb=892da43bf5796e7c5f593a6d0f53bd797a36bd3e;hpb=ca0f7bdfba63140dca0bd20586d31980f3938eb2 diff --git a/src/YoinkApp.cc b/src/MainLayer.cc similarity index 50% rename from src/YoinkApp.cc rename to src/MainLayer.cc index 8690143..51881a7 100644 --- a/src/YoinkApp.cc +++ b/src/MainLayer.cc @@ -31,98 +31,81 @@ #include #include +#include #include #include -#include #include -#include -#include -#include +#include #include -#include "YoinkApp.hh" +#include "GameLayer.hh" +#include "MainLayer.hh" #if HAVE_CONFIG_H #include "config.h" #endif -static std::string configFiles() +MainLayer::MainLayer() { - std::string files; - - // look in the configured data directory last of all - char* dataDir = getenv("YOINK_DATADIR"); - files += (dataDir ? dataDir : YOINK_DATADIR); - files += "/yoinkrc"; - - // add the colon-delimited paths from configure - files += ":"; - files += YOINK_CONFIGFILES; - - char* configFile = getenv("YOINKRC"); - if (configFile) - { - // if a config file from the environment variable is specified, we want - // to load it first so it has precedence - files += ":"; - files += configFile; - } - - return files; + Mf::dispatcher::addHandler("video.context_recreated", + boost::bind(&MainLayer::contextRecreated, this, _1), this); + setupGL(); } -static std::string iconFile() +MainLayer::~MainLayer() { - char* dataDir = getenv("YOINK_DATADIR"); - - // first set up the search paths so we can find the icon and other resources - if (dataDir) - { - // look first in the data directory specified by the environment - Mf::Resource::addSearchPath(dataDir); - } - - // then look in the configured data directory - Mf::Resource::addSearchPath(YOINK_DATADIR); - - return Mf::Resource::getPath("yoink.png"); + Mf::dispatcher::removeHandler(this); } -YoinkApp::YoinkApp(int argc, char* argv[]) : - Mf::Engine(argc, argv, configFiles(), PACKAGE_STRING, iconFile()), - music("NightFusionIntro"), - punchSound("RobotPunch") +void MainLayer::pushed(Mf::Engine& e) { - Mf::dispatcher::addHandler("video.context_recreated", - boost::bind(&YoinkApp::contextRecreated, this, _1), this); - setupGL(); - - music.setLooping(true); - music.enqueue("NightFusionLoop"); - music.stream(); - - heroine = Character::alloc("RobotTrooper"); - heroine->getAnimation().startSequence("Run"); - - Mf::Scalar a[6] = {0.0, 1.5, -0.5, 3.0, -2.0, 1.0}; - interp.init(a, 2.0, Mf::Interpolator::OSCILLATE); + engine = &e; + engine->pushLayer(GameLayer::alloc()); +} - Mf::Scalar b[2] = {1.0, 0.0}; - fadeIn.init(b, 1.0); - octree = Mf::loadScene("Classic"); - heroine->treeNode = octree->insert(heroine); +void MainLayer::draw(Mf::Scalar alpha) const +{ + glClear(GL_DEPTH_BUFFER_BIT); } -YoinkApp::~YoinkApp() +bool MainLayer::handleEvent(const Mf::Event& event) { - Mf::dispatcher::removeHandler(this); + switch (event.type) + { + case SDL_KEYDOWN: + if (event.key.keysym.sym == SDLK_ESCAPE) + { + engine->clearLayers(); + } + else if (event.key.keysym.sym == SDLK_f) + { + engine->getVideo().toggleFull(); + } + else if (event.key.keysym.sym == SDLK_l) + { + Mf::Video& video = engine->getVideo(); + video.toggleCursorGrab(); + video.toggleCursorVisible(); + } + else if (event.key.keysym.sym == SDLK_y) + { + engine->pushLayer(GameLayer::alloc()); + } + break; + + case SDL_QUIT: + engine->clearLayers(); + break; + } + + return false; } -void YoinkApp::setupGL() +void MainLayer::setupGL() { glEnable(GL_TEXTURE_2D); @@ -146,155 +129,20 @@ void YoinkApp::setupGL() //glMatrixMode(GL_PROJECTION); //glLoadIdentity(); //gluPerspective(60.0, 1.33333, 1.0, 2500.0); - camera.setProjection(cml::rad(60.0), 1.33333, 32.0, 2500.0); - camera.uploadProjectionToGL(); //glMatrixMode(GL_MODELVIEW); //glLineWidth(10.0f); } -void YoinkApp::contextRecreated(const Mf::Notification* note) +void MainLayer::contextRecreated(const Mf::Notification* note) { - // 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. + // 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(); } -void YoinkApp::update(Mf::Scalar t, Mf::Scalar dt) -{ - //dt *= 0.7; - - fadeIn.update(dt); - camera.update(t, dt); - heroine->update(t, dt); - - // reinsert heroine - heroine->treeNode = octree->reinsert(heroine, heroine->treeNode); - octree->print(heroine->treeNode); - - //camera.lookAt(heroine->getSphere().point); - camera.setPosition(Mf::Vector3(-heroine->current.position[0], - -heroine->current.position[1], -256)); - - Mf::Vector3 heroinePosition; - Mf::promoteVector(heroinePosition, heroine->current.position); - Mf::Sound::setListenerPosition(heroinePosition); - - interp.update(dt); - hud.setBar1Progress(interp.getState(dt)); - hud.setBar2Progress(1.0 - interp.getState(dt)); -} - - -void YoinkApp::draw(Mf::Scalar alpha) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glMatrixMode(GL_MODELVIEW); - glLoadMatrix(camera.getModelviewMatrix().data()); - - // DRAW THE SCENE - Mf::Texture::resetBind(); - - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - - octree->drawIfVisible(alpha, camera.getFrustum()); - - //heroine->draw(alpha); - heroine->getAabb().draw(); - - hud.draw(); - - // DRAW FADE - glEnable(GL_BLEND); - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - glColor4f(0.0f, 0.0f, 0.0f, fadeIn.getState(alpha)); - Mf::Texture::resetBind(); - - //glRectf(-1.0f, -1.0f, 1.0f, 1.0f); - glBegin(GL_QUADS); - glVertex3f(-1.0, -1.0, -0.1); - glVertex3f(1.0, -1.0, -0.1); - glVertex3f(1.0, 1.0, -0.1); - glVertex3f(-1.0, 1.0, -0.1); - glEnd(); - - glDisable(GL_BLEND); - - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); -} - -void YoinkApp::handleEvent(const Mf::Event& event) -{ - switch (event.type) - { - case SDL_KEYDOWN: - if (event.key.keysym.sym == SDLK_ESCAPE) - { - stop(); - break; - } - else if (event.key.keysym.sym == SDLK_f) - { - getVideo().toggleFull(); - break; - } - else if (event.key.keysym.sym == SDLK_SPACE) - { - heroine->getAnimation().startSequence("Punch"); - punchSound.play(); - break; - } - else if (event.key.keysym.sym == SDLK_t) - { - Mf::dispatcher::dispatch("video.context_recreated"); - break; - } - else if (event.key.keysym.sym == SDLK_p) - { - music.toggle(); - break; - } - else if (event.key.keysym.sym == SDLK_l) - { - getVideo().toggleCursorGrab(); - getVideo().toggleCursorVisible(); - break; - } - - case SDL_KEYUP: - heroine->handleEvent(event); - - case SDL_MOUSEMOTION: - case SDL_MOUSEBUTTONDOWN: - camera.handleEvent(event); - break; - - case SDL_QUIT: - stop(); - break; - - case SDL_VIDEORESIZE: - glViewport(0, 0, event.resize.w, event.resize.h); - hud.resize(event.resize.w, event.resize.h); - camera.setProjection(cml::rad(60.0), - double(event.resize.w) / double(event.resize.h), 32.0, 2500.0); - camera.uploadProjectionToGL(); - break; - } -} - void printUsage() { @@ -328,6 +176,7 @@ int main(int argc, char* argv[]) << "Send patches and bug reports to <" PACKAGE_BUGREPORT << ">." << std::endl << std::endl; + #if YOINK_LOGLEVEL >= 4 Mf::setLogLevel(Mf::LOG_DEBUG); #elif YOINK_LOGLEVEL >= 3 @@ -340,23 +189,57 @@ int main(int argc, char* argv[]) Mf::setLogLevel(Mf::LOG_NONE); #endif - int status = 0; + + // Add search paths; they should be searched in this order: + // 1. YOINK_DATADIR (environment) + // 2. YOINK_DATADIR (configure) + + char* dataDir = getenv("YOINK_DATADIR"); + if (dataDir) + { + Mf::Resource::addSearchPath(dataDir); + } + + Mf::Resource::addSearchPath(YOINK_DATADIR); + + std::string iconFile = Mf::Resource::getPath("yoink.png"); + + + // Build the list of config files to search for, in this order: + // 1. YOINK_DATADIR/yoinkrc + // 2. /etc/yoinkrc + // 3. $HOME/.yoinkrc + // 4. YOINKRC (environment) + + std::string configFiles; + + configFiles += Mf::Resource::getPath("yoinkrc"); + configFiles += ":/etc/yoinkrc:$HOME/.yoinkrc"; + + char* configFile = getenv("YOINKRC"); + if (configFile) + { + configFiles += ":"; + configFiles += configFile; + } + try { - YoinkApp app(argc, argv); - status = app.run(); + Mf::Engine app(argc, argv, PACKAGE_STRING, iconFile, configFiles); + app.pushLayer(MainLayer::alloc()); + + app.run(); } catch (Mf::Exception e) { Mf::logError("unhandled exception: <<%s>>", e.what()); Mf::logInfo("it's time to crash now :-("); - //status = 1; throw e; } std::cout << std::endl << "Goodbye..." << std::endl << std::endl; - return status; + return 0; }