#define terrain_create
// terrain_create(heightmap,maxheight)
//
// heightmap: de sprite van de heightmap die gebruikt moet worden
// maxheight: de maximale hoogte van het terrain
//
// returnt het id van het grid dat gebruikt wordt voor het terrain
var idd;
idd = ds_grid_create(sprite_get_width(argument0),sprite_get_width(argument0))
globalvar gridparts, gridsize;
gridparts[idd] = sprite_get_width(argument0)-1; // omdat de sprite 1 pixel groter moet zijn doen we er één van af
gridsize[idd] = room_width/gridparts[idd]  // deze moet je dus veranderen als je een andere grootte wilt

draw_sprite(argument0,-1,0,0)

var i, j;
globalvar height;
for ( i=0; i<=gridparts[idd]; i+=1) { // omdat we '<=' gebruiken in plaats van '<' zullen ook de extra pixels gelezen worden
 for ( j=0; j<=gridparts[idd]; j+=1) {
  ds_grid_set(idd,i,j,color_get_value( draw_getpixel( i, j) )/255 * argument1)
 }
}
draw_set_color(c_black);
draw_rectangle(0,0,gridparts[idd]+1,gridparts[idd]+1,false);

globalvar terrain;
terrain[idd] = d3d_model_create()

for ( j=0; j<gridparts[idd]; j+=1) {
 d3d_model_primitive_begin(terrain[idd],pr_trianglestrip)
for ( i=0; i<=gridparts[idd]; i+=1) {
 terrain_get_normal(idd,i*gridsize,j*gridsize+gridsize);
 d3d_model_vertex_normal_texture(terrain[idd],i*gridsize[idd],j*gridsize[idd]+gridsize[idd],ds_grid_get(idd,i,j+1),global.xx,global.yy,global.zz,i,j+1)
 terrain_get_normal(idd,i*gridsize[idd],j*gridsize[idd]);
 d3d_model_vertex_normal_texture(terrain[idd],i*gridsize[idd],j*gridsize[idd],ds_grid_get(idd,i,j),global.xx,global.yy,global.zz,i,j)
  }
 d3d_model_primitive_end(terrain[idd])
  }
return idd

#define terrain_create_stretched
// terrain_create(heightmap,maxheight)
//
// heightmap: de sprite van de heightmap die gebruikt moet worden
// maxheight: de maximale hoogte van het terrain
//
// returnt het id van het grid dat gebruikt wordt voor het terrain
var idd;
idd = ds_grid_create(sprite_get_width(argument0),sprite_get_width(argument0))
globalvar gridparts, gridsize;
gridparts[idd] = sprite_get_width(argument0)-1; // omdat de sprite 1 pixel groter moet zijn doen we er één van af
gridsize[idd] = room_width/gridparts  // deze moet je dus veranderen als je een andere grootte wilt

draw_sprite(argument0,-1,0,0)
var i, j;
globalvar height;
for ( i=0; i<=gridparts[idd]; i+=1) { // omdat we '<=' gebruiken in plaats van '<' zullen ook de extra pixels gelezen worden
 for ( j=0; j<=gridparts[idd]; j+=1) {
  ds_grid_set(idd,i,j,color_get_value( draw_getpixel( i, j) )/255 * argument1)
 }
}


globalvar terrain;
terrain[idd] = d3d_model_create()

for ( j=0; j<gridparts[idd]; j+=1) {
 d3d_model_primitive_begin(terrain[idd],pr_trianglestrip)
for ( i=0; i<=gridparts[idd]; i+=1) {
 terrain_get_normal(idd,i*gridsize,j*gridsize+gridsize);
 d3d_model_vertex_normal_texture(terrain[idd],i*gridsize[idd],j*gridsize[idd]+gridsize[idd],ds_grid_get(idd,i,j+1),global.xx,global.yy,global.zz,i/gridparts[idd],(j+1)/gridparts[idd])
 terrain_get_normal(idd,i*gridsize[idd],j*gridsize[idd]);
 d3d_model_vertex_normal_texture(terrain[idd],i*gridsize[idd],j*gridsize[idd],ds_grid_get(idd,i,j),global.xx,global.yy,global.zz,i/gridparts[idd],j/gridparts[idd])
  }
 d3d_model_primitive_end(terrain[idd])
  }
return idd

#define terrain_get_normal
// terrain_get_normal(id,x,y)
// resultaat wordt opgeslagen in global.xx, global.yy en global.zz
globalvar gridsize;
var d;
global.xx = terrain_get_z(argument0,argument1-gridsize,argument2)-terrain_get_z(argument0,argument1+gridsize,argument2);
global.yy = terrain_get_z(argument0,argument1,argument2-gridsize)-terrain_get_z(argument0,argument1,argument2+gridsize);
global.zz = gridsize[argument0]*2;
d = sqrt(sqr(global.xx)+sqr(global.yy)+sqr(global.zz));
global.xx /= d;
global.yy /= d;
global.zz /= d;

#define terrain_get_z
// terrain_get_z(id,x,y)
//
// x: de x-positie
// y: ehm..

globalvar gridparts, gridsize, height;
var gridx, gridy, offsetx, offsety, z1, z2, z3, z4, zz;

gridx=max(0,min(gridparts[argument0]-1,floor(argument1/gridsize[argument0])))
gridy=max(0,min(gridparts[argument0]-1,floor(argument2/gridsize[argument0])))

offsetx= argument1-gridsize*gridx
offsety= argument2-gridsize*gridy

z1=ds_grid_get(argument0,gridx,gridy)
z2=ds_grid_get(argument0,gridx+1,gridy)
z3=ds_grid_get(argument0,gridx+1,gridy+1)
z4=ds_grid_get(argument0,gridx,gridy+1)

if offsetx>offsety
 zz=z1 - offsetx*(z1-z2)/gridsize[argument0] - offsety*(z2-z3)/gridsize[argument0]
else 
 zz=z1 - offsetx*(z4-z3)/gridsize[argument0] - offsety*(z1-z4)/gridsize[argument0]

return zz

#define terrain_draw
// terrain_draw(id,x,y,z,texture)
texture_set_repeat(true);
d3d_model_draw(terrain[argument0],argument1,argument2,argument3,argument4)

