From 37e701dba91985ddeaa4704d846f533331c95216 Mon Sep 17 00:00:00 2001 From: Monroe Linden Date: Tue, 1 Dec 2009 16:21:29 -0800 Subject: Fix for EXT-2836 (Changing texture on Media on a Prim face removes MoaP functionality). LLVOVolume::regenFaces() (specifically the calls to facep->setTexture()) breaks associations between faces and LLViewerMediaTexture objects when called on a prim with playing media. This change adds code which recreates the associations. --- indra/newview/llvovolume.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 1ee0811ba6..367912f45e 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1134,6 +1134,20 @@ void LLVOVolume::regenFaces() facep->setTEOffset(i); facep->setTexture(getTEImage(i)); facep->setViewerObject(this); + + // If the face had media on it, this will have broken the link between the LLViewerMediaTexture and the face. + // Re-establish the link. + if(mMediaImplList.size() > i) + { + if(mMediaImplList[i]) + { + LLViewerMediaTexture* media_tex = LLViewerTextureManager::findMediaTexture(mMediaImplList[i]->getMediaTextureID()) ; + if(media_tex) + { + media_tex->addMediaToFace(facep) ; + } + } + } } if (!count_changed) -- cgit v1.2.3 From f4e40360e5f3dfd644564e59c65d7935e5f402ee Mon Sep 17 00:00:00 2001 From: Monroe Linden Date: Tue, 1 Dec 2009 16:55:35 -0800 Subject: Fix for EXT-2892/DEV-43568 (if a face is set to show multiple texture repeats, only one of the repeats is interactive) Added LLViewerMediaImpl::scaleTextureCoords() function to encapsulate the code that maps from texture coordinates to media coordinates. Made scaleTextureCoords() wrap the texture coordinate to the range [0.0, 1.0) before converting to media coordinates. --- indra/newview/llviewermedia.cpp | 48 +++++++++++++++++++++++++---------------- indra/newview/llviewermedia.h | 1 + 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 608c5c2097..d5fd23ac51 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -1289,17 +1289,37 @@ void LLViewerMediaImpl::mouseMove(S32 x, S32 y, MASK mask) } } +////////////////////////////////////////////////////////////////////////////////////////// +//static +void LLViewerMediaImpl::scaleTextureCoords(const LLVector2& texture_coords, S32 *x, S32 *y) +{ + F32 texture_x = texture_coords.mV[VX]; + F32 texture_y = texture_coords.mV[VY]; + + // Deal with repeating textures by wrapping the coordinates into the range [0, 1.0) + texture_x = fmodf(texture_x, 1.0f); + if(texture_x < 0.0f) + texture_x = 1.0 + texture_x; + + texture_y = fmodf(texture_y, 1.0f); + if(texture_y < 0.0f) + texture_y = 1.0 + texture_y; + + // scale x and y to texel units. + *x = llround(texture_x * mMediaSource->getTextureWidth()); + *y = llround((1.0f - texture_y) * mMediaSource->getTextureHeight()); + + // Adjust for the difference between the actual texture height and the amount of the texture in use. + *y -= (mMediaSource->getTextureHeight() - mMediaSource->getHeight()); +} + ////////////////////////////////////////////////////////////////////////////////////////// void LLViewerMediaImpl::mouseDown(const LLVector2& texture_coords, MASK mask, S32 button) { if(mMediaSource) { - // scale x and y to texel units. - S32 x = llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()); - S32 y = llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()); - - // Adjust for the difference between the actual texture height and the amount of the texture in use. - y -= (mMediaSource->getTextureHeight() - mMediaSource->getHeight()); + S32 x, y; + scaleTextureCoords(texture_coords, &x, &y); mouseDown(x, y, mask, button); } @@ -1309,12 +1329,8 @@ void LLViewerMediaImpl::mouseUp(const LLVector2& texture_coords, MASK mask, S32 { if(mMediaSource) { - // scale x and y to texel units. - S32 x = llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()); - S32 y = llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()); - - // Adjust for the difference between the actual texture height and the amount of the texture in use. - y -= (mMediaSource->getTextureHeight() - mMediaSource->getHeight()); + S32 x, y; + scaleTextureCoords(texture_coords, &x, &y); mouseUp(x, y, mask, button); } @@ -1324,12 +1340,8 @@ void LLViewerMediaImpl::mouseMove(const LLVector2& texture_coords, MASK mask) { if(mMediaSource) { - // scale x and y to texel units. - S32 x = llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()); - S32 y = llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()); - - // Adjust for the difference between the actual texture height and the amount of the texture in use. - y -= (mMediaSource->getTextureHeight() - mMediaSource->getHeight()); + S32 x, y; + scaleTextureCoords(texture_coords, &x, &y); mouseMove(x, y, mask); } diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index ac12112ed4..e2d159304f 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -185,6 +185,7 @@ public: void setHomeURL(const std::string& home_url) { mHomeURL = home_url; }; std::string getMimeType() { return mMimeType; } void scaleMouse(S32 *mouse_x, S32 *mouse_y); + void scaleTextureCoords(const LLVector2& texture_coords, S32 *x, S32 *y); void update(); void updateImagesMediaStreams(); -- cgit v1.2.3