extends SceneTree func _initialize() -> void: call_deferred("run") func run() -> void: for id: String in ["shotgun","awp"]: var source := (load("res://assets/styloo/%s.glb" % id) as PackedScene).instantiate() as Node3D root.add_child(source) source.rotation.y = PI/2 var bounds := AABB() var first := true for mesh: MeshInstance3D in source.find_children("*","MeshInstance3D",true,false): var box := mesh.global_transform*mesh.mesh.get_aabb() bounds = box if first else bounds.merge(box) first = false var length: float = {"shotgun":0.88,"awp":1.12}[id] var scale_factor := length/bounds.size.z var rear := 0.30 if length > 0.5 else 0.07 var shift := Vector3(0,-bounds.end.y*scale_factor+0.065,rear-bounds.end.z*scale_factor) var model := Node3D.new() for part: String in ["Frame","Magazine","Bolt"]: var group := Node3D.new() group.name = part model.add_child(group) group.owner = model var receiver := Node3D.new() receiver.name = "receiver" model.get_node("Frame").add_child(receiver) receiver.owner = model for mesh: MeshInstance3D in source.find_children("*","MeshInstance3D",true,false): var copy := MeshInstance3D.new() copy.name = mesh.name copy.mesh = mesh.mesh copy.transform = Transform3D(Basis.IDENTITY.scaled(Vector3.ONE*scale_factor),shift)*mesh.global_transform var group: Node = model.get_node("Magazine") if "magazine" in str(mesh.name) else (model.get_node("Bolt") if mesh.name == "shotgunpomp" else receiver) group.add_child(copy) copy.owner = model for surface in mesh.mesh.get_surface_count(): var material := mesh.get_active_material(surface).duplicate() as StandardMaterial3D material.texture_filter = BaseMaterial3D.TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC material.roughness = 1.0 material.metallic = 0.0 var path := "res://assets/styloo/%s_%s_%s.tres" % [id,mesh.name,surface] ResourceSaver.save(material,path) copy.set_surface_override_material(surface,load(path)) if mesh.mesh.get_surface_count() == 1: copy.material_override = load(path) var muzzle := Marker3D.new() muzzle.name = "Muzzle" muzzle.position = Vector3(0,0.016,rear-length) model.add_child(muzzle) muzzle.owner = model var packed := PackedScene.new() packed.pack(model) ResourceSaver.save(packed,"res://scenes/weapons/styloo_%s.tscn" % id) model.free() source.free() quit()