diff options
Diffstat (limited to 'indra')
30 files changed, 652 insertions, 964 deletions
| diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 2554ccdbe4..58c1186a3e 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -1274,28 +1274,6 @@ void LLGLSLShader::uniformMatrix4fv(U32 index, U32 count, GLboolean transpose, c      }  } -void LLGLSLShader::uniform1b(U32 index, GLboolean x) -{ -	if (mProgramObject > 0) -	{ -		if (mUniform.size() <= index) -		{ -			UNIFORM_ERRS << "Uniform index out of bounds." << LL_ENDL; -			return; -		} - -		if (mUniform[index] >= 0) -		{ -			std::map<GLint, LLVector4>::iterator iter = mValue.find(mUniform[index]); -			if (iter == mValue.end() || iter->second.mV[0] != x) -			{ -				glUniform1iARB(mUniform[index], x); -				mValue[mUniform[index]] = LLVector4(x, 0.f, 0.f, 0.f); -			} -		} -	} -} -  GLint LLGLSLShader::getUniformLocation(const LLStaticHashedString& uniform)  {      GLint ret = -1; diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h index 8663a5a5ff..0746e8760a 100644 --- a/indra/llrender/llglslshader.h +++ b/indra/llrender/llglslshader.h @@ -125,7 +125,6 @@ public:  	void uniform3fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v);  	void uniform4fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v);  	void uniformMatrix4fv(const LLStaticHashedString& uniform, U32 count, GLboolean transpose, const GLfloat *v); -	void uniform1b(U32 index, GLboolean b);  	void setMinimumAlpha(F32 minimum); diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index b5ed67f66a..69420dd0bb 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -1466,14 +1466,6 @@ U32 LLRender::getMatrixMode()  	return mMatrixMode;  } -void LLRender::setInverseTexCoordByY(bool v) -{ -	LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr; -	if (shader) -	{ -		shader->uniform1b(LLShaderMgr::INVERSE_TEX_Y, v); -	} -}  void LLRender::loadIdentity()  { diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index 4c3547f8e4..a67fb8da52 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -355,7 +355,6 @@ public:  	void multMatrix(const GLfloat* m);  	void matrixMode(U32 mode);	  	U32 getMatrixMode(); -	void setInverseTexCoordByY(bool v);  	const glh::matrix4f& getModelviewMatrix();  	const glh::matrix4f& getProjectionMatrix(); diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 7d857c6930..55f0791174 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -1190,7 +1190,6 @@ void LLShaderMgr::initAttribsAndUniforms()  	mReservedUniforms.push_back("origin");  	mReservedUniforms.push_back("display_gamma"); -	mReservedUniforms.push_back("invert_tex_y");  	llassert(mReservedUniforms.size() == END_RESERVED_UNIFORMS);  	std::set<std::string> dupe_check; diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 50b7c8b9d9..394b38f832 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -215,8 +215,7 @@ public:  		TERRAIN_ALPHARAMP,  		SHINY_ORIGIN, -		DISPLAY_GAMMA, -		INVERSE_TEX_Y, +DISPLAY_GAMMA,  		END_RESERVED_UNIFORMS  	} eGLSLReservedUniforms; diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp index be16ff7946..28a8a5886a 100644 --- a/indra/media_plugins/cef/media_plugin_cef.cpp +++ b/indra/media_plugins/cef/media_plugin_cef.cpp @@ -189,7 +189,7 @@ void MediaPluginCEF::onPageChangedCallback(unsigned char* pixels, int x, int y,  				mPopupH = height;  				mPopupW = width;  				mPopupX = x; -				mPopupY = y; +				mPopupY = mHeight - y - height;  			}  		}  		else @@ -526,7 +526,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)  				message.setValueU32("internalformat", GL_RGB);  				message.setValueU32("format", GL_BGRA);  				message.setValueU32("type", GL_UNSIGNED_BYTE); -				message.setValueBoolean("coords_opengl", false); +				message.setValueBoolean("coords_opengl", true);  				sendMessage(message);  			}  			else if (message_name == "set_user_data_path") diff --git a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp index 3852d10c44..c1e34b5c8f 100644 --- a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp +++ b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp @@ -1,30 +1,30 @@  /** - * @file media_plugin_libvlc.cpp - * @brief LibVLC plugin for LLMedia API plugin system - * - * @cond - * $LicenseInfo:firstyear=2008&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - * @endcond - */ +* @file media_plugin_libvlc.cpp +* @brief LibVLC plugin for LLMedia API plugin system +* +* @cond +* $LicenseInfo:firstyear=2008&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2010, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +* @endcond +*/  #include "linden_common.h" @@ -40,57 +40,78 @@  ////////////////////////////////////////////////////////////////////////////////  //  class MediaPluginLibVLC : -        public MediaPluginBase +	public MediaPluginBase  { -    public: -        MediaPluginLibVLC( LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data ); -        ~MediaPluginLibVLC(); +public: +	MediaPluginLibVLC(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data); +	~MediaPluginLibVLC(); -        /*virtual*/ void receiveMessage( const char* message_string ); +	/*virtual*/ void receiveMessage(const char* message_string); -    private: -        bool init(); +private: +	bool init(); -		void initVLC(); -		void playMedia(); -		void resetVLC(); +	void initVLC(); +	void playMedia(); +	void resetVLC(); +	void setVolume(const F64 volume); +	void updateTitle(const char* title); -		static void* lock(void* data, void** p_pixels); -		static void unlock(void* data, void* id, void* const* raw_pixels); -		static void display(void* data, void* id); +	static void* lock(void* data, void** p_pixels); +	static void unlock(void* data, void* id, void* const* raw_pixels); +	static void display(void* data, void* id); -		libvlc_instance_t* gLibVLC; -		libvlc_media_t* gLibVLCMedia; -		libvlc_media_player_t* gLibVLCMediaPlayer; +	/*virtual*/ void setDirty(int left, int top, int right, int bottom) override; -		struct gVLCContext -		{ -			unsigned char* texture_pixels; -			libvlc_media_player_t* mp; -			MediaPluginLibVLC* parent; -		}; -		struct gVLCContext gVLCCallbackContext; +	static void eventCallbacks(const libvlc_event_t* event, void* ptr); + +	libvlc_instance_t* mLibVLC; +	libvlc_media_t* mLibVLCMedia; +	libvlc_media_player_t* mLibVLCMediaPlayer; + +	struct mLibVLCContext +	{ +		unsigned char* texture_pixels; +		libvlc_media_player_t* mp; +		MediaPluginLibVLC* parent; +	}; +	struct mLibVLCContext mLibVLCCallbackContext; + +	std::string mURL; +	F64 mCurVolume; + +	bool mIsLooping; -		std::string mURL; +	float mCurTime; +	float mDuration;  };  ////////////////////////////////////////////////////////////////////////////////  // -MediaPluginLibVLC::MediaPluginLibVLC( LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data ) : -    MediaPluginBase( host_send_func, host_user_data ) +MediaPluginLibVLC::MediaPluginLibVLC(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data) : +MediaPluginBase(host_send_func, host_user_data)  {  	mTextureWidth = 0;  	mTextureHeight = 0; -    mWidth = 0; -    mHeight = 0; -    mDepth = 4; -    mPixels = 0; +	mWidth = 0; +	mHeight = 0; +	mDepth = 4; +	mPixels = 0; -	gLibVLC = 0; -	gLibVLCMedia = 0; -	gLibVLCMediaPlayer = 0; +	mLibVLC = 0; +	mLibVLCMedia = 0; +	mLibVLCMediaPlayer = 0; + +	mCurVolume = 0.0; + +	mIsLooping = false; + +	mCurTime = 0.0; +	mDuration = 0.0;  	mURL = std::string(); + +	setStatus(STATUS_NONE);  }  //////////////////////////////////////////////////////////////////////////////// @@ -103,7 +124,7 @@ MediaPluginLibVLC::~MediaPluginLibVLC()  //  void* MediaPluginLibVLC::lock(void* data, void** p_pixels)  { -	struct gVLCContext* context = (gVLCContext*)data; +	struct mLibVLCContext* context = (mLibVLCContext*)data;  	*p_pixels = context->texture_pixels; @@ -114,15 +135,16 @@ void* MediaPluginLibVLC::lock(void* data, void** p_pixels)  //  void MediaPluginLibVLC::unlock(void* data, void* id, void* const* raw_pixels)  { -	// nothing to do here for the moment. -	// we can modify the raw_pixels here if we want to. +	// nothing to do here for the moment +	// we *could* modify pixels here to, for example, Y flip, but this is done with +	// a VLC video filter transform.   }  ////////////////////////////////////////////////////////////////////////////////  //  void MediaPluginLibVLC::display(void* data, void* id)  { -	struct gVLCContext* context = (gVLCContext*)data; +	struct mLibVLCContext* context = (mLibVLCContext*)data;  	context->parent->setDirty(0, 0, context->parent->mWidth, context->parent->mHeight);  } @@ -134,12 +156,13 @@ void MediaPluginLibVLC::initVLC()  	char const* vlc_argv[] =  	{  		"--no-xlib", +		"--video-filter=transform{type=vflip}",  // MAINT-6578 Y flip textures in plugin vs client  	};  	int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv); -	gLibVLC = libvlc_new(vlc_argc, vlc_argv); +	mLibVLC = libvlc_new(vlc_argc, vlc_argv); -	if (!gLibVLC) +	if (!mLibVLC)  	{  		// for the moment, if this fails, the plugin will fail and   		// the media sub-system will tell the viewer something went wrong. @@ -150,9 +173,87 @@ void MediaPluginLibVLC::initVLC()  //  void MediaPluginLibVLC::resetVLC()  { -	libvlc_media_player_stop(gLibVLCMediaPlayer); -	libvlc_media_player_release(gLibVLCMediaPlayer); -	libvlc_release(gLibVLC); +	libvlc_media_player_stop(mLibVLCMediaPlayer); +	libvlc_media_player_release(mLibVLCMediaPlayer); +	libvlc_release(mLibVLC); +} + +//////////////////////////////////////////////////////////////////////////////// +// *virtual* +void MediaPluginLibVLC::setDirty(int left, int top, int right, int bottom) +{ +	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "updated"); + +	message.setValueS32("left", left); +	message.setValueS32("top", top); +	message.setValueS32("right", right); +	message.setValueS32("bottom", bottom); + +	message.setValueReal("current_time", mCurTime); +	message.setValueReal("duration", mDuration); +	message.setValueReal("current_rate", 1.0f); + +	sendMessage(message); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr) +{ +	MediaPluginLibVLC* parent = (MediaPluginLibVLC*)ptr; +	if (parent == 0) +	{ +		return; +	} + +	switch (event->type) +	{ +	case libvlc_MediaPlayerOpening: +		parent->setStatus(STATUS_LOADING); +		break; + +	case libvlc_MediaPlayerPlaying: +		parent->mDuration = (float)(libvlc_media_get_duration(parent->mLibVLCMedia)) / 1000.0f; +		parent->setStatus(STATUS_PLAYING); +		break; + +	case libvlc_MediaPlayerPaused: +		parent->setStatus(STATUS_PAUSED); +		break; + +	case libvlc_MediaPlayerStopped: +		parent->setStatus(STATUS_DONE); +		break; + +	case libvlc_MediaPlayerEndReached: +		parent->setStatus(STATUS_DONE); +		break; + +	case libvlc_MediaPlayerEncounteredError: +		parent->setStatus(STATUS_ERROR); +		break; + +	case libvlc_MediaPlayerTimeChanged: +		parent->mCurTime = (float)libvlc_media_player_get_time(parent->mLibVLCMediaPlayer) / 1000.0f; +		break; + +	case libvlc_MediaPlayerPositionChanged: +		break; + +	case libvlc_MediaPlayerLengthChanged: +		parent->mDuration = (float)libvlc_media_get_duration(parent->mLibVLCMedia) / 1000.0f; +		break; + +	case libvlc_MediaPlayerTitleChanged: +	{ +		char* title = libvlc_media_get_meta(parent->mLibVLCMedia, libvlc_meta_Title); +		if (title) +		{ +			parent->updateTitle(title); +		} +	} +	break; +	}  }  //////////////////////////////////////////////////////////////////////////////// @@ -164,58 +265,173 @@ void MediaPluginLibVLC::playMedia()  		return;  	} -	if (gLibVLCMediaPlayer) +	if (mLibVLCMediaPlayer) +	{ +		// stop listening to events while we reset things +		libvlc_event_manager_t* em = libvlc_media_player_event_manager(mLibVLCMediaPlayer); +		if (em) +		{ +			libvlc_event_detach(em, libvlc_MediaPlayerOpening, eventCallbacks, NULL); +			libvlc_event_detach(em, libvlc_MediaPlayerPlaying, eventCallbacks, NULL); +			libvlc_event_detach(em, libvlc_MediaPlayerPaused, eventCallbacks, NULL); +			libvlc_event_detach(em, libvlc_MediaPlayerStopped, eventCallbacks, NULL); +			libvlc_event_detach(em, libvlc_MediaPlayerEndReached, eventCallbacks, NULL); +			libvlc_event_detach(em, libvlc_MediaPlayerEncounteredError, eventCallbacks, NULL); +			libvlc_event_detach(em, libvlc_MediaPlayerTimeChanged, eventCallbacks, NULL); +			libvlc_event_detach(em, libvlc_MediaPlayerPositionChanged, eventCallbacks, NULL); +			libvlc_event_detach(em, libvlc_MediaPlayerLengthChanged, eventCallbacks, NULL); +			libvlc_event_detach(em, libvlc_MediaPlayerTitleChanged, eventCallbacks, NULL); +		}; + +		libvlc_media_player_stop(mLibVLCMediaPlayer); +		libvlc_media_player_release(mLibVLCMediaPlayer); + +		mLibVLCMediaPlayer = 0; +	} + +	if (mLibVLCMedia)  	{ -		libvlc_media_player_stop(gLibVLCMediaPlayer); -		libvlc_media_player_release(gLibVLCMediaPlayer); +		libvlc_media_release(mLibVLCMedia); + +		mLibVLCMedia = 0;  	} -	gLibVLCMedia = libvlc_media_new_location(gLibVLC, mURL.c_str()); -	if (!gLibVLCMedia) +	mLibVLCMedia = libvlc_media_new_location(mLibVLC, mURL.c_str()); +	if (!mLibVLCMedia)  	{ -		gLibVLCMediaPlayer = 0; +		mLibVLCMediaPlayer = 0; +		setStatus(STATUS_ERROR);  		return;  	} -	gLibVLCMediaPlayer = libvlc_media_player_new_from_media(gLibVLCMedia); -	if (!gLibVLCMediaPlayer) +	mLibVLCMediaPlayer = libvlc_media_player_new_from_media(mLibVLCMedia); +	if (!mLibVLCMediaPlayer)  	{ +		setStatus(STATUS_ERROR);  		return;  	} -	libvlc_media_release(gLibVLCMedia); +	// listen to events +	libvlc_event_manager_t* em = libvlc_media_player_event_manager(mLibVLCMediaPlayer); +	if (em) +	{ +		libvlc_event_attach(em, libvlc_MediaPlayerOpening, eventCallbacks, this); +		libvlc_event_attach(em, libvlc_MediaPlayerPlaying, eventCallbacks, this); +		libvlc_event_attach(em, libvlc_MediaPlayerPaused, eventCallbacks, this); +		libvlc_event_attach(em, libvlc_MediaPlayerStopped, eventCallbacks, this); +		libvlc_event_attach(em, libvlc_MediaPlayerEndReached, eventCallbacks, this); +		libvlc_event_attach(em, libvlc_MediaPlayerEncounteredError, eventCallbacks, this); +		libvlc_event_attach(em, libvlc_MediaPlayerTimeChanged, eventCallbacks, this); +		libvlc_event_attach(em, libvlc_MediaPlayerPositionChanged, eventCallbacks, this); +		libvlc_event_attach(em, libvlc_MediaPlayerLengthChanged, eventCallbacks, this); +		libvlc_event_attach(em, libvlc_MediaPlayerTitleChanged, eventCallbacks, this); +	} + +	mLibVLCCallbackContext.parent = this; +	mLibVLCCallbackContext.texture_pixels = mPixels; +	mLibVLCCallbackContext.mp = mLibVLCMediaPlayer; + +	// Send a "navigate begin" event. +	// This is really a browser message but the QuickTime plugin did it and  +	// the media system relies on this message to update internal state so we must send it too +	// Note: see "navigate_complete" message below too +	// https://jira.secondlife.com/browse/MAINT-6528 +	LLPluginMessage message_begin(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin"); +	message_begin.setValue("uri", mURL); +	message_begin.setValueBoolean("history_back_available", false); +	message_begin.setValueBoolean("history_forward_available", false); +	sendMessage(message_begin); + +	// volume level gets set before VLC is initialized (thanks media system) so we have to record +	// it in mCurVolume and set it again here so that volume levels are correctly initialized +	setVolume(mCurVolume); + +	setStatus(STATUS_LOADED); + +	libvlc_video_set_callbacks(mLibVLCMediaPlayer, lock, unlock, display, &mLibVLCCallbackContext); +	libvlc_video_set_format(mLibVLCMediaPlayer, "RV32", mWidth, mHeight, mWidth * mDepth); + +	// note this relies on the "set_loop" message arriving before the "start" (play) one +	// but that appears to always be the case +	if (mIsLooping) +	{ +		libvlc_media_add_option(mLibVLCMedia, "input-repeat=-1"); +	} -	gVLCCallbackContext.parent = this; -	gVLCCallbackContext.texture_pixels = mPixels; -	gVLCCallbackContext.mp = gLibVLCMediaPlayer; +	libvlc_media_player_play(mLibVLCMediaPlayer); + +	// send a "location_changed" message - this informs the media system +	// that a new URL is the 'current' one and is used extensively. +	// Again, this is really a browser message but we will use it here. +	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "location_changed"); +	message.setValue("uri", mURL); +	sendMessage(message); + +	// Send a "navigate complete" event. +	// This is really a browser message but the QuickTime plugin did it and  +	// the media system relies on this message to update internal state so we must send it too +	// Note: see "navigate_begin" message above too +	// https://jira.secondlife.com/browse/MAINT-6528 +	LLPluginMessage message_complete(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete"); +	message_complete.setValue("uri", mURL); +	message_complete.setValueS32("result_code", 200); +	message_complete.setValue("result_string", "OK"); +	sendMessage(message_complete); +} -	libvlc_video_set_callbacks(gLibVLCMediaPlayer, lock, unlock, display, &gVLCCallbackContext); -	libvlc_video_set_format(gLibVLCMediaPlayer, "RV32", mWidth, mHeight, mWidth * mDepth); -	libvlc_media_player_play(gLibVLCMediaPlayer); +//////////////////////////////////////////////////////////////////////////////// +// +void MediaPluginLibVLC::updateTitle(const char* title) +{ +	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text"); +	message.setValue("name", title); +	sendMessage(message);  }  ////////////////////////////////////////////////////////////////////////////////  // -void MediaPluginLibVLC::receiveMessage( const char* message_string ) +void MediaPluginLibVLC::setVolume(const F64 volume)  { -    LLPluginMessage message_in; - -    if(message_in.parse(message_string) >= 0) -    { -        std::string message_class = message_in.getClass(); -        std::string message_name = message_in.getName(); -        if(message_class == LLPLUGIN_MESSAGE_CLASS_BASE) -        { -            if(message_name == "init") -            { +	mCurVolume = volume; + +	if (mLibVLCMediaPlayer) +	{ +		int result = libvlc_audio_set_volume(mLibVLCMediaPlayer, (int)(volume * 100)); +		if (result != 0) +		{ +			// volume wasn't set but not much to be done here +		} +	} +	else +	{ +		// volume change was requested but VLC wasn't ready. +		// that's okay thought because we saved the value in mCurVolume and  +		// the next volume change after the VLC system is initilzied  will set it +	} +} + +//////////////////////////////////////////////////////////////////////////////// +// +void MediaPluginLibVLC::receiveMessage(const char* message_string) +{ +	LLPluginMessage message_in; + +	if (message_in.parse(message_string) >= 0) +	{ +		std::string message_class = message_in.getClass(); +		std::string message_name = message_in.getName(); +		if (message_class == LLPLUGIN_MESSAGE_CLASS_BASE) +		{ +			if (message_name == "init") +			{  				initVLC(); -                LLPluginMessage message("base", "init_response"); -                LLSD versions = LLSD::emptyMap(); -                versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION; -                versions[LLPLUGIN_MESSAGE_CLASS_MEDIA] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION; -                versions[LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER] = LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER_VERSION; -                message.setValueLLSD("versions", versions); +				LLPluginMessage message("base", "init_response"); +				LLSD versions = LLSD::emptyMap(); +				versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION; +				versions[LLPLUGIN_MESSAGE_CLASS_MEDIA] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION; +				versions[LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME] = LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME_VERSION; +				message.setValueLLSD("versions", versions);  				std::ostringstream s;  				s << "LibVLC plugin "; @@ -225,96 +441,96 @@ void MediaPluginLibVLC::receiveMessage( const char* message_string )  				s << ".";  				s << LIBVLC_VERSION_REVISION; -                message.setValue("plugin_version", s.str()); -                sendMessage(message); -            } -            else if(message_name == "idle") -            { -            } -            else if(message_name == "cleanup") -            { +				message.setValue("plugin_version", s.str()); +				sendMessage(message); +			} +			else if (message_name == "idle") +			{ +			} +			else if (message_name == "cleanup") +			{  				resetVLC(); -            } -            else if(message_name == "shm_added") -            { -                SharedSegmentInfo info; -                info.mAddress = message_in.getValuePointer("address"); -                info.mSize = (size_t)message_in.getValueS32("size"); -                std::string name = message_in.getValue("name"); - -                mSharedSegments.insert(SharedSegmentMap::value_type(name, info)); - -            } -            else if(message_name == "shm_remove") -            { -                std::string name = message_in.getValue("name"); - -                SharedSegmentMap::iterator iter = mSharedSegments.find(name); -                if(iter != mSharedSegments.end()) -                { -                    if(mPixels == iter->second.mAddress) -                    { -						libvlc_media_player_stop(gLibVLCMediaPlayer); -						libvlc_media_player_release(gLibVLCMediaPlayer); -						gLibVLCMediaPlayer = 0; - -                        mPixels = NULL; -                        mTextureSegmentName.clear(); -                    } -                    mSharedSegments.erase(iter); -                } -                else -                { +			} +			else if (message_name == "shm_added") +			{ +				SharedSegmentInfo info; +				info.mAddress = message_in.getValuePointer("address"); +				info.mSize = (size_t)message_in.getValueS32("size"); +				std::string name = message_in.getValue("name"); + +				mSharedSegments.insert(SharedSegmentMap::value_type(name, info)); + +			} +			else if (message_name == "shm_remove") +			{ +				std::string name = message_in.getValue("name"); + +				SharedSegmentMap::iterator iter = mSharedSegments.find(name); +				if (iter != mSharedSegments.end()) +				{ +					if (mPixels == iter->second.mAddress) +					{ +						libvlc_media_player_stop(mLibVLCMediaPlayer); +						libvlc_media_player_release(mLibVLCMediaPlayer); +						mLibVLCMediaPlayer = 0; + +						mPixels = NULL; +						mTextureSegmentName.clear(); +					} +					mSharedSegments.erase(iter); +				} +				else +				{  					//std::cerr << "MediaPluginWebKit::receiveMessage: unknown shared memory region!" << std::endl; -                } - -                // Send the response so it can be cleaned up. -                LLPluginMessage message("base", "shm_remove_response"); -                message.setValue("name", name); -                sendMessage(message); -            } -            else -            { +				} + +				// Send the response so it can be cleaned up. +				LLPluginMessage message("base", "shm_remove_response"); +				message.setValue("name", name); +				sendMessage(message); +			} +			else +			{  				//std::cerr << "MediaPluginWebKit::receiveMessage: unknown base message: " << message_name << std::endl; -            } -        } -        else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA) -        { -            if(message_name == "init") -            { -                LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params"); -                message.setValueS32("default_width", 1024); -                message.setValueS32("default_height", 1024); -                message.setValueS32("depth", mDepth); +			} +		} +		else if (message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA) +		{ +			if (message_name == "init") +			{ +				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params"); +				message.setValueS32("default_width", 1024); +				message.setValueS32("default_height", 1024); +				message.setValueS32("depth", mDepth);  				message.setValueU32("internalformat", GL_RGB); -                message.setValueU32("format", GL_BGRA_EXT); -                message.setValueU32("type", GL_UNSIGNED_BYTE); -                message.setValueBoolean("coords_opengl", false); -                sendMessage(message); -            } -            else if(message_name == "size_change") -            { -                std::string name = message_in.getValue("name"); -                S32 width = message_in.getValueS32("width"); -                S32 height = message_in.getValueS32("height"); -                S32 texture_width = message_in.getValueS32("texture_width"); -                S32 texture_height = message_in.getValueS32("texture_height"); - -                if(!name.empty()) -                { -                    // Find the shared memory region with this name -                    SharedSegmentMap::iterator iter = mSharedSegments.find(name); -                    if(iter != mSharedSegments.end()) -                    { -                        mPixels = (unsigned char*)iter->second.mAddress; -                        mWidth = width; -                        mHeight = height; -                        mTextureWidth = texture_width; -                        mTextureHeight = texture_height; +				message.setValueU32("format", GL_BGRA_EXT); +				message.setValueU32("type", GL_UNSIGNED_BYTE); +				message.setValueBoolean("coords_opengl", true); +				sendMessage(message); +			} +			else if (message_name == "size_change") +			{ +				std::string name = message_in.getValue("name"); +				S32 width = message_in.getValueS32("width"); +				S32 height = message_in.getValueS32("height"); +				S32 texture_width = message_in.getValueS32("texture_width"); +				S32 texture_height = message_in.getValueS32("texture_height"); + +				if (!name.empty()) +				{ +					// Find the shared memory region with this name +					SharedSegmentMap::iterator iter = mSharedSegments.find(name); +					if (iter != mSharedSegments.end()) +					{ +						mPixels = (unsigned char*)iter->second.mAddress; +						mWidth = width; +						mHeight = height; +						mTextureWidth = texture_width; +						mTextureHeight = texture_height;  						playMedia();  					}; -                }; +				};  				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response");  				message.setValue("name", name); @@ -323,76 +539,80 @@ void MediaPluginLibVLC::receiveMessage( const char* message_string )  				message.setValueS32("texture_width", texture_width);  				message.setValueS32("texture_height", texture_height);  				sendMessage(message); -            } -            else if(message_name == "load_uri") -            { +			} +			else if (message_name == "load_uri") +			{  				mURL = message_in.getValue("uri");  				playMedia(); -            } -        } -		else  -		if (message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME) -		{ -			if (message_name == "stop") +			} +		} +		else +			if (message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)  			{ -				if (gLibVLCMediaPlayer) +				if (message_name == "stop")  				{ -					libvlc_media_player_stop(gLibVLCMediaPlayer); +					if (mLibVLCMediaPlayer) +					{ +						libvlc_media_player_stop(mLibVLCMediaPlayer); +					}  				} -			} -			else if (message_name == "start") -			{ -				if (gLibVLCMediaPlayer) +				else if (message_name == "start")  				{ -					libvlc_media_player_play(gLibVLCMediaPlayer); +					if (mLibVLCMediaPlayer) +					{ +						libvlc_media_player_play(mLibVLCMediaPlayer); +					}  				} -			} -			else if (message_name == "pause") -			{ -				if (gLibVLCMediaPlayer) +				else if (message_name == "pause")  				{ -					libvlc_media_player_pause(gLibVLCMediaPlayer); +					if (mLibVLCMediaPlayer) +					{ +						libvlc_media_player_pause(mLibVLCMediaPlayer); +					}  				} -			} -			else if (message_name == "seek") -			{ -			} -			else if (message_name == "set_loop") -			{ -			} -			else if (message_name == "set_volume") -			{ -				if (gLibVLCMediaPlayer) +				else if (message_name == "seek") +				{ +					if (mDuration > 0) +					{ +						F64 normalized_offset = message_in.getValueReal("time") / mDuration; +						libvlc_media_player_set_position(mLibVLCMediaPlayer, normalized_offset); +					} +				} +				else if (message_name == "set_loop")  				{ +					mIsLooping = true; +				} +				else if (message_name == "set_volume") +				{ +					// volume comes in 0 -> 1.0  					F64 volume = message_in.getValueReal("volume"); -					libvlc_audio_set_volume(gLibVLCMediaPlayer, (int)(volume * 100)); +					setVolume(volume);  				}  			} -		} -    } +	}  }  ////////////////////////////////////////////////////////////////////////////////  //  bool MediaPluginLibVLC::init()  { -    LLPluginMessage message( LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text" ); -    message.setValue( "name", "LibVLC Plugin" ); -    sendMessage( message ); +	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text"); +	message.setValue("name", "LibVLC Plugin"); +	sendMessage(message); -    return true; +	return true;  };  ////////////////////////////////////////////////////////////////////////////////  // -int init_media_plugin( LLPluginInstance::sendMessageFunction host_send_func, -                        void* host_user_data, -                        LLPluginInstance::sendMessageFunction *plugin_send_func, -                        void **plugin_user_data ) +int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, +	void* host_user_data, +	LLPluginInstance::sendMessageFunction *plugin_send_func, +	void **plugin_user_data)  { -    MediaPluginLibVLC* self = new MediaPluginLibVLC( host_send_func, host_user_data ); -    *plugin_send_func = MediaPluginLibVLC::staticReceiveMessage; -    *plugin_user_data = ( void* )self; +	MediaPluginLibVLC* self = new MediaPluginLibVLC(host_send_func, host_user_data); +	*plugin_send_func = MediaPluginLibVLC::staticReceiveMessage; +	*plugin_user_data = (void*)self; -    return 0; +	return 0;  } diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp index 6d4c6ca43d..893fb738ce 100755 --- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp +++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp @@ -311,9 +311,7 @@ private:  			MatrixRecord transform;  			SetIdentityMatrix( &transform );	// transforms are additive so start from identify matrix  			double scaleX = (double) mWidth / mNaturalWidth; - -            // 2016-05-31 CP remove local flip (via -1.0) since texture coods for media on a prim are now flipped for VLC/CEF -			double scaleY = 1.0 * (double) mHeight / mNaturalHeight; +			double scaleY = -1.0 * (double) mHeight / mNaturalHeight;  			double centerX = mWidth / 2.0;  			double centerY = mHeight / 2.0;  			ScaleMatrix( &transform, X2Fix( scaleX ), X2Fix( scaleY ), X2Fix( centerX ), X2Fix( centerY ) ); diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index d13e837c8e..43beb4001b 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -4.0.6 +4.0.7 diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl index 7e83389f6e..3c026796c8 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl @@ -26,13 +26,6 @@  uniform mat3 normal_matrix;  uniform mat4 texture_matrix0;  uniform mat4 modelview_projection_matrix; -uniform bool invert_tex_y = false; -const mat4 invTexM = mat4( -  1, 0, 0, 0, -  0,-1, 0, 0, -  0, 0, 1, 0, -  0, 0, 0, 1 -);   ATTRIBUTE vec3 position;  ATTRIBUTE vec4 diffuse_color; @@ -51,10 +44,6 @@ void main()  	//transform vertex  	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);   	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; -  if(invert_tex_y)  -	{ -		vary_texcoord0 = vec2(invTexM * vec4(vary_texcoord0,0,1)).xy; -	}  	passTextureIndex();  	vary_normal = normalize(normal_matrix * normal); diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl index 2595712882..8e899e3e0f 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl @@ -26,13 +26,6 @@  uniform mat4 texture_matrix0;  uniform mat4 modelview_matrix;  uniform mat4 modelview_projection_matrix; -uniform bool invert_tex_y = false; -const mat4 invTexM = mat4( -  1, 0, 0, 0, -  0,-1, 0, 0, -  0, 0, 1, 0, -  0, 0, 0, 1 -);  ATTRIBUTE vec3 position; @@ -69,10 +62,6 @@ void main()  #endif  	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; -  if(invert_tex_y)  -	{ -		vary_texcoord0 = vec2(invTexM * vec4(vary_texcoord0,0,1)).xy; -	}  	calcAtmospherics(pos.xyz); diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl index a8efcd9857..fc20d3270e 100644 --- a/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl @@ -26,14 +26,6 @@  uniform mat4 texture_matrix0;  uniform mat4 modelview_matrix;  uniform mat4 modelview_projection_matrix; - -uniform bool invert_tex_y = false; -const mat4 invTexM = mat4( -  1, 0, 0, 0, -  0,-1, 0, 0, -  0, 0, 1, 0, -  0, 0, 0, 1 -);  ATTRIBUTE vec3 position;  void passTextureIndex(); @@ -57,11 +49,6 @@ void main()  	vec4 pos = (modelview_matrix * vert);  	gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);  	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; -   -  if(invert_tex_y)  -	{ -		vary_texcoord0 = vec2(invTexM * vec4(vary_texcoord0,0,1)).xy; -	}  	calcAtmospherics(pos.xyz); diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl index c744dc1397..37a20383e2 100644 --- a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl @@ -27,13 +27,6 @@ uniform mat3 normal_matrix;  uniform mat4 texture_matrix0;  uniform mat4 modelview_matrix;  uniform mat4 modelview_projection_matrix; -uniform bool invert_tex_y = false; -const mat4 invTexM = mat4( -  1, 0, 0, 0, -  0,-1, 0, 0, -  0, 0, 1, 0, -  0, 0, 0, 1 -);   ATTRIBUTE vec3 position;  void passTextureIndex(); @@ -58,10 +51,7 @@ void main()  	gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);  	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0, 0, 1)).xy; -	if(invert_tex_y)  -	{ -		vary_texcoord0 = vec2(invTexM * vec4(vary_texcoord0,0,1)).xy; -	} +	  	vec3 norm = normalize(normal_matrix * normal); diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp index a6cf917cbd..f74164aea6 100644 --- a/indra/newview/lldrawpool.cpp +++ b/indra/newview/lldrawpool.cpp @@ -473,10 +473,6 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL ba  				if (params.mTextureList[i].notNull())  				{  					gGL.getTexUnit(i)->bind(params.mTextureList[i], TRUE); -					if (LLViewerTexture::MEDIA_TEXTURE == params.mTextureList[i]->getType()) -					{ -						gGL.setInverseTexCoordByY(true); -					}  				}  			}  		} @@ -486,54 +482,13 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL ba  			{  				params.mTexture->addTextureStats(params.mVSize);  				gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ; - -				if (!gPipeline.mVertexShadersEnabled) -				{ -					if (LLViewerTexture::MEDIA_TEXTURE == params.mTexture->getType() && !params.mTextureMatrix) -					{ -						static const float fIdntInvY[] = { -							1, 0, 0, 0, -							0, -1, 0, 0, -							0, 0, 1, 0, -							0, 0, 0, 1 -						}; - -						gGL.getTexUnit(0)->activate(); -						gGL.matrixMode(LLRender::MM_TEXTURE); -						gGL.loadMatrix((GLfloat*)fIdntInvY); -						gPipeline.mTextureMatrixOps++; - -						tex_setup = true; -					} -				} -				else -				{ -					gGL.setInverseTexCoordByY(LLViewerTexture::MEDIA_TEXTURE == params.mTexture->getType()); -				} -  				if (params.mTextureMatrix)  				{  					tex_setup = true;  					gGL.getTexUnit(0)->activate();  					gGL.matrixMode(LLRender::MM_TEXTURE);  					gGL.loadMatrix((GLfloat*) params.mTextureMatrix->mMatrix); - -					if (LLViewerTexture::MEDIA_TEXTURE == params.mTexture->getType() && !gPipeline.mVertexShadersEnabled) -					{ -						static const float fIdntInvY[] = { -							1, 0, 0, 0, -							0, -1, 0, 0, -							0, 0, 1, 0, -							0, 0, 0, 1 -						}; - -						gGL.multMatrix(fIdntInvY); -						gPipeline.mMatrixOpCount++; -					} -  					gPipeline.mTextureMatrixOps++; - -					tex_setup = true;  				}  			}  			else diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp index c039b3b8f4..adb3322759 100644 --- a/indra/newview/llfloaterwebcontent.cpp +++ b/indra/newview/llfloaterwebcontent.cpp @@ -82,7 +82,7 @@ LLFloaterWebContent::LLFloaterWebContent( const Params& params )  	mCommitCallbackRegistrar.add( "WebContent.Stop", boost::bind( &LLFloaterWebContent::onClickStop, this ));  	mCommitCallbackRegistrar.add( "WebContent.EnterAddress", boost::bind( &LLFloaterWebContent::onEnterAddress, this ));  	mCommitCallbackRegistrar.add( "WebContent.PopExternal", boost::bind(&LLFloaterWebContent::onPopExternal, this)); -	mCommitCallbackRegistrar.add( "WebContent.TestVideo", boost::bind(&LLFloaterWebContent::onTestVideo, this, _2)); +	mCommitCallbackRegistrar.add( "WebContent.TestURL", boost::bind(&LLFloaterWebContent::onTestURL, this, _2));  }  BOOL LLFloaterWebContent::postBuild() @@ -111,6 +111,9 @@ BOOL LLFloaterWebContent::postBuild()  	// initialize the URL history using the system URL History manager  	initializeURLHistory(); +	// if "Develop" Menu open, sety a flag and change things to be more useful for devs +	mDevelopMode = gSavedSettings.getBOOL("QAMode"); +  	return TRUE;  } @@ -196,8 +199,6 @@ void LLFloaterWebContent::geometryChanged(S32 x, S32 y, S32 width, S32 height)  						width + getRect().getWidth() - browser_rect.getWidth(),   						height + getRect().getHeight() - browser_rect.getHeight()); -	LL_DEBUGS() << "geometry change: " << geom << LL_ENDL; -	  	LLRect new_rect;  	getParent()->screenRectToLocal(geom, &new_rect);  	setShape(new_rect);	 @@ -206,8 +207,6 @@ void LLFloaterWebContent::geometryChanged(S32 x, S32 y, S32 width, S32 height)  // static  void LLFloaterWebContent::preCreate(LLFloaterWebContent::Params& p)  { -	LL_DEBUGS() << "url = " << p.url() << ", target = " << p.target() << ", uuid = " << p.id() << LL_ENDL; -  	if (!p.id.isProvided())  	{  		p.id = LLUUID::generateNewID().asString(); @@ -225,12 +224,6 @@ void LLFloaterWebContent::preCreate(LLFloaterWebContent::Params& p)  		// and close the least recently opened one if this will put us over the limit.  		LLFloaterReg::const_instance_list_t &instances = LLFloaterReg::getFloaterList(p.window_class); -		LL_DEBUGS() << "total instance count is " << instances.size() << LL_ENDL; - -		for(LLFloaterReg::const_instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); iter++) -		{ -			LL_DEBUGS() << "    " << (*iter)->getKey()["target"] << LL_ENDL; -		}	  		if(instances.size() >= (size_t)browser_window_limit)  		{ @@ -242,7 +235,6 @@ void LLFloaterWebContent::preCreate(LLFloaterWebContent::Params& p)  void LLFloaterWebContent::open_media(const Params& p)  { -	// Specifying a mime type of text/html here causes the plugin system to skip the MIME type probe and just open a browser plugin.  	LLViewerMedia::proxyWindowOpened(p.target(), p.id());  	mWebBrowser->setHomePageUrl(p.url);  	mWebBrowser->setTarget(p.target); @@ -252,6 +244,10 @@ void LLFloaterWebContent::open_media(const Params& p)  	getChild<LLLayoutPanel>("status_bar")->setVisible(p.show_chrome);  	getChild<LLLayoutPanel>("nav_controls")->setVisible(p.show_chrome); + +	// turn additional debug controls on but only for Develop mode (Develop menu open) +	getChild<LLLayoutPanel>("debug_controls")->setVisible(mDevelopMode); +  	bool address_entry_enabled = p.allow_address_entry && !p.trusted_content;      mAllowNavigation = p.allow_back_forward_navigation;  	getChildView("address")->setEnabled(address_entry_enabled); @@ -516,7 +512,7 @@ void LLFloaterWebContent::onPopExternal()  	};  } -void LLFloaterWebContent::onTestVideo(std::string url) +void LLFloaterWebContent::onTestURL(std::string url)  {  	LLStringUtil::trim(url);  	if (url.length() > 0) diff --git a/indra/newview/llfloaterwebcontent.h b/indra/newview/llfloaterwebcontent.h index 519b575b38..1157d0aab8 100644 --- a/indra/newview/llfloaterwebcontent.h +++ b/indra/newview/llfloaterwebcontent.h @@ -92,7 +92,7 @@ protected:  	void onClickStop();  	void onEnterAddress();  	void onPopExternal(); -	void onTestVideo(std::string url); +	void onTestURL(std::string url);  	static void preCreate(Params& p);  	void open_media(const Params& ); @@ -114,6 +114,7 @@ protected:  	std::string		mUUID;  	bool			mShowPageTitle;      bool            mAllowNavigation; +	bool			mDevelopMode;  };  #endif  // LL_LLFLOATERWEBCONTENT_H diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index cada2d7cf2..9a33e210ff 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -2726,24 +2726,13 @@ void LLInventoryModel::registerCallbacks(LLMessageSystem* msg)  	msg->setHandlerFuncFast(_PREHASH_RemoveInventoryObjects,  							processRemoveInventoryObjects,  							NULL);	 -	//msg->setHandlerFuncFast(_PREHASH_ExchangeCallingCard, -	//						processExchangeCallingcard, -	//						NULL); -	//msg->setHandlerFuncFast(_PREHASH_AddCallingCard, -	//					processAddCallingcard, -	//					NULL); -	//msg->setHandlerFuncFast(_PREHASH_DeclineCallingCard, -	//					processDeclineCallingcard, -	//					NULL);  	msg->setHandlerFuncFast(_PREHASH_SaveAssetIntoInventory,  						processSaveAssetIntoInventory,  						NULL);  	msg->setHandlerFuncFast(_PREHASH_BulkUpdateInventory,  							processBulkUpdateInventory,  							NULL); -	msg->setHandlerFunc("InventoryDescendents", processInventoryDescendents);  	msg->setHandlerFunc("MoveInventoryItem", processMoveInventoryItem); -	msg->setHandlerFunc("FetchInventoryReply", processFetchInventoryReply);  } @@ -2763,14 +2752,6 @@ void LLInventoryModel::processUpdateCreateInventoryItem(LLMessageSystem* msg, vo  } -// static -void LLInventoryModel::processFetchInventoryReply(LLMessageSystem* msg, void**) -{ -	// no accounting -	gInventory.messageUpdateCore(msg, false); -} - -  bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account, U32 mask)  {  	//make sure our added inventory observer is active @@ -3213,85 +3194,6 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)  		InventoryCallbackInfo cbinfo = (*inv_it);  		gInventoryCallbacks.fire(cbinfo.mCallback, cbinfo.mInvID);  	} - -	//gInventory.validate(); - -	// Don't show the inventory.  We used to call showAgentInventory here. -	//LLFloaterInventory* view = LLFloaterInventory::getActiveInventory(); -	//if(view) -	//{ -	//	const BOOL take_keyboard_focus = FALSE; -	//	view->setSelection(category.getUUID(), take_keyboard_focus ); -	//	LLView* focus_view = gFocusMgr.getKeyboardFocus(); -	//	LLFocusMgr::FocusLostCallback callback = gFocusMgr.getFocusCallback(); -	//	// HACK to open inventory offers that are accepted.  This information -	//	// really needs to flow through the instant messages and inventory -	//	// transfer/update messages. -	//	if (LLFloaterInventory::sOpenNextNewItem) -	//	{ -	//		view->openSelected(); -	//		LLFloaterInventory::sOpenNextNewItem = FALSE; -	//	} -	// -	//	// restore keyboard focus -	//	gFocusMgr.setKeyboardFocus(focus_view); -	//} -} - -// static -void LLInventoryModel::processInventoryDescendents(LLMessageSystem* msg,void**) -{ -	LLUUID agent_id; -	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); -	if(agent_id != gAgent.getID()) -	{ -		LL_WARNS() << "Got a UpdateInventoryItem for the wrong agent." << LL_ENDL; -		return; -	} -	LLUUID parent_id; -	msg->getUUID("AgentData", "FolderID", parent_id); -	LLUUID owner_id; -	msg->getUUID("AgentData", "OwnerID", owner_id); -	S32 version; -	msg->getS32("AgentData", "Version", version); -	S32 descendents; -	msg->getS32("AgentData", "Descendents", descendents); - -	S32 i; -	S32 count = msg->getNumberOfBlocksFast(_PREHASH_FolderData); -	LLPointer<LLViewerInventoryCategory> tcategory = new LLViewerInventoryCategory(owner_id); -	for(i = 0; i < count; ++i) -	{ -		tcategory->unpackMessage(msg, _PREHASH_FolderData, i); -		gInventory.updateCategory(tcategory); -	} - -	count = msg->getNumberOfBlocksFast(_PREHASH_ItemData); -	LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; -	for(i = 0; i < count; ++i) -	{ -		titem->unpackMessage(msg, _PREHASH_ItemData, i); -		// If the item has already been added (e.g. from link prefetch), then it doesn't need to be re-added. -		if (gInventory.getItem(titem->getUUID())) -		{ -			LL_DEBUGS("Inventory") << "Skipping prefetched item [ Name: " << titem->getName() -								   << " | Type: " << titem->getActualType() << " | ItemUUID: " << titem->getUUID() << " ] " << LL_ENDL; -			continue; -		} -		gInventory.updateItem(titem); -	} - -	// set version and descendentcount according to message. -	LLViewerInventoryCategory* cat = gInventory.getCategory(parent_id); -	if(cat) -	{ -		cat->setVersion(version); -		cat->setDescendentCount(descendents); -		// Get this UUID on the changed list so that whatever's listening for it -		// will get triggered. -		gInventory.addChangedMask(LLInventoryObserver::INTERNAL, cat->getUUID()); -	} -	gInventory.notifyObservers();  }  // static @@ -3578,30 +3480,6 @@ void LLInventoryModel::updateItemsOrder(LLInventoryModel::item_array_t& items, c  	}  } -//* @param[in] items vector of items in order to be saved. -/* -void LLInventoryModel::saveItemsOrder(const LLInventoryModel::item_array_t& items) -{ -	int sortField = 0; - -	// current order is saved by setting incremental values (1, 2, 3, ...) for the sort field -	for (item_array_t::const_iterator i = items.begin(); i != items.end(); ++i) -	{ -		LLViewerInventoryItem* item = *i; - -		item->setSortField(++sortField); -		item->setComplete(TRUE); -		item->updateServer(FALSE); - -		updateItem(item); - -		// Tell the parent folder to refresh its sort order. -		addChangedMask(LLInventoryObserver::SORT, item->getParentUUID()); -	} - -	notifyObservers(); -} -*/  // See also LLInventorySort where landmarks in the Favorites folder are sorted.  class LLViewerInventoryItemSort  { @@ -3612,37 +3490,6 @@ public:  	}  }; -/** - * Sorts passed items by LLViewerInventoryItem sort field. - * - * @param[in, out] items - array of items, not sorted. - */ -//static void rearrange_item_order_by_sort_field(LLInventoryModel::item_array_t& items) -//{ -//	static LLViewerInventoryItemSort sort_functor; -//	std::sort(items.begin(), items.end(), sort_functor); -//} - -// * @param source_item_id - LLUUID of the source item to be moved into new position -// * @param target_item_id - LLUUID of the target item before which source item should be placed. -/* -void LLInventoryModel::rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id) -{ -	LLInventoryModel::cat_array_t cats; -	LLInventoryModel::item_array_t items; -	LLIsType is_type(LLAssetType::AT_LANDMARK); -	LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); -	gInventory.collectDescendentsIf(favorites_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); - -	// ensure items are sorted properly before changing order. EXT-3498 -	rearrange_item_order_by_sort_field(items); - -	// update order -	updateItemsOrder(items, source_item_id, target_item_id); - -	saveItemsOrder(items); -} -*/  //----------------------------------------------------------------------------  // *NOTE: DEBUG functionality diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index 3004eaf7c1..826d1f880d 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -630,9 +630,7 @@ public:  	static void processRemoveInventoryObjects(LLMessageSystem* msg, void**);  	static void processSaveAssetIntoInventory(LLMessageSystem* msg, void**);  	static void processBulkUpdateInventory(LLMessageSystem* msg, void**); -	static void processInventoryDescendents(LLMessageSystem* msg, void**);  	static void processMoveInventoryItem(LLMessageSystem* msg, void**); -	static void processFetchInventoryReply(LLMessageSystem* msg, void**);  protected:  	bool messageUpdateCore(LLMessageSystem* msg, bool do_accounting, U32 mask = 0x0); diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp index 72ec092ed4..ce8705b7ac 100644 --- a/indra/newview/llinventoryobserver.cpp +++ b/indra/newview/llinventoryobserver.cpp @@ -241,33 +241,11 @@ void fetch_items_from_llsd(const LLSD& items_llsd)  			gInventory.requestPost(true, url, body[i], handler, (i ? "Library Item" : "Inventory Item"));  			continue;  		} +        else +        { +            LL_WARNS("INVENTORY") << "Failed to get capability." << LL_ENDL; +        } -		LLMessageSystem* msg = gMessageSystem; -		BOOL start_new_message = TRUE; -		for (S32 j=0; j<body[i]["items"].size(); j++) -		{ -			LLSD item_entry = body[i]["items"][j]; -			if (start_new_message) -			{ -				start_new_message = FALSE; -				msg->newMessageFast(_PREHASH_FetchInventory); -				msg->nextBlockFast(_PREHASH_AgentData); -				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -			} -			msg->nextBlockFast(_PREHASH_InventoryData); -			msg->addUUIDFast(_PREHASH_OwnerID, item_entry["owner_id"].asUUID()); -			msg->addUUIDFast(_PREHASH_ItemID, item_entry["item_id"].asUUID()); -			if (msg->isSendFull(NULL)) -			{ -				start_new_message = TRUE; -				gAgent.sendReliableMessage(); -			} -		} -		if (!start_new_message) -		{ -			gAgent.sendReliableMessage(); -		}  	}  } diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 08c927483f..9cf3249983 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -911,7 +911,7 @@ void LLMediaCtrl::convertInputCoords(S32& x, S32& y)  	}  	x = ll_round((F32)x * LLUI::getScaleFactor().mV[VX]); -	if (  coords_opengl ) +	if ( ! coords_opengl )  	{  		y = ll_round((F32)(y) * LLUI::getScaleFactor().mV[VY]);  	} diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 763657ebad..0bcd8a9e63 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -95,7 +95,8 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :  	mVolumeSliderVisible(0),  	mWindowShade(NULL),  	mHideImmediately(false), -    mSecureURL(false) +    mSecureURL(false), +	mMediaPlaySliderCtrlMouseDownValue(0.0)  {  	mCommitCallbackRegistrar.add("MediaCtrl.Close",		boost::bind(&LLPanelPrimMediaControls::onClickClose, this));  	mCommitCallbackRegistrar.add("MediaCtrl.Back",		boost::bind(&LLPanelPrimMediaControls::onClickBack, this)); @@ -109,7 +110,8 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :  	mCommitCallbackRegistrar.add("MediaCtrl.Open",		boost::bind(&LLPanelPrimMediaControls::onClickOpen, this));  	mCommitCallbackRegistrar.add("MediaCtrl.Zoom",		boost::bind(&LLPanelPrimMediaControls::onClickZoom, this));  	mCommitCallbackRegistrar.add("MediaCtrl.CommitURL",	boost::bind(&LLPanelPrimMediaControls::onCommitURL, this)); -	mCommitCallbackRegistrar.add("MediaCtrl.JumpProgress",		boost::bind(&LLPanelPrimMediaControls::onCommitSlider, this)); +	mCommitCallbackRegistrar.add("MediaCtrl.MouseDown", boost::bind(&LLPanelPrimMediaControls::onMediaPlaySliderCtrlMouseDown, this)); +	mCommitCallbackRegistrar.add("MediaCtrl.MouseUp", boost::bind(&LLPanelPrimMediaControls::onMediaPlaySliderCtrlMouseUp, this));  	mCommitCallbackRegistrar.add("MediaCtrl.CommitVolumeUp",	boost::bind(&LLPanelPrimMediaControls::onCommitVolumeUp, this));  	mCommitCallbackRegistrar.add("MediaCtrl.CommitVolumeDown",	boost::bind(&LLPanelPrimMediaControls::onCommitVolumeDown, this));  	mCommitCallbackRegistrar.add("MediaCtrl.Volume",	boost::bind(&LLPanelPrimMediaControls::onCommitVolumeSlider, this)); @@ -1246,26 +1248,38 @@ void LLPanelPrimMediaControls::setCurrentURL()  #endif	// USE_COMBO_BOX_FOR_MEDIA_URL  } -void LLPanelPrimMediaControls::onCommitSlider() + +void LLPanelPrimMediaControls::onMediaPlaySliderCtrlMouseDown()  { -	focusOnTarget(); +	mMediaPlaySliderCtrlMouseDownValue = mMediaPlaySliderCtrl->getValue().asReal(); -	LLViewerMediaImpl* media_impl = getTargetMediaImpl(); -	if (media_impl)  +	mUpdateSlider = false; +} + +void LLPanelPrimMediaControls::onMediaPlaySliderCtrlMouseUp() +{ +	F64 cur_value = mMediaPlaySliderCtrl->getValue().asReal(); + +	if (mMediaPlaySliderCtrlMouseDownValue != cur_value)  	{ -		// get slider value -		F64 slider_value = mMediaPlaySliderCtrl->getValue().asReal(); -		if(slider_value <= 0.0) -		{	 -			media_impl->stop(); -		} -		else  +		focusOnTarget(); + +		LLViewerMediaImpl* media_impl = getTargetMediaImpl(); +		if (media_impl)  		{ -			media_impl->seek(slider_value*mMovieDuration); -			//mUpdateSlider= false; +			if (cur_value <= 0.0) +			{ +				media_impl->stop(); +			} +			else +			{ +				media_impl->seek(cur_value * mMovieDuration); +			}  		} + +		mUpdateSlider = true;  	} -}		 +}  void LLPanelPrimMediaControls::onCommitVolumeUp()  { diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h index 6d2eb3430e..21d5236074 100644 --- a/indra/newview/llpanelprimmediacontrols.h +++ b/indra/newview/llpanelprimmediacontrols.h @@ -107,8 +107,10 @@ private:  	void updateZoom();  	void setCurrentURL(); -	void onCommitSlider(); -	 + +	void onMediaPlaySliderCtrlMouseDown(); +	void onMediaPlaySliderCtrlMouseUp(); +  	void onCommitVolumeUp();  	void onCommitVolumeDown();  	void onCommitVolumeSlider(); @@ -219,6 +221,8 @@ private:  	S32 mVolumeSliderVisible;  	LLNotificationPtr mActiveNotification; + +	F64 mMediaPlaySliderCtrlMouseDownValue;  };  #endif // LL_PANELPRIMMEDIACONTROLS_H diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 98586e3b3d..27c4c90857 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -223,66 +223,6 @@ void LLCategoryDropObserver::done()  	}  	delete this;  } -/* Doesn't seem to be used anymore. -class LLCategoryDropDescendentsObserver : public LLInventoryFetchDescendentsObserver -{ -public: -	LLCategoryDropDescendentsObserver( -		const LLUUID& obj_id, LLToolDragAndDrop::ESource src) : -		mObjectID(obj_id), -		mSource(src) -	{} -	~LLCategoryDropDescendentsObserver() {} -	virtual void done(); - -protected: -	LLUUID mObjectID; -	LLToolDragAndDrop::ESource mSource; -}; - -void LLCategoryDropDescendentsObserver::done() -{ - -	gInventory.removeObserver(this); -	uuid_vec_t::iterator it = mComplete.begin(); -	uuid_vec_t::iterator end = mComplete.end(); -	LLViewerInventoryCategory::cat_array_t cats; -	LLViewerInventoryItem::item_array_t items; -	for(; it != end; ++it) -	{ -		gInventory.collectDescendents( -			(*it), -			cats, -			items, -			LLInventoryModel::EXCLUDE_TRASH); -	} - -	S32 count = items.size(); -	if (count) -	{ -		std::set<LLUUID> unique_ids; -		for(S32 i = 0; i < count; ++i) -		{ -			unique_ids.insert(items.get(i)->getUUID()); -		} -		uuid_vec_t ids; -		std::back_insert_iterator<uuid_vec_t> copier(ids); -		std::copy(unique_ids.begin(), unique_ids.end(), copier); -		LLCategoryDropObserver* dropper; -		dropper = new LLCategoryDropObserver(ids, mObjectID, mSource); -		dropper->startFetch(); -		if (dropper->isDone()) -		{ -			dropper->done(); -		} -		else -		{ -			gInventory.addObserver(dropper); -		} -	} -	delete this; -} -*/  S32 LLToolDragAndDrop::sOperationId = 0; diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 0ee873d7a1..d0813544f8 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -384,16 +384,26 @@ void LLViewerInventoryItem::updateServer(BOOL is_new) const  	LLInventoryModel::LLCategoryUpdate up(mParentUUID, is_new ? 1 : 0);  	gInventory.accountForUpdate(up); -	LLMessageSystem* msg = gMessageSystem; -	msg->newMessageFast(_PREHASH_UpdateInventoryItem); -	msg->nextBlockFast(_PREHASH_AgentData); -	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -	msg->addUUIDFast(_PREHASH_TransactionID, mTransactionID); -	msg->nextBlockFast(_PREHASH_InventoryData); -	msg->addU32Fast(_PREHASH_CallbackID, 0); -	packMessage(msg); -	gAgent.sendReliableMessage(); +    LLSD updates = asLLSD(); +    // Replace asset_id and/or shadow_id with transaction_id (hash_id) +    if (updates.has("asset_id")) +    { +        updates.erase("asset_id"); +        if(getTransactionID().notNull()) +        { +            updates["hash_id"] = getTransactionID(); +        } +    } +    if (updates.has("shadow_id")) +    { +        updates.erase("shadow_id"); +        if(getTransactionID().notNull()) +        { +            updates["hash_id"] = getTransactionID(); +        } +    } +    AISAPI::completion_t cr = boost::bind(&doInventoryCb, (LLPointer<LLInventoryCallback>)NULL, _1); +    AISAPI::UpdateItem(getUUID(), updates, cr);  }  void LLViewerInventoryItem::fetchFromServer(void) const @@ -636,17 +646,9 @@ void LLViewerInventoryCategory::updateServer(BOOL is_new) const  		return;  	} -	LLInventoryModel::LLCategoryUpdate up(mParentUUID, is_new ? 1 : 0); -	gInventory.accountForUpdate(up); - -	LLMessageSystem* msg = gMessageSystem; -	msg->newMessageFast(_PREHASH_UpdateInventoryFolder); -	msg->nextBlockFast(_PREHASH_AgentData); -	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -	msg->nextBlockFast(_PREHASH_FolderData); -	packMessage(msg); -	gAgent.sendReliableMessage(); +    LLSD new_llsd = asLLSD(); +    AISAPI::completion_t cr = boost::bind(&doInventoryCb, (LLPointer<LLInventoryCallback>)NULL, _1); +    AISAPI::UpdateCategory(getUUID(), new_llsd, cr);  }  S32 LLViewerInventoryCategory::getVersion() const @@ -669,18 +671,6 @@ bool LLViewerInventoryCategory::fetch()  		mDescendentsRequested.reset();  		mDescendentsRequested.setTimerExpirySec(FETCH_TIMER_EXPIRY); -		// bitfield -		// 1 = by date -		// 2 = folders by date -		// Need to mask off anything but the first bit. -		// This comes from LLInventoryFilter from llfolderview.h -		U32 sort_order = gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER) & 0x1; - -		// *NOTE: For bug EXT-2879, originally commented out -		// gAgent.getRegion()->getCapability in order to use the old -		// message-based system.  This has been uncommented now that -		// AIS folks are aware of the issue and have a fix in process. -		// see ticket for details.  		std::string url;  		if (gAgent.getRegion()) @@ -695,24 +685,6 @@ bool LLViewerInventoryCategory::fetch()  		{  			LLInventoryModelBackgroundFetch::instance().start(mUUID, false);			  		} -		else -		{	//Deprecated, but if we don't have a capability, use the old system. -			LL_INFOS(LOG_INV) << "FetchInventoryDescendents2 capability not found.  Using deprecated UDP message." << LL_ENDL; -			 -			LLMessageSystem* msg = gMessageSystem; -			msg->newMessage("FetchInventoryDescendents"); -			msg->nextBlock("AgentData"); -			msg->addUUID("AgentID", gAgent.getID()); -			msg->addUUID("SessionID", gAgent.getSessionID()); -			msg->nextBlock("InventoryData"); -			msg->addUUID("FolderID", mUUID); -			msg->addUUID("OwnerID", mOwnerID); - -			msg->addS32("SortOrder", sort_order); -			msg->addBOOL("FetchFolders", FALSE); -			msg->addBOOL("FetchItems", TRUE); -			gAgent.sendReliableMessage(); -		}  		return true;  	}  	return false; @@ -905,17 +877,16 @@ void LLViewerInventoryCategory::changeType(LLFolderType::EType new_folder_type)  	const LLUUID &parent_id = getParentUUID();  	const std::string &name = getName(); -	LLMessageSystem* msg = gMessageSystem; -	msg->newMessageFast(_PREHASH_UpdateInventoryFolder); -	msg->nextBlockFast(_PREHASH_AgentData); -	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -	msg->nextBlockFast(_PREHASH_FolderData); -	msg->addUUIDFast(_PREHASH_FolderID, folder_id); -	msg->addUUIDFast(_PREHASH_ParentID, parent_id); -	msg->addS8Fast(_PREHASH_Type, new_folder_type); -	msg->addStringFast(_PREHASH_Name, name); -	gAgent.sendReliableMessage(); +    LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(folder_id, +                                                                                 parent_id, +                                                                                 new_folder_type, +                                                                                 name, +                                                                                 gAgent.getID()); +         +         +    LLSD new_llsd = new_cat->asLLSD(); +    AISAPI::completion_t cr = boost::bind(&doInventoryCb, (LLPointer<LLInventoryCallback>) NULL, _1); +    AISAPI::UpdateCategory(folder_id, new_llsd, cr);  	setPreferredType(new_folder_type);  	gInventory.addChangedMask(LLInventoryObserver::LABEL, folder_id); @@ -1289,40 +1260,10 @@ void link_inventory_array(const LLUUID& category,  						   << " UUID:" << category << " ] " << LL_ENDL;  #endif  	} - -    if (AISAPI::isAvailable()) -	{ -		LLSD new_inventory = LLSD::emptyMap(); -		new_inventory["links"] = links; -        AISAPI::completion_t cr = (cb) ? boost::bind(&doInventoryCb, cb, _1) : AISAPI::completion_t(); -        AISAPI::CreateInventory(category, new_inventory, cr); -	} -    else -	{ -		LLMessageSystem* msg = gMessageSystem; -		for (LLSD::array_iterator iter = links.beginArray(); iter != links.endArray(); ++iter ) -		{ -			msg->newMessageFast(_PREHASH_LinkInventoryItem); -			msg->nextBlock(_PREHASH_AgentData); -			{ -				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -			} -			msg->nextBlock(_PREHASH_InventoryBlock); -			{ -				LLSD link = (*iter); -				msg->addU32Fast(_PREHASH_CallbackID, gInventoryCallbacks.registerCB(cb)); -				msg->addUUIDFast(_PREHASH_FolderID, category); -				msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); -				msg->addUUIDFast(_PREHASH_OldItemID, link["linked_id"].asUUID()); -				msg->addS8Fast(_PREHASH_Type, link["type"].asInteger()); -				msg->addS8Fast(_PREHASH_InvType, link["inv_type"].asInteger()); -				msg->addStringFast(_PREHASH_Name, link["name"].asString()); -				msg->addStringFast(_PREHASH_Description, link["desc"].asString()); -			} -			gAgent.sendReliableMessage(); -		} -	} +    LLSD new_inventory = LLSD::emptyMap(); +    new_inventory["links"] = links; +    AISAPI::completion_t cr = boost::bind(&doInventoryCb, cb, _1); +    AISAPI::CreateInventory(category, new_inventory, cr);  }  void move_inventory_item( @@ -1354,49 +1295,21 @@ void update_inventory_item(  	LLPointer<LLInventoryCallback> cb)  {  	const LLUUID& item_id = update_item->getUUID(); -    if (AISAPI::isAvailable()) -	{ -		LLSD updates = update_item->asLLSD(); -		// Replace asset_id and/or shadow_id with transaction_id (hash_id) -		if (updates.has("asset_id")) -		{ -			updates.erase("asset_id"); -			updates["hash_id"] = update_item->getTransactionID(); -		} -		if (updates.has("shadow_id")) -		{ -			updates.erase("shadow_id"); -			updates["hash_id"] = update_item->getTransactionID(); -		} -        AISAPI::completion_t cr = (cb) ? boost::bind(&doInventoryCb, cb, _1) : AISAPI::completion_t(); -        AISAPI::UpdateItem(item_id, updates, cr); -	} -    else -	{ -		LLPointer<LLViewerInventoryItem> obj = gInventory.getItem(item_id); -		LL_DEBUGS(LOG_INV) << "item_id: [" << item_id << "] name " << (update_item ? update_item->getName() : "(NOT FOUND)") << LL_ENDL; -		if(obj) -		{ -			LLMessageSystem* msg = gMessageSystem; -			msg->newMessageFast(_PREHASH_UpdateInventoryItem); -			msg->nextBlockFast(_PREHASH_AgentData); -			msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -			msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -			msg->addUUIDFast(_PREHASH_TransactionID, update_item->getTransactionID()); -			msg->nextBlockFast(_PREHASH_InventoryData); -			msg->addU32Fast(_PREHASH_CallbackID, 0); -			update_item->packMessage(msg); -			gAgent.sendReliableMessage(); - -			LLInventoryModel::LLCategoryUpdate up(update_item->getParentUUID(), 0); -			gInventory.accountForUpdate(up); -			gInventory.updateItem(update_item); -			if (cb) -			{ -				cb->fire(item_id); -			} -		} -	} +   +    LLSD updates = update_item->asLLSD(); +    // Replace asset_id and/or shadow_id with transaction_id (hash_id) +    if (updates.has("asset_id")) +    { +        updates.erase("asset_id"); +        updates["hash_id"] = update_item->getTransactionID(); +    } +    if (updates.has("shadow_id")) +    { +        updates.erase("shadow_id"); +        updates["hash_id"] = update_item->getTransactionID(); +    } +    AISAPI::completion_t cr = boost::bind(&doInventoryCb, cb, _1); +    AISAPI::UpdateItem(item_id, updates, cr);  }  // Note this only supports updating an existing item. Goes through AISv3 @@ -1407,41 +1320,8 @@ void update_inventory_item(  	const LLSD& updates,  	LLPointer<LLInventoryCallback> cb)  { -    if (AISAPI::isAvailable()) -	{ -        AISAPI::completion_t cr = (cb) ? boost::bind(&doInventoryCb, cb, _1) : AISAPI::completion_t(); -        AISAPI::UpdateItem(item_id, updates, cr); -	} -    else -	{ -		LLPointer<LLViewerInventoryItem> obj = gInventory.getItem(item_id); -		LL_DEBUGS(LOG_INV) << "item_id: [" << item_id << "] name " << (obj ? obj->getName() : "(NOT FOUND)") << LL_ENDL; -		if(obj) -		{ -			LLPointer<LLViewerInventoryItem> new_item(new LLViewerInventoryItem); -			new_item->copyViewerItem(obj); -			new_item->fromLLSD(updates,false); - -			LLMessageSystem* msg = gMessageSystem; -			msg->newMessageFast(_PREHASH_UpdateInventoryItem); -			msg->nextBlockFast(_PREHASH_AgentData); -			msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -			msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -			msg->addUUIDFast(_PREHASH_TransactionID, new_item->getTransactionID()); -			msg->nextBlockFast(_PREHASH_InventoryData); -			msg->addU32Fast(_PREHASH_CallbackID, 0); -			new_item->packMessage(msg); -			gAgent.sendReliableMessage(); - -			LLInventoryModel::LLCategoryUpdate up(new_item->getParentUUID(), 0); -			gInventory.accountForUpdate(up); -			gInventory.updateItem(new_item); -			if (cb) -			{ -				cb->fire(item_id); -			} -		} -	} +    AISAPI::completion_t cr = boost::bind(&doInventoryCb, cb, _1); +    AISAPI::UpdateItem(item_id, updates, cr);  }  void update_inventory_category( @@ -1461,32 +1341,9 @@ void update_inventory_category(  		LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(obj);  		new_cat->fromLLSD(updates); -		// FIXME - restore this once the back-end work has been done. -        if (AISAPI::isAvailable()) -		{ -			LLSD new_llsd = new_cat->asLLSD(); -            AISAPI::completion_t cr = (cb) ? boost::bind(&doInventoryCb, cb, _1) : AISAPI::completion_t(); -            AISAPI::UpdateCategory(cat_id, new_llsd, cr); -		} -		else // no cap -		{ -			LLMessageSystem* msg = gMessageSystem; -			msg->newMessageFast(_PREHASH_UpdateInventoryFolder); -			msg->nextBlockFast(_PREHASH_AgentData); -			msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -			msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -			msg->nextBlockFast(_PREHASH_FolderData); -			new_cat->packMessage(msg); -			gAgent.sendReliableMessage(); - -			LLInventoryModel::LLCategoryUpdate up(new_cat->getParentUUID(), 0); -			gInventory.accountForUpdate(up); -			gInventory.updateCategory(new_cat); -			if (cb) -			{ -				cb->fire(cat_id); -			} -		} +        LLSD new_llsd = new_cat->asLLSD(); +        AISAPI::completion_t cr = boost::bind(&doInventoryCb, cb, _1); +        AISAPI::UpdateCategory(cat_id, new_llsd, cr);  	}  } @@ -1604,41 +1461,8 @@ void remove_inventory_category(  			LLNotificationsUtil::add("CannotRemoveProtectedCategories");  			return;  		} -        if (AISAPI::isAvailable()) -		{ -            AISAPI::completion_t cr = (cb) ? boost::bind(&doInventoryCb, cb, _1) : AISAPI::completion_t(); -            AISAPI::RemoveCategory(cat_id, cr); -		} -		else // no cap -		{ -			// RemoveInventoryFolder does not remove children, so must -			// clear descendents first. -			LLInventoryModel::EHasChildren children = gInventory.categoryHasChildren(cat_id); -			if(children != LLInventoryModel::CHILDREN_NO) -			{ -				LL_DEBUGS(LOG_INV) << "Will purge descendents first before deleting category " << cat_id << LL_ENDL; -				LLPointer<LLInventoryCallback> wrap_cb = new LLRemoveCategoryOnDestroy(cat_id, cb);  -				purge_descendents_of(cat_id, wrap_cb); -				return; -			} - -			LLMessageSystem* msg = gMessageSystem; -			msg->newMessageFast(_PREHASH_RemoveInventoryFolder); -			msg->nextBlockFast(_PREHASH_AgentData); -			msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -			msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -			msg->nextBlockFast(_PREHASH_FolderData); -			msg->addUUIDFast(_PREHASH_FolderID, cat_id); -			gAgent.sendReliableMessage(); - -			// Update inventory and call callback immediately since -			// message-based system has no callback mechanism (!) -			gInventory.onObjectDeletedFromServer(cat_id); -			if (cb) -			{ -				cb->fire(cat_id); -			} -		} +        AISAPI::completion_t cr = boost::bind(&doInventoryCb, cb, _1); +        AISAPI::RemoveCategory(cat_id, cr);  	}  	else  	{ @@ -1857,29 +1681,11 @@ void slam_inventory_folder(const LLUUID& folder_id,  						   const LLSD& contents,  						   LLPointer<LLInventoryCallback> cb)  { -    if (AISAPI::isAvailable()) -	{ -		LL_DEBUGS(LOG_INV) << "using AISv3 to slam folder, id " << folder_id -						   << " new contents: " << ll_pretty_print_sd(contents) << LL_ENDL; +    LL_DEBUGS(LOG_INV) << "using AISv3 to slam folder, id " << folder_id +                       << " new contents: " << ll_pretty_print_sd(contents) << LL_ENDL; -        AISAPI::completion_t cr = (cb) ? boost::bind(&doInventoryCb, cb, _1) : AISAPI::completion_t(); -        AISAPI::SlamFolder(folder_id, contents, cr); -	} -	else // no cap -	{ -		LL_DEBUGS(LOG_INV) << "using item-by-item calls to slam folder, id " << folder_id -						   << " new contents: " << ll_pretty_print_sd(contents) << LL_ENDL; -		for (LLSD::array_const_iterator it = contents.beginArray(); -			 it != contents.endArray(); -			 ++it) -		{ -			const LLSD& item_contents = *it; -			LLViewerInventoryItem *item = new LLViewerInventoryItem; -			item->fromLLSD(item_contents); -			link_inventory_object(folder_id, item, cb); -		} -		remove_folder_contents(folder_id,false,cb); -	} +    AISAPI::completion_t cr = boost::bind(&doInventoryCb, cb, _1); +    AISAPI::SlamFolder(folder_id, contents, cr);  }  void remove_folder_contents(const LLUUID& category, bool keep_outfit_links, diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 4e91e4110a..5194679a0c 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -38,6 +38,7 @@ class LLInventoryPanel;  class LLFolderView;  class LLFolderBridge;  class LLViewerInventoryCategory; +class LLInventoryCallback;  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  // Class LLViewerInventoryItem @@ -387,9 +388,9 @@ void update_inventory_item(  	LLPointer<LLInventoryCallback> cb);  void update_inventory_category( -	const LLUUID& cat_id, -	const LLSD& updates, -	LLPointer<LLInventoryCallback> cb); +    const LLUUID& cat_id, +    const LLSD& updates, +    LLPointer<LLInventoryCallback> cb);  void remove_inventory_items(  	LLInventoryObject::object_list_t& items, diff --git a/indra/newview/skins/default/xui/en/floater_web_content.xml b/indra/newview/skins/default/xui/en/floater_web_content.xml index 7b63a67415..4473ce0cda 100644 --- a/indra/newview/skins/default/xui/en/floater_web_content.xml +++ b/indra/newview/skins/default/xui/en/floater_web_content.xml @@ -25,10 +25,10 @@      <layout_panel        auto_resize="false"        default_tab_group="1" -      height="44" +      height="22"        layout="topleft"        left="0" -      min_height="40" +      min_height="20"        name="nav_controls"        top="400"        width="770"> @@ -152,112 +152,136 @@          <button.commit_callback            function="WebContent.PopExternal" />        </button> +    </layout_panel> +    <layout_panel +     height="22" +     layout="topleft" +     left_delta="0" +     name="debug_controls" +     top_delta="0" +     auto_resize="false" +     width="585"> +      <button +        image_overlay="Home_Off" +            image_disabled="PushButton_Disabled" +            image_disabled_selected="PushButton_Disabled" +            image_selected="PushButton_Selected" +            image_unselected="PushButton_Off" +        chrome="true" +        tool_tip="Web tests home page" +        enabled="true" +        follows="left|top" +        height="22" +        layout="topleft" +        left="1" +        name="web_test_home_page" +        top="0" +        width="22"> +        <button.commit_callback +          function="WebContent.TestURL" +          parameter="https://callum-linden.s3.amazonaws.com/ceftests.html"/> +      </button>        <button          image_overlay="Video_URL_Off" -		    image_disabled="PushButton_Disabled" -		    image_disabled_selected="PushButton_Disabled" -		    image_selected="PushButton_Selected" -		    image_unselected="PushButton_Off" +            image_disabled="PushButton_Disabled" +            image_disabled_selected="PushButton_Disabled" +            image_selected="PushButton_Selected" +            image_unselected="PushButton_Off"          chrome="true"          tool_tip="MPEG4 Video Test"          enabled="true"          follows="left|top"          height="22"          layout="topleft" -        left="1" +        left="27"          name="VLC Plugin Test" -        top="22" +        top="0"          width="22">          <button.commit_callback -          function="WebContent.TestVideo" +          function="WebContent.TestURL"            parameter="https://callum-linden.s3.amazonaws.com/sample_media/ss.mp4"/>        </button> -        <button          image_overlay="Video_URL_Off" -		    image_disabled="PushButton_Disabled" -		    image_disabled_selected="PushButton_Disabled" -		    image_selected="PushButton_Selected" -		    image_unselected="PushButton_Off" +            image_disabled="PushButton_Disabled" +            image_disabled_selected="PushButton_Disabled" +            image_selected="PushButton_Selected" +            image_unselected="PushButton_Off"          chrome="true"          tool_tip="MKV Video Test"          enabled="true"          follows="left|top"          height="22"          layout="topleft" -        left="27" +        left="51"          name="VLC Plugin Test" -        top="22" +        top="0"          width="22">          <button.commit_callback -          function="WebContent.TestVideo" +          function="WebContent.TestURL"            parameter="https://callum-linden.s3.amazonaws.com/sample_media/jellyfish.mkv"/>        </button> -        <button          image_overlay="Video_URL_Off" -		    image_disabled="PushButton_Disabled" -		    image_disabled_selected="PushButton_Disabled" -		    image_selected="PushButton_Selected" -		    image_unselected="PushButton_Off" +            image_disabled="PushButton_Disabled" +            image_disabled_selected="PushButton_Disabled" +            image_selected="PushButton_Selected" +            image_unselected="PushButton_Off"          chrome="true"          tool_tip="WebM Video Test"          enabled="true"          follows="left|top"          height="22"          layout="topleft" -        left="51" +        left="75"          name="VLC Plugin Test" -        top="22" +        top="0"          width="22">          <button.commit_callback -          function="WebContent.TestVideo" +          function="WebContent.TestURL"            parameter="https://callum-linden.s3.amazonaws.com/sample_media/jumprope.webm"/>        </button> -        <button          image_overlay="Video_URL_Off" -		    image_disabled="PushButton_Disabled" -		    image_disabled_selected="PushButton_Disabled" -		    image_selected="PushButton_Selected" -		    image_unselected="PushButton_Off" +            image_disabled="PushButton_Disabled" +            image_disabled_selected="PushButton_Disabled" +            image_selected="PushButton_Selected" +            image_unselected="PushButton_Off"          chrome="true"          tool_tip="MP3 audio Test"          enabled="true"          follows="left|top"          height="22"          layout="topleft" -        left="75" +        left="99"          name="VLC Plugin Test" -        top="22" +        top="0"          width="22">          <button.commit_callback -          function="WebContent.TestVideo" +          function="WebContent.TestURL"            parameter="https://callum-linden.s3.amazonaws.com/alegria.mp3"/>        </button> -        <button          image_overlay="Video_URL_Off" -		    image_disabled="PushButton_Disabled" -		    image_disabled_selected="PushButton_Disabled" -		    image_selected="PushButton_Selected" -		    image_unselected="PushButton_Off" +            image_disabled="PushButton_Disabled" +            image_disabled_selected="PushButton_Disabled" +            image_selected="PushButton_Selected" +            image_unselected="PushButton_Off"          chrome="true"          tool_tip="FLV Test"          enabled="true"          follows="left|top"          height="22"          layout="topleft" -        left="99" +        left="123"          name="VLC Plugin Test" -        top="22" +        top="0"          width="22">          <button.commit_callback -          function="WebContent.TestVideo" +          function="WebContent.TestURL"            parameter="https://callum-linden.s3.amazonaws.com/sample_media/vandal.flv"/>        </button> -      </layout_panel>      <layout_panel        height="40" diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index 419ec359a6..4576111db1 100644 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -232,11 +232,11 @@               parameter="message_critical" />          </menu_item_call>        <menu_item_call -       label="Web Content Floater Debug Test" -       name="Web Content Floater Debug Test"> +       label="Media Browser" +       name="Media Browser">          <menu_item_call.on_click           function="Advanced.WebContentTest" -         parameter="https://callum-linden.s3.amazonaws.com/ceftests.html"/> +         parameter="http://google.com"/>        </menu_item_call>        <menu         create_jump_keys="true" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 0a492fb37b..82488cd88d 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -3141,30 +3141,13 @@           label="UI"           name="UI"           tear_off="true"> -         <!--   <menu_item_check -             label="New Bottom Bar" -             name="New Bottom Bar"> -                <menu_item_check.on_check -                 function="CheckControl" -                 parameter="BottomPanelNew" /> -                <menu_item_check.on_click -                 function="ToggleControl" -                 parameter="BottomPanelNew" /> -            </menu_item_check>--> -            <menu_item_call -             label="Media Browser Test" -             name="Web Browser Test"> -                <menu_item_call.on_click -                 function="Advanced.WebBrowserTest" -                 parameter="http://secondlife.com/app/search/slurls.html"/> -            </menu_item_call>            <menu_item_call -           label="Web Content Browser" -           name="Web Content Browser" -           shortcut="control|shift|Z"> +           label="Media Browser" +           name="Media Browser" +           shortcut="control|alt|shift|Z">              <menu_item_call.on_click               function="Advanced.WebContentTest" -             parameter="https://callum-linden.s3.amazonaws.com/ceftests.html"/> +             parameter="http://google.com"/>            </menu_item_call>            <menu_item_call             label="FB Connect Test" diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml index eb67d07601..068e4420bc 100644 --- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml @@ -374,9 +374,11 @@  		  layout="topleft"  		  tool_tip="Movie play progress"  		  width="200"> -		<slider_bar.commit_callback -			function="MediaCtrl.JumpProgress" /> -	  </slider_bar> +      <slider_bar.mouse_down_callback +        function="MediaCtrl.MouseDown" /> +      <slider_bar.mouse_up_callback +        function="MediaCtrl.MouseUp" /> +    </slider_bar>  	</layout_panel>  	<layout_panel  		name="skip_back" | 
