月: 2011年2月

  • XSDでCOLLADA

    COLLADAのとっかりはこちら。COLLADA DOMを使った3Dモデルデータの読み込み

    XSDはこちら。CodeSynthesis XSD

    おおまかな流れとしては,

    • XSDをVisual Studioに導入する
    • COLLADA 1.4.1 Schema (includes OpenGL ES Profile)をローカルに保存する。
    • 保存したSchemaをソリューションに追加して,XSDでC++パーサにコンパイルする。
    • コンパイルオプションはこちらにあるように–parts 3等で分割指定が必須。
    • コンパイルしたC++パーサをソリューションに追加する。
    • COLLADAの読み込み部分を作成する。1行で読み込めるが初めから高速化に対応した方がよい。
    • OpenGLの表示処理を作成する。パース結果の利用方法(triangleのみ描画)は下記。
    using namespace COLLADASchema;
    const COLLADA::library_geometries_sequence& g = bhc->m_dae_preview->library_geometries();
    for (COLLADA::library_geometries_const_iterator i = g.begin(); i != g.end(); i++) {
      const library_geometries::geometry_sequence& h = (*i).geometry();
      for (library_geometries::geometry_const_iterator j = h.begin(); j != h.end(); j++) {
        const mesh::triangles_sequence& t = (*j).mesh()->triangles();
        for (mesh::triangles_const_iterator k = t.begin(); k != t.end(); k++) {
          unsigned int numberOfInputs = (*k).input().size();
          unsigned int numberOfTriangles = (*k).p()->size() / numberOfInputs;
          unsigned int offset = 0;
          int texoffset = -255;
          int noroffset = -255;
          for (triangles::input_const_iterator l = (*k).input().begin(); l != (*k).input().end(); l++) {
            if ((*l).semantic() == "VERTEX")
              offset = (*l).offset();
            if ((*l).semantic() == "TEXCOORD")
              texoffset = (*l).offset();
            if ((*l).semantic() == "NORMAL")
              noroffset = (*l).offset();
          }
          for (int ii = 0; ii < numberOfTriangles; ii++) {
            int index = (*k).p()->at(ii * numberOfInputs + offset);
            if (noroffset == -255) {
              glNormal3f(
                (*j).mesh()->source().at(1).float_array()->at(index * 3),
                (*j).mesh()->source().at(1).float_array()->at(index * 3 + 1),
                (*j).mesh()->source().at(1).float_array()->at(index * 3 + 2)
              );
            } else {
              int norindex = (*k).p()->at(ii * numberOfInputs + noroffset);
              glNormal3f(
                (*j).mesh()->source().at(1).float_array()->at(norindex * 3),
                (*j).mesh()->source().at(1).float_array()->at(norindex * 3 + 1),
                (*j).mesh()->source().at(1).float_array()->at(norindex * 3 + 2)
              );
            }
            if (texoffset != -255) {
              int texindex = (*k).p()->at(ii * numberOfInputs + texoffset);
              glTexCoord2f(
                (*j).mesh()->source().at(2).float_array()->at(texindex * 2),
                (*j).mesh()->source().at(2).float_array()->at(texindex * 2 + 1)
              );
            }
            glVertex3f(
              (*j).mesh()->source().at(0).float_array()->at(index * 3),
              (*j).mesh()->source().at(0).float_array()->at(index * 3 + 1),
              (*j).mesh()->source().at(0).float_array()->at(index * 3 + 2)
            );
          }
        }
      }
    }
    

    m_dae_previewは,

    std::auto_ptr<COLLADASchema::COLLADA>   m_dae_preview;
    

    というデータメンバで,COLLADAをロードした結果を保持している。

    COLLADA DOMより少し速度が遅いし,分かりやすさもないので,COLLADAをパースしてみたい人は素直にCOLLADA DOMを使った方がよいかも。

  • MySQLの基本

    開始

    mysql -u ユーザ名 -p

    データベースの一覧

    show databases;

    データベースの選択

    use データベース;

    テーブルの一覧

    show tables;

    あるテーブルの全表示

    select * from テーブル;

    あるテーブルの削除

    drop table テーブル;

    別ファイルのSQL文を流し込む

    mysql --user=ユーザ --database=データベース < ファイル.sql

    レコードを更新する

    update テーブル set hoge='foo' where 条件;

    レコードを削除する

    delete from テーブル where 条件;

    カラムの一覧を表示する

    show columns from テーブル;

    カラムを追加する

    alter table テーブル add カラム名 型;

    カラムを特定カラムの後に追加する

    alter table テーブル add カラム名 型 after 特定カラム;
  • autotools

    aclocal; autoheader; automake -a -c; autoconf
    
  • ODB – C++ Object-Relational Mapping (ORM)

    ODB – C++ Object-Relational Mapping (ORM)

    サーバが落ちたり,再起動したら,世界の時間が巻き戻ってしまうのは困る。メモリ上のオブジェクトをどうハードディスクに保存するか探っていたら,ODBを見つけた。

    gitのリポジトリに追加して,コンパイル。サードパーティのライブラリも全てソースから保持していく。gcc-4.5のpluginを利用しているので,gcc-4.5にアップデート。gcc-4.5-plugin-devパッケージも必要だった。libcutlも必要。libcutlをmake installしているとconfigureがうまくいかず,–with-libcutl=でソースディレクトリを指定してOKだった。

    ODBを作っているCODE SYNTHESISは南アフリカの会社のようだ。XSDなども,COLLADAに対応しているので使ってみようかと思っている。南アフリカの通貨ランドにはたいへんお世話になっているので,親しみを感じる。

    ODB対応のコーディングは下記が肝と分かったが,vectorの中身をname*という感じ(実際にはBHOBJECT*)にしたい。うまくDBに保存できるのだろうか。

    #pragma db value
    class name
    {
    public:
      name (const std::string&, const std::string&);
      ...
    private:
      friend class odb::access;
      name ();
      ...
    };
    
    #pragma db object
    class person
    {
      ...
    private:
      std::vector<name> aliases_;
      ...
    };