gen img implmenting [build skip] dr rs 0.2.9.3
This commit is contained in:
parent
854585574f
commit
0d38df6ec9
@ -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}"
|
||||
|
@ -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
|
||||
|
||||
### 实现
|
||||
|
@ -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",
|
||||
|
@ -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> {
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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):
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user