54 lines
1.6 KiB
GDScript
54 lines
1.6 KiB
GDScript
@tool
|
|
|
|
class_name ShootingModifier
|
|
extends SkeletonModifier3D
|
|
|
|
@export var look_raycast: RayCast3D
|
|
@export var aim_raycast: RayCast3D
|
|
|
|
@export_enum(" ") var bone: String
|
|
@export var shooting: bool = false
|
|
|
|
func _validate_property(property: Dictionary) -> void:
|
|
if property.name == "bone":
|
|
var skeleton: Skeleton3D = get_skeleton()
|
|
if skeleton:
|
|
property.hint = PROPERTY_HINT_ENUM
|
|
property.hint_string = skeleton.get_concatenated_bone_names()
|
|
|
|
func _process_modification() -> void:
|
|
var skeleton: Skeleton3D = get_skeleton()
|
|
if !skeleton:
|
|
return
|
|
var bone_idx: int = skeleton.find_bone(bone)
|
|
if bone_idx == -1:
|
|
return
|
|
|
|
var target_position = look_raycast.get_collision_point() if look_raycast.is_colliding() else look_raycast.global_transform.origin + - look_raycast.global_transform.basis.z * 30
|
|
var target_position_local = to_local(target_position)
|
|
#aim_raycast.= target_position
|
|
|
|
var bone_pose = skeleton.get_bone_global_pose(bone_idx)
|
|
#print(new_basis)
|
|
|
|
#skeleton.set_bone_global_pose(bone_idx, Transform3D(bone_pose.basis, bone_pose.origin + Vector3(0, 0, 1)))
|
|
var gun_position = aim_raycast.global_transform.origin
|
|
var gun_direction = (target_position - gun_position).normalized()
|
|
if shooting:
|
|
var new_pose = bone_pose.looking_at(target_position_local, Vector3.FORWARD, true)
|
|
var new_basis: Basis
|
|
new_basis.y = new_pose.basis.z
|
|
#new_basis.y.y = -new_basis.y.y
|
|
new_basis.z = new_pose.basis.x
|
|
new_basis.x = new_pose.basis.y
|
|
new_pose.basis = new_basis
|
|
|
|
skeleton.set_bone_global_pose(bone_idx, new_pose)
|
|
|
|
|
|
func z_and_y_inverse(v : Vector3) -> Vector3 :
|
|
var tmp: float = v.x
|
|
v.x = v.y
|
|
v.y = tmp
|
|
return v
|