This commit is contained in:
Spencer Killen 2024-01-03 14:48:01 -07:00
parent cc792cfb1b
commit 5d3b7051a4
Signed by: sjkillen
GPG Key ID: 3AF3117BA6FBB75B
2 changed files with 27 additions and 73 deletions

View File

@ -10,87 +10,41 @@
@tool @tool
extends SceneTree extends SceneTree
var bundle_name := "bundle.res" var bundle_name := "vertex_animations.scn"
var VertexAnimation = preload("VertexAnimation.gd")
var VertexAnimations = preload("VertexAnimations.gd")
func _init(): func _init():
var script := GDScript.new()
var basenames := OS.get_cmdline_user_args() var basenames := OS.get_cmdline_user_args()
script.source_code = make_all_headers(basenames, true)
script.reload()
var res: Resource = script.new()
res.basenames = basenames var animations = VertexAnimations.new()
animations.name = "VertexAnimations"
for basename in basenames: for basename in basenames:
add_images(res, basename) animations.animations.append(add_animation(basename))
var shader := ShaderInclude.new()
for basename in basenames:
shader.code += make_shader(basename)
script.source_code = make_all_headers(basenames, false)
# Cannot use built-in scripts
# See: https://github.com/godotengine/godot/issues/85876
script.resource_path = "res://bundle/bundle.gd"
ResourceSaver.save(script, "res://bundle/bundle.gd")
res.shader = shader
res.shader.resource_name = "shader"
shader.resource_path = "res://bundle/bundle.gdshaderinc"
ResourceSaver.save(shader, "res://bundle/bundle.gdshaderinc", ResourceSaver.FLAG_CHANGE_PATH)
ResourceSaver.save(res, "res://bundle/" + bundle_name, ResourceSaver.FLAG_CHANGE_PATH)
var packed = PackedScene.new()
packed.pack(animations)
ResourceSaver.save(packed, "res://" + bundle_name, ResourceSaver.FLAG_CHANGE_PATH)
# Was never added to the scene tree, must manually free
animations.free()
quit() quit()
func make_all_shaders(basenames): func add_animation(basename: String):
for basename in basenames: var animation_info: Dictionary = JSON.parse_string(FileAccess.open(basename + ".json", FileAccess.READ).get_as_text())
pass var animation = VertexAnimation.new()
animation.name = basename
func make_shader(basename: String): animation.start_frame = animation_info["frame_start"]
var code = "\nuniform sampler2D image_" + basename + ": repeat_disable;\n" animation.end_frame = animation_info["frame_end"]
code += "uniform sampler2D image_mask_" + basename + ": repeat_disable;\n" animation.fps = animation_info["fps"]
code += "uniform bool enabled_" + basename + " = false;\n"
code += "uniform int start_time_" + basename + ";\n"
return code
func make_all_headers(basenames, include_setters):
var header := "extends Resource\n"
header += "@export var basenames: PackedStringArray\n"
header += "@export var shader: ShaderInclude\n"
for basename in basenames:
header += make_header(basename)
if include_setters:
header += make_setters(basename)
return header + attach_code(basenames)
func attach_code(basenames):
var code := "\nfunc attach(mat: ShaderMaterial):\n"
for basename in basenames:
code += " mat.set_shader_parameter('image_"+basename+"', image_"+basename+")\n"
code += " mat.set_shader_parameter('image_mask_"+basename+"', image_mask_"+basename+")\n"
return code
func make_header(basename: String):
var header := "@export var image_" + basename + ": Texture2D\n"
header += "@export var image_mask_" + basename + ": Texture2D\n"
return header
func make_setters(basename: String):
var body := """
func set_image_"""+basename+"""(image):\n image_""" + basename + """ = image
func set_image_mask_"""+basename+"""(image):\n image_mask_""" + basename + """ = image
"""
return body
func add_images(res, basename: String):
var img := Image.new() var img := Image.new()
img.load(basename + ".exr") img.load(basename + ".exr")
var tex := ImageTexture.create_from_image(img) animation.data = ImageTexture.create_from_image(img)
res.call("set_image_"+basename, tex)
img = Image.new() img = Image.new()
img.load(basename + "_mask.exr") img.load(basename + "_mask.exr")
tex = ImageTexture.create_from_image(img) animation.mask = ImageTexture.create_from_image(img)
res.call("set_image_mask_"+basename, tex)
return animation

View File

@ -108,7 +108,7 @@ fn write_point_image(
} }
// Not used because blender always starts frame frame zero so this info is useless // Not used because blender always starts frame frame zero so this info is useless
fn write_animation_info(filename: &str, info: AnimationInfo) -> Result<(), Box<dyn Error>> { fn _write_animation_info(filename: &str, info: AnimationInfo) -> Result<(), Box<dyn Error>> {
let data = format!( let data = format!(
"{{ \"total_frames\": {}, \"total_points\": {}, \"start_frame\": {}, \"end_frame\": {}, \"fps\": {} }}\n", "{{ \"total_frames\": {}, \"total_points\": {}, \"start_frame\": {}, \"end_frame\": {}, \"fps\": {} }}\n",
info.total_frames, info.total_points, info.start_frame, info.end_frame, info.fps info.total_frames, info.total_points, info.start_frame, info.end_frame, info.fps
@ -138,6 +138,7 @@ impl PointState {
} }
} }
fn main() { fn main() {
let basename = std::env::args() let basename = std::env::args()
.nth(1) .nth(1)
@ -223,5 +224,4 @@ fn main() {
"Total {} varying points of {} total points", "Total {} varying points of {} total points",
total_varying, info.total_points total_varying, info.total_points
); );
println!("{:?}", info);
} }