summaryrefslogtreecommitdiffhomepage
path: root/Cameraman.cpp
blob: f65cb44c0af2a8b1a1f2ffe241b10a7f3985df07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include "Cameraman.h"

#include <algorithm>
#include <cmath>

#include <raylib.h>
#include <raymath.h>

#include "VectorMath.h"


Cameraman::Cameraman()
{
    camera.position = Vector3{10.0f, 10.0f, 10.0f};
    camera.target = Vector3{0.0f, 0.0f, 0.0f};
    camera.up = Vector3{0.0f, 1.0f, 0.0f};
    camera.fovy = 45;
    camera.projection = CAMERA_PERSPECTIVE;
    SetCameraMode(camera, CAMERA_CUSTOM);
    m_angle.x = std::atan2(10.0f, 10.0f);
    m_angle.y = std::atan2(10.0f, std::sqrt(std::pow(10.0f, 2) + std::pow(10.0f, 2)));
}


void
Cameraman::update(const float)
{
    const auto drag = GetMouseDelta();
    if (IsMouseButtonDown(0)) {
        m_angle.x += drag.x * -0.01f;
        m_angle.y = std::clamp(m_angle.y + drag.y * 0.01f, -1.483f, 1.483f);
    }
    const float zoom = GetMouseWheelMove();
    if (zoom != 0.0f) {
        const auto offset = Vector3Subtract(camera.target, camera.position);
        const float current = Vector3Length(offset);
        const float expected = std::clamp(current + zoom * 0.5f, 1.0f, 30.0f);
        camera.position = Vector3Add(camera.target, Vector3Scale(offset, expected / current));
    }
    const float distance = dist(camera.position, camera.target);
    camera.position.x = camera.target.x + distance * -std::sin(m_angle.x) * std::cos(m_angle.y);
    camera.position.y = camera.target.y + distance * std::sin(m_angle.y);
    camera.position.z = camera.target.z + distance * -std::cos(m_angle.x) * std::cos(m_angle.y);
}