X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FYoinkApp.cc;h=a8a06cc82f6d1e6f9f694fda7114c3c7f322ef08;hp=1b9fa030f16d077ff8bca67d6b2fe9d79837fb81;hb=542e50a284c7f5b144a5c97c17f6d89b2af0175c;hpb=493ddb59a8620b49dfa0ff62ce93395ebfd02e86 diff --git a/src/YoinkApp.cc b/src/YoinkApp.cc index 1b9fa03..a8a06cc 100644 --- a/src/YoinkApp.cc +++ b/src/YoinkApp.cc @@ -30,11 +30,12 @@ #include #include -#include - +#include +#include #include #include #include +#include #include #include @@ -94,45 +95,39 @@ static std::string iconFile() // then look in the configured data directory Mf::Resource::addSearchPath(YOINK_DATADIR); - return Mf::Resource::getPathToResource("yoink.png"); + return Mf::Resource::getPath("yoink.png"); } YoinkApp::YoinkApp(int argc, char* argv[]) : - Mf::Engine(argc, argv, configFiles(), PACKAGE_STRING, iconFile()) + Mf::Engine(argc, argv, configFiles(), PACKAGE_STRING, iconFile()), + music("NightFusionIntro"), + punchSound("RobotPunch") { - Mf::Dispatcher::instance().addHandler("video.context_recreated", + Mf::dispatcher::addHandler("video.context_recreated", boost::bind(&YoinkApp::contextRecreated, this, _1), this); setupGL(); - state = 0.0; - - someChar = new Character("RobotTrooper"); - someChar->getAnimation().startSequence("Run"); - - font = new TilemapFont; + music.setLooping(true); + music.enqueue("NightFusionLoop"); + music.stream(); - Mf::Vector2 coeffs[4]; - coeffs[0] = Mf::Vector2(0.0, 0.0); - coeffs[1] = Mf::Vector2(0.5, 0.0); - coeffs[2] = Mf::Vector2(0.5, 0.0); - coeffs[3] = Mf::Vector2(1.0, 0.0); - interp.init(coeffs, 1.0, Mf::Interpolator::OSCILLATE); + heroine = Character::alloc("RobotTrooper"); + heroine->getAnimation().startSequence("Run"); - Mf::Scalar coeff[2] = {1.0, 0.0}; - fadeIn.init(coeff, 0.5f); + Mf::Scalar a[6] = {0.0, 1.5, -0.5, 3.0, -2.0, 1.0}; + interp.init(a, 2.0, Mf::Interpolator::OSCILLATE); - testScene = new Mf::Scene("Test"); + Mf::Scalar b[2] = {1.0, 0.0}; + fadeIn.init(b, 1.0); - x = y = z = 0.0; + octree = Mf::loadScene("Classic"); + heroine->treeNode = octree->insert(heroine); } YoinkApp::~YoinkApp() { - delete someChar; - delete font; - - Mf::Dispatcher::instance().removeHandler(this); + Mf::dispatcher::removeHandler(this); } @@ -157,179 +152,92 @@ void YoinkApp::setupGL() glClearColor(1.0, 0.0, 0.0, 1.0); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluPerspective(60.0, 1.33333, 1.0, 2500.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); } -void YoinkApp::contextRecreated(const Mf::Notification& note) +void YoinkApp::contextRecreated(const Mf::Notification* note) { - // Whenever the context 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.2; - - fadeIn.update(dt); + //dt *= 0.7; + fadeIn.update(dt); camera.update(t, dt); + heroine->update(t, dt); - someChar->getAnimation().update(t, dt); - interp.update(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)); - prevstate = state; - state += dt; + interp.update(dt); + hud.setBar1Progress(interp.getState(dt)); + hud.setBar2Progress(1.0 - interp.getState(dt)); } void YoinkApp::draw(Mf::Scalar alpha) { - //Mf::Vector4 meh; - //meh.random(0.0, 1.0); - //static Mf::Vector4 c1(meh); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - //Mf::Scalar drawstate = cml::lerp(prevstate, state, alpha); - //Mf::Scalar sinstate = std::sin(drawstate); - //Mf::Scalar cosstate = std::cos(drawstate); - - - glMatrixMode(GL_MODELVIEW); - //glLoadIdentity(); - - glBindTexture(GL_TEXTURE_2D, 0); - //glRotatef(drawstate*15.0f, 0.0, 1.0, 0.0); - //glTranslatef(x, y, z); - glLoadMatrix(camera.getTransformation().data()); + glLoadMatrix(camera.getModelviewMatrix().data()); // DRAW THE SCENE - testScene->draw(alpha); - - - /* - glLoadIdentity(); - - someChar->getTilemap().bind(); - glColor3f(1.0, 1.0, 1.0); - - Mf::Tilemap::Index heroFrame = someChar->getAnimation().getFrame(); - - Mf::Scalar coords[8]; - someChar->getTilemap().getTileCoords(heroFrame, coords); - - glBegin(GL_QUADS); - glTexCoord2f(coords[0], coords[1]); - glVertex3f(-1.0, 0.0, 0.0); - glTexCoord2f(coords[2], coords[3]); - glVertex3f(0.0, 0.0, 0.0); - glTexCoord2f(coords[4], coords[5]); - glVertex3f(0.0, 1.0, 0.0); - glTexCoord2f(coords[6], coords[7]); - glVertex3f(-1.0, 1.0, 0.0); - glEnd(); - - - someChar->getTilemap().getTileCoords(heroFrame, coords, - Mf::Tilemap::REVERSE); + Mf::Texture::resetBind(); - glBegin(GL_QUADS); - glTexCoord2f(coords[0], coords[1]); - glVertex3f(0.0, 0.0, 0.0); - glTexCoord2f(coords[2], coords[3]); - glVertex3f(1.0, 0.0, 0.0); - glTexCoord2f(coords[4], coords[5]); - glVertex3f(1.0, 1.0, 0.0); - glTexCoord2f(coords[6], coords[7]); - glVertex3f(0.0, 1.0, 0.0); - glEnd(); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glColor4f(1.0,0.0,0.0,0.5); + octree->drawIfVisible(alpha, camera.getFrustum()); - glBindTexture(GL_TEXTURE_2D, 0); - glColor4v(c1.data()); + //heroine->draw(alpha); + heroine->getAabb().draw(); - glRectd(-cosstate, -sinstate, sinstate, cosstate); - glRectf(0.0f, 0.0f, sinstate, cosstate); - - font->bind(); - - font->getTileCoords('c', coords); - - glBegin(GL_QUADS); - glTexCoord2f(coords[0], coords[1]); - glVertex3f(-1.0, 0.0, 0.0); - glTexCoord2f(coords[2], coords[3]); - glVertex3f(0.0, 0.0, 0.0); - glTexCoord2f(coords[4], coords[5]); - glVertex3f(0.0, 1.0, 0.0); - glTexCoord2f(coords[6], coords[7]); - glVertex3f(-1.0, 1.0, 0.0); - glEnd(); - - font->getTileCoords('h', coords); - - glBegin(GL_QUADS); - glTexCoord2f(coords[0], coords[1]); - glVertex3f(0.0, 0.0, 0.0); - glTexCoord2f(coords[2], coords[3]); - glVertex3f(1.0, 0.0, 0.0); - glTexCoord2f(coords[4], coords[5]); - glVertex3f(1.0, 1.0, 0.0); - glTexCoord2f(coords[6], coords[7]); - glVertex3f(0.0, 1.0, 0.0); - glEnd(); - - font->getTileCoords('a', coords); - - glBegin(GL_QUADS); - glTexCoord2f(coords[0], coords[1]); - glVertex3f(-1.0, -1.0, 0.0); - glTexCoord2f(coords[2], coords[3]); - glVertex3f(0.0, -1.0, 0.0); - glTexCoord2f(coords[4], coords[5]); - glVertex3f(0.0, 0.0, 0.0); - glTexCoord2f(coords[6], coords[7]); - glVertex3f(-1.0, 0.0, 0.0); - glEnd(); - - font->getTileCoords('z', coords); - - glBegin(GL_QUADS); - glTexCoord2f(coords[0], coords[1]); - glVertex3(0.0, -1.0, 0.0); - glTexCoord2f(coords[2], coords[3]); - glVertex3(1.0, -1.0, 0.0); - glTexCoord2f(coords[4], coords[5]); - glVertex3(1.0, 0.0, 0.0); - glTexCoord2f(coords[6], coords[7]); - glVertex3(0.0, 0.0, 0.0); - glEnd(); + hud.draw(); + // DRAW FADE glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glDisable(GL_DEPTH_TEST); - - glBindTexture(GL_TEXTURE_2D, 0); - glColor4f(0.0f, 0.0f, 0.0f, 1.0f); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glColor4f(0.0f, 0.0f, 0.0f, fadeIn.getState(alpha)); + Mf::Texture::resetBind(); - glBegin(GL_LINES); - glVertex2f(0.0f, 0.0f); - glVertex2v(interp.getState(alpha).data()); + //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(); - glColor4f(0.0f, 0.0f, 0.0f, fadeIn.getState(alpha)); - glRectf(-1.0f, -1.0f, 1.0f, 1.0f); - glDisable(GL_BLEND); - glEnable(GL_DEPTH_TEST);*/ + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); } void YoinkApp::handleEvent(const Mf::Event& event) @@ -340,52 +248,42 @@ void YoinkApp::handleEvent(const Mf::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_a) + else if (event.key.keysym.sym == SDLK_t) { - someChar->getAnimation().startSequence("Punch"); + Mf::dispatcher::dispatch("video.context_recreated"); + break; } - else if (event.key.keysym.sym == SDLK_r) + else if (event.key.keysym.sym == SDLK_p) { - testScene->refresh(); + music.toggle(); + break; } else if (event.key.keysym.sym == SDLK_l) { getVideo().toggleCursorGrab(); getVideo().toggleCursorVisible(); + break; } - //else if (event.key.keysym.sym == SDLK_RIGHT) - //{ - //x -= 50.0; - //} - //else if (event.key.keysym.sym == SDLK_LEFT) - //{ - //x += 50.0; - //} - //else if (event.key.keysym.sym == SDLK_UP) - //{ - //y -= 50.0; - //} - //else if (event.key.keysym.sym == SDLK_DOWN) - //{ - //y += 50.0; - //} - //else if (event.key.keysym.sym == SDLK_PAGEUP) - //{ - //z += 50.0; - //} - //else if (event.key.keysym.sym == SDLK_PAGEDOWN) - //{ - //z -= 50.0; - //} + + case SDL_KEYUP: + heroine->handleEvent(event); case SDL_MOUSEMOTION: case SDL_MOUSEBUTTONDOWN: - camera.adjustFromInput(event); + camera.handleEvent(event); break; case SDL_QUIT: @@ -394,26 +292,35 @@ void YoinkApp::handleEvent(const Mf::Event& event) case SDL_VIDEORESIZE: glViewport(0, 0, event.resize.w, event.resize.h); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - - gluPerspective(60.0, double(event.resize.w / event.resize.h), 1.0, 2500.0); - - glMatrixMode(GL_MODELVIEW); + 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; } } + int main(int argc, char* argv[]) { - std::cout << PACKAGE_STRING << std::endl + std::cout << std::endl << PACKAGE_STRING << std::endl << "Compiled " << __TIME__ " " __DATE__ << std::endl - << "Send requests, patches, and bug reports to <" + << "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 @@ -421,15 +328,18 @@ int main(int argc, char* argv[]) YoinkApp app(argc, argv); status = app.run(); } - catch (Mf::Engine::Exception e) + catch (Mf::Exception e) { - std::cerr << "Unhandled exception: " << e.what() << std::endl; - status = 1; + Mf::logError("unhandled exception: <<%s>>", e.what()); + Mf::logInfo("it's time to crash now :-("); + //status = 1; + throw e; } - std::cout << "Goodbye..." << std::endl; + std::cout << std::endl << "Goodbye..." << std::endl << std::endl; return status; } + /** vim: set ts=4 sw=4 tw=80: *************************************************/