Skip to content

PDF: 看板に PDF を表示し、照準を合わせている間だけページ送りの帯を出す (#20) - #22

Closed
malken21 wants to merge 1 commit into
mainfrom
feature/20-pdf
Closed

malken21 wants to merge 1 commit into
mainfrom
feature/20-pdf

Conversation

@malken21

Copy link
Copy Markdown
Member

Closes #20

できること

  • 看板に PDF (.pdf) を表示します。最初は 1 ページ目です。
  • 看板の絵に照準 (画面中央) を合わせている間だけ、絵の下側にページ送りの帯が出ます。
    左右に戻る・進むボタン、中央に「現在のページ / 総ページ数」。照準を外すと消えます。
  • 帯の見た目は、MarumaSign の画面と同じテーマ (青い枠、ベージュの面、照準が合ったボタンはオレンジの縁、端のページでは灰色) です。
  • ボタンに照準を合わせて使用キー (右クリック) を押すとページが切り替わります。
    照準が絵に合っている間の使用キーはページ送り専用で、ブロックを置いたり看板の編集画面を開いたりしません。
  • 画面 (B キー) から PDF を選んでアップロードでき、プレビューに 1 ページ目とページ数が出ます。

ページの切り替えは自分の画面だけで、同じ URL の看板はすべて同じページになります。

仕組み

  • PDF の読み込み・描画: Apache PDFBox 2.0.37 (Apache 2.0、Java 6 以降で動くので 1.7.10 の Java 8 でも動く)。
    1 つの jar に同梱し、dist の shadeCore でパッケージ名を marumasa.marumasa_sign.lib.{pdfbox,fontbox} に変えます
    (中のフォントや CMap などのファイルと、それを指す文字列も)。Commons Logging は同梱せず、MarumaSign のロガーに書く代わりのクラス (lib.logging) につなぎます。
    ライセンスは他の取り込んだライブラリと同じ marumasa_sign/licenses に入れます。jar は 2.7 MB → 7.3 MB。
  • ページ: 長い辺 1024 ピクセルで、専用のスレッドで 1 枚ずつ描きます。前後のページも先に描いておくので、切り替えはすぐです。
  • 帯: core が Theme.paintPageBar で描いたテクスチャを、照準が合っている看板にだけ、追加の四角形 (SignImage.Batch) として返します。
    各バージョンの描画は、看板のブロックの位置を SignImage.batches に渡すだけです。
    照準の判定は、Platform.crosshair() (目の位置・視線・照準が当たっているブロックまでの距離) と絵の四角形の交差で、
    裏から・壁越し・6 ブロックより遠くでは出ません。
  • クリック: ゲームの使用キーを、先に MarumaSign.useClicked() を呼ぶもの (UseKey) に置き換えます。
    1.14 以降は KeyMapping、1.7.10 - 1.12.2 は KeyBinding の子クラス。キーの割り当てはそのまま引き継ぎます。
    26.3 は入力が SDL になっていて GLFW のコールバックを差し替える方法が使えないため、キーの側で受けています。

動作確認の仕組み

  • tools/verify/test-pdf.pdf (make_test_pdf.py で作成): 1 ページ目はテスト画像と同じ 4 色、2 ページ目はそれを 180 度回したもの。
    図形と標準フォント (埋め込みなし) で描いてあり、PDF の描画とフォントの代替も通ります。
  • matrix.py の媒体に pdf を追加。SelfTest は、進むボタンに照準を合わせて帯が出ること、クリックで 2 ページ目に進むこと、
    照準を外すと帯が消えることを確かめ、verify.py はそれぞれの画面を記録して、2 ページ目の絵が写っているかを判定します。
  • ./gradlew :core:pdfCheck -PpdfArgs="tools/verify/test-pdf.pdf build/pdf": Minecraft なしで、読み込み・照準・クリック・裏から/壁越しで出ないことなどを確かめます。

確認

  • ./gradlew :dist:assemble: 成功。コンパイラーの警告・注意は main と同じ (この変更で増えたものはなし)
  • python tools/check_linkage.py: 112 の組み合わせすべてで問題なし
  • SignPdfCheck (配布用にパッケージ名を変えたクラスを、Java 8 で実行): すべて成功
  • 実機 (tools/verify): 下に追記します

注意

  • 埋め込まれていないフォントを使う PDF を初めて表示するとき、PDFBox はパソコンのフォントをすべて調べます
    (結果はホームフォルダの .pdfbox.cache に保存され、2 回目からは速い)。フォントが約 5900 個ある手元の環境では、初回に約 5 分かかりました。
  • 画面の「ファイルまたは URL (…)」などの文言に PDF を加えたのは英語と日本語だけです (他の言語は従来の文言のまま)。
    プレビューの「PDF、N ページ」は 115 言語すべてに追加しました。

- 読み込みと描画は Apache PDFBox 2.0 (Java 6 以降で動く)。配布する jar に同梱し、他の Mod とぶつからないよう
  dist の shadeCore でパッケージ名を marumasa.marumasa_sign.lib の下に変える (中のファイルと、それを指す文字列も)。
  ログの出力先 (Commons Logging) は同梱せず、MarumaSign のロガーに書く代わりのクラスにつなぐ
- ページは 1 枚ずつ、長い辺 1024 ピクセルで別のスレッドで描き、前後のページを先に描いておく
- 看板の絵に照準が合っている間だけ、絵の下側に帯 (戻る・進むボタンと「現在 / 総ページ数」) を重ねて描く。
  見た目は MarumaSign の画面と同じテーマ。照準が外れると消える。照準は各バージョンの Platform.crosshair で受け取る
- 照準が絵に合っている間の使用キー (右クリック) はページ送りに使い、ゲームには渡さない。
  ゲームの使用キーを、先に MarumaSign.useClicked を呼ぶものに置き換える (1.14 以降は KeyMapping、それより前は KeyBinding)
- 画面: PDF のファイルを選んでアップロードでき、プレビューに 1 ページ目とページ数を出す
- 動作確認: tools/verify に 2 ページの test-pdf.pdf を追加。SelfTest は進むボタンに照準を合わせて帯が出ること、
  クリックで 2 ページ目に進むこと、照準を外すと帯が消えることを確かめ、verify.py は各場面の画面を記録して 2 ページ目の絵を判定する
- :core:pdfCheck で、Minecraft を起動せずに表示とページ送りを確かめられる
malken21 added a commit that referenced this pull request Oct 18, 2026
feature/20-pdf を splat に取り込んだ。衝突は両方の変更を残して解決した。

- SignImage.batches: スプラット用のカメラの位置と、PDF のページ送り用の看板の位置を、両方受け取る形にした
- ImageLoader / MainPage: 内容の判定に PDF を加えた (上限は PdfFile.MAX_SIZE の 64 MB)
- 言語ファイル・README・ファイル選択の拡張子: 両方の項目を残した
- 確認ツール: 確かめるものに PDF を加え、報告書の説明を 5 種類にした
@malken21

Copy link
Copy Markdown
Member Author

#18 (splat ブランチ) に統合しました。以後の確認と取り込みは #18 で行います。

@malken21 malken21 closed this Oct 18, 2026
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.

PDF対応

1 participant