💿🐜 Antkeeper source code https://antkeeper.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

193 lines
4.4 KiB

/*
* Copyright (C) 2017 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 CAMERA_CONTROLLER_HPP
#define CAMERA_CONTROLLER_HPP
#include <emergent/emergent.hpp>
using namespace Emergent;
class CameraController
{
public:
CameraController();
virtual void update(float dt) = 0;
void setCamera(Camera* camera);
const Camera* getCamera() const;
Camera* getCamera();
protected:
Camera* camera;
};
inline void CameraController::setCamera(Camera* camera)
{
this->camera = camera;
}
inline const Camera* CameraController::getCamera() const
{
return camera;
}
inline Camera* CameraController::getCamera()
{
return camera;
}
class SurfaceCameraController: public CameraController
{
public:
SurfaceCameraController();
virtual ~SurfaceCameraController();
virtual void update(float dt);
/// @param direction Specifies the movement direction and speed scale on the XZ plane
void move(Vector2 direction);
void rotate(float angle);
void zoom(float distance);
void setFocalPoint(const Vector3& point);
void setFocalDistance(float distance);
void setElevation(float angle);
void setAzimuth(float angle);
void setTargetFocalPoint(const Vector3& point);
void setTargetFocalDistance(float distance);
void setTargetElevation(float angle);
void setTargetAzimuth(float angle);
const Vector3& getFocalPoint() const;
float getFocalDistance() const;
float getElevation() const;
float getAzimuth() const;
const Vector3& getTargetFocalPoint() const;
float getTargetFocalDistance() const;
float getTargetElevation() const;
float getTargetAzimuth() const;
const Vector3& getTranslation() const;
const glm::quat& getRotation() const;
const Vector3& getTargetTranslation() const;
const glm::quat& getTargetRotation() const;
private:
Vector3 focalPoint;
float focalDistance;
float elevation;
float azimuth;
Vector3 targetFocalPoint;
float targetFocalDistance;
float targetElevation;
float targetAzimuth;
glm::quat elevationRotation;
glm::quat azimuthRotation;
glm::quat rotation;
glm::quat targetElevationRotation;
glm::quat targetAzimuthRotation;
glm::quat targetRotation;
Vector3 translation;
Vector3 targetTranslation;
};
inline const Vector3& SurfaceCameraController::getFocalPoint() const
{
return focalPoint;
}
inline float SurfaceCameraController::getFocalDistance() const
{
return focalDistance;
}
inline float SurfaceCameraController::getElevation() const
{
return elevation;
}
inline float SurfaceCameraController::getAzimuth() const
{
return azimuth;
}
inline const Vector3& SurfaceCameraController::getTargetFocalPoint() const
{
return targetFocalPoint;
}
inline float SurfaceCameraController::getTargetFocalDistance() const
{
return targetFocalDistance;
}
inline float SurfaceCameraController::getTargetElevation() const
{
return targetElevation;
}
inline float SurfaceCameraController::getTargetAzimuth() const
{
return targetAzimuth;
}
inline const Vector3& SurfaceCameraController::getTranslation() const
{
return translation;
}
inline const glm::quat& SurfaceCameraController::getRotation() const
{
return rotation;
}
inline const Vector3& SurfaceCameraController::getTargetTranslation() const
{
return targetTranslation;
}
inline const glm::quat& SurfaceCameraController::getTargetRotation() const
{
return targetRotation;
}
/**
* Note, when mouseover tunnel, highlight (in red?) the entire path from the end of the tunnel to the entrance of the nest.
*/
class TunnelCameraController: public CameraController
{
public:
TunnelCameraController();
virtual ~TunnelCameraController();
virtual void update(float dt);
void rotateCW(float scale);
void rotateCCW(float scale);
// Ascends the tunnel system in the direction of the entrance
void ascend(float scale);
// Descends along the current tunnel
void descend(float scale);
};
#endif