From 973be3711afe2585aa654fb3fa42783b42aa5587 Mon Sep 17 00:00:00 2001
From: Webster Sheets <webster@web-eworks.com>
Date: Wed, 14 Feb 2018 17:32:42 -0500
Subject: [PATCH] Fix Sprite3D's incorrect behavior when using AtlasTextures.

---
 scene/3d/sprite_3d.cpp | 29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/scene/3d/sprite_3d.cpp b/scene/3d/sprite_3d.cpp
index 232855c978b..bc44c91f64d 100644
--- a/scene/3d/sprite_3d.cpp
+++ b/scene/3d/sprite_3d.cpp
@@ -366,11 +366,17 @@ void Sprite3D::_draw() {
 		final_rect.position * pixel_size,
 
 	};
+
+	// Properly setup UVs for impostor textures (AtlasTexture).
+	RID texture_rid = texture->get_rid();
+	Vector2 src_tsize = Vector2(
+			VS::get_singleton()->texture_get_width(texture_rid),
+			VS::get_singleton()->texture_get_height(texture_rid));
 	Vector2 uvs[4] = {
-		final_src_rect.position / tsize,
-		(final_src_rect.position + Vector2(final_src_rect.size.x, 0)) / tsize,
-		(final_src_rect.position + final_src_rect.size) / tsize,
-		(final_src_rect.position + Vector2(0, final_src_rect.size.y)) / tsize,
+		final_src_rect.position / src_tsize,
+		(final_src_rect.position + Vector2(final_src_rect.size.x, 0)) / src_tsize,
+		(final_src_rect.position + final_src_rect.size) / src_tsize,
+		(final_src_rect.position + Vector2(0, final_src_rect.size.y)) / src_tsize,
 	};
 
 	if (is_flipped_h()) {
@@ -649,18 +655,23 @@ void AnimatedSprite3D::_draw() {
 	float pixel_size = get_pixel_size();
 
 	Vector2 vertices[4] = {
-
 		(final_rect.position + Vector2(0, final_rect.size.y)) * pixel_size,
 		(final_rect.position + final_rect.size) * pixel_size,
 		(final_rect.position + Vector2(final_rect.size.x, 0)) * pixel_size,
 		final_rect.position * pixel_size,
 
 	};
+
+	// Properly setup UVs for impostor textures (AtlasTexture).
+	RID texture_rid = texture->get_rid();
+	Vector2 src_tsize = Vector2(
+			VS::get_singleton()->texture_get_width(texture_rid),
+			VS::get_singleton()->texture_get_height(texture_rid));
 	Vector2 uvs[4] = {
-		final_src_rect.position / tsize,
-		(final_src_rect.position + Vector2(final_src_rect.size.x, 0)) / tsize,
-		(final_src_rect.position + final_src_rect.size) / tsize,
-		(final_src_rect.position + Vector2(0, final_src_rect.size.y)) / tsize,
+		final_src_rect.position / src_tsize,
+		(final_src_rect.position + Vector2(final_src_rect.size.x, 0)) / src_tsize,
+		(final_src_rect.position + final_src_rect.size) / src_tsize,
+		(final_src_rect.position + Vector2(0, final_src_rect.size.y)) / src_tsize,
 	};
 
 	if (is_flipped_h()) {