render-primitive (マクロ)
パッケージ: CURL.GRAPHICS.RENDERER3D

指定された一連のレンダリング操作を実行します。

説明

render-primitive は、与えられた Renderer3d および暗黙的に作成された Primitive オブジェクト上の一連のメソッド呼び出しを使用して、指定されたプリミティブの型をレンダリングします。Primitive オブジェクトを与えず、代わりに名前を与えると、その名前は、このコード ブロックに範囲が限られる Primitive にバインドされます。

最初は、render-primitivePrimitive へのレンダリング呼び出しにラップしなければならないことはやっかいに思われるかもしれません。しかし、これはバグの主要な原因を取り除きます。別の手段として、標準 OpenGL/DirectX モデルがあります。ここでは明示的にプリミティブを開始し、終了する必要があります。このモデルでは、グラフィック システムが壊れるのを防ぐため、発生する例外はすべて常にキャッチし、また例外が発生した場合でもプリミティブを明示的に終了する必要があります。プログラマはほとんどこのようなことをしません。しかし、Curl では render-primitive を使用すればこれを実現でき、他のどのようなアプリケーションもそのグラフィック環境を壊すことができないことを確信できます。Primitive 呼び出しが render-primitive 内に なければならない のはこのためです。

構文

{render-primitive
        p[:Primitive],
        type=type
        on renderer do
        primitive methods list
    }


または

{render-primitive
        type=type,
        p[:Primitive]
        on renderer do
        primitive methods list
    }


説明:

注意事項

Renderer3d の状態 (テクスチャ パラメータや照明パラメータなど) は render-primitive コード ブロック内では変更できません

render-primitive を使用できる低レベル レンダリング システムを設定する方法はいくつかあります。Renderer3dGraphic を使用するか、 Drawable.create-offscreen を呼び出すか、または単に独自の Window Window.create-window#factory を使用して作成することもできます。『開発者ガイド』の「3D レンダリング」の章も参照してください。

この例では、比較的使用が簡単なので Renderer3dGraphic が使用されています。


例: render-primitive の使用
{import * from CURL.GRAPHICS.RENDERER3D}

{Renderer3dGraphic
    width = 3in, 
    height = 2.6in,
    repaint-handler = 
        {proc {graphic:Renderer3dGraphic,
               renderer:Renderer3d, area:#RectangleSet}:void 
            let drawable:Drawable = {non-null
                                        graphic.drawable} 
            
            let vertices:{Array-of Distance2d} = 
                {{Array-of Distance2d}
                    {Distance2d 0.0in, 0.1in},
                    {Distance2d 0.1in, 2.2in},
                    {Distance2d 1.5in, 0.7in},
                    {Distance2d 1.3in, 2.5in},
                    {Distance2d 3.0in, 0.1in},
                    {Distance2d 2.9in, 2.2in}
                }

            let colors:{Array-of Fraction3d} =
                {{Array-of Fraction3d}
                    {Fraction3d 1.0, 0.0, 0.0}, || red
                    {Fraction3d 1.0, 0.0, 0.0},
                    {Fraction3d 0.0, 0.0, 1.0}, || blue
                    {Fraction3d 0.0, 0.0, 1.0}, || blue
                    {Fraction3d 0.0, 1.0, 0.0}, || green
                    {Fraction3d 0.7, 0.0, 1.0}  || purple
                }

            || clear the drawable
            {renderer.clear}
            
            || render a polygon
            {render-primitive
                primitive:Primitive,
                type = "triangle-strip"
                on renderer do

                {for idx:int = 0 below vertices.size do
                    {primitive.color3v colors[idx]}
                    {primitive.vertex2v vertices[idx]}
                }
            }
        }
}