223 lines
7.1 KiB
GDScript
223 lines
7.1 KiB
GDScript
extends Spatial
|
|
|
|
func get_mesh(base: Node, mesh_name: String) -> ArrayMesh:
|
|
var queue = [base]
|
|
var mesh: ArrayMesh
|
|
while queue.size() > 0:
|
|
var item = queue[0]
|
|
queue.pop_front()
|
|
if item is MeshInstance && item.name == mesh_name && item.mesh:
|
|
mesh = item.mesh
|
|
break
|
|
for c in item.get_children():
|
|
queue.push_back(c)
|
|
return mesh
|
|
func get_mi(base: Node, mesh_name: String) -> MeshInstance:
|
|
var queue = [base]
|
|
var mi: MeshInstance
|
|
while queue.size() > 0:
|
|
var item = queue[0]
|
|
queue.pop_front()
|
|
if item is MeshInstance && item.name == mesh_name && item.mesh:
|
|
mi = item
|
|
break
|
|
for c in item.get_children():
|
|
queue.push_back(c)
|
|
return mi
|
|
#var modset_body = ModifierSet.new()
|
|
#var modset_top = ModifierSet.new()
|
|
#var modset_panties = ModifierSet.new()
|
|
|
|
var body_mi
|
|
var mesh_id
|
|
var _characters = []
|
|
var slots_female = ["body", "top", "panties"]
|
|
var slots_male = ["body"]
|
|
var helpers = {
|
|
"body": "base",
|
|
"top": "tights",
|
|
"panties": "tights"
|
|
}
|
|
var data_male = {}
|
|
var data_female = {}
|
|
var cha_male
|
|
var cha_female
|
|
func _ready():
|
|
seed(OS.get_unix_time())
|
|
# var base_male = characters.characters[0].instance()
|
|
# var base_female = characters.characters[1].instance()
|
|
# var fd = File.new()
|
|
# fd.open("characters/blendmaps.bin", File.READ);
|
|
# cha_male = CharacterModifierSet.new()
|
|
# cha_female = CharacterModifierSet.new()
|
|
# cha_female.set_base_name("body")
|
|
# cha_male.set_base_name("body")
|
|
# for e in slots_female:
|
|
# data_female[e] = {
|
|
# "mod": cha_female.create(e)
|
|
# }
|
|
# data_female[e].mod.set_uv_index(1)
|
|
# cha_female.set_helper(e, helpers[e])
|
|
# for e in slots_male:
|
|
# data_male[e] = {
|
|
# "mod": cha_male.create(e)
|
|
# }
|
|
# data_male[e].mod.set_uv_index(1)
|
|
# cha_male.set_helper(e, helpers[e])
|
|
# cha_female.add_mesh_scene(base_female)
|
|
# cha_male.add_mesh_scene(base_male)
|
|
# var bcount = fd.get_32()
|
|
# for f in range(bcount):
|
|
# var pos = fd.get_position()
|
|
# cha_female.load(fd)
|
|
# fd.seek(pos)
|
|
# cha_male.load(fd)
|
|
# print("done")
|
|
# # print(data["body"].mod.get_modifier_list())
|
|
# fd.close()
|
|
# cha_male.add_bone_modifier("head_scale", base_male, "head", Transform().scaled(Vector3(1.3, 1.3, 1.3)))
|
|
# cha_female.add_bone_modifier("head_scale", base_female, "head", Transform().scaled(Vector3(1.3, 1.3, 1.3)))
|
|
# cha_male.add_bone_modifier("head_up", base_male, "head", Transform().translated(Vector3(0.0, 0.3, 0.0)))
|
|
# cha_female.add_bone_modifier("head_up", base_female, "head", Transform().translated(Vector3(0.0, 0.3, 0.0)))
|
|
# cha_male.add_bone_modifier("shoulder_l_rot", base_male, "shoulder01_L", Transform().rotated(Vector3(1, 0, 0), 95 * PI / 360.0))
|
|
# cha_female.add_bone_modifier("shoulder_l_rot", base_female, "shoulder01_L", Transform().rotated(Vector3(1, 0, 0), 95 * PI / 360.0))
|
|
# cha_male.add_bone_modifier("height", base_male, "pelvis", Transform().scaled(Vector3(1.2, 1.2, 1.2)))
|
|
# cha_female.add_bone_modifier("height", base_female, "pelvis", Transform().scaled(Vector3(1.2, 1.2, 1.2)))
|
|
# cha_male.add_bone_modifier_symmetry("shoulder", base_male, "shoulder01_L", "shoulder01_R")
|
|
# cha_female.add_bone_modifier_symmetry("shoulder", base_female, "shoulder01_L", "shoulder01_R")
|
|
# var num = 4
|
|
# for k in range(num):
|
|
# if randf() > 0.5:
|
|
# var c = characters.characters[1].instance()
|
|
# add_child(c)
|
|
# c.translation.x = float(k)* 0.9 + randf() * 0.2 - float(num) * 0.9 * 0.5
|
|
# c.translation.z = 5.0
|
|
# c.rotation.y = PI
|
|
# var cdata = {}
|
|
# var mesh_id = cha_female.add_work_mesh_scene(c)
|
|
# cdata.scene = c
|
|
# cdata.mesh_id = mesh_id
|
|
# cdata.cha = cha_female
|
|
# _characters.push_back(cdata)
|
|
# else:
|
|
# var c = characters.characters[0].instance()
|
|
# add_child(c)
|
|
# c.translation.x = float(k) * 0.9 + randf() * 0.2 - float(num) * 0.9 * 0.5
|
|
# c.translation.z = 5.0
|
|
# c.rotation.y = PI
|
|
# var cdata = {}
|
|
# var mesh_id = cha_male.add_work_mesh_scene(c)
|
|
# cdata.scene = c
|
|
# cdata.mesh_id = mesh_id
|
|
# cdata.cha = cha_male
|
|
# _characters.push_back(cdata)
|
|
$Camera.translation.x = -8.0
|
|
$Camera.fov = 50.0
|
|
var change_delay = 0.1
|
|
var mod_id = "neck_width"
|
|
var mod_val = 0.0
|
|
|
|
var char_id = 0
|
|
var char_dist = 1.0
|
|
var timeout = 30.0
|
|
|
|
func _process(delta):
|
|
var mdist = 10.0
|
|
var farthest = -1
|
|
for ie in range(_characters.size()):
|
|
var e = _characters[ie]
|
|
var cpos = e.scene.global_transform.origin
|
|
var campos = $Camera.global_transform.origin
|
|
if mdist > abs(cpos.x - campos.x):
|
|
mdist = abs(cpos.x - campos.x)
|
|
farthest = ie
|
|
# if mdist > 3.0 && farthest >= 0:
|
|
# var cf = _characters[farthest]
|
|
# cf.cha.remove_work_mesh_scene(cf.mesh_id)
|
|
# cf.scene.queue_free()
|
|
# _characters.remove(farthest)
|
|
var c
|
|
var cdata = {}
|
|
if char_dist >= 1.0:
|
|
var can_spawn = true
|
|
for mc in _characters:
|
|
if abs(mc.scene.translation.x - $Camera.translation.x - 3.0) < 1.0:
|
|
can_spawn = false
|
|
break
|
|
if can_spawn:
|
|
var xform : = Transform()
|
|
xform.origin.x = $Camera.translation.x + 3.0
|
|
xform.origin.z = 5.0
|
|
xform.basis = xform.basis.rotated(Vector3(0, 1, 0), PI)
|
|
if randf() > 0.5:
|
|
c = characters.spawn_character(0, xform)
|
|
# c = characters.characters[1].instance()
|
|
# add_child(c)
|
|
# c.translation.x = $Camera.translation.x + 3.0
|
|
# c.translation.z = 5.0
|
|
# c.rotation.y = PI
|
|
# var mesh_id = cha_female.add_work_mesh_scene(c)
|
|
cdata.scene = c
|
|
# cdata.mesh_id = mesh_id
|
|
# cdata.cha = cha_female
|
|
_characters.push_back(cdata)
|
|
else:
|
|
c = characters.spawn_character(1, xform)
|
|
# c = characters.characters[0].instance()
|
|
# add_child(c)
|
|
# c.translation.x = $Camera.translation.x + 3.0
|
|
# c.translation.z = 5.0
|
|
# c.rotation.y = PI
|
|
# var mesh_id = cha_male.add_work_mesh_scene(c)
|
|
cdata.scene = c
|
|
# cdata.mesh_id = mesh_id
|
|
# cdata.cha = cha_male
|
|
_characters.push_back(cdata)
|
|
# var mod_name_list = cha_female.get_modifier_list()
|
|
var mod_name_list = characters.get_modifier_list(c)
|
|
for cset in range(160):
|
|
var _mod_id = mod_name_list[randi() % mod_name_list.size()]
|
|
var _mod_val = randf() - 0.5
|
|
characters.set_modifier_value(cdata.scene, _mod_id, _mod_val)
|
|
# cdata.cha.set_modifier_value(cdata.mesh_id, _mod_id, _mod_val)
|
|
# cdata.cha.modify(cdata.scene)
|
|
characters.update()
|
|
char_dist = 0.0
|
|
$Camera.translation.x += 0.25 * delta
|
|
# if change_delay <= 0:
|
|
# var mod_name_list = cha_female.get_modifier_list()
|
|
# char_id = randi() % _characters.size()
|
|
# mod_id = mod_name_list[randi() % mod_name_list.size()]
|
|
# mod_val = randf() - 0.5
|
|
# change_delay = 0.1
|
|
# else:
|
|
# change_delay -= delta
|
|
# var cmod = _characters[char_id]
|
|
# cmod.cha.set_modifier_value(cmod.mesh_id, mod_id, lerp(cmod.cha.get_modifier_value(cmod.mesh_id, mod_id), mod_val, 0.5))
|
|
# cmod.cha.modify()
|
|
|
|
var remove_ids = []
|
|
for ie in range(_characters.size()):
|
|
var e = _characters[ie]
|
|
if abs($Camera.translation.x + 3.0 - e.scene.translation.x) > 26.0:
|
|
characters.remove(e.scene)
|
|
# e.cha.remove_work_meshes(e.mesh_id)
|
|
# e.scene.queue_free()
|
|
remove_ids.push_back(ie)
|
|
|
|
# remove_ids.sort()
|
|
# remove_ids.invert()
|
|
for e in remove_ids:
|
|
_characters.remove(e)
|
|
char_dist += delta
|
|
timeout -= delta
|
|
if timeout <= 0.0:
|
|
get_tree().quit()
|
|
func _physics_process(delta):
|
|
if $Camera.translation.x >= 8.0:
|
|
$Camera.translation.x -= 16.0
|
|
for cm in _characters:
|
|
cm.scene.translation.x -=16.0
|
|
char_dist = 1.0
|
|
|