From 385033e999149b9c40b3d8ef29f18ca1b3a1f425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sat, 10 May 2025 18:21:21 -0300 Subject: [PATCH] fix CalcModelFrame/SetBone/GetBone/SetAnimation not grabbing smf from modeldata for decoupled anims --- src/playsim/p_actionfunctions.cpp | 16 ++++++++++------ src/r_data/models.cpp | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/playsim/p_actionfunctions.cpp b/src/playsim/p_actionfunctions.cpp index be5463bae..bfa2dcc16 100644 --- a/src/playsim/p_actionfunctions.cpp +++ b/src/playsim/p_actionfunctions.cpp @@ -5133,7 +5133,9 @@ FModel * SetGetBoneShared(AActor * self, int model_index) ThrowAbortException(X_OTHER, isSet ? "Cannot set bone offset for non-decoupled actors" : (isOffset ? "Cannot get bone for non-decoupled actors" : "Cannot get bone offset for non-decoupled actors")); } - if(!BaseSpriteModelFrames.CheckKey(self->GetClass())) + auto smf_class = (self->modelData && self->modelData->modelDef) ? self->modelData->modelDef : self->GetClass(); + + if(!BaseSpriteModelFrames.CheckKey(smf_class)) { ThrowAbortException(X_OTHER, "Actor class is missing a MODELDEF definition or a MODELDEF BaseFrame"); } @@ -5144,9 +5146,9 @@ FModel * SetGetBoneShared(AActor * self, int model_index) { return Models[self->modelData->models[model_index].modelID]; } - else if(BaseSpriteModelFrames[self->GetClass()].modelIDs.SSize() > model_index) + else if(BaseSpriteModelFrames[smf_class].modelIDs.SSize() > model_index) { - return Models[BaseSpriteModelFrames[self->GetClass()].modelIDs[model_index]]; + return Models[BaseSpriteModelFrames[smf_class].modelIDs[model_index]]; } else { @@ -6193,7 +6195,9 @@ void SetAnimationInternal(AActor * self, FName animName, double framerate, int s ThrowAbortException(X_OTHER, "Cannot set animation for non-decoupled actors"); } - if(!BaseSpriteModelFrames.CheckKey(self->GetClass())) + auto smf_class = (self->modelData && self->modelData->modelDef) ? self->modelData->modelDef : self->GetClass(); + + if(!BaseSpriteModelFrames.CheckKey(smf_class)) { ThrowAbortException(X_OTHER, "Actor class is missing a MODELDEF definition or a MODELDEF BaseFrame"); } @@ -6227,7 +6231,7 @@ void SetAnimationInternal(AActor * self, FName animName, double framerate, int s } else { - animID = BaseSpriteModelFrames[self->GetClass()].animationIDs[0]; + animID = BaseSpriteModelFrames[smf_class].animationIDs[0]; } FModel * animation = nullptr; @@ -6241,7 +6245,7 @@ void SetAnimationInternal(AActor * self, FName animName, double framerate, int s } else { - animation = Models[BaseSpriteModelFrames[self->GetClass()].modelIDs[0]]; + animation = Models[BaseSpriteModelFrames[smf_class].modelIDs[0]]; } int animStart = animation->FindFirstFrame(animName); diff --git a/src/r_data/models.cpp b/src/r_data/models.cpp index 34693c20a..dc2ec93c5 100644 --- a/src/r_data/models.cpp +++ b/src/r_data/models.cpp @@ -368,7 +368,7 @@ CalcModelFrameInfo CalcModelFrame(FLevelLocals *Level, const FSpriteModelFrame * if(is_decoupled) { - smfNext = smf = &BaseSpriteModelFrames[actor->GetClass()]; + smfNext = smf = &BaseSpriteModelFrames[(data != nullptr && data->modelDef != nullptr) ? data->modelDef : actor->GetClass()]; if(data && !(data->curAnim.flags & MODELANIM_NONE)) { calcFrames(data->curAnim, tic, decoupled_frame, inter);