X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FYoinkApp.cc;h=a8a06cc82f6d1e6f9f694fda7114c3c7f322ef08;hp=64decfb73a88f9e6b0b405f1c94fa3c7c9babc2e;hb=542e50a284c7f5b144a5c97c17f6d89b2af0175c;hpb=79b5f738f2e38acb60cda7e09f54802933a17105 diff --git a/src/YoinkApp.cc b/src/YoinkApp.cc index 64decfb..a8a06cc 100644 --- a/src/YoinkApp.cc +++ b/src/YoinkApp.cc @@ -26,111 +26,221 @@ *******************************************************************************/ +#include // getenv #include #include -#include +#include +#include +#include +#include +#include +#include +#include +#include -#include "opengl.hh" -#include "video.hh" +#include "YoinkApp.hh" -#include "vector.hh" +#if HAVE_CONFIG_H +#include "config.h" +#endif -#include "YoinkApp.hh" +static std::string configFiles() +{ + std::string files; + + char* configFile = getenv("YOINKRC"); + char* dataDir = getenv("YOINK_DATADIR"); + + if (configFile) + { + // if a config file from the environment variable is specified, we want + // to load it first so it has precedence + files += configFile; + files += ":"; + } + + // add the colon-delimited paths from configure + files += YOINK_CONFIGFILES; -YoinkApp::YoinkApp(int argc, char* argv[]) - : dc::engine("Yoink "VERSION, argc, argv, "yoinkrc") + if (dataDir) + { + // if another data directory is set in the environment, look for a + // config file there + files += ":"; + files += dataDir; + files += "/yoinkrc"; + } + + // look in the configured data directory last of all + files += ":"; + files += (dataDir ? dataDir : YOINK_DATADIR); + files += "/yoinkrc"; + + return files; +} + +static std::string iconFile() { - std::cout << "Yoink "VERSION << std::endl - << "Compiled " << __TIME__ " " __DATE__ << std::endl - << "Send requests, patches, and bug reports to <" PACKAGE_BUGREPORT - << ">." << std::endl << std::endl; + char* dataDir = getenv("YOINK_DATADIR"); - state = 0.0; + // 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); + } - glEnable(GL_TEXTURE_2D); + // then look in the configured data directory + Mf::Resource::addSearchPath(YOINK_DATADIR); + + return Mf::Resource::getPath("yoink.png"); +} - heroineTexture = new dc::texture("Heroine.png"); - glShadeModel(GL_SMOOTH); - //glEnable(GL_DEPTH_TEST); - - // Enable transparency: - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +YoinkApp::YoinkApp(int argc, char* argv[]) : + Mf::Engine(argc, argv, configFiles(), PACKAGE_STRING, iconFile()), + music("NightFusionIntro"), + punchSound("RobotPunch") +{ + Mf::dispatcher::addHandler("video.context_recreated", + boost::bind(&YoinkApp::contextRecreated, this, _1), this); + setupGL(); - glLoadIdentity(); + 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); + Mf::Scalar b[2] = {1.0, 0.0}; + fadeIn.init(b, 1.0); + + octree = Mf::loadScene("Classic"); + heroine->treeNode = octree->insert(heroine); } YoinkApp::~YoinkApp() { - delete heroineTexture; - std::cout << "Goodbye..." << std::endl; + Mf::dispatcher::removeHandler(this); } -void YoinkApp::update(double t, double dt) +void YoinkApp::setupGL() { - //dt *= 0.1; + 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); + camera.setProjection(cml::rad(60.0), 1.33333, 32.0, 2500.0); + camera.uploadProjectionToGL(); + + //glMatrixMode(GL_MODELVIEW); + + //glLineWidth(10.0f); +} - prevstate = state; - state += dt; +void YoinkApp::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 drawrect(dc::scalar a, dc::scalar b, dc::scalar c, dc::scalar d) + +void YoinkApp::update(Mf::Scalar t, Mf::Scalar dt) { - glBegin(GL_QUADS); - glTexCoord2f(1.0, 1.0); - glVertex3d(a, d, 0.0); - glTexCoord2f(1.0, 0.0); - glVertex3d(a, b, 0.0); - glTexCoord2f(0.0, 0.0); - glVertex3d(c, b, 0.0); - glTexCoord2f(0.0, 1.0); - glVertex3d(c, d, 0.0); - glEnd(); + //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)); + + interp.update(dt); + hud.setBar1Progress(interp.getState(dt)); + hud.setBar2Progress(1.0 - interp.getState(dt)); } -void YoinkApp::draw(double alpha) + +void YoinkApp::draw(Mf::Scalar alpha) { - static dc::vector3 c1 = dc::vector3::random(0.0, 1.0); - static dc::vector3 c2 = dc::vector3::random(0.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glClearColor(1.0, 0.0, 0.0, 1.0); - glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_MODELVIEW); + glLoadMatrix(camera.getModelviewMatrix().data()); - double drawstate = state * alpha + prevstate * (1.0 - alpha); - double sinstate = std::sin(drawstate); - double cosstate = std::cos(drawstate); + // DRAW THE SCENE + Mf::Texture::resetBind(); - glBindTexture(GL_TEXTURE_2D, 0); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glColor3dv(c1.array); - drawrect(-cosstate, -sinstate, sinstate, cosstate); - glColor3dv(c2.array); - drawrect(0.0, 0.0, sinstate, cosstate); + octree->drawIfVisible(alpha, camera.getFrustum()); - glColor4f(1.0, 1.0, 1.0, 1.0); + //heroine->draw(alpha); + heroine->getAabb().draw(); - heroineTexture->bind(); + 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); - glTexCoord2f(0.0, 0.0); - glVertex3f(0.0, 0.0, 0.0); - glTexCoord2f(1.0/8.0, 0.0); - glVertex3f(1.0, 0.0, 0.0); - glTexCoord2f(1.0/8.0, 1.0/4.0); - glVertex3f(1.0, 1.0, 0.0); - glTexCoord2f(0.0, 1.0/4.0); - glVertex3f(0.0, 1.0, 0.0); + 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(); - - glFlush(); + + glDisable(GL_BLEND); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); } -void YoinkApp::dispatchEvent(const SDL_Event& event) +void YoinkApp::handleEvent(const Mf::Event& event) { switch (event.type) { @@ -138,45 +248,98 @@ void YoinkApp::dispatchEvent(const SDL_Event& event) 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; } } -#include "dispatcher.hh" -class Foo : public dc::notification +int main(int argc, char* argv[]) { -public: - static void func(const dc::notification& meh) + 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_WARNING); +#elif YOINK_LOGLEVEL >= 1 + Mf::setLogLevel(Mf::LOG_ERROR); +#elif YOINK_LOGLEVEL + Mf::setLogLevel(Mf::LOG_NONE); +#endif + + int status = 0; + + try { - std::cout << "func: " << std::endl; + YoinkApp app(argc, argv); + status = app.run(); } - - void snap(int zzz, const dc::notification& nice, float lean) + catch (Mf::Exception e) { - std::cout << "snap: " << zzz << "," << lean << std::endl; + Mf::logError("unhandled exception: <<%s>>", e.what()); + Mf::logInfo("it's time to crash now :-("); + //status = 1; + throw e; } -}; -void MyHandler(const dc::notification& cool) -{ - std::cout << "MyHandler with a notification" << std::endl; + std::cout << std::endl << "Goodbye..." << std::endl << std::endl; + return status; } -int main(int argc, char* argv[]) -{ - YoinkApp app(argc, argv); - return app.run(); -} +/** vim: set ts=4 sw=4 tw=80: *************************************************/