-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
【WIP】feat: Add rectangle packing algorithm for texture placement #6
base: main
Are you sure you want to change the base?
Conversation
Walkthrough新しい Changes
Sequence Diagram(s)(このセクションには生成する必要のある図がありません。) Poem
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (invoked as PR comments)
Additionally, you can add CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Files selected for processing (3)
- src/lib.rs (1 hunks)
- src/pack.rs (2 hunks)
- src/rectpack.rs (1 hunks)
Additional context used
Path-based instructions (3)
src/lib.rs (1)
Pattern
**/*.rs
: - avoid unnecessary clonesrc/pack.rs (1)
Pattern
**/*.rs
: - avoid unnecessary clonesrc/rectpack.rs (1)
Pattern
**/*.rs
: - avoid unnecessary clone
Additional comments not posted (8)
src/lib.rs (1)
4-4
: モジュールの追加が適切です。
rectpack
モジュールの追加により、コードベースのモジュール化が進み、メンテナンス性が向上します。変更は問題ありません。src/pack.rs (2)
23-29
: 新しいコンストラクタのパラメータが適切です。
TexturePacker
のコンストラクタにwidth
とheight
を追加することで、ルートノードのサイズを指定できるようになり、柔軟性が向上しています。この変更は正しいです。
43-47
:Image
インスタンスの作成が適切です。
add_texture
メソッドでImage
インスタンスを作成することで、テクスチャのメタデータを構造化して管理できるようになっています。この設計は将来的な拡張に有利です。src/rectpack.rs (5)
1-7
:Rectangle
構造体の定義が適切です。
Rectangle
構造体は、矩形の位置とサイズを表すために適切に設計されています。
9-25
:Rectangle
のメソッドが適切です。
width
とheight
メソッドは矩形の幅と高さを正しく計算しており、fits
とfits_perfectly
メソッドは画像が矩形に収まるかを判定するために有用です。
27-31
:Image
構造体の定義が適切です。
Image
構造体は、画像の ID、幅、高さを保持するために適切に設計されています。
33-37
:Node
構造体の定義が適切です。
Node
構造体は、子ノードと矩形を保持し、画像 ID をオプションで持つために適切に設計されています。
39-46
:Node::new
メソッドが適切です。新しいノードを初期化するための
Node::new
メソッドは、正しく初期化を行っています。
pub fn insert(&mut self, img: &Image) -> Option<&mut Node> { | ||
if let Some(ref mut child0) = self.child[0] { | ||
if let Some(new_node) = child0.insert(img) { | ||
return Some(new_node); | ||
} | ||
} else { | ||
if self.image_id.is_some() { | ||
return None; | ||
} | ||
|
||
if !self.rect.fits(img) { | ||
return None; | ||
} | ||
|
||
if self.rect.fits_perfectly(img) { | ||
// self.image_id = Some(img.id); | ||
return Some(self); | ||
} | ||
|
||
let child0_rect; | ||
let child1_rect; | ||
let dw = self.rect.width() - img.width; | ||
let dh = self.rect.height() - img.height; | ||
|
||
if dw > dh { | ||
child0_rect = Rectangle { | ||
left: self.rect.left, | ||
top: self.rect.top, | ||
right: self.rect.left + img.width - 1, | ||
bottom: self.rect.bottom, | ||
}; | ||
child1_rect = Rectangle { | ||
left: self.rect.left + img.width, | ||
top: self.rect.top, | ||
right: self.rect.right, | ||
bottom: self.rect.bottom, | ||
}; | ||
} else { | ||
child0_rect = Rectangle { | ||
left: self.rect.left, | ||
top: self.rect.top, | ||
right: self.rect.right, | ||
bottom: self.rect.top + img.height - 1, | ||
}; | ||
child1_rect = Rectangle { | ||
left: self.rect.left, | ||
top: self.rect.top + img.height, | ||
right: self.rect.right, | ||
bottom: self.rect.bottom, | ||
}; | ||
} | ||
|
||
self.child[0] = Some(Box::new(Node::new(child0_rect))); | ||
self.child[1] = Some(Box::new(Node::new(child1_rect))); | ||
|
||
if let Some(ref mut child0) = self.child[0] { | ||
return child0.insert(img); | ||
} | ||
} | ||
None |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Node::insert
メソッドの改善点
Node::insert
メソッドは、ノードに画像を挿入するためのロジックを含んでいますが、image_id
の設定がコメントアウトされています。画像が完璧にフィットする場合に image_id
を設定する必要があります。
if self.rect.fits_perfectly(img) {
self.image_id = Some(img.id.clone());
return Some(self);
}
Close #0
What I did(変更内容)
Notes(連絡事項)
None / なし
Summary by CodeRabbit
新機能
rectpack
モジュールが追加され、矩形パッキングに関連する機能が外部からアクセス可能になりました。TexturePacker
のコンストラクタが幅と高さのパラメータを受け取るようになり、テクスチャ配置操作のためのルートノードサイズを指定できるようになりました。Image
構造体が導入され、テクスチャデータの取り扱いが改善されました。変更点
Node
構造体が追加され、矩形内に画像を効率的に配置するための二分木構造をサポートします。