Suppose you have one mask, and 4 textures.
You want each texture to appear only within a certain altitude range (see array alt[5] in the code below).
You can have a 512X512 mask, and a smaller image say 128X128, it will be repeated (here 4 times).


#include <stdio.h>
#include <stdlib.h>
#include "bitmap.h"
/*------------------------------------------------------------------------------
get for percentage of color
------------------------------------------------------------------------------*/
float texture_factor(int h1, float h2, int step)
{
float t = ((float)step - abs(h1 - (int)h2)) / (float)step;
if (t < 0.0f) t = 0.0f;
else if(t > 1.0f) t = 1.0f;
return t;
}
/*----------------------------------------------------------------------------*/
int main()
{
//charge les images
bitmap B[5];
B[0].load("0.bmp"); // heightmap
B[1].load("1.bmp");
B[2].load("2.bmp");
B[3].load("3.bmp");
B[4].load("4.bmp");
int width = B[0].getWidth();
int height = B[0].getHeight();
printf("width:%d height:%d\n", width, height);
bitmap final;
final.create(width,width);
char n_channels = 3;
unsigned char nbTextures = 4;
int step = 256 / nbTextures;
printf("step:%d\n", step);
float texFactor; // texture factor of each texture to blend
int alt[5] = {0, 0, 85, 170, 256}; // took me time to get this one
float red, green, blue; // final rgb at x,y
// For each pixel
for(unsigned short y=0; y<height; y++)
{
for(unsigned short x=0; x<width; x++)
{
//Get altitude from heightmap at x/z
unsigned char r;
B[0].getcolor(x,y, r,r,r); // r = g = b what a waste. 1 channel is enough
red = green = blue = 0;
for (unsigned char i=1; i<=nbTextures; i++) // For each texture to blend,
{
//if one of the images is smaller, repeat it
int tx = x, ty = y; //where to read
if (x >= B[i].getWidth())
{
unsigned short nx = (int)(x / B[i].getWidth());
tx = x - (nx * B[i].getWidth());
//tx = x - ((int)(x / B[i].getWidth()) * B[i].getWidth());
}
if (y >= B[i].getHeight())
{
unsigned short ny = (int)(y / B[i].getHeight());
ty = y - (ny * B[i].getHeight());
}
// Read its rgb value ...
unsigned char rx;
unsigned char gx;
unsigned char bx;
B[i].getcolor(tx,ty, rx,gx,bx);
// ... to determine texture factor of this texture depending on altitude
texFactor = texture_factor(alt[i], r, step);
//add to new RGB value for the pixel to be written
red += rx * texFactor;
green += gx * texFactor;
blue += bx * texFactor;
}
// apply new pixel to final destination
final.setcolor(x, y, (unsigned char)red, (unsigned char)green, (unsigned char)blue);
}
}
final.save("final.bmp");
return 0;
}