レイトレ作成開始

前回書いたビットマップ出力をリライトしつつレンダラの一番外側の枠を作った。
ピクセルのリストにmap関数でray_shooting関数を適用するとRGBAのリストになるという寸法。
処理の本体たるrenderer:rayshooting/1はただのスタブで常にRGBA(0,0,0,0)を返す。

-module(dib32).
-export([write_file/4]).

% RAWデータをファイルに出力する
write_file(F, W, H, RAW)->
  {ok, IO}=file:open(F, [write]),
  io:put_chars(IO, [
    [create_header(W, H), RAW]
  ]),
  file:close(IO).

% ビットマップヘッダ
create_header(W, H)->
  [create_BITMAPFILEHEADER(W, H), create_BITMAPINFOHEADER(W, H)].

% BITMAPFILEHEADER
create_BITMAPFILEHEADER(W, H)->
  ["B", "M", toDWORD(14+40+W*H*4), [0, 0], [0, 0], toDWORD(54)].

% BITMAPINFOHEADER
% 一箇所修正 4 -> 32
create_BITMAPINFOHEADER(W, H)->
  [toDWORD(40), toDWORD(W), toDWORD(H), toWORD(1), toWORD(32), toDWORD(0), toDWORD(W*H*4),
   toDWORD(0), toDWORD(0), toDWORD(0), toDWORD(0)]. 

% DWORD
toDWORD(N)->
  toByte(4, N, []).

% WORD
toWORD(N)->
  toByte(2, N, []).

% 整数を指定バイト数にばらす
toByte(0, _, L)->
  lists:reverse(L);
toByte(N, V, L)->
  toByte(N-1, V div 256, [V rem 256|L]).
-module(renderer).
-export([rendering/3]).
-import(dib32).

% 指定サイズでレンダリングして保存する
rendering(F, W, H)->
  dib32:write_file(F, W, H, lists:map(fun(XY) -> ray_shooting(XY) end, pixel_samplering(W, H))).

% 指定されたピクセルにレイを飛ばしRGB値を得る(スタブ)
ray_shooting(XY)->
  [0,0,0,0].

% 幅と高さを指定してピクセル座標の配列を取得する
pixel_samplering(W, H)->
  [{X, Y}||X<-generate_list(W), Y<-generate_list(H)].

% 0からN-1のリストを作る
generate_list(N)->
  generate_list(N-1, []).
generate_list(0, L)->
  [0|L];
generate_list(N, L)->
  generate_list(N-1, [N|L]).
116> renderer:rendering("tmp.bmp", 400, 300).
ok

ここから画面出力を得るまでは長い道のりになりそうだと思ったらいいものを発見。
http://d.hatena.ne.jp/sumim/20070922/p1
100行くらいのrubyのレイトレース。
幸いrubyは読めるのでまずはこれを移植して動くものを作ろう。
で、並列 -> 分散 の嬉しさを味わえたら拡張していけばいいじゃない。