Newer
Older
Import / projects / Gameloft / bne_lib / code / Camera / DebugCameraController.h
#ifndef _DEBUG_CAMERA_CONTROLLER_H_
#define _DEBUG_CAMERA_CONTROLLER_H_

#include "Camera/InteractiveCameraController.h"
#include "Utils/CasualCoreCandidates.h"

namespace bne
{
  BEGIN_CUSTOMOBJECT(DebugCameraController, ::InteractiveCameraController)

public:
  DebugCameraController();
  ~DebugCameraController();

  virtual bool Init() override;
  virtual void Reset() override;
  virtual void SetCameraControl(RKCamera* camera) override;
  virtual void UpdateFromCamera(RKCamera* camera) override;

  virtual void CopySettingFromCameraCtrl(CasualCore::CameraController* ctrl) override;

  virtual bool OnKeyDown(int keycode) override;
  virtual bool OnKeyUp(int keycode) override;

  virtual void Pinch(float x, float y) override;
  virtual void PanStarted(float x, float y) override;
  virtual void PanChanged(float x, float y) override;
  virtual void PanEnded(float x, float y) override;
  virtual void RotateStarted(float x, float y) override;
  virtual void RotateChanged(float x, float y) override;
  virtual void HeightStarted(float x, float y);
  virtual void HeightChanged(float x, float y);

  virtual void Update(float time) override;

private:
  void  ZoomBy(float zoom_delta);
  void  UpdateZoomPoint(float x, float y);
  RKVector ScreenToWorld(const RKVector2 & position);
  RKVector GetLookAtPoint(RKTransformObject* camera);

  // runtime data
  RKVector2 m_pinchRefScreenPoint;
  RKVector  m_vBoundaryCenter;
  RKVector  m_CameraDesiredTarget;
  RKVector2 m_currentScreenPoint;
  RKVector2 m_previousScreenPoint;
  RKVector  m_initialPosition;
  float m_yaw;
  float m_pitch;

  enum Mode
  {
    Mode_Rotate,
    Mode_Pan,
    Mode_Height
  };
  Mode m_mode;

  CCCUtils::V2BoundsTy m_PanningLimitVertices;
  CCCUtils::V2BoundsTy m_ExtendedPanningLimitVertices;
  RKVector2 m_vPanningLimitCentroid;

  END_CUSTOMOBJECT(DebugCameraController)
}

#endif