2024/03/20(水) [n年前の日記]
#1 [prog] C言語とOpenGLで疑似3D道路の描画実験中。その7
C言語 + OpenGL + glfw を使って実験中。疑似3D道路を描画してみたい。
ステージ(?)の種類を増やしたい。夏、秋、冬、夜の4種類にできないかと考えて作業中。
ステージ(?)の種類を増やしたい。夏、秋、冬、夜の4種類にできないかと考えて作業中。
◎ スプライトシート内の座標を取得したい :
ひとまずスプライトシート内の各画像を4種類分増やしたけれど、テクスチャのUV値テーブルを作るあたりで少し悩んだ。各スプライトの位置とサイズを、画像編集ソフト上で確認して手打ちで数値をメモして、とかやってられない…。
今現在、スプライトシートについては、GIMP上で各画像を配置するようにしてあるので、全レイヤー情報をテキスト出力すれば済むのではないかと気が付いた。GIMP は、各レイヤー毎に、キャンバスサイズと異なるレイヤーサイズを持てるので…。1レイヤーにつき1スプライト分のレイヤーサイズにして…。全レイヤーの位置とサイズを出力してCSV相当にすれば後の作業が楽になるはず。
たしか以前、全レイヤーの位置とサイズをテキスト出力するスクリプトを書いてたような…。
_mieki256 wiki - GIMPの全レイヤー情報をテキストで保存するスクリプト
_GIMPの全レイヤー情報をテキストで保存するPython-Fu(GIMP-Python)スクリプト。
コレを使ってテキスト出力した。GIMP 2.10.34 Portable で作業。以下のようなテキストが得られた。
_dump_temp.txt
LibreOffice Calc で読み込んで、更に必要な情報を追加。CSV で保存。
CSV を読み込んで、座標値を実数(0.0 - 1.0)に変換しつつ、C言語のソース形式にするPythonスクリプトを書いた。Python 3.10.10 64bit で実行。
_csv2c.py
python csv2c.py > tmp.txt として出力。以下のような結果が得られた。
_tmp.txt
ここまでやっておいてアレだけど。コンピュータに自動で画像を詰め込ませてスプライトシートを作らせる手もあったのでは…? そういえば、昔そういうスクリプトを書いたこともあったな…。
_mieki256/texpack
今現在、スプライトシートについては、GIMP上で各画像を配置するようにしてあるので、全レイヤー情報をテキスト出力すれば済むのではないかと気が付いた。GIMP は、各レイヤー毎に、キャンバスサイズと異なるレイヤーサイズを持てるので…。1レイヤーにつき1スプライト分のレイヤーサイズにして…。全レイヤーの位置とサイズを出力してCSV相当にすれば後の作業が楽になるはず。
たしか以前、全レイヤーの位置とサイズをテキスト出力するスクリプトを書いてたような…。
_mieki256 wiki - GIMPの全レイヤー情報をテキストで保存するスクリプト
_GIMPの全レイヤー情報をテキストで保存するPython-Fu(GIMP-Python)スクリプト。
コレを使ってテキスト出力した。GIMP 2.10.34 Portable で作業。以下のようなテキストが得られた。
_dump_temp.txt
tree0_0,0,0,512,512 tree0_1,512,0,512,512 tree0_2,1024,0,512,512 tree0_3,1536,0,512,512 slope0_l,2048,0,512,512 slope0_r,2560,0,512,512 ... deli0,3328,3840,128,256 deli1,3456,3840,128,256 road0,2048,3584,512,512 road1,2560,3584,512,512 road2,1792,3840,256,256
LibreOffice Calc で読み込んで、更に必要な情報を追加。CSV で保存。
CSV を読み込んで、座標値を実数(0.0 - 1.0)に変換しつつ、C言語のソース形式にするPythonスクリプトを書いた。Python 3.10.10 64bit で実行。
_csv2c.py
import sys import csv IMGW = 4096.0 IMGH = 4096.0 def main(): if len(sys.argv) != 2: print("Usage: %s INFILE" % (sys.argv[0])) sys.exit() infile = sys.argv[1] symtbl = [] uvtbl = [] with open(infile) as f: reader = csv.reader(f) for i, row in enumerate(reader): name = row[1] w = int(row[2]) h = int(row[3]) u = float(row[4]) / IMGW v = float(row[5]) / IMGH uw = float(row[6]) / IMGW vh = float(row[7]) / IMGH sname = "SPR_" + name.upper() symtbl.append(sname) uvtbl.append( {"w": w, "h": h, "u": u, "v": v, "uw": uw, "vh": vh, "name": sname} ) msg = """\ // ---------------------------------------- // sprite type typedef enum sprtype { """ print(msg) for i, s in enumerate(symtbl): print(" %s, // %d" % (s, i)) print("} SPRTYPE;\n") msg = """\ // ---------------------------------------- // sprites size and uv table typedef struct sprtbl { float w; float h; float u; float v; float uw; float vh; } SPRTBL; """ print(msg) print("static SPRTBL spr_tbl[%d] = {" % len(uvtbl)) print(" // poly w, poly h, u, v, uw, vh") for i, d in enumerate(uvtbl): print( " {%d, %d, %f, %f, %f, %f}, // %d %s" % (d["w"], d["h"], d["u"], d["v"], d["uw"], d["vh"], i, d["name"]) ) print("};") if __name__ == "__main__": main()
python csv2c.py > tmp.txt として出力。以下のような結果が得られた。
_tmp.txt
// ---------------------------------------- // sprite type typedef enum sprtype { SPR_NONE, // 0 SPR_TREE0_0, // 1 SPR_TREE0_1, // 2 // ... SPR_ROAD1, // 66 SPR_ROAD2, // 67 } SPRTYPE; // ---------------------------------------- // sprites size and uv table typedef struct sprtbl { float w; float h; float u; float v; float uw; float vh; } SPRTBL; static SPRTBL spr_tbl[68] = { // poly w, poly h, u, v, uw, vh {0, 0, 0.000000, 0.000000, 0.000000, 0.000000}, // 0 SPR_NONE {450, 450, 0.000000, 0.000000, 0.125000, 0.125000}, // 1 SPR_TREE0_0 {450, 450, 0.125000, 0.000000, 0.125000, 0.125000}, // 2 SPR_TREE0_1 // ... {256, 256, 0.656250, 0.906250, 0.062500, 0.062500}, // 66 SPR_ROAD1 {256, 256, 0.437500, 0.937500, 0.062500, 0.062500}, // 67 SPR_ROAD2 };
ここまでやっておいてアレだけど。コンピュータに自動で画像を詰め込ませてスプライトシートを作らせる手もあったのでは…? そういえば、昔そういうスクリプトを書いたこともあったな…。
_mieki256/texpack
[ ツッコむ ]
以上です。