ようこそゲストさん

すらりん日記

メッセージ欄

分類 【プログラミング】 で検索

一覧で表示する

2006/05/20(土) 初めての…

C#じゃなかった、マネージドC++

個人的にはC#も嫌いじゃないんですけど、最高!と思っているのはマネージドC++だったりしてます。昔のコード(C++)使いながらも、新しい.NET Frameworkの機能も使えるって最高じゃないですか。 というわけで、マネージド型やC#はVisualStudio2003からデビューした(つもり)でした。 が! 今最新のVisualStudio2005ではこのあたりものすごく変わっていて、泣きました。 マネージド型で作ろうとするとかなり苦労しました。 今までは、普通にnew出来ていたものが、gcnewを使ったりと。 ネットにある普通のManagedC++のコードがそのまま通らないのもつらいです。 とりあえずファイルを開くダイアログ出すだけでも、
 OpenFileDialog^ dlg = gcnew OpenFileDialog();
 dlg->InitialDirectory = "c:\\";
 System::Windows::Forms::DialogResult result;
 result = dlg->ShowDialog();
こんな感じです。マネージド型には"^"が導入されてます。 なにか気持ち悪いと思うのはオレだけでしょうか?

2006/05/27(土) psd解析続き

レイヤーセット

前回までの状態で最低限の解析を終わらせたわけですが、 レイヤーのグループ化であるレイヤーセットに対応したいなぁと思って 色々作業してました。 しかし、どうもよく分かりませんでした。 グループ作るとなぜかレイヤー自体が増えるし。グループ化して、このレイヤーはどのグループに所属する、というデータが格納されると思うのですが…。 レイヤーの名前を順に列挙すると
 背景
 ・/Layer Set
 セット1−2
 セット1−1
 セット1
 ・/Layer Set
 セット2
 セット2
ちなみに、Photoshopとは順番逆に格納されているようですね… おまけにマージ後の画像含まれていて、単純にプレビューするなら楽そうです。

さて、推測ですが、LayerSetというのが集合のセパレータとなっているのでは無いでしょうか?

この場合だと、1-2,1-1が”セット1”に含まれ、

セット2が”セット2”に含まれると言うことになります。

(強引につじつまを合わせるようにもしていますが)

また、レイヤーセット自体の情報は、大きさゼロのレイヤーとして存在させることで行っているのかも知れません。

 

うーん、内部構造詳しい方、教えてもらえるとうれしいです。

1: slash 『http://www.codeproject.com/KB/graphics/PSDParser.aspx これが参考になるか...』 (2010/04/09 17:19)

2006/09/17(日) C++

デストラクタに泣く日

基底クラスAから派生したクラスBのインスタンスを管理している別クラスManageがいて、

そこでは、Aのポインタで一括管理していました。

しかしなぜかBのデストラクタが呼ばれないという…。
ある意味定番のバグかと思って、Aのデストラクタ宣言を見てみましたが、

『ちゃんとvirtualがついていました』

どうしてだ?と悩みつつデバッガで追いかけていくと、
実は、管理用のポインタにインスタンスをコピーしていなかった!!
というわけで、単純ミスでした。

高度な(?)バグかと思ったのに、単純ミス…。ちょっと凹みました。

2006/09/30(土) MySQLネタ

MySQLメモ

ユーザーとパスワード指定して、かつホストのペアで管理されるMySQLは、
任意のPCからのアクセスで拒否されるので、どうしたらいいんだろーと検索したメモ。

以下の権限&変更で、ホストは任意に変更できます
 GRANT ALL PRIVILEGES ON *.* TO user@'%' IDENTIFIED BY 'password';
で、SQLServer2000からのデータ移行にチャレンジ中。
MS付属のDTSつかっていけるかと思ったけど、どうしても出来なく。
やっぱりレプリケーションとか設定の跡があるからまずいのかな。

コンバートできないデータ要素があるみたい。

色々探してみたら、MySQLにマイグレーションのツールがあったのでそちらで実行中。
うまく動作してるっぽい。オートインデックスに関係してる部分は、
途中でエラーが報告されるので、SQL文を削除して、オブジェクト作り直しでうまくいった。

SQLServerからのデータ取得. ADO.NETにて

データリーダーでテーブルを取ってきて、そのスキーマを知りたい場合について。
大体次のようにすれば、列名や列の型などを取得できるのでは。

