漢なら C89 でモダンな BVH を使ったレイトレしたいですね!
やりましょう!
できました.
これで IoT 機器でもレイトレーシングできますね!
なぜ C89 か.
昨今のコンパイラでは C99 は十分対応されているですが, C99 と C++03/C++11 が混在が難しかったり(long long の扱い, 不完全配列 a[], math.h など), IoT みたいな組み込み用途では C++ STL や libc/libm がまともに扱えなかったりとか, docker/runC でプロセスを isolate して実行したいのでプログラムを全部 static link したいような用途では, まだまだ C89 レベルで対応するような機会があるのではないか, と思いました.
C89 テクニック
clang -fsanitize=address -o test -Weverything -g -O0 -ansi -pedantic test.c -lm
clang で -Weverything -ansi -pedantic
あたりにしていろいろエラー/Warning を吐かせてチェックできるようにすると良いです. Address sanitizer 有効にするとなおよし!(-fsanitize=address
)
変数定義が関数(ブロック)の最初でしかできない!
void func() {
float a;
a = 1.0f;
float b = a + 2.0f;
}
とかすると, b
が関数の最初に定義されていないと言われてエラーが出ます.
全部最初に持ってくるとコードが見づらい時はカッコ(ブロック)でくくるといいかも.
void func() {
float a;
a = 1.0f;
{
float b = a + 2.0f;
}
}
long long(int64) の扱い.
C89 では stdint.h
が使えないのですが... まあとりあえず昨今の 64bit OS では long long は 64bit と想定して良いのではないでしょうか.
bool 型が無い!
char or int で代用!
TODO
- 三角形以外にも対応する.
- カスタムメモリアロケータなどを提供して
libc
フリーにする. - Parallella などの MIMD プロセッサで動かす.
- とあるアーキティクチャで動かす.