|
|
|
@ -13,28 +13,44 @@ 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(); |
|
|
|
|
} else if(const auto* key = event->getIf<sf::Event::KeyPressed>()) { |
|
|
|
|
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; |
|
|
|
|
|
|
|
|
|
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, "-s:-f:")) != -1) { |
|
|
|
|
while((opt = getopt(argc, argv, "-hs:f:")) != -1) { |
|
|
|
|
switch(opt) { |
|
|
|
|
case 's': |
|
|
|
|
sprite_name = optarg; |
|
|
|
|
load_sprite = true; |
|
|
|
|
break; |
|
|
|
|
case 'f': |
|
|
|
|
frag_name = optarg; |
|
|
|
|
break; |
|
|
|
|
case 'h': |
|
|
|
|
fmt::println( |
|
|
|
|
"fragviewer is a simple tool to play fragment shaders.\n" |
|
|
|
|
"USAGE: fragviewer [-s sprite_name] -f shader.frag"); |
|
|
|
|
return 0; |
|
|
|
|
default: |
|
|
|
|
fmt::println("USAGE: fragviewer [-s sprite_name] -f shader.frag"); |
|
|
|
|
return -1; |
|
|
|
@ -51,17 +67,23 @@ int main(int argc, char *argv[]) { |
|
|
|
|
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; |
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
@ -74,7 +96,14 @@ int main(int argc, char *argv[]) { |
|
|
|
|
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(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|