Don't send bone positions that are at rest

This reduces the required bandwidth by about 30%.
main
copygirl 3 weeks ago
parent 49c7a706a8
commit 6284c4e3c7
  1. 6
      Scenes/sync_controller.gd
  2. 14
      Utility/stream_buffer.gd

@ -119,7 +119,7 @@ func sync_model_animation(
# 256 bones (and blendshapes) should be enough, right? # 256 bones (and blendshapes) should be enough, right?
for i in stream.read_uint8(): for i in stream.read_uint8():
var lookup := 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(): for i in stream.read_uint8():
var lookup := stream.read_uint8() var lookup := stream.read_uint8()
all_blendshapes[lookup].value = stream.read_range16() 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_pose := skeleton.get_bone_pose(bone_idx)
var bone_rest := skeleton.get_bone_rest(bone_idx) var bone_rest := skeleton.get_bone_rest(bone_idx)
if not bone_pose.is_equal_approx(bone_rest): 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(): for i in module.blendshape_lookup.size():
var anim_path := module.blendshape_lookup[i] 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()) write_stream.write_uint8(restless_bones.size())
for bone in restless_bones: for bone in restless_bones:
write_stream.write_uint8(bone.lookup) 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()) write_stream.write_uint8(active_blendshapes.size())
for blendshape in active_blendshapes: for blendshape in active_blendshapes:

@ -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. # Optimized way to write a bone transform, since bones are likely to not contain offset or scale.
func write_bone_pose(value: Transform3D) -> void: func write_bone_pose(pose: Transform3D, rest: Transform3D) -> void:
var pos := value.origin var pos := pose.origin
var rot := value.basis.get_euler() var rot := pose.basis.get_euler()
var scale := value.basis.get_scale() var scale := pose.basis.get_scale()
var has_pos := !pos.is_zero_approx() var has_pos := !pos.is_equal_approx(rest.origin)
var has_rot := !rot.is_zero_approx() var has_rot := !rot.is_zero_approx()
var has_scale := !scale.is_equal_approx(Vector3.ONE) 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) 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) if has_scale3: write_vector16(scale)
elif has_scale: write_float16((scale.x + scale.y + scale.z) / 3) 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 pos := Vector3.ZERO
var rot := Vector3.ZERO var rot := Vector3.ZERO
var scale := Vector3.ONE var scale := Vector3.ONE
@ -177,7 +177,7 @@ func read_bone_pose() -> Transform3D:
var has_rot := read_bit() var has_rot := read_bit()
var has_scale := read_bit() var has_scale := read_bit()
var has_scale3 := 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_rot: rot = Vector3(read_range16() * TAU, read_range16() * TAU, read_range16() * TAU)
if has_scale3: scale = read_vector16() if has_scale3: scale = read_vector16()
elif has_scale: var s := read_float16(); scale = Vector3(s, s, s) elif has_scale: var s := read_float16(); scale = Vector3(s, s, s)

Loading…
Cancel
Save