7月 25

おはようございます、Selphyです。
前回のエントリーでは、Hello World を説明しました。

今回は、前回のサンプルを少し改造して、 構造体 を扱ってみます。
RS内で使用している型やメソッドなどについては、RenderScriptのReferenceに記載されているので、そちらをご覧ください。

ファイル構成

プロジェクトは、前回のものを使うので、特に変更はありません。

コード

改造したファイルのみ載せます。

  • HelloWorldScript.java
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
        protected HelloWorldScript(RenderScriptGL rs, final Context c, Resources res) {
            script = new ScriptC_HelloWorldScript(rs, res, R.raw.helloworldscript);
           
            // -------------- 構造体の初期化 ------------------
            int length = COLORS.length;
            texts = new ScriptField_RS_Text(rs, length, Allocation.USAGE_SCRIPT);
            for (int i=0; i<length; i++) {
                ScriptField_RS_Text.Item item = new ScriptField_RS_Text.Item();
                item.text = Allocation.createFromString(rs, "HelloWorld", Allocation.USAGE_SCRIPT);
                ColorRGB color = COLORS[i];
                item.red = color.red;
                item.green = color.green;
                item.blue = color.blue;
               
                // 容器(.rsで定義した*gTexts)にアイテムを格納する感覚です。
                texts.set(item, i, true);
            }
            script.bind_gTexts(texts);
           
            font = Font.create(rs, res, "fantasy", Font.Style.NORMAL, 20);
            script.set_gFont(font);
           
            rs.bindRootScript(script);
        }

    ScriptField_RS_Text というクラスがあります。
    これがHelloWorldScript.rsで定義した構造体で、このクラスは自動生成されます。
    ScriptField_RS_Textのインスタンスに、 ScriptField_RS_Text.Item というサブクラスのインスタンスをセットすることにより、HelloWorldScript.rsファイルでデータを扱うことができるようになります。

  • HelloWorldScript.rs
  • 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
    32
    33

    typedef struct RS_Text {
        rs_allocation text;
        float red;
        float green;
        float blue;
    } RS_Text_t;
    RS_Text_t *gTexts;



    int32_t root() {
        rsgClearColor(1.0f, 1.0f, 1.0f, 1.0f);
       
        int32_t left = 0;
        int32_t right = 0;
        int32_t top = 0;
        int32_t bottom = 0;
       
        int32_t size = rsAllocationGetDimX(rsGetAllocation(gTexts));
        for (int32_t i=0; i<size; i++) {
            rsgFontColor(gTexts[i].red, gTexts[i].green, gTexts[i].blue, 1.0f);
            rsgBindFont(gFont);
            rsgMeasureText(gTexts[i].text, &left, &right, &top, &bottom);
           
            // 5 * i で文字列の表示位置を少しだけずらしています。
            int32_t x = gTouch.x - (right - left) * 0.5f + 5 * i;
            int32_t y = gTouch.y - (bottom - top) * 0.5f + 5 * i;
            rsgDrawText(gTexts[i].text, x, y);
        }
       
        return 0;
    }

    8行目に、 *gTexts; とあります。
    この場合、Javaからデータを渡すときには、他の変数と違い
    script.bind_gText(ScriptField_RS_Text) というメソッドを使います。
    21行目のfor文では、構造体のデータに保持されているテキストデータとカラーデータを使って描画しています。

RSで自動生成されるもの

今回新たに出てきたもののみを記載します。

  • ScriptField_xxx.java
  • .rsファイルでxxxという名前の構造体を定義すると自動生成されます。

今回のサンプルは Google Code で公開しています。
次回は、テクスチャーを使ったサンプルを考えてます。

このエントリーの内容について
クリエイティブ・コモンズ・ライセンス
RSHelloWorld by Selphy, Kiroru Inc. is licensed under a Creative Commons 表示 – 非営利 – 継承 3.0 非移植 License.



Posted by selphy

Comments are closed.

preload preload preload