int main(int argc, const char ** argv) { auto && settings = load_settings(argc, argv); while(!settings.output_file) { freopen(DEVNULL, "w", stderr); // Get rid of: "INFO: Could not find files for the given pattern(s)." (no, it's not related to file patterns) const auto saveto = tinyfd_saveFileDialog("Save the generated mandala to...", "mandala.png", 4, make_array("*.bmp", "*.png", "*.tga", "*.jpg").data(), "image files"); freopen(DEVTTY, "w", stderr); if(!saveto) { QUIET(settings, cerr, "User cancelled filename prompt; aborting\n"); return 1; } settings.output_file = make_unique<string>(saveto); if(!extensioned_path_constraint{}.check(*settings.output_file)) { QUIET(settings, cout, "Specified path doesn't contain an extension; please retry\n\n"); settings.output_file = nullptr; } } RenderTexture img; img.create(settings.dimensions.first, settings.dimensions.second); img.clear(); auto start = high_resolution_clock::now(); { generator gen(img.getSize() / 2u); gen.generate_and_draw(img.getSize(), img, settings.points_to_generate, settings.parts); } auto end = high_resolution_clock::now(); QUIET(settings, cout, "Generated " << settings.points_to_generate << " points in " << duration_cast<std::chrono::milliseconds>(end - start).count() << "ms\n"); if(!img.getTexture().copyToImage().saveToFile(*settings.output_file)) QUIET(settings, cerr, "Saving \"" << *settings.output_file << "\" failed.\n"); }
int main(int argc, char **argv) { RenderWindow wnd(VideoMode(800, 600), "Test dynamic lights"); if (DemoSettings::EnableFrameRateLimit) wnd.setFramerateLimit(DemoSettings::FrameRateLimit); wnd.setVisible(true); Texture bgTexture; bgTexture.loadFromFile("data/grass.png"); Sprite bgSpr(bgTexture); #pragma region Generate some occluders Shapes occluders(DemoSettings::OccludersCount); const Vector2f center(400, 300); const float r = DemoSettings::OccludersRange; const float td = 3.141592f * 2 / occluders.size(); float t = 0.f; auto getNextOccPos = [&] () -> Vector2f { Vector2f p(cos(t) * r, sin(t) * r); t += td; return p + center; }; if (DemoSettings::UseBigBugOccluder) { std::shared_ptr<sf::RectangleShape> s(new sf::RectangleShape(sf::Vector2f(250.0f, 50.0f))); s->setPosition(400.0f, 300.0f); s->setFillColor(Color::Cyan); occluders[0] = s; occluders.resize(1); } else if (DemoSettings::UseSpheresAsOccluders) { generate(occluders.begin(), occluders.end(), [&] () -> ShapePtr { std::shared_ptr<sf::CircleShape> s(new sf::CircleShape(6.0f)); s->setFillColor(Color::Cyan); s->setPosition(getNextOccPos()); return s; } ); } else { generate(occluders.begin(), occluders.end(), [&] () -> ShapePtr { std::shared_ptr<sf::RectangleShape> s(new sf::RectangleShape(sf::Vector2f(6.0f, 6.0f))); s->setFillColor(Color::Cyan); s->setPosition(getNextOccPos()); return s; } ); } #pragma endregion #pragma region Generate lights vector<LightPtr> lights; if (!DemoSettings::EnableOnlyManualLight) { generate_n(back_inserter(lights), 4, [&] () -> LightPtr { return LightPtr(new Light(center, DemoSettings::DefaultLightsRadius)); } ); } if (DemoSettings::EnableManualLight || DemoSettings::EnableOnlyManualLight) lights.push_back(LightPtr(new Light(center, DemoSettings::DefaultLightsRadius))); const float autoLightsRadius = DemoSettings::OccludersRange - DemoSettings::DefaultLightsRadius * 0.5f; #pragma endregion RenderTexture shadowMap; shadowMap.create(800, 600); Sprite shadowMapSprite; sf::Clock timer; sf::Clock clock; while (wnd.isOpen()) { if (handleEvents(wnd, *lights.rbegin())) break; if (!DemoSettings::EnableOnlyManualLight) { const float dt = timer.getElapsedTime().asSeconds(); lights[0]->getPosition().x = center.x + cos(dt) * autoLightsRadius; lights[1]->getPosition().x = center.x - cos(dt) * autoLightsRadius; lights[2]->getPosition().y = center.y + sin(dt) * autoLightsRadius; lights[3]->getPosition().y = center.y - sin(dt) * autoLightsRadius; } #pragma region Update shadows (Note: parallelize this, trivial to get speed there; provide a light manager class to help) clock.restart(); for_each(lights.begin(), lights.end(), [&] (LightPtr l) { l->reset(); l->addOccluders(occluders); } ); cout << "Shadows generation: " << clock.getElapsedTime().asMilliseconds() << endl; #pragma endregion // Draw normally #pragma region Render clock.restart(); wnd.draw(bgSpr); shadowMap.clear(Color(0, 0, 0, 0)); for_each(lights.begin(), lights.end(), [&] (const LightPtr l) { l->DrawShadows(shadowMap); } ); shadowMap.display(); shadowMapSprite.setTexture(shadowMap.getTexture()); wnd.draw(shadowMapSprite); if (DemoSettings::DrawOccluders) for_each(occluders.begin(), occluders.end(), [&] (const ShapePtr s) { wnd.draw(*s); } ); if (DemoSettings::EnableLightsDebugDraw) for_each(lights.begin(), lights.end(), [&] (const LightPtr l) { l->DebugDraw(wnd); } ); cout << "Rendering: " << clock.getElapsedTime().asMilliseconds() << endl; #pragma endregion wnd.display(); } return 0; };