Skip to content
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

atlas: アトラス化の実行速度を計測するexamplesの追加 #5

Open
wants to merge 5 commits into
base: main
Choose a base branch
from

Conversation

yud0uhu
Copy link
Collaborator

@yud0uhu yud0uhu commented Aug 15, 2024

Description(変更内容)

Manual Testing(手動テスト)

プロジェクトのディレクトリ直下で以下のコマンドを実行すると、挙動が確認できます。

cargo run --example test_execution_time -- -t
# cargo run --example test_execution_time -- --time
// ...
PlacedTextureInfo { id: "texture_red_dice_17", atlas_id: "0", origin: (47, 231), width: 33, height: 33, placed_uv_coords: [(0.15625, 0.548828125), (0.091796875, 0.484375), (0.15625, 0.484375)] }
Execution time: 27.02ms

P.S.

4650fdf

CLIオプションから -- -a <ALGORITHM> でアルゴリズムを切り替えられるように修正しました。

cargo run --example test_execution_time -- -a guillotine
# cargo run --example test_execution_time -- --algorithm guillotine

また、 実行速度の計測についてはこちら のPRでplace_duration が算出できるようになっていたため、CLIから -- -t オプションを指定したとき place_duration を出力する形に修正を行いました。

Summary by CodeRabbit

Summary by CodeRabbit

  • 新機能

    • 画像処理のためのコマンドラインツールを追加しました。3Dレンダリング用のテクスチャ管理が可能です。
    • テクスチャの実行時間を測定する機能を備えています。
  • 改善

    • テクスチャデータの読み込みと整理を効率化する機能を強化しました。
    • テクスチャプレースメントの柔軟性を向上させるため、動的ディスパッチを導入しました。
  • ドキュメント

    • 実行時間の計測機能を提供する新しいモジュールを導入しました。

@yud0uhu yud0uhu marked this pull request as ready for review August 15, 2024 03:45
Copy link

coderabbitai bot commented Aug 15, 2024

Walkthrough

新しい機能が追加され、画像処理およびテクスチャ管理の能力が向上しました。コマンドラインツールは、テクスチャを効率的にパッキングし、実行時間を測定するためのオプションを提供します。ExecutionTimer構造体により、開発者は操作にかかる時間を簡単に追跡できるようになりました。この変更により、パフォーマンスの監視とプロファイリングが促進されます。

Changes

ファイル 変更概要
examples/test_execution_time.rs コマンドラインツールを追加し、テクスチャの管理と実行時間の測定を実装。Polygon構造体を導入し、テクスチャデータの整理と出力を実現。
examples/utils/execution_time.rs ExecutionTimer構造体を追加し、経過時間を測定するための機能を実装。
examples/utils/mod.rs execution_timeモジュールを公開し、実行時間の測定機能を他の部分から利用可能に。
src/pack.rs TexturePacker構造体を修正し、TexturePlacerの型をボックス化されたトレイトオブジェクトに変更。
examples/test_pack.rs placer変数の型をBox<dyn TexturePlacer>に変更し、動的ディスパッチを可能に。

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?

Share
Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    -- I pushed a fix in commit <commit_id>, please review it.
    -- Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    -- @coderabbitai generate unit testing code for this file.
    -- @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    -- @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    -- @coderabbitai read src/utils.ts and generate unit testing code.
    -- @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    -- @coderabbitai help me debug CodeRabbit configuration file.

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 using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Tip

Early access features: enabled

We are currently testing new code review model(s) that may lead to higher noise levels in the review comments. Please disable the early access features if the noise level causes any inconvenience.

Note:

  • You can enable or disable early access features from the CodeRabbit UI or by updating the CodeRabbit configuration file.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Outside diff range, codebase verification and nitpick comments (1)
examples/test_execution_time.rs (1)

216-244: ログメッセージを改善してください。

実行時間のログメッセージをより説明的にすることで、出力がわかりやすくなります。

println!("Total execution time for adding textures to the atlas: {:.2?}", elapsed_time);
Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 02a2919 and 43091e4.

