OK, this is the function I use :
Code:
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);

}


This code is supposed to work with the code given here by Emre
You just need to modify terrain action :
Code:
action Terrain()
{
	my.material=multirgb;
	set(my,UNLIT);
	//section:Terrain Coordinate
	//entry:Minimum x
	my.min_x=-3000;//5295//4081
	//entry:Maximum x
	my.max_x=3000;//4566//3041
	//entry:Minimum y
	my.min_y=-3000;//5200//4053
	//entry:Maximum y
	my.max_y=3000;//4500//3300
	//image:help.bmp
	
	bush2_load();
	
	set_decor();
	
}


It replace, bush_load, rock_load and the tree load part.
Bush2_load could also be done using the alpha channel of the bitmap.

Last edited by MadJack; 09/06/08 19:44.

Commercial A7.25b
RUGod