Program Listing for File flipbook_decorator.h

Return to documentation for file (rootex/core/ui/flipbook_decorator.h)

#pragma once

#include "common/common.h"
#include "core/renderer/texture.h"

#include "rootex_decorator.h"

#include "RmlUi/Core/DecoratorInstancer.h"
#include "RmlUi/Core/PropertyDefinition.h"
#include "RmlUi/Core/Geometry.h"
#include "RmlUi/Core/GeometryUtilities.h"

class FlipbookDecorator : public RootexDecorator
{
    struct FlipbookElementData
    {
        static inline Vector<FlipbookElementData*> s_DataInstances;

        float currentFrame = 0;
        Rml::Geometry geometry;

        FlipbookElementData();
        ~FlipbookElementData();
    };

    Vector<Rml::Rectangle> m_SpriteRectangles;
    float m_FPS = 1.0f;

public:
    FlipbookDecorator() = default;
    ~FlipbookDecorator() = default;

    bool addFrame(const Rml::Sprite* sprite);
    void setFPS(float fps) { m_FPS = fps; }

    void update(float deltaSeconds) override;

    Rml::DecoratorDataHandle GenerateElementData(Rml::Element* element) const override;
    void ReleaseElementData(Rml::DecoratorDataHandle elementData) const override;
    void RenderElement(Rml::Element* element, Rml::DecoratorDataHandle elementData) const override;
};

class FlipbookDecoratorInstancer : public Rml::DecoratorInstancer
{
    Rml::PropertyId m_FPSID;
    Rml::PropertyId m_SpritesID;

public:
    FlipbookDecoratorInstancer();

    Rml::SharedPtr<Rml::Decorator> InstanceDecorator(const Rml::String& name, const Rml::PropertyDictionary& properties, const Rml::DecoratorInstancerInterface& instancerInterface) override;
};