86 lines
2.0 KiB
C++
86 lines
2.0 KiB
C++
|
|
#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;
|
|
}
|
|
|