258 lines
7.2 KiB
GDScript
258 lines
7.2 KiB
GDScript
extends KinematicBody
|
|
|
|
const MOTION_INTERPOLATE_SPEED = 10
|
|
|
|
var orientation = Transform()
|
|
var root_motion = Transform()
|
|
var fixup = Transform()
|
|
var motion = Vector2()
|
|
var motion_target = Vector2()
|
|
var velocity = Vector3()
|
|
var disable_gravity = false
|
|
const p1 = "parameters/main/playback"
|
|
const p2 = "parameters/main/Motion/playback"
|
|
|
|
|
|
func _ready():
|
|
# var _ap = $AnimationTree.get_node($AnimationTree.get_animation_player())
|
|
orientation = global_transform
|
|
orientation.origin = Vector3()
|
|
add_to_group("characters")
|
|
do_ungrab()
|
|
# feet_ik_init()
|
|
|
|
|
|
func _physics_process(delta):
|
|
# motion = motion.linear_interpolate(motion_target, MOTION_INTERPOLATE_SPEED * delta)
|
|
assert(has_meta("grabbed"))
|
|
var in_smart_obj = get_meta("smart_object")
|
|
if get_meta("grabbed"):
|
|
orientation.basis = get_parent().global_transform.basis
|
|
root_motion = $AnimationTree.get_root_motion_transform()
|
|
orientation *= root_motion
|
|
var h_velocity = orientation.origin / delta
|
|
velocity.x = h_velocity.x
|
|
velocity.z = h_velocity.z
|
|
velocity.y = h_velocity.y
|
|
if !get_meta("grabbed") && !in_smart_obj && !disable_gravity:
|
|
velocity.y += -9.8
|
|
velocity = move_and_slide(velocity,Vector3(0,1,0))
|
|
orientation.origin = Vector3()
|
|
fixup.origin = Vector3()
|
|
orientation *= Transform().interpolate_with(fixup, delta)
|
|
orientation = orientation.orthonormalized()
|
|
global_transform.basis = orientation.basis
|
|
if get_meta("grabbed"):
|
|
global_transform.origin = get_parent().global_transform.origin
|
|
# global_transform = get_parent().global_transform
|
|
if attacking >= 0.0:
|
|
attacking -= delta
|
|
rpg.update_stats(self)
|
|
# feet_ik()
|
|
var skel
|
|
func get_skeleton():
|
|
if skel:
|
|
return get_node(skel)
|
|
var queue = [self]
|
|
while queue.size() > 0:
|
|
var item = queue.pop_front()
|
|
if item is Skeleton:
|
|
skel = get_path_to(item)
|
|
return get_node(skel)
|
|
for k in item.get_children():
|
|
queue.push_back(k)
|
|
func get_anim_player():
|
|
return $male_2018/male_g_2018/AnimationPlayer
|
|
var attachment_start
|
|
var attachment_end
|
|
var mod_p = false
|
|
func get_front_neck_target():
|
|
if !mod_p:
|
|
$male_2018/male_g_2018/neck02BoneAttachment/grab_neck_front.transform.basis = Basis()
|
|
mod_p = true
|
|
return $male_2018/male_g_2018/neck02BoneAttachment/grab_neck_front
|
|
func add_attachment(bname, xform):
|
|
var ba: BoneAttachment = BoneAttachment.new()
|
|
ba.bone_name = bname
|
|
var sk = get_skeleton()
|
|
sk.add_child(ba)
|
|
var on1 = Spatial.new()
|
|
ba.add_child(on1)
|
|
var on2 = Spatial.new()
|
|
ba.add_child(on2)
|
|
on1.transform = Transform()
|
|
# on1.global_transform.basis = Basis()
|
|
on2.transform = xform
|
|
# on2.rotate_y(PI)
|
|
attachment_start = ba
|
|
attachment_end = on2
|
|
return on2
|
|
|
|
static func calc_offset(c2, bone2):
|
|
var skel2 = c2.get_skeleton()
|
|
var id2 = skel2.find_bone(bone2)
|
|
assert(skel2 != null)
|
|
assert(id2 >= 0)
|
|
var offt2 = skel2.get_bone_global_pose(id2).origin
|
|
var offset = Vector3(-offt2.x, -offt2.y, -offt2.z)
|
|
# print("offset: ", offset)
|
|
return offset
|
|
|
|
var foot_ik_l = {
|
|
"foot": "foot_L",
|
|
"bone1": "upperleg02_L",
|
|
"bone2": "lowerleg01_L",
|
|
"h": -0.3
|
|
}
|
|
|
|
var foot_ik_r = {
|
|
"foot": "foot_R",
|
|
"bone1": "upperleg02_R",
|
|
"bone2": "lowerleg01_R",
|
|
"h": -0.3
|
|
}
|
|
func foot_ik_reset(sk: Skeleton, data: Dictionary, obj: Spatial):
|
|
var bone1 = sk.fine_bone(data.bone1)
|
|
var bone2 = sk.fine_bone(data.bone2)
|
|
var foot = sk.find_bone(data.foot)
|
|
assert(foot >= 0 && bone1 >= 0 && bone2 >= 0)
|
|
var xf = sk.get_bone_global_pose(foot)
|
|
var xf1 = sk.get_bone_global_pose(bone1)
|
|
var xf2 = sk.get_bone_global_pose(bone2)
|
|
var l1 = xf1.origin.distance_to(xf2.origin)
|
|
var l2 = xf2.origin.distance_to(xf.origin)
|
|
var lt = xf1.origin.distance_squared_to(xf.origin)
|
|
var cosa = l1 * (l1 + l2 * l2 + lt) / (2 * l1 * l2)
|
|
var v1 = xf2.origin - xf1.origin
|
|
var v2 = xf.origin - xf1.origin
|
|
var rot_axis = v1.cross(v2).normalized()
|
|
var space_state = get_world().direct_space_state
|
|
var xform = global_transform
|
|
var f = (xform * xf).origin
|
|
var result = space_state.intersect_ray(f, f + Vector3(0, data.h, 0), [self], 0xffff)
|
|
if result.has("position"):
|
|
print(data.foot, result.position)
|
|
obj.global_transform.origin = result.position
|
|
|
|
func feet_ik():
|
|
var sk: Skeleton = get_skeleton()
|
|
var foot1 = sk.find_bone("foot_L")
|
|
var foot2 = sk.find_bone("foot_R")
|
|
assert(foot1 >= 0 && foot2 >= 0)
|
|
var xf1 = sk.get_bone_global_pose(foot1)
|
|
var xf2 = sk.get_bone_global_pose(foot2)
|
|
var space_state = get_world().direct_space_state
|
|
var xform = global_transform
|
|
var f1 = (xform * xf1).origin
|
|
var f2 = (xform * xf2).origin
|
|
var result1 = space_state.intersect_ray(f1, f1 + Vector3(0, -0.3, 0), [self], 0xffff)
|
|
var result2 = space_state.intersect_ray(f2, f2 + Vector3(0, -0.3, 0), [self], 0xffff)
|
|
if result1.has("position"):
|
|
print("L: ", result1.position)
|
|
foot_ik_target_l.global_transform.origin = result1.position
|
|
if result2.has("position"):
|
|
print("R: ", result2.position)
|
|
foot_ik_target_r.global_transform.origin = result2.position
|
|
var foot_ik_target_l
|
|
var foot_ik_target_r
|
|
func feet_ik_init():
|
|
var s1 = Spatial.new()
|
|
var s2 = Spatial.new()
|
|
var sk: Skeleton = get_skeleton()
|
|
var foot1 = sk.find_bone("foot_L")
|
|
var foot2 = sk.find_bone("foot_R")
|
|
var xf1 = sk.get_bone_global_pose(foot1)
|
|
var xf2 = sk.get_bone_global_pose(foot2)
|
|
s1.transform = xf1
|
|
s2.transform = xf2
|
|
foot_ik_target_l = s1
|
|
foot_ik_target_r = s2
|
|
# var ik1 : = SkeletonIK.new()
|
|
# ik1.root_bone = "upperleg02_L"
|
|
# ik1.tip_bone = "foot_L"
|
|
# ik1.target_node = get_path_to(foot_ik_target_l)
|
|
# ik1.interpolation = 0.1
|
|
# sk.add_child(ik1)
|
|
# var ik2 = SkeletonIK.new()
|
|
# ik2.root_bone = "upperleg02_R"
|
|
# ik2.tip_bone = "foot_R"
|
|
# ik2.target_node = get_path_to(foot_ik_target_r)
|
|
# ik2.interpolation = 0.1
|
|
# sk.add_child(ik2)
|
|
# ik1.start(true)
|
|
# ik2.start(true)
|
|
var act = {
|
|
"stop":[
|
|
["travel", p1, "Motion"],
|
|
["travel", p2, "stand"],
|
|
],
|
|
"walk":[
|
|
["travel", p1, "Motion"],
|
|
["travel", p2, "walk"],
|
|
],
|
|
"grabbed":[
|
|
["set", "parameters/free_grabbed/current", 1],
|
|
["set", "parameters/grabbed_seek/seek_position", 0.0]
|
|
],
|
|
"ungrabbed":[
|
|
["set", "parameters/free_grabbed/current", 0]
|
|
],
|
|
"grab":[
|
|
["set", "parameters/grab/blend_amount", 1.0],
|
|
["set", "parameters/grab_seek/seek_position", 0.0]
|
|
],
|
|
"grab_attack1_on":[
|
|
["set", "parameters/grab_attack/active", true],
|
|
],
|
|
"grabbed_attacked1_on":[
|
|
["set", "parameters/grabbed_attacked/active", true],
|
|
],
|
|
"ungrab":[
|
|
["set", "parameters/grab/blend_amount", 0.0]
|
|
],
|
|
"throw_projectile":[
|
|
["set", "parameters/throw/active", true]
|
|
]
|
|
}
|
|
func smart_obj(sm):
|
|
for k in sm:
|
|
if k[0] == "travel":
|
|
$AnimationTree[k[1]].travel(k[2])
|
|
if k[0] == "set":
|
|
$AnimationTree[k[1]] = k[2]
|
|
func do_stop():
|
|
# if name != "player":
|
|
# print(name, " stop")
|
|
smart_obj(act.stop)
|
|
func do_walk():
|
|
# if name != "player":
|
|
# print(name, "walk")
|
|
smart_obj(act.walk)
|
|
func set_walk_speed(x):
|
|
var s = [["set", "parameters/main/Motion/walk/walk_speed/scale", x]]
|
|
smart_obj(s)
|
|
var grab_bone = "grabber_L"
|
|
func do_grab():
|
|
smart_obj(act.grab)
|
|
var attacking = 0.0
|
|
func do_attack():
|
|
if attacking > 0.0:
|
|
return
|
|
if get_meta("grabbing"):
|
|
smart_obj(act.grab_attack1_on)
|
|
var s = grabbing.get_grabbed(self)
|
|
s.do_attacked()
|
|
rpg.melee_attack(self, s)
|
|
attacking += 1.0
|
|
else:
|
|
smart_obj(act.throw_projectile)
|
|
func do_attacked():
|
|
if get_meta("grabbed"):
|
|
smart_obj(act.grabbed_attacked1_on)
|
|
func do_ungrab():
|
|
smart_obj(act.ungrab)
|
|
func do_grabbed():
|
|
smart_obj(act.grabbed)
|
|
func do_ungrabbed():
|
|
smart_obj(act.ungrabbed)
|