#include <SFML/Graphics.hpp>
#include <cstdlib>
#include <ctime>
#include <map>
int main()
{
std::srand(std::time(0));
const int width = 512;
const int height = 256;
sf::Image image(width, height, sf::Color::White);
image.SetSmooth(false);
std::map<int, int> interiorId2offset;
for (int i = 0; i < width; ++ i) {
for (int j = 0; j < height; ++ j) {
int val = 0;
int offset = 0;
if (j % 128 < 64)
offset = 40;
bool one = ((i + offset) % 128 < 2 || (i + offset) % 128 > 126);
bool two = ( j % 64 < 2 || j % 64 > 62);
bool nearOne = (i % 128 < 8 || i % 128 > 120);
bool nearTwo = (j % 64 < 8 || j % 64 > 56);
if (one && !nearTwo)
val = 225;
if (two && !nearOne)
val = 225;
bool interior = !one && !two;
if (interior) {
int x = (i + offset) / 128;
int y = j / 64;
if (x >= width / 128) x = 0; // in order to be tileable
int interiorOffset = interiorId2offset[x + 100 * y];
if (interiorOffset == 0) {
interiorOffset = std::rand() % 3 * 30 + 1;
interiorId2offset[x + 100 * y] = interiorOffset;
}
val = ((i + offset) % 128 + j % 64 + interiorOffset) % 256;
if (val < 25) val = 25;
if (val > 175) val = 175;
}
image.SetPixel(i, j, sf::Color(val, val, val));
}
}
sf::Sprite sprite(image);
sf::RenderWindow window(sf::VideoMode(width * 2, height * 2, 32), "Procedural Textures!");
window.UseVerticalSync(true);
bool Running = true;
while (Running)
{
sf::Event Event;
while (window.GetEvent(Event))
{
if (Event.Type == sf::Event::Closed)
Running = false;
if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
Running = false;
}
window.Clear();
window.Draw(sprite);
sprite.Move(width, 0);
window.Draw(sprite);
sprite.Move(0, height);
window.Draw(sprite);
sprite.Move(- width, 0);
window.Draw(sprite);
sprite.Move(0, - height);
window.Display();
}
}
I2luY2x1ZGUgPFNGTUwvR3JhcGhpY3MuaHBwPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8bWFwPgoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnNyYW5kKHN0ZDo6dGltZSgwKSk7CgogICAgY29uc3QgaW50IHdpZHRoICA9IDUxMjsKICAgIGNvbnN0IGludCBoZWlnaHQgPSAyNTY7CgogICAgc2Y6OkltYWdlIGltYWdlKHdpZHRoLCBoZWlnaHQsIHNmOjpDb2xvcjo6V2hpdGUpOwoKICAgIGltYWdlLlNldFNtb290aChmYWxzZSk7CgogICAgc3RkOjptYXA8aW50LCBpbnQ+IGludGVyaW9ySWQyb2Zmc2V0OwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7ICsrIGkpIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGhlaWdodDsgKysgaikgewoKICAgICAgICAgICAgaW50IHZhbCA9IDA7CiAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOwoKICAgICAgICAgICAgaWYgKGogJSAxMjggPCA2NCkKICAgICAgICAgICAgICAgIG9mZnNldCA9IDQwOwoKICAgICAgICAgICAgYm9vbCBvbmUgPSAoKGkgKyBvZmZzZXQpICUgMTI4IDwgMiB8fCAoaSArIG9mZnNldCkgJSAxMjggPiAxMjYpOwogICAgICAgICAgICBib29sIHR3byA9ICggaiAgICAgICAgICAgJSAgNjQgPCAyIHx8ICBqICAgICAgICAgICAlICA2NCA+ICA2Mik7CgogICAgICAgICAgICBib29sIG5lYXJPbmUgPSAoaSAlIDEyOCA8IDggfHwgaSAlIDEyOCA+IDEyMCk7CiAgICAgICAgICAgIGJvb2wgbmVhclR3byA9IChqICUgIDY0IDwgOCB8fCBqICUgIDY0ID4gIDU2KTsKCiAgICAgICAgICAgIGlmIChvbmUgJiYgIW5lYXJUd28pCiAgICAgICAgICAgICAgICB2YWwgPSAyMjU7CgogICAgICAgICAgICBpZiAodHdvICYmICFuZWFyT25lKQogICAgICAgICAgICAgICAgdmFsID0gMjI1OwoKICAgICAgICAgICAgYm9vbCBpbnRlcmlvciA9ICFvbmUgJiYgIXR3bzsKCiAgICAgICAgICAgIGlmIChpbnRlcmlvcikgewoKICAgICAgICAgICAgICAgIGludCB4ID0gKGkgKyBvZmZzZXQpIC8gMTI4OwogICAgICAgICAgICAgICAgaW50IHkgPSAgaiAgICAgICAgICAgLyAgNjQ7CgogICAgICAgICAgICAgICAgaWYgKHggPj0gd2lkdGggLyAxMjgpIHggPSAwOyAvLyBpbiBvcmRlciB0byBiZSB0aWxlYWJsZQoKICAgICAgICAgICAgICAgIGludCBpbnRlcmlvck9mZnNldCA9IGludGVyaW9ySWQyb2Zmc2V0W3ggKyAxMDAgKiB5XTsKCiAgICAgICAgICAgICAgICBpZiAoaW50ZXJpb3JPZmZzZXQgPT0gMCkgewoKICAgICAgICAgICAgICAgICAgICBpbnRlcmlvck9mZnNldCA9IHN0ZDo6cmFuZCgpICUgMyAqIDMwICsgMTsKICAgICAgICAgICAgICAgICAgICBpbnRlcmlvcklkMm9mZnNldFt4ICsgMTAwICogeV0gPSBpbnRlcmlvck9mZnNldDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YWwgPSAoKGkgKyBvZmZzZXQpICUgMTI4ICsgaiAlIDY0ICsgaW50ZXJpb3JPZmZzZXQpICUgMjU2OwoKICAgICAgICAgICAgICAgIGlmICh2YWwgPCAgMjUpIHZhbCA9ICAyNTsKICAgICAgICAgICAgICAgIGlmICh2YWwgPiAxNzUpIHZhbCA9IDE3NTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaW1hZ2UuU2V0UGl4ZWwoaSwgaiwgc2Y6OkNvbG9yKHZhbCwgdmFsLCB2YWwpKTsKICAgICAgICB9CiAgICB9CgogICAgc2Y6OlNwcml0ZSBzcHJpdGUoaW1hZ2UpOwoKICAgIHNmOjpSZW5kZXJXaW5kb3cgd2luZG93KHNmOjpWaWRlb01vZGUod2lkdGggKiAyLCBoZWlnaHQgKiAyLCAzMiksICJQcm9jZWR1cmFsIFRleHR1cmVzISIpOwoKICAgIHdpbmRvdy5Vc2VWZXJ0aWNhbFN5bmModHJ1ZSk7CgogICAgYm9vbCBSdW5uaW5nID0gdHJ1ZTsKCiAgICB3aGlsZSAoUnVubmluZykKICAgIHsKICAgICAgICBzZjo6RXZlbnQgRXZlbnQ7CgogICAgICAgIHdoaWxlICh3aW5kb3cuR2V0RXZlbnQoRXZlbnQpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEV2ZW50LlR5cGUgPT0gc2Y6OkV2ZW50OjpDbG9zZWQpCiAgICAgICAgICAgICAgICBSdW5uaW5nID0gZmFsc2U7CgogICAgICAgICAgICBpZiAoKEV2ZW50LlR5cGUgPT0gc2Y6OkV2ZW50OjpLZXlQcmVzc2VkKSAmJiAoRXZlbnQuS2V5LkNvZGUgPT0gc2Y6OktleTo6RXNjYXBlKSkKICAgICAgICAgICAgICAgIFJ1bm5pbmcgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHdpbmRvdy5DbGVhcigpOwoKICAgICAgICB3aW5kb3cuRHJhdyhzcHJpdGUpOwogICAgICAgIHNwcml0ZS5Nb3ZlKHdpZHRoLCAwKTsKICAgICAgICB3aW5kb3cuRHJhdyhzcHJpdGUpOwogICAgICAgIHNwcml0ZS5Nb3ZlKDAsIGhlaWdodCk7CiAgICAgICAgd2luZG93LkRyYXcoc3ByaXRlKTsKICAgICAgICBzcHJpdGUuTW92ZSgtIHdpZHRoLCAwKTsKICAgICAgICB3aW5kb3cuRHJhdyhzcHJpdGUpOwogICAgICAgIHNwcml0ZS5Nb3ZlKDAsIC0gaGVpZ2h0KTsKCiAgICAgICAgd2luZG93LkRpc3BsYXkoKTsKICAgIH0KfQ==