I have a predefined shader material resource stored on disk. in EditorScenePostImport script I just get each material assigned to a mesh, assign a duplicate of the shader material instead, and copy the values of relevant properties one by one.
@tool
extends EditorScenePostImport
func _post_import(scene):
# get all mesh instances
var mesh_instances = scene.find_children("*", "MeshInstance3D", true)
# get all meshes
var meshes = {}
for mi in mesh_instances:
if not mi.mesh:
continue
meshes[mi.mesh] = true
# get all materials
var materials = {}
for m: Mesh in meshes:
for i in m.get_surface_count():
var mat: StandardMaterial3D= m.surface_get_material(i)
if not mat:
continue
var mat_new: ShaderMaterial = make_shader_material(mat)
m.surface_set_material(i, mat_new)
materials[mat] = true
return scene
func make_shader_material(orig: StandardMaterial3D) -> ShaderMaterial:
var m: ShaderMaterial = preload("res://override.material").duplicate(true)
m.set_shader_parameter("albedo", orig.albedo_color)
# etc...
return m