Files ignored due to path filters (1)
  • Cargo.toml is excluded by !**/*.toml
Files selected for processing (3)
  • examples/test_execution_time.rs (1 hunks)
  • examples/utils/execution_time.rs (1 hunks)
  • examples/utils/mod.rs (1 hunks)
Files skipped from review due to trivial changes (1)
  • examples/utils/mod.rs
Additional context used
Path-based instructions (2)
examples/utils/execution_time.rs (1)

Pattern **/*.rs: - avoid unnecessary clone

examples/test_execution_time.rs (1)

Pattern **/*.rs: - avoid unnecessary clone

Additional comments not posted (5)
examples/utils/execution_time.rs (1)

3-16: 良い実装です!

ExecutionTimerの実装はシンプルで効率的です。Instant::now()を使用して開始時間を記録し、elapsed()で経過時間を計測しています。このコードは正しく、改善の必要はありません。

examples/test_execution_time.rs (4)

1-17: インポートが適切です。

必要なモジュールが正しくインポートされています。不要なインポートはありません。


19-25: 構造体の定義が適切です。

Polygon構造体は、テクスチャ処理のために必要なデータを保持するために適切に定義されています。


28-179: データ構造が適切です。

faces配列とmaterial_to_textureマップは、それぞれの目的に合った正しいデータを保持しています。


197-214: コマンドライン引数の解析が正しく実装されています。

clapを使用した引数の解析は適切で、問題はありません。

Comment on lines +185 to +195
for (idx, (material, uv_coords)) in faces.iter().enumerate() {
let texture_file = material_to_texture.get(material).unwrap();
let path_string = format!("./examples/assets/dice/{}", texture_file);
let image_path = PathBuf::from(path_string);
polygons.push(Polygon {
id: format!("texture_{}_{}", material, idx),
uv_coords: uv_coords.iter().map(|&(u, v)| (u, v)).collect(),
texture_uri: image_path,
downsample_factor: DownsampleFactor::new(&downsample_factor),
});
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

エラーハンドリングを改善してください。

unwrap()を使用すると、エラーが発生したときにプログラムがパニックになります。より堅牢なエラーハンドリングを使用することをお勧めします。

let texture_file = match material_to_texture.get(material) {
    Some(file) => file,
    None => {
        eprintln!("Error: Material '{}' not found in texture map.", material);
        continue;
    }
};

Comment on lines 246 to 267
let output_unused_pixels = matches.contains_id("INPUT");

let input = match matches.get_one::<String>("INPUT") {
Some(input_value) => input_value,
None => {
std::process::exit(0);
}
};

let output_dir = Path::new("./examples/output/");
packer.export(output_dir, &texture_cache, config.width(), config.height());

let img = open(input).expect("Failed to open image");

if output_unused_pixels {
let unused_pixels = img
.pixels()
.filter(|&(_, _, pixel)| matches!(pixel, Rgba([0, 0, 0, 0])))
.count();

println!("unused pixels: {}", unused_pixels);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

出力ディレクトリの存在を確認してください。

画像をエクスポートする前に、出力ディレクトリが存在することを確認することをお勧めします。

let output_dir = Path::new("./examples/output/");
if !output_dir.exists() {
    std::fs::create_dir_all(output_dir).expect("Failed to create output directory");
}
packer.export(output_dir, &texture_cache, config.width(), config.height());


// initialize texture packer
let config = TexturePlacerConfig::new(500, 500, 1);
let placer = GuillotineTexturePlacer::new(config.clone());
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@yud0uhu ここでGullotineTexturePlacerが指定されているのですが、これをCLI側から指定してアルゴリズムを切り替えられると最高だな、と思っていました…!
ちょっと実装方法を調べて見ていただけると助かります!

Copy link
Collaborator Author

@yud0uhu yud0uhu Sep 22, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nokonoko1203
対応が遅くなり申し訳ありません🙇

4650fdf

CLIオプションから -- -a <ALGORITHM> でアルゴリズムを切り替えられるように修正しました。
(ex. cargo run --example test_execution_time -- -a guillotine)

また、 実行速度の計測についてはこちら のPRでplace_duration が算出できるようになっていたため、CLIから -- -t オプションを指定したときに place_duration を出力する形に修正を行いました!

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 43091e4 and a05f6a0.

Files ignored due to path filters (1)
  • Cargo.toml is excluded by !**/*.toml
Files selected for processing (1)
  • examples/utils/mod.rs (1 hunks)
Additional context used
Path-based instructions (1)
examples/utils/mod.rs (1)

Pattern **/*.rs: - avoid unnecessary clone

Additional comments not posted (1)
examples/utils/mod.rs (1)

1-1: 変更が承認されました。

新しい execution_time モジュールの追加は、実行速度の測定機能を提供するためのものであり、PRの目的に合致しています。

コード変更が承認されました。

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

Outside diff range and nitpick comments (1)
examples/test_pack.rs (1)

Line range hint 1-104: 全体的な改善の提案

コード全体を見直した結果、以下の改善点が見つかりました:

  1. ロギングの改善:
    現在のprintln!の使用は、デバッグには適していますが、本番環境では適切ではありません。logクレートなどの適切なロギングフレームワークの使用を検討してください。これにより、ログレベルの制御やより構造化されたログ出力が可能になります。

  2. rayonの使用最適化:
    par_iter()の使用は良いですが、結果の収集方法を改善できる可能性があります。例えば、foldreduce操作を使用して、並列処理の結果をより効率的に集約することを検討してください。

  3. ポリゴン生成ループの最適化:
    現在のネストされたループは、大量のポリゴンを生成しています。これは意図的なものかもしれませんが、もし可能であれば、このプロセスを最適化するか、より効率的なデータ構造を使用することを検討してください。

  4. エラーハンドリング:
    unwrap()の使用が見られます。本番環境向けのコードでは、適切なエラーハンドリングを実装することをお勧めします。

  5. 設定の外部化:
    ハードコードされた値(例:画像サイズ、ポリゴン数)は、設定ファイルや環境変数から読み込むことを検討してください。これにより、コードの柔軟性が向上します。

これらの改善は、コードの保守性、パフォーマンス、および再利用性を向上させる可能性があります。優先順位を付けて段階的に実装することをお勧めします。

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between a05f6a0 and 4650fdf.

Files selected for processing (3)
  • examples/test_execution_time.rs (1 hunks)
  • examples/test_pack.rs (2 hunks)
  • src/pack.rs (1 hunks)
Additional context used
Path-based instructions (3)
examples/test_execution_time.rs (1)

Pattern **/*.rs: - avoid unnecessary clone

examples/test_pack.rs (1)

Pattern **/*.rs: - avoid unnecessary clone

src/pack.rs (1)

Pattern **/*.rs: - avoid unnecessary clone

Additional comments not posted (3)
src/pack.rs (2)

12-17: 構造体の定義変更を承認します。

TexturePacker構造体の定義変更は、コードの柔軟性を向上させています。ジェネリック型パラメータPを削除し、Box<dyn TexturePlacer>を使用することで、実行時に異なるTexturePlacer実装を使用できるようになりました。

ただし、動的ディスパッチを使用することで、わずかなパフォーマンスの低下が生じる可能性があります。しかし、この柔軟性の向上はそのトレードオフに値すると考えられます。


20-20: 実装ブロックの更新を承認します。

TexturePacker<E>implブロックからジェネリック型パラメータPを削除したことは、構造体の定義変更と一致しており、適切です。この変更により、実装がよりシンプルになり、TexturePlacerの具体的な型を指定する必要がなくなりました。

examples/test_pack.rs (1)

Line range hint 1-104: レビューの総括

このファイルは、アトラスパッカーの機能を効果的にデモンストレーションしています。主な変更点であるTexturePlacerのボックス化は、将来的な拡張性を考慮すると適切です。ただし、現在の使用状況に応じて最適化の余地があります。

全体として、パフォーマンス、エラーハンドリング、ロギング、設定管理に関するいくつかの改善提案を行いました。これらの改善を実装することで、コードの品質と保守性が向上すると考えられます。

