Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <math.h>
- #include "SDL.h"
- void filldata (int *hei, int *col)
- {
- int p = 0;
- int x,y;
- for (y=0; y<=63; y++)
- {
- for (x=0; x<=63; x++)
- {
- int d = 15*15- ((x&31)-16)*((x&31)-16) - ((y&31)-16)*((y&31)-16);
- if ((d>0) && ((x^y)&32))
- {
- hei[p] = 64-sqrt(d);
- col[p] = x+y;
- }
- else
- {
- hei[p] = 64;
- col[p] = 3*(cos(x*0.2) + sin (y*0.3)) + 88;
- }
- p++;
- }
- }
- }
- void fillpalette (SDL_Surface *screen)
- {
- SDL_Color colors[256];
- int i;
- /* Fill colors with color information */
- for(i=0;i<=256;i++)
- {
- colors[i].r=i;
- colors[i].g=i;
- colors[i].b=i/2;
- }
- SDL_SetPalette(screen, SDL_LOGPAL|SDL_PHYSPAL, colors, 0, 256);
- }
- void checkevents()
- {
- SDL_Event event;
- if (SDL_PollEvent(&event))
- {
- switch (event.type) {
- case SDL_MOUSEMOTION:
- printf("Mouse moved by %d,%d to (%d,%d)\n",
- event.motion.xrel, event.motion.yrel,
- event.motion.x, event.motion.y);
- break;
- case SDL_MOUSEBUTTONDOWN:
- printf("Mouse button %d pressed at (%d,%d)\n",
- event.button.button, event.button.x, event.button.y);
- break;
- case SDL_QUIT:
- exit(0);
- }
- }
- }
- int main ()
- {
- if ( SDL_Init(SDL_INIT_VIDEO) < 0 )
- {
- fprintf(stderr, "Cannot initialize SDL: %s\n", SDL_GetError());
- exit(1);
- }
- SDL_Surface *screen;
- screen = SDL_SetVideoMode(800, 600, 8, SDL_SWSURFACE|SDL_HWPALETTE);
- if ( screen == NULL )
- {// Если установить разрешение не удалось
- fprintf(stderr, "Cannot set resolution 800x600: %s\n", SDL_GetError());
- exit(1);
- }
- fillpalette (screen);
- int hei[4096-1];
- int col[4096-1];
- filldata (hei, col);
- int posx = 0;
- int posy = 0;
- int posz = 45*65536;
- // Здесь и далее мы умножаем на 2^16 чтобы повысить точность вычислений,
- // так как результаты cos() и sin() придется помещать в целочисленные переменные
- // Чтобы избавится от множителя мы делаем сдвиг >>16 в нужный момент
- double ang = 0;
- int horiz = -100;
- double r220 = 1.0f / 220; // Angle of view?
- int dd = 65536 * r220;
- int de = dd * 128; // 128 is the max "distance"
- int sdz = (250-horiz)*65536*r220;
- int sx,x,y,z,p;
- while (1)
- {
- SDL_LockSurface(screen);
- double cosang = cos (ang) * 65536;
- double sinang = sin (ang) * 65536;
- int dx,dy,dxi,dyi,dz;
- dx = sinang + cosang; dxi = -sinang * r220;
- dy = sinang - cosang; dyi = cosang * r220;
- for (sx=0;sx<=799;sx++)
- {
- x = posx;
- y = posy;
- z = posz;
- dz = sdz;
- p = sx+479200;
- int d;
- for (d=0;d<=de;d+=dd)
- {
- x += dx; y += dy; z += dz;
- // 0xfc00000>>16 is 4032, and 4032 is (4096-1)-63
- // 3f0000>>16 is 63
- int i = (((x*64) & 0xfc00000) + (y&0x3f0000))>>16;
- // Почему x и y поменялись местами?
- //int i = ((x & 0x3f0000) + (y*64) & 0xfc00000)>>16;
- int h = hei[i]*65536;
- while (h<z)
- {
- *((Uint8*)screen->pixels+p) = col[i];
- //poke p, col(i)
- p -= 800;
- z -= d;
- dz -= dd;
- }
- }
- dx += dxi;
- dy += dyi;
- while (p>=19200)
- {
- *((Uint8*)screen->pixels+p) = 0;
- // poke p,0
- p -= 800;
- }
- }
- posx += 4*cosang;
- posy += 4*sinang;
- ang += 0.02;
- SDL_UnlockSurface(screen);
- SDL_Flip (screen);
- SDL_Delay (50);
- checkevents ();
- }
- return atexit(SDL_Quit);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement