//----------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------- void CPlayerCar::ResetIfNeeded( void ) { if( m_bShouldReset ) { m_bShouldReset = false; Reset(); return; } //TODO: we shouldnt ask the renderer for this, but a logical representation of the world //bool bWaterEnabled = true; if( IsUnderWater() ) { float timeUnderWater = gpGlobals->curtime - m_timeEnteredWater; if( m_bWasUnderWater && timeUnderWater > 2.0f ) Reset(); if( !m_bWasUnderWater ) { m_timeEnteredWater = gpGlobals->curtime; m_bWasUnderWater = true; } } else m_bWasUnderWater = false; }
void WaterManager::RenderUnderGodRay() { if (IsUnderWater()) { Vec3 Position = Vec3::Zero; if (mWater) Position = Vec3(0, mWater->GetHeight(), 0); else if (mOcean) Position = mOcean->GetPosition(); mGodRay->Render(Position); } }
//----------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------- void CPlayerCar::Update( void ) { m_bJustResetted = false; //First check if we have to reset the car position ResetIfNeeded(); //Calculate the new motor rpm float rpm = CalculateMotorRpm(); if(rpm >= 0.0f) { if( rpm >= m_info.motorShiftUpRpm && m_engineGear < m_info.numberOfGears ) m_engineGear++; //shift up else if( rpm < (USHORT)m_info.motorShiftDownRpm && m_engineGear > 1 ) m_engineGear--; //shift down } else { m_engineGear = 1; } m_engineRpm = (USHORT)abs(CalculateMotorRpm()); m_engineRpm = (USHORT)clamp<int>(m_engineRpm, (int)m_info.motorMinRpm, (int)m_info.motorMaxRpm); float fPossibleWheelForce = CalculateMotorForceAtWheels( m_engineRpm ); //First calculate proper forward vector by multiplying the rotation matrix //with the untransformed forward-vector. Angle3d aCarDir = GetAngle(); Matrix3 mCarRotMat; GetAngleMatrix3x3( aCarDir, mCarRotMat ); Vector3f vForward = mCarRotMat * Vector3f(0,0,1); //update steering and gas if( m_pPhysVehicle ) { m_pPhysVehicle->UpdateSteering(m_fInputSteer); float fVehSpeed = VectorDot( GetVelocity(), vForward ); if( fVehSpeed > 2.0f && VectorDot( vForward, GetVelocity() ) < 0.0f ) fVehSpeed = -fVehSpeed; bool bMovingBackward = fVehSpeed < -2.0f; bool bStandingStill = abs(fVehSpeed) <= 2.0f; float fGas = 0.0f; float fBreak = 0.0f; if( bStandingStill ) fGas = m_fInputAccelerate; else if( bMovingBackward ) { if( m_fInputAccelerate > 0.0f ) fBreak = m_fInputAccelerate; else fGas = m_fInputAccelerate; } else { if( m_fInputAccelerate > 0.0f ) fGas = m_fInputAccelerate; else fBreak = -m_fInputAccelerate; } //Disable gas if under water if(IsUnderWater()) fGas = 0.0f; m_pPhysVehicle->UpdateGasBreak( fGas * fPossibleWheelForce, fBreak, m_fInputHandbrake ); //singletons::g_pEvtMgr->AddEventToQueue( // new CCarMotorUpdateEvent( ev::CAR_MOTOR_UPDATE, this->GetIndex(), m_engineRpm, abs(fGas), m_engineGear ), RECIEVER_ID_ALL ); } BaseClass::Update(); }
void WaterManager::RenderUnderNoise(Texture * colorTex) { if (IsUnderWater()) mNoise->Render(colorTex); }
void WaterManager::RenderUnderFog(Texture * depthTex, Texture * colorTex) { if (IsUnderWater()) mFog->Render(depthTex, colorTex); }
void WaterManager::RenderUnderBubble() { if (IsUnderWater()) mBubble->Render(); }
void WaterManager::RenderUnderCaustics(Texture * depthTex, Texture * colorTex) { if (IsUnderWater()) mCaustics->Render(colorTex, depthTex); }