summaryrefslogtreecommitdiff
path: root/src/main.cpp
blob: 5876efce9649b43bbcdf078612b0c9ba85d3b1ec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <SFML/Graphics.hpp>

int main() {
    sf::Texture texture;
    if(!texture.loadFromFile("flag.png"))
        return 1;

    texture.setSmooth(true);

    sf::Vector2u window_size = texture.getSize();
    sf::RenderWindow window(sf::VideoMode(window_size.x, window_size.y), "SFML works!", 0);
    window.setVerticalSyncEnabled(true);
    window.setFramerateLimit(24);

    sf::Shader shader;
    if(!shader.loadFromFile("flag.glsl", sf::Shader::Type::Fragment))
        return 1;

    shader.setUniform("texture", texture);

    sf::Vertex vertex[4];
    vertex[0] = sf::Vertex(sf::Vector2f(0.0f, 0.0f), sf::Color::White, sf::Vector2f(0.0f, 0.0f));
    vertex[1] = sf::Vertex(sf::Vector2f(window_size.x, 0.0f), sf::Color::White, sf::Vector2f(1.0f, 0.0f));
    vertex[2] = sf::Vertex(sf::Vector2f(window_size.x, window_size.y), sf::Color::White, sf::Vector2f(1.0f, 1.0f));
    vertex[3] = sf::Vertex(sf::Vector2f(0.0f, window_size.y), sf::Color::White, sf::Vector2f(0.0f, 1.0f));

    sf::Texture texture_output;
    texture_output.create(texture.getSize().x, texture.getSize().y);

    int flag_start_x = texture.getSize().x*0.2;
    int flag_start_y = texture.getSize().y*0.2;
    int flag_width = texture.getSize().x*0.6;
    int flag_height = texture.getSize().y*0.6;

    sf::Image output_image;
    output_image.create(flag_width, flag_height, sf::Color::Transparent);
    std::vector<sf::Image> frames;

    sf::Clock timer;
    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        shader.setUniform("iTime", timer.getElapsedTime().asSeconds());
        window.clear(sf::Color::Transparent);
        window.draw(vertex, 4, sf::PrimitiveType::Quads, &shader);
        window.display();

        texture_output.update(window);
        sf::Image image = texture_output.copyToImage();
        output_image.copy(image, 0, 0, sf::IntRect(flag_start_x, flag_start_y, flag_width, flag_height), false);
        frames.push_back(std::move(output_image));
    }

    system("rm -rf frames/*; mkdir frames");
    for(size_t i = 0; i < frames.size(); ++i) {
        frames[i].saveToFile("frames/" + std::to_string(i) + ".png");
    }
    system("ffmpeg -i \"frames/%d.png\" -framerate 24 -filter_complex \"fps=24,split=2[palette_in][gif];[palette_in]palettegen[palette_out];[gif]fifo[gif_fifo]; [gif_fifo][palette_out]paletteuse\" -y frames/output.gif");

    return 0;
}