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 }