6 #include "nta/Camera2D.h"
28 m_center(center), m_dimensions(dimensions), m_orientation(orientation) {
34 glm::mat3 Camera2D::getTranslationMatrix()
const {
41 glm::mat3 Camera2D::getRotationMatrix()
const {
48 glm::mat3 Camera2D::getInverseRotationMatrix()
const {
55 glm::mat3 Camera2D::getDilationMatrix()
const {
63 return getDilationMatrix() * getRotationMatrix() * getTranslationMatrix();
65 glm::mat3 Camera2D::getInverseCameraMatrix()
const {
71 glm::vec4 Camera2D::getBoundsTopLeft()
const {
77 glm::vec2 Camera2D::getTopLeft()
const {
78 glm::vec2 axes = getRotatedDimensions();
81 glm::vec2 Camera2D::getDimensions()
const {
84 glm::vec2 Camera2D::getRotatedDimensions()
const {
85 glm::vec3 axes = getRotationMatrix() * glm::vec3(
m_dimensions, 1.);
86 return glm::vec2(axes.x, axes.y);
88 float Camera2D::getOrientation()
const {
92 auto mat = getRotationMatrix();
93 glm::vec3 e1 = mat * glm::vec3(1,0,1), e2 = mat * glm::vec3(0,1,1);
94 return std::make_tuple(glm::vec2(e1.x, e1.y), glm::vec2(e2.x, e2.y));
98 glm::vec2 screen(mouse.x, windowDimensions.y - mouse.y);
99 screen = 2.f*screen/windowDimensions - 1.f;
103 glm::vec3 orig = getInverseCameraMatrix() * glm::vec3(screen, 1);
104 return glm::vec2(orig.x, orig.y);
107 glm::vec2 transformed_pt = getInverseRotationMatrix() * glm::vec3(pt -
m_center, 1);
116 std::vector<glm::vec2> transformed_poly(polygon.size());
117 std::transform(polygon.begin(), polygon.end(), transformed_poly.begin(), [&](crvec2 pt) {
118 return getInverseRotationMatrix() * glm::vec3(pt - m_center, 1);
121 std::vector<glm::vec2> normals(polygon.size()+2);
122 normals[0] = glm::vec2(1,0);
123 normals[1] = glm::vec2(0,1);
124 for (
int i = 0; i < polygon.size(); i++) {
125 glm::vec2& p1 = transformed_poly[i];
126 glm::vec2& p2 = transformed_poly[(i+1)%polygon.size()];
127 glm::vec2 side = p2 - p1;
129 normals[i+2] = glm::vec2(-side.y, side.x);
132 glm::vec2 cam_pts[4] = {
138 for (
const auto& n : normals) {
139 auto cam_minmax = std::accumulate(cam_pts, cam_pts+4, std::make_pair(FLT_MAX, FLT_MIN),
140 [&](std::pair<float, float> p, crvec2 pt) {
141 float proj = glm::dot(n, pt);
142 p.first = std::min(p.first, proj);
143 p.second = std::max(p.second, proj);
146 auto poly_minmax = std::accumulate(transformed_poly.begin(), transformed_poly.end(), std::make_pair(FLT_MAX, FLT_MIN),
147 [&](std::pair<float, float> p, crvec2 pt) {
148 float proj = glm::dot(n, pt);
149 p.first = std::min(p.first, proj);
150 p.second = std::max(p.second, proj);
154 if (cam_minmax.first > poly_minmax.second ||
155 poly_minmax.first > cam_minmax.second) {
168 void Camera2D::setDimensions(crvec2 dimensions) {
171 void Camera2D::setDimensions(
float w,
float h) {
175 void Camera2D::setOrientation(
float t) {
179 if (move_along_axis) {
182 glm::vec3 move = getInverseRotationMatrix() * glm::vec3(translation, 1.);
183 m_center += glm::vec2(move.x, move.y);