mieki256's diary



2024/03/20(水) [n年前の日記]

#1 [prog] C言語とOpenGLで疑似3D道路の描画実験中。その7

C言語 + OpenGL + glfw を使って実験中。疑似3D道路を描画してみたい。

ステージ(?)の種類を増やしたい。夏、秋、冬、夜の4種類にできないかと考えて作業中。

スプライトシート内の座標を取得したい :

ひとまずスプライトシート内の各画像を4種類分増やしたけれど、テクスチャのUV値テーブルを作るあたりで少し悩んだ。各スプライトの位置とサイズを、画像編集ソフト上で確認して手打ちで数値をメモして、とかやってられない…。

今現在、スプライトシートについては、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

以上です。

過去ログ表示

Prev - 2024/03 - Next
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project