Initial commit
This commit is contained in:
commit
edfc5298e1
252 changed files with 93965 additions and 0 deletions
158
source/Scene/Camera2D.cpp
Normal file
158
source/Scene/Camera2D.cpp
Normal file
|
|
@ -0,0 +1,158 @@
|
|||
|
||||
#include <Spectre/Math/Math.h>
|
||||
#include <Spectre/Scene/Camera2D.h>
|
||||
|
||||
Camera2D::Camera2D() :
|
||||
m_position (0.0f, 0.0f),
|
||||
m_rotation (0.0f),
|
||||
m_zoom (1.0f),
|
||||
m_size (0, 0),
|
||||
m_viewNeedsUpdate (false),
|
||||
m_projNeedsUpdate (false),
|
||||
m_view (Matrix4f::Identity),
|
||||
m_proj (Matrix4f::Identity)
|
||||
{
|
||||
reset(Vector2f(0, 0), Vector2f(800, 600));
|
||||
}
|
||||
|
||||
Camera2D::Camera2D(const Vector2f& position, const Vector2f& size) :
|
||||
m_position (position),
|
||||
m_rotation (0.0f),
|
||||
m_zoom (1.0f),
|
||||
m_size (size),
|
||||
m_viewNeedsUpdate (true),
|
||||
m_projNeedsUpdate (true),
|
||||
m_view (Matrix4f::Identity),
|
||||
m_proj (Matrix4f::Identity)
|
||||
{
|
||||
}
|
||||
|
||||
void Camera2D::reset(const Vector2f& position, const Vector2f& size)
|
||||
{
|
||||
m_position = size / 2.0f;
|
||||
m_size = size;
|
||||
|
||||
m_projNeedsUpdate = true;
|
||||
m_viewNeedsUpdate = true;
|
||||
}
|
||||
|
||||
void Camera2D::setPosition(float x, float y)
|
||||
{
|
||||
m_position.x = x;
|
||||
m_position.y = y;
|
||||
m_viewNeedsUpdate = true;
|
||||
}
|
||||
|
||||
void Camera2D::setPosition(const Vector2f& position)
|
||||
{
|
||||
setPosition(position.x, position.y);
|
||||
}
|
||||
|
||||
const Vector2f& Camera2D::getPosition() const
|
||||
{
|
||||
return m_position;
|
||||
}
|
||||
|
||||
void Camera2D::move(float x, float y)
|
||||
{
|
||||
setPosition(m_position.x + x, m_position.y + y);
|
||||
}
|
||||
|
||||
void Camera2D::move(const Vector2f& vec)
|
||||
{
|
||||
setPosition(m_position + vec);
|
||||
}
|
||||
|
||||
void Camera2D::moveUp(float delta)
|
||||
{
|
||||
vec2f dir = m_view.getUpVector() * vec2f(1.0f, -1.0f);
|
||||
|
||||
move(dir * delta);
|
||||
}
|
||||
|
||||
void Camera2D::moveRight(float delta)
|
||||
{
|
||||
vec2f dir = m_view.getRightVector() * vec2f(1.0f, -1.0f);
|
||||
|
||||
move(dir * delta);
|
||||
}
|
||||
|
||||
void Camera2D::setSize(const Vector2u& size)
|
||||
{
|
||||
if (m_size != size) {
|
||||
m_size = size;
|
||||
m_viewNeedsUpdate = true;
|
||||
m_projNeedsUpdate = true;
|
||||
}
|
||||
}
|
||||
|
||||
void Camera2D::setSize(unsigned int w, unsigned int h)
|
||||
{
|
||||
setSize(Vector2u(w, h));
|
||||
}
|
||||
|
||||
const Vector2u& Camera2D::getSize() const
|
||||
{
|
||||
return m_size;
|
||||
}
|
||||
|
||||
void Camera2D::setZoom(float factor)
|
||||
{
|
||||
if (factor < 0.0f) {
|
||||
factor = 0.0f;
|
||||
}
|
||||
m_zoom = factor;
|
||||
m_viewNeedsUpdate = true;
|
||||
}
|
||||
|
||||
void Camera2D::zoom(float factor)
|
||||
{
|
||||
setZoom(m_zoom + factor);
|
||||
}
|
||||
|
||||
void Camera2D::setRotation(float angle)
|
||||
{
|
||||
m_rotation = angle;
|
||||
m_viewNeedsUpdate = true;
|
||||
}
|
||||
|
||||
float Camera2D::getRotation() const
|
||||
{
|
||||
return m_rotation;
|
||||
}
|
||||
|
||||
void Camera2D::rotate(float delta)
|
||||
{
|
||||
setRotation(m_rotation + delta);
|
||||
}
|
||||
|
||||
const Matrix4f& Camera2D::getViewMatrix() const
|
||||
{
|
||||
return getTransform().getMatrix();
|
||||
}
|
||||
|
||||
const Matrix4f& Camera2D::getProjectionMatrix() const
|
||||
{
|
||||
if (m_projNeedsUpdate) {
|
||||
float w = static_cast<float>(m_size.x);
|
||||
float h = static_cast<float>(m_size.y);
|
||||
m_proj = math::orthoProjection(0.0f, w, h, 0.0f);
|
||||
m_projNeedsUpdate = false;
|
||||
}
|
||||
return m_proj;
|
||||
}
|
||||
|
||||
const Transform& Camera2D::getTransform() const
|
||||
{
|
||||
if (m_viewNeedsUpdate) {
|
||||
Vector2f half_size = Vector2f(m_size) / 2.0f;
|
||||
|
||||
m_view.reset();
|
||||
m_view.translate(half_size);
|
||||
m_view.scale(m_zoom);
|
||||
m_view.rotate(m_rotation);
|
||||
m_view.translate(-m_position);
|
||||
m_viewNeedsUpdate = false;
|
||||
}
|
||||
return m_view;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue