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