material-maker/material_maker/tools/map_renderer/map_renderer.gd

87 lines
3.8 KiB
GDScript

extends Viewport
export(ShaderMaterial) var mesh_normal_material
export(ShaderMaterial) var mesh_tangent_material
export(ShaderMaterial) var inv_uv_material
export(ShaderMaterial) var white_material
export(ShaderMaterial) var curvature_material
export(ShaderMaterial) var ao_material
export(ShaderMaterial) var denoise_pass
export(ShaderMaterial) var dilate_pass1
export(ShaderMaterial) var dilate_pass2
export(ShaderMaterial) var seams_pass1
export(ShaderMaterial) var seams_pass2
func _ready():
pass
func gen(mesh: Mesh, map : String, renderer_method : String, arguments : Array, map_size = 512) -> void:
var bake_passes = {
mesh_normal = { first=mesh_normal_material, second=dilate_pass1, third=dilate_pass2 },
mesh_tangent = { first=mesh_tangent_material, second=dilate_pass1, third=dilate_pass2 },
inv_uv = { first=inv_uv_material, second=dilate_pass1, third=dilate_pass2 },
curvature = { first=curvature_material, second=dilate_pass1, third=dilate_pass2 },
thickness = { first=ao_material, second=dilate_pass1, third=dilate_pass2, map_name="Thickness" },
ao = { first=ao_material, second=dilate_pass1, third=dilate_pass2, map_name="Ambient Occlusion" },
seams = { first=white_material, second=seams_pass1, third=seams_pass2 }
}
var passes = bake_passes[map]
size = Vector2(map_size, map_size)
if map == "curvature":
$MeshInstance.mesh = $CurvatureGenerator.generate(mesh)
else:
$MeshInstance.mesh = mesh
$MeshInstance.set_surface_material(0, passes.first)
var aabb = $MeshInstance.get_aabb()
if map in ["ao", "thickness"]:
var main_window = get_node("/root/MainWindow")
var ray_count = main_window.get_config("bake_ray_count")
var ao_ray_dist = main_window.get_config("bake_ao_ray_dist")
var denoise_radius = main_window.get_config("bake_denoise_radius")
var progress_dialog = preload("res://material_maker/windows/progress_window/progress_window.tscn").instance()
progress_dialog.set_text("Generating "+passes.map_name+" map")
progress_dialog.set_progress(0)
main_window.add_child(progress_dialog)
var ray_distance = ao_ray_dist
if map == "thickness":
ray_distance = -aabb.size.length()
var bvh_data: ImageTexture = $BVHGenerator.generate(mesh)
ao_material.set_shader_param("bvh_data", bvh_data)
ao_material.set_shader_param("max_dist", ray_distance)
for i in ray_count:
progress_dialog.set_progress(float(i)/ray_count)
ao_material.set_shader_param("iteration", i+1)
render_target_update_mode = Viewport.UPDATE_ONCE
yield(get_tree(), "idle_frame")
$MeshInstance.set_surface_material(0, denoise_pass)
denoise_pass.set_shader_param("size", map_size)
denoise_pass.set_shader_param("radius", denoise_radius)
render_target_update_mode = Viewport.UPDATE_ONCE
yield(get_tree(), "idle_frame")
yield(get_tree(), "idle_frame")
progress_dialog.queue_free()
else:
inv_uv_material.set_shader_param("position", aabb.position)
inv_uv_material.set_shader_param("size", aabb.size)
render_target_update_mode = Viewport.UPDATE_ONCE
yield(get_tree(), "idle_frame")
yield(get_tree(), "idle_frame")
passes.second.set_shader_param("tex", get_texture())
passes.second.set_shader_param("size", map_size)
var renderer = mm_renderer.request(self)
while renderer is GDScriptFunctionState:
renderer = yield(renderer, "completed")
renderer = renderer.render_material(self, passes.second, map_size)
while renderer is GDScriptFunctionState:
renderer = yield(renderer, "completed")
var t : ImageTexture = ImageTexture.new()
renderer.copy_to_texture(t)
passes.third.set_shader_param("tex", t)
passes.third.set_shader_param("size", map_size)
renderer = renderer.render_material(self, passes.third, map_size)
while renderer is GDScriptFunctionState:
renderer = yield(renderer, "completed")
renderer.callv(renderer_method, arguments)
renderer.release(self)