From c7e415303dcbae3b0c8fe183c1bb728560a2a78d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sun, 27 Apr 2025 12:15:04 -0300 Subject: [PATCH] make sure bone overrides are cleared on model switches, add ClearBoneOffsets to clear them manually --- src/playsim/p_actionfunctions.cpp | 36 ++++++++++++++++++++++++++- wadsrc/static/zscript/actors/actor.zs | 1 + 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/playsim/p_actionfunctions.cpp b/src/playsim/p_actionfunctions.cpp index 564725a0ec..f2fb42bbd5 100644 --- a/src/playsim/p_actionfunctions.cpp +++ b/src/playsim/p_actionfunctions.cpp @@ -5414,6 +5414,26 @@ DEFINE_ACTION_FUNCTION_NATIVE(AActor, SetNamedBoneScaling, SetNamedBoneScalingNa } +//================================================ +// +// ClearBoneOffsets +// +//================================================ + +static void ClearBoneOffsetsNative(AActor * self) +{ + if(self->modelData) self->modelData->modelBoneOverrides[0].Clear(); +} + +DEFINE_ACTION_FUNCTION_NATIVE(AActor, ClearBoneOffsets, ClearBoneOffsetsNative) +{ + PARAM_SELF_PROLOGUE(AActor); + + ClearBoneOffsetsNative(self); + + return 0; +} + //================================================ // // GetBoneOffset @@ -5832,6 +5852,7 @@ void ChangeModelNative( } surfaceSkins.Push(skindata); mobj->modelData->models.Push({queryModel, std::move(surfaceSkins)}); + mobj->modelData->modelFrameGenerators.Push(generatorindex); } else @@ -5839,6 +5860,11 @@ void ChangeModelNative( mobj->modelData->models.Push({queryModel, {}}); mobj->modelData->modelFrameGenerators.Push(generatorindex); } + + if(queryModel != -1 && mobj->modelData->modelBoneOverrides.Size() > modelindex) + { + mobj->modelData->modelBoneOverrides[modelindex].Clear(); + } } else { @@ -5858,7 +5884,15 @@ void ChangeModelNative( mobj->modelData->models[modelindex].surfaceSkinIDs[skinindex] = skindata; } } - if(queryModel != -1) mobj->modelData->models[modelindex].modelID = queryModel; + if(queryModel != -1) + { + mobj->modelData->models[modelindex].modelID = queryModel; + + if(mobj->modelData->modelBoneOverrides.Size() > modelindex) + { + mobj->modelData->modelBoneOverrides[modelindex].Clear(); + } + } if(generatorindex != -1) mobj->modelData->modelFrameGenerators[modelindex] = generatorindex; } diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index ae755eb863..6f0544d5aa 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -1372,6 +1372,7 @@ class Actor : Thinker native native version("4.15.1") Quat, Vector3, Vector3 GetBoneOffset(int boneIndex); native version("4.15.1") Quat, Vector3, Vector3 GetNamedBoneOffset(Name boneName); + native version("4.15.1") void ClearBoneOffsets(); native version("4.12") void SetAnimation(Name animName, double framerate = -1, int startFrame = -1, int loopFrame = -1, int endFrame = -1, int interpolateTics = -1, int flags = 0); native version("4.12") ui void SetAnimationUI(Name animName, double framerate = -1, int startFrame = -1, int loopFrame = -1, int endFrame = -1, int interpolateTics = -1, int flags = 0);