function get_point_from_dist(distMap, attempt = 4) { #region if(!is_surface(distMap)) return noone; var w = surface_get_width_safe(distMap); var h = surface_get_height_safe(distMap); var v = 0; var res = noone; repeat(attempt) { var _x = irandom(w - 1); var _y = irandom(h - 1); var p = surface_get_pixel(distMap, _x, _y); var r = color_get_red(p); if(r > v) { v = r; res = [_x / w, _y / h]; } } return res; } #endregion function get_points_from_dist(distMap, amount, seed = 0, attempt = 8) { #region if(amount < 1) return []; if(!is_surface(distMap)) return []; //print($"===== Get points from dist {amount} ====="); if(!struct_has(self, "__dist_surf")) __dist_surf = surface_create_valid(amount, 1); else __dist_surf = surface_verify(__dist_surf, amount, 1); var _sw = surface_get_width_safe(distMap); var _sh = surface_get_height_safe(distMap); surface_set_shader(__dist_surf, sh_sample_points); shader_set_f("dimension", _sw / amount, _sh); shader_set_i("attempt", attempt); shader_set_f("seed", seed); draw_surface_stretched_safe(distMap, 0, 0, amount, 1); surface_reset_shader(); var b = buffer_create(amount * 4, buffer_fixed, 4); buffer_get_surface(b, __dist_surf, 0); buffer_seek(b, buffer_seek_start, 0); var pos = array_create(amount); for( var i = 0; i < amount; i++ ) { //print($" Reading buffer {i}"); var cc = buffer_read(b, buffer_u32); if(cc == 0) pos[i] = 0; else { var _x = _color_get_red(cc); var _y = _color_get_green(cc); var _v = _color_get_blue(cc); pos[i] = [_x, _y, _v]; } } buffer_delete(b); return pos; } #endregion