/*---------------------------------------------------------------------------* Project: NintendoWare File: SmCamera.h Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo and/or its licensed developers and are protected by national and international copyright laws. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. The content herein is highly confidential and should be handled accordingly. $Revision: $ *---------------------------------------------------------------------------*/ #ifndef SM_CAMERA_H_ #define SM_CAMERA_H_ #include #include "../include/SmMessage.h" #include "../include/SmPadStatus.h" #include "../include/SmRectCollision.h" #include "../include/SmTouchPanelStatus.h" //------------------------------------------------------------------------------ // カメラ情報構造体 // Viewerから拝借しました。 struct CameraInfo { /* float AspectRatio; float Height; float Rotate; float Twist;*/ float Near; float Far; float Fovy; nw::math::VEC3 Position; nw::math::VEC3 TargetPos; nw::math::VEC3 UpVector; float RotationInit; float RotationStep; float RotationMax; float TranslationInit; float TranslationStep; float TranslationMax; float TiltInit; float DollyInit; bool TumbleXInverse; bool TumbleYInverse; bool TrackXInverse; bool TrackYInverse; bool DollyInverse; bool DollyTargetInverse; bool TiltXInverse; bool TiltYInverse; CameraInfo(); }; //------------------------------------------------------------------------------ // カメラクラス class SmCamera : public SmMessage { friend class GfxCtrl; private: // コンストラクタ SmCamera( nw::gfx::SceneNode* parent, nw::gfx::Camera* camera ); // デストラクタ ~SmCamera(); public: // カメラアニメーション配列 #define ANIM_COUNT (32) typedef nw::ut::FixedSizeArray CameraAnimEvaluatorArray; // 視点セット void SetPosition( nw::math::VEC3* position ) { NW_NULL_ASSERT( position ); NW_NULL_ASSERT( m_Camera ); // 視点 m_Position = *position; m_Camera->Transform().SetTranslate( m_Position ); } void SetPadCameraPosition( nw::math::VEC3* position ) { NW_NULL_ASSERT( position ); NW_NULL_ASSERT( m_PadCamera ); m_PadCamera->Transform().SetTranslate( *position ); } // 視点取得 void GetPosition( nw::math::VEC3* position ) { NW_NULL_ASSERT( position ); *position = m_Position; } // 注視点をセット void SetTarget( nw::math::VEC3* target ) { NW_NULL_ASSERT( target ); NW_NULL_ASSERT( m_Camera ); m_Target = *target; nw::gfx::ResCameraViewUpdater resViewUpdater = m_Camera->GetViewUpdater()->GetResource(); nw::gfx::ResAimTargetViewUpdater resAimTargetViewUpdater = nw::gfx::ResDynamicCast(resViewUpdater); nw::gfx::ResLookAtTargetViewUpdater resLookAtTargetViewUpdater = nw::gfx::ResDynamicCast(resViewUpdater); nw::gfx::ResRotateViewUpdater resRotateViewUpdater = nw::gfx::ResDynamicCast(resViewUpdater); // 注視点を保持 if (resAimTargetViewUpdater.IsValid()) { resAimTargetViewUpdater.SetTargetPosition( m_Target ); } else if (resLookAtTargetViewUpdater.IsValid()) { resLookAtTargetViewUpdater.SetTargetPosition( m_Target ); } else if (resRotateViewUpdater.IsValid()) { // NW_FATAL_ERROR("Unxxxxx type of resource view updater"); } else { NW_FATAL_ERROR("Invalid type of resource view updater"); } } void SetPadCameraTarget( nw::math::VEC3* target ) { NW_NULL_ASSERT( m_PadCamera ); nw::gfx::LookAtTargetViewUpdater* viewUpdater = nw::ut::DynamicCast(m_PadCamera->GetViewUpdater()); nw::gfx::ResLookAtTargetViewUpdater resViewUpdater = nw::gfx::ResStaticCast(viewUpdater->GetResource()); resViewUpdater.SetTargetPosition(*target); } // 注視点を取得 void GetTarget( nw::math::VEC3* target ) { NW_NULL_ASSERT( target ); *target = m_Target; } // カメラセット void SetGxCamera( nw::gfx::Camera* camera ); // カメラを取得します。 nw::gfx::Camera* GetGxCamera(); nw::gfx::Camera* GetBaseCamera() { return m_Camera; } nw::gfx::Camera* GetPadCamera() { return m_PadCamera; } bool IsPadCamera() { return m_PadCameraAttached; } /* アニメーション機能 */ // アニメーションを追加する void AddAnimEvaluator( nw::gfx::AnimEvaluator* animEvaluator ); // アニメーション数を取得する uint GetAnimEvaluatorNum() const; // アニメーション設定解除する bool DetachAnimEvaluator(); // アニメーションを設定する bool SetAnimEvaluatorNo( uint animEvaluatorNo ); // アニメーションフレームを設定する void SetAnimationFrame( f32 setFrame ); // アニメーションフレームを進める bool AddAnimationFrame( f32 addFrame, bool loop = true ); // アニメーションフレームを取得する f32 GetAnimationFrame() const; // メッセージ受信 virtual bool ReceveMessage( SmMessageType type, void* object, uint targetId ); // Viewerと同カメラ操作 void MoveCamera3D( SmPadStatus* padStaus, SmTouchPanelStatus* panelStatus ); // カメラマトリクスを更新する void UpdateMatrix(); private: nw::gfx::SceneNode* m_Parent; nw::gfx::Camera* m_Camera; nw::gfx::Camera* m_PadCamera; bool m_PadCameraAttached; nw::math::VEC3 m_Position; nw::math::VEC3 m_Target; bool m_IsAnimPlaying; f32 m_AnimationFrame; s32 m_CurrentAnimEvNo; CameraAnimEvaluatorArray m_CameraAnimEvaluatorArray; f32 mRotation; f32 mTranslation; CameraInfo mCameraInfo; s32 mTouchPanelX; s32 mTouchPanelY; bool m_IsGrab; SmRectCollision m_Collision; }; #endif // SM_CAMERA_H_