Hi,
Seems that it happens because when you change rect property Godot will use rect size as new "texture size" and if you set Hframes then it will calculate frame size by dividing your rect size by frames count.
That's probably because tiling by making rectangle bigger (bigger than texture size) rely on simple OpenGL (for instance, but I guess DirectX, Vulkan etc. use the same) texture repeat.
I don't know if that is helpful, but here is some shader I wrote to achieve what you wanted probably:
shader_type canvas_item;
uniform vec2 tilesCount; //Tiles count in X and Y
uniform sampler2D frames; //Texture to use
uniform vec2 framesSize; //Size of above texture (in pixels)
uniform vec4 framesRect; //Rect defining first frame of animation
uniform int maxFrames; //All frames that are available (horizontal only!)
void vertex()
{
UV = UV * tilesCount;
}
void fragment()
{
float frame = float(int(TIME * 4.0) % maxFrames);
vec4 transformedRect = vec4(framesRect.x / framesSize.x, framesRect.y / framesSize.y, framesRect.z / framesSize.x, framesRect.w / framesSize.y);
vec2 currentPos = vec2(0.0);
currentPos.x = frame * transformedRect.z + transformedRect.x + fract(UV.x) * transformedRect.z;
currentPos.y = frame * transformedRect.w + transformedRect.y + fract(UV.y) * transformedRect.w;
COLOR = texture(frames, currentPos);
}
Note: It support only horizontal frames, but changing to support also vertical shouldn't be hard
And here some effect I got after some setup with material:
