仕事が一区切り

MatchSrf_tess SketchOnMesh_tess
K氏、M氏と共同で、CADフレームワーク、NURBSテセレータ、ポリゴンスライサを数ヶ月間で開発するというスケジュール的にかなりタイトなプロジェクトがあったのだが、先日無事離陸できた。
CADフレームワーク部分はかけた工数が少ないため機能的には必要最低限のものであるが、テセレータ、ポリゴンスライサはK,M氏の尽力もあって、短期間ながら高速かつ高品質なものができた。

とくにテセレータは、本当にこの短期間に作成できるのか不安で仕方なかったのだが、杞憂に終わってほっとしている。仕事がらいろいろなテセレータを見てきたが、速度も品質も上位に位置するものになったように思う。まだほとんど最適化をしていないので、今後どこまで速くできるかが楽しみだ。
なお、実装にあたっていろいろな論文をあさったのだが、結局オーソドックスな手法の以下のものが一番役にたった。「分割して統治せよ」という単純な手法のもつ普遍性にはいつもながら驚いてしまう。
F. Kahlesz, A. Balazs and R. Klein.Multiresolution rendering by sewing trimmed NURBS surfaces. Submitted to Solid Modeling 2002.

また、テセレータのうち、実際に私がコーディングを担当したのは2Dのドロネー三角形分割部分のみだが、制約辺対応でかつメッシュに特化した分割アルゴリズムというのが探しても見つからなかったので意外と苦労してしまった。よく行う処理のはずなのにこれだけ資料がないというのも不思議なものである。やっぱりニッチな業界なんだなあ。

それにしても今までのプログラマ生活でももっとも密度の濃い数ヶ月をすごした。冗談抜きで通常の3倍のスピードでコーディングが出来たように思う。労働時間自体はあまり長くなく、かつコーディングもはかどったので毎日心地良い疲労感を味わうことができた。この調子が続いてくれるといいんだけど、まあ絶対スランプがくるんだろうね。

Stiff asks, great programmers answer

Stiff asks, great programmers answer

ある個人のブロガーが、Linus Torvalds、 Bjarne Stroustrupなどの9名のプログラマの達人に、e-mailでいろいろな質問をぶつけてそれを公開した記事。
それぞれ1人ずつの答えではおそらく見出せなかったものが、こうして9人の回答を並べてみると見えてくるのが興味深い。
とりあえず思ったことはみなさんやはりUNIXがお好きなんですね。

隨身碟應用!?

台湾の出版社から以下のメールが来た。
ソフトウェアのお願い

拝啓
 貴社におかれましては益々ご清栄のこととお慶び申し上げます。
 先日は貴社のソフトウェア(Hamama"と"Hamana ver1.48 extra language patch")をご提供いただきまして、誠にありがとうございます。この製品はユーザーが使用しやすいばかりでなく、多彩な機能が備わっているため、多くのユーザーたちがこの製品に興味を持つことと思われます。弊社は2006年11月末に「隨身碟應用について」という本を出版予定ですが、貴社のソフト(オフィシャルサイトのダウンロードから)を本書の中のCAI(コンピューター教育用のマルチメディアディスク)としたいと考えております。多くの台湾の読者がこの機会を通じて、貴社のソフトからより多くのことが学べると信じております。どうか貴社のソフト使用権に同意してくださいますよう、心から願っております。
 貴社から良いご返事を期待しております。何か疑問がございましたら、弊社にご連絡ください。

敬具

間違いのない完璧な日本語だが、でも意味がさっぱりわからない。
単なるソフト収録だとは思うのだが、CAIって言葉がでてきて混乱する。いったいどういうことだろう?

あと、よくみると Hamama って書いてあるな...
こりゃあいい!!!バージョン2になったらHamama2に改名するか。もちろん、ハママ・ツーと読みます。

sb の entry.php の復元

sbというblogシステムを使っているが、たまーにentry.phpという記事一覧を保持するデータファイルらしきものが壊れることがある。
古いバージョンのまま使ってるのが原因のような気がするが、今はアップデートする気力がないので、今回も自分でentry.phpを復元することにした。
もしかしたら同じ現象の人もいるかもしれないので、C++での復元プログラムをさらしてみる。sbのファイルフォーマットは自分で適当に想像したものなので、間違ってたらすみません。
ちなみにboostのfilesystemをはじめて使ってみたが、いいね。Unicodeに対応してない&将来にわたって対応の予定がないってところが痛いけど。
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/convenience.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/algorithm/string.hpp>
#include <map>

using namespace std;
using namespace boost;

int _tmain(int argc, _TCHAR* argv[])
{
    if (argc != 3) {
        cout << "usage: sb_entry_repair src_sb_entries_path dst_sb_entry_file_path\n";
        return -1;
    }

    namespace fs = boost::filesystem;
    fs::path entries_path = fs::path(argv[1], fs::native);

    const string sHeader("ent\t");  // entry header
    map<int, string> entry_map;
    fs::directory_iterator it_end;
    for (fs::directory_iterator it(entries_path); it != it_end; ++it) {
        if (".php" != to_lower_copy(fs::extension(it->leaf()))) {
            continue;
        }
        fs::ifstream ifs(*it, ios::binary);
        if (!ifs.is_open()) {
            continue;
        }

        string sLine;
        getline(ifs, sLine);
        if (sLine.compare(0, sHeader.size(), sHeader) != 0) {
            continue;
        }
        sLine.erase(0, sHeader.size());

        iterator_range<string::iterator> itrFind = find_nth(sLine, "<>", 9);
        if (!itrFind.empty()) {
            int iEntryNum = atoi(sLine.substr(0, sLine.find_first_of('<')).c_str());
            entry_map[iEntryNum] = copy_range<string>(make_iterator_range(sLine.begin(), itrFind.end()));
        }
    }

    ofstream ofs(argv[2], ios::binary);
    if (ofs.is_open() && !entry_map.empty()) {
        ofs << entry_map.rbegin()->first + 1 << endl;
        for (map<int, string>::const_iterator it = entry_map.begin(); it != entry_map.end(); ++it) {
            ofs << it->second << endl;
        }
    }

    return 0;
}

FSAA on CAD

自家製CADフレームワークにFSAAを使えるようにしてみた。
特にアプリケーション側で対応させるコードをかかなくてもGeForceなりRadeonのドライバの設定をいじれば強制的にFSAAをかけることが可能だが、やっぱりアプリ側で制御すればエンドユーザーでも享受しやすいもんね。

FSAA なし
FSAA none

FSAA 4点サンプリング
FSAA 4X

FSAA 16点サンプリング
FSAA 16X

やっぱり綺麗だなー。16点になれると元には戻れないかんじ。

以下は実装にあたってはまった点。
  • FSAA用のフレームバッファ作成のためにwglChoosePixelFormatARB()拡張関数が必要なのだが、この拡張関数のアドレスを取得するにはOpenGLのレンダリングコンテキストが有効でなくてはならない。したがって、フレームバッファ作成のために、ダミーのフレームバッファを作成する必要がある
  • さらにそのダミーのフレームバッファを本当に作成しようとするウインドウ上に作成してしまうと、本当のフレームバッファを作成するときに失敗してしまう。したがってダミーのウインドウを作成して、ダミーのフレームバッファをその上に構築しなければならない

OpenGLの拡張関数を使うのは本当にめんどいな。資料もあまりないし。

1/1