/*
|
|
* Copyright (C) 2020 Christopher J. Howard
|
|
*
|
|
* This file is part of Antkeeper source code.
|
|
*
|
|
* Antkeeper source code is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* Antkeeper source code is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with Antkeeper source code. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef ANTKEEPER_ORBIT_CAM_HPP
|
|
#define ANTKEEPER_ORBIT_CAM_HPP
|
|
|
|
#include "camera-rig.hpp"
|
|
|
|
/**
|
|
* Rig which orbits around a focal point.
|
|
*/
|
|
class orbit_cam: public camera_rig
|
|
{
|
|
public:
|
|
orbit_cam();
|
|
virtual ~orbit_cam();
|
|
virtual void update(float dt);
|
|
|
|
/// @param direction Specifies the movement direction and speed scale on the XZ plane
|
|
void move(const float2& direction);
|
|
void rotate(float angle);
|
|
void tilt(float angle);
|
|
void zoom(float distance);
|
|
|
|
void set_focal_point(const float3& point);
|
|
void set_focal_distance(float distance);
|
|
void set_elevation(float angle);
|
|
void set_azimuth(float angle);
|
|
void set_target_focal_point(const float3& point);
|
|
void set_target_focal_distance(float distance);
|
|
void set_target_elevation(float angle);
|
|
void set_target_azimuth(float angle);
|
|
|
|
const float3& get_focal_point() const;
|
|
float get_focal_distance() const;
|
|
float get_elevation() const;
|
|
float get_azimuth() const;
|
|
const float3& get_target_focal_point() const;
|
|
float get_target_focal_distance() const;
|
|
float get_target_elevation() const;
|
|
float get_target_azimuth() const;
|
|
const float3& get_target_translation() const;
|
|
const vmq::quaternion<float>& get_target_rotation() const;
|
|
|
|
private:
|
|
float3 focal_point;
|
|
float focal_distance;
|
|
float elevation;
|
|
float azimuth;
|
|
|
|
float3 target_focal_point;
|
|
float target_focal_distance;
|
|
float target_elevation;
|
|
float target_azimuth;
|
|
|
|
vmq::quaternion<float> elevation_rotation;
|
|
vmq::quaternion<float> azimuth_rotation;
|
|
vmq::quaternion<float> target_elevation_rotation;
|
|
vmq::quaternion<float> target_azimuth_rotation;
|
|
vmq::quaternion<float> target_rotation;
|
|
float3 target_translation;
|
|
};
|
|
|
|
inline const float3& orbit_cam::get_focal_point() const
|
|
{
|
|
return focal_point;
|
|
}
|
|
|
|
inline float orbit_cam::get_focal_distance() const
|
|
{
|
|
return focal_distance;
|
|
}
|
|
|
|
inline float orbit_cam::get_elevation() const
|
|
{
|
|
return elevation;
|
|
}
|
|
|
|
inline float orbit_cam::get_azimuth() const
|
|
{
|
|
return azimuth;
|
|
}
|
|
|
|
inline const float3& orbit_cam::get_target_focal_point() const
|
|
{
|
|
return target_focal_point;
|
|
}
|
|
|
|
inline float orbit_cam::get_target_focal_distance() const
|
|
{
|
|
return target_focal_distance;
|
|
}
|
|
|
|
inline float orbit_cam::get_target_elevation() const
|
|
{
|
|
return target_elevation;
|
|
}
|
|
|
|
inline float orbit_cam::get_target_azimuth() const
|
|
{
|
|
return target_azimuth;
|
|
}
|
|
|
|
inline const float3& orbit_cam::get_target_translation() const
|
|
{
|
|
return target_translation;
|
|
}
|
|
|
|
inline const vmq::quaternion<float>& orbit_cam::get_target_rotation() const
|
|
{
|
|
return target_rotation;
|
|
}
|
|
|
|
#endif // ANTKEEPER_ORBIT_CAM_HPP
|