#include <boost/shared_ptr.hpp>
-#include <Moof/Exception.hh>
+#include <Moof/Dispatch.hh>
+#include <Moof/Error.hh>
+#include <Moof/Video.hh>
#include <Moof/Layer.hh>
-#include <Moof/Math.hh>
namespace Mf {
-// forward declarations
-class Video;
+class Settings;
-struct Engine
+
+/**
+ * The engine is essentially a stack of layers. While running, it updates each
+ * layer from the bottom up every timestep. It also draws each layer from the
+ * bottom up, adhering to the maximum frame-rate. Events are sent to each layer
+ * from the top down until a layer signals the event was handled. The engine is
+ * also responsible for firing timers on time. The engine will continue running
+ * as long as there are layers on the stack.
+ */
+
+class Engine
{
- Engine(int argc, char* argv[], const std::string& name,
- const std::string& iconFile, const std::string& configFile);
+public:
+
+ Engine();
~Engine() {}
+
+ // loads settings: rngseed, timestep, framerate, showfps
+ bool initWithSettings(const Settings& settings);
- // get global instance
- static Engine& getInstance();
+ const Error& getError() const;
+ void clearError();
- void run();
+ // setting the video is required before you can run the engine and should
+ // probably be done before adding any layers
+ void setVideo(VideoP video);
+ VideoP getVideo() const;
- void setTimestep(Scalar ts);
- Scalar getTimestep() const;
- void setMaxFrameRate(long maxFps);
- long getMaxFrameRate() const;
+ int getFps() const;
- Video& getVideo() const;
- long getFrameRate() const;
+ void push(LayerP layer); // push a layer onto the top
+ LayerP pop(); // pop the top layer
+ LayerP pop(Layer* layer); // pops a specific layer and all layers above it
+ void clear(); // remove all layers (the engine will stop)
- void pushLayer(LayerP layer);
- void popLayer();
- void popLayer(Layer* layer);
- void clearLayers();
+ int getSize() const; // get the size of the stack
- struct Exception : public Mf::Exception
- {
- explicit Exception(unsigned error) :
- Mf::Exception(error) {}
+ // set this machine in motion
+ void run();
- void raise()
- {
- throw *this;
- }
- };
+ Dispatch::Handler addHandler(const std::string& event,
+ const Dispatch::Function& callback);
+ Dispatch::Handler addHandler(const std::string& event,
+ const Dispatch::Function& callback, Dispatch::Handler handler);
+
+ void dispatch(const std::string& event,
+ const Dispatch::Message* message = 0);
private:
+
class Impl;
- boost::shared_ptr<Impl> impl_;
+ boost::shared_ptr<Impl> mImpl;
};
+extern Engine engine;
+
+
} // namespace Mf
#endif // _MOOF_ENGINE_HH_