Вопрос ImGui DX11 Gif render

Начинающий
Статус
Оффлайн
Регистрация
1 Апр 2020
Сообщения
13
Реакции[?]
0
Поинты[?]
0
Как рендерить гифку в имгуай? Видел как-то через stb, но никакой даже хоть чу-чуть подробной информации в инете не нашел. Помогите:astonished:
 
На самом деле я Zodiak
Участник
Статус
Оффлайн
Регистрация
22 Дек 2020
Сообщения
1,052
Реакции[?]
183
Поинты[?]
72K
гифку на кадры режешь и по одной фотке загружаешь,а потом рендеришь каждый кадр :roflanBuldiga: следующую фотку
 
Участник
Статус
Оффлайн
Регистрация
2 Фев 2020
Сообщения
818
Реакции[?]
378
Поинты[?]
0
.cpp:
#define STBI_ONLY_GIF
#define STBI_ONLY_PNG
#define STBI_NO_FAILURE_STRINGS
#define STBI_NO_STDIO
#define STB_IMAGE_IMPLEMENTATION
#include "ui/imgui/stb_image.h"

#include "ui/imgui/imgui.h"
#include "ui/imgui/imgui_impl_dx9.h"

void c_gif_image::init( void* p_data, int size ) {
    textures.clear( );

    data = stbi_load_gif_from_memory( ( stbi_uc* )p_data, size, &delays, &x, &y, &z, &comp, 0 );
}

void c_gif_image::init(const char* path) {
    FILE* pf = fopen(path, "rb");

    if (!pf)
        return;

    fseek(pf, 0L, SEEK_END);

    auto size = (int)ftell(pf);
    auto data = malloc(size);

    fseek(pf, 0L, SEEK_SET);
    fread(data, size, 1, pf);
    fclose(pf);

    init(data, size);
}

void c_gif_image::draw(ImDrawList* list, ImVec2 pos) {
    float time = ImGui::GetTime();

    if (z != 0) {
        if (time > old_time) {
            old_time = time + *delays * 0.001f;

            frame++;
        }

        if ((int)frame >= z)
            frame = 0;
    }
    else
        frame = 0;

    if (!textures[frame])
        textures[frame] = ImGui_CreateTextureRGBA(x, y, data + x * y * comp * frame);

    list->AddImage(textures[frame], pos, ImVec2(pos.x + x / 2, pos.y + y / 2));
}
.h:
class c_gif_image
{
    std::unordered_map<int, void*> textures;

    int frame = 0;
    float old_time = 0;

    int* delays = nullptr;
    int x;
    int y;
    int z;
    int comp;
    unsigned char* data;
public:
    void init( void* data, int size );
    void init( const char* path );
    void draw( ImDrawList* list, ImVec2 pos );
};
код под dx9, создание текстуры ток поменять надо, а так будет тебе счастье
 
Сверху Снизу