From 3741bc70fe2aa96d163880cfe1ca013e741fd03e Mon Sep 17 00:00:00 2001 From: Saracen Date: Sun, 20 Mar 2016 02:10:04 +0000 Subject: [PATCH] Added listener spatial node. --- scene/3d/listener.cpp | 167 +++++++++++++++++++++ scene/3d/listener.h | 53 +++++++ scene/main/viewport.cpp | 115 ++++++++++++-- scene/main/viewport.h | 17 ++- scene/register_scene_types.cpp | 2 + tools/editor/icons/icon_gizmo_listener.png | Bin 0 -> 1698 bytes tools/editor/icons/icon_listener.png | Bin 0 -> 449 bytes tools/editor/spatial_editor_gizmos.cpp | 59 ++++++++ tools/editor/spatial_editor_gizmos.h | 16 ++ 9 files changed, 410 insertions(+), 19 deletions(-) create mode 100644 scene/3d/listener.cpp create mode 100644 scene/3d/listener.h create mode 100644 tools/editor/icons/icon_gizmo_listener.png create mode 100644 tools/editor/icons/icon_listener.png diff --git a/scene/3d/listener.cpp b/scene/3d/listener.cpp new file mode 100644 index 00000000000..bf42a5c92e6 --- /dev/null +++ b/scene/3d/listener.cpp @@ -0,0 +1,167 @@ +#include "listener.h" + +#include "scene/resources/mesh.h" + +void Listener::_update_audio_listener_state() { + + +} + +void Listener::_request_listener_update() { + + _update_listener(); +} + +bool Listener::_set(const StringName& p_name, const Variant& p_value) { + + if (p_name == "current") { + if (p_value.operator bool()) { + make_current(); + } + else { + clear_current(); + } + } + else + return false; + + return true; +} +bool Listener::_get(const StringName& p_name,Variant &r_ret) const { + + if (p_name == "current") { + if (is_inside_tree() && get_tree()->is_node_being_edited(this)) { + r_ret = current; + } + else { + r_ret = is_current(); + } + } + else + return false; + + return true; +} + +void Listener::_get_property_list( List *p_list) const { + + p_list->push_back( PropertyInfo( Variant::BOOL, "current" ) ); +} + +void Listener::_update_listener() { + + if (is_inside_tree() && is_current()) { + get_viewport()->_listener_transform_changed_notify(); + + } +} + +void Listener::_notification(int p_what) { + + switch(p_what) { + + case NOTIFICATION_ENTER_WORLD: { + bool first_listener = get_viewport()->_listener_add(this); + if (!get_tree()->is_node_being_edited(this) && (current || first_listener)) + make_current(); + } break; + case NOTIFICATION_TRANSFORM_CHANGED: { + _request_listener_update(); + } break; + case NOTIFICATION_EXIT_WORLD: { + + if (!get_tree()->is_node_being_edited(this)) { + if (is_current()) { + clear_current(); + current=true; //keep it true + + } else { + current=false; + } + } + + get_viewport()->_listener_remove(this); + + + } break; + + + } + +} + + +Transform Listener::get_listener_transform() const { + + return get_global_transform().orthonormalized(); +} + +void Listener::make_current() { + + current=true; + + if (!is_inside_tree()) + return; + + get_viewport()->_listener_set(this); +} + + + + +void Listener::clear_current() { + + current=false; + if (!is_inside_tree()) + return; + + if (get_viewport()->get_listener()==this) { + get_viewport()->_listener_set(NULL); + get_viewport()->_listener_make_next_current(this); + } + +} + +bool Listener::is_current() const { + + if (is_inside_tree() && !get_tree()->is_node_being_edited(this)) { + + return get_viewport()->get_listener()==this; + } else + return current; + + return false; +} + +bool Listener::_can_gizmo_scale() const { + + return false; +} + +RES Listener::_get_gizmo_geometry() const { + Ref mesh = memnew(Mesh); + + return mesh; +} + +void Listener::_bind_methods() { + + ObjectTypeDB::bind_method( _MD("make_current"),&Listener::make_current ); + ObjectTypeDB::bind_method( _MD("clear_current"),&Listener::clear_current ); + ObjectTypeDB::bind_method( _MD("is_current"),&Listener::is_current ); + ObjectTypeDB::bind_method( _MD("get_listener_transform"),&Listener::get_listener_transform ); +} + +Listener::Listener() { + + current=false; + force_change=false; + //active=false; +} + + +Listener::~Listener() { + +} + + diff --git a/scene/3d/listener.h b/scene/3d/listener.h new file mode 100644 index 00000000000..bf0281a8e08 --- /dev/null +++ b/scene/3d/listener.h @@ -0,0 +1,53 @@ +#ifndef LISTENER_H +#define LISTENER_H + + +#include "scene/3d/spatial.h" +#include "scene/main/viewport.h" + +class Listener : public Spatial { + + OBJ_TYPE(Listener, Spatial); +private: + + bool force_change; + bool current; + + RID scenario_id; + + virtual bool _can_gizmo_scale() const; + virtual RES _get_gizmo_geometry() const; + +friend class Viewport; + void _update_audio_listener_state(); +protected: + + void _update_listener(); + virtual void _request_listener_update(); + + bool _set(const StringName& p_name, const Variant& p_value); + bool _get(const StringName& p_name,Variant &r_ret) const; + void _get_property_list( List *p_list) const; + void _notification(int p_what); + + static void _bind_methods(); + +public: + + void make_current(); + void clear_current(); + bool is_current() const; + + virtual Transform get_listener_transform() const; + + void set_visible_layers(uint32_t p_layers); + uint32_t get_visible_layers() const; + + Vector get_frustum() const; + + Listener(); + ~Listener(); + +}; + +#endif diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 5017ae61ff6..3981e43818a 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -37,6 +37,7 @@ #include "servers/spatial_sound_2d_server.h" #include "scene/gui/control.h" #include "scene/3d/camera.h" +#include "scene/3d/listener.h" #include "scene/resources/mesh.h" #include "scene/3d/spatial_indexer.h" #include "scene/3d/collision_object.h" @@ -388,6 +389,19 @@ void Viewport::_notification(int p_what) { } break; case NOTIFICATION_READY: { #ifndef _3D_DISABLED + if (listeners.size() && !listener) { + Listener *first=NULL; + for(Set::Element *E=listeners.front();E;E=E->next()) { + + if (first==NULL || first->is_greater_than(E->get())) { + first=E->get(); + } + } + + if (first) + first->make_current(); + } + if (cameras.size() && !camera) { //there are cameras but no current camera, pick first in tree and make it current Camera *first=NULL; @@ -414,7 +428,7 @@ void Viewport::_notification(int p_what) { _vp_exit_tree(); VisualServer::get_singleton()->viewport_set_scenario(viewport,RID()); - SpatialSoundServer::get_singleton()->listener_set_space(listener,RID()); + SpatialSoundServer::get_singleton()->listener_set_space(internal_listener, RID()); VisualServer::get_singleton()->viewport_remove_canvas(viewport,current_canvas); if (contact_2d_debug.is_valid()) { VisualServer::get_singleton()->free(contact_2d_debug); @@ -740,10 +754,10 @@ Rect2 Viewport::get_rect() const { void Viewport::_update_listener() { - if (is_inside_tree() && audio_listener && camera && (!get_parent() || (get_parent()->cast_to() && get_parent()->cast_to()->is_visible()))) { - SpatialSoundServer::get_singleton()->listener_set_space(listener,find_world()->get_sound_space()); + if (is_inside_tree() && audio_listener && (camera || listener) && (!get_parent() || (get_parent()->cast_to() && get_parent()->cast_to()->is_visible()))) { + SpatialSoundServer::get_singleton()->listener_set_space(internal_listener, find_world()->get_sound_space()); } else { - SpatialSoundServer::get_singleton()->listener_set_space(listener,RID()); + SpatialSoundServer::get_singleton()->listener_set_space(internal_listener, RID()); } @@ -752,9 +766,9 @@ void Viewport::_update_listener() { void Viewport::_update_listener_2d() { if (is_inside_tree() && audio_listener && (!get_parent() || (get_parent()->cast_to() && get_parent()->cast_to()->is_visible()))) - SpatialSound2DServer::get_singleton()->listener_set_space(listener_2d,find_world_2d()->get_sound_space()); + SpatialSound2DServer::get_singleton()->listener_set_space(internal_listener_2d, find_world_2d()->get_sound_space()); else - SpatialSound2DServer::get_singleton()->listener_set_space(listener_2d,RID()); + SpatialSound2DServer::get_singleton()->listener_set_space(internal_listener_2d, RID()); } @@ -798,11 +812,11 @@ void Viewport::set_canvas_transform(const Matrix32& p_transform) { Matrix32 xform = (global_canvas_transform * canvas_transform).affine_inverse(); Size2 ss = get_visible_rect().size; - SpatialSound2DServer::get_singleton()->listener_set_transform(listener_2d,Matrix32(0,xform.xform(ss*0.5))); + SpatialSound2DServer::get_singleton()->listener_set_transform(internal_listener_2d, Matrix32(0, xform.xform(ss*0.5))); Vector2 ss2 = ss*xform.get_scale(); float panrange = MAX(ss2.x,ss2.y); - SpatialSound2DServer::get_singleton()->listener_set_param(listener_2d,SpatialSound2DServer::LISTENER_PARAM_PAN_RANGE,panrange); + SpatialSound2DServer::get_singleton()->listener_set_param(internal_listener_2d, SpatialSound2DServer::LISTENER_PARAM_PAN_RANGE, panrange); } @@ -823,11 +837,11 @@ void Viewport::_update_global_transform() { Matrix32 xform = (sxform * canvas_transform).affine_inverse(); Size2 ss = get_visible_rect().size; - SpatialSound2DServer::get_singleton()->listener_set_transform(listener_2d,Matrix32(0,xform.xform(ss*0.5))); + SpatialSound2DServer::get_singleton()->listener_set_transform(internal_listener_2d, Matrix32(0, xform.xform(ss*0.5))); Vector2 ss2 = ss*xform.get_scale(); float panrange = MAX(ss2.x,ss2.y); - SpatialSound2DServer::get_singleton()->listener_set_param(listener_2d,SpatialSound2DServer::LISTENER_PARAM_PAN_RANGE,panrange); + SpatialSound2DServer::get_singleton()->listener_set_param(internal_listener_2d, SpatialSound2DServer::LISTENER_PARAM_PAN_RANGE, panrange); } @@ -846,12 +860,75 @@ Matrix32 Viewport::get_global_canvas_transform() const{ return global_canvas_transform; } +void Viewport::_listener_transform_changed_notify() { + +#ifndef _3D_DISABLED + if (listener) + SpatialSoundServer::get_singleton()->listener_set_transform(internal_listener, listener->get_listener_transform()); +#endif +} + +void Viewport::_listener_set(Listener* p_listener) { + +#ifndef _3D_DISABLED + + if (listener == p_listener) + return; + + listener = p_listener; + + _update_listener(); + _listener_transform_changed_notify(); +#endif +} + +bool Viewport::_listener_add(Listener* p_listener) { + + listeners.insert(p_listener); + return listeners.size() == 1; +} + +void Viewport::_listener_remove(Listener* p_listener) { + + listeners.erase(p_listener); + if (listener == p_listener) { + listener = NULL; + } +} + +#ifndef _3D_DISABLED +void Viewport::_listener_make_next_current(Listener* p_exclude) { + + if (listeners.size() > 0) { + for (Set::Element *E = listeners.front(); E; E = E->next()) { + + if (p_exclude == E->get()) + continue; + if (!E->get()->is_inside_tree()) + continue; + if (listener != NULL) + return; + + E->get()->make_current(); + + } + } + else { + // Attempt to reset listener to the camera position + if (camera != NULL) { + _update_listener(); + _camera_transform_changed_notify(); + } + } +} +#endif void Viewport::_camera_transform_changed_notify() { #ifndef _3D_DISABLED - if (camera) - SpatialSoundServer::get_singleton()->listener_set_transform(listener,camera->get_camera_transform()); + // If there is an active listener in the scene, it takes priority over the camera + if (camera && !listener) + SpatialSoundServer::get_singleton()->listener_set_transform(internal_listener, camera->get_camera_transform()); #endif } @@ -1066,6 +1143,11 @@ Ref Viewport::find_world() const{ return Ref(); } +Listener* Viewport::get_listener() const { + + return listener; +} + Camera* Viewport::get_camera() const { return camera; @@ -2493,12 +2575,13 @@ Viewport::Viewport() { world_2d = Ref( memnew( World2D )); viewport = VisualServer::get_singleton()->viewport_create(); - listener=SpatialSoundServer::get_singleton()->listener_create(); + internal_listener = SpatialSoundServer::get_singleton()->listener_create(); audio_listener=false; - listener_2d=SpatialSound2DServer::get_singleton()->listener_create(); + internal_listener_2d = SpatialSound2DServer::get_singleton()->listener_create(); audio_listener_2d=false; transparent_bg=false; parent=NULL; + listener=NULL; camera=NULL; size_override=false; size_override_stretch=false; @@ -2546,8 +2629,8 @@ Viewport::Viewport() { Viewport::~Viewport() { VisualServer::get_singleton()->free( viewport ); - SpatialSoundServer::get_singleton()->free(listener); - SpatialSound2DServer::get_singleton()->free(listener_2d); + SpatialSoundServer::get_singleton()->free(internal_listener); + SpatialSound2DServer::get_singleton()->free(internal_listener_2d); if (render_target_texture.is_valid()) render_target_texture->vp=NULL; //so if used, will crash } diff --git a/scene/main/viewport.h b/scene/main/viewport.h index afabd499a97..00a9199b1f4 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -39,6 +39,7 @@ */ class Camera; +class Listener; class Control; class CanvasItem; class Panel; @@ -92,6 +93,9 @@ friend class RenderTargetTexture; Control *parent_control; Viewport *parent; + Listener *listener; + Set listeners; + Camera *camera; Set cameras; @@ -100,10 +104,10 @@ friend class RenderTargetTexture; RID current_canvas; bool audio_listener; - RID listener; + RID internal_listener; bool audio_listener_2d; - RID listener_2d; + RID internal_listener_2d; Matrix32 canvas_transform; Matrix32 global_canvas_transform; @@ -262,6 +266,13 @@ friend class Control; Control *_gui_get_focus_owner(); +friend class Listener; + void _listener_transform_changed_notify(); + void _listener_set(Listener* p_listener); + bool _listener_add(Listener* p_listener); //true if first + void _listener_remove(Listener* p_listener); + void _listener_make_next_current(Listener* p_exclude); + friend class Camera; void _camera_transform_changed_notify(); void _camera_set(Camera* p_camera); @@ -275,7 +286,7 @@ protected: static void _bind_methods(); public: - + Listener* get_listener() const; Camera* get_camera() const; void set_as_audio_listener(bool p_enable); diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp index 9930aa07f65..0e981e58518 100644 --- a/scene/register_scene_types.cpp +++ b/scene/register_scene_types.cpp @@ -190,6 +190,7 @@ #ifndef _3D_DISABLED #include "scene/3d/camera.h" +#include "scene/3d/listener.h" #include "scene/3d/interpolated_camera.h" #include "scene/3d/position_3d.h" @@ -380,6 +381,7 @@ void register_scene_types() { ObjectTypeDB::register_type(); ObjectTypeDB::register_virtual_type(); ObjectTypeDB::register_type(); + ObjectTypeDB::register_type(); ObjectTypeDB::register_type(); ObjectTypeDB::register_type(); ObjectTypeDB::register_type(); diff --git a/tools/editor/icons/icon_gizmo_listener.png b/tools/editor/icons/icon_gizmo_listener.png new file mode 100644 index 0000000000000000000000000000000000000000..b6267e779a7362eecde9f46fb43b0b34925981dc GIT binary patch literal 1698 zcmV;T23`4yP)07z(?7X|`3A?_9RIVDV1>|3+ZmyzG5uOI-1mEstIIy|wisO1D=b z;P2b`(<%Gg!@;5>xtOs}Na3QK$v$78xUewy+AB!(9T^!(*i%sgP9od!;`4>m#+87h z?F~Z6qs(Nn)Gb<^i|lMG7=V)}TEv6j*CPhwdmM+Z$$5B*&dI%Tnj&OoW$9BH^C38A^000_|3TbH;wOnpqH?9(7WZt?`6hr_( zRpk%x`T9}3EI%eIE0w%bvRwG=vm>B1Dn~_S2{oAvE60_<>4vt%0lmW!0mVi4LC>%vX2ZiEB$_@Vqx|2`Bqy6-wI)Pr zYEFVNhCLOp$Z}>(nh3x!Rs#BkOZS#8S&|z`O*MfK3Z+U8yZzE&f&hRhipahDw$OnC zKccD02BlJl)vF(zNeI~ufEx>e9!hDp&li#b0Hp*b(*(4%*s*Ty4qUl%b+DdDW8{jh zTi4*wp`RfLA||INrRcPZMgVz30S~uqGO3hXTfFREv(cy{03el0FnjiGFeT{l!TaC9 zWg zNym(wbPz&NS$Pl+hZ9zCWg1K2|TC4YtT7p@#?l2n+8jDt=f+&h; zYHC9yBEaeNpsUOCSCwQ~vEl*fbZWe}^DETVHDlsLBO(z2d3n<<05qc}aN@*IiPp44 zRd=@+?d>kq)i%T7=mO7kFdDTud)9&0){6)R! zX(;UBNWdk;YoFY@ZLLHQ1nk>;7*DTX41hos8N9uIP{M>s8A*fj#BmhiNCcEp^!4?l ztJ4j&S~=h2=^GURO-ibHt{@1gt!;+e(+f%oL@}BTx2Tnf1p32-5RNeh0MKe<;r03< zm&YI+j@Bx_KX7%l63D$?e^O&(8~pwNN=jBh6xrW8B!kYNmknGVO;ZY<=iu@5LZy+S1zyRTjzErEbBUKdD8GQxiTGAO-Pc!sjZ#x{KP(YIK&Dj!a#2Qe`c96j17ava|> zS^`&?Ck;^=jz#Y8VU}xZPeHIo!}53Pm=L zHV6?8M>s(cF=tK|8cv-XzXDTkVqs{uU7*AHa=T~Kp=$H)(bQe5x{X2`S~-^-yej*paEkHJw3gM zi_^l{7Yh73RmXE0&D-@Ed_3IZ6&VB!7qR4RO%tbhzJ#6L5?LT*1>iKZY14(*%l9f=7 z+H4)Dum24^KXm^J2E(w~I&h}Nj*2}s?qkPV9zA_x(+@YozmWt|iG;sZ6dBCs3Ak{f z6Wg{`AXcS7tXcua7*?&yj{@-=zTRJlQw_g&B`0Zf?Z1_IlG9&gW8Dj+nVE?V-_^W1 zMHHj6px5hzC^E=pQpCul0D#XwKZ=6~>tT#jKQ$#Sw(`|2-}DW)%ihQX@#oK9KJD}Q zr^w|p0F0^C@&WY-0DSy$4Ss31;r6WLsSEG7{C@9(cY@=+n$672OsuY~+LQuNGT;dS zcz@S^oNH_Ee7JDVU2B$S*cFBi3?sDRu4ePotZ@sJD&<4*@e?dO&vO6?+H4)?3i4C$ sDt&9UpO8nyo3#;30I2_K(jAHY2{u$|7p9>|RR91007*qoM6N<$g7M}TTmS$7 literal 0 HcmV?d00001 diff --git a/tools/editor/icons/icon_listener.png b/tools/editor/icons/icon_listener.png new file mode 100644 index 0000000000000000000000000000000000000000..1fa4cb4a9f4579f042b7f1f1c20e973c9f9eba89 GIT binary patch literal 449 zcmV;y0Y3hTP)tWb&=P1BoC^tp_e?<4Xq+ls<#ijYYnai0M0QYp zh|1-YTmaT~6fSb6h*e4kh1sfS?KyCpYZv+c7XVy39 r>W)&sF;n&WGR5LLsvr1%FIoBp$f{`Qjd=~g00000NkvXXu0mjfbjYxh literal 0 HcmV?d00001 diff --git a/tools/editor/spatial_editor_gizmos.cpp b/tools/editor/spatial_editor_gizmos.cpp index 3414e804826..934b6ccddeb 100644 --- a/tools/editor/spatial_editor_gizmos.cpp +++ b/tools/editor/spatial_editor_gizmos.cpp @@ -1024,6 +1024,28 @@ LightSpatialGizmo::LightSpatialGizmo(Light* p_light){ set_spatial_node(p_light); } +////// + +void ListenerSpatialGizmo::redraw() { + + clear(); + + add_unscaled_billboard(SpatialEditorGizmos::singleton->listener_icon, 0.05); + + add_mesh(SpatialEditorGizmos::singleton->listener_line_mesh); + Vector cursor_points; + cursor_points.push_back(Vector3(0, 0, 0)); + cursor_points.push_back(Vector3(0, 0, -1.0)); + add_collision_segments(cursor_points); + +} + +ListenerSpatialGizmo::ListenerSpatialGizmo(Listener* p_listener){ + + set_spatial_node(p_listener); + listener = p_listener; +} + ////// @@ -2907,6 +2929,12 @@ Ref SpatialEditorGizmos::get_gizmo(Spatial *p_spatial) { return lsg; } + if (p_spatial->cast_to()) { + + Ref misg = memnew(ListenerSpatialGizmo(p_spatial->cast_to())); + return misg; + } + if (p_spatial->cast_to()) { Ref lsg = memnew( CameraSpatialGizmo(p_spatial->cast_to()) ); @@ -3141,6 +3169,29 @@ SpatialEditorGizmos::SpatialEditorGizmos() { pos3d_mesh->surface_set_material(0,mat); } + listener_line_mesh = Ref(memnew(Mesh)); + { + + DVector cursor_points; + DVector cursor_colors; + cursor_points.push_back(Vector3(0, 0, 0)); + cursor_points.push_back(Vector3(0, 0, -1.0)); + cursor_colors.push_back(Color(0.5, 0.5, 0.5, 0.7)); + cursor_colors.push_back(Color(0.5, 0.5, 0.5, 0.7)); + + Ref mat = memnew(FixedMaterial); + mat->set_flag(Material::FLAG_UNSHADED, true); + mat->set_fixed_flag(FixedMaterial::FLAG_USE_COLOR_ARRAY, true); + mat->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true); + mat->set_line_width(3); + Array d; + d.resize(VS::ARRAY_MAX); + d[Mesh::ARRAY_VERTEX] = cursor_points; + d[Mesh::ARRAY_COLOR] = cursor_colors; + listener_line_mesh->add_surface(Mesh::PRIMITIVE_LINES, d); + listener_line_mesh->surface_set_material(0, mat); + } + sample_player_icon = Ref( memnew( FixedMaterial )); sample_player_icon->set_flag(Material::FLAG_UNSHADED, true); @@ -3173,6 +3224,14 @@ SpatialEditorGizmos::SpatialEditorGizmos() { visibility_notifier_icon->set_parameter(FixedMaterial::PARAM_DIFFUSE,Color(1,1,1,0.9)); visibility_notifier_icon->set_texture(FixedMaterial::PARAM_DIFFUSE,SpatialEditor::get_singleton()->get_icon("Visible","EditorIcons")); + listener_icon = Ref(memnew(FixedMaterial)); + listener_icon->set_flag(Material::FLAG_UNSHADED, true); + listener_icon->set_flag(Material::FLAG_DOUBLE_SIDED, true); + listener_icon->set_depth_draw_mode(Material::DEPTH_DRAW_NEVER); + listener_icon->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true); + listener_icon->set_parameter(FixedMaterial::PARAM_DIFFUSE, Color(1, 1, 1, 0.9)); + listener_icon->set_texture(FixedMaterial::PARAM_DIFFUSE, SpatialEditor::get_singleton()->get_icon("GizmoListener", "EditorIcons")); + { DVector vertices; diff --git a/tools/editor/spatial_editor_gizmos.h b/tools/editor/spatial_editor_gizmos.h index 0162bcbf79b..3d7272f5228 100644 --- a/tools/editor/spatial_editor_gizmos.h +++ b/tools/editor/spatial_editor_gizmos.h @@ -32,6 +32,7 @@ #include "tools/editor/plugins/spatial_editor_plugin.h" #include "scene/3d/light.h" +#include "scene/3d/listener.h" #include "scene/3d/camera.h" #include "scene/3d/position_3d.h" #include "scene/3d/spatial_sample_player.h" @@ -143,6 +144,19 @@ public: }; +class ListenerSpatialGizmo : public EditorSpatialGizmo { + + OBJ_TYPE(ListenerSpatialGizmo, EditorSpatialGizmo); + + Listener* listener; + +public: + + void redraw(); + ListenerSpatialGizmo(Listener* p_listener = NULL); + +}; + class CameraSpatialGizmo : public EditorSpatialGizmo { OBJ_TYPE(CameraSpatialGizmo,EditorSpatialGizmo); @@ -471,6 +485,7 @@ public: Ref navmesh_edge_material_disabled; Ref navmesh_solid_material_disabled; + Ref listener_icon; Ref sample_player_icon; Ref stream_player_icon; @@ -480,6 +495,7 @@ public: Ref handle_t; Ref pos3d_mesh; + Ref listener_line_mesh; static SpatialEditorGizmos *singleton; Ref test_cube_tm;