summaryrefslogtreecommitdiff
path: root/src/camera_controller/playercam.cpp
blob: f321c0953e95c5182b0e8dbfec2bb2fb72abb57a (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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "playercam.h"
#include "InputEventMouseMotion.hpp"


using namespace godot;

PlayerCam::PlayerCam () { }
PlayerCam::~PlayerCam () { }

void PlayerCam::_register_methods() {
	register_method("_ready", &PlayerCam::_ready);
	register_method("_input", &PlayerCam::_input);
	register_method("attach", &PlayerCam::attach);
	register_method("mouse_firstperson", &PlayerCam::mouse_firstperson);
	register_method("mouse_thirdperson", &PlayerCam::mouse_thirdperson);
	register_method("mouse_arm", &PlayerCam::mouse_arm);
	register_method("mouse_freecam", &PlayerCam::mouse_freecam);
}

void PlayerCam::_init() {
	mode = String("STATIC");
	head = nullptr;
	neck = nullptr;
	player = nullptr;
	arm = nullptr;
	mouse_axis = Vector2::ZERO;
	mouse_sensitivity = 12.0;
}

void PlayerCam::_ready() {
    Input *input_singleton = Input::get_singleton();
	input_singleton->set_mouse_mode(Input::MOUSE_MODE_CAPTURED);
	set_current(true);
}

void PlayerCam::_input(const Ref<InputEvent> event) {
    Input const *input_singleton = Input::get_singleton();
    Ref<InputEventMouseMotion> event_m(event);
	if(event_m.is_valid() && input_singleton->get_mouse_mode() == Input::MOUSE_MODE_CAPTURED){
		mouse_axis = event_m->get_relative();
	    if(mode == "FIRSTPERSON")mouse_firstperson();
        else if(mode == "THIRDPERSON")mouse_thirdperson();
	    else if(mode == "STATIC");
	    else if(mode == "ARM")mouse_arm();
	    else if(mode == "FREECAM")mouse_freecam();
    }
}

void PlayerCam::attach(Node* new_parent, String c_mode, String extra_path) {
	if(get_parent() != nullptr) 
		get_parent()->remove_child(this);
    if(c_mode == "FIRSTPERSON") {
        head = (Spatial*)new_parent->find_node("Head", true, false); neck = (Spatial*)new_parent->find_node("Neck", true, false);
        arm = nullptr; mode = c_mode;
    }
    else if (c_mode == "THIRDPERSON") {
        head = (Spatial*)new_parent->find_node("Head", true, false); neck = (Spatial*)new_parent->find_node("Neck", true, false);
        arm = (SpringArm*)new_parent->find_node("SpringArm", true, false); mode = c_mode;
    }
    else if(c_mode == "ARM") {
        head = nullptr; neck = nullptr;
        arm = (SpringArm*)new_parent->find_node("SpringArm", true, false); mode = c_mode;
    }
    else {
        head = nullptr; neck = nullptr; arm = nullptr;
    }
	new_parent->get_node(NodePath(extra_path))->add_child(this);
	set_transform(Transform::IDENTITY);
}

void PlayerCam::mouse_firstperson() {
	if(mouse_axis.length_squared() > 0.0){
		float horizontal = -mouse_axis.x * (mouse_sensitivity / 100.0);
		float vertical   = -mouse_axis.y * (mouse_sensitivity / 100.0);
		
		neck->rotate_y(Math::deg2rad(horizontal));
		head->rotate_x(Math::deg2rad(vertical));
		
		//vertical clamp
        Vector3 new_rot = head->get_rotation_degrees();
        new_rot.x = Math::clamp((double)new_rot.x, -90.0, 90.0);
		head->set_rotation_degrees(new_rot); 
    }
}

void PlayerCam::mouse_thirdperson() {
    Vector3 new_arm_rot = arm->get_rotation_degrees();
    new_arm_rot.x = Math::clamp((double)(get_rotation_degrees().x-mouse_axis.y*(mouse_sensitivity / 100)),-90.0,90.0);
    new_arm_rot.y -= mouse_axis.x*(mouse_sensitivity / 100.0);
    arm->set_rotation_degrees(new_arm_rot); 
    Vector3 new_head_rot = Vector3(arm->get_rotation_degrees().x, 0, 0);
    Vector3 new_neck_rot = Vector3(0, arm->get_rotation_degrees().y, 0);

    head->set_rotation_degrees(new_head_rot);
    neck->set_rotation_degrees(new_neck_rot);
}

void PlayerCam::mouse_arm() {
	//arm->rotation_degrees.x = Math::clamp(rotation_degrees.x-mouse_axis.y*(mouse_sensitivity / 100),-70,70);
	//arm->rotation_degrees.y -= mouse_axis.x*(mouse_sensitivity / 100);
}

void PlayerCam::mouse_freecam() {
//	pass
}