Posted By: oliver2s
Perturbation Image Filter - 12/10/13 14:10
This code manipulates an image with a Perturbation Filter. It's used to create more realistic heightmaps.
Code:
var linear_interpolate(var a, var b, var x) { return (a*(1-x) + b*x); } //Perturbation Filter //recommended default values: //magnitude_ = 0.3 /////////////////////////////// void bmap_perturbation_filter(BMAP* bmap_,var magnitude_) { var size_x_=bmap_width(bmap_); var size_y_=bmap_height(bmap_); var format=bmap_format(bmap_); BMAP* bmap_tmp=bmap_createblack(size_x_,size_y_,format); int py; for(py=0;py<size_y_;py++) { int px; for(px=0;px<size_x_;px++) { COLOR color_; var format=bmap_lock(bmap_,0);var alpha_; var pixel=pixel_for_bmap(bmap_, px, py); pixel_to_vec(color_,alpha_,format,pixel); bmap_unlock(bmap_); var grey=clamp(color_.red*0.21 + color_.green*0.71 + color_.blue*0.07, 0, 255); var p = (magnitude_*(grey-128))/255; var x_coord = px + integer(size_x_*p); var x_coord_lo = x_coord; var x_coord_hi = x_coord_lo + 1; var x_frac = x_coord - x_coord_lo; var y_coord = py + size_y_*p; var y_coord_lo = y_coord; var y_coord_hi = y_coord_lo + 1; var y_frac = y_coord - y_coord_lo; x_coord_lo=clamp(x_coord_lo,0,size_x_-1); x_coord_hi=clamp(x_coord_hi,0,size_x_-1); y_coord_lo=clamp(y_coord_lo,0,size_y_-1); y_coord_hi=clamp(y_coord_hi,0,size_y_-1); COLOR v1,v2,v3,v4; var a1,a2,a3,a4; var format=bmap_lock(bmap_,0); var pixel=pixel_for_bmap(bmap_,x_coord_lo,y_coord_lo);pixel_to_vec(v1,a1,format,pixel); var pixel=pixel_for_bmap(bmap_,x_coord_hi,y_coord_lo);pixel_to_vec(v2,a2,format,pixel); var pixel=pixel_for_bmap(bmap_,x_coord_lo,y_coord_hi);pixel_to_vec(v3,a3,format,pixel); var pixel=pixel_for_bmap(bmap_,x_coord_hi,y_coord_hi);pixel_to_vec(v4,a4,format,pixel); bmap_unlock(bmap_); var val1a = linear_interpolate(v1.red,v2.red,x_frac); var val2a = linear_interpolate(v3.red,v4.red,x_frac); var val1b = linear_interpolate(v1.green,v2.green,x_frac); var val2b = linear_interpolate(v3.green,v4.green,x_frac); var val1c = linear_interpolate(v1.blue,v2.blue,x_frac); var val2c = linear_interpolate(v3.blue,v4.blue,x_frac); var val1d = linear_interpolate(a1,a2,x_frac); var val2d = linear_interpolate(a3,a4,x_frac); color_.red=linear_interpolate(val1a,val2a,y_frac); color_.green=linear_interpolate(val1b,val2b,y_frac); color_.blue=linear_interpolate(val1c,val2c,y_frac); alpha_=linear_interpolate(val1d,val2d,y_frac); var format=bmap_lock(bmap_tmp,0); var pixel=pixel_for_vec(color_,alpha_,format); pixel_to_bmap(bmap_tmp, px, py, pixel); bmap_unlock(bmap_tmp); } } bmap_blit(bmap_,bmap_tmp,NULL,NULL); bmap_purge(bmap_tmp);bmap_remove(bmap_tmp); }