Files
academy2-game/autoload/orchestration.gd
Segey Lapin f62e7fa720 Update
2021-12-24 23:56:10 +03:00

197 lines
7.3 KiB
GDScript3

extends Node
export var grab_ik_curve: Curve
export var grab_ik_curve_multiplier: float = 0.14
export var cinematic_cam: PackedScene
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
var cinematic_camera
func _ready():
pass # Replace with function body.
var active_states = []
var locked_actors = {}
class Grabbing:
signal enable_cinematic_camera(where, look)
signal update_cinematic_camera(where, look)
signal disable_cinematic_camera
signal end_stage
var actor_master: KinematicBody
var actor_slave: KinematicBody
var slave_space: RID
var master_space: RID
var finished = false
var follow_node
var follow_node_full
var state = 0
var ik: SkeletonIK
var ik_curve_pos = 0.0
var grab_ik_curve: Curve
var curve_delta_mul: float = 0.16
func start(act_master: KinematicBody, act_slave: KinematicBody, curve: Curve, delta_mul: float):
actor_master = act_master
actor_slave = act_slave
grab_ik_curve = curve
curve_delta_mul = delta_mul
var skel_master = actor_master.get_meta("skeleton")
assert(skel_master is Skeleton)
ik = SkeletonIK.new()
ik.root_bone = "J_Bip_R_UpperArm"
ik.tip_bone = "J_Bip_R_Hand"
skel_master.add_child(ik)
# actor_master.set_meta("orchestrated", true)
# actor_slave.set_meta("orchestrated", true)
# characters.animation_node_travel(actor_master, "grab")
# characters.animation_node_travel(actor_slave, "grabbed")
reset_character(actor_master)
reset_character(actor_slave)
var mx = actor_master.global_transform
var sx = actor_slave.global_transform
var m = mx.interpolate_with(sx, 0.5)
var cam_where = m.origin + actor_master.global_transform.basis[0] * 1.1
cam_where += Vector3.UP * 2.0
var cam_to = m.origin + Vector3.UP * 1.4
emit_signal("enable_cinematic_camera", cam_where, cam_to)
func reset_character(b):
b.remove_meta("cmdqueue")
b.remove_meta("cmdq_walk")
b.remove_meta("climb")
characters.animation_node_travel(b, "locomotion")
characters.set_walk_speed(b, 0.0, 0)
func update(delta):
var mx = actor_master.global_transform
var sx = actor_slave.global_transform
var m = mx.interpolate_with(sx, 0.5)
var cam_where = m.origin + actor_master.global_transform.basis[0] * 1.1
cam_where += Vector3.UP * 2.0
var cam_to = m.origin + Vector3.UP * 1.4
emit_signal("update_cinematic_camera", cam_where, cam_to)
func physics_update(delta):
var offt = actor_slave.global_transform.origin - actor_slave.global_transform.basis[2] * 0.45
match state:
0:
reset_character(actor_master)
reset_character(actor_slave)
actor_master.set_meta("orchestrated", true)
actor_slave.set_meta("orchestrated", true)
actor_master.add_collision_exception_with(actor_slave)
actor_slave.add_collision_exception_with(actor_master)
slave_space = PhysicsServer.body_get_space(actor_slave.get_rid())
PhysicsServer.body_set_space(actor_slave.get_rid(), RID())
master_space = PhysicsServer.body_get_space(actor_master.get_rid())
PhysicsServer.body_set_space(actor_master.get_rid(), RID())
state = 1
1:
# actor_slave.get_parent().remove_child(actor_slave)
# actor_master.add_child(actor_slave)
var skel_master = actor_master.get_meta("skeleton")
assert(skel_master is Skeleton)
var skel_slave = actor_slave.get_meta("skeleton")
assert(skel_slave is Skeleton)
follow_node_full = skel_slave.get_node("neck/marker_neck_grab")
follow_node = Position3D.new()
skel_master.add_child(follow_node)
follow_node.global_transform = follow_node_full.global_transform
ik.target_node = ik.get_path_to(follow_node)
ik.override_tip_basis = true
ik.interpolation = 0.0
ik_curve_pos = 0.0
actor_master.global_transform = Transform(actor_slave.global_transform.basis.rotated(Vector3.UP, PI), offt)
var master_xform = actor_master.global_transform.looking_at(actor_slave.global_transform.origin, Vector3.UP)
var slave_xform = actor_slave.global_transform.looking_at(actor_master.global_transform.origin, Vector3.UP)
var orientation = Transform(actor_slave.global_transform.basis, Vector3())
actor_slave.set_meta("orientation", orientation)
var master_orientation = Transform(actor_master.global_transform.basis, Vector3())
actor_master.set_meta("orientation", master_orientation)
characters.animation_node_travel(actor_master, "grab")
characters.animation_node_travel(actor_slave, "grabbed")
ik.start(true)
state = 3
3:
ik.interpolation = grab_ik_curve.interpolate_baked(ik_curve_pos)
ik_curve_pos += delta * curve_delta_mul
follow_node.global_transform = follow_node_full.global_transform
ik.start(true)
if ik.interpolation >= 1.0:
state = 4
4:
var m_anim: AnimationTree = actor_master.get_meta("animation_tree")
var m_state: AnimationNodeStateMachinePlayback = m_anim["parameters/state/playback"]
var m_l = m_state.get_current_length()
var m_p = m_state.get_current_play_position()
var s_anim: AnimationTree = actor_slave.get_meta("animation_tree")
var s_state: AnimationNodeStateMachinePlayback = s_anim["parameters/state/playback"]
var s_l = m_state.get_current_length()
var s_p = m_state.get_current_play_position()
if m_p >= m_l && s_p >= s_l:
state = 5
# 2:
# actor_slave.global_transform = Transform(actor_master.global_transform.basis.rotated(Vector3.UP, PI), offt)
# var orientation = Transform(actor_slave.global_transform.basis, Vector3())
# actor_slave.set_meta("orientation", orientation)
# state = 3
# 3:
# actor_slave.global_transform = Transform(actor_master.global_transform.basis.rotated(Vector3.UP, PI), offt)
# var orientation = Transform(actor_slave.global_transform.basis, Vector3())
# actor_slave.set_meta("orientation", orientation)
# state = 4
func finish():
pass
func enable_camera(where, to):
var current_cam = get_viewport().get_camera()
var player = current_cam.get_meta("player")
if !cinematic_camera:
cinematic_camera = cinematic_cam.instance()
var cam: Camera = cinematic_camera.get_node("rot_y/rot_x/SpringArm/camera_offset/Camera")
var cam_offset = cinematic_camera.get_node("rot_y/rot_x/SpringArm/camera_offset")
cam.set_meta("player", player)
cam.set_meta("current_cam", current_cam)
cinematic_camera.set_meta("cam", cam)
cinematic_camera.set_meta("offset", cam_offset)
get_viewport().add_child(cinematic_camera)
cinematic_camera.global_transform.origin = where
# cam_offset.global_transform.origin = where
cam.current = true
cam.look_at(to, Vector3.UP)
func update_camera(where, to):
var cam = cinematic_camera.get_meta("cam")
var cam_offset = cinematic_camera.get_meta("offset")
cam_offset.global_transform.origin = where
cam.look_at(to, Vector3.UP)
func grab(actor_master, actor_slave):
var gr = Grabbing.new()
gr.connect("enable_cinematic_camera", self, "enable_camera")
gr.connect("update_cinematic_camera", self, "update_camera")
gr.start(actor_master, actor_slave, grab_ik_curve, grab_ik_curve_multiplier)
active_states.push_back(gr)
func _physics_process(delta):
var completed = []
for e in active_states:
e.physics_update(delta)
if e.finished:
completed.push_back(e)
for d in completed:
active_states.erase(d)
func _process(delta):
var completed = []
for e in active_states:
e.update(delta)
if e.finished:
completed.push_back(e)
for d in completed:
active_states.erase(d)