make sure bone overrides are cleared on model switches, add ClearBoneOffsets to clear them manually

This commit is contained in:
Ricardo Luís Vaz Silva 2025-04-27 12:15:04 -03:00
parent 1966d23510
commit c7e415303d
2 changed files with 36 additions and 1 deletions

View file

@ -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 // GetBoneOffset
@ -5832,6 +5852,7 @@ void ChangeModelNative(
} }
surfaceSkins.Push(skindata); surfaceSkins.Push(skindata);
mobj->modelData->models.Push({queryModel, std::move(surfaceSkins)}); mobj->modelData->models.Push({queryModel, std::move(surfaceSkins)});
mobj->modelData->modelFrameGenerators.Push(generatorindex); mobj->modelData->modelFrameGenerators.Push(generatorindex);
} }
else else
@ -5839,6 +5860,11 @@ void ChangeModelNative(
mobj->modelData->models.Push({queryModel, {}}); mobj->modelData->models.Push({queryModel, {}});
mobj->modelData->modelFrameGenerators.Push(generatorindex); mobj->modelData->modelFrameGenerators.Push(generatorindex);
} }
if(queryModel != -1 && mobj->modelData->modelBoneOverrides.Size() > modelindex)
{
mobj->modelData->modelBoneOverrides[modelindex].Clear();
}
} }
else else
{ {
@ -5858,7 +5884,15 @@ void ChangeModelNative(
mobj->modelData->models[modelindex].surfaceSkinIDs[skinindex] = skindata; 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; if(generatorindex != -1) mobj->modelData->modelFrameGenerators[modelindex] = generatorindex;
} }

View file

@ -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 GetBoneOffset(int boneIndex);
native version("4.15.1") Quat, Vector3, Vector3 GetNamedBoneOffset(Name boneName); 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") 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); 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);