Index: Torque2D/T2D/T2DAnimatedSprite.cs
===================================================================
--- Torque2D/T2D/T2DAnimatedSprite.cs	(revision 21)
+++ Torque2D/T2D/T2DAnimatedSprite.cs	(working copy)
@@ -300,6 +300,16 @@
         #region Public properties, operators, constants, and enums
 
         /// <summary>
+        /// Specifies the Sprite's Texture
+        /// </summary>
+        public RenderMaterial Material
+        {
+            // forward access to quad object
+            get { return _quad.Material; }
+            set { _quad.Material = value; _quad.RefillVB = true; }
+        }
+
+        /// <summary>
         /// T2DAnimationData to be used in the animation
         /// </summary>
         public T2DAnimationData AnimationData
@@ -514,6 +524,10 @@
             // replace the current animation data with the one specified
             AnimationData = data;
 
+#if USE_UV_DISPLACEMENT
+            _quad.TextureCoordsDirty = true;
+#endif
+
             // begin the new animation
             PlayAnimation();
         }
Index: TorqueCore/EngineData/effects/SimpleEffect.fx
===================================================================
--- TorqueCore/EngineData/effects/SimpleEffect.fx	(revision 21)
+++ TorqueCore/EngineData/effects/SimpleEffect.fx	(working copy)
@@ -5,15 +5,21 @@
 
 float4x4 worldViewProjection;
 float opacity = 1.0;
+float2 uvDisplacement;
 
 texture baseTexture;
 
 sampler2D baseTextureSampler = sampler_state
 {
 	Texture = <baseTexture>;
-	MipFilter = Linear;
-	MinFilter = Linear;
-	MagFilter = Linear;
+	//MipFilter = Linear;
+	//MinFilter = Linear;
+	//MagFilter = Linear;
+	
+	//20100108 Modified to avoid tilemap filtering issue
+	MipFilter = POINT;
+    MinFilter = POINT;
+    MagFilter = POINT;
 };
 
 sampler CopyTextureSampler = sampler_state
@@ -42,12 +48,24 @@
 {
 	VSOutput output;
 	output.position = mul(input.position, worldViewProjection);
-	output.texCoord = input.texCoord;
+	
+	output.texCoord = input.texCoord;   // this is the old code  
 	output.color = input.color;
 	output.color.a *= opacity;
 	return output;
 }
 
+VSOutput SimpleUVDisplacementVS(VSInput input)
+{
+	VSOutput output;
+	output.position = mul(input.position, worldViewProjection);
+	
+	output.texCoord = input.texCoord + uvDisplacement;   // this is the old code  
+	output.color = input.color;
+	output.color.a *= opacity;
+	return output;
+}
+
 float4 SimplePS(VSOutput input, uniform bool useColor, uniform bool useTexture) : COLOR
 {
     float4 color = 1.0;
@@ -84,6 +102,15 @@
     }
 }
 
+technique TexturedTechniqueWithUVDisplacement
+{
+    pass P0
+    {
+        VertexShader = compile vs_1_1 SimpleUVDisplacementVS();
+        PixelShader  = compile ps_1_1 SimplePS(false, true);
+    }
+}
+
 technique ColorTextureBlendTechnique
 {
     pass P0
Index: TorqueCore/Materials/SimpleMaterial.cs
===================================================================
--- TorqueCore/Materials/SimpleMaterial.cs	(revision 21)
+++ TorqueCore/Materials/SimpleMaterial.cs	(working copy)
@@ -11,6 +11,9 @@
 using GarageGames.Torque.SceneGraph;
 using GarageGames.Torque.RenderManager;
 
+#if USE_UV_DISPLACEMENT
+using Microsoft.Xna.Framework;
+#endif
 using Microsoft.Xna.Framework.Graphics;
 
 namespace GarageGames.Torque.Materials
@@ -97,7 +100,6 @@
                 return _texture;
             }
         }
-
         #endregion
 
         //======================================================
@@ -137,7 +139,11 @@
                 if (_isColorBlended)
                     return "ColorTextureBlendTechnique";
 
+#if USE_UV_DISPLACEMENT
+                return "TexturedTechniqueWithUVDisplacement";
+#else
                 return "TexturedTechnique";
+#endif
             }
 
             return "ColoredTechnique";
@@ -159,6 +165,10 @@
 
             if (IsTranslucent)
                 EffectManager.SetParameter(_opacityParameter, renderInstance.Opacity * _opacity);
+
+#if USE_UV_DISPLACEMENT
+            EffectManager.SetParameter(_uvDisplacementParameter, renderInstance.UVDisplacement);
+#endif
         }
 
         protected override void _LoadParameters()
@@ -168,6 +178,10 @@
             _worldViewProjectionParameter = EffectManager.GetParameter(Effect, "worldViewProjection");
             _baseTextureParameter = EffectManager.GetParameter(Effect, "baseTexture");
             _opacityParameter = EffectManager.GetParameter(Effect, "opacity");
+
+#if USE_UV_DISPLACEMENT
+            _uvDisplacementParameter = EffectManager.GetParameter(Effect, "uvDisplacement");
+#endif
         }
 
         protected override void _ClearParameters()
@@ -176,6 +190,9 @@
             _baseTextureParameter = null;
             _opacityParameter = null;
 
+#if USE_UV_DISPLACEMENT
+            _uvDisplacementParameter = null;
+#endif
             base._ClearParameters();
         }
 
@@ -194,6 +211,10 @@
         EffectParameter _baseTextureParameter;
         EffectParameter _opacityParameter;
 
+#if USE_UV_DISPLACEMENT
+        EffectParameter _uvDisplacementParameter;
+#endif
+
         #endregion
     }
 }
Index: TorqueCore/RenderManager/RenderInstance.cs
===================================================================
--- TorqueCore/RenderManager/RenderInstance.cs	(revision 21)
+++ TorqueCore/RenderManager/RenderInstance.cs	(working copy)
@@ -145,6 +145,10 @@
         /// </summary>
         public bool IsSortPointSet = false;
 
+#if USE_UV_DISPLACEMENT
+        public Vector2 UVDisplacement;
+#endif
+
         internal int MaterialSortKey;
         internal int GeometrySortKey;
         internal bool IsReset = true;
@@ -178,6 +182,10 @@
             SortPoint = src.SortPoint;
             IsSortPointSet = src.IsSortPointSet;
             Opacity = src.Opacity;
+
+#if USE_UV_DISPLACEMENT
+            UVDisplacement = src.UVDisplacement;
+#endif
         }
 
         /// <summary>
@@ -206,6 +214,10 @@
             MaterialSortKey = 0;
             GeometrySortKey = 0;
             IsReset = true;
+
+#if USE_UV_DISPLACEMENT
+            UVDisplacement = Vector2.Zero;
+#endif
         }
 
         #endregion
