#include "textures.hpp" #include #include #include #include #include #include #include "dbc.hpp" #include #include void Handle_events(sf::RenderWindow &window) { // is this a main event loop while (const auto event = window.pollEvent()) { if(event->is()) { window.close(); } else if(const auto* key = event->getIf()) { using KEY = sf::Keyboard::Scan; if(key->scancode == KEY::Escape) { window.close(); } } } } int main(int argc, char *argv[]) { int opt = 0; bool load_sprite = false; std::string sprite_name; std::string frag_name; sf::Clock clock; sf::Shader shader; sf::RectangleShape rect; textures::SpriteTexture sprite_texture; sf::Vector2f u_resolution{720.0, 720.0}; sf::Vector2u screen_resolution{720, 720}; textures::init(); dbc::check(sf::Shader::isAvailable(), "You apparently are a time traveler from the 80s who doesn't have shaders."); while((opt = getopt(argc, argv, "-hs:f:-x:-y:")) != -1) { switch(opt) { case 's': sprite_name = optarg; load_sprite = true; break; case 'f': frag_name = optarg; break; case 'x': screen_resolution.x = std::atoi(optarg); u_resolution.x = screen_resolution.x; break; case 'y': screen_resolution.y = std::atoi(optarg); u_resolution.y = screen_resolution.y; break; case 'h': fmt::println( "fragviewer is a simple tool to play fragment shaders.\n" "USAGE: fragviewer [-x size_x -y size_y] [-s sprite_name] -f shader.frag"); return 0; default: fmt::println("USAGE: fragviewer [-x size_x -y size_y] [-s sprite_name] -f shader.frag"); return -1; } } fmt::println("sprite is", sprite_name); dbc::check(frag_name != "", "You must set the -f shader.frag option."); sf::RenderWindow window(sf::VideoMode(screen_resolution), "SFML Frag Shader Viewer"); window.setFramerateLimit(60); window.setVerticalSyncEnabled(true); bool good_shader = shader.loadFromFile(frag_name, sf::Shader::Type::Fragment); dbc::check(good_shader, fmt::format("failed to load shader {}", frag_name)); if(load_sprite) { sprite_texture = textures::get(sprite_name); sprite_texture.sprite->setPosition({0,0}); auto bounds = sprite_texture.sprite->getLocalBounds(); sf::Vector2f scale{u_resolution.x / bounds.size.x, u_resolution.y / bounds.size.y}; sprite_texture.sprite->setScale(scale); shader.setUniform("texture", sf::Shader::CurrentTexture); } else { rect.setPosition({0,0}); rect.setSize(u_resolution); rect.setFillColor({255, 0, 0, 255}); } shader.setUniform("u_resolution", u_resolution); while(window.isOpen()) { Handle_events(window); sf::Time u_time = clock.getElapsedTime(); sf::Vector2i mouse_at = sf::Mouse::getPosition(window); sf::Vector2f u_mouse{float(mouse_at.x), float(mouse_at.y)}; shader.setUniform("u_mouse", u_mouse); shader.setUniform("u_time", u_time.asSeconds()); window.clear(); if(load_sprite) { window.draw(*sprite_texture.sprite, &shader); } else { window.draw(rect, &shader); } window.display(); } }