X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FYoinkApp.cc;h=4b024b47ec74f1e617d87b96689e7a645fbdd4c6;hp=64decfb73a88f9e6b0b405f1c94fa3c7c9babc2e;hb=7d15b919681bb9ec0088b4b27c6abf62d6dfb9b1;hpb=0fffd0097d7b496454413e57b398c903ecc252e4 diff --git a/src/YoinkApp.cc b/src/YoinkApp.cc index 64decfb..4b024b4 100644 --- a/src/YoinkApp.cc +++ b/src/YoinkApp.cc @@ -29,154 +29,298 @@ #include #include +#include // getenv + #include #include "opengl.hh" #include "video.hh" +#include "settings.hh" -#include "vector.hh" +#include "math.hh" #include "YoinkApp.hh" +#include "timer.hh" + +#if HAVE_CONFIG_H +#include "config.h" +#endif + + +static std::string configFiles() +{ + std::string files; + + char* configFile = getenv("YOINK_CONFIGFILE"); + + if (configFile) + { + // if a config file from the environment variable is specified, we want + // to load it first + files += configFile; + files += ":"; + } + + files += YOINK_CONFIGFILES; + + return files; +} + -YoinkApp::YoinkApp(int argc, char* argv[]) - : dc::engine("Yoink "VERSION, argc, argv, "yoinkrc") +YoinkApp::YoinkApp(int argc, char* argv[]) : + dc::engine(PACKAGE_STRING, argc, argv, configFiles()) { - std::cout << "Yoink "VERSION << std::endl + std::cout << PACKAGE_STRING << std::endl << "Compiled " << __TIME__ " " __DATE__ << std::endl - << "Send requests, patches, and bug reports to <" PACKAGE_BUGREPORT - << ">." << std::endl << std::endl; + << "Send requests, patches, and bug reports to <" + PACKAGE_BUGREPORT << ">." << std::endl << std::endl; + + dc::resource::addSearchPath(YOINK_DATADIR); + + dc::dispatcher::instance().addHandler("video.context_recreated", + boost::bind(&YoinkApp::contextRecreated, this, _1), this); + setupGL(); state = 0.0; - glEnable(GL_TEXTURE_2D); + someChar = new Character("RobotTrooper"); + someChar->getAnimation().startSequence("Run"); - heroineTexture = new dc::texture("Heroine.png"); + font = new TilemapFont; - glShadeModel(GL_SMOOTH); - //glEnable(GL_DEPTH_TEST); - - // Enable transparency: - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + dc::vector2 coeffs[4]; + coeffs[0] = dc::vector2(0.0, 0.0); + coeffs[1] = dc::vector2(0.5, 0.0); + coeffs[2] = dc::vector2(0.5, 0.0); + coeffs[3] = dc::vector2(1.0, 0.0); + interp.init(coeffs, 1.0, dc::interpolator::oscillate); - glLoadIdentity(); + dc::scalar coeff[2] = {1.0, 0.0}; + fadeIn.init(coeff, 0.5f); + testScene = new dc::scene("Test"); } YoinkApp::~YoinkApp() { - delete heroineTexture; + delete someChar; + delete font; + + dc::dispatcher::instance().removeHandler(this); + std::cout << "Goodbye..." << std::endl; } -void YoinkApp::update(double t, double dt) +void YoinkApp::setupGL() +{ + glEnable(GL_TEXTURE_2D); + //glEnable(GL_CULL_FACE); + glEnable(GL_DEPTH_TEST); + + glShadeModel(GL_SMOOTH); + + //glEnable(GL_BLEND); + //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_ALPHA_TEST); + glAlphaFunc(GL_GREATER, 0.0); + + glClearColor(0.0, 0.0, 1.0, 1.0); + + glLineWidth(10.0f); +} + +void YoinkApp::contextRecreated(const dc::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. + setupGL(); +} + + +void YoinkApp::update(dc::scalar t, dc::scalar dt) { - //dt *= 0.1; + //dt *= 0.2; + + fadeIn.update(dt); + + someChar->getAnimation().update(t, dt); + interp.update(dt); prevstate = state; state += dt; } -void drawrect(dc::scalar a, dc::scalar b, dc::scalar c, dc::scalar d) + +void YoinkApp::draw(dc::scalar alpha) { + dc::vector4 meh; + meh.random(0.0, 1.0); + static dc::vector4 c1(meh); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + dc::scalar drawstate = cml::lerp(prevstate, state, alpha); + dc::scalar sinstate = std::sin(drawstate); + dc::scalar cosstate = std::cos(drawstate); + + + // DRAW THE SCENE + testScene->draw(alpha); + + + someChar->getTilemap().bind(); + glColor3f(1.0, 1.0, 1.0); + + unsigned heroFrame = someChar->getAnimation().getFrame(); + + float coords[8]; + someChar->getTilemap().getTileCoords(heroFrame, coords); + 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); + 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(); -} -void YoinkApp::draw(double alpha) -{ - static dc::vector3 c1 = dc::vector3::random(0.0, 1.0); - static dc::vector3 c2 = dc::vector3::random(0.0, 1.0); - glClearColor(1.0, 0.0, 0.0, 1.0); - glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); + someChar->getTilemap().getTileCoords(heroFrame, coords, + dc::tilemap::reverse); - double drawstate = state * alpha + prevstate * (1.0 - alpha); - double sinstate = std::sin(drawstate); - double cosstate = std::cos(drawstate); + 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(); + + glColor4f(1.0,0.0,0.0,0.5); glBindTexture(GL_TEXTURE_2D, 0); + glColor4fv(c1.data()); - glColor3dv(c1.array); - drawrect(-cosstate, -sinstate, sinstate, cosstate); - glColor3dv(c2.array); - drawrect(0.0, 0.0, sinstate, cosstate); + glRectd(-cosstate, -sinstate, sinstate, cosstate); + glRectf(0.0f, 0.0f, sinstate, cosstate); - glColor4f(1.0, 1.0, 1.0, 1.0); + font->bind(); + + font->getTileCoords('c', coords); - heroineTexture->bind(); + 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(0.0, 0.0); + glTexCoord2f(coords[0], coords[1]); glVertex3f(0.0, 0.0, 0.0); - glTexCoord2f(1.0/8.0, 0.0); + glTexCoord2f(coords[2], coords[3]); glVertex3f(1.0, 0.0, 0.0); - glTexCoord2f(1.0/8.0, 1.0/4.0); + glTexCoord2f(coords[4], coords[5]); glVertex3f(1.0, 1.0, 0.0); - glTexCoord2f(0.0, 1.0/4.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]); + glVertex3f(0.0, -1.0, 0.0); + glTexCoord2f(coords[2], coords[3]); + glVertex3f(1.0, -1.0, 0.0); + glTexCoord2f(coords[4], coords[5]); + glVertex3f(1.0, 0.0, 0.0); + glTexCoord2f(coords[6], coords[7]); + glVertex3f(0.0, 0.0, 0.0); + glEnd(); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_DEPTH_TEST); - glFlush(); + glBindTexture(GL_TEXTURE_2D, 0); + glColor4f(0.0f, 0.0f, 0.0f, 1.0f); + + glBegin(GL_LINES); + glVertex2f(0.0f, 0.0f); + glVertex2fv(interp.getState(alpha).data()); + 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); } -void YoinkApp::dispatchEvent(const SDL_Event& event) +void YoinkApp::handleEvent(const dc::event& e) { - switch (event.type) + switch (e.type) { case SDL_KEYDOWN: - if (event.key.keysym.sym == SDLK_ESCAPE) + if (e.key.keysym.sym == SDLK_ESCAPE) { stop(); } - else if (event.key.keysym.sym == SDLK_f) + else if (e.key.keysym.sym == SDLK_f) { getVideo().toggleFull(); } + else if (e.key.keysym.sym == SDLK_a) + { + someChar->getAnimation().startSequence("Punch"); + } break; case SDL_QUIT: stop(); break; - } -} - -#include "dispatcher.hh" - -class Foo : public dc::notification -{ -public: - static void func(const dc::notification& meh) - { - std::cout << "func: " << std::endl; - } - - void snap(int zzz, const dc::notification& nice, float lean) - { - std::cout << "snap: " << zzz << "," << lean << std::endl; + case SDL_VIDEORESIZE: + glViewport(0, 0, e.resize.w, e.resize.h); + break; } -}; - -void MyHandler(const dc::notification& cool) -{ - std::cout << "MyHandler with a notification" << std::endl; } + int main(int argc, char* argv[]) { YoinkApp app(argc, argv); return app.run(); } +/** vim: set ts=4 sw=4 tw=80: *************************************************/ +