#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 event) { Input const *input_singleton = Input::get_singleton(); Ref 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 }