function Cosine_Interpolate(var a, var b, var x)
{
double ft = x * 3.1415927;
double f = (1 - cos(ft)) * 0.5;
return a*(1-f) + b*f;
}
//Perlin Noise Heightmap Generator
///////////////////////////////
//recommended default values:
// size_ = 128
// freq_ = 64
// height_min_ = -50
// height_max_ = 200
// iterations_ = 5
// persistence_ = 2
BMAP* perlin_noise(var size_,var freq_,var height_min_,var height_max_,var iteration_,var persistence_)
{
var format;
var pixel;
var px;
var py;
var alpha_ = 100;
var h[2];
var h1[2];
var freq;
VECTOR temp1;
VECTOR temp2;
VECTOR temp;
var i;
var px1;
var py1;
var a;
var g=0;
var c=0;
var t;
var k;
var f;
STRING* temp_str="";
STRING* temp_str2="";
var hmaphandle;
var freq = freq_;
var hmap_size = size_;
var height_min = height_min_;
var height_max = height_max_;
var var_iteration=iteration_;
var var_persistence=persistence_;
BMAP* ptr_bmap_temp = bmap_createblack(size_,size_,24);
t= 1; c=0; while(c < var_iteration)
{
i=0; px=0; py=0; while(i < (hmap_size/(freq/t))*(hmap_size/(freq/t)))
{
temp1.x = integer(random((height_max+150)-(height_min+150))+(height_min+150));
temp1.x = clamp(temp1.x-150, 0, 255);
format = bmap_lock(ptr_bmap_temp,0);
pixel = pixel_for_vec(vector(temp1.x,temp1.x,temp1.x),alpha_,format);
pixel_to_bmap(ptr_bmap_temp, px, py, pixel);
bmap_unlock(ptr_bmap_temp);
px+=(freq/t);
if(px > hmap_size-1)
{
px=0;
py+=(freq/t);
}
i+=1;
}
a=1/(freq/t); px1=0; py1=0; px=0; py=0; i=0; while(i < (hmap_size-(hmap_size/(freq/t)))*(hmap_size/(freq/t)))
{
format = bmap_lock(ptr_bmap_temp,0);
pixel = pixel_for_bmap(ptr_bmap_temp, px, py);
pixel_to_vec(temp1,alpha_,format,pixel);
h[0]=temp1.x;
pixel = pixel_for_bmap(ptr_bmap_temp, px+(freq/t), py);
pixel_to_vec(temp1,alpha_,format,pixel);
h[1]=temp1.x;
pixel = pixel_for_bmap(ptr_bmap_temp, clamp(px-(freq/t),0,hmap_size-1), py);
pixel_to_vec(temp1,alpha_,format,pixel);
h1[0]=temp1.x;
pixel = pixel_for_bmap(ptr_bmap_temp, clamp(px+((freq/t)*2),0,hmap_size-1), py);
pixel_to_vec(temp1,alpha_,format,pixel);
h1[1]=temp1.x;
temp.x = Cosine_Interpolate(h[0], h[1], a);
pixel = pixel_for_vec(vector(temp.x,temp.x,temp.x),alpha_,format);
pixel_to_bmap(ptr_bmap_temp, px+px1+1, py, pixel);
bmap_unlock(ptr_bmap_temp);
px1+=1;
a+=1/(freq/t);
if(px1 > (freq/t)-2)
{
a=1/(freq/t);
px+=(freq/t);
px1=0;
py1+=1;
if(py1 > (hmap_size/(freq/t))-1)
{
px1=0;
py1=0;
px=0;
py+=(freq/t);
a=1/(freq/t);
}
}
i+=1;
}
a=1/(freq/t); px1=0; py1=0; px=0; py=0; i=0; while(i < (hmap_size-(hmap_size/(freq/t)))*(hmap_size))
{
format = bmap_lock(ptr_bmap_temp,0);
pixel = pixel_for_bmap(ptr_bmap_temp, px, py);
pixel_to_vec(temp1,alpha_,format,pixel);
h[0]=temp1.x;
pixel = pixel_for_bmap(ptr_bmap_temp, px, clamp(py+(freq/t), 0, hmap_size-1));
pixel_to_vec(temp1,alpha_,format,pixel);
h[1]=temp1.x;
temp.x = Cosine_Interpolate(h[0], h[1], a);
pixel = pixel_for_vec(vector(temp.x,temp.x,temp.x),alpha_,format);
pixel_to_bmap(ptr_bmap_temp, px, py+py1+1, pixel);
bmap_unlock(ptr_bmap_temp);
py1+=1;
a+=1/(freq/t);
if(py1 > (freq/t)-2)
{
a=1/(freq/t);
py+=(freq/t);
py1=0;
px1+=1;
if(px1 > (hmap_size/(freq/t))-1)
{
py1=0;
px1=0;
py=0;
px+=1;
a=1/(freq/t);
}
}
i+=1;
}
str_cpy(temp_str, "hmap");
str_for_num(temp_str2, c);
str_cat(temp_str, temp_str2);
str_cat(temp_str, ".tga");
hmaphandle = file_open_write(temp_str);
px=0; py=hmap_size-1; i=0; while(i < hmap_size*hmap_size)
{
format = bmap_lock(ptr_bmap_temp,0);
pixel = pixel_for_bmap(ptr_bmap_temp, px, py);
pixel_to_vec(temp1,alpha_,format,pixel);
bmap_unlock(ptr_bmap_temp);
file_asc_write(hmaphandle, temp1.x);
px+=1;
if(px > hmap_size-1)
{
px=0;
py-=1;
}
i+=1;
}
file_close(hmaphandle);
c+=1;
t*=var_persistence;
t = clamp(t, 1, freq);
}
px=0; py=0; i=0; while(i < hmap_size*hmap_size)
{
format = bmap_lock(ptr_bmap_temp,0);
pixel = pixel_for_vec(vector(0,0,0),alpha_,format);
pixel_to_bmap(ptr_bmap_temp, px, py, pixel);
bmap_unlock(ptr_bmap_temp);
px+=1;
if(px > hmap_size-1)
{
px=0;
py+=1;
}
i+=1;
}
f=c-1; k=0; while(k < c)
{
str_cpy(temp_str, "hmap");
str_for_num(temp_str2, f);
str_cat(temp_str, temp_str2);
str_cat(temp_str, ".tga");
hmaphandle = file_open_read(temp_str);
px=0; py=hmap_size-1; i=0; while(i < hmap_size*hmap_size)
{
temp1.x = file_asc_read(hmaphandle);
format = bmap_lock(ptr_bmap_temp,0);
pixel = pixel_for_bmap(ptr_bmap_temp, px, py);
pixel_to_vec(temp2,alpha_,format,pixel);
temp2.x = (temp2.x+temp1.x)/2;
temp2.y = temp2.x;
temp2.z = temp2.x;
pixel = pixel_for_vec(temp2,alpha_,format);
pixel_to_bmap(ptr_bmap_temp, px, py, pixel);
bmap_unlock(ptr_bmap_temp);
px+=1;
if(px > hmap_size-1)
{
px=0;
py-=1;
}
i+=1;
}
file_close(hmaphandle);
k+=1;
f-=1;
}
i=0; while(i < c)
{
str_cpy(temp_str, "hmap");
str_for_num(temp_str2, i);
str_cat(temp_str, temp_str2);
str_cat(temp_str, ".tga");
file_delete(temp_str);
i+=1;
}
return ptr_bmap_temp;
}