コメントにした部分を知りたい項目にすれば、それに関しての情報が出ることを確認した。
わかりやすいサンプルがないので、ここに書いてみました。
 schemeTable = reader.GetSchemaTable();
 for (int i = 0; i < schemeTable.Columns.Count; i++)
 {
       //DataColumn col = schemeTable.Columns["ColumnName"];       DataColumn col = schemeTable.Columns[i];       Console.WriteLine(col.ColumnName);
       for (int j = 0; j < schemeTable.Rows.Count; j++)
       {
           DataRow row = schemeTable.Rows[j];           Console.WriteLine("\t0", row[col]);       }
 }

2006/10/01(日) MySQLネタ

今日もmySQLと戦ってました

データ注入でうまくいかなくて結局1日消費。

昨日MSのSQLServer2000から取り出してきたデータを、
SQL文の形にしてインポートさせようとしたらShiftJISの問題で、
エスケープシーケンス埋め込んで対処。

また、ツールにはSQLyogのフリー版を使用。

文字コード

しかし問題が。ShiftJISとの問題でこれからも付き合っていくのか、と思うと大変に思ったので
全てのデータをUTF8に移行することに決定。

しかしながらこれまた大変な作業が待ってました。
ツール類はUTF8全滅で、表示できたのはMySQL Query Browserのみ。
SQLyogは使いやすかったので、UTF対応も是非行ってもらいたいです。

※最もツールが悪いのかデータがまずいのかで、数時間使っちゃってます

あと、PHPからのアクセス問題も発生したので検索して色々と。
データを取得する前に、以下のようにしておけば文字コード変換が働かなくなり、DBに格納してある生の文字コードで取得できるみたい。
mysql_query( "SET NAMES utf8");

リストアとか

結局データはリストアのデータと同じ形式に吐き出すように、プログラムを変更してデータ生成

その後リストアの処理するコマンドを一つずつ手打ちしてデータを注入しました。
 load data infile '/home/slash/data.sql' into table DataTable;

UTF8にしたかった理由

思い出してみるとADO.NETでアクセスしてデータを表示させたかったから、でした。

データセットに取得してDataGridに表示させようとすると、どうしてもUTF8にってことで。

2006/10/11(水) アルゴリズム

検索アルゴリズム

どうやらO(N)では、まずいみたいなので、O(logN)になるものを検討中。

2分木も考えたけれども、バランスを取ることを考えて
、AVLとかRed/BlackTreeを採用した方がいいみたい。

で、Red/BlackTreeの解説pdf

http://fan.aist-nara.ac.jp/~kounoe/lecture/algorithm/algo0428.pdf

きちんと本を買って勉強した方がいいかなぁと思う今日この頃。

1: slash 『http://www.ececs.uc.edu/~franco/C321/html/RedBlack/redblack.html...』 (2006/10/23 16:28)

2: slash 『http://www.geocities.jp/h2fujimura/mutter/tree/red-black-tree.ht...』 (2006/10/28 25:19)

2006/12/24(日) プログラム的話題

UNICODE使用時におけるプリプロセッサについて

__FILE___や__DATE__などのプリプロセッサは ANSI文字として置き換わるので、

そのままだとUNICODE文字配列には入ってくれません。

サフィックスLを付けるとUNICODE文字定数としてコンパイルされるので、
 #define CONVERT2WIDE(X)   (L ## X)
として、CONVERT2WIDE( __TIME__ ) とか。頭の中では L"12:00:00" とか置き換わる算段です。

実際にはこれだけではダメで、
 #define CONVERT2WIDE(X)  (WIDEN(X))
 #define WIDEN(X) ( L ## X )
としなきゃダメみたいです。理由はよく分かりませんが、昔からの流れ?みたいです。

2007/01/08(月) インスタンシング

今日もインスタンシング

昨日に引き続き、今日はShaderInstancingをトライしていた。

しかしHWインスタンシングに比べて動作は理解しやすい。単に形状データを繰り返し、頂点バッファを満たしておけばいい。

あとはそれに対する変形パラメータを外部から叩き込めば終わり。

必要回数、必要ポリゴン数になるまでdrawPrimitiveを繰り返す。

そんなわけで、さっくり実装できた。

HLSL

今は起動時で読み込んでコンパイルさせているけど、デフォルトのシェーダーくらいはlibに組み込んでしまいたいと思って色々調べてみた。

どうやらバイナリのリソースとしてリソーススクリプトで記述すれば良さそうです。

GUIの操作としては、リソースのウィンドウで追加→ファイルから〜

その時の.rcの中身にはこんな風にして追記されることになります。

(グループ名を入れたかったのでそこだけは手作業)
<名前> <グループ名> DISCARDABLE "ファイル名.fx"

ここまでやって気付いたのだが、そのままバイナリファイルに組み込まれるみたい…。

さらに調べてみると .fxから .fxoを作ってしまうという方法もあるようだ。

コンパイル済みシェーダーといったところか。

こちらを組み込みにすれば、先ほどよりはマシだろう。読まれたくないならば、
fxoをさらに暗号化してリソースにインポートすればいい話だし。

で、プロジェクトに追加されている.fxファイルにコンパイルの記述を追加する。
 fxc /T fx_2_0 /Fo "bin/$(InputName).fxo"  "$(InputPath)"
こんな感じでコマンドライン行に追加。最初のはバージョンを決めるためのものだろう。

さらに、出力ファイルの箇所で "bin/$(InputName).fxo" と記述するのも忘れずに。

デバッグ版とリリース版で同じでも問題ないと思うけど、オプションを変更することも可能です。

2007/03/21(水) メモリリーク

メモリリーク検知。簡単な方法

以前作成したメモリリーク検知のlibですが、
単にチェックするだけならWin32APIの方を使った方が楽です。
 #ifdef _DEBUG
 #define _CRTDBG_MAP_ALLOC
 #include <stdlib.h>
 #include <crtdbg.h>
 #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
 #endif

ソースファイルのmain()など最初の方で、
 _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

プリプロセッサの部分はnewの置き換えを行って正確なファイル名、行番号を出すようにするための仕組みです。

ファイル名や行番号が表示されない場合、{}で囲まれた番号でどこの部分からのメモリ確保要求かを特定できます。

ブレークポイントとして止めるためには、
_CrtSetBreakAlloc( 番号 );
でセットすることが出来ます。

意外なものが付いていた

MSDNのダウンロードを見ていたら、VisualSourceSafeがダウンロード可能になっていた。

DVDディスクなどには含まれていなかったため、気付くのが今頃になってしまった。

とりあえず6.0dと2005が使用可能だったので、2005を早速インストール。

自分でしか使わないためマージモデルは不採用。
以前のバイト先で使っていたように、最新取得して書き換えるときに更新権を取得し、終わったらコミットして更新権放棄というスタイルに。
VisualStudio2005に統合できるし今のところはいい感じです。

そのうち、VirtualMachine立ち上げて、その中でIISなど用意して外部公開実験してみようかなぁ。

2007/04/15(日) SkinnedMesh

スキンメッシュの表示

前回からチャレンジしていて、助言を元に色々と試行錯誤してました。

で、最終的にはコンバータから出力した頂点データが 固定機能のインデックス付き頂点データで、
表示させようとしている側は、シェーダーによる表示方法を選択。

という不一致が原因だった模様。

コンバータから出力するデータも若干おかしいと思える箇所を SkinnedMeshサンプルを参考にして修正。

表示側も固定機能による表示方法(D3DINDEXED)を適用することでやっと表示できました。

次はシェーダーによる表示方法にチャレンジしたいと思います。


ConvertToIndexedBlendedMeshによる変換作業が具体的に何をやっているかが謎ですね。

固定機能にしろシェーダーにしろ特に中身のデータが変わるとは思えないのですが。

追加

シェーダー定数の個数制限のためにパレット制限がかかるということに気付きました。

基本的に26個のマトリックスしかシェーダーに転送できず、
そのためにConvertToIndexedBlendedMeshはデータを変換して、
ボーンコンビネーションを複数回に分割するということをしている模様。

tiny.xの例で言えば、固定機能時はパレット36個は1回のdrawコールでOKだったものが、シェーダーを使うと2回の描画に分かれる。コンビネーション数が2回になってました。

この分け方のアルゴリズムとかは興味ありつつも、調査はしないことにします。
とりあえずもっと先へ進みたいので。

その前にコンバーターのソースを整形しないと不味そうですが…。リークもあるし。