summaryrefslogtreecommitdiff
path: root/src/camera_controller/playercam.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/camera_controller/playercam.cpp')
-rw-r--r--src/camera_controller/playercam.cpp107
1 files changed, 107 insertions, 0 deletions
diff --git a/src/camera_controller/playercam.cpp b/src/camera_controller/playercam.cpp
new file mode 100644
index 0000000..f321c09
--- /dev/null
+++ b/src/camera_controller/playercam.cpp
@@ -0,0 +1,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
+}
+
+