1 #include "listener.h"
2 
3 #include "scene/resources/mesh.h"
4 
_update_audio_listener_state()5 void Listener::_update_audio_listener_state() {
6 }
7 
_request_listener_update()8 void Listener::_request_listener_update() {
9 
10 	_update_listener();
11 }
12 
_set(const StringName & p_name,const Variant & p_value)13 bool 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) const26 bool 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) const40 void Listener::_get_property_list(List<PropertyInfo> *p_list) const {
41 
42 	p_list->push_back(PropertyInfo(Variant::BOOL, "current"));
43 }
44 
_update_listener()45 void 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)52 void 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() const82 Transform Listener::get_listener_transform() const {
83 
84 	return get_global_transform().orthonormalized();
85 }
86 
make_current()87 void 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()97 void 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() const109 bool 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() const120 bool Listener::_can_gizmo_scale() const {
121 
122 	return false;
123 }
124 
_get_gizmo_geometry() const125 RES Listener::_get_gizmo_geometry() const {
126 	Ref<Mesh> mesh = memnew(Mesh);
127 
128 	return mesh;
129 }
130 
_bind_methods()131 void 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()139 Listener::Listener() {
140 
141 	current = false;
142 	force_change = false;
143 	//active=false;
144 }
145 
~Listener()146 Listener::~Listener() {
147 }
148