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
}
|