get component reference without rc<refcell> business
This commit is contained in:
parent
68d8657131
commit
faf517ab98
24
src/main.rs
24
src/main.rs
|
@ -1,11 +1,9 @@
|
||||||
extern crate ferretro_components;
|
extern crate ferretro_components;
|
||||||
extern crate sdl2;
|
extern crate sdl2;
|
||||||
|
|
||||||
use std::cell::RefCell;
|
|
||||||
use std::ffi::CStr;
|
use std::ffi::CStr;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
use std::rc::Rc;
|
|
||||||
|
|
||||||
use sdl2::render::{WindowCanvas, BlendMode};
|
use sdl2::render::{WindowCanvas, BlendMode};
|
||||||
use sdl2::image::ImageRWops;
|
use sdl2::image::ImageRWops;
|
||||||
|
@ -18,8 +16,8 @@ use rand_xoshiro::Xoshiro128Plus;
|
||||||
|
|
||||||
use structopt::StructOpt;
|
use structopt::StructOpt;
|
||||||
|
|
||||||
use ferretro_components::base::{ControlFlow, RetroComponentBase};
|
use ferretro_components::base::ControlFlow;
|
||||||
use ferretro_components::prelude::LibretroWrapperAccess;
|
use ferretro_components::prelude::*;
|
||||||
use ferretro_components::provided::{
|
use ferretro_components::provided::{
|
||||||
sdl2::{Sdl2SurfaceComponent, SimpleSdl2AudioComponent},
|
sdl2::{Sdl2SurfaceComponent, SimpleSdl2AudioComponent},
|
||||||
stdlib::{SleepFramerateLimitComponent, PathBufComponent},
|
stdlib::{SleepFramerateLimitComponent, PathBufComponent},
|
||||||
|
@ -47,7 +45,7 @@ struct Zretro {
|
||||||
rng: Xoshiro128Plus,
|
rng: Xoshiro128Plus,
|
||||||
ui_bg: Option<Surface<'static>>,
|
ui_bg: Option<Surface<'static>>,
|
||||||
snowflakes: Vec<Rect>,
|
snowflakes: Vec<Rect>,
|
||||||
sdl2surf_comp: Rc<RefCell<Sdl2SurfaceComponent>>,
|
sdl2surf_comp_id: RetroComponentId,
|
||||||
}
|
}
|
||||||
|
|
||||||
const FONT_PNG: &'static [u8] = include_bytes!("lifont.png");
|
const FONT_PNG: &'static [u8] = include_bytes!("lifont.png");
|
||||||
|
@ -72,23 +70,21 @@ impl Zretro {
|
||||||
.build()?;
|
.build()?;
|
||||||
let canvas = window.into_canvas().build()?;
|
let canvas = window.into_canvas().build()?;
|
||||||
|
|
||||||
let sdl2surf_comp = Rc::new(RefCell::new(
|
let sdl2surf_comp = Sdl2SurfaceComponent::new(emu.libretro_core())?;
|
||||||
Sdl2SurfaceComponent::new(emu.libretro_core())?
|
let sdl2surf_comp_id = emu.register_component(sdl2surf_comp)?;
|
||||||
));
|
|
||||||
emu.register_component(sdl2surf_comp.clone());
|
|
||||||
|
|
||||||
let sdl2_audio = SimpleSdl2AudioComponent::new(&mut sdl_context, emu.libretro_core());
|
let sdl2_audio = SimpleSdl2AudioComponent::new(&mut sdl_context, emu.libretro_core());
|
||||||
emu.register_component(sdl2_audio);
|
emu.register_component(sdl2_audio)?;
|
||||||
|
|
||||||
let sleep_fps = SleepFramerateLimitComponent::new(emu.libretro_core());
|
let sleep_fps = SleepFramerateLimitComponent::new(emu.libretro_core());
|
||||||
emu.register_component(sleep_fps);
|
emu.register_component(sleep_fps)?;
|
||||||
|
|
||||||
emu.register_component(PathBufComponent {
|
emu.register_component(PathBufComponent {
|
||||||
sys_path: opt.system.clone(),
|
sys_path: opt.system.clone(),
|
||||||
libretro_path: Some(opt.core.to_path_buf()),
|
libretro_path: Some(opt.core.to_path_buf()),
|
||||||
core_assets_path: None,
|
core_assets_path: None,
|
||||||
save_path: Some(std::env::temp_dir()),
|
save_path: Some(std::env::temp_dir()),
|
||||||
});
|
})?;
|
||||||
|
|
||||||
emu.init().unwrap();
|
emu.init().unwrap();
|
||||||
emu.load_game(&opt.rom).unwrap();
|
emu.load_game(&opt.rom).unwrap();
|
||||||
|
@ -119,7 +115,7 @@ impl Zretro {
|
||||||
rng,
|
rng,
|
||||||
ui_bg: Some(ui_bg),
|
ui_bg: Some(ui_bg),
|
||||||
snowflakes,
|
snowflakes,
|
||||||
sdl2surf_comp,
|
sdl2surf_comp_id,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,7 +144,7 @@ impl Zretro {
|
||||||
font_rect.set_height(64);
|
font_rect.set_height(64);
|
||||||
while let ControlFlow::Continue = self.emu.run() {
|
while let ControlFlow::Continue = self.emu.run() {
|
||||||
self.update_snow()?;
|
self.update_snow()?;
|
||||||
let ref_mut = RefCell::try_borrow_mut(&self.sdl2surf_comp)?;
|
let ref_mut = self.emu.component_mut::<Sdl2SurfaceComponent>(self.sdl2surf_comp_id)?;
|
||||||
let surface = ref_mut.surface();
|
let surface = ref_mut.surface();
|
||||||
|
|
||||||
let emu_tx = tc.create_texture_from_surface(surface)?;
|
let emu_tx = tc.create_texture_from_surface(surface)?;
|
||||||
|
|
Loading…
Reference in New Issue