is this right?
Sprite3D
@tool
extends Sprite3D
var time : float
## Seconds per frame.
@export_range(0.0, 1.0, 0.01, &"or_greater") var speed : float = 0.1
func _process(delta: float) -> void:
time += delta
if time >= speed:
frame = wrapi(frame + 1, 0, (hframes * vframes))
time = 0.0
MeshInstance3D
script:
@tool
extends MeshInstance3D
var frame : int = 0 :
set(value):
material.set_shader_parameter("frame", Vector2i(value % frames.x, value / frames.x))
frame = value
var total_frames : int
var time : float = 0.0
var material : ShaderMaterial
## seconds per frame.
@export_range(0.0, 1.0, 0.1, &"or_greater") var speed : float = 0.1
## don't make either axis 0
@export var frames := Vector2i.ONE :
set(value):
var a := Vector2i(clampi(value.x, 1, 512), clampi(value.y, 1, 512))
total_frames = a.x * a.y
material.set_shader_parameter("frames", a)
frames = a
func _ready() -> void:
material = get_active_material(0)
func _process(delta: float) -> void:
time += delta
if time >= speed:
frame = wrapi(frame + 1, 0, total_frames)
time = 0.0
example shader:
shader_type spatial;
uniform sampler2D color;
uniform ivec2 frame;
uniform ivec2 frames;
void fragment() {
vec2 frame_size = vec2(1.0) / vec2(frames);
vec2 uv = (UV * frame_size) + (frame_size * vec2(frame));
ALBEDO = texture(color, uv).rgb;
ALPHA = texture(color, uv).a;
}