* refactor: reorganize package structure and decouple framework packages ## Package Structure Reorganization - Reorganized 55 packages into categorized subdirectories: - packages/framework/ - Generic framework (Laya/Cocos compatible) - packages/engine/ - ESEngine core modules - packages/rendering/ - Rendering modules (WASM dependent) - packages/physics/ - Physics modules - packages/streaming/ - World streaming - packages/network-ext/ - Network extensions - packages/editor/ - Editor framework and plugins - packages/rust/ - Rust WASM engine - packages/tools/ - Build tools and SDK ## Framework Package Decoupling - Decoupled behavior-tree and blueprint packages from ESEngine dependencies - Created abstracted interfaces (IBTAssetManager, IBehaviorTreeAssetContent) - ESEngine-specific code moved to esengine/ subpath exports - Framework packages now usable with Cocos/Laya without ESEngine ## CI Configuration - Updated CI to only type-check and lint framework packages - Added type-check:framework and lint:framework scripts ## Breaking Changes - Package import paths changed due to directory reorganization - ESEngine integrations now use subpath imports (e.g., '@esengine/behavior-tree/esengine') * fix: update es-engine file path after directory reorganization * docs: update README to focus on framework over engine * ci: only build framework packages, remove Rust/WASM dependencies * fix: remove esengine subpath from behavior-tree and blueprint builds ESEngine integration code will only be available in full engine builds. Framework packages are now purely engine-agnostic. * fix: move network-protocols to framework, build both in CI * fix: update workflow paths from packages/core to packages/framework/core * fix: exclude esengine folder from type-check in behavior-tree and blueprint * fix: update network tsconfig references to new paths * fix: add test:ci:framework to only test framework packages in CI * fix: only build core and math npm packages in CI * fix: exclude test files from CodeQL and fix string escaping security issue
150 lines
4.1 KiB
Rust
150 lines
4.1 KiB
Rust
//! Rectangle implementation.
|
||
//! 矩形实现。
|
||
|
||
use super::Vec2;
|
||
|
||
/// Axis-aligned rectangle.
|
||
/// 轴对齐矩形。
|
||
///
|
||
/// # Examples | 示例
|
||
/// ```rust
|
||
/// use es_engine::math::{Rect, Vec2};
|
||
/// let rect = Rect::new(10.0, 20.0, 100.0, 50.0);
|
||
/// let point = Vec2::new(50.0, 40.0);
|
||
/// assert!(rect.contains_point(point));
|
||
/// ```
|
||
#[derive(Debug, Clone, Copy, PartialEq, Default)]
|
||
pub struct Rect {
|
||
/// X position (left edge).
|
||
/// X位置(左边缘)。
|
||
pub x: f32,
|
||
/// Y position (top edge).
|
||
/// Y位置(上边缘)。
|
||
pub y: f32,
|
||
/// Width.
|
||
/// 宽度。
|
||
pub width: f32,
|
||
/// Height.
|
||
/// 高度。
|
||
pub height: f32,
|
||
}
|
||
|
||
impl Rect {
|
||
/// Create a new rectangle.
|
||
/// 创建新矩形。
|
||
#[inline]
|
||
pub const fn new(x: f32, y: f32, width: f32, height: f32) -> Self {
|
||
Self { x, y, width, height }
|
||
}
|
||
|
||
/// Create a rectangle from two corner points.
|
||
/// 从两个角点创建矩形。
|
||
#[inline]
|
||
pub fn from_corners(min: Vec2, max: Vec2) -> Self {
|
||
Self {
|
||
x: min.x,
|
||
y: min.y,
|
||
width: max.x - min.x,
|
||
height: max.y - min.y,
|
||
}
|
||
}
|
||
|
||
/// Create a rectangle centered at a point.
|
||
/// 创建以某点为中心的矩形。
|
||
#[inline]
|
||
pub fn from_center(center: Vec2, width: f32, height: f32) -> Self {
|
||
Self {
|
||
x: center.x - width * 0.5,
|
||
y: center.y - height * 0.5,
|
||
width,
|
||
height,
|
||
}
|
||
}
|
||
|
||
/// Get the minimum (top-left) corner.
|
||
/// 获取最小(左上)角点。
|
||
#[inline]
|
||
pub fn min(&self) -> Vec2 {
|
||
Vec2::new(self.x, self.y)
|
||
}
|
||
|
||
/// Get the maximum (bottom-right) corner.
|
||
/// 获取最大(右下)角点。
|
||
#[inline]
|
||
pub fn max(&self) -> Vec2 {
|
||
Vec2::new(self.x + self.width, self.y + self.height)
|
||
}
|
||
|
||
/// Get the center point.
|
||
/// 获取中心点。
|
||
#[inline]
|
||
pub fn center(&self) -> Vec2 {
|
||
Vec2::new(self.x + self.width * 0.5, self.y + self.height * 0.5)
|
||
}
|
||
|
||
/// Get the size as a vector.
|
||
/// 获取尺寸向量。
|
||
#[inline]
|
||
pub fn size(&self) -> Vec2 {
|
||
Vec2::new(self.width, self.height)
|
||
}
|
||
|
||
/// Check if the rectangle contains a point.
|
||
/// 检查矩形是否包含某点。
|
||
#[inline]
|
||
pub fn contains_point(&self, point: Vec2) -> bool {
|
||
point.x >= self.x
|
||
&& point.x <= self.x + self.width
|
||
&& point.y >= self.y
|
||
&& point.y <= self.y + self.height
|
||
}
|
||
|
||
/// Check if this rectangle intersects with another.
|
||
/// 检查此矩形是否与另一个相交。
|
||
#[inline]
|
||
pub fn intersects(&self, other: &Rect) -> bool {
|
||
self.x < other.x + other.width
|
||
&& self.x + self.width > other.x
|
||
&& self.y < other.y + other.height
|
||
&& self.y + self.height > other.y
|
||
}
|
||
|
||
/// Get the intersection of two rectangles.
|
||
/// 获取两个矩形的交集。
|
||
pub fn intersection(&self, other: &Rect) -> Option<Rect> {
|
||
let x = self.x.max(other.x);
|
||
let y = self.y.max(other.y);
|
||
let right = (self.x + self.width).min(other.x + other.width);
|
||
let bottom = (self.y + self.height).min(other.y + other.height);
|
||
|
||
if right > x && bottom > y {
|
||
Some(Rect::new(x, y, right - x, bottom - y))
|
||
} else {
|
||
None
|
||
}
|
||
}
|
||
|
||
/// Get the union of two rectangles (bounding box).
|
||
/// 获取两个矩形的并集(包围盒)。
|
||
pub fn union(&self, other: &Rect) -> Rect {
|
||
let x = self.x.min(other.x);
|
||
let y = self.y.min(other.y);
|
||
let right = (self.x + self.width).max(other.x + other.width);
|
||
let bottom = (self.y + self.height).max(other.y + other.height);
|
||
|
||
Rect::new(x, y, right - x, bottom - y)
|
||
}
|
||
|
||
/// Expand the rectangle by a margin.
|
||
/// 按边距扩展矩形。
|
||
#[inline]
|
||
pub fn expand(&self, margin: f32) -> Rect {
|
||
Rect::new(
|
||
self.x - margin,
|
||
self.y - margin,
|
||
self.width + margin * 2.0,
|
||
self.height + margin * 2.0,
|
||
)
|
||
}
|
||
}
|