ソースを参照

rendering from video memory buffer :D

master
Isabelle L. 5年前
コミット
25cfe80dc8
1個のファイルの変更36行の追加5行の削除
  1. +36
    -5
      src/main.rs

+ 36
- 5
src/main.rs ファイルの表示

@@ -5,29 +5,60 @@ use structopt::StructOpt;
#[structopt(name = "CERES-16", about = "16bit fantasy console")]
struct Opt {
/// times the screen should be scaled by
#[structopt(short = "s", long = "scale", default_value = "2")]
#[structopt(short = "s", long = "scale", default_value = "4")]
scale_factor: usize,
}

fn wrapper() -> Result<()> {
let opt = Opt::from_args();

let mut ctx = offbrand::Context::new(
ceres_sys::SCREEN_WIDTH * opt.scale_factor,
ceres_sys::SCREEN_HEIGHT * opt.scale_factor,
ceres_sys::SCREEN_WIDTH,
ceres_sys::SCREEN_HEIGHT,
"CERES-16".to_owned(),
Some(opt.scale_factor),
)?;
let sys = ceres_sys::System::init();
println!("{}", sys.registers);

let mut sys = ceres_sys::System::init();

let mut colors: Vec<u16> = Vec::new();

for r in 0x0..0xf {
for g in 0x0..0xf {
for b in 0x0..0xf {
colors.push((r << 8) | (g << 4) | b);
}
}
}

colors.iter().enumerate().for_each(|(addr, color)| {
sys.video_memory[addr as u16] = *color;
});

while ctx.is_open() {
ctx.clear(None);

for x in 0..ceres_sys::SCREEN_WIDTH {
for y in 0..ceres_sys::SCREEN_HEIGHT {
let color =
color_from_u16(sys.video_memory[(y * ceres_sys::SCREEN_WIDTH + x) as u16]);
ctx.insert_pixel(x, y, color);
}
}

ctx.present()?;
}

Ok(())
}

fn color_from_u16(color: u16) -> Color {
let r = (((color >> 8) & 0x000f) as u8) * 17;
let g = (((color >> 4) & 0x000f) as u8) * 17;
let b = ((color & 0x000f) as u8) * 17;
Color { r, g, b }
}

fn main() {
if let Err(err) = wrapper() {
eprintln!("error: {:?}", err);


読み込み中…
キャンセル
保存