enum AUTOTERRAIN_TYPE {
	box9,
	box25,
	side15,
	top48,
	top55,
}

global.autoterrain_amount = [ 9, 16, 15, 48, 55, ];

function tiler_brush_autoterrain(_type, _index) constructor {
	name    = "autoterrain";
    index   = _index;
    prevInd =  0;
    type    = -1;
    
    mask_surface      = noone;
    update_surface    = noone;
    draw_surface_mask = noone;
    target_surface    = noone;
    eraseMode         = false;
    
    preview_surface      = noone;
    preview_surface_tile = noone;
    
    open = false;
    
    sc_type = new scrollBox(["Simple box (3x3)", "Corner box (5x5)", "Side platform (5x3)", "Godot tile (12x4)", "Gamemaker tileset (11x5)"], function(ind) /*=>*/ { setType(ind); }, false);
    sc_type.font = f_p3;
    
    static indexMap48 = [ 8, 10, 11, 0, 1, 6, 5, 3, 2, 34, 12, 20, 33, 35, 12, 28, 30, 29, 31, 46, 21, 12, 44, 45, 47, 24, 16, 18, 17, 19, 9, 43, 40, 37, 38, 39, 36, 25, 42, 41, 27, 26, 7, 4, 13, 23, 32, 15, 14, 12 ];
    static indexMapOld = [
    	[ 0,  1,  2, 
    	 11, 12, 13, 
    	 22, 23, 24 ], 
    	 
    	[-1,  0,  1,  2, -1, 
    	  0, 28, 12, 27,  2, 
    	 11, 12, 12, 12, 13, 
    	 22, 17, 12, 16, 24, 
    	 -1, 22, 23, 24, -1 ], 
    	 
    	[ 0,  1,  2, 16, 17, 
    	 11, 12, 13, 27, 28, 
    	 22, 23, 24,  9, 20 ],
    	 
    	[ 3,  4,  8,  7, 43,  6,  5, 42,  0, 30,  1,  2,
    	 14, 48, 52, 51, 26, 28, 27, 29, 11, 20, -1, 49, 
    	 25, 37, 41, 40, 15, 17, 16, 18, 50, 12,  9, 13, 
    	 36, 33, 34, 35, 32, 39, 38, 31, 22, 23, 19, 24, ],
    	 
    	array_create_ext(55, function(i) /*=>*/ {return i}),
	];
    
    static setType = function(_type) {
    	if(type == _type) return;
    	
    	if(type != -1) {
	    	var _idMap = array_create(55, -1);
	    	var _mapol = indexMapOld[ type];
	    	var _mapnw = indexMapOld[_type];
	    	
	    	for( var i = 0, n = array_length(index); i < n; i++ ) {
	    		if(_mapol[i] != -1) _idMap[_mapol[i]] = index[i];
	    	}
    	}
    	
    	switch(_type) {
    		case 0 : index = array_verify_ext(index,  9, function() /*=>*/ {return -1}); prevInd =  4; break;
    		case 1 : index = array_verify_ext(index, 25, function() /*=>*/ {return -1}); prevInd = 12; break;
    		case 2 : index = array_verify_ext(index, 15, function() /*=>*/ {return -1}); prevInd =  6; break;
    		case 3 : index = array_verify_ext(index, 48, function() /*=>*/ {return -1}); prevInd = 33; break;
    		case 4 : index = array_verify_ext(index, 55, function() /*=>*/ {return -1}); prevInd = 12; break;
    	}
    	
    	if(type != -1) {
	    	for( var i = 0, n = array_length(index); i < n; i++ ) {
	    		if(_mapnw[i] != -1) index[i] = _idMap[_mapnw[i]];
	    		else index[i] = -1;
	    	}
    	}
    	
    	type = _type;
    	
    } setType(_type);
    
    static drawing_start = function(surface, _erase = false) {
        target_surface  = surface;
        eraseMode       = _erase;
        
        var _dim          = surface_get_dimension(surface);
        draw_surface_mask = surface_verify(draw_surface_mask, _dim[0], _dim[1], surface_r8unorm);
        mask_surface      = surface_verify(mask_surface,      _dim[0], _dim[1], surface_r8unorm);
        update_surface    = surface_verify(update_surface,    _dim[0], _dim[1], surface_rgba16float);
        
        surface_clear(draw_surface_mask);
        surface_clear(mask_surface);
        surface_clear(update_surface);
        
        draw_set_color(c_white);
        surface_set_target(draw_surface_mask);
        DRAW_CLEAR
    }
    
    static drawing_end = function() {
        surface_reset_target();
        
        // autoterrain mask
        // #000000 : not part of autoterrain
        // #808080 : part of autoterrain, read only
        // #FFFFFF : part of autoterrain, writable
        
        surface_set_shader(mask_surface, sh_tiler_autoterrain_mask); 
            shader_set_surface("drawSurface", draw_surface_mask);
            shader_set_i("indexes",   index);
            shader_set_i("indexSize", array_length(index));
            
            draw_surface(target_surface, 0, 0);
        surface_reset_shader();
        
        surface_set_shader(update_surface, sh_tiler_autoterrain_apply); 
            shader_set_2("dimension",    surface_get_dimension(update_surface));
            
            shader_set_surface("maskSurface", mask_surface);   
            shader_set_i("bitmaskType",   type);
            shader_set_i("indexMapper48", indexMap48);
            
            shader_set_i("indexes",   index);
            shader_set_i("indexSize", array_length(index));
            shader_set_i("erase",     eraseMode);
            
            draw_surface(target_surface, 0, 0);
        surface_reset_shader();
        
        surface_set_target(target_surface);
            DRAW_CLEAR
            
            BLEND_OVERRIDE
            draw_surface(update_surface, 0, 0);
            BLEND_NORMAL
        surface_reset_target();
    }
}