From 53898d15499a2c61f3eb1c803519dcfeab51f391 Mon Sep 17 00:00:00 2001 From: "K. S. Ernest (iFire) Lee" Date: Thu, 28 Dec 2023 23:31:21 -0800 Subject: [PATCH] git subrepo pull (merge) addons/vrm subrepo: subdir: "addons/vrm" merged: "4ebfd8b" upstream: origin: "https://github.com/V-Sekai/godot-vrm.git" branch: "only-addon" commit: "1e1ea8a" git-subrepo: version: "0.4.6" origin: "https://github.com/ingydotnet/git-subrepo" commit: "110b9eb" --- addons/vrm/.gitrepo | 2 +- addons/vrm/1.0/VRMC_materials_mtoon.gd | 3 ++- addons/vrm/vrm_extension.gd | 6 ++---- addons/vrm/vrm_secondary.gd | 3 +++ addons/vrm/vrm_spring_bone.gd | 5 +++++ addons/vrm/vrm_spring_bone_logic.gd | 22 ++++++++++++++++++---- addons/vrm/vrm_utils.gd | 8 ++++---- 7 files changed, 35 insertions(+), 14 deletions(-) diff --git a/addons/vrm/.gitrepo b/addons/vrm/.gitrepo index e37b594..fc5a4fa 100644 --- a/addons/vrm/.gitrepo +++ b/addons/vrm/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/V-Sekai/godot-vrm.git branch = only-addon - commit = 411bb5e764c2fc0edcde86517a8906d9ed283a5c + commit = 1e1ea8aecf0cfed7f3436979ecb990b56fb8108f parent = 26b998531939bc966c096cfc3adbd3865837a61c method = merge cmdver = 0.4.6 diff --git a/addons/vrm/1.0/VRMC_materials_mtoon.gd b/addons/vrm/1.0/VRMC_materials_mtoon.gd index ced3fe9..cca8b8f 100644 --- a/addons/vrm/1.0/VRMC_materials_mtoon.gd +++ b/addons/vrm/1.0/VRMC_materials_mtoon.gd @@ -267,7 +267,7 @@ func _export_post(state: GLTFState) -> Error: return OK -func _vrm_get_texture_info(gstate : GLTFState, vrm_mat_props: Dictionary, unity_tex_name: String) -> Dictionary: +func _vrm_get_texture_info(gstate: GLTFState, vrm_mat_props: Dictionary, unity_tex_name: String) -> Dictionary: var gltf_images: Array = gstate.get_images() var gltf_textures: Array = gstate.get_textures() var texture_info: Dictionary = {} @@ -285,6 +285,7 @@ func _vrm_get_texture_info(gstate : GLTFState, vrm_mat_props: Dictionary, unity_ texture_info["scale"] = Vector3(offsetScale[2], offsetScale[3], 1.0) return texture_info + func _vrm_get_float(vrm_mat_props: Dictionary, key: String, def: float) -> float: return vrm_mat_props["floatProperties"].get(key, def) diff --git a/addons/vrm/vrm_extension.gd b/addons/vrm/vrm_extension.gd index 5aa5972..b6bd730 100644 --- a/addons/vrm/vrm_extension.gd +++ b/addons/vrm/vrm_extension.gd @@ -14,7 +14,6 @@ const vrm_utils = preload("./vrm_utils.gd") var vrm_meta: Resource = null - enum DebugMode { None = 0, Normal = 1, @@ -69,7 +68,7 @@ func _process_khr_material(orig_mat: StandardMaterial3D, gltf_mat_props: Diction return orig_mat -func _vrm_get_texture_info(gstate : GLTFState, vrm_mat_props: Dictionary, unity_tex_name: String) -> Dictionary: +func _vrm_get_texture_info(gstate: GLTFState, vrm_mat_props: Dictionary, unity_tex_name: String) -> Dictionary: var gltf_images: Array = gstate.get_images() var gltf_textures: Array = gstate.get_textures() var texture_info: Dictionary = {} @@ -92,8 +91,7 @@ func _vrm_get_float(vrm_mat_props: Dictionary, key: String, def: float) -> float return vrm_mat_props["floatProperties"].get(key, def) -func _process_vrm_material(orig_mat: Material, gstate : GLTFState, vrm_mat_props: Dictionary) -> Material: - +func _process_vrm_material(orig_mat: Material, gstate: GLTFState, vrm_mat_props: Dictionary) -> Material: var gltf_images: Array = gstate.get_images() var gltf_textures: Array = gstate.get_textures() diff --git a/addons/vrm/vrm_secondary.gd b/addons/vrm/vrm_secondary.gd index 6831a6a..f5d6a2b 100644 --- a/addons/vrm/vrm_secondary.gd +++ b/addons/vrm/vrm_secondary.gd @@ -185,6 +185,9 @@ func tick_spring_bones(delta: float) -> void: update_centers(skel_transform) + for spring_i in range(len(spring_bones_internal)): + spring_bones_internal[spring_i].pre_update() + for collider_i in range(len(colliders_internal)): colliders_internal[collider_i].update(skel_transform, center_transforms[colliders_centers[collider_i]], skel) for spring_i in range(len(spring_bones_internal)): diff --git a/addons/vrm/vrm_spring_bone.gd b/addons/vrm/vrm_spring_bone.gd index 0451b13..04d2991 100644 --- a/addons/vrm/vrm_spring_bone.gd +++ b/addons/vrm/vrm_spring_bone.gd @@ -88,6 +88,11 @@ func ready(ready_skel: Skeleton3D, colliders_ref: Array[vrm_collider.VrmRuntimeC colliders = colliders_ref.duplicate(false) +func pre_update(): + for i in range(len(verlets)): + verlets[i].pre_update(skel) + + func update(delta: float, center_transform: Transform3D, center_transform_inv: Transform3D) -> void: if verlets.is_empty(): if joint_nodes.is_empty(): diff --git a/addons/vrm/vrm_spring_bone_logic.gd b/addons/vrm/vrm_spring_bone_logic.gd index f9de02b..a8dd183 100644 --- a/addons/vrm/vrm_spring_bone_logic.gd +++ b/addons/vrm/vrm_spring_bone_logic.gd @@ -14,6 +14,7 @@ var current_tail: Vector3 var prev_tail: Vector3 var initial_transform: Transform3D +var global_pose: Transform3D static func from_to_rotation_safe(from: Vector3, to: Vector3) -> Quaternion: @@ -34,6 +35,14 @@ func get_local_pose_rotation(skel: Skeleton3D) -> Quaternion: return get_global_pose(skel).basis.get_rotation_quaternion() +func get_global_pose_cached() -> Transform3D: + return global_pose + + +func get_local_pose_rotation_cached() -> Quaternion: + return global_pose.basis.get_rotation_quaternion() + + func reset(skel: Skeleton3D) -> void: skel.set_bone_global_pose_override(bone_idx, initial_transform, 1.0, true) @@ -49,15 +58,20 @@ func _init(skel: Skeleton3D, idx: int, center_transform_inv: Transform3D, local_ length = local_child_position.length() +func pre_update(skel: Skeleton3D) -> void: + global_pose = get_global_pose(skel) + + func update(skel: Skeleton3D, center_transform: Transform3D, center_transform_inv: Transform3D, stiffness_force: float, drag_force: float, external: Vector3, colliders: Array[vrm_collider.VrmRuntimeCollider]) -> void: var tmp_current_tail: Vector3 = current_tail var tmp_prev_tail: Vector3 = prev_tail - var global_pose_tr: Transform3D = get_global_pose(skel) + var global_pose_tr: Transform3D = get_global_pose_cached() + var local_pose_rotation: Quaternion = get_local_pose_rotation_cached() var tmp_external: Vector3 = center_transform * external # Integration of velocity verlet - var next_tail: Vector3 = tmp_current_tail + (tmp_current_tail - tmp_prev_tail) * (1.0 - drag_force) + center_transform.basis.get_rotation_quaternion() * (get_local_pose_rotation(skel) * bone_axis * stiffness_force + external) + var next_tail: Vector3 = tmp_current_tail + (tmp_current_tail - tmp_prev_tail) * (1.0 - drag_force) + center_transform.basis.get_rotation_quaternion() * (local_pose_rotation * bone_axis * stiffness_force + external) # Limiting bone length var origin: Vector3 = center_transform * global_pose_tr.origin @@ -77,9 +91,9 @@ func update(skel: Skeleton3D, center_transform: Transform3D, center_transform_in current_tail = next_tail # center_transform_inv * next_tail # Apply rotation - var ft = from_to_rotation_safe(get_local_pose_rotation(skel) * (bone_axis), center_transform_inv.basis * (next_tail - origin)) + var ft = from_to_rotation_safe(local_pose_rotation * (bone_axis), center_transform_inv.basis * (next_tail - origin)) if typeof(ft) != TYPE_NIL: # ft = skel.global_transform.basis.get_rotation_quaternion().inverse() * ft - var qt: Quaternion = ft * get_local_pose_rotation(skel) + var qt: Quaternion = ft * local_pose_rotation global_pose_tr.basis = Basis(qt) skel.set_bone_global_pose_override(bone_idx, global_pose_tr, 1.0, true) diff --git a/addons/vrm/vrm_utils.gd b/addons/vrm/vrm_utils.gd index 645e087..6533a73 100644 --- a/addons/vrm/vrm_utils.gd +++ b/addons/vrm/vrm_utils.gd @@ -177,7 +177,7 @@ static func skeleton_rename(gstate: GLTFState, p_base_scene: Node, p_skeleton: S if bind_bone_name.is_empty(): #bind_bone_name = node.get_bone_name(skin.get_bind_bone(i)) if skin.get_bind_bone(i) != -1: - break # Not using named binds: no need to rename skin. + break # Not using named binds: no need to rename skin. var bone_name_from_skel: StringName = p_bone_map.find_profile_bone_name(bind_bone_name) if not bone_name_from_skel.is_empty(): skin.set_bind_name(i, bone_name_from_skel) @@ -294,10 +294,10 @@ static func apply_mesh_rotation(p_base_scene: Node, src_skeleton: Skeleton3D, ol var bone_idx: int = attachment.bone_idx if bone_idx == -1: bone_idx = src_skeleton.find_bone(attachment.bone_name) - var adjust_transform: Transform3D = src_skeleton.get_bone_global_rest(bone_idx).affine_inverse() * old_skeleton_global_rest[bone_idx]; - adjust_transform = adjust_transform.scaled(global_transform_scale_local); + var adjust_transform: Transform3D = src_skeleton.get_bone_global_rest(bone_idx).affine_inverse() * old_skeleton_global_rest[bone_idx] + adjust_transform = adjust_transform.scaled(global_transform_scale_local) - var child_nodes: Array[Node] = attachment.get_children(); + var child_nodes: Array[Node] = attachment.get_children() while not child_nodes.is_empty(): var child: Node3D = child_nodes.pop_back() as Node3D if child == null: