過去データ一覧

(no title)

_ ! [プログラミング] リフレクションlib

どうやらさらにバグがある模様。ツリー構造のモデルでたまにデシリアライズに失敗…

_ ! [プログラミング] 描画

ツリーの問題が解決しないけど、単に表示部分をテストしてみた。

_ 色々と苦労したけど、ワイヤー上でVB/IBの状態確認…


スキンメッシュ行列

リフレクションlibにバグが潜んでいた

抽象クラスはNG. templateのインスタンス化後、メンバ取得のために抽象クラスのインスタンス作ろうとするのでNG
ユーザーのオブジェクト型をさらに派生したクラスでのエラー

どうやら、class Aを継承したclass B, class Cが居て、それぞれの初期化と、A自身の初期化で、おかしな状況になっていた。こちらは修正済み。

しかし、最初の項目はシステム上どうしても無理だ…。
抽象クラスのメンバのシリアライズは派生先で再定義してもらうしかないのか…。システム的に破綻っぽい orz

スキンメッシュ

とある場所で、ボーンの部分で、ローカルのワールドの逆行列という記述をみた。
さっぱりなので、色々と調べてみた結果このような表記はXSIの部分で使われているようだ。この行列Inverted_matBasePoseとかOffset行列とかいろいろな呼び方をされている模様。

モデルが初期ポーズをとっている状態でボーン空間をきちんと合わせるのに必要な行列ということらしい。

各ノードのワールドマトリックスを作るには、


ここで逆変換を作用させて、ボーンのローカル空間へ. 骨のポーズ状態が原点としているらしい…

“日々精進時々堕落”というWebが参考になりました。
各状態が算出された後の実装方法は、DirectXのSkinnedMeshサンプルで何とかなるんですが、それに必要なデータの情報ってなかなかないですよね。

 


(no title)

[プログラミング] スキンメッシュ注意点

スキニングメッシュを読み込むときには、

  • D3DXMESHCONTAINER
  • D3DXFRAME
  • ID3DXAllocateHierarchy

らを派生し、ロード&生成コードを自前でかかなくてはいけない。

ここで、派生の決まり事である、デストラクタはvirtualを付けよ。
という点を無意識のうちに書いていて、ミスを犯した。

ルートとなるD3DXLoadMeshHierarchyFromXでの結果格納のpFrameで、
ウォッチで値を見てみると数バイトずれて結果が表示されていた。
そこで疑いを持った。

  • 呼び出し規約でも間違えた?
  • virtualが悪い?

のどちらかがまず怪しい感じがしたので見てみた結果比較的短時間でわかった。

あと気になったのは、ボーンのオフセット行列。
メッシュコンテナに入っていて描画時はそこまで違和感を感じないのだが、
なぜボーン(Frame)の個々の要素として持たないんだろうと。

モデラーから出力されたデータを想定すると、各ボーン毎にオフセット行列があっても良い気がする。


スレッドプログラミング

Java互換スレッド操作ができるライブラリ作成中。

あちらこちらでバグにはまり、時間だけ浪費している感じですがようやく動くようになってきました。

待ち行列とsynchronizedクラスのペアで操作
この部分で、1日ほぼ費やしました。

[code lang=”cpp”]synchronized lock( waitingQueue->getCriticalSection() );
{ // データがないので待つ
waitingQueue->wait();
}[/code]

という操作している部分で、2重ロックしていたという…。

結論、待ち行列管理する部分でのwait時にはロック保持しないことに。

そして、動作チェックということで、マルチスレッドのデザインパターンサンプルを作成してみたり。


リモートデバッグ

DirectXのプログラムを作っているわけですが、開発機が既にVistaのため、デバイスロストを発生させることが出来ないので、WindowsXPのマシンを用意してリモートデバッグを試みてみたのですが、なにやらうまくいかず…。実行体を全く同じパスにおいて実行してみるも、拒否されたとか言われてしまう。

WinXP SP2での変更のため、MSDNヘルプの通りにやっても動かないという話もあるし。

とりあえず試したのは、

ファイアウォールの無効化D
COMのリモートによる起動を許可

あと、XPHOMEではローカルセキュリティポリシーが存在しないため、そもそもリモートデバッグのクライアントを入れることが不可能ぽいです

 

DirectX環境依存

SetRenderStateのカリング指定で、無効な値を入れてしまったときの挙動が環境によって異なっていた。GeForce系は無事に動いていたので発見が遅れました。

ちゃんと設定しないとねーということで。

他にも、デバイスロスト時のリソース復帰について環境依存が。
D3DPOOL_MANAGEDであってもテクスチャが正常に復帰されないバグに見舞われました。

環境は 945GMのチップセット統合。他には915GMでも起こると推測されます。

結局のところ、Managedは当てには出来ないのかもということになり、自前でリストアコードを書いた方がきっと無難だろうなと思います。

 


d3dx_*.dll 非依存

ある人に聞いてみたらやはり可能とのこと。

事前コンパイル済みのシェーダーを使うことで何とかなりました。この場合の問題点は、名前ベースでシェーダー定数にアクセスできなくなること。
やるとすれば、VertexShaderConstantFなどを使い、レジスタ番号指定してデータセットになります。
シェーダーのバイトコードを解析して、定数レジスタと名前などマッピング取れるかなと思いましたが厳しいかも。ゆるくやるには、d3dx.dllは切れない感じですね。

考えてみた方法1

事前コンパイルしたバイトコード+ConstantTableの情報を、オリジナル形式でファイルに書き出したらどうだろう。
ConstantTableから名前→レジスタ番号が取れれば、それも事前にファイルに記録しておくことで何とかなるかも。

 


CDDirectPrint

プリンタをVistaでも正常に使いたい!

うちで使っているプリンタは、PM-930C。メーカーの情報によるとVistaでの動作は、標準ドライバで動作すると書いてあります。自分の環境はVistaはVistaでも x64版・・・。大丈夫かなぁとおもって試してみたところ、文章などのA4印刷は無事にできたことを確認できました。

しかし、CD/DVDのラベル印刷はどうもできない模様。

CD DirectPrintのソフトも手動でインストールをしてみたのですが、いざ印刷してみると、A4と思っているらしく位置がずれる…。どうがんばってもダメでした。

アップデートしようにも、exeの実行ではじかれるし。それでも、32bit VISTAならば動くことがわかりました。OS標準のドライバではなく、XPのドライバを使用して、CDDirectPrintをインストールすれば動くようです。x64で動かす方法は見つかりませんけど…。

 


久々に template C++

変数が配列かのテスト

templateと関数のオーバーロードなどを駆使して作ってみた。一応うまく動いているものの何か気になる。まずい点とか誰か指摘してくれないかなぁ…

使うときには、 int array[ 10 ];なるものを、 testArray( array )とやって、trueが返ってくれば 配列である。テンプレート使っているものの、関数呼び出しも使っているので、inline指定しているといってもコンパイル時に実行コードが決定されると言えないかもしれない。

最適化がうまくかかってくれれば、コンパイル時にチェック完了で余計なコード消えそうな気もするが…


ジェネリックプログラミングの練習2

ジェネリックプログラミング

今日は以前から気になった部分をやってみました。テンプレートで型1から型2への変換が可能かどうかをチェックするという代物です。これにより変換が可能だったら〜というプログラミングが可能になります。

個人的にはこれから多用しそうな予感。

[code lang=”cpp”]
template< class T1, class T2>
struct can_convert {
static yes_type check(T2);
static no_type check(…);
static T1 makeTo();
enum {
  value = (sizeof(check(makeTo())) == sizeof(yes_type))
};
};

class Base { };
class Derived : public Base { };
class Test { };

int main() {
bool canConv1 = can_convert<Derived*, Base*>::value; // true
bool canConv2 = can_convert<Test*, Base*>::value; // false
bool canConv3 = can_convert<int, float>::value; // true (with warning

return 0;
}
[/code]


全文検索

日記の検索がしたくて…。

以前の日記を検索したいことがあって、tDiaryでどうやればいいのか調べてみた。

  1. squeezeプラグインを利用して、動的に作られるページをhtml化しcacheを作成する
  2. その作られたhtmlに対してnamazuを使って検索

という手順になる模様。
とりあえずFC5で動かしているためyumでnamazuとインストールした。

しかし namazu.cgiが見つからない。
どうしてなのか探してみたところ、yum install namazu-cgiでcgiはインストール別だった模様。

設定メモ

インデックス作成時に、サフィックスhtml付けるようにして出力した日記データを対象としたら、検索結果でその日の日記リンクへ飛ばなかった。

理由は、?date=日付.htmlとなっているためで、ここが日付Onlyでないとダメな模様。
よって、squeezeでデータを吐き出すときに.htmlなど付加しない状態にし、インデックスを作成した結果、とりあえずジャンプまで正常動作を確認。

検索結果ページが文字化けする状態が続いていたため、namazurcを書き換えて文字コード設定したところうまく動作するようになった。

Langa ja_JP.SJIS
を記述しました。