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
@ -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;
}

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 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);