From 4223d47645aa81234e38432f630af7fcd9118a22 Mon Sep 17 00:00:00 2001 From: "YITSUSE, Masami" Date: Tue, 8 Sep 2026 00:14:16 +0900 Subject: [PATCH 1/3] docs: correct part-tracking Skew notes; bump SDK for the Skew fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Skew is no longer folded into the world matrix, so the transform a SpriteStudioPartAttachment2D follows (and get_part_transform returns) carries no skew. Update the scripting guide (en/ja) accordingly: an attachment reflects position/rotation/scale and the mirror, but a part's skew — a non-inheriting per-part vertex deformation in SpriteStudio — is not part of the followed pose. Bump the SpriteStudio-SDK submodule to the matching runtime change (feat: apply Skew as a non-inheriting local-vertex deform). Claude-Session: https://claude.ai/code/session_01QgTZWEbMSX1xd87gC52guv --- docs/en/workflow/usage_scripting.md | 4 ++-- docs/ja/workflow/usage_scripting.md | 4 ++-- ss_player/SpriteStudio-SDK | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/en/workflow/usage_scripting.md b/docs/en/workflow/usage_scripting.md index 1c6b145..24bcae2 100644 --- a/docs/en/workflow/usage_scripting.md +++ b/docs/en/workflow/usage_scripting.md @@ -188,9 +188,9 @@ func _on_frame_updated(frame_no: float): Tracking is driven by the `frame_updated` signal the player emits right after finishing its own update. That is after the part transforms are finalized and before the render phase, so the target updates **within the same frame**. Which process it fires in follows the player's `animation_process_mode` (`Idle` (default) / `Physics`). -Godot's `Transform2D` holds a full 2x3 affine transform, so when `update_position` / `update_rotation` / `update_scale` are **all ON** the transform is assigned whole. That matches the part **exactly, including skew and negative scale**, whether the target sits under the player or in a separate hierarchy. +Godot's `Transform2D` holds a full 2x3 affine transform, so when `update_position` / `update_rotation` / `update_scale` are **all ON** the transform is assigned whole. That matches the part's position, rotation and scale **exactly, including a negative scale (mirror)**, whether the target sits under the player or in a separate hierarchy. A part's **skew is not part of the followed pose**: SpriteStudio treats skew as a per-part vertex deformation that does not inherit to children, so — like a child part — an attachment never receives it. -Turning any of them OFF writes only the enabled components individually, like `RemoteTransform2D`, and skew is not preserved. Only `update_scale` is OFF by default, so **position and rotation alone are reflected out of the box**. +Turning any of them OFF writes only the enabled components individually, like `RemoteTransform2D`. Only `update_scale` is OFF by default, so **position and rotation alone are reflected out of the box**. > **Turn all three ON when you use `flip_h` / `flip_v`.** A flipped part's pose is a **mirror**, and a mirror can only be expressed as a negative scale. With `update_scale` OFF (the default) the mirror never reaches the target, and **`flip_h` (horizontal) additionally leaves a 180-degree difference in orientation** (`flip_v` does not). The two differ because `Transform2D` decomposes a mirror into a rotation plus a negative scale with the sign placed on the Y axis: a horizontal mirror needs an extra 180-degree rotation to fit that form, and it is the rotation that keeps it. `flip_h` / `flip_v` are not the only source — a part or one of its parents carrying a negative scale in SpriteStudio mirrors the pose the same way. > diff --git a/docs/ja/workflow/usage_scripting.md b/docs/ja/workflow/usage_scripting.md index 595f8b9..a3c0cd6 100644 --- a/docs/ja/workflow/usage_scripting.md +++ b/docs/ja/workflow/usage_scripting.md @@ -187,9 +187,9 @@ func _on_frame_updated(frame_no: float): 追従は、プレーヤが自身の更新を終えた直後に発行する `frame_updated` シグナルで駆動されます。パーツの変換が確定した後・描画の前なので、追従先は**同じフレーム内**で更新されます。どのプロセスで発火するかは、プレーヤの `animation_process_mode`(`Idle`(既定)/ `Physics`)に従います。 -Godot の `Transform2D` は 2×3 のアフィン変換をそのまま保持できるため、`update_position` / `update_rotation` / `update_scale` が**すべて ON** のときは変換を丸ごと代入します。この場合は**せん断(Skew)や負のスケールも含めて厳密に一致**し、対象をプレーヤの子に置いても別階層に置いても差はありません。 +Godot の `Transform2D` は 2×3 のアフィン変換をそのまま保持できるため、`update_position` / `update_rotation` / `update_scale` が**すべて ON** のときは変換を丸ごと代入します。この場合はパーツの位置・回転・スケールに**負のスケール(鏡像)も含めて厳密に一致**し、対象をプレーヤの子に置いても別階層に置いても差はありません。なお、パーツの**せん断(Skew)は追従する姿勢には含まれません**。SpriteStudio はせん断を「子に伝搬しないパーツ単位の頂点変形」として扱うため、子パーツと同様、追従ノードにもせん断は渡りません。 -1 つでも OFF にすると、`RemoteTransform2D` と同じく有効な成分だけを個別に書き込むため、せん断は保持されません。既定は `update_scale` のみ OFF なので、**既定では位置と回転だけが反映されます**。 +1 つでも OFF にすると、`RemoteTransform2D` と同じく有効な成分だけを個別に書き込みます。既定は `update_scale` のみ OFF なので、**既定では位置と回転だけが反映されます**。 > **`flip_h` / `flip_v` を使う場合は 3 つとも ON にしてください。** 反転したパーツの姿勢は**鏡像**で、鏡像は負のスケールとしてしか表せません。`update_scale` が OFF(既定)だと対象に鏡像が伝わらず、さらに **`flip_h`(左右反転)では向きに 180 度の差が残ります**(`flip_v` では残りません)。左右と上下で違うのは、`Transform2D` が鏡像を「回転+負のスケール」に分解する際に符号を Y 軸側へ載せるためで、左右の鏡像はこの形にするのに余分な 180 度回転を必要とし、それが回転側に残ります。鏡像になるのは `flip_h` / `flip_v` を使ったときだけではなく、SpriteStudio 側でパーツやその親に負のスケールが付いている場合も同じです。 > diff --git a/ss_player/SpriteStudio-SDK b/ss_player/SpriteStudio-SDK index 65c33d6..423995e 160000 --- a/ss_player/SpriteStudio-SDK +++ b/ss_player/SpriteStudio-SDK @@ -1 +1 @@ -Subproject commit 65c33d6ad1b48316c075a3b9663d4bdfc8e29abf +Subproject commit 423995e904f59e81e52d656fa1c193d2aad632a1 From ab3116920d15d86eff843e62e87eb7251a261a05 Mon Sep 17 00:00:00 2001 From: "YITSUSE, Masami" Date: Tue, 8 Sep 2026 14:57:38 +0900 Subject: [PATCH 2/3] chore: bump SDK for the SKEW_PROPAGATES comment tidy Comment-only change in ssruntime (SKEW_PROPAGATES doc); no behaviour change. Claude-Session: https://claude.ai/code/session_01QgTZWEbMSX1xd87gC52guv --- ss_player/SpriteStudio-SDK | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ss_player/SpriteStudio-SDK b/ss_player/SpriteStudio-SDK index 423995e..42a8212 160000 --- a/ss_player/SpriteStudio-SDK +++ b/ss_player/SpriteStudio-SDK @@ -1 +1 @@ -Subproject commit 423995e904f59e81e52d656fa1c193d2aad632a1 +Subproject commit 42a8212960cbdd76340b8a78d5621f7c685b4802 From af6fb19a8f69d25caca8d08f9a89dfe32306a5ea Mon Sep 17 00:00:00 2001 From: "YITSUSE, Masami" Date: Tue, 8 Sep 2026 15:31:39 +0900 Subject: [PATCH 3/3] chore: bump SDK for the clippy 1.98 fixes Comment/lint-only changes in ssruntime (clippy 1.98 as_chunks / needless_late_init); no behaviour change. Claude-Session: https://claude.ai/code/session_01QgTZWEbMSX1xd87gC52guv --- ss_player/SpriteStudio-SDK | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ss_player/SpriteStudio-SDK b/ss_player/SpriteStudio-SDK index 42a8212..eab6336 160000 --- a/ss_player/SpriteStudio-SDK +++ b/ss_player/SpriteStudio-SDK @@ -1 +1 @@ -Subproject commit 42a8212960cbdd76340b8a78d5621f7c685b4802 +Subproject commit eab6336ceec88fad43265d9b352b358bf302f330