random_racer/src/Presenter.cpp

Go to the documentation of this file.
00001 #include <sstream>
00002 
00003 #include <vrs/box.h>
00004 #include <vrs/camera.h>
00005 #include <vrs/opengl/imagetexture2dgl.h>
00006 #include <vrs/opengl/texenvgl.h>
00007 #include <vrs/scaling.h>
00008 #include <vrs/sg/behaviorcallback.h>
00009 #include <vrs/sg/canvas.h>
00010 #include <vrs/sg/key.h>
00011 #include <vrs/sg/keyevent.h>
00012 #include <vrs/sg/resizeevent.h>
00013 #include <vrs/sg/scenething.h>
00014 #include <vrs/translation.h>
00015 #include <vrs/vector.h>
00016 
00017 #include "ResourceManager.h"
00018 #include "Console.h"
00019 #include "Presenter.h"
00020 
00021 using namespace VRS;
00022 
00023 
00024 namespace random_racer
00025 {
00026 
00027 const float Presenter::c_maxScaling = 0.6;
00028 const float Presenter::c_startTrans = 0.65;
00029 const float Presenter::c_hideTrans  = 3;
00030 
00031 Presenter::Presenter(SO<Canvas> p_canvas)
00032 {
00033     m_start = false;
00034     m_hide = false;
00035     m_show = false;
00036     m_switch = false;
00037     m_animation = false;
00038     m_full = false;
00039     m_isFull = false;
00040     m_first = true;
00041     
00042     m_slideCount = 1;
00043     
00044     m_canvas = p_canvas;
00045     m_thing = new SceneThing();
00046     
00047     m_cam = Camera::newNormalizedDeviceCoordsCamera();
00048     m_thing->append(m_cam);
00049     
00050     m_scaling = new Scaling(Vector(0.01,0.01,0));
00051     m_thing->append(m_scaling);
00052     
00053     m_translation = new Translation(Vector(0,0,0));
00054     m_thing->append(m_translation);
00055         
00056     m_thing->append(new TexEnvGL(TexEnvGL::Replace));
00057      
00058     m_texture = ResourceManager::get()->loadTexture2D(
00059             "pre/pre1.jpg", true, false);
00060         
00061     m_thing->append(m_texture);
00062     
00063     m_box = new Box(Vector(-1,-1,-1), Vector(1,1,1));
00064     m_thing->append(m_box);
00065         
00066     m_thing->setNodeState(0);
00067     
00068     m_canvas->append(m_thing);
00069 
00070     m_eventCallback = new BehaviorCallback;
00071     m_eventCallback->setCanvasCallback(
00072         new MethodCallback<Presenter>(this, &Presenter::handleEvents));
00073 }
00074 
00075 Presenter::~Presenter()
00076 {
00077 }
00078 
00079 void
00080 Presenter::resizeEvent(SO<ResizeEvent> p_event)
00081 {
00082 }
00083 
00084 void
00085 Presenter::keyEvent(SO<KeyEvent> p_event)
00086 {
00087     if(p_event->pressed())
00088     {
00089         if(p_event->keyCode() == 'p' && 
00090            !Console::get()->isVisible() && 
00091            !m_isFull)
00092             toggleVisibility();
00093         
00094         else if(p_event->keyCode() == 'n' && isVisible() && m_isFull)
00095         {
00096             m_slideCount++;
00097             switchSlide();
00098         }
00099         else if(p_event->keyCode() == 'm' && isVisible() && m_isFull)
00100         {
00101             m_slideCount--;
00102             switchSlide();
00103         }
00104         else if(p_event->keyCode() == 'f' && 
00105                 isVisible() && 
00106                 !Console::get()->isVisible())
00107             fullscreen();
00108     }
00109 }
00110 
00111 void
00112 Presenter::toggleVisibility()
00113 {
00114     if(isVisible())
00115         hide();
00116     else
00117         show();
00118 }
00119 
00120 bool
00121 Presenter::isVisible()
00122 {
00123     return(m_thing->getNodeState() != 0 && !m_animation);
00124 }
00125 
00126 void
00127 Presenter::handleEvents()
00128 {
00129     KeyEvent* event = VRS_Cast(KeyEvent, m_eventCallback->currentCanvasEvent());
00130 
00131     if(event != NULL)
00132         keyEvent(event);
00133 
00134     else
00135     {
00136         ResizeEvent* event = VRS_Cast(ResizeEvent,
00137                                       m_eventCallback->currentCanvasEvent());
00138         if(event != NULL)
00139             resizeEvent(event);
00140     }
00141 
00142     m_canvas->postForRedisplay();
00143 }
00144 
00145 void 
00146 Presenter::startAnimation()
00147 {
00148     m_animation = true;
00149     
00150     startTimer(20);
00151 }
00152 
00153 void 
00154 Presenter::startPresentation()
00155 {
00156     m_start = true;
00157     
00158     m_thing->setNodeState(
00159         SceneNode::EvaluationOn|SceneNode::TraversalOn);
00160     
00161     Console::get()->hide();
00162     
00163     startAnimation();
00164     
00165     m_canvas->append(m_eventCallback);
00166     m_eventCallback->activate();
00167 }
00168 
00169 void
00170 Presenter::show()
00171 {
00172     m_thing->setNodeState(
00173         SceneNode::EvaluationOn|SceneNode::TraversalOn);
00174     
00175     m_show = true;
00176     
00177     startAnimation();
00178 }
00179 
00180 void
00181 Presenter::hide()
00182 {
00183     m_hide = true;
00184     
00185     startAnimation();
00186 }
00187 
00188 void
00189 Presenter::switchSlide()
00190 {
00191     
00192     m_switch = true;
00193     
00194     if(m_slideCount > 14 || m_slideCount <= 0)
00195         m_slideCount = 1;
00196 
00197     startAnimation();
00198 }
00199 
00200 void
00201 Presenter::fullscreen()
00202 {
00203     m_full = true;
00204     
00205     m_isFull = !m_isFull;
00206     
00207     startAnimation();
00208 }
00209 
00210 void
00211 Presenter::switchTexture(unsigned int p_image)
00212 {
00213     std::stringstream ss;
00214     std::string str;
00215     ss << p_image;
00216     ss >> str;
00217 
00218     m_texture2 = ResourceManager::get()->loadTexture2D(
00219             "pre/pre"+ str +".jpg", true, false);
00220         
00221     m_thing->replace(m_texture, m_texture2);
00222     m_texture = m_texture2;
00223     m_texture2 = NULL;
00224 }
00225 
00226 void
00227 Presenter::timerTick()
00228 {
00229     if(m_start)
00230     {
00231         Vector scaleTemp = m_scaling->getScale();
00232     
00233         if(scaleTemp[0] >= c_maxScaling)
00234         {
00235             Vector transTemp = m_translation->getTranslate();
00236                     
00237             transTemp[0]+=0.01;
00238             transTemp[1]+=0.01;
00239                     
00240             if(transTemp[0] >= c_startTrans)
00241             {
00242                 m_start = false;
00243                 m_animation = false;
00244                 stopTimer();
00245             }
00246             else
00247                 m_translation->setTranslate(transTemp);
00248         }
00249         else
00250         {
00251             scaleTemp[0]+=0.01;
00252             scaleTemp[1]+=0.01;
00253         
00254             m_scaling->setScale(scaleTemp);
00255         }
00256     }
00257     else if(m_hide)
00258     {
00259         Vector transTemp = m_translation->getTranslate();
00260         
00261         transTemp[0]+=0.05;
00262     
00263         if(transTemp[0] >= c_hideTrans)
00264         {
00265             m_hide = false;
00266             m_animation = false;
00267             m_thing->setNodeState(0);
00268             stopTimer();
00269         }
00270         else
00271             m_translation->setTranslate(transTemp);
00272     }
00273     else if(m_show)
00274     {
00275         Vector transTemp = m_translation->getTranslate();
00276         
00277         transTemp[0]-=0.05;
00278     
00279         if(transTemp[0] <= c_startTrans)
00280         {
00281             m_show = false;
00282             m_animation = false;
00283             stopTimer();
00284         }
00285         else
00286             m_translation->setTranslate(transTemp);
00287     }
00288     else if(m_switch)
00289     {   
00290         Vector transTemp = m_translation->getTranslate();
00291         
00292         if(transTemp[1] >= 3 || !m_first)
00293         {            
00294             if(m_first)
00295             {
00296                 switchTexture(m_slideCount);
00297             
00298                 m_first = false;
00299             }
00300             Vector tranTemp = m_translation->getTranslate();
00301             
00302             if(tranTemp[1] < 0)
00303             {
00304                 m_first = true;
00305                 m_switch = false;
00306                 m_animation = false;
00307                 stopTimer();
00308             }
00309             else
00310             {
00311                 tranTemp[1]-=0.1;
00312                 
00313                 m_translation->setTranslate(tranTemp);
00314             }
00315         }
00316         else
00317         {
00318             transTemp[1]+=0.1;
00319             m_translation->setTranslate(transTemp);
00320         }
00321     }
00322     else if(m_full)
00323     {
00324                 
00325         if(m_isFull)
00326         {
00327             Vector transTemp = m_translation->getTranslate();
00328             
00329             if(transTemp[0] < 0)
00330             {
00331                 Vector scaleTemp = m_scaling->getScale();
00332 
00333                 if(scaleTemp[0] >= 1.0)
00334                 {
00335                     m_animation = false;
00336                     m_full = false;
00337                     stopTimer();
00338                 }
00339                 else
00340                 {
00341                     scaleTemp[0]+=0.01;
00342                     scaleTemp[1]+=0.01;
00343 
00344                     m_scaling->setScale(scaleTemp);
00345                 }
00346             }
00347             else
00348             {
00349                 transTemp[0]-=0.01;
00350                 transTemp[1]-=0.01;
00351                 m_translation->setTranslate(transTemp);
00352             }
00353         }
00354         else
00355         {
00356             Vector scaleTemp = m_scaling->getScale();
00357 
00358             
00359             if(scaleTemp[0] <= c_maxScaling)
00360             {
00361                 Vector transTemp = m_translation->getTranslate();
00362 
00363                 transTemp[0]+=0.01;
00364                 transTemp[1]+=0.01;
00365 
00366                 if(transTemp[0] >= 0.7)
00367                 {
00368                     m_full = false;
00369                     m_animation = false;
00370                     stopTimer();
00371                 }
00372                 else
00373                     m_translation->setTranslate(transTemp);
00374             }
00375             else
00376             {
00377                 scaleTemp[0]-=0.01;
00378                 scaleTemp[1]-=0.01;
00379 
00380                 m_scaling->setScale(scaleTemp);
00381             }
00382         }
00383     }
00384 }
00385 
00386 } // namespace random_racer

Generated on Fri May 11 21:01:58 2007 for Random Racer by  doxygen 1.5.1