gen img implmenting [build skip] dr rs 0.2.9.3

This commit is contained in:
shenjack 2023-05-25 22:50:45 +08:00
parent 854585574f
commit 0d38df6ec9
9 changed files with 85 additions and 28 deletions

View File

@ -7,8 +7,8 @@ fonts_folder = "libs/fonts"
[window]
style = "None"
width = 1954
height = 1266
width = 1683
height = 1474
visible = true
gui_scale = 1
caption = "Difficult Rocket v{DR_version}|DR_rs v{DR_Rust_get_version}"

View File

@ -18,6 +18,14 @@
- 基于 `PyConsole`
- 用于替换 `DR sdk` 的默认控制台方法
## DR rs 0.2.9.2
### `sr1_data`
### Bug 修复
- [#20](https://github.com/shenjackyuanjie/Difficult-Rocket/issues/20) `<DisconnectedParts/>`
## DR rs 0.2.9.1
### 实现

View File

@ -12,7 +12,7 @@ package_path = 'Difficult_Rocket_rs'
setup(
name='Difficult_Rocket_rs',
version="0.2.9.2",
version="0.2.9.3",
author='shenjackyuanjie',
author_email='3695888@qq.com',
rust_extensions=[RustExtension(target="Difficult_Rocket_rs.Difficult_Rocket_rs",

View File

@ -28,7 +28,7 @@ enum LoadState {
}
#[pyfunction]
fn get_version_str() -> String { "0.2.9.2".to_string() }
fn get_version_str() -> String { "0.2.9.3".to_string() }
#[pyfunction]
fn test_call(py_obj: &PyAny) -> PyResult<bool> {

View File

@ -112,6 +112,18 @@ pub mod data {
#[getter]
fn get_touch_ground(&self) -> bool { self.ship.touch_ground.to_owned() }
fn iter_parts(&self) -> HashMap<i64, (PySR1PartType, PySR1PartData)> {
let mut parts = HashMap::new();
for part_data in self.ship.parts.iter() {
let part_type = self.part_list.get_part_type(part_data.part_type_id.clone()).unwrap();
parts.insert(
part_data.id,
(PySR1PartType::new(part_type), PySR1PartData { data: part_data.clone() }),
);
}
parts
}
}
}

View File

@ -495,7 +495,7 @@ pub mod ship {
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct DisconnectedParts {
#[serde(rename = "DisconnectedPart")]
pub parts: Vec<DisconnectedPart>,
pub parts: Option<Vec<DisconnectedPart>>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
@ -556,17 +556,20 @@ pub mod ship {
parts.push(part.to_sr_part_data());
}
let disconnected = match &self.disconnected {
Some(disconnect) => {
let mut disconnect_parts = Vec::new();
for disconnected_part in &disconnect.parts {
let mut parts_vec = Vec::new();
for part in &disconnected_part.parts.parts {
parts_vec.push(part.to_sr_part_data());
Some(disconnect) => match &disconnect.parts {
Some(disconnected_parts) => {
let mut disconnected_parts_vec = Vec::new();
for disconnected_part in disconnected_parts {
let mut parts_vec = Vec::new();
for part in &disconnected_part.parts.parts {
parts_vec.push(part.to_sr_part_data());
}
disconnected_parts_vec.push((parts_vec, disconnected_part.connects.connects.clone()));
}
disconnect_parts.push((parts_vec, disconnected_part.connects.connects.clone()));
Some(disconnected_parts_vec)
}
Some(disconnect_parts)
}
None => None,
},
_ => None,
};
let connections = match &self.connects.connects {

View File

@ -198,8 +198,7 @@ pub mod sr1 {
impl SR1PartType {
pub fn get_box(&self) -> (f64, f64, f64, f64) {
let x = self.width as f64 / 2.0;
let y = self.height as f64 / 2.0;
(-x, -y, x, y)
(-x, 0.0, x, self.height as f64)
}
}
@ -749,7 +748,9 @@ pub mod sr1 {
},
});
}
Some(RawDisconnectedParts { parts: disconnected_vec })
Some(RawDisconnectedParts {
parts: Some(disconnected_vec),
})
}
_ => None,
};
@ -778,11 +779,14 @@ pub mod sr1 {
let p2 = p2.add(part.x, part.y);
let (x1, y1, x2, y2) = (p1.x, p1.y, p2.x, p2.y);
// get max box
max_box.0 = max_box.0.min(x1);
max_box.1 = max_box.1.min(y1);
max_box.2 = max_box.2.max(x2);
max_box.3 = max_box.3.max(y2);
max_box.0 = max_box.0.min(x1).min(part.x);
max_box.1 = max_box.1.min(y1).min(part.y);
max_box.2 = max_box.2.max(x2).max(part.x);
max_box.3 = max_box.3.max(y2).max(part.y);
// * 60 print again
// println!("{} {} {} {} id:{}", x1 * 60.0, y1 * 60.0, x2 * 60.0, y2 * 60.0, part.id)
}
max_box
}
}

View File

@ -15,7 +15,7 @@ from Difficult_Rocket.api.mod import ModInfo
from Difficult_Rocket.api.types import Options
from Difficult_Rocket.client import ClientWindow
DR_rust_version = Version("0.2.9.2") # DR_mod 的 Rust 编写部分的兼容版本
DR_rust_version = Version("0.2.9.3") # DR_mod 的 Rust 编写部分的兼容版本
class _DR_mod_runtime(Options):

View File

@ -4,6 +4,7 @@
# All rights reserved
# -------------------------------
import math
import time
import random
import logging
@ -117,9 +118,10 @@ class SR1ShipRender(BaseScreen):
x=main_window.width / 2, y=main_window.height / 2)
self.debug_mouse_label.visible = SR1ShipRender_Option.debug_mouse_pos
self.textures: Union[SR1Textures, None] = None
self.xml_name = 'configs/dock1.xml'
self.xml_doc: ElementTree = parse('configs/dock1.xml')
self.xml_root: ElementTree.Element = self.xml_doc.getroot()
# self.xml_name = 'configs/dock1.xml'
# self.xml_doc: ElementTree = parse('configs/dock1.xml')
# self.xml_root: ElementTree.Element = self.xml_doc.getroot()
self.load_xml('configs/dock1.xml')
self.part_batch = Batch()
self.part_group = Group()
self.debug_label = Label(x=20, y=main_window.height - 20, font_size=DR_option.std_font_size,
@ -373,9 +375,37 @@ class SR1ShipRender(BaseScreen):
elif command.find('gen_img'):
if not self.rendered:
return
# ship_size = self.ship.size
base_textures = Texture.create(100, 100)
...
if not DR_mod_runtime.use_DR_rust:
# 这个功能依赖于 DR rs (简称,我懒得在Python端实现)
return
img_box = self.rust_ship.img_pos
img_size = (img_box[2] - img_box[0] + 1000, img_box[3] - img_box[1] + 1000)
# img_center = (abs(img_box[0]), abs(img_box[1]))
# 中心点是左上角坐标
img_center = (abs(img_box[0]), abs(img_box[3]))
print(f"img_box: {img_box} img_size: {img_size} img_center: {img_center}")
try:
from pyglet.image.codecs.pil import PILImageEncoder
from PIL import Image
except ImportError:
traceback.print_exc()
print('PIL not found')
return
img = Image.new('RGBA', img_size)
for part, sprite in self.parts_sprite.items():
img_data = sprite.image.get_image_data()
fmt = img_data.format
if fmt != 'RGB':
fmt = 'RGBA'
pitch = -(img_data.width * len(fmt))
pil_image = Image.frombytes(fmt, (img_data.width, img_data.height), img_data.get_data(fmt, pitch))
pil_image = pil_image.rotate(-SR1Rotation.get_rotation(self.part_data[part].angle), expand=True)
if self.part_data[part].flip_y:
pil_image.transpose(Image.FLIP_TOP_BOTTOM)
if self.part_data[part].flip_x:
pil_image.transpose(Image.FLIP_LEFT_RIGHT)
img.paste(pil_image, (int(self.part_data[part].x*60 + img_center[0]), int(-self.part_data[part].y*60 + img_center[1])), pil_image)
img.save(f'test{time.time()}.png', 'PNG')
def on_mouse_drag(self, x: int, y: int, dx: int, dy: int, buttons: int, modifiers: int, window: "ClientWindow"):
if not self.focus: