summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/font.rs2
-rw-r--r--src/lib.rs64
-rw-r--r--src/main.rs2
-rw-r--r--src/save.rs40
-rw-r--r--src/state.rs3
5 files changed, 76 insertions, 35 deletions
diff --git a/src/font.rs b/src/font.rs
index 3074dff..e431896 100644
--- a/src/font.rs
+++ b/src/font.rs
@@ -92,7 +92,7 @@ impl Bitmap {
texcoords.push(tcbase + glam::Vec2::new(cwidth, cheight));
texcoords.push(tcbase + glam::Vec2::new(cwidth, 0.0));
texcoords.push(tcbase);
- let c = if let Some(c) = color.get(i) {
+ let c = if let Some(c) = color.get(if color.len() == 0 { 0 } else { i % color.len() }) {
*c
} else {
glam::Vec3::new(1.0, 1.0, 1.0)
diff --git a/src/lib.rs b/src/lib.rs
index 6d6fc9d..d0ee6d9 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -11,6 +11,7 @@ pub mod font;
pub mod shadow;
pub mod audio;
pub mod net;
+pub mod save;
use std::ops::Rem;
@@ -29,6 +30,14 @@ use glfw::Context;
#[cfg(not(target_arch = "wasm32"))]
use bitflags::bitflags;
+#[cfg(not(target_arch = "wasm32"))]
+bitflags! {
+ pub struct Options: u32 {
+ const OVERLAY = 0b00000001;
+ const HIDDEN = 0b00000010;
+ }
+}
+
static mut CTX: Option<*const context::Context> = None;
static mut ST: Option<*mut state::State> = None;
static mut G: Option<*mut std::ffi::c_void> = None;
@@ -45,13 +54,6 @@ where
}
}
-bitflags! {
- pub struct Options: u32 {
- const OVERLAY = 0b00000001;
- const HIDDEN = 0b00000010;
- }
-}
-
#[cfg(not(target_arch = "wasm32"))]
pub async fn run<'a, F, G, Fut>(title: &str, w: u32, h: u32, options: Options, gnew: F)
where
@@ -100,6 +102,10 @@ where
});
window.make_current();
window.set_key_polling(true);
+ window.set_mouse_button_polling(true);
+ window.set_size_polling(true);
+ window.set_focus_polling(true);
+ window.set_cursor_pos_polling(true);
let gl = unsafe {
glow::Context::from_loader_function(|s| window.get_proc_address(s) as *const _)
};
@@ -126,27 +132,25 @@ where
ctx.glfw.borrow_mut().poll_events();
for (_, event) in glfw::flush_messages(&events) {
match event {
- // sdl2::event::Event::Window { win_event: sdl2::event::WindowEvent::Resized(_, _), .. } => {
- // st.handle_resize(&ctx);
- // },
- // sdl2::event::Event::Window { win_event: sdl2::event::WindowEvent::FocusLost, .. } => {
- // st.keys = state::Keys::new();
- // },
- // sdl2::event::Event::MouseMotion { x, y, .. } => {
- // st.mouse_moved(&ctx, x as f32, y as f32, game);
- // },
- // sdl2::event::Event::MouseButtonDown {..} => {
- // st.mouse_pressed(&ctx, game)
- // },
- // sdl2::event::Event::MouseButtonUp {..} => {
- // st.mouse_released(&ctx)
- // },
- // sdl2::event::Event::KeyDown { keycode: Some(key), repeat: false, .. } => {
- // st.key_pressed(&ctx, state::Keycode::new(key))
- // },
- // sdl2::event::Event::KeyUp { keycode: Some(key), repeat: false, .. } => {
- // st.key_released(&ctx, state::Keycode::new(key))
- // },
+ glfw::WindowEvent::Size(_, _) => st.handle_resize(&ctx),
+ glfw::WindowEvent::Focus(false) => {
+ st.keys = state::Keys::new();
+ },
+ glfw::WindowEvent::CursorPos(x, y) => {
+ st.mouse_moved(&ctx, x as f32, y as f32, game);
+ }
+ glfw::WindowEvent::MouseButton(_, glfw::Action::Press, _) => {
+ st.mouse_pressed(&ctx, game)
+ },
+ glfw::WindowEvent::MouseButton(_, glfw::Action::Release, _) => {
+ st.mouse_released(&ctx)
+ },
+ glfw::WindowEvent::Key(key, _, glfw::Action::Press, _) => {
+ st.key_pressed(&ctx, state::Keycode::new(key))
+ },
+ glfw::WindowEvent::Key(key, _, glfw::Action::Release, _) => {
+ st.key_released(&ctx, state::Keycode::new(key))
+ },
_ => {},
}
}
@@ -312,7 +316,7 @@ use wasm_bindgen::prelude::*;
pub struct TestGame {
font: font::Bitmap,
tt: font::TrueType,
- cube: mesh::Mesh,
+ // cube: mesh::Mesh,
fox: scene::Scene,
tex: texture::Texture,
shader: shader::Shader,
@@ -323,7 +327,7 @@ impl TestGame {
Self {
font: font::Bitmap::new(ctx),
tt: font::TrueType::new(ctx, 12.0, include_bytes!("assets/fonts/ComicNeue-Regular.ttf")),
- cube: mesh::Mesh::from_obj(ctx, include_bytes!("assets/meshes/cube.obj")),
+ // cube: mesh::Mesh::from_obj(ctx, include_bytes!("assets/meshes/cube.obj")),
fox: scene::Scene::from_gltf(ctx, include_bytes!("assets/scenes/fox.glb")),
// fox: scene::Scene::from_gltf(ctx, include_bytes!("/home/llll/src/colonq/assets/lcolonq_flat.vrm")),
tex: texture::Texture::new(ctx, include_bytes!("assets/textures/test.png")),
diff --git a/src/main.rs b/src/main.rs
index 5bbebd1..f7c2a88 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,5 +4,5 @@ pub fn main() {}
#[cfg(not(target_arch = "wasm32"))]
#[tokio::main]
pub async fn main() {
- teleia::run("teleia test", 240, 160, teleia::TestGame::new).await;
+ teleia::run("teleia test", 240, 160, teleia::Options::empty(), teleia::TestGame::new).await;
}
diff --git a/src/save.rs b/src/save.rs
new file mode 100644
index 0000000..0f0d20b
--- /dev/null
+++ b/src/save.rs
@@ -0,0 +1,40 @@
+#[cfg(target_arch = "wasm32")]
+pub fn save<W>(id: &str, data: &W) where W: serde::Serialize {
+ let window = web_sys::window().expect("failed to get window object");
+ let storage = window.local_storage()
+ .expect("failed to get local storage")
+ .expect("local storage not present");
+ let key = format!("{}_save", id);
+ let val = serde_json::to_string(data).expect("failed to serialize save");
+ storage.set_item(&key, &val).expect("failed to set save");
+}
+
+#[cfg(target_arch = "wasm32")]
+pub fn load<W>(id: &str) -> Option<W> where W: serde::de::DeserializeOwned {
+ let window = web_sys::window().expect("failed to get window object");
+ let storage = window.local_storage()
+ .expect("failed to get local storage")
+ .expect("local storage not present");
+ let key = format!("{}_save", id);
+ let s = storage.get_item(&key).expect("failed to get save").expect("save not present");
+ let mut cur = std::io::Cursor::new(s);
+ serde_json::from_reader(&mut cur).ok()
+}
+
+#[cfg(not(target_arch = "wasm32"))]
+pub fn save<W>(id: &str, data: &W) where W: serde::Serialize {
+ let pd = directories::ProjectDirs::from("", "milkfat", id).expect("failed to get save directory");
+ let _ = std::fs::create_dir_all(pd.data_dir());
+ let path = pd.data_dir().join("teleia.save");
+ let file = std::fs::File::create(&path).expect("failed to open save file");
+ serde_json::to_writer(file, data).expect("failed to write save file");
+}
+
+#[cfg(not(target_arch = "wasm32"))]
+pub fn load<W>(id: &str) -> Option<W> where W: serde::de::DeserializeOwned {
+ let pd = directories::ProjectDirs::from("", "milkfat", id).expect("failed to get save directory");
+ let _ = std::fs::create_dir_all(pd.data_dir());
+ let path = pd.data_dir().join("teleia.save");
+ let file = std::fs::File::open(&path).ok()?;
+ serde_json::from_reader(file).ok()
+}
diff --git a/src/state.rs b/src/state.rs
index 2ac6d4b..4d23af6 100644
--- a/src/state.rs
+++ b/src/state.rs
@@ -504,9 +504,6 @@ impl State {
pub fn run_render<G>(&mut self, ctx: &context::Context, game: &mut G) where G: Game {
self.render_framebuffer.bind(&ctx);
- ctx.clear_color(glam::Vec4::new(0.1, 0.1, 0.1, 0.0));
- ctx.clear();
-
game.render(ctx, self);
self.screen.bind(&ctx);