//-------------------------------------------------------------- // initialize application void DontHitMe::appInit() { // get the important directories mgString shaderDir; m_options.getFileName("shaderDir", m_options.m_sourceFileName, "docs/shaders", shaderDir); mgString uiDir; m_options.getFileName("uiDir", m_options.m_sourceFileName, "docs/ui", uiDir); mgString fontDir; m_options.getFileName("fontDir", m_options.m_sourceFileName, "docs/fonts", fontDir); mgInitDisplayServices(shaderDir, fontDir); mgDisplay->setFOV(m_options.getDouble("FOV", 60.0)); mgDisplay->setDPI(m_options.getInteger("DPI", 0)); // load cursor pattern loadCursor(); setDeskMode(true); initMovement(); // load the shaders we might use mgVertex::loadShader("litTexture"); mgVertex::loadShader("unlitTexture"); mgVertex::loadShader("litTextureCube"); mgVertex::loadShader("unlitTextureCube"); mgVertexTA::loadShader("litTextureArray"); mgVertexTA::loadShader("unlitTextureArray"); m_sky = new StarrySky(m_options); m_sky->enableSkyBox(true); m_sky->enableStars(true); m_sky->enableSun(true); mgPoint3 lightDir(0, 1, 1); lightDir.normalize(); m_sky->setSunDir(lightDir); mgDisplay->setLightDir(lightDir); m_saucer = new Saucer(m_options); m_planet = new Planet(m_options); m_wreck = new Wreck(m_options); m_tower1 = new Tower(m_options, false); m_tower2 = new Tower(m_options, false); mgString fileName; m_options.getFileName("tube", m_options.m_sourceFileName, "tube.jpg", fileName); m_tubeTexture = mgDisplay->loadTexture(fileName); initTrack(); initBall(); updateBallPt(); m_intro = new Intro(m_options, m_ballOrigin); m_showingIntro = false; m_lastAnimate = mgOSGetTime(); // now! }
//----------------------------------------------------------------------------- // animate the scene void Intro::animate( double now, double since) { m_saucer->animate(now, since); updateBallPt(); }
//-------------------------------------------------------------------- // animate the view BOOL DontHitMe::appViewAnimate( double now, // current time (ms) double since) // milliseconds since last pass { m_saucer->animate(now, since); // update move/turn BOOL changed = true; if (m_flying) { // construct eye matrix m_eyeMatrix.loadIdentity(); m_eyeMatrix.rotateZDeg(m_eyeRotZ); m_eyeMatrix.rotateYDeg(m_eyeRotY); m_eyeMatrix.rotateXDeg(m_eyeRotX); changed |= updateFlyingMovement(now, since); } else { updateRollingMovement(now, since); // change position of ball double dist = since * m_rollSpeed; m_ballPosn += dist; while (m_ballPosn > m_tube->m_trackLen) { m_ballPosn -= m_tube->m_trackLen; } while (m_ballPosn < 0) { m_ballPosn += m_tube->m_trackLen; } if (m_rollSpeed > 0) m_rollSpeed = max(0, m_rollSpeed - m_rollDrag*since); else m_rollSpeed = min(0, m_rollSpeed + m_rollDrag*since); // change rotation of ball double angle = since * m_rotateSpeed; m_ballRotate += angle; if (m_ballRotate > 180.0) m_ballRotate -= 360.0; if (m_ballRotate < -180.0) m_ballRotate += 360.0; if (m_rotateSpeed > 0) m_rotateSpeed = max(0, m_rotateSpeed - m_rotateDrag*since); else m_rotateSpeed = min(0, m_rotateSpeed + m_rotateDrag*since); updateBallPt(); changed = true; } return m_eyeChanged || changed; }
//-------------------------------------------------------------- // constructor Intro::Intro( const mgOptionsFile& options, const mgPoint3& origin) { m_origin = origin; // load wall texture mgString fileName; options.getFileName("tube", options.m_sourceFileName, "tube.jpg", fileName); m_tubeTexture = mgDisplay->loadTexture(fileName); options.getFileName("intro-wall", options.m_sourceFileName, "tube.jpg", fileName); m_wallTexture = mgDisplay->loadTexture(fileName); m_saucer = new Saucer(options); m_tube = new Tube(TUBE_RADIUS, TUBE_STEPS); m_wall = new Tube(WALL_RADIUS, WALL_STEPS); initTrack(); m_ballPosn = 0.0; updateBallPt(); }