X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FMoof%2FTransition.hh;fp=src%2FMoof%2FTransition.hh;h=cf1595c125bb351556b11d720fcbeeeb1c422672;hb=a4debfe4a5f5d339410788971b698ba00cb7f09c;hp=0000000000000000000000000000000000000000;hpb=892da43bf5796e7c5f593a6d0f53bd797a36bd3e;p=chaz%2Fyoink diff --git a/src/Moof/Transition.hh b/src/Moof/Transition.hh new file mode 100644 index 0000000..cf1595c --- /dev/null +++ b/src/Moof/Transition.hh @@ -0,0 +1,177 @@ + +/******************************************************************************* + + 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 + +#include +#include +#include +#include +#include +#include +#include + + +namespace Mf { + + +template +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 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: *************************************************/ +