1 #include "listener.h" 2 3 #include "scene/resources/mesh.h" 4 _update_audio_listener_state()5void Listener::_update_audio_listener_state() { 6 } 7 _request_listener_update()8void Listener::_request_listener_update() { 9 10 _update_listener(); 11 } 12 _set(const StringName & p_name,const Variant & p_value)13bool Listener::_set(const StringName &p_name, const Variant &p_value) { 14 15 if (p_name == "current") { 16 if (p_value.operator bool()) { 17 make_current(); 18 } else { 19 clear_current(); 20 } 21 } else 22 return false; 23 24 return true; 25 } _get(const StringName & p_name,Variant & r_ret) const26bool Listener::_get(const StringName &p_name, Variant &r_ret) const { 27 28 if (p_name == "current") { 29 if (is_inside_tree() && get_tree()->is_node_being_edited(this)) { 30 r_ret = current; 31 } else { 32 r_ret = is_current(); 33 } 34 } else 35 return false; 36 37 return true; 38 } 39 _get_property_list(List<PropertyInfo> * p_list) const40void Listener::_get_property_list(List<PropertyInfo> *p_list) const { 41 42 p_list->push_back(PropertyInfo(Variant::BOOL, "current")); 43 } 44 _update_listener()45void Listener::_update_listener() { 46 47 if (is_inside_tree() && is_current()) { 48 get_viewport()->_listener_transform_changed_notify(); 49 } 50 } 51 _notification(int p_what)52void Listener::_notification(int p_what) { 53 54 switch (p_what) { 55 56 case NOTIFICATION_ENTER_WORLD: { 57 bool first_listener = get_viewport()->_listener_add(this); 58 if (!get_tree()->is_node_being_edited(this) && (current || first_listener)) 59 make_current(); 60 } break; 61 case NOTIFICATION_TRANSFORM_CHANGED: { 62 _request_listener_update(); 63 } break; 64 case NOTIFICATION_EXIT_WORLD: { 65 66 if (!get_tree()->is_node_being_edited(this)) { 67 if (is_current()) { 68 clear_current(); 69 current = true; //keep it true 70 71 } else { 72 current = false; 73 } 74 } 75 76 get_viewport()->_listener_remove(this); 77 78 } break; 79 } 80 } 81 get_listener_transform() const82Transform Listener::get_listener_transform() const { 83 84 return get_global_transform().orthonormalized(); 85 } 86 make_current()87void Listener::make_current() { 88 89 current = true; 90 91 if (!is_inside_tree()) 92 return; 93 94 get_viewport()->_listener_set(this); 95 } 96 clear_current()97void Listener::clear_current() { 98 99 current = false; 100 if (!is_inside_tree()) 101 return; 102 103 if (get_viewport()->get_listener() == this) { 104 get_viewport()->_listener_set(NULL); 105 get_viewport()->_listener_make_next_current(this); 106 } 107 } 108 is_current() const109bool Listener::is_current() const { 110 111 if (is_inside_tree() && !get_tree()->is_node_being_edited(this)) { 112 113 return get_viewport()->get_listener() == this; 114 } else 115 return current; 116 117 return false; 118 } 119 _can_gizmo_scale() const120bool Listener::_can_gizmo_scale() const { 121 122 return false; 123 } 124 _get_gizmo_geometry() const125RES Listener::_get_gizmo_geometry() const { 126 Ref<Mesh> mesh = memnew(Mesh); 127 128 return mesh; 129 } 130 _bind_methods()131void Listener::_bind_methods() { 132 133 ObjectTypeDB::bind_method(_MD("make_current"), &Listener::make_current); 134 ObjectTypeDB::bind_method(_MD("clear_current"), &Listener::clear_current); 135 ObjectTypeDB::bind_method(_MD("is_current"), &Listener::is_current); 136 ObjectTypeDB::bind_method(_MD("get_listener_transform"), &Listener::get_listener_transform); 137 } 138 Listener()139Listener::Listener() { 140 141 current = false; 142 force_change = false; 143 //active=false; 144 } 145 ~Listener()146Listener::~Listener() { 147 } 148