rust/land_dump/src/main.rs
author alfadur
Wed, 07 Nov 2018 22:58:54 +0300
changeset 14185 1749961647b9
parent 14173 5acfdf49742d
child 15850 44b49f255e31
permissions -rw-r--r--
fix texturing and add a theme loading option to land_dump
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14142
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
     1
use png::HasParameters;
14149
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
     2
use std::{
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
     3
    fs::File,
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
     4
    io::{BufWriter, Read},
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
     5
    path::{Path, PathBuf}
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
     6
};
14142
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
     7
use structopt::StructOpt;
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
     8
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
     9
use integral_geometry::{Point, Rect, Size};
14149
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
    10
use landgen::{
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
    11
    outline_template::OutlineTemplate,
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
    12
    template_based::TemplatedLandGenerator,
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
    13
    LandGenerationParameters,
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
    14
    LandGenerator
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
    15
};
14185
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    16
use mapgen::{
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    17
    MapGenerator,
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    18
    theme::{Theme, slice_u32_to_u8}
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    19
};
14142
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    20
use lfprng::LaggedFibonacciPRNG;
14185
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    21
use land2d::Land2D;
14142
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    22
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    23
#[derive(StructOpt, Debug)]
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    24
#[structopt(name = "basic")]
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    25
struct Opt {
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    26
    #[structopt(short = "s", long = "seed", default_value = "TEST_SEED")]
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    27
    seed: String,
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    28
    #[structopt(short = "d", long = "dump-before-distort")]
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    29
    dump_before_distort: bool,
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    30
    #[structopt(short = "b", long = "dump-before-bezierize")]
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    31
    dump_before_bezierize: bool,
14146
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14142
diff changeset
    32
    #[structopt(short = "f", long = "distance-divisor", default_value = "100")]
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14142
diff changeset
    33
    distance_divisor: u32,
14149
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
    34
    #[structopt(short = "i", long = "templates-file")]
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
    35
    templates_file: Option<String>,
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
    36
    #[structopt(short = "t", long = "template-type")]
14185
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    37
    template_type: Option<String>,
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    38
    #[structopt(short = "z", long = "theme-dir")]
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    39
    theme_dir: Option<String>
14142
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    40
}
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    41
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    42
fn template() -> OutlineTemplate {
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    43
    let mut template = OutlineTemplate::new(Size::new(4096, 2048));
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    44
    template.islands = vec![vec![
14158
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14151
diff changeset
    45
        Rect::from_size_coords(100, 2050, 1, 1),
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14151
diff changeset
    46
        Rect::from_size_coords(100, 500, 400, 1200),
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14151
diff changeset
    47
        Rect::from_size_coords(3600, 500, 400, 1200),
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14151
diff changeset
    48
        Rect::from_size_coords(3900, 2050, 1, 1),
14142
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    49
    ]];
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    50
    template.fill_points = vec![Point::new(2047, 2047)];
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    51
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    52
    template
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    53
}
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    54
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    55
fn dump(
14149
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
    56
    template: &OutlineTemplate,
14142
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    57
    seed: &[u8],
14146
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14142
diff changeset
    58
    distance_divisor: u32,
14142
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    59
    skip_distort: bool,
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    60
    skip_bezier: bool,
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    61
    file_name: &Path,
14185
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    62
) -> std::io::Result<Land2D<u8>> {
14146
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14142
diff changeset
    63
    let params = LandGenerationParameters::new(0 as u8, 255, distance_divisor, skip_distort, skip_bezier);
14149
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
    64
    let landgen = TemplatedLandGenerator::new(template.clone());
14142
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    65
    let mut prng = LaggedFibonacciPRNG::new(seed);
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    66
    let land = landgen.generate_land(&params, &mut prng);
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    67
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    68
    let file = File::create(file_name)?;
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    69
    let ref mut w = BufWriter::new(file);
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    70
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    71
    let mut encoder = png::Encoder::new(w, land.width() as u32, land.height() as u32); // Width is 2 pixels and height is 1.
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    72
    encoder
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    73
        .set(png::ColorType::Grayscale)
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    74
        .set(png::BitDepth::Eight);
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    75
    let mut writer = encoder.write_header()?;
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    76
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    77
    writer.write_image_data(land.raw_pixels()).unwrap();
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    78
14185
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    79
    Ok(land)
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    80
}
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    81
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    82
fn texturize(theme_dir: &Path, land: &Land2D<u8>, output_filename: &Path) {
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    83
    let theme = Theme::load(theme_dir).unwrap();
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    84
    let texture = MapGenerator::new().make_texture(land, &theme);
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    85
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    86
    let file = File::create(output_filename).unwrap();
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    87
    let ref mut w = BufWriter::new(file);
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    88
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    89
    let mut encoder = png::Encoder::new(w, land.width() as u32, land.height() as u32); // Width is 2 pixels and height is 1.
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    90
    encoder
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    91
        .set(png::ColorType::RGBA)
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    92
        .set(png::BitDepth::Eight);
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    93
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    94
    let mut writer = encoder.write_header().unwrap();
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    95
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
    96
    writer.write_image_data(slice_u32_to_u8(texture.as_slice())).unwrap();
14142
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    97
}
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    98
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
    99