このプルリクエストは、目的を達成し、将来の拡張に備えた良い基盤を提供しています。提案した改善点を考慮しつつ、マージを進めることをお勧めします。

impl<P: TexturePlacer, E: AtlasExporter> TexturePacker<P, E> {
pub fn new(placer: P, exporter: E) -> Self {
impl<E: AtlasExporter> TexturePacker<E> {
pub fn new(placer: Box<dyn TexturePlacer>, exporter: E) -> Self {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

newメソッドの変更を承認します。最適化の提案があります。

newメソッドの引数をBox<dyn TexturePlacer>に変更したことは、構造体の定義変更と一致しており、適切です。この変更により、異なるTexturePlacer実装を使用してTexturePackerをより柔軟にインスタンス化できるようになりました。

ただし、Box<dyn TexturePlacer>の使用は、不必要なヒープアロケーションを引き起こす可能性があります。パフォーマンスが重要な場合は、Boxの代わりに&dyn TexturePlacerを使用することを検討してください。これにより、ヒープアロケーションを避けつつ、同様の柔軟性を維持できます。

最適化の提案:

-pub fn new(placer: Box<dyn TexturePlacer>, exporter: E) -> Self {
+pub fn new(placer: &dyn TexturePlacer, exporter: E) -> Self {
     TexturePacker {
         textures: HashMap::new(),
         current_atlas: Vec::new(),
         atlases: HashMap::new(),
-        placer,
+        placer: Box::new(placer.clone()),
         exporter,
     }
 }

この変更により、newメソッドの呼び出し元でヒープアロケーションを制御できるようになります。ただし、この最適化を行う前に、TexturePlacerトレイトにCloneを実装する必要があります。

Committable suggestion was skipped due to low confidence.

@@ -56,7 +57,7 @@ fn main() {
height: 4096,
padding: 0,
};
let placer = GuillotineTexturePlacer::new(config.clone());
let placer: Box<dyn TexturePlacer> = Box::new(GuillotineTexturePlacer::new(config.clone()));
Copy link

@coderabbitai coderabbitai bot Sep 22, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

変更は適切ですが、最適化の余地があります。

この変更はTexturePlacerトレイトを実装する異なるアルゴリズムを比較するという目的に合致しています。しかし、このサンプルコードではGuillotineTexturePlacerのみを使用しているため、現時点でのボックス化は不要かもしれません。

以下の点を検討してください:

  1. 現在のサンプルコードで複数のTexturePlacer実装を切り替える必要がない場合、ボックス化を避けて直接GuillotineTexturePlacerを使用することで、わずかなパフォーマンス向上が見込めます。

  2. 将来的に複数の実装を比較するためのコードを追加する予定がある場合は、現在の実装を維持することで、その準備が整います。

どちらの方針を取るかは、このサンプルコードの目的と今後の拡張計画に依存します。

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

将来的にGuillotineTexturePlacer 以外にも、TexturePlacerトレイトを実装する複数の異なるアルゴリズムを実装し、かつオプションから指定できるようにするため、TexturePlacerトレイトをボックス化するように修正を行いました。

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@yud0uhu ご説明ありがとうございます。将来的に複数のアルゴリズムを実装し、オプションから選択できるようにするためにTexturePlacerをボックス化されたこと、理解しました。

( ・_・)つ✎


Learnings added
Learnt from: yud0uhu
PR: MIERUNE/atlas-packer#5
File: examples/test_pack.rs:60-60
Timestamp: 2024-09-22T21:45:14.939Z
Learning: 将来的に、`TexturePlacer`トレイトを実装する複数のアルゴリズムを追加し、オプションから指定できるようにする予定がある。そのため、`TexturePlacer`をボックス化している。

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

Comment on lines +23 to +37
mod algorithms {
pub struct GuillotineTexturePlacer;

impl GuillotineTexturePlacer {
pub fn new() -> Self {
GuillotineTexturePlacer
}

pub fn execute(&self) {
println!("Using GuillotineTexturePlacer algorithm.");
}
}

// Add more algorithms here
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

GuillotineTexturePlacerの名前の衝突に注意

Line 23で定義されているmod algorithms内のGuillotineTexturePlacerは、外部クレートatlas_packer::place::GuillotineTexturePlacerと同名です。これにより、名前の衝突が発生し、意図しない動作を引き起こす可能性があります。

対策として、独自のGuillotineTexturePlacerの名前を変更するか、名前空間を明示的に指定して区別することをお勧めします。

&polygon.texture_uri,
texture_size,
&polygon.uv_coords,
polygon.downsample_factor.clone(),
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

不要なcloneの使用を避ける

Line 269でpolygon.downsample_factor.clone()を使用していますが、所有権を譲渡する必要がない場合は参照を渡すことでクローンを避けられます。

適用するための差分コード:

-                polygon.downsample_factor.clone(),
+                &polygon.downsample_factor,
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
polygon.downsample_factor.clone(),
&polygon.downsample_factor,

Comment on lines +273 to +274
.lock()
.unwrap()
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unwrap()の使用によるパニックの可能性

Line 274でunwrap()を使用してミューテックスをロックしていますが、ロックに失敗した場合にパニックを引き起こす可能性があります。エラーハンドリングを追加して、ロックに失敗した場合の対処を行うことをお勧めします。

適用するための差分コード:

-            .lock()
-            .unwrap()
+            .lock()
+            .expect("ミューテックスのロックに失敗しました");
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
.lock()
.unwrap()
.lock()
.expect("ミューテックスのロックに失敗しました");


// initialize texture packer
let config = TexturePlacerConfig::new(500, 500, 1);
let placer: Box<dyn TexturePlacer> = Box::new(GuillotineTexturePlacer::new(config.clone()));
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

不要なcloneの使用を避ける

Line 251でconfig.clone()を使用していますが、configを参照渡しすることで不要なクローンを避けられます。これにより、メモリ使用量を削減し、パフォーマンスを向上させることができます。

適用するための差分コード:

-    let placer: Box<dyn TexturePlacer> = Box::new(GuillotineTexturePlacer::new(config.clone()));
+    let placer: Box<dyn TexturePlacer> = Box::new(GuillotineTexturePlacer::new(&config));
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
let placer: Box<dyn TexturePlacer> = Box::new(GuillotineTexturePlacer::new(config.clone()));
let placer: Box<dyn TexturePlacer> = Box::new(GuillotineTexturePlacer::new(&config));

)
.get_matches();

let algorithm = matches.get_one::<String>("ALGORITHM").unwrap();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unwrap()の使用によるパニックの可能性

Line 236でunwrap()を使用していますが、CLI引数が提供されなかった場合にプログラムがパニックを起こす可能性があります。より安全なエラーハンドリングのために、expect()でエラーメッセージを追加するか、match文でエラーを処理してください。

適用するための差分コード:

-        let algorithm = matches.get_one::<String>("ALGORITHM").unwrap();
+        let algorithm = matches.get_one::<String>("ALGORITHM").expect("エラー: アルゴリズムが指定されていません");
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
let algorithm = matches.get_one::<String>("ALGORITHM").unwrap();
let algorithm = matches.get_one::<String>("ALGORITHM").expect("エラー: アルゴリズムが指定されていません");

Comment on lines +16 to +21
placer: Box<dyn TexturePlacer>,
exporter: E,
}

impl<P: TexturePlacer, E: AtlasExporter> TexturePacker<P, E> {
pub fn new(placer: P, exporter: E) -> Self {
impl<E: AtlasExporter> TexturePacker<E> {
pub fn new(placer: Box<dyn TexturePlacer>, exporter: E) -> Self {
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

将来的にGuillotineTexturePlacer 以外にも、TexturePlacerトレイトを実装する複数の異なるアルゴリズムを実装し、かつオプションから指定できるようにするため、TexturePacker の引数に渡すTexturePlacerトレイトをボックス化するように修正を行っています。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants