#pragma once #include "CoreMinimal.h" #include "StringDecoder.h" #include "Containers/Deque.h" //////////////////////////////////////////////// // // This is copied over from Luprex source. Not ideal. // //////////////////////////////////////////////// enum ElxAnimValueType { T_STRING, T_NUMBER, T_BOOLEAN, T_XYZ, T_UNINITIALIZED }; //////////////////////////////////////////////// // // An single animation step. // // The body consists of a sequence of FlxAnimField // records. The body is encoded, to read the // FlxAnimField records you need an FlxAnimStepDecoder. // This comes in two versions: the string version, // and the string_view version. // //////////////////////////////////////////////// struct FlxAnimStep { uint64 Hash; std::string_view Body; FlxAnimStep() : Hash(0), Body("") {} FlxAnimStep(uint64 h, std::string_view b) : Hash(h), Body(b) {} }; struct FlxAnimStoredStep { uint64 Hash; std::string Body; FlxAnimStoredStep() : Hash(0), Body("") {} FlxAnimStoredStep(uint64 h, std::string_view b) : Hash(h), Body(b) {} }; //////////////////////////////////////////////// // // A single animation field. // // A field consists of a variable name, // a persistent flag, a type, and some fields // to hold the values. // // If the value is boolean, it is stored in // X, as either 1 or 0. If the value is double, // it is stored in X. // //////////////////////////////////////////////// struct FlxAnimField { std::string_view Name; bool Persistent; ElxAnimValueType Type; double X, Y, Z; std::string_view S; }; //////////////////////////////////////////////// // // An Animation Queue Decoder. // // This acts a lot like a stream reader, // it reads one AnimEntry at a time from // the animation queue until you reach // 'end-of-file'. // //////////////////////////////////////////////// class FlxAnimQueueDecoder { private: FlxStringDecoder Decoder; public: // Initialize the FlxAnimQueueDecoder with the encoded animation queue. // FlxAnimQueueDecoder(std::string_view s) : Decoder(s) {} // Return true if the parser has reached the end of the string. // bool AtEOF() { return Decoder.at_eof(); } // Read one animation step. // FlxAnimStep ReadStep(); // Convert an AnimQueue to an FString. // static FString DebugString(std::string_view s); }; //////////////////////////////////////////////// // // An Animation Step Decoder. // // This acts a lot like a stream reader, // it reads one FlxAnimField at a time from // the animation queue until you reach // 'end-of-file'. // //////////////////////////////////////////////// class FlxAnimStepDecoder { private: FlxStringDecoder Decoder; public: // Initialize the FlxAnimStepDecoder from the FlxAnimStep. // FlxAnimStepDecoder(const FlxAnimStep &step) : Decoder(step.Body) {} FlxAnimStepDecoder(const FlxAnimStoredStep& step) : Decoder(step.Body) {} // Return true if the parser has reached the end of the string. // bool AtEOF() { return Decoder.at_eof(); } // Read one field. // FlxAnimField ReadField(); // Convert an AnimStep to an FString. // static FString DebugString(const FlxAnimStep &step); }; //////////////////////////////////////////////// // // FlxAnimTracker // // This class monitors the animation queue for a single // tangible. It can identify when a new animation has // appeared on the animation queue, and when animations have // been removed from the animation queue. It also // keeps track of which animations have been started. // //////////////////////////////////////////////// class FlxAnimTracker { public: // Our own copy of the animation queue. We only // store the hashes, not the steps. The First element // of the queue is the oldest item. // TDeque AQ; // The sequence number of the first item in AQ. // int32 FirstSeqno; // Map from hash to sequence number. // TMap HashToSeqno; // The sequence number of the first unstarted animation. // int32 UnstartedSeqno; // Array of recently-aborted hash values. TArray AbortedHashes; public: // Construct a tracker. // // Initially, the tracker is in the empty (Clear) state. // FlxAnimTracker(); // Update from the specified animation queue. // // After the update is done, AQ will be a copy // of the animation queue that is passed in. // void Update(std::string_view encqueue); // Fetch the aborted hash values. // // This gets the array of aborted hashes and clears // the stored array. // TArray GetAborted(); // Return true if there are any unstarted animation steps. // bool AnyUnstarted(); // Get the next unstarted animation step. // // You may only call this if AnyUnstarted returns true. // FlxAnimStoredStep GetUnstarted(); // Declare that an animation has been started. // // After starting an animation, you should call this. // void Started(uint64 Hash); };