レイトレーサはほぼ完成。実行速度は一気に落ちて300ms@Releaseともはやどこがリアルタイムだか分からない結果に。オブジェクト数が少ないと100msを切れるのだが、屈折・透過・鏡面反射をするオブジェクトが複数あれば計算量は指数的に増えるわけで…。とはいえそろそろフォトンマッピングが見えてきた、かな?
今日からはメタセコイアデータ(
MQOフォーマット)を読み込んでレイトレーシングで描画するビューアの作成に取り掛かっている。さて、メタセコのデータを読むにあたって、テキストファイルを解釈しなければならない。そんな時にstd::stringクラスを任意のデリミタ(分割子)で分割できると便利なので、早速作ってみた。
こちらのサイトが非常に参考になった。
05 | typedef std::string String; |
06 | typedef std::vector<String> StringList; |
15 | StringList *SpritString( |
21 | String::size_type start = 0; |
24 | String::size_type end = src.find(delim, start); |
27 | if (end != String::npos){ |
28 | dest->push_back(src.substr(start, end - start)); |
33 | dest->push_back(src.substr(start, src.length() - start)); |
37 | start = end + delim.length(); |
48 | String src( "hoge piyo fuga" ); |
51 | SpritString(&out, src, delim); |
54 | for (String::size_type i=0; i<out.size(); ++i){ |
55 | cout << out[i] << endl; |
参考先のサイトでは関数内部で作成したリストオブジェクトをそのまま返していたので、軽くする目的でポインタ経由での受け渡しにしてみた。そもそも軽くしたいならstd::stringなんか使うなって話だが…。便利なんだもん。
デリミタ自体もベクタオブジェクトに突っ込んで、複数のデリミタに対応するとかいろいろ出来そう。
MQOローダ自体は以前も作ったのだが、設計が気に食わなかったので最初から作り直している。その際に『
ゲームプログラマになる前に覚えておきたい技術(通称:
セガ本)』の「XMLモドキを読む」という項が大変参考になった。MQOファイル自体はXML形式ではないので若干の改造が必要になるが、基本となる考え方はセガ本からまるまるパクッている。明日には完成させたい。
0 件のコメント:
コメントを投稿