Selectable Paintings v1.2.1公開です

v1.2.0を公開して1週間が経ちました。
今までバグ報告が無いので安定しているようです、うーん結構ほっこりしましたw

1週間でのダウンロード数は243でした。
ハロゲンライトに比べればかなり少ないけれど良い感じかなー。
 
今日は時間が余ったのでレンダリング関係に新しい機能を追加してみました。

新しい機能は「描画モード」。。
Minecraft MOD - SelectablePaintings 1.2.1 - 描画モード
左から、αCH無視、αCH有効、加算、乗算、スクリーン、反転です。
よくペイントソフト等に付いているアレですね。

あとはテクスチャの解析をMODZIPとリソースパックの両方から行うようにしました。
微妙に使いにくかった部分が若干使いやすくなったんじゃないかなー

v1.2.0 β1できましたー )゚0゚(

少し前から取りかかっていたSelectable Paintings v1.2.0ですが・・・
なんとかβ版を公開できそうな感じに仕上がりました。
 
今日は主にテクスチャの解析周りの最適化をしました。
少し前の記事ではx32テクスチャ20個の解析に1330ms前後かかっていましたが、今は同じ条件でなら173msで解析が完了します(`・ω・)b
私がいつも使っていたテクスチャ、x32とx64が混合テクスチャ159個の解析は1036msでした。

以前の状態なら遅くてイライラだろうけれど、今の状態なら全然問題ナシだねヽ(´ー`)ノ
 
それじゃ、β1として配布しているSelectable Paintingsの新機能の紹介をサクッと動画でどうぞ。
[jwplayer mediaid="2805" width="640" height="362"]

 
新しいSelectable Paintingsの変更点と仕様の説明は以下の通り。
 ・テクスチャの仕様を変更
  「1テクスチャ = 1絵画」になったので、大きなテキスチャにぎゅうぎゅう詰めになったり、絵画を追加する毎にテクスチャを編集する必要がなくなった。
  デメリットは「デメリット」を参照。

 ・グルーピング機能を追加
  沢山の絵画を使うと探すのが大変になるのでグループによって管理できるようにしました。
  グループ数は絵画と同じで好きなだけ追加できます。

 ・ソート機能を追加
  テクスチャの横、縦、名前を元に昇順/降順ソート(並び替え)する事ができるようになりました。
 
デメリット
 ・リソースパックによるテクスチャ変更が少し複雑化。
  今の段階ではMinecraftの全リソース(MinecraftJAR、MODZIP、リソースパックを全て含んだもの)から一覧を獲得する方法がわからなかったので、Selectable Paintings専用のTexture LoaderのZIP内にテクスチャを入れてそこから解析します。

  リソースパックでテクスチャを切り替える例:
   Texture LoaderのZIP内「/assets/kerberos/textures/paintings/[16]test.png」を追加した場合、リソースパック内にも同じように追加する。
   テクスチャ解像度、テクスチャサイズ、テクスチャ名、テクスチャグループ等全て同じにすること。

 ・テクスチャが多くなると起動時間が若干延びる。
  これはテクスチャ1ファイル毎にテクスチャを解析するのでテクスチャの量に比例します。
  マシンスペックが高いと解析は早く終わります。
 
ダウンロードはフォーラムからどうぞ。

進行状況

次期Selectable Paintingsの完成の目途がたってきました(`・ω・)b
 
メインのGUIは基礎部分は今のバージョンと同じ。
Minecraft MOD - SelectablePaintings 1.2.0 - 絵画の名前を表示
変更点は、
 ・左上に、絵画を選択したときに絵画のテクスチャサイズと名前を表示
 ・上中央に、今表示しているグループ名を表示
 ・グループ選択とソートタイプの選択ボタンを設置(SSにはまだありません)
 
グループ選択はGUIの移動無しで選択可能に!
Minecraft MOD - SelectablePaintings 1.2.0 - グループ選択
グループ選択の中央も透過したかったけれど継承の関係で透過できず。。
いろいろ落ち着いたらGuiSlotのコードを丸ごと持ってきてガリゴリと書き換えを検討してみますw
 
「1テクスチャ=1絵画」の仕様上、設置済の絵画をそのままでテクスチャのファイル名を変えたりすると絵画は表示されなくなります。
普通は ぬるぽ でクラッシュするんだけれど、これの救済処置として「テクスチャがない」ってのがわかるようにしました。
Minecraft MOD - SelectablePaintings 1.2.0 - テクスチャ無し
すこしだけテレビとかのカラーテストパターンを真似てみましたw
 

いやー、やっとこさ新機能が一通り動作ができるようになりました。
あとは細かい部分の調整をしてテスト版を公開です。

でもやっぱりv1.2.0の開発を進めちゃう。

少し前に大きなバグの修正ができたのでv1.2.0は用意しないつもりだったけれど・・・
「テクスチャ1ファイル = 絵画1つ」ってテクスチャの仕様はなかなか魅力的。
なによりパレットに縛られないってのが良いよね-
 
なので徐々に開発を進めているのですが色々問題が。
 1.Minecraftのリソース全体(本体JAR、MODリソース、リソースパック)からファイル一覧を獲得できない。
 2.テクスチャサイズの判別方法
 
「1」について。
調べが甘いのかもしれないけれど・・挫折しましたw
リソース全体は無理でも、個別には獲得できる。
 例:MODのZIP内“のみ” または リソースパック“のみ”

なので別のMOD「Texture Loader」(仮称)を新たに作る。
Texture LoaderのZIP内に絵画のテクスチャを突っ込んで一覧を獲得って方法をとることにしました。

別にSelectablePaintingsのZIP内でも良いのだけれど、MODを更新時にテクスチャも移動し直しになるのがメンドウクサイだろうから・・w
 
「2」について。
従来のパレット方式ではパレットのサイズからテクスチャのサイズ(x16だとかx32)を判別できたけれど新仕様では無理。
 例: 画像サイズw=32px h=32pxのテクスチャがあったとすると、これは2通りの絵画サイズが予想できる。
    1.絵画サイズ 2x2 (x16)
    2.絵画サイズ 1x1 (x32)
なので、ファイル名に命名規則を設けて判定することにしました。
今の段階では [テクスチャサイズ][グループ名(省略可)]絵画の名前.png って感じですね-。
 
デメリットは1ファイル毎に画像サイズを解析する必要があるのでMinecraftの起動が若干遅くなる。
パレットの時からの解析はjavaのライブラリにあるImageIO.readで解析してきたけれど、これはメモリに画像データを置いちゃうのでメモリが小さいPC等では重くなったりするんですよね。

なので、バイナリからPNGのチャンク情報を獲得するようにしてみました。
PNGのチャンク解析はPHPで経験済みなので楽勝!と思っていたら・・・
javaライブラリのZIPFileから獲得したInputStreamはポインターセットできねの_| ̄|○
 
仕方なくGoogle先生に聞いてみるとサンプルが公開されていたので早速使ってみる。
コードを見てみるとポインターを移動できない場合はFileInputStreamにキャストして対応しているようだった。

public boolean setInputStream(InputStream stream) {
    if (stream.markSupported()) {
        this.is = stream;
        this.is.mark(this.bufferSize);
 
        return true;
    } else {
        if (stream instanceof FileInputStream) {
            this.fis = (FileInputStream)stream;
            this.fis.mark(this.bufferSize);
 
            return true;
        }
    }
 
    return false;
}

サンプルのお陰でバイナリから引っ張ってこれるようになったので速度比較のテストを実行。
内容はx32テクスチャ20個の解析を10セット。

BinaryRead   ImageIO
 1: 1333ms   1337ms
 2: 1327ms   1340ms
 3: 1334ms   1335ms
 4: 1336ms   1338ms
 5: 1328ms   1340ms
 6: 1328ms   1335ms
 7: 1332ms   1343ms
 8: 1335ms   1337ms
 9: 1332ms   1337ms
10: 1334ms   1341ms

あまり差は無いけれど若干バイナリの方が速いかな-。
環境によっては大きく差が出るだろうなあー。

設定でどちらを使うか選べるようにすればいいかもしれない。
 
で、今の状況は・・絵画を選択して設置できるまでにはなりました(`・ω・)b
Minecraft MOD - SelectablePaintings 1.2.0 GUIテスト
まだソートとかの機能は作ってないのでまだまだ掛かりそう。

v1.2.0は必要ないかも。

今日メールを見てみると・・6world鯖のマスターからでした。

メール内容は「Minecraft v1.6.2にアップデートしたから遊びに来てね!」と「バグ見つけた!なおしてくれーーー!」でした。
バグはSelectable Paintingsの報告で、内容は
 ・メッセージがおかしい
 ・当たり判定ON/OFFのアイコンの色が違う
 ・明るさ調整に0がある?
でした。

いやほんと海外の方はバグとかを積極的に探してくれるしコードのアドバイスや意見をガンガンくれるのでありがたい。
 
アイコンと明るさ調整のスライダーがおかしいのは直ぐに修正できたけれど、「メッセージがおかしい」というのがわからなかったので連絡してみると・・・
マルチプレイ環境で何かしらのメッセージがでるアクションをすると「kerberos.SelectablePaintings....」と表示されるよう。

あれ・・・1.5.xの時は大丈夫だったハズなのにー。/(x_x)\
どうやらマルチプレイ環境だとLanguageRegistry.addStringLocalizationで追加したものはちゃんと変換されないみたい。
いろいろ弄くったけれどどうしても直らないので、サーバーからパケットを送りつける荒技でなんとかしました・・w
 
で、v1.6.xからある問題「絵画が埋まっても外れない」関連の方。
Entity.boundingBoxの値が狂う原因は判らなかったけれど、判定をチェックするときだけEntity.boundingBox以外から情報を持ってくれば良いんじゃね?って事で・・・・
AxisAlignedBBの計算時にEntity.boundingBoxと自分のEntity内の2カ所に保存するようにしました。
Minecraft MOD - SelectablePaintings 1.1.13
それでも、Entity.boundingBoxは狂うのでEntity.boundingBoxを使用する部分の前に、自Entity内のAxisAlignedBBをEntity.boundingBoxへ上書きするようにしました。

これがよかったようで、絵画が埋まったら外れるようになってワールドに入り直したときに勝手に外れる事もなくなりました(`・ω・)b
 
大きなバグがなくなったので、この前からチマチマやっていたv1.2.0要らなくなっちゃったww
けれど成果を無駄にはできないので、既に完成していた「細分化」と「多言語化」を取り入れました。

テクスチャの仕様変更は・・・Minecraftリソース全体(Minecraft JAR、MODのZIP、リソースパック)のファイル一覧を獲得する方法がイマイチわからないので難航中。
MODのZIPとリソースパック“個別”にならいけるんですけどねー・・・
 
v1.1.13のダウンロードはフォーラムからどうぞ。