構造体(struct)を使ったプログラムを書いてて昔はtypedefで構造体を大量に使っていたのを思い出したのだが、なぜ好んでtypedefを使っていたのかは忘れていた。
C言語な頃なのでスタックや二分木など自己参照をするデータ構造のテンプレートをtypedef構造体で作っていたのだった。
typedef struct _Packet {
int value;
_Packet *next;
_Packet *pref;
} packet;
packet *treeRoot;
treeRoot = malloc(sizeof(packet));
二分木ならnext/prevの箇所をleft/rightに変えればわかりやすい表記に。
読み取るデータ個数が判らないときは配列を使わずに、このような形で使っていた。順次アクセスなら配列より早いと思ってもいた。
上の例はメンバ変数一つだが
typedef struct {
point3 center;
float radius;
} sphere;
typedef struct _packet {
sphere container;
_packet *next;
_packet *pref;
} packet;
などと使ったり。
typedef struct {
point3 center;
float radius;
color amb,def,sp,spi;
・・・・・
point3 *GetNormal(point3 Intersection);
color *GetColor(point3 Intersection);
} Sphere;
Sphere *obj = malloc(sizeof(Sphere));
obj->GetNormal = &SphereGetNormal;
obj->GetColor = &SphereGetColor;
obj->center = ...
normal = obj->GetNormal(intersection);
これはC言語でレイトレ書いてCGIを作ってた頃によく使っていた書式例。
クラス「Sphere」と考えればなんとなくC++っぽいでしょう。
レンダリングするのに大量のプリミティブを球や立方体やらを条件文で判断し各法線算出などに分岐していると、条件文分の計算時間の無駄が出る、オブジェクトから直接各関数へ飛べばその無駄が無くなるという事。
なんせ一枚計算(レンダリング)するのに数十分とかかかるからちょっとでも無駄を減らしてた。