Пример #1
0
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");
}
Пример #2
0
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;
};