mirror of
https://github.com/ZDoom/qzdoom.git
synced 2025-02-09 01:01:05 +00:00
Fix crash if Animation is not explicitly assigned in MODELDEF.
This commit is contained in:
parent
ffdd0a11ea
commit
b002d5b8ec
4 changed files with 8 additions and 9 deletions
|
@ -77,7 +77,7 @@ public:
|
||||||
virtual void AddSkins(uint8_t *hitlist, const FTextureID* surfaceskinids) = 0;
|
virtual void AddSkins(uint8_t *hitlist, const FTextureID* surfaceskinids) = 0;
|
||||||
virtual float getAspectFactor(float vscale) { return 1.f; }
|
virtual float getAspectFactor(float vscale) { return 1.f; }
|
||||||
virtual const TArray<TRS>* AttachAnimationData() { return nullptr; };
|
virtual const TArray<TRS>* AttachAnimationData() { return nullptr; };
|
||||||
virtual const TArray<VSMatrix> CalculateBones(int frame1, int frame2, double inter, const TArray<TRS>& animationData, DBoneComponents* bones, int index) { return {}; };
|
virtual const TArray<VSMatrix> CalculateBones(int frame1, int frame2, double inter, const TArray<TRS>* animationData, DBoneComponents* bones, int index) { return {}; };
|
||||||
|
|
||||||
void SetVertexBuffer(int type, IModelVertexBuffer *buffer) { mVBuf[type] = buffer; }
|
void SetVertexBuffer(int type, IModelVertexBuffer *buffer) { mVBuf[type] = buffer; }
|
||||||
IModelVertexBuffer *GetVertexBuffer(int type) const { return mVBuf[type]; }
|
IModelVertexBuffer *GetVertexBuffer(int type) const { return mVBuf[type]; }
|
||||||
|
|
|
@ -116,7 +116,7 @@ public:
|
||||||
void BuildVertexBuffer(FModelRenderer* renderer) override;
|
void BuildVertexBuffer(FModelRenderer* renderer) override;
|
||||||
void AddSkins(uint8_t* hitlist, const FTextureID* surfaceskinids) override;
|
void AddSkins(uint8_t* hitlist, const FTextureID* surfaceskinids) override;
|
||||||
const TArray<TRS>* AttachAnimationData() override;
|
const TArray<TRS>* AttachAnimationData() override;
|
||||||
const TArray<VSMatrix> CalculateBones(int frame1, int frame2, double inter, const TArray<TRS>& animationData, DBoneComponents* bones, int index) override;
|
const TArray<VSMatrix> CalculateBones(int frame1, int frame2, double inter, const TArray<TRS>* animationData, DBoneComponents* bones, int index) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void LoadGeometry();
|
void LoadGeometry();
|
||||||
|
|
|
@ -514,9 +514,9 @@ const TArray<TRS>* IQMModel::AttachAnimationData()
|
||||||
return &TRSData;
|
return &TRSData;
|
||||||
}
|
}
|
||||||
|
|
||||||
const TArray<VSMatrix> IQMModel::CalculateBones(int frame1, int frame2, double inter, const TArray<TRS>& animationData, DBoneComponents* boneComponentData, int index)
|
const TArray<VSMatrix> IQMModel::CalculateBones(int frame1, int frame2, double inter, const TArray<TRS>* animationData, DBoneComponents* boneComponentData, int index)
|
||||||
{
|
{
|
||||||
const TArray<TRS>& animationFrames = &animationData ? animationData : TRSData;
|
const TArray<TRS>& animationFrames = animationData ? *animationData : TRSData;
|
||||||
if (Joints.Size() > 0)
|
if (Joints.Size() > 0)
|
||||||
{
|
{
|
||||||
int numbones = Joints.Size();
|
int numbones = Joints.Size();
|
||||||
|
|
|
@ -365,7 +365,6 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr
|
||||||
auto& ssids = surfaceskinids.Size() > 0 ? surfaceskinids : smf->surfaceskinIDs;
|
auto& ssids = surfaceskinids.Size() > 0 ? surfaceskinids : smf->surfaceskinIDs;
|
||||||
auto ssidp = (unsigned)(i * MD3_MAX_SURFACES) < ssids.Size() ? &ssids[i * MD3_MAX_SURFACES] : nullptr;
|
auto ssidp = (unsigned)(i * MD3_MAX_SURFACES) < ssids.Size() ? &ssids[i * MD3_MAX_SURFACES] : nullptr;
|
||||||
|
|
||||||
const TArray<TRS>* animationData = nullptr;
|
|
||||||
|
|
||||||
bool nextFrame = smfNext && modelframe != modelframenext;
|
bool nextFrame = smfNext && modelframe != modelframenext;
|
||||||
|
|
||||||
|
@ -381,11 +380,11 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr
|
||||||
if (animationid >= 0)
|
if (animationid >= 0)
|
||||||
{
|
{
|
||||||
FModel* animation = Models[animationid];
|
FModel* animation = Models[animationid];
|
||||||
animationData = animation->AttachAnimationData();
|
const TArray<TRS>* animationData = animation->AttachAnimationData();
|
||||||
|
|
||||||
if (!(smf->flags & MDL_MODELSAREATTACHMENTS) || evaluatedSingle == false)
|
if (!(smf->flags & MDL_MODELSAREATTACHMENTS) || evaluatedSingle == false)
|
||||||
{
|
{
|
||||||
boneData = animation->CalculateBones(modelframe, nextFrame ? modelframenext : modelframe, nextFrame ? inter : 0.f, *animationData, actor->boneComponentData, i);
|
boneData = animation->CalculateBones(modelframe, nextFrame ? modelframenext : modelframe, nextFrame ? inter : 0.f, animationData, actor->boneComponentData, i);
|
||||||
boneStartingPosition = renderer->SetupFrame(animation, 0, 0, 0, boneData, -1);
|
boneStartingPosition = renderer->SetupFrame(animation, 0, 0, 0, boneData, -1);
|
||||||
evaluatedSingle = true;
|
evaluatedSingle = true;
|
||||||
}
|
}
|
||||||
|
@ -394,7 +393,7 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr
|
||||||
{
|
{
|
||||||
if (!(smf->flags & MDL_MODELSAREATTACHMENTS) || evaluatedSingle == false)
|
if (!(smf->flags & MDL_MODELSAREATTACHMENTS) || evaluatedSingle == false)
|
||||||
{
|
{
|
||||||
boneData = mdl->CalculateBones(modelframe, nextFrame ? modelframenext : modelframe, nextFrame ? inter : 0.f, *animationData, actor->boneComponentData, i);
|
boneData = mdl->CalculateBones(modelframe, nextFrame ? modelframenext : modelframe, nextFrame ? inter : 0.f, nullptr, actor->boneComponentData, i);
|
||||||
boneStartingPosition = renderer->SetupFrame(mdl, 0, 0, 0, boneData, -1);
|
boneStartingPosition = renderer->SetupFrame(mdl, 0, 0, 0, boneData, -1);
|
||||||
evaluatedSingle = true;
|
evaluatedSingle = true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue