2012年3月2日金曜日

デバッグ表示

息抜き。
streamもいいけどAndroidのアレも結構好きなんだよなぁということで。
本来は第一引数がタグ指定だけど__FUNCTION__を使ってみたかっただけ。

// *.h
#if defined(LOG_ENABLE) && defined(LOG_E_ENABLE)
#define Log_e(fmt, ...) \
  log_fprint(stderr, "E/" ## __FUNCTION__, __FILE__, __LINE__, fmt, ## __VA_ARGS__)
#else
#define Log_e(fmt, ...) (void)0
#endif // defined(LOG_ENABLE) && defined(LOG_E_ENABLE)

// *.cpp
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

static char _buff[512];
static char _filename[256];
static char _ext[5];

void log_fprint(FILE* file, const char* func, const char* filename, int line, const char* format, ...){
  // Windowsの__FILE__はフルパスらしい
  _splitpath_s(filename, NULL, 0, NULL, 0, _filename, sizeof(_filename), _ext, sizeof(_ext));
  va_list args;
  va_start(args, format);
  sprintf_s(_buff, sizeof(_buff), "%s %s%s(%6d): %s", func, _filename, _ext, line, format);
  vfprintf_s(file, _buff, args);
  va_end(args);
}

使い方は下記のような感じ。

  Log_e("hogehoge\n");
  Log_e("hoge %s bar = %d\n", "foo", 10);

コンソールへの出力イメージ。
main関数内の該当行から呼び出しただけなので有り難味が・・・。

ソースはこちら。

2012年3月1日木曜日

COLLADA (4)シーングラフ

<scene>
 <instance_physics_scene>
 <instance_visual_scene>
 <instance_kinematics_scene>
 <extra>

<instance_visual_scene>
 sid(optional)
 name(optional)
 url
 <extra>
 
<library_visual_scenes>
 id(optional)
 name(optional)
 <asset>
 <visual_scenes>
 <extra>
 
<visual_scene>
 id(optional)
 name(optional)
 <asset>
 <node>
 <evaluate_scene>
 <extra>
 
<node>
 id(optinal)
 name(optinal)
 sid(optinal)
 type(optinal)
 layer
 <asset> 
 transformation_elements
  <Lookat>
  <matrix>
  <rotate>
  <scale>
  <skew>
  <translate>
 <instance_camera>
 <instance_controller>
 <instance_geometry>
 <instance_light>
 <instance_node>
 <node>
 <extra>
 
<library_nodes>
 id(optinal)
 name(optinal)
 <asset>
 <node>
 <extra>


モデルを抜き出すのに必要な箇所だけマーク。
<extra>は実質アプリケーション次第なので無視。
<asset>はこれといって重要なケースが今のところ見つからないので無視。
(optinal)も一部を除いて実質無視。
 

シーングラフの辿り方
(1) <scene>→<instance_visual_scene>::url
(2) <visual_scene>
(3) <node>

階層構造
root:<visual_scene>
他は<node>を入れ子とした親子関係


<node>自体は特に問題ないが<instance_node>に注意。
多分1以上存在していれば<library_nodes>が出現するはず。
エイリアスとなるので生成、破棄はNG。


レイヤー構造
<node>::layer
ケース1:"" ... 空(無所属)
ケース2:"hoge" ... 1グループ(hoge所属)
ケース3:"hoge foo" ... 複数グループ(hogeとfoo所属)

モデラなら必須だが。

その他 
<node>::type
デフォルトは空="NODE"
それ以外は"JOINT"
まだ見てないがスキン関連か?

COLLADA (3)テクスチャマッピング

次に取り掛かるのはテクスチャ周り。
<library_effects>
<library_images>
<library_materials>
このあたり。

その前に避けて通れない画像の読み出しがある。
COLLADAのコンセプトとして多種多様な画像を想定しているわけなので
個々で対応していられない。
ここはオープンソースの享受を受けようというわけでOpenCV。
これもいつの間にか色々進化を遂げていて、Win、Linux、Mac、Android!まである。
単体で遊んでも面白そう。
・・・遊びそうになったので我慢してCOLLADAに戻る。

バイナリ配布も行っているようだが、VCに関しては2008(VC9)と2010(VC10)のみ。
当方は2005(VC8)ユーザなのでビルドするしかない。
今時2005なんて使ってる人いるんかと気が引けるが、素敵な情報があった!

ちゃちゃっと環境が整った。

[追記]
collada周りは無視でOpenCVを利用したテクスチャマッピングが正しくできるかのテスト。
モデルを作ろうとしたが、私にとってのBlenderはオーパーツそのものだった。
というわけでメタセコイア→Blender→Colladaのコンボ。
どうせならいい感じのモデルを表示してみたいと物色したら・・・
Paletteというサイトの方のをお借りすることにした。


特に問題なく表示はできているようだ。
OpenCVとOpenGLの相性はかなりいい。
画像ロード~テクスチャバインドまで秒殺できる勢い。

[追記その2]
<library_geometries>から直接辿れる限界がきたようだ。
<library_images>は独立してるからいいとして、
メッシュのプリミティブが参照しているマテリアルを辿るには基本的に
<library_visual_scenes>からでないと無理そう。

<library_visual_scenes>→<node>→<instance_geometry>→<bind_material>
ここから
<library_materials>→<library_effects>

ただ、モデルによっては必ずしも<bind_material>の中身があるわけでもないらしい。
サンプル数が少ないが、上記で辿れない場合は直接
<library_materials>→<library_effects>
か?

また、静的なモデルの最低限の情報は

<library_effects>
<library_images>
<library_materials>
<library_geometries>
<library_visual_scenes>
<scene>

というところか。
作戦の練り直しだな。