进行一波为了拆分的大重构
This commit is contained in:
parent
1f44748750
commit
1b01887374
@ -52,6 +52,11 @@ if TYPE_CHECKING:
|
||||
"""
|
||||
...
|
||||
|
||||
def render_hack() -> None:
|
||||
"""
|
||||
进行一些 rust 方面的 渲染接管
|
||||
"""
|
||||
|
||||
class SR1PartType_rs: # NOQA
|
||||
"""
|
||||
用于从 rust 中读取 SR1PartType
|
||||
|
1509
mods/dr_game/Difficult_Rocket_rs/src/Cargo.lock
generated
1509
mods/dr_game/Difficult_Rocket_rs/src/Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@ -24,15 +24,18 @@ opt-level = 2
|
||||
[dependencies]
|
||||
anyhow = "1.0"
|
||||
|
||||
quick-xml = { version = "0.36.1", features = ["serialize"] }
|
||||
quick-xml = { version = "0.37", features = ["serialize"] }
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
|
||||
nalgebra = "0.33"
|
||||
pyo3 = { version = "0.22.2", features = [
|
||||
pyo3 = { version = "0.22", features = [
|
||||
"extension-module",
|
||||
"macros",
|
||||
"py-clone",
|
||||
] }
|
||||
|
||||
rapier2d-f64 = { version = "0.22.0", features = ["simd-stable"] }
|
||||
# 让我们来试试黑魔法
|
||||
winit = "0.30.5"
|
||||
|
||||
rapier2d-f64 = { version = "0.22", features = ["simd-stable"] }
|
||||
# 虽然但是, raiper在这里!
|
||||
|
@ -8,12 +8,13 @@
|
||||
|
||||
mod dr_physics;
|
||||
mod python;
|
||||
/// 也许是一些渲染的东西
|
||||
mod renders;
|
||||
/// sr1 的逆天数据结构解析
|
||||
mod sr1_parse;
|
||||
|
||||
use pyo3::prelude::*;
|
||||
|
||||
pub type IdType = i64;
|
||||
|
||||
#[pyfunction]
|
||||
fn get_version_str() -> String {
|
||||
env!("CARGO_PKG_VERSION").to_string()
|
||||
@ -23,10 +24,11 @@ fn get_version_str() -> String {
|
||||
#[pyo3(name = "Difficult_Rocket_rs")]
|
||||
fn module_init(m: &Bound<'_, PyModule>) -> PyResult<()> {
|
||||
m.add_function(wrap_pyfunction!(get_version_str, m)?)?;
|
||||
m.add_function(wrap_pyfunction!(sr1_parse::part_list::read_part_list_py, m)?)?;
|
||||
m.add_function(wrap_pyfunction!(sr1_parse::ship::py_raw_ship_from_file, m)?)?;
|
||||
m.add_function(wrap_pyfunction!(sr1_parse::py::read_part_list_py, m)?)?;
|
||||
m.add_function(wrap_pyfunction!(sr1_parse::py::py_raw_ship_from_file, m)?)?;
|
||||
m.add_function(wrap_pyfunction!(sr1_parse::py::py_assert_ship, m)?)?;
|
||||
m.add_function(wrap_pyfunction!(python::data::load_and_save_test, m)?)?;
|
||||
m.add_function(wrap_pyfunction!(sr1_parse::ship::py_assert_ship, m)?)?;
|
||||
m.add_function(wrap_pyfunction!(renders::render_hack, m)?)?;
|
||||
m.add_class::<python::data::PySR1Ship>()?;
|
||||
m.add_class::<python::data::PySR1PartList>()?;
|
||||
m.add_class::<python::data::PySR1PartType>()?;
|
||||
|
@ -1,4 +1,4 @@
|
||||
use std::io::{self, Write};
|
||||
use std::io::Write;
|
||||
|
||||
use pyo3::prelude::*;
|
||||
|
||||
@ -24,7 +24,7 @@ impl PyConsole {
|
||||
let (stop_sender, stop_receiver) = std::sync::mpsc::channel();
|
||||
let (keyboard_input_sender, keyboard_input_receiver) = std::sync::mpsc::channel();
|
||||
std::thread::spawn(move || {
|
||||
let std_in = io::stdin();
|
||||
let std_in = std::io::stdin();
|
||||
loop {
|
||||
if let Ok(()) = stop_receiver.try_recv() {
|
||||
break;
|
||||
@ -39,7 +39,7 @@ impl PyConsole {
|
||||
}
|
||||
});
|
||||
print!("rs>");
|
||||
io::stdout().flush().unwrap();
|
||||
std::io::stdout().flush().unwrap();
|
||||
self.stop_sender = Some(stop_sender);
|
||||
self.keyboard_input_receiver = Some(keyboard_input_receiver);
|
||||
}
|
||||
@ -54,7 +54,7 @@ impl PyConsole {
|
||||
|
||||
fn new_command(&self) -> bool {
|
||||
print!("rs>");
|
||||
io::stdout().flush().unwrap();
|
||||
std::io::stdout().flush().unwrap();
|
||||
true
|
||||
}
|
||||
|
||||
|
@ -6,10 +6,10 @@ use pyo3::prelude::*;
|
||||
use crate::dr_physics::math::{Point2D, Rotate};
|
||||
use crate::sr1_parse::part_list::RawPartList;
|
||||
use crate::sr1_parse::ship::{Connection, RawConnectionData, RawShip};
|
||||
use crate::sr1_parse::IdType;
|
||||
use crate::sr1_parse::SaveStatus;
|
||||
use crate::sr1_parse::{get_max_box, SR1PartData, SR1PartListTrait};
|
||||
use crate::sr1_parse::{SR1PartList, SR1PartType, SR1Ship};
|
||||
use crate::IdType;
|
||||
|
||||
use quick_xml::se::to_string;
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
* -------------------------------
|
||||
*/
|
||||
|
||||
use crate::IdType;
|
||||
use crate::sr1_parse::IdType;
|
||||
|
||||
use nalgebra::{Matrix2, Vector2};
|
||||
use pyo3::prelude::*;
|
||||
|
38
mods/dr_game/Difficult_Rocket_rs/src/src/renders.rs
Normal file
38
mods/dr_game/Difficult_Rocket_rs/src/src/renders.rs
Normal file
@ -0,0 +1,38 @@
|
||||
use pyo3::pyfunction;
|
||||
use winit::{application::ApplicationHandler, event_loop::EventLoop, window::Window};
|
||||
|
||||
#[pyfunction]
|
||||
pub fn render_hack() {
|
||||
println!("render_hacking_start");
|
||||
render_main();
|
||||
println!("render_hacking_end");
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
struct App {
|
||||
window: Option<Window>,
|
||||
}
|
||||
|
||||
impl ApplicationHandler for App {
|
||||
fn resumed(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) {
|
||||
// 这里需要获取现有的窗口, 毕竟是运行在一个已有窗口的 Python 程序里
|
||||
// self.window = Some(event_loop.ge)
|
||||
}
|
||||
|
||||
fn window_event(
|
||||
&mut self,
|
||||
event_loop: &winit::event_loop::ActiveEventLoop,
|
||||
window_id: winit::window::WindowId,
|
||||
event: winit::event::WindowEvent,
|
||||
) {
|
||||
}
|
||||
}
|
||||
|
||||
fn render_main() -> anyhow::Result<()> {
|
||||
let event_loop = EventLoop::new()?;
|
||||
let mut app = App::default();
|
||||
|
||||
event_loop.run_app(&mut app);
|
||||
|
||||
Ok(())
|
||||
}
|
@ -1,6 +1,9 @@
|
||||
mod data_structure;
|
||||
pub mod part_list;
|
||||
/// 所有的 Python 相关交互都应该在这里
|
||||
pub mod py;
|
||||
pub mod ship;
|
||||
|
||||
pub use self::data_structure::*;
|
||||
pub type IdType = i64;
|
||||
|
||||
use crate::dr_physics::math::{Edge, Shape};
|
||||
use crate::dr_physics::math::{Point2D, Rotate};
|
||||
@ -12,7 +15,6 @@ use crate::sr1_parse::ship::{
|
||||
Staging as RawStaging, Step as RawStep, Tank as RawTank,
|
||||
};
|
||||
use crate::sr1_parse::ship::{Connections as RawConnections, DisconnectedParts, Parts as RawParts};
|
||||
use crate::IdType;
|
||||
|
||||
use std::cell::{Cell, RefCell};
|
||||
use std::collections::HashMap;
|
||||
|
@ -1,10 +0,0 @@
|
||||
/*
|
||||
* -------------------------------
|
||||
* Difficult Rocket
|
||||
* Copyright © 2020-2023 by shenjackyuanjie 3695888@qq.com
|
||||
* All rights reserved
|
||||
* -------------------------------
|
||||
*/
|
||||
|
||||
pub mod part_list;
|
||||
pub mod ship;
|
@ -2,7 +2,6 @@ use crate::sr1_parse::{SR1PartList, SR1PartType, SR1PartTypeAttr};
|
||||
use crate::sr1_parse::{SR1PartListTrait, SR1PartTypeData};
|
||||
|
||||
use anyhow::Result;
|
||||
use pyo3::prelude::*;
|
||||
use quick_xml::de::from_str;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
@ -407,17 +406,3 @@ impl SR1PartListTrait for RawPartList {
|
||||
self.clone()
|
||||
}
|
||||
}
|
||||
|
||||
#[pyfunction]
|
||||
#[pyo3(name = "part_list_read_test", signature = (file_name = "./assets/builtin/PartList.xml".to_string()))]
|
||||
pub fn read_part_list_py(_py: Python, file_name: Option<String>) -> PyResult<()> {
|
||||
let file_name = file_name.unwrap_or("./assets/builtin/PartList.xml".to_string());
|
||||
// let _parts = RawPartList::from_file(file_name);
|
||||
// if let Some(parts) = _parts {
|
||||
// // println!("{:?}", parts)
|
||||
// parts.list_print();
|
||||
// let _part_list = parts.to_sr_part_list(Some("Vanilla".to_string()));
|
||||
// }
|
||||
println!("{:?}", RawPartList::from_file(file_name));
|
||||
Ok(())
|
||||
}
|
96
mods/dr_game/Difficult_Rocket_rs/src/src/sr1_parse/py.rs
Normal file
96
mods/dr_game/Difficult_Rocket_rs/src/src/sr1_parse/py.rs
Normal file
@ -0,0 +1,96 @@
|
||||
use pyo3::{pyfunction, PyResult, Python};
|
||||
use quick_xml::{de::from_str, events::Event, Reader};
|
||||
|
||||
use super::part_list::RawPartList;
|
||||
use super::ship::RawShip;
|
||||
|
||||
#[pyfunction]
|
||||
#[pyo3(name = "part_list_read_test", signature = (file_name = "./assets/builtin/PartList.xml".to_string()))]
|
||||
pub fn read_part_list_py(_py: Python, file_name: Option<String>) -> PyResult<()> {
|
||||
let file_name = file_name.unwrap_or("./assets/builtin/PartList.xml".to_string());
|
||||
// let _parts = RawPartList::from_file(file_name);
|
||||
// if let Some(parts) = _parts {
|
||||
// // println!("{:?}", parts)
|
||||
// parts.list_print();
|
||||
// let _part_list = parts.to_sr_part_list(Some("Vanilla".to_string()));
|
||||
// }
|
||||
println!("{:?}", RawPartList::from_file(file_name));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[pyfunction]
|
||||
#[pyo3(name = "read_ship_test")]
|
||||
#[pyo3(signature = (path = "./assets/builtin/dock1.xml".to_string()))]
|
||||
pub fn py_raw_ship_from_file(path: String) -> PyResult<bool> {
|
||||
let file = std::fs::read_to_string(path)?;
|
||||
let raw_ship = from_str::<RawShip>(&file);
|
||||
match raw_ship {
|
||||
Ok(ship) => {
|
||||
println!("{:?}", ship);
|
||||
Ok(true)
|
||||
}
|
||||
Err(e) => {
|
||||
println!("{:?}", e);
|
||||
Ok(false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[pyfunction]
|
||||
#[pyo3(name = "assert_ship")]
|
||||
/// 校验这玩意是不是个船
|
||||
pub fn py_assert_ship(path: String) -> bool {
|
||||
let file_data = match std::fs::read_to_string(path) {
|
||||
Ok(data) => data,
|
||||
Err(e) => {
|
||||
println!("ERROR while reading file!\n{}\n----------", e);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
let mut reader = Reader::from_str(&file_data);
|
||||
// 读取第一个
|
||||
loop {
|
||||
match reader.read_event() {
|
||||
Ok(Event::Start(e)) => {
|
||||
if e.name().as_ref() == b"Ship" {
|
||||
// 再验证一下 version, liftedOff, touchingGround
|
||||
let mut founds = (false, false, false);
|
||||
for attr in e.attributes().flatten() {
|
||||
match attr.key.as_ref() {
|
||||
b"version" => {
|
||||
founds.0 = true;
|
||||
}
|
||||
b"liftedOff" => {
|
||||
founds.1 = true;
|
||||
}
|
||||
b"touchingGround" => {
|
||||
founds.2 = true;
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
}
|
||||
if !(founds.0 && founds.1 && founds.2) {
|
||||
println!(
|
||||
"warning: {}{}{} not found",
|
||||
if founds.0 { "" } else { "version " },
|
||||
if founds.1 { "" } else { "liftedOff " },
|
||||
if founds.2 { "" } else { "touchingGround " }
|
||||
);
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(Event::Eof) => {
|
||||
println!("EOF");
|
||||
return false;
|
||||
}
|
||||
Err(e) => {
|
||||
println!("ERROR while using xml to parse the file!\n{:?}\n----------", e);
|
||||
return false;
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
}
|
||||
}
|
@ -1,9 +1,7 @@
|
||||
use crate::sr1_parse::IdType;
|
||||
use crate::sr1_parse::{SR1PartData, SR1PartDataAttr, SR1Ship};
|
||||
use crate::sr1_parse::{SR1PartDataTrait, SR1ShipTrait};
|
||||
use crate::IdType;
|
||||
|
||||
use anyhow::Result;
|
||||
use pyo3::prelude::*;
|
||||
use quick_xml::de::from_str;
|
||||
use quick_xml::events::Event;
|
||||
use quick_xml::reader::Reader;
|
||||
@ -344,87 +342,10 @@ impl RawShip {
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn save(&self, file_name: String) -> Result<()> {
|
||||
pub fn save(&self, file_name: String) -> anyhow::Result<()> {
|
||||
let part_list_file = to_string(self)?;
|
||||
print!("{:?}", part_list_file);
|
||||
std::fs::write(file_name, part_list_file)?;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[pyfunction]
|
||||
#[pyo3(name = "read_ship_test")]
|
||||
#[pyo3(signature = (path = "./assets/builtin/dock1.xml".to_string()))]
|
||||
pub fn py_raw_ship_from_file(path: String) -> PyResult<bool> {
|
||||
let file = std::fs::read_to_string(path)?;
|
||||
let raw_ship = from_str::<RawShip>(&file);
|
||||
match raw_ship {
|
||||
Ok(ship) => {
|
||||
println!("{:?}", ship);
|
||||
Ok(true)
|
||||
}
|
||||
Err(e) => {
|
||||
println!("{:?}", e);
|
||||
Ok(false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[pyfunction]
|
||||
#[pyo3(name = "assert_ship")]
|
||||
/// 校验这玩意是不是个船
|
||||
pub fn py_assert_ship(path: String) -> bool {
|
||||
let file_data = match std::fs::read_to_string(path) {
|
||||
Ok(data) => data,
|
||||
Err(e) => {
|
||||
println!("ERROR while reading file!\n{}\n----------", e);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
let mut reader = Reader::from_str(&file_data);
|
||||
// 读取第一个
|
||||
loop {
|
||||
match reader.read_event() {
|
||||
Ok(Event::Start(e)) => {
|
||||
if e.name().as_ref() == b"Ship" {
|
||||
// 再验证一下 version, liftedOff, touchingGround
|
||||
let mut founds = (false, false, false);
|
||||
for attr in e.attributes().flatten() {
|
||||
match attr.key.as_ref() {
|
||||
b"version" => {
|
||||
founds.0 = true;
|
||||
}
|
||||
b"liftedOff" => {
|
||||
founds.1 = true;
|
||||
}
|
||||
b"touchingGround" => {
|
||||
founds.2 = true;
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
}
|
||||
if !(founds.0 && founds.1 && founds.2) {
|
||||
println!(
|
||||
"warning: {}{}{} not found",
|
||||
if founds.0 { "" } else { "version " },
|
||||
if founds.1 { "" } else { "liftedOff " },
|
||||
if founds.2 { "" } else { "touchingGround " }
|
||||
);
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(Event::Eof) => {
|
||||
println!("EOF");
|
||||
return false;
|
||||
}
|
||||
Err(e) => {
|
||||
println!("ERROR while using xml to parse the file!\n{:?}\n----------", e);
|
||||
return false;
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
}
|
||||
}
|
@ -16,6 +16,7 @@ from lib_not_dr import loggers
|
||||
# from pyglet.text import Label
|
||||
|
||||
# from . import DR_mod_runtime
|
||||
from .render import render_hack_init
|
||||
|
||||
logger = loggers.config.get_logger_from_old("client.dr_game_menu", "client")
|
||||
|
||||
@ -50,6 +51,18 @@ class Menu(BaseScreen):
|
||||
group=self.main_group,
|
||||
)
|
||||
|
||||
self.magic_rust_test_button = OreuiButton(
|
||||
x=100,
|
||||
y=150,
|
||||
width=150,
|
||||
height=30,
|
||||
text="一些魔法 rust 测试",
|
||||
toggle_mode=False,
|
||||
auto_release=True,
|
||||
batch=self.main_batch,
|
||||
group=self.main_group,
|
||||
)
|
||||
|
||||
def on_release(x, y):
|
||||
from .sr1_ship import SR1ShipEditor, SR1ShipSelecter
|
||||
|
||||
@ -60,7 +73,9 @@ class Menu(BaseScreen):
|
||||
logger.info("added SR1_ship screen", tag="dr_game")
|
||||
|
||||
self.enter_ship_editor_button.set_handler("on_release", on_release)
|
||||
self.magic_rust_test_button.set_handler("on_release", render_hack_init)
|
||||
main_window.push_handlers(self.enter_ship_editor_button)
|
||||
main_window.push_handlers(self.magic_rust_test_button)
|
||||
|
||||
def on_draw(self, window: ClientWindow):
|
||||
self.main_batch.draw()
|
||||
|
9
mods/dr_game/render.py
Normal file
9
mods/dr_game/render.py
Normal file
@ -0,0 +1,9 @@
|
||||
"""
|
||||
温馨提示: 这里都是用来让 rust 接管的, 所以不用想别的了
|
||||
"""
|
||||
|
||||
from .Difficult_Rocket_rs import render_hack
|
||||
|
||||
|
||||
def render_hack_init(x, y):
|
||||
render_hack()
|
Loading…
Reference in New Issue
Block a user