57 lines
2.3 KiB
GDScript
57 lines
2.3 KiB
GDScript
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()
|