#include "AnimQueue.h" FAnimStep FAnimQueueDecoder::ReadStep() { FAnimStep result; result.Hash = Decoder.read_uint64(); result.Body = Decoder.read_string_view(); return result; } FAnimField FAnimStepDecoder::ReadField() { FAnimField result; result.Name = Decoder.read_string_view(); result.Persistent = Decoder.read_bool(); result.Type = (EAnimValueType)Decoder.read_uint8(); switch (result.Type) { case T_STRING: { result.S = Decoder.read_string_view(); break; } case T_NUMBER: { result.X = Decoder.read_double(); break; } case T_BOOLEAN: { result.X = Decoder.read_bool() ? 1.0 : 0.0; break; } case T_XYZ: { result.X = Decoder.read_double(); result.Y = Decoder.read_double(); result.Z = Decoder.read_double(); break; } default: { Decoder.set_at_eof(); result.Type = T_BOOLEAN; result.X = 0; break; } } return result; } FString FAnimQueueDecoder::DebugString(std::string_view queue) { FString result; FAnimQueueDecoder decoder(queue); while (!decoder.AtEOF()) { FAnimStep step = decoder.ReadStep(); FString stepdebug = FAnimStepDecoder::DebugString(step); result.Appendf(TEXT("%s\n"), *stepdebug); } return result; } FString FAnimStepDecoder::DebugString(const FAnimStep& step) { FString result; FAnimStepDecoder decoder(step); bool first = true; while (!decoder.AtEOF()) { FAnimField field = decoder.ReadField(); if (!first) { result.Append(TEXT(" ")); } result.Append(FString(field.Name.size(), (const UTF8CHAR*)field.Name.data())); result.Append(field.Persistent ? TEXT("=") : TEXT(":")); switch (field.Type) { case EAnimValueType::T_STRING: result.Append(FString(field.S.size(), (const UTF8CHAR*)field.S.data())); break; case EAnimValueType::T_NUMBER: result.Appendf(TEXT("%lf"), field.X); break; case EAnimValueType::T_BOOLEAN: result.Append((field.X) == 1.0 ? TEXT("true") : TEXT("false")); break; case EAnimValueType::T_XYZ: result.Appendf(TEXT("%lf,%lf,%lf"), field.X, field.Y, field.Z); break; } first = false; } return result; }