From a0348b7e271d8bc343ac15049c6c5ea81c4b7f3f Mon Sep 17 00:00:00 2001
From: Denis Serdjuk <dserduk@productengine.com>
Date: Thu, 5 Nov 2009 14:19:43 +0200
Subject: [PATCH] EXT-2023   	 Camera floater: arrows became shifted when
 pressed Cause: The different between default texture size and size of the
 image has influenced on displacement of arrows at rotation. Solution:
 Transformation matrix has been changed to handle that different

--HG--
branch : product-engine
---
 indra/newview/lljoystickbutton.cpp | 29 +++++++++++++++++++----------
 indra/newview/lljoystickbutton.h   |  2 +-
 2 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp
index 4fd3b7bddc8..bd6702a0b2f 100644
--- a/indra/newview/lljoystickbutton.cpp
+++ b/indra/newview/lljoystickbutton.cpp
@@ -517,43 +517,52 @@ void LLJoystickCameraRotate::draw()
 	LLGLSUIDefault gls_ui;
 
 	getImageUnselected()->draw( 0, 0 );
+	LLPointer<LLUIImage> image = getImageSelected();
 
 	if( mInTop )
 	{
-		drawRotatedImage( getImageSelected()->getImage(), 0 );
+		drawRotatedImage( getImageSelected(), 0 );
 	}
 
 	if( mInRight )
 	{
-		drawRotatedImage( getImageSelected()->getImage(), 1 );
+		drawRotatedImage( getImageSelected(), 1 );
 	}
 
 	if( mInBottom )
 	{
-		drawRotatedImage( getImageSelected()->getImage(), 2 );
+		drawRotatedImage( getImageSelected(), 2 );
 	}
 
 	if( mInLeft )
 	{
-		drawRotatedImage( getImageSelected()->getImage(), 3 );
+		drawRotatedImage( getImageSelected(), 3 );
 	}
 }
 
 // Draws image rotated by multiples of 90 degrees
-void LLJoystickCameraRotate::drawRotatedImage( LLTexture* image, S32 rotations )
+void LLJoystickCameraRotate::drawRotatedImage( LLPointer<LLUIImage> image, S32 rotations )
 {
 	S32 width = image->getWidth();
 	S32 height = image->getHeight();
-
+	LLTexture* texture = image->getImage();
+
+	/*
+	 * Scale  texture coordinate system 
+	 * to handle the different between image size and size of texture.
+	 * If we will use default matrix, 
+	 * it may break texture mapping after rotation.
+	 * see EXT-2023 Camera floater: arrows became shifted when pressed.
+	 */ 
 	F32 uv[][2] = 
 	{
-		{ 1.f, 1.f },
-		{ 0.f, 1.f },
+		{ (F32)width/texture->getWidth(), (F32)height/texture->getHeight() },
+		{ 0.f, (F32)height/texture->getHeight() },
 		{ 0.f, 0.f },
-		{ 1.f, 0.f }
+		{ (F32)width/texture->getWidth(), 0.f }
 	};
 
-	gGL.getTexUnit(0)->bind(image);
+	gGL.getTexUnit(0)->bind(texture);
 
 	gGL.color4fv(UI_VERTEX_COLOR.mV);
 	
diff --git a/indra/newview/lljoystickbutton.h b/indra/newview/lljoystickbutton.h
index 8caef30fa4b..4c657913b8c 100644
--- a/indra/newview/lljoystickbutton.h
+++ b/indra/newview/lljoystickbutton.h
@@ -150,7 +150,7 @@ class LLJoystickCameraRotate
 protected:
 	F32				getOrbitRate();
 	virtual void	updateSlop();
-	void			drawRotatedImage( LLTexture* image, S32 rotations );
+	void			drawRotatedImage( LLPointer<LLUIImage> image, S32 rotations );
 
 protected:
 	BOOL			mInLeft;
-- 
GitLab