function set_decor()
{
var aFormat;
var aAlpha;
var aPixel;
var i,j,k;
var aChannel;
COLOR aColor;
var aStep_x, aStep_y;
var nb_obj;
float aMaxRed = 0;
float aMaxGreen = 0;
float aMaxBlue = 0;
float aDensityRed = 0;
float aDensityBlue = 0;
float aDensityGreen = 0;
float aDensityDec = 0;
var dens_red[256];
var dens_blue[256];
var dens_green[256];
var aSide_x, aSide_y;
BMAP* texv = "vegetation.bmp"; // Vegetation - Rocks density map
// Format = BMP type RGB 24 bits
// Size is what you want BUT 128x128 is enough
aSide_x = bmap_width (texv);
aSide_y = bmap_height (texv);
aStep_x = (my.max_x - my.min_x)/aSide_x ;
aStep_y = (my.max_y - my.min_y)/aSide_y ;
aFormat = bmap_lock(texv,0);
for (i=0; i < 256; i++)
{
dens_red[i] = 0;
dens_blue[i] = 0;
dens_green[i] = 0;
}
for (i=0; i < aSide_x; i++)
{
for (j=0; j < aSide_y; j++)
{
aPixel = pixel_for_bmap(texv,i,j);
pixel_to_vec(aColor, aAlpha, aFormat, aPixel);
dens_red[aColor.red]++;
dens_blue[aColor.blue]++;
dens_green[aColor.green]++;
}
}
for (i=0; i < 256; i++)
{
aMaxRed += i * dens_red[i];
aMaxGreen += i * dens_green[i];
aMaxBlue += i * dens_blue[i];
}
if (aMaxRed > 0) aDensityRed = tree_number / aMaxRed;
if (aMaxGreen > 0) aDensityGreen = bush_number / aMaxGreen;
if (aMaxBlue > 0) aDensityBlue = rock_number / aMaxBlue;
for (i=0; i < aSide_x; i++)
{
for (j=0; j < aSide_y; j++)
{
aPixel = pixel_for_bmap(texv,i,j);
pixel_to_vec(aColor, aAlpha, aFormat, aPixel);
aChannel = aColor.red;
if (aChannel > 0)
{
aMaxRed = aChannel * aDensityRed;
nb_obj = integer (aMaxRed);
aDensityDec = aMaxRed - nb_obj;
if (aDensityDec > random(1)) nb_obj++;
for (k=0; k<nb_obj; k++)
{
if (number_tree < tree_number)
{
ent_create(tree1, vector(my.min_x + i*aStep_x + random(aStep_x), my.max_y - j*aStep_y - random(aStep_y),my.z+8300), tree_func);
ent_create(tree2, vector(my.min_x + i*aStep_x + random(aStep_x), my.max_y - j*aStep_y - random(aStep_y),my.z+8300), tree_func);
ent_create(tree3, vector(my.min_x + i*aStep_x + random(aStep_x), my.max_y - j*aStep_y - random(aStep_y),my.z+8300), tree_func);
number_tree+=1;
}
}
}
aChannel = aColor.blue;
if (aChannel > 0)
{
aMaxBlue = aChannel * aDensityBlue;
nb_obj = integer (aMaxBlue);
aDensityDec = aMaxBlue - nb_obj;
if (aDensityDec > random(1)) nb_obj++;
for (k=0; k<nb_obj; k++)
{
if (number_rock < rock_number)
{
ent_create(rock1, vector(my.min_x + i*aStep_x + random(aStep_x), my.max_y - j*aStep_y - random(aStep_y),my.z+8300), rock_func);
number_rock+=1;
}
}
}
aChannel = aColor.green;
if (aChannel > 0)
{
aMaxGreen = aChannel * aDensityGreen;
nb_obj = integer (aMaxGreen);
aDensityDec = aMaxGreen - nb_obj;
if (aDensityDec > random(1)) nb_obj++;
for (k=0; k<nb_obj; k++)
{
if (number_bush < bush_number)
{
ent_create(bush1, vector(my.min_x + i*aStep_x + random(aStep_x), my.max_y - j*aStep_y - random(aStep_y),my.z+8300), bush_func);
number_bush+=1;
}
}
}
}
}
bmap_unlock(texv);
}