#include "textures.hpp" #include <SFML/Graphics/Sprite.hpp> #include <SFML/Graphics/Texture.hpp> #include <SFML/Graphics/RenderWindow.hpp> #include <SFML/System.hpp> #include <SFML/Audio.hpp> #include <SFML/Window/Event.hpp> #include "dbc.hpp" #include <fmt/core.h> #include <unistd.h> void Handle_events(sf::RenderWindow &window) { // is this a main event loop while (const auto event = window.pollEvent()) { if(event->is<sf::Event::Closed>()) { fmt::print("Exiting...\n"); window.close(); } } } int main(int argc, char *argv[]) { int opt = 0; std::string sprite_name; std::string frag_name; dbc::check(sf::Shader::isAvailable(), "You apparently are a time traveler from the 80s who doesn't have shaders."); while((opt = getopt(argc, argv, "-s:-f:")) != -1) { switch(opt) { case 's': sprite_name = optarg; break; case 'f': frag_name = optarg; break; default: fmt::println("USAGE: fragviewer [-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::Vector2f u_resolution{720.0, 720.0}; sf::RenderWindow window(sf::VideoMode({720, 720}), "SFML Frag Shader Viewer"); window.setFramerateLimit(60); window.setVerticalSyncEnabled(true); sf::Clock clock; sf::Shader shader; bool good_shader = shader.loadFromFile(frag_name, sf::Shader::Type::Fragment); dbc::check(good_shader, fmt::format("failed to load shader {}", frag_name)); sf::RectangleShape rect; 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.draw(rect, &shader); window.display(); } }