Add set-physics-mode.

This commit is contained in:
Davide Tantillo 2025-11-06 11:07:22 +01:00
parent 3075b5b9b6
commit 2918788364
5 changed files with 64 additions and 3 deletions

View File

@ -237,6 +237,18 @@
"type": "number"
}
]
},
{
"id": "set-physics-mode",
"scriptName": "SetPhysicsMode",
"highlight": false,
"params": [
{
"id": "physics-mode",
"type": "combo",
"items": ["none", "reset", "update", "pose"]
}
]
}
],
"expressions": [

View File

@ -63,6 +63,10 @@ C3.Plugins.EsotericSoftware_SpineConstruct3.Acts =
SetAnimationMix (this: SDKInstanceClass, fromName: string, toName: string, duration: number) {
this.setAnimationMix(fromName, toName, duration);
},
SetPhysicsMode (this: SDKInstanceClass, mode: 0 | 1 | 2 | 3) {
this.setPhysicsMode(mode);
}
};

View File

@ -19,6 +19,7 @@ class SpineC3Instance extends globalThis.ISDKWorldInstanceBase {
propFlipX = false;
isPlaying = true;
animationSpeed = 1.0;
physicsMode = spine.Physics.update;
customSkins: Record<string, Skin> = {};
textureAtlas?: TextureAtlas;
@ -260,6 +261,16 @@ class SpineC3Instance extends globalThis.ISDKWorldInstanceBase {
}
}
public setPhysicsMode (mode: 0 | 1 | 2 | 3) {
switch (mode) {
case 0: this.physicsMode = spine.Physics.none; break;
case 1: this.physicsMode = spine.Physics.reset; break;
case 2: this.physicsMode = spine.Physics.update; break;
case 3: this.physicsMode = spine.Physics.pose; break;
default: console.warn('[Spine] Invalid physics mode:', mode);
}
}
private _setSkin () {
const { skeleton } = this;
if (!skeleton) return;
@ -294,15 +305,15 @@ class SpineC3Instance extends globalThis.ISDKWorldInstanceBase {
}
private update (delta: number) {
const { state, skeleton } = this;
const { state, skeleton, animationSpeed, physicsMode } = this;
if (!skeleton || !state) return;
const adjustedDelta = delta * this.animationSpeed;
const adjustedDelta = delta * animationSpeed;
state.update(adjustedDelta);
skeleton.update(adjustedDelta);
state.apply(skeleton);
skeleton.updateWorldTransform(spine.Physics.update);
skeleton.updateWorldTransform(physicsMode);
}
private async _loadAtlas () {

View File

@ -314,6 +314,23 @@
"desc": "Blend duration in seconds"
}
}
},
"set-physics-mode": {
"list-name": "Set physics mode",
"display-text": "Set physics mode to {0}",
"description": "Set the physics mode to control how physics constraints are updated and applied",
"params": {
"physics-mode": {
"name": "Physics mode",
"desc": "Physics mode",
"items": {
"none": "None (physics not updated or applied)",
"reset": "Reset (physics reset to current pose)",
"update": "Update (physics updated and applied)",
"pose": "Pose (physics pose applied without update)"
}
}
}
}
},
"expressions": {

View File

@ -316,6 +316,23 @@
}
}
},
"set-physics-mode": {
"list-name": "设置物理模式",
"display-text": "设置物理模式为{0}",
"description": "设置物理模式以控制物理约束的更新和应用方式",
"params": {
"physics-mode": {
"name": "物理模式",
"desc": "物理模式",
"items": {
"none": "无(物理不更新也不应用)",
"reset": "重置(物理重置为当前姿势)",
"update": "更新(物理更新并应用)",
"pose": "姿势(应用物理姿势但不更新)"
}
}
}
},
"expressions": {
"double": {
"description": "将数字翻倍。",