From 617f0488834f97674a914b7e25a7d13d99146c95 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Tue, 22 Sep 2015 13:40:33 +0200 Subject: [PATCH] Added JS interface to change audio listening position / orientation in Interface - MyAvatar.audioListenerMode change using: MyAvatar.FROM_HEAD , MyAvatar.FROM_CAMERA , MyAvatar.CUSTOM - MyAvatar.customListenPosition and MyAvatar.customListenOrientation are for manual listening positions --- interface/src/Application.cpp | 2 ++ interface/src/Application.h | 4 +-- interface/src/avatar/MyAvatar.cpp | 35 +++++++++++++++++++++- interface/src/avatar/MyAvatar.h | 34 +++++++++++++++++++++ libraries/shared/src/RegisteredMetaTypes.h | 8 ++--- 5 files changed, 76 insertions(+), 7 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ee98ce4c25..84d66fc285 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4024,6 +4024,8 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri // hook our avatar and avatar hash map object into this script engine scriptEngine->registerGlobalObject("MyAvatar", _myAvatar); + qScriptRegisterMetaType(scriptEngine, maAudioListenModeToScriptValue, maAudioListenModeFromScriptValue); + scriptEngine->registerGlobalObject("AvatarList", DependencyManager::get().data()); scriptEngine->registerGlobalObject("Camera", &_myCamera); diff --git a/interface/src/Application.h b/interface/src/Application.h index 0a591bf500..5ea890fc2d 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -142,8 +142,8 @@ public: static Application* getInstance() { return qApp; } // TODO: replace fully by qApp static const glm::vec3& getPositionForPath() { return getInstance()->_myAvatar->getPosition(); } static glm::quat getOrientationForPath() { return getInstance()->_myAvatar->getOrientation(); } - static glm::vec3 getPositionForAudio() { return getInstance()->_myAvatar->getHead()->getPosition(); } - static glm::quat getOrientationForAudio() { return getInstance()->_myAvatar->getHead()->getFinalOrientationInWorldFrame(); } + static glm::vec3 getPositionForAudio() { return getInstance()->_myAvatar->getPositionForAudio(); } + static glm::quat getOrientationForAudio() { return getInstance()->_myAvatar->getOrientationForAudio(); } static void initPlugins(); static void shutdownPlugins(); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index ae483988e3..21b718e404 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -108,7 +108,8 @@ MyAvatar::MyAvatar(RigPointer rig) : _goToPosition(), _goToOrientation(), _rig(rig), - _prevShouldDrawHead(true) + _prevShouldDrawHead(true), + _audioListenerMode(FROM_HEAD) { for (int i = 0; i < MAX_DRIVE_KEYS; i++) { _driveKeys[i] = 0.0f; @@ -1806,3 +1807,35 @@ glm::mat4 MyAvatar::deriveBodyFromHMDSensor() const { // avatar facing is determined solely by hmd orientation. return createMatFromQuatAndPos(hmdOrientationYawOnly, bodyPos); } + +glm::vec3 MyAvatar::getPositionForAudio() { + switch (_audioListenerMode) { + case AudioListenerMode::FROM_HEAD: + return getHead()->getPosition(); + case AudioListenerMode::FROM_CAMERA: + return Application::getInstance()->getCamera()->getPosition(); + case AudioListenerMode::CUSTOM: + return _customListenPosition; + } + return vec3(); +} + +glm::quat MyAvatar::getOrientationForAudio() { + switch (_audioListenerMode) { + case AudioListenerMode::FROM_HEAD: + return getHead()->getFinalOrientationInWorldFrame(); + case AudioListenerMode::FROM_CAMERA: + return Application::getInstance()->getCamera()->getOrientation(); + case AudioListenerMode::CUSTOM: + return _customListenOrientation; + } + return quat(); +} + +QScriptValue maAudioListenModeToScriptValue(QScriptEngine* engine, const AudioListenerMode& audioListenerMode) { + return audioListenerMode; +} + +void maAudioListenModeFromScriptValue(const QScriptValue& object, AudioListenerMode& audioListenerMode) { + audioListenerMode = (AudioListenerMode)object.toUInt16(); +} diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 6989ea3969..3dfcde735b 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -26,6 +26,14 @@ enum eyeContactTarget { MOUTH }; +enum AudioListenerMode { + FROM_HEAD = 0, + FROM_CAMERA, + CUSTOM +}; +Q_DECLARE_METATYPE(AudioListenerMode); + + class MyAvatar : public Avatar { Q_OBJECT Q_PROPERTY(bool shouldRenderLocally READ getShouldRenderLocally WRITE setShouldRenderLocally) @@ -33,12 +41,21 @@ class MyAvatar : public Avatar { Q_PROPERTY(float motorTimescale READ getScriptedMotorTimescale WRITE setScriptedMotorTimescale) Q_PROPERTY(QString motorReferenceFrame READ getScriptedMotorFrame WRITE setScriptedMotorFrame) Q_PROPERTY(QString collisionSoundURL READ getCollisionSoundURL WRITE setCollisionSoundURL) + Q_PROPERTY(AudioListenerMode audioListenerMode READ getAudioListenerMode WRITE setAudioListenerMode) + Q_PROPERTY(glm::vec3 customListenPosition READ getCustomListenPosition WRITE setCustomListenPosition) + Q_PROPERTY(glm::quat customListenOrientation READ getCustomListenOrientation WRITE setCustomListenOrientation) + Q_PROPERTY(AudioListenerMode FROM_HEAD READ getAudioListenerModeHead) + Q_PROPERTY(AudioListenerMode FROM_CAMERA READ getAudioListenerModeCamera) + Q_PROPERTY(AudioListenerMode CUSTOM READ getAudioListenerModeCustom) //TODO: make gravity feature work Q_PROPERTY(glm::vec3 gravity READ getGravity WRITE setGravity) public: MyAvatar(RigPointer rig); ~MyAvatar(); + AudioListenerMode getAudioListenerModeHead() const { return FROM_HEAD; } + AudioListenerMode getAudioListenerModeCamera() const { return FROM_CAMERA; } + AudioListenerMode getAudioListenerModeCustom() const { return CUSTOM; } void reset(); void update(float deltaTime); @@ -153,6 +170,13 @@ public: void doUpdateBillboard(); void destroyAnimGraph(); + AudioListenerMode getAudioListenerMode() { return _audioListenerMode; } + void setAudioListenerMode(AudioListenerMode audioListenerMode) { _audioListenerMode = audioListenerMode; } + glm::vec3 getCustomListenPosition() { return _customListenPosition; } + void setCustomListenPosition(glm::vec3 customListenPosition) { _customListenPosition = customListenPosition; } + glm::quat getCustomListenOrientation() { return _customListenOrientation; } + void setCustomListenOrientation(glm::quat customListenOrientation) { _customListenOrientation = customListenOrientation; } + public slots: void increaseSize(); void decreaseSize(); @@ -200,6 +224,9 @@ public slots: void setEnableDebugDrawAnimPose(bool isEnabled); void setEnableMeshVisible(bool isEnabled); + glm::vec3 getPositionForAudio(); + glm::quat getOrientationForAudio(); + signals: void transformChanged(); void newCollisionSoundURL(const QUrl& url); @@ -325,6 +352,13 @@ private: bool _enableDebugDrawBindPose = false; bool _enableDebugDrawAnimPose = false; AnimSkeleton::ConstPointer _debugDrawSkeleton = nullptr; + + AudioListenerMode _audioListenerMode; + glm::vec3 _customListenPosition; + glm::quat _customListenOrientation; }; +QScriptValue maAudioListenModeToScriptValue(QScriptEngine* engine, const AudioListenerMode& audioListenerMode); +void maAudioListenModeFromScriptValue(const QScriptValue& object, AudioListenerMode& audioListenerMode); + #endif // hifi_MyAvatar_h diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index 31f1da8a40..c419741c3b 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -59,7 +59,7 @@ void qURLFromScriptValue(const QScriptValue& object, QUrl& url); QScriptValue qVectorVec3ToScriptValue(QScriptEngine* engine, const QVector& vector); void qVectorVec3FromScriptValue(const QScriptValue& array, QVector& vector); -QVector qVectorVec3FromScriptValue( const QScriptValue& array); +QVector qVectorVec3FromScriptValue(const QScriptValue& array); QScriptValue qVectorFloatToScriptValue(QScriptEngine* engine, const QVector& vector); void qVectorFloatFromScriptValue(const QScriptValue& array, QVector& vector); @@ -77,10 +77,10 @@ QScriptValue pickRayToScriptValue(QScriptEngine* engine, const PickRay& pickRay) void pickRayFromScriptValue(const QScriptValue& object, PickRay& pickRay); enum ContactEventType { - CONTACT_EVENT_TYPE_START, + CONTACT_EVENT_TYPE_START, CONTACT_EVENT_TYPE_CONTINUE, - CONTACT_EVENT_TYPE_END -}; + CONTACT_EVENT_TYPE_END +}; class Collision { public: