+
+/*******************************************************************************
+
+ Copyright (c) 2009, Charles McGarvey
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*******************************************************************************/
+
+#ifndef _MOOF_TRANSITION_HH_
+#define _MOOF_TRANSITION_HH_
+
+#include <boost/shared_ptr.hpp>
+
+#include <Moof/Engine.hh>
+#include <Moof/Interpolator.hh>
+#include <Moof/Layer.hh>
+#include <Moof/Log.hh>
+#include <Moof/Math.hh>
+#include <Moof/OpenGL.hh>
+#include <Moof/Texture.hh>
+
+
+namespace Mf {
+
+
+template <typename T>
+class Transition : public Layer
+{
+ LayerP to;
+ LayerP from;
+
+ T interpolator;
+
+ Engine* engine;
+
+public:
+
+ Transition(LayerP t, LayerP f, const T& interp) :
+ to(t),
+ from(f),
+ interpolator(interp),
+ engine(0) {}
+
+ typedef boost::shared_ptr<Transition> Ptr;
+
+ static Ptr alloc(LayerP t, LayerP f, const T& interp)
+ {
+ return Ptr(new Transition(t, f, interp));
+ }
+
+
+ void pushed(Engine& e)
+ {
+ engine = &e;
+ }
+
+ void popped(Engine& e)
+ {
+ if (to) e.push(to);
+ }
+
+ void update(Scalar t, Scalar dt)
+ {
+ interpolator.update(t, dt);
+
+ if (from) from->update(t, dt);
+ if (to) to->update(t, dt);
+
+ if (interpolator.isDone())
+ {
+ // to should /replace/ this
+ engine->pop(this);
+ }
+ }
+
+ void drawFade(Scalar alpha) const
+ {
+ // DRAW FADE
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_ALPHA_TEST);
+ glEnable(GL_BLEND);
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadIdentity();
+ glColor4(1.0, 1.0, 1.0, alpha);
+ Mf::Texture::resetBind();
+
+ //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();
+
+ glDisable(GL_BLEND);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_ALPHA_TEST);
+
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+ }
+
+ void draw(Scalar alpha) const
+ {
+ Scalar a = interpolator.getState(alpha);
+ logInfo("draw state: %f", a);
+
+ //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ if (from)
+ {
+ glPushMatrix();
+ glLoadIdentity();
+ glRotate(180.0 * a, 0.0, 1.0, 0.0);
+ from->draw(alpha);
+ glPopMatrix();
+ }
+ //drawFade(a);
+
+ if (to)
+ {
+ glPushMatrix();
+ glLoadIdentity();
+ glRotate(180.0 * (1.0 - a), 0.0, 1.0, 0.0);
+ to->draw(alpha);
+ glPopMatrix();
+ }
+ //drawFade(1.0 - a);
+ }
+
+ bool handleEvent(const Event& event)
+ {
+ if (to)
+ {
+ return to->handleEvent(event);
+ }
+ else if (from)
+ {
+ return from->handleEvent(event);
+ }
+ return false;
+ }
+};
+
+
+} // namespace Mf
+
+#endif // _MOOF_TRANSITION_HH_
+
+/** vim: set ts=4 sw=4 tw=80: *************************************************/
+