From 6284c4e3c7ca2045b0f68e831698bbe5f1bac860 Mon Sep 17 00:00:00 2001 From: copygirl Date: Sun, 23 Feb 2025 18:34:48 +0100 Subject: [PATCH] Don't send bone positions that are at rest This reduces the required bandwidth by about 30%. --- Scenes/sync_controller.gd | 6 +++--- Utility/stream_buffer.gd | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Scenes/sync_controller.gd b/Scenes/sync_controller.gd index 29d09ae..059731d 100644 --- a/Scenes/sync_controller.gd +++ b/Scenes/sync_controller.gd @@ -119,7 +119,7 @@ func sync_model_animation( # 256 bones (and blendshapes) should be enough, right? for i in stream.read_uint8(): var lookup := stream.read_uint8() - all_bones[lookup].pose = stream.read_bone_pose() + all_bones[lookup].pose = stream.read_bone_pose(all_bones[lookup].pose) for i in stream.read_uint8(): var lookup := stream.read_uint8() all_blendshapes[lookup].value = stream.read_range16() @@ -157,7 +157,7 @@ static func send_model_animation(module: copyMultiplayer) -> void: var bone_pose := skeleton.get_bone_pose(bone_idx) var bone_rest := skeleton.get_bone_rest(bone_idx) if not bone_pose.is_equal_approx(bone_rest): - restless_bones.append({ lookup = i, pose = bone_pose }) + restless_bones.append({ lookup = i, pose = bone_pose, rest = bone_rest }) for i in module.blendshape_lookup.size(): var anim_path := module.blendshape_lookup[i] @@ -169,7 +169,7 @@ static func send_model_animation(module: copyMultiplayer) -> void: write_stream.write_uint8(restless_bones.size()) for bone in restless_bones: write_stream.write_uint8(bone.lookup) - write_stream.write_bone_pose(bone.pose) + write_stream.write_bone_pose(bone.pose, bone.rest) write_stream.write_uint8(active_blendshapes.size()) for blendshape in active_blendshapes: diff --git a/Utility/stream_buffer.gd b/Utility/stream_buffer.gd index fde5b4a..0e3da84 100644 --- a/Utility/stream_buffer.gd +++ b/Utility/stream_buffer.gd @@ -155,11 +155,11 @@ func read_string() -> String: # Optimized way to write a bone transform, since bones are likely to not contain offset or scale. -func write_bone_pose(value: Transform3D) -> void: - var pos := value.origin - var rot := value.basis.get_euler() - var scale := value.basis.get_scale() - var has_pos := !pos.is_zero_approx() +func write_bone_pose(pose: Transform3D, rest: Transform3D) -> void: + var pos := pose.origin + var rot := pose.basis.get_euler() + var scale := pose.basis.get_scale() + var has_pos := !pos.is_equal_approx(rest.origin) var has_rot := !rot.is_zero_approx() var has_scale := !scale.is_equal_approx(Vector3.ONE) var has_scale3 := !is_equal_approx(scale.x, scale.y) or !is_equal_approx(scale.x, scale.y) @@ -169,7 +169,7 @@ func write_bone_pose(value: Transform3D) -> void: if has_scale3: write_vector16(scale) elif has_scale: write_float16((scale.x + scale.y + scale.z) / 3) -func read_bone_pose() -> Transform3D: +func read_bone_pose(rest: Transform3D) -> Transform3D: var pos := Vector3.ZERO var rot := Vector3.ZERO var scale := Vector3.ONE @@ -177,7 +177,7 @@ func read_bone_pose() -> Transform3D: var has_rot := read_bit() var has_scale := read_bit() var has_scale3 := read_bit() - if has_pos: pos = read_vector16() + pos = read_vector16() if has_pos else rest.origin if has_rot: rot = Vector3(read_range16() * TAU, read_range16() * TAU, read_range16() * TAU) if has_scale3: scale = read_vector16() elif has_scale: var s := read_float16(); scale = Vector3(s, s, s)