diff --git a/includes/air.h b/includes/air.h index b00c6b8c9..b1dc819bc 100644 --- a/includes/air.h +++ b/includes/air.h @@ -5,12 +5,20 @@ extern float gravmap[YRES/CELL][XRES/CELL]; //Maps to be used by the main thread extern float gravx[YRES/CELL][XRES/CELL]; extern float gravy[YRES/CELL][XRES/CELL]; +extern float gravp[YRES/CELL][XRES/CELL]; +extern float *gravpf; +extern float *gravxf; +extern float *gravyf; extern unsigned gravmask[YRES/CELL][XRES/CELL]; extern float th_ogravmap[YRES/CELL][XRES/CELL]; // Maps to be processed by the gravity thread extern float th_gravmap[YRES/CELL][XRES/CELL]; extern float th_gravx[YRES/CELL][XRES/CELL]; extern float th_gravy[YRES/CELL][XRES/CELL]; +extern float *th_gravpf; +extern float *th_gravxf; +extern float *th_gravyf; +extern float th_gravp[YRES/CELL][XRES/CELL]; extern float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; extern float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; diff --git a/includes/graphics.h b/includes/graphics.h index 50d8ab179..ca761be64 100644 --- a/includes/graphics.h +++ b/includes/graphics.h @@ -60,6 +60,8 @@ pixel *resample_img(pixel *src, int sw, int sh, int rw, int rh); pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f); +void render_gravlensing(pixel *src, pixel * dst); + void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch); void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch); diff --git a/src/air.c b/src/air.c index 5f45662be..8a3f915d1 100644 --- a/src/air.c +++ b/src/air.c @@ -7,12 +7,20 @@ float kernel[9]; float gravmap[YRES/CELL][XRES/CELL]; //Maps to be used by the main thread float gravx[YRES/CELL][XRES/CELL]; float gravy[YRES/CELL][XRES/CELL]; +float gravp[YRES/CELL][XRES/CELL]; +float *gravpf; +float *gravyf; +float *gravxf; unsigned gravmask[YRES/CELL][XRES/CELL]; float th_ogravmap[YRES/CELL][XRES/CELL]; // Maps to be processed by the gravity thread float th_gravmap[YRES/CELL][XRES/CELL]; float th_gravx[YRES/CELL][XRES/CELL]; float th_gravy[YRES/CELL][XRES/CELL]; +float th_gravp[YRES/CELL][XRES/CELL]; +float *th_gravpf; +float *th_gravyf; +float *th_gravxf; float vx[YRES/CELL][XRES/CELL], ovx[YRES/CELL][XRES/CELL]; float vy[YRES/CELL][XRES/CELL], ovy[YRES/CELL][XRES/CELL]; @@ -119,6 +127,31 @@ void update_airh(void) } memcpy(hv, ohv, sizeof(hv)); } +void bilinear_interpolation(float *src, float *dst, int sw, int sh, int rw, int rh) +{ + int y, x, fxceil, fyceil; + float fx, fy, fyc, fxc; + double intp; + float tr, tl, br, bl; + //Bilinear interpolation for upscaling + for (y=0; y=sw) fxceil = sw-1; + if (fyceil>=sh) fyceil = sh-1; + tr = src[sw*(int)floor(fy)+fxceil]; + tl = src[sw*(int)floor(fy)+(int)floor(fx)]; + br = src[sw*fyceil+fxceil]; + bl = src[sw*fyceil+(int)floor(fx)]; + dst[rw*y+x] = ((tl*(1.0f-fxc))+(tr*(fxc)))*(1.0f-fyc) + ((bl*(1.0f-fxc))+(br*(fxc)))*(fyc); + } +} void update_grav(void) { @@ -164,11 +197,15 @@ void update_grav(void) #endif th_gravx[y][x] += M_GRAV * val * (j - x) / pow(distance, 3); th_gravy[y][x] += M_GRAV * val * (i - y) / pow(distance, 3); + th_gravp[y][x] += M_GRAV * val / pow(distance, 2); } } } } } + bilinear_interpolation(th_gravy, th_gravyf, XRES/CELL, YRES/CELL, XRES, YRES); + bilinear_interpolation(th_gravx, th_gravxf, XRES/CELL, YRES/CELL, XRES, YRES); + bilinear_interpolation(th_gravp, th_gravpf, XRES/CELL, YRES/CELL, XRES, YRES); fin: memcpy(th_ogravmap, th_gravmap, sizeof(th_gravmap)); memset(th_gravmap, 0, sizeof(th_gravmap)); diff --git a/src/graphics.c b/src/graphics.c index 3f3609758..1d9438e41 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -3355,7 +3355,6 @@ void draw_parts(pixel *vid) #ifdef OpenGL glFlush (); #endif - } void draw_walls(pixel *vid) { @@ -3747,9 +3746,40 @@ void render_signs(pixel *vid_buf) } } -void render_fire(pixel *dst) +void render_gravlensing(pixel *src, pixel * dst) { - int i,j,x,y,r,g,b; + int nx, ny, rx, ry, gx, gy, bx, by; + for(nx = 0; nx < XRES; nx++) + { + for(ny = 0; ny < YRES; ny++) + { + rx = nx-(gravxf[(ny*XRES)+nx]*0.5f); + ry = ny-(gravyf[(ny*XRES)+nx]*0.5f); + gx = nx-(gravxf[(ny*XRES)+nx]*0.75f); + gy = ny-(gravyf[(ny*XRES)+nx]*0.75f); + bx = nx-(gravxf[(ny*XRES)+nx]); + by = ny-(gravyf[(ny*XRES)+nx]); + if(rx > 0 && rx < XRES && ry > 0 && ry < YRES && gx > 0 && gx < XRES && gy > 0 && gy < YRES && bx > 0 && bx < XRES && by > 0 && by < YRES) + addpixel(dst, nx, ny, PIXR(src[ry*(XRES+BARSIZE)+rx]), PIXG(src[gy*(XRES+BARSIZE)+gx]), PIXB(src[by*(XRES+BARSIZE)+bx]), 255); + /*rx = nx+(gravxf[(ny*XRES)+nx]*0.5f); + ry = ny+(gravyf[(ny*XRES)+nx]*0.5f); + gx = nx+(gravxf[(ny*XRES)+nx]*0.75f); + gy = ny+(gravyf[(ny*XRES)+nx]*0.75f); + bx = nx+(gravxf[(ny*XRES)+nx]); + by = ny+(gravyf[(ny*XRES)+nx]); + if(rx > 0 && rx < XRES && ry > 0 && ry < YRES && gravp[ny/CELL][nx/CELL]*0.5f > -8.0f) + addpixel(dst, rx, ry, PIXR(src[ry*(XRES+BARSIZE)+rx]), 0, 0, 255); + if(gx > 0 && gx < XRES && gy > 0 && gy < YRES && gravp[ny/CELL][nx/CELL]*0.75f > -8.0f) + addpixel(dst, gx, gy, 0, PIXG(src[ry*(XRES+BARSIZE)+rx]), 0, 255); + if(bx > 0 && bx < XRES && by > 0 && by < YRES && gravp[ny/CELL][nx/CELL] > -8.0f) + addpixel(dst, bx, by, 0, 0, PIXB(src[ry*(XRES+BARSIZE)+rx]), 255);*/ + } + } +} + +void render_fire(pixel *vid) +{ + int i,j,x,y,r,g,b,nx,ny; for (j=0; j=0 && j+y>=0 && i+x