fn main() {
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   100
    let opt = Opt::from_args();
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   101
    println!("{:?}", opt);
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   102
14149
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   103
    let template =
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   104
        if let Some(path) = opt.templates_file {
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   105
            let mut result = String::new();
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   106
            File::open(path)
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   107
                .expect("Unable to read templates file")
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   108
                .read_to_string(&mut result);
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   109
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   110
            let mut generator = MapGenerator::new();
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   111
14173
5acfdf49742d Fix some warnings here and there, remove unwelcomed code
unC0Rr
parents: 14158
diff changeset
   112
            let source =  &result[..];
14149
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   113
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   114
            generator.import_yaml_templates(source);
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   115
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   116
            let template_type = &opt.template_type
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   117
                .expect("No template type specified");
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   118
            generator.get_template(template_type)
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   119
                .expect(&format!("Template type {} not found", template_type))
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   120
                .clone()
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   121
        } else {
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   122
            template()
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   123
        };
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   124
14142
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   125
    if opt.dump_before_distort {
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   126
        dump(
14149
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   127
            &template,
14142
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   128
            opt.seed.as_str().as_bytes(),
14146
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14142
diff changeset
   129
            opt.distance_divisor,
14142
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   130
            true,
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   131
            true,
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   132
            Path::new("out.before_distort.png"),
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   133
        )
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   134
        .unwrap();
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   135
    }
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   136
    if opt.dump_before_bezierize {
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   137
        dump(
14149
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   138
            &template,
14142
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   139
            opt.seed.as_str().as_bytes(),
14146
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14142
diff changeset
   140
            opt.distance_divisor,
14142
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   141
            false,
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   142
            true,
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   143
            Path::new("out.before_bezier.png"),
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   144
        )
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   145
        .unwrap();
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   146
    }
14185
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
   147
    let land = dump(
14149
b04dac00e8e2 add command arguments to use a template from file into land_dump
alfadur
parents: 14146
diff changeset
   148
        &template,
14142
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   149
        opt.seed.as_str().as_bytes(),
14146
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14142
diff changeset
   150
        opt.distance_divisor,
14142
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   151
        false,
14151
ab280be4b617 - Fix land_dump always skipping bezierize step
unc0rr
parents: 14149
diff changeset
   152
        false,
14142
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   153
        Path::new("out.full.png"),
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   154
    )
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   155
    .unwrap();
14185
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
   156
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
   157
    if let Some(dir) = opt.theme_dir {
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
   158
        texturize(
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
   159
            &Path::new(&dir),
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
   160
            &land,
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
   161
            &Path::new("out.texture.png")
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
   162
        );
1749961647b9 fix texturing and add a theme loading option to land_dump
alfadur
parents: 14173
diff changeset
   163
    }
14142
69db1d2e4cec land_dump app for testing templated landgen
unc0rr
parents:
diff changeset
   164
}