Mercurial > touhou
comparison python/src/glide/mod.rs @ 775:28d8b892fd06
Python: Upgrade pyo3 from 0.17 to 0.26
| author | Link Mauve <linkmauve@linkmauve.fr> |
|---|---|
| date | Mon, 13 Oct 2025 17:44:38 +0000 |
| parents | 7492d384d122 |
| children |
comparison
equal
deleted
inserted
replaced
| 774:d08eb4c9fce3 | 775:28d8b892fd06 |
|---|---|
| 1 use pyo3::prelude::*; | 1 use pyo3::prelude::*; |
| 2 use pyo3::types::{PyList, PyDict, PySequence}; | 2 use pyo3::types::{PyList, PyDict, PySequence, PyListMethods}; |
| 3 use pyo3::exceptions::PyTypeError; | 3 use pyo3::exceptions::PyTypeError; |
| 4 use std::collections::{HashMap, BTreeMap}; | 4 use std::collections::{HashMap, BTreeMap}; |
| 5 use image::GenericImageView; | 5 use image::GenericImageView; |
| 6 | 6 |
| 7 mod gr; | 7 mod gr; |
| 150 | 150 |
| 151 fn load_background(&self, background: PyObject) { | 151 fn load_background(&self, background: PyObject) { |
| 152 println!("TODO: GameRenderer::load_background({background})"); | 152 println!("TODO: GameRenderer::load_background({background})"); |
| 153 } | 153 } |
| 154 | 154 |
| 155 fn render_elements(&self, py: Python, elements: &PyList, shift: (f32, f32)) -> PyResult<()> { | 155 fn render_elements(&self, py: Python, elements: Bound<PyList>, shift: (f32, f32)) -> PyResult<()> { |
| 156 let module = py.import("pytouhou.ui.glide.sprite")?; | 156 let module = py.import("pytouhou.ui.glide.sprite")?; |
| 157 let get_sprite_rendering_data = module.getattr("get_sprite_rendering_data")?; | 157 let get_sprite_rendering_data = module.getattr("get_sprite_rendering_data")?; |
| 158 let mut prev_texture = u32::MAX; | 158 let mut prev_texture = u32::MAX; |
| 159 for element in elements.iter() { | 159 for element in elements.iter() { |
| 160 /* | 160 /* |
| 166 */ | 166 */ |
| 167 let x: f32 = element.getattr("x")?.extract()?; | 167 let x: f32 = element.getattr("x")?.extract()?; |
| 168 let y: f32 = element.getattr("y")?.extract()?; | 168 let y: f32 = element.getattr("y")?.extract()?; |
| 169 let sprite = element.getattr("sprite")?; | 169 let sprite = element.getattr("sprite")?; |
| 170 if !sprite.is_none() { | 170 if !sprite.is_none() { |
| 171 let (pos, mut texcoords, color): ([f32; 12], [f32; 4], u32) = get_sprite_rendering_data.call1((sprite,))?.extract()?; | 171 let (pos, mut texcoords, color): ([f32; 12], [f32; 4], u32) = get_sprite_rendering_data.call1((&sprite,))?.extract()?; |
| 172 for coord in &mut texcoords { | 172 for coord in &mut texcoords { |
| 173 *coord *= 256.0; | 173 *coord *= 256.0; |
| 174 } | 174 } |
| 175 let anm = sprite.getattr("anm")?; | 175 let anm = sprite.getattr("anm")?; |
| 176 let texture = anm.getattr("texture")?.extract()?; | 176 let texture = anm.getattr("texture")?.extract()?; |
| 187 | 187 |
| 188 fn render(&self, py: Python, game: PyObject) -> PyResult<()> { | 188 fn render(&self, py: Python, game: PyObject) -> PyResult<()> { |
| 189 gr::buffer_clear(0x000000ff, 0xff, 0xffff); | 189 gr::buffer_clear(0x000000ff, 0xff, 0xffff); |
| 190 for things in ["enemies", "effects", "players_bullets"/*, "lasers_sprites()"*/, "players"/*, "msg_sprites()"*/, "bullets", "lasers", "cancelled_bullets", "items", "labels"] { | 190 for things in ["enemies", "effects", "players_bullets"/*, "lasers_sprites()"*/, "players"/*, "msg_sprites()"*/, "bullets", "lasers", "cancelled_bullets", "items", "labels"] { |
| 191 let things = game.getattr(py, things)?; | 191 let things = game.getattr(py, things)?; |
| 192 let things: &PyList = things.extract(py)?; | 192 let things = things.extract(py)?; |
| 193 self.render_elements(py, things, (32.0, 16.0))?; | 193 self.render_elements(py, things, (32.0, 16.0))?; |
| 194 } | 194 } |
| 195 let interface = game.getattr(py, "interface")?; | 195 let interface = game.getattr(py, "interface")?; |
| 196 let boss = game.getattr(py, "boss")?; | 196 let boss = game.getattr(py, "boss")?; |
| 197 self.render_interface(py, interface, !boss.is_none(py))?; | 197 self.render_interface(py, interface, !boss.is_none(py))?; |
| 198 Ok(()) | 198 Ok(()) |
| 199 } | 199 } |
| 200 | 200 |
| 201 fn render_interface(&self, py: Python, interface: PyObject, boss: bool) -> PyResult<()> { | 201 fn render_interface(&self, py: Python, interface: PyObject, boss: bool) -> PyResult<()> { |
| 202 let items = interface.getattr(py, "items")?; | 202 let items = interface.getattr(py, "items")?; |
| 203 let items: &PyList = items.extract(py)?; | 203 let items = items.extract(py)?; |
| 204 self.render_elements(py, items, (0.0, 0.0))?; | 204 self.render_elements(py, items, (0.0, 0.0))?; |
| 205 /* | 205 /* |
| 206 // TODO: figure out why this doesn’t render alphanumeric characters. | 206 // TODO: figure out why this doesn’t render alphanumeric characters. |
| 207 let labels = interface.getattr(py, "labels")?; | 207 let labels = interface.getattr(py, "labels")?; |
| 208 let labels: &PyDict = labels.extract(py)?; | 208 let labels: &PyDict = labels.extract(py)?; |
| 209 self.render_elements(py, labels.values(), (0.0, 0.0))?; | 209 self.render_elements(py, labels.values(), (0.0, 0.0))?; |
| 210 */ | 210 */ |
| 211 if boss { | 211 if boss { |
| 212 let items = interface.getattr(py, "boss_items")?; | 212 let items = interface.getattr(py, "boss_items")?; |
| 213 let items: &PyList = items.extract(py)?; | 213 let items = items.extract(py)?; |
| 214 self.render_elements(py, items, (0.0, 0.0))?; | 214 self.render_elements(py, items, (0.0, 0.0))?; |
| 215 } | 215 } |
| 216 Ok(()) | 216 Ok(()) |
| 217 } | 217 } |
| 218 } | 218 } |
| 245 #[pyfunction] | 245 #[pyfunction] |
| 246 fn buffer_swap() { | 246 fn buffer_swap() { |
| 247 gr::buffer_swap(1); | 247 gr::buffer_swap(1); |
| 248 } | 248 } |
| 249 | 249 |
| 250 pub fn module(py: Python) -> PyResult<&PyModule> { | 250 #[pymodule] |
| 251 let m = PyModule::new(py, "glide")?; | 251 #[pyo3(name = "glide")] |
| 252 m.add_class::<GameRenderer>()?; | 252 pub mod module { |
| 253 m.add_function(wrap_pyfunction!(init, m)?)?; | 253 #[pymodule_export] |
| 254 m.add_function(wrap_pyfunction!(shutdown, m)?)?; | 254 use super::GameRenderer; |
| 255 m.add_function(wrap_pyfunction!(create_window, m)?)?; | 255 |
| 256 m.add_function(wrap_pyfunction!(buffer_swap, m)?)?; | 256 #[pymodule_export] |
| 257 Ok(&m) | 257 use super::init; |
| 258 } | 258 |
| 259 #[pymodule_export] | |
| 260 use super::shutdown; | |
| 261 | |
| 262 #[pymodule_export] | |
| 263 use super::create_window; | |
| 264 | |
| 265 #[pymodule_export] | |
| 266 use super::buffer_swap; | |
| 267 | |
| 268 } |
