rework interpolation to allow for precalculated frames

This commit is contained in:
Ricardo Luís Vaz Silva 2024-09-13 15:09:57 -03:00
commit 1429e22441
9 changed files with 184 additions and 82 deletions

View file

@ -1443,7 +1443,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, AnimModelOverride &amo
return arc;
}
FSerializer &Serialize(FSerializer &arc, const char *key, struct AnimOverride &ao, struct AnimOverride *def)
FSerializer &Serialize(FSerializer &arc, const char *key, struct ModelAnim &ao, struct ModelAnim *def)
{
arc.BeginObject(key);
arc("firstFrame", ao.firstFrame);
@ -1458,6 +1458,64 @@ FSerializer &Serialize(FSerializer &arc, const char *key, struct AnimOverride &a
return arc;
}
FSerializer &Serialize(FSerializer &arc, const char *key, ModelAnimFrame &ao, ModelAnimFrame *def)
{
arc.BeginObject(key);
if(arc.isReading())
{
if(arc.HasKey("firstFrame"))
{ // legacy save, clear interpolation
ao = nullptr;
}
else
{
FString type = "nullptr";
arc("type", type);
if(type.Compare("nullptr") == 0)
{
ao = nullptr;
}
else if(type.Compare("interp") == 0)
{
ModelAnimFrameInterp tmp;
arc("inter", tmp.inter);
arc("frame1", tmp.frame1);
arc("frame2", tmp.frame2);
ao = tmp;
}
else if(type.Compare("precalcIQM") == 0)
{
//TODO, unreachable
ao = nullptr;
}
}
}
else // if(arc.isWriting())
{
if(std::holds_alternative<std::nullptr_t>(ao))
{
FString tmp = "nullptr";
arc("type", tmp);
}
else if(std::holds_alternative<ModelAnimFrameInterp>(ao))
{
FString type = "interp";
arc("type", type);
arc("inter", std::get<ModelAnimFrameInterp>(ao).inter);
arc("frame1", std::get<ModelAnimFrameInterp>(ao).frame1);
arc("frame2", std::get<ModelAnimFrameInterp>(ao).frame2);
}
else if(std::holds_alternative<ModelAnimFramePrecalculatedIQM>(ao))
{
//TODO
FString type = "nullptr";
arc("type", type);
}
}
arc.EndObject();
return arc;
}
void DActorModelData::Serialize(FSerializer& arc)
{
Super::Serialize(arc);
@ -3862,7 +3920,7 @@ void AActor::Tick ()
special2++;
}
if(flags9 & MF9_DECOUPLEDANIMATIONS && modelData && !(modelData->curAnim.flags & ANIMOVERRIDE_NONE))
if(flags9 & MF9_DECOUPLEDANIMATIONS && modelData && !(modelData->curAnim.flags & MODELANIM_NONE))
{
modelData->curAnim.startTic += 1;
}
@ -3915,7 +3973,7 @@ void AActor::Tick ()
special2++;
}
if(flags9 & MF9_DECOUPLEDANIMATIONS && modelData && !(modelData->curAnim.flags & ANIMOVERRIDE_NONE))
if(flags9 & MF9_DECOUPLEDANIMATIONS && modelData && !(modelData->curAnim.flags & MODELANIM_NONE))
{
modelData->curAnim.startTic += 1;
}