//------------------------------------------------------------------------------- // @ Player::Update() //------------------------------------------------------------------------------- // Main update loop //------------------------------------------------------------------------------- void Player::Update( float dt ) { // get scale, rotate, translate for this frame float s = 1.0f; float r = 0.0f; // set up scaling if (IvGame::mGame->mEventHandler->IsKeyDown(';')) { s -= 0.25f*dt; } if (IvGame::mGame->mEventHandler->IsKeyDown('p')) { s += 0.25f*dt; } mScale *= s; // set up rotate if (IvGame::mGame->mEventHandler->IsKeyDown('o')) { r -= kPI*0.25f*dt; } if (IvGame::mGame->mEventHandler->IsKeyDown('u')) { r += kPI*0.25f*dt; } IvMatrix33 rotate; rotate.RotationZ(r); mRotate = rotate*mRotate; // set up translation IvVector3 xlate; xlate.Zero(); if (IvGame::mGame->mEventHandler->IsKeyDown('k')) { xlate.x -= 3.0f*dt; } if (IvGame::mGame->mEventHandler->IsKeyDown('i')) { xlate.x += 3.0f*dt; } if (IvGame::mGame->mEventHandler->IsKeyDown('l')) { xlate.y -= 3.0f*dt; } if (IvGame::mGame->mEventHandler->IsKeyDown('j')) { xlate.y += 3.0f*dt; } mTranslate += xlate; // clear transform if (IvGame::mGame->mEventHandler->IsKeyDown(' ')) { mRotate.Identity(); mScale = 1.0f; mTranslate.Zero(); } } // End of Player::Update()
//------------------------------------------------------------------------------- // @ IvQuat::IvQuat() //------------------------------------------------------------------------------- // Rotation matrix constructor //------------------------------------------------------------------------------- IvQuat::IvQuat( const IvMatrix33& rotation ) { float trace = rotation.Trace(); if ( trace > 0.0f ) { float s = ::IvSqrt( trace + 1.0f ); w = s*0.5f; float recip = 0.5f/s; x = (rotation(2,1) - rotation(1,2))*recip; y = (rotation(0,2) - rotation(2,0))*recip; z = (rotation(1,0) - rotation(0,1))*recip; } else { unsigned int i = 0; if ( rotation(1,1) > rotation(0,0) ) i = 1; if ( rotation(2,2) > rotation(i,i) ) i = 2; unsigned int j = (i+1)%3; unsigned int k = (j+1)%3; float s = ::IvSqrt( rotation(i,i) - rotation(j,j) - rotation(k,k) + 1.0f ); (*this)[i] = 0.5f*s; float recip = 0.5f/s; w = (rotation(k,j) - rotation(j,k))*recip; (*this)[j] = (rotation(j,i) + rotation(i,j))*recip; (*this)[k] = (rotation(k,i) + rotation(i,k))*recip; } } // End of IvQuat::IvQuat()
//------------------------------------------------------------------------------- // @ Player::Update() //------------------------------------------------------------------------------- // Main update loop //------------------------------------------------------------------------------- void Player::Update( float dt ) { // get scale, rotate, translate for this frame float s = 1.0f; float r = 0.0f; // set up scaling if (IvGame::mGame->mEventHandler->IsKeyDown(';')) { s -= 0.25f*dt; } if (IvGame::mGame->mEventHandler->IsKeyDown('p')) { s += 0.25f*dt; } mScale *= s; // set up rotate if (IvGame::mGame->mEventHandler->IsKeyDown('o')) { r -= kPI*0.25f*dt; } if (IvGame::mGame->mEventHandler->IsKeyDown('u')) { r += kPI*0.25f*dt; } IvMatrix33 rotate; rotate.RotationZ(r); mRotate = rotate*mRotate; // set up translation IvVector3 xlate; xlate.Zero(); if (IvGame::mGame->mEventHandler->IsKeyDown('k')) { xlate.x -= 3.0f*dt; } if (IvGame::mGame->mEventHandler->IsKeyDown('i')) { xlate.x += 3.0f*dt; } if (IvGame::mGame->mEventHandler->IsKeyDown('l')) { xlate.y -= 3.0f*dt; } if (IvGame::mGame->mEventHandler->IsKeyDown('j')) { xlate.y += 3.0f*dt; } mTranslate += xlate; // clear transform if (IvGame::mGame->mEventHandler->IsKeyPressed(' ')) { mRotate.Identity(); mScale = 1.0f; mTranslate.Zero(); } // change texture if (IvGame::mGame->mEventHandler->IsKeyPressed('t')) { mCurrentBlendTexIndex = (mCurrentBlendTexIndex + 1) % NUM_BLEND_TEX; } // change blending mode if (IvGame::mGame->mEventHandler->IsKeyPressed('b')) { mBlendMode = (BlendMode)((mBlendMode + 1) % kBlendModeCount); } } // End of Player::Update()
//------------------------------------------------------------------------------- // @ Player::Update() //------------------------------------------------------------------------------- // Main update loop //------------------------------------------------------------------------------- void Player::Update( float dt ) { // update based on input if (IvGame::mGame->mEventHandler->IsKeyPressed(' ')) { if (mRun) { mTime = 0.0f; mRun = false; } else { mRun = true; } } if (IvGame::mGame->mEventHandler->IsKeyPressed('m')) { mMode = (mMode + 1)%4; } if (mRun) { mTime += dt; // stop just before end so we don't end up with zero vector // when we look ahead if ( mTime > 11.5f ) mTime = 11.5f; } // now we set up the camera // get eye position IvVector3 eye = mCurve.Evaluate( mTime ); IvVector3 viewDir; IvVector3 viewSide; IvVector3 viewUp; // set parameters depending on what mode we're in // Frenet frame if ( mMode == 3 ) { IvVector3 T = mCurve.Velocity( mTime ); IvVector3 a = mCurve.Acceleration( mTime ); IvVector3 B = T.Cross( a ); B.Normalize(); T.Normalize(); IvVector3 N = B.Cross( T ); viewDir = T; viewSide = -N; // have to negate to get from RH frame to LH frame viewUp = B; } else { IvVector3 lookAt; // look same direction all the time if ( mMode == 2 ) { viewDir = IvVector3::xAxis; } // look along tangent else if ( mMode == 1 ) { viewDir = mCurve.Velocity( mTime ); } // look ahead .5 in parameter else if ( mMode == 0 ) { viewDir = mCurve.Evaluate( mTime+0.5f ) - eye; } // compute view vectors viewDir.Normalize(); viewUp = IvVector3::zAxis - IvVector3::zAxis.Dot(viewDir)*viewDir; viewUp.Normalize(); viewSide = viewDir.Cross(viewUp); } // now set up matrices // build transposed rotation matrix IvMatrix33 rotate; if ( IvRenderer::mRenderer->GetAPI() == kOpenGL ) { rotate.SetRows( viewSide, viewUp, -viewDir ); } else { rotate.SetRows( viewSide, viewUp, viewDir ); } // transform translation IvVector3 eyeInv = -(rotate*eye); // build 4x4 matrix IvMatrix44 matrix(rotate); matrix(0,3) = eyeInv.x; matrix(1,3) = eyeInv.y; matrix(2,3) = eyeInv.z; ::IvSetViewMatrix( matrix ); } // End of Player::Update()
//------------------------------------------------------------------------------- // @ Player::Update() //------------------------------------------------------------------------------- // Main update loop //------------------------------------------------------------------------------- void Player::Update( float dt ) { float s = 1.0f; float r = 0.0f; float x = 0.0f, y = 0.0f, z = 0.0f; IvMatrix33 rotate; IvVector3 xlate; IvMatrix44 transform; mTurret->Update( dt ); // set up scaling if (IvGame::mGame->mEventHandler->IsKeyDown(';')) { s -= 0.25f*dt; } if (IvGame::mGame->mEventHandler->IsKeyDown('p')) { s += 0.25f*dt; } mScale *= s; // set up rotate if (IvGame::mGame->mEventHandler->IsKeyDown('o')) { r -= kPI*0.25f*dt; } if (IvGame::mGame->mEventHandler->IsKeyDown('u')) { r += kPI*0.25f*dt; } rotate.RotationZ(r); mRotate = rotate*mRotate; // set up translation if (IvGame::mGame->mEventHandler->IsKeyDown('k')) { x -= 3.0f*dt; } if (IvGame::mGame->mEventHandler->IsKeyDown('i')) { x += 3.0f*dt; } if (IvGame::mGame->mEventHandler->IsKeyDown('l')) { y -= 3.0f*dt; } if (IvGame::mGame->mEventHandler->IsKeyDown('j')) { y += 3.0f*dt; } xlate.Set( x, y, z ); mTranslate += xlate; // clear transform if (IvGame::mGame->mEventHandler->IsKeyDown(' ')) { mRotate.Identity(); mScale = 0.25f; mTranslate.Zero(); } } // End of Player::Update()