Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <SDL2/SDL.h>
- #include <SDL2/SDL_image.h>
- static int scr_width;
- static int scr_height;
- static SDL_Window* winsource;
- static SDL_Renderer* winrenderer;
- struct Camera
- {
- float xoffset, yoffset;
- double zoom;
- int detail;
- float colorshift;
- };
- static Camera cam;
- struct ColorRGB
- {
- unsigned char r,g,b;
- };
- void Init(int width, int height)
- {
- // SDL Init
- SDL_Init(SDL_INIT_VIDEO);
- IMG_Init(IMG_INIT_PNG);
- // Create Window/Renderer
- scr_width = width;
- scr_height = height;
- cam.xoffset = 0;
- cam.yoffset = 0;
- cam.zoom = 2.5;
- cam.detail = 50;
- cam.colorshift = 1.0;
- winsource = SDL_CreateWindow("SDL Test",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,scr_width,scr_height,SDL_WINDOW_OPENGL);
- winrenderer = SDL_CreateRenderer(winsource, -1, SDL_RENDERER_ACCELERATED);
- }
- void SDLEnd()
- {
- SDL_DestroyRenderer(winrenderer);
- SDL_DestroyWindow(winsource);
- SDL_Quit();
- }
- inline double nmap(double x, double from, double to, double mapfrom, double mapto)
- {
- return (x-from)/(to-from) * (mapto-mapfrom) + mapfrom;
- }
- inline float hue2rgb(float p, float q, float t)
- {
- if(t < 0) t += 1;
- if(t > 1) t -= 1;
- if(t < 1./6.) return p + (q - p) * 6 * t;
- if(t < 1./2.) return q;
- if(t < 2./3.) return p + (q - p) * (2./3. - t) * 6;
- return p;
- }
- ColorRGB hslToRgb(float h, float s, float l){
- float r, g, b;
- if(s == 0)
- {
- r = g = b = l; // achromatic
- }
- else
- {
- float q = (l < 0.5) ? (l * (1 + s)) : (l + s - l * s);
- float p = 2 * l - q;
- r = hue2rgb(p, q, h + 1./3.);
- g = hue2rgb(p, q, h);
- b = hue2rgb(p, q, h - 1./3.);
- }
- return (ColorRGB) {floor(r * 255), floor(g * 255), floor(b * 255)};
- }
- float MandleFind(double& xi, double& yi, int range, unsigned long inf)
- {
- register int i;
- double oldxi = xi;
- double oldyi = yi;
- Camera oldcam = cam;
- for(i = 0; i < range; i++)
- {
- double xx = (xi*xi) - (yi*yi);
- double yy = 2 * xi * yi;
- xi = xx + oldxi;
- yi = yy + oldyi;
- if( abs(xx+yy) > inf) break;
- }
- float part = (float)i/range;
- }
- void Draw()
- {
- ColorRGB pixel;
- #define dUpdateColor(h,l) pixel = hslToRgb(h,0.6,l); SDL_SetRenderDrawColor(winrenderer, pixel.r,pixel.g,pixel.b, 0xFF)
- dUpdateColor(0,1.0);
- for(int y = 0; y < scr_height; y++)
- {
- for(int x = 0; x < scr_width; x++)
- {
- double adir = nmap(x,0,scr_width,-cam.zoom,cam.zoom)+cam.xoffset;
- double bdir = nmap(y,0,scr_height,-cam.zoom,cam.zoom)+cam.yoffset;
- float mandleHit = MandleFind(adir,bdir,cam.detail,16);
- //printf("%f\n",mandleHit);
- dUpdateColor(cam.colorshift*mandleHit,0.5);
- SDL_RenderDrawPoint(winrenderer,x,y);
- }
- }
- SDL_RenderPresent(winrenderer);
- }
- void Update()
- {
- SDL_Event ev;
- while(true)
- {
- SDL_PollEvent(&ev);
- double czoom = cam.zoom/2.5;
- if(ev.type == SDL_QUIT) break;
- if(ev.type == SDL_KEYDOWN)
- {
- SDL_Keycode skey = ev.key.keysym.sym;
- switch(skey)
- {
- case SDLK_LEFT:
- cam.xoffset -= 0.2 * czoom;
- Draw();
- break;
- case SDLK_RIGHT:
- cam.xoffset += 0.2 * czoom;
- Draw();
- break;
- case SDLK_UP:
- cam.yoffset -= 0.2 * czoom;
- Draw();
- break;
- case SDLK_DOWN:
- cam.yoffset += 0.2 * czoom;
- Draw();
- break;
- case SDLK_w:
- cam.zoom *= 0.5;
- cam.detail += 5;
- Draw();
- break;
- case SDLK_s:
- cam.zoom /= 0.5;
- cam.detail -= 5;
- Draw();
- break;
- }
- }
- }
- }
- int main()
- {
- Init(320,200);
- Draw();
- Update();
- SDLEnd();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement