X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMainLayer.cc;fp=src%2FMainLayer.cc;h=51881a770d0e03d8f6d2846c96542c4a2e265d34;hp=0000000000000000000000000000000000000000;hb=892da43bf5796e7c5f593a6d0f53bd797a36bd3e;hpb=ca0f7bdfba63140dca0bd20586d31980f3938eb2 diff --git a/src/MainLayer.cc b/src/MainLayer.cc new file mode 100644 index 0000000..51881a7 --- /dev/null +++ b/src/MainLayer.cc @@ -0,0 +1,247 @@ + +/******************************************************************************* + + Copyright (c) 2009, Charles McGarvey + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ + +#include // getenv +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "GameLayer.hh" +#include "MainLayer.hh" + +#if HAVE_CONFIG_H +#include "config.h" +#endif + + +MainLayer::MainLayer() +{ + Mf::dispatcher::addHandler("video.context_recreated", + boost::bind(&MainLayer::contextRecreated, this, _1), this); + setupGL(); +} + +MainLayer::~MainLayer() +{ + Mf::dispatcher::removeHandler(this); +} + + +void MainLayer::pushed(Mf::Engine& e) +{ + engine = &e; + engine->pushLayer(GameLayer::alloc()); +} + + +void MainLayer::draw(Mf::Scalar alpha) const +{ + glClear(GL_DEPTH_BUFFER_BIT); +} + +bool MainLayer::handleEvent(const Mf::Event& event) +{ + 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 MainLayer::setupGL() +{ + glEnable(GL_TEXTURE_2D); + + //glEnable(GL_CULL_FACE); + glEnable(GL_DEPTH_TEST); + + glShadeModel(GL_SMOOTH); + //glEnable(GL_POLYGON_SMOOTH); + + //int texSize; + //glGetIntegerv(GL_MAX_TEXTURE_SIZE, &texSize); + //std::cout << "texture size: " << texSize << std::endl; + + //glEnable(GL_BLEND); + //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_ALPHA_TEST); + glAlphaFunc(GL_GREATER, 0.0); + + glClearColor(1.0, 0.0, 0.0, 1.0); + + //glMatrixMode(GL_PROJECTION); + //glLoadIdentity(); + //gluPerspective(60.0, 1.33333, 1.0, 2500.0); + + //glMatrixMode(GL_MODELVIEW); + + //glLineWidth(10.0f); +} + +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 + setupGL(); +} + + + +void printUsage() +{ + std::cout << "Usage: "PACKAGE" [-h|--help] [OPTION=VALUE]..." << std::endl + << "The alien-smashing action game." << std::endl + << std::endl + << "Options:" << std::endl + << " -h, --help" << std::endl + << " show this help and exit" << std::endl + << " detail=1|2|3" << std::endl + << " the level of detail of game scenes" << std::endl + << " fullscreen=true|false" << std::endl + << " if true, uses the entire display" << std::endl + << " maxfps=num" << std::endl + << " the maximum number of frames per second" << std::endl + << std::endl + << "See documentation for more options." << std::endl; +} + +int main(int argc, char* argv[]) +{ + if (argc > 1 && + (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0)) + { + printUsage(); + return 0; + } + + 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; + + +#if YOINK_LOGLEVEL >= 4 + Mf::setLogLevel(Mf::LOG_DEBUG); +#elif YOINK_LOGLEVEL >= 3 + Mf::setLogLevel(Mf::LOG_INFO); +#elif YOINK_LOGLEVEL >= 2 + Mf::setLogLevel(Mf::LOG_SCRIPT); +#elif YOINK_LOGLEVEL >= 1 + Mf::setLogLevel(Mf::LOG_ERROR); +#elif YOINK_LOGLEVEL + Mf::setLogLevel(Mf::LOG_NONE); +#endif + + + // 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 + { + 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 :-("); + throw e; + } + + std::cout << std::endl << "Goodbye..." << std::endl << std::endl; + return 0; +} + + +/** vim: set ts=4 sw=4 tw=80: *************************************************/ +