diff --git a/src/system/math/Rot.h b/src/system/math/Rot.h index d51ba3cf..f5636de2 100644 --- a/src/system/math/Rot.h +++ b/src/system/math/Rot.h @@ -21,7 +21,10 @@ void Invert(const Transform&, Transform&); void Interp(const Vector3&, const Vector3&, float, Vector3&); void Interp(const Hmx::Quat&, const Hmx::Quat&, float, Hmx::Quat&); void Interp(const Hmx::Color&, const Hmx::Color&, float, Hmx::Color&); -void Interp(float, float, float, float&); + +inline void Interp(float f1, float f2, float f3, float& fres){ + fres = f3 * (f2 - f1) + f1; +} TextStream& operator<<(TextStream& ts, const Hmx::Quat& v); TextStream& operator<<(TextStream& ts, const Vector3& v); diff --git a/src/system/rndobj/Anim.h b/src/system/rndobj/Anim.h index 85e81d9f..3ff24754 100644 --- a/src/system/rndobj/Anim.h +++ b/src/system/rndobj/Anim.h @@ -29,7 +29,7 @@ class RndAnimatable : public virtual Hmx::Object { virtual bool Loop(){ return 0; } virtual void StartAnim(){} virtual void EndAnim(){} - virtual void SetFrame(float frame, float blend); // weak + virtual void SetFrame(float frame, float blend){ mFrame = frame; } virtual float StartFrame(){ return 0.0f; } virtual float EndFrame(){ return 0.0f; } virtual Hmx::Object* AnimTarget(){ return this; } @@ -55,8 +55,8 @@ class RndAnimatable : public virtual Hmx::Object { float FramesPerUnit(); bool ConvertFrames(float&); - float mFrame; - Rate mRate; + float mFrame; // 0x8 + Rate mRate; // 0xc }; class AnimTask : public Task { diff --git a/src/system/rndobj/Cam.h b/src/system/rndobj/Cam.h index 1466fd32..25af1457 100644 --- a/src/system/rndobj/Cam.h +++ b/src/system/rndobj/Cam.h @@ -33,6 +33,10 @@ class RndCam : public RndTransformable { DataNode OnSetZRange(const DataArray*); DataNode OnSetScreenRect(const DataArray*); DataNode OnFarPlane(const DataArray*); + + float NearPlane() const { return mNearPlane; } + float FarPlane() const { return mFarPlane; } + float YFov() const { return mYFov; } static RndCam* sCurrent; NEW_OBJ(RndCam) diff --git a/src/system/rndobj/CamAnim.cpp b/src/system/rndobj/CamAnim.cpp index 174d5c4a..85c853f8 100644 --- a/src/system/rndobj/CamAnim.cpp +++ b/src/system/rndobj/CamAnim.cpp @@ -51,10 +51,31 @@ void RndCamAnim::Replace(Hmx::Object* from, Hmx::Object* to){ } } +// fn_805CE7DC +void RndCamAnim::SetFrame(float frame, float blend){ + RndAnimatable::SetFrame(frame, blend); + if(mCam){ + if(!FovKeys().empty()){ + float ref = mCam->YFov(); + FovKeys().AtFrame(frame, ref); + if(blend != 1.0f){ + Interp(mCam->YFov(), ref, blend, ref); + } + mCam->SetFrustum(mCam->NearPlane(), mCam->FarPlane(), ref, 1.0f); + } + } +} + float RndCamAnim::EndFrame(){ - Keys& theKeys = mKeysOwner->mFovKeys; - if(!theKeys.empty()) return theKeys.back().frame; - else return 0.0f; + return FovKeys().LastFrame(); +} + +// fn_805CE930 +void RndCamAnim::SetKey(float frame){ + if(mCam){ + const float& val = mCam->YFov(); + FovKeys().Add(val, frame, true); + } } RndCamAnim::~RndCamAnim(){ diff --git a/src/system/rndobj/CamAnim.h b/src/system/rndobj/CamAnim.h index 599c4baf..74a6875c 100644 --- a/src/system/rndobj/CamAnim.h +++ b/src/system/rndobj/CamAnim.h @@ -23,6 +23,8 @@ class RndCamAnim : public RndAnimatable { virtual void Replace(Hmx::Object*, Hmx::Object*); virtual void Print(); + Keys& FovKeys() { return mKeysOwner->mFovKeys; } + DECLARE_REVS; NEW_OVERLOAD; DELETE_OVERLOAD; @@ -31,9 +33,9 @@ class RndCamAnim : public RndAnimatable { REGISTER_OBJ_FACTORY(RndCamAnim) } - ObjPtr mCam; - Keys mFovKeys; - ObjOwnerPtr mKeysOwner; + ObjPtr mCam; // 0x10 + Keys mFovKeys; // 0x1c + ObjOwnerPtr mKeysOwner; // 0x24 }; #endif