Advertisement
Guest User

Untitled

a guest
Dec 18th, 2015
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
D 5.04 KB | None | 0 0
  1. import derelict.sdl2.sdl;
  2. import std.stdio;
  3. import std.string;
  4. import std.traits;
  5. import std.math;
  6. import std.array;
  7. import std.datetime;
  8. import std.conv;
  9. import std.algorithm;
  10. import std.parallelism;
  11. import std.random;
  12. import std.file;
  13. import core.thread;
  14.  
  15. auto mag = 1f;
  16. auto camX = 0f;
  17. auto camY = 0f;
  18. const drawWidth = 1000;
  19. const drawHeight = 1000;
  20. const tapeLength = 100000;
  21. Instruction[tapeLength] tape;
  22. uint direction = 0;
  23. auto gridPointer = Pos(0, 0);
  24. uint tapePointer = 0;
  25. Dir[4] dirTable = [ Dir(0, 1), Dir(-1, 0), Dir(0, -1), Dir(1, 0) ];
  26. ulong steps = 0;
  27. auto rng = Random();
  28. bool[int][int] cells;
  29.  
  30. /*uint[tapeLength * 4] sig = [
  31. 13,5,1,3,
  32. 4,11,3,0,
  33. 1,6,1,2,
  34. 13,3,2,1,
  35. 11,3,0,0,
  36. 10,9,1,0,
  37. 13,3,2,3
  38. ];*/
  39.  
  40. struct Dir {
  41.     byte x, y;
  42. }
  43.  
  44. struct Pos {
  45.     uint x, y;
  46. }
  47.  
  48. struct Instruction {
  49.     uint[2] tapeAdvance;
  50.     uint[2] leftTurns;
  51. }
  52.  
  53. void generateProgram() {
  54.     static if(__traits(compiles, sig)) {
  55.         for(int i = 0; i < tapeLength; i++) {
  56.             tape[i] = Instruction([sig[i*4], sig[i*4+1]], [sig[i*4+2], sig[i*4+3]]);
  57.         }
  58.     } else {
  59.         char[] buf;
  60.         for(int i = 0; i < tape.length; i++) {
  61.             tape[i] = Instruction(
  62.                 [uniform(0, tapeLength * 2), uniform(0, tapeLength * 2)],
  63.                 [uniform(0, 4), uniform(0, 4)]);
  64.             //writefln("%s,%s,%s,%s", tape[i].tapeAdvance[0], tape[i].tapeAdvance[1], tape[i].leftTurns[0], tape[i].leftTurns[1]);
  65.             buf ~= tape[i].tapeAdvance[0].to!string ~ "," ~ tape[i].tapeAdvance[1].to!string ~ "," ~ tape[i].leftTurns[0].to!string ~ "," ~ tape[i].leftTurns[1].to!string ~ "\n";
  66.         }
  67.         std.file.write("sig.txt", buf);
  68.     }
  69. }
  70.  
  71. int drawX = 0;
  72. int drawY = 0;
  73.  
  74. void main() {
  75.     DerelictSDL2.load();
  76.     SDL_Init(SDL_INIT_VIDEO);
  77.     SDL_DisplayMode mode;
  78.     SDL_GetDesktopDisplayMode(0, &mode);
  79.     SDL_Window* window = SDL_CreateWindow("Viewer", mode.w/2 - drawWidth/2, mode.h/2 - drawHeight/2, drawWidth, drawHeight, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);
  80.     SDL_Surface* surface = SDL_GetWindowSurface(window);
  81.     SDL_PixelFormat* format = surface.format;
  82.     writefln("%s", format.BytesPerPixel);
  83.  
  84.     generateProgram();
  85.  
  86.     SDL_Event event;
  87.     bool quit = false;
  88.     bool run = true;
  89.  
  90.     while (!quit) {
  91.         while(SDL_PollEvent(&event)) {
  92.             if (event.type == SDL_QUIT) {
  93.                 quit = true;
  94.             } else if(event.type == SDL_MOUSEWHEEL) {
  95.                 if(event.wheel.y > 0) {
  96.                     mag *= 2;
  97.                 } else {
  98.                     mag *= 0.5;
  99.                 }
  100.             }
  101.         }
  102.  
  103.         ubyte* state = SDL_GetKeyboardState(null);
  104.         if (state[SDL_SCANCODE_LEFT]) {
  105.             camX -= 10/mag;
  106.         }
  107.         if (state[SDL_SCANCODE_RIGHT]) {
  108.             camX += 10/mag;
  109.         }
  110.         if (state[SDL_SCANCODE_UP]) {
  111.             camY -= 10/mag;
  112.         }
  113.         if (state[SDL_SCANCODE_DOWN]) {
  114.             camY += 10/mag;
  115.         }
  116.  
  117.         Pos[] updates;
  118.         if (run && runMachine()) {
  119.             run = false;
  120.             continue;
  121.         }
  122.  
  123.         auto start = Clock.currTime;
  124.         float time = 0;
  125.         for(; time < 1f/60; drawY++, drawY%=drawHeight) {
  126.             for(drawX = 0; drawX < drawWidth; drawX++) {
  127.                 auto dx = cast(int)((drawX - drawWidth/2)/mag + camX);
  128.                 auto dy = cast(int)((drawY - drawHeight/2)/mag + camY);
  129.                 auto idx = drawY * drawWidth + drawX;
  130.                 auto data = cast(ubyte*)surface.pixels;
  131.                 if(dx in cells && dy in cells[dx]) {
  132.                     data[idx * 4 + 0] = 230;
  133.                     data[idx * 4 + 1] = 20;
  134.                     data[idx * 4 + 2] = 0;
  135.                     data[idx * 4 + 3] = 255;
  136.                 } else {
  137.                     data[idx * 4 + 0] = 0;
  138.                     data[idx * 4 + 1] = 0;
  139.                     data[idx * 4 + 2] = 0;
  140.                     data[idx * 4 + 3] = 255;
  141.                 }
  142.             }
  143.             time = (cast(float)(Clock.currTime - start).total!"nsecs")/1e9;
  144.         }
  145.         SDL_UpdateWindowSurface(window);
  146.     }
  147. }
  148.  
  149. bool runMachine() {
  150.     auto start = Clock.currTime;
  151.     float time = 0;
  152.     while(time < 1f/60) {
  153.         //Thread.sleep(dur!("msecs")(250));
  154.         steps++;
  155.         bool state;
  156.         if(gridPointer.x !in cells) {
  157.             bool[int] map;
  158.             cells[gridPointer.x] = map.dup;
  159.         }
  160.         if(gridPointer.y in cells[gridPointer.x]) {
  161.             cells[gridPointer.x].remove(gridPointer.y);
  162.             state = false;
  163.         } else {
  164.             cells[gridPointer.x][gridPointer.y] = true;
  165.             state = true;
  166.         }
  167.         auto inst = tape[tapePointer++];
  168.         auto tapeAdvance = inst.tapeAdvance[state];
  169.         auto leftTurns = inst.leftTurns[state];
  170.         tapePointer += tapeAdvance;
  171.         tapePointer %= tapeLength;
  172.         direction += leftTurns;
  173.         direction %= 4;
  174.         gridPointer.x += dirTable[direction].x;
  175.         gridPointer.y += dirTable[direction].y;
  176.         auto gpx = gridPointer.x;
  177.         auto gpy = gridPointer.y;
  178.         time = (cast(float)(Clock.currTime - start).total!"nsecs")/1e9;
  179.     }
  180.     return false;
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement