diff --git a/Code/Game/GameClient/GameClientState/Camera_FPSV2.cpp b/Code/Game/GameClient/GameClientState/Camera_FPSV2.cpp index 3af0cae5..f2f3c1ad 100644 --- a/Code/Game/GameClient/GameClientState/Camera_FPSV2.cpp +++ b/Code/Game/GameClient/GameClientState/Camera_FPSV2.cpp @@ -10,6 +10,7 @@ Camera_FPSV2::Camera_FPSV2() this->headOffset = this->body.translation = Float3::null; this->body.rotation = Quaternion::identity; + this->pitchHaveChanged = false; } Camera_FPSV2::~Camera_FPSV2() {} @@ -21,6 +22,7 @@ Camera_FPSV2 & Camera_FPSV2::operator = ( const Camera_FPSV2 &camera ) this->headOffset = camera.headOffset; this->body.translation = camera.body.translation; this->body.rotation = camera.body.rotation; + this->pitchHaveChanged = camera.pitchHaveChanged; return *this; } @@ -45,6 +47,7 @@ void Camera_FPSV2::SetRotation( const Quaternion &rotation ) this->body.rotation = rotation; this->head.SetRotation( rotation * Rotation(this->pitchUp, WorldAxisOf(rotation, Float3::standard_unit_x) ) ); + this->pitchHaveChanged = false; } void Camera_FPSV2::SetAngular( const Float3 &axis ) @@ -69,6 +72,12 @@ void Camera_FPSV2::SetPerspectiveProjection( Float verticalFoV, Float aspectRati void Camera_FPSV2::UpdateOrientation() { + if( this->pitchHaveChanged ) + { + this->head.SetRotation( this->body.rotation * Rotation(this->pitchUp, WorldAxisOf(this->body.rotation, Float3::standard_unit_x) ) ); + this->pitchHaveChanged = false; + } + Float4x4 orientation; OrientationMatrix( this->body.rotation, this->body.translation, orientation ); @@ -78,7 +87,8 @@ void Camera_FPSV2::UpdateOrientation() void Camera_FPSV2::SnapUpToNormal( const Float3 &normal ) { this->body.rotation = Rotation( SnapAngularAxis(AngularAxis(this->body.rotation), WorldAxisOf(this->body.rotation, Float3::standard_unit_y), normal) ); - this->head.SetRotation( this->body.rotation * Rotation(this->pitchUp * Float3::standard_unit_x) ); + this->head.SetRotation( this->body.rotation * Rotation(this->pitchUp, WorldAxisOf(this->body.rotation, Float3::standard_unit_x) ) ); + this->pitchHaveChanged = false; } void Camera_FPSV2::Move( const Float3 &deltaPosition ) @@ -89,8 +99,8 @@ void Camera_FPSV2::Move( const Float3 &deltaPosition ) void Camera_FPSV2::Rotate( const Quaternion &deltaRotation ) { - this->head.Rotate( deltaRotation ); this->body.rotation *= deltaRotation; + this->pitchHaveChanged = true; } void Camera_FPSV2::Rotate( const Float3 &deltaAngularAxis ) @@ -121,7 +131,7 @@ void Camera_FPSV2::StrafeLeft( Float distance ) void Camera_FPSV2::PitchUp( Float radian ) { this->pitchUp = Clamp( this->pitchUp + radian, -0.48f * pi, 0.48f * pi ); -// this->head.SetRotation( this->body.rotation * Rotation(this->pitchUp, Float3::standard_unit_x) ); + this->pitchHaveChanged = true; } void Camera_FPSV2::PitchDown( Float radian ) @@ -152,6 +162,12 @@ const Float3 & Camera_FPSV2::GetPosition() const Float4x4 & Camera_FPSV2::GetViewMatrix( Float4x4 &targetMem ) const { + if( this->pitchHaveChanged ) + { + this->head.SetRotation( this->body.rotation * Rotation(this->pitchUp, WorldAxisOf(this->body.rotation, Float3::standard_unit_x) ) ); + this->pitchHaveChanged = false; + } + return this->head.GetViewMatrix( targetMem ); } @@ -162,11 +178,23 @@ const Float4x4 & Camera_FPSV2::GetProjectionMatrix() const Float4x4 & Camera_FPSV2::GetViewsProjMatrix( Float4x4 &targetMem ) const { + if( this->pitchHaveChanged ) + { + this->head.SetRotation( this->body.rotation * Rotation(this->pitchUp, WorldAxisOf(this->body.rotation, Float3::standard_unit_x) ) ); + this->pitchHaveChanged = false; + } + return this->head.GetViewsProjMatrix( targetMem ); } Float3 Camera_FPSV2::GetNormalOf( const Float3 &axis ) const { + if( this->pitchHaveChanged ) + { + this->head.SetRotation( this->body.rotation * Rotation(this->pitchUp, WorldAxisOf(this->body.rotation, Float3::standard_unit_x) ) ); + this->pitchHaveChanged = false; + } + return this->head.GetNormalOf( axis ); } @@ -182,6 +210,12 @@ Float3 Camera_FPSV2::GetUp() const Float3 Camera_FPSV2::GetLook() const { + if( this->pitchHaveChanged ) + { + this->head.SetRotation( this->body.rotation * Rotation(this->pitchUp, WorldAxisOf(this->body.rotation, Float3::standard_unit_x) ) ); + this->pitchHaveChanged = false; + } + return this->head.GetNormalOf( -Float3::standard_unit_z ); } diff --git a/Code/Game/GameClient/GameClientState/Camera_FPSV2.h b/Code/Game/GameClient/GameClientState/Camera_FPSV2.h index 7f66b185..210c9707 100644 --- a/Code/Game/GameClient/GameClientState/Camera_FPSV2.h +++ b/Code/Game/GameClient/GameClientState/Camera_FPSV2.h @@ -50,7 +50,7 @@ public: ::Oyster::Math::Float3 GetForward() const; private: - Camera_BasicV2 head; + mutable Camera_BasicV2 head; ::Oyster::Math::Float pitchUp; ::Oyster::Math::Float3 headOffset; struct @@ -58,6 +58,7 @@ private: ::Oyster::Math::Float3 translation; ::Oyster::Math::Quaternion rotation; } body; + mutable bool pitchHaveChanged; }; #endif \ No newline at end of file