]> Dogcows Code - chaz/yoink/blobdiff - src/YoinkApp.cc
new lua scripting for scene loading
[chaz/yoink] / src / YoinkApp.cc
index 64decfb73a88f9e6b0b405f1c94fa3c7c9babc2e..a8a06cc82f6d1e6f9f694fda7114c3c7f322ef08 100644 (file)
 
 *******************************************************************************/
 
+#include <cstdlib>             // getenv
 #include <iostream>
 #include <string>
 
-#include <boost/bind.hpp>
+#include <Moof/Exception.hh>
+#include <Moof/Log.hh>
+#include <Moof/Math.hh>
+#include <Moof/OpenGL.hh>
+#include <Moof/Settings.hh>
+#include <Moof/Thread.hh>
+#include <Moof/Timer.hh>
+#include <Moof/Video.hh>
 
-#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: *************************************************/
 
This page took 0.02578 seconds and 4 git commands to generate.