diff options
| author | Roxie Linden <roxie@lindenlab.com> | 2023-09-25 20:03:18 -0700 | 
|---|---|---|
| committer | Roxie Linden <roxie@lindenlab.com> | 2024-02-08 18:34:01 -0800 | 
| commit | 025e9dcc4d898a7a66c55040903f5d1f9a6d4d7f (patch) | |
| tree | ef7519d9d2eb3fc5bfaa9739c617f6d597cbe4c0 | |
| parent | 78228d4dc423478c153aeeab0d92acf9ce5de78b (diff) | |
send position and rotation data to voice server.
| -rw-r--r-- | indra/llmath/llquaternion.h | 1 | ||||
| -rw-r--r-- | indra/newview/llvoicewebrtc.cpp | 248 | ||||
| -rw-r--r-- | indra/newview/llvoicewebrtc.h | 4 | 
3 files changed, 46 insertions, 207 deletions
| diff --git a/indra/llmath/llquaternion.h b/indra/llmath/llquaternion.h index 51ce163b4e..609d75a095 100644 --- a/indra/llmath/llquaternion.h +++ b/indra/llmath/llquaternion.h @@ -132,6 +132,7 @@ public:  	friend LLQuaternion operator~(const LLQuaternion &a);							// Returns a* (Conjugate of a)  	bool operator==(const LLQuaternion &b) const;			// Returns a == b  	bool operator!=(const LLQuaternion &b) const;			// Returns a != b +    F64 operator[](int idx) const { return mQ[idx]; }  	friend const LLQuaternion& operator*=(LLQuaternion &a, const LLQuaternion &b);	// Returns a * b diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp index c22246d841..4c687b5807 100644 --- a/indra/newview/llvoicewebrtc.cpp +++ b/indra/newview/llvoicewebrtc.cpp @@ -746,7 +746,6 @@ bool LLWebRTCVoiceClient::callbackEndDaemon(const LLSD& data)      return false;  } -  bool LLWebRTCVoiceClient::provisionVoiceAccount()  {      LL_INFOS("Voice") << "Provisioning voice account." << LL_ENDL; @@ -2153,127 +2152,6 @@ void LLWebRTCVoiceClient::giveUp()  	cleanUp();  } -static void oldSDKTransform (LLVector3 &left, LLVector3 &up, LLVector3 &at, LLVector3d &pos, LLVector3 &vel) -{ -	F32 nat[3], nup[3], nl[3]; // the new at, up, left vectors and the  new position and velocity -//	F32 nvel[3];  -	F64 npos[3]; -	 -	// The original XML command was sent like this: -	/* -			<< "<Position>" -				<< "<X>" << pos[VX] << "</X>" -				<< "<Y>" << pos[VZ] << "</Y>" -				<< "<Z>" << pos[VY] << "</Z>" -			<< "</Position>" -			<< "<Velocity>" -				<< "<X>" << mAvatarVelocity[VX] << "</X>" -				<< "<Y>" << mAvatarVelocity[VZ] << "</Y>" -				<< "<Z>" << mAvatarVelocity[VY] << "</Z>" -			<< "</Velocity>" -			<< "<AtOrientation>" -				<< "<X>" << l.mV[VX] << "</X>" -				<< "<Y>" << u.mV[VX] << "</Y>" -				<< "<Z>" << a.mV[VX] << "</Z>" -			<< "</AtOrientation>" -			<< "<UpOrientation>" -				<< "<X>" << l.mV[VZ] << "</X>" -				<< "<Y>" << u.mV[VY] << "</Y>" -				<< "<Z>" << a.mV[VZ] << "</Z>" -			<< "</UpOrientation>" -			<< "<LeftOrientation>" -				<< "<X>" << l.mV [VY] << "</X>" -				<< "<Y>" << u.mV [VZ] << "</Y>" -				<< "<Z>" << a.mV [VY] << "</Z>" -			<< "</LeftOrientation>"; -	*/ - -#if 1 -	// This was the original transform done when building the XML command -	nat[0] = left.mV[VX]; -	nat[1] = up.mV[VX]; -	nat[2] = at.mV[VX]; - -	nup[0] = left.mV[VZ]; -	nup[1] = up.mV[VY]; -	nup[2] = at.mV[VZ]; - -	nl[0] = left.mV[VY]; -	nl[1] = up.mV[VZ]; -	nl[2] = at.mV[VY]; - -	npos[0] = pos.mdV[VX]; -	npos[1] = pos.mdV[VZ]; -	npos[2] = pos.mdV[VY]; - -//	nvel[0] = vel.mV[VX]; -//	nvel[1] = vel.mV[VZ]; -//	nvel[2] = vel.mV[VY]; - -	for(int i=0;i<3;++i) { -		at.mV[i] = nat[i]; -		up.mV[i] = nup[i]; -		left.mV[i] = nl[i]; -		pos.mdV[i] = npos[i]; -	} -	 -	// This was the original transform done in the SDK -	nat[0] = at.mV[2]; -	nat[1] = 0; // y component of at vector is always 0, this was up[2] -	nat[2] = -1 * left.mV[2]; - -	// We override whatever the application gives us -	nup[0] = 0; // x component of up vector is always 0 -	nup[1] = 1; // y component of up vector is always 1 -	nup[2] = 0; // z component of up vector is always 0 - -	nl[0] = at.mV[0]; -	nl[1] = 0;  // y component of left vector is always zero, this was up[0] -	nl[2] = -1 * left.mV[0]; - -	npos[2] = pos.mdV[2] * -1.0; -	npos[1] = pos.mdV[1]; -	npos[0] = pos.mdV[0]; - -	for(int i=0;i<3;++i) { -		at.mV[i] = nat[i]; -		up.mV[i] = nup[i]; -		left.mV[i] = nl[i]; -		pos.mdV[i] = npos[i]; -	} -#else -	// This is the compose of the two transforms (at least, that's what I'm trying for) -	nat[0] = at.mV[VX]; -	nat[1] = 0; // y component of at vector is always 0, this was up[2] -	nat[2] = -1 * up.mV[VZ]; - -	// We override whatever the application gives us -	nup[0] = 0; // x component of up vector is always 0 -	nup[1] = 1; // y component of up vector is always 1 -	nup[2] = 0; // z component of up vector is always 0 - -	nl[0] = left.mV[VX]; -	nl[1] = 0;  // y component of left vector is always zero, this was up[0] -	nl[2] = -1 * left.mV[VY]; - -	npos[0] = pos.mdV[VX]; -	npos[1] = pos.mdV[VZ]; -	npos[2] = pos.mdV[VY] * -1.0; - -	nvel[0] = vel.mV[VX]; -	nvel[1] = vel.mV[VZ]; -	nvel[2] = vel.mV[VY]; - -	for(int i=0;i<3;++i) { -		at.mV[i] = nat[i]; -		up.mV[i] = nup[i]; -		left.mV[i] = nl[i]; -		pos.mdV[i] = npos[i]; -	} -	 -#endif -} -  void LLWebRTCVoiceClient::setHidden(bool hidden)  {      mHidden = hidden; @@ -2291,82 +2169,39 @@ void LLWebRTCVoiceClient::setHidden(bool hidden)  void LLWebRTCVoiceClient::sendPositionAndVolumeUpdate(void)  {	 -	if (mSpatialCoordsDirty && inSpatialChannel()) -	{ -		LLVector3 l, u, a, vel; -		LLVector3d pos; - -		mSpatialCoordsDirty = false; -        LLMatrix3 avatarRot = mAvatarRot.getMatrix3(); -//		LL_DEBUGS("Voice") << "Sending speaker position " << mAvatarPosition << LL_ENDL; -		l = avatarRot.getLeftRow(); -		u = avatarRot.getUpRow(); -		a = avatarRot.getFwdRow(); - -        pos = mAvatarPosition; -		vel = mAvatarVelocity; - -		// SLIM SDK: the old SDK was doing a transform on the passed coordinates that the new one doesn't do anymore. -		// The old transform is replicated by this function. -		oldSDKTransform(l, u, a, pos, vel); +    if (mWebRTCDataInterface && mWebRTCAudioInterface) +    { +        Json::Value  root = Json::objectValue; -        if (mHidden) +        if (mSpatialCoordsDirty && inSpatialChannel())          { -            for (int i=0;i<3;++i) -            { -                pos.mdV[i] = VX_NULL_POSITION; -            } -        } - -		LLVector3d	earPosition; -		LLVector3	earVelocity; -		LLMatrix3	earRot; -		 -		switch(mEarLocation) -		{ -			case earLocCamera: -			default: -				earPosition = mCameraPosition; -				earVelocity = mCameraVelocity; -				earRot = mCameraRot; -			break; -			 -			case earLocAvatar: -				earPosition = mAvatarPosition; -				earVelocity = mAvatarVelocity; -				earRot = avatarRot; -			break; -			 -			case earLocMixed: -				earPosition = mAvatarPosition; -				earVelocity = mAvatarVelocity; -				earRot = mCameraRot; -			break; -		} +            root["sp"] = Json::objectValue; +            root["sp"]["x"] = (int)(mAvatarPosition[0]*100); +            root["sp"]["y"] = (int)(mAvatarPosition[1]*100); +            root["sp"]["z"] = (int)(mAvatarPosition[2]*100); +            root["sh"] = Json::objectValue; +            root["sh"]["x"] = (int)(mAvatarRot[0]*100); +            root["sh"]["y"] = (int)(mAvatarRot[1]*100); +            root["sh"]["z"] = (int)(mAvatarRot[2]*100); +            root["sh"]["w"] = (int)(mAvatarRot[3]*100); + +             +            root["lp"] = Json::objectValue; +            root["lp"]["x"] = (int)(mCameraPosition[0]*100); +            root["lp"]["y"] = (int)(mCameraPosition[1]*100); +            root["lp"]["z"] = (int)(mCameraPosition[2]*100); +            root["lh"] = Json::objectValue; +            root["lh"]["x"] = (int)(mCameraRot[0]*100); +            root["lh"]["y"] = (int)(mCameraRot[1]*100); +            root["lh"]["z"] = (int)(mCameraRot[2]*100); +            root["lh"]["w"] = (int)(mCameraRot[3]*100); -		l = earRot.getLeftRow(); -		u = earRot.getUpRow(); -		a = earRot.getFwdRow(); - -        pos = earPosition; -		vel = earVelocity; - -		 -		oldSDKTransform(l, u, a, pos, vel); -		 -        if (mHidden) -        { -            for (int i=0;i<3;++i) -            { -                pos.mdV[i] = VX_NULL_POSITION; -            } +            mSpatialCoordsDirty = false;          } -	} - -    if (mWebRTCDataInterface && mWebRTCAudioInterface) -    { +         +                  F32 audio_level = 0.0;  		if (!mMuteMic) @@ -2376,19 +2211,24 @@ void LLWebRTCVoiceClient::sendPositionAndVolumeUpdate(void)          uint32_t uint_audio_level = (uint32_t) (audio_level * 256);          if (uint_audio_level != mAudioLevel)          { -            Json::FastWriter writer; -            Json::Value  root;              root["p"]             = uint_audio_level; -            std::string json_data = writer.write(root); - -            mWebRTCDataInterface->sendData(json_data, false);              mAudioLevel                       = uint_audio_level;              participantStatePtr_t participant = findParticipantByID(gAgentID); -            if (participant)  -			{ +            if (participant) +            {                  participant->mPower = audio_level; -                participant->mIsSpeaking = participant->mPower > SPEAKING_AUDIO_LEVEL;   -			} +                participant->mIsSpeaking = participant->mPower > SPEAKING_AUDIO_LEVEL; +            } +        } +         +         +        if (root.size() > 0) +        { +             +            Json::FastWriter writer; +            std::string json_data = writer.write(root); +             +            mWebRTCDataInterface->sendData(json_data, false);          }      } @@ -4361,7 +4201,6 @@ void LLWebRTCVoiceClient::updatePosition(void)  	LLViewerRegion *region = gAgent.getRegion();  	if(region && isAgentAvatarValid())  	{ -		LLMatrix3 rot;  		LLVector3d pos;          LLQuaternion qrot; @@ -4369,13 +4208,12 @@ void LLWebRTCVoiceClient::updatePosition(void)  		// They're currently always set to zero.  		// Send the current camera position to the voice code -		rot.setRows(LLViewerCamera::getInstance()->getAtAxis(), LLViewerCamera::getInstance()->getLeftAxis (),  LLViewerCamera::getInstance()->getUpAxis());		  		pos = gAgent.getRegion()->getPosGlobalFromRegion(LLViewerCamera::getInstance()->getOrigin());  		LLWebRTCVoiceClient::getInstance()->setCameraPosition(  															 pos,				// position  															 LLVector3::zero, 	// velocity -															 rot);				// rotation matrix +                                                            LLViewerCamera::getInstance()->getQuaternion()); // rotation matrix  		// Send the current avatar position to the voice code          qrot = gAgentAvatarp->getRootJoint()->getWorldRotation(); @@ -4392,7 +4230,7 @@ void LLWebRTCVoiceClient::updatePosition(void)  	}  } -void LLWebRTCVoiceClient::setCameraPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot) +void LLWebRTCVoiceClient::setCameraPosition(const LLVector3d &position, const LLVector3 &velocity, const LLQuaternion &rot)  {  	mCameraRequestedPosition = position; diff --git a/indra/newview/llvoicewebrtc.h b/indra/newview/llvoicewebrtc.h index e3aa33bfd9..1d013c6609 100644 --- a/indra/newview/llvoicewebrtc.h +++ b/indra/newview/llvoicewebrtc.h @@ -521,7 +521,7 @@ protected:  	/////////////////////////////  	// Sending updates of current state  	void updatePosition(void); -	void setCameraPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot); +	void setCameraPosition(const LLVector3d &position, const LLVector3 &velocity, const LLQuaternion &rot);  	void setAvatarPosition(const LLVector3d &position, const LLVector3 &velocity, const LLQuaternion &rot);  	bool channelFromRegion(LLViewerRegion *region, std::string &name); @@ -823,7 +823,7 @@ private:  	LLVector3d	mCameraPosition;  	LLVector3d	mCameraRequestedPosition;  	LLVector3	mCameraVelocity; -	LLMatrix3	mCameraRot; +	LLQuaternion mCameraRot;  	LLVector3d	mAvatarPosition;  	LLVector3	mAvatarVelocity; | 
