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 }