VC++でのDLLの作り方
エクスポートする側(Dll)の関数に __declspec(dllexport) をつけて宣言する。
例)
__declspec(dllexport) void sum(int a, int b);
クラスをエクスポートする場合は、クラス宣言に __declspec(dllexport) をつけて宣言する。
例)
class __declspec MyClass {
:
}
※DEFファイル(拡張子.def)を使って宣言を明示する方法もあるが、こちらの方が簡便。
コンパイルして作成されたdllとlibファイルを、インポートするプロジェクトのディレクトリにコピーする。
インポートする側では、インポートする関数やクラスに、__declspec(dllimport)をつけて宣言する。
エクスポート側とインポート側でヘッダを共用した方がいいので、ヘッダを
#ifdef _EXPORTING #define CLASS_DECLSPEC __declspec(dllexport) #else #define CLASS_DECLSPEC __declspec(dllimport) #endif
と宣言しておき、エクスポートする側のcppファイルでは、
#define _EXPORTING #include "MyClass.h"
とインクルードし、
インポートする側では普通に、
#include "MuClass.h"
とすると便利。
使用するライブラリは、ワークスペースのリンクモジュールの設定で lib ファイルを追加するか、
#pragma comment(lib, "hogehoge.lib")
とする。
これで、dllのクラスや関数を普通に使える。
DevILを用いた画像ファイルの読み込み
// #include <IL/il.h> // ilu.hもインクルードするなら不要 #include <IL/ilu.h> ILuint image; unsigned int width, height; // 初期化(ilとiluをこの順番で初期化する) ilInit(); iluInit(); // イメージ名(識別番号)を生成 ilGenImages(1, &image); // 生成した名前をバインド ilBindImage(image); // ファイルから画像をロード if (ilLoad(imageFile)) { width = ilGetInteger(IL_IMAGE_WIDTH); height = ilGetInteger(IL_IMAGE_HEIGHT); // 画素の並びが逆の場合は入れ替える if (ilGetInteger(IL_IMAGE_ORIGIN) != IL_ORIGIN_LOWER_LEFT) { iluFlipImage(); } } else { ILenum err = ilGetError(); std:cerr << iluErrorString(err) << std::endl; } // 後始末 ilDeleteImage(1, &image);
テクスチャに使う
// テクスチャ名を生成 GLuint texName; glGetTextures(1, &texName); // 使うイメージ名をバインド ilBindImage(image); // テクスチャの設定 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glBindTexture(GL_TEXTURE_2D, texName); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LENEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LENEAR); glTexImage2D(GL_TEXTURE_2D, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, ilGetData()); : // 後始末 glDeleteTextures(1, &texName);
まとめ
初期化
ilInit();iluInit();
ilutRenderer(ILUT_OPENGL);
名前付け
ILvoid ilGenImages(ILsizei Num, ILuint *Images);
ILvoid ilBindImages(ILuint Image);
ILvoid ilDeleteImages(ILsizei Num, ILuint *Images);読み込み
ILboolean ilLoadImage(const char *FileName);
ILboolean ilLoad(ILenum Type, const char *FIleName);
ILboolean ilLoadF(ILenum Type, ILHANDLE File);
ILboolean ilLoadL(ILenum Type, ILvoid *Lump, ILuint Size);保存
ILboolean ilSaveImage(const char *FileName);
ILboolean ilSave(ILenum Type, const char *FileName);
ILboolean ilSaveF(ILenum Type, ILHANDLE File);
ILboolean ilSaveL(ILenum Type, ILvoid *Lump, ILunit Size);画像の操作
ILboolean ilTexImage(ILuint Width, ILuint Height, ILuint depth, ILubyte Bpp, ILenum, Format, ILenum Type, ILvoid *Data);画像データの取得
ILubyte* ilGetData(ILvoid);
ILuint ilCopyPixels(ILuint XOff, ILuint YOff, ILuint ZOff, ILuint Width, ILunit Height, ILunit Depth, ILenum Format, ILenum Type, ILvoid *Data);画像のコピー
ILboolean ilCopyImage(ILuint Src);
ILboolean ilOverlayImage(ILuint Src, ILint XCoord, ILint YCoord, ILint ZCoord);
ILboolean ilBlit(ILuint Src, ILint DestX, ILint DestY, ILint DestZ, ILuint SrcX, ILuint SrcY, ILuint SrcZ, ILuint width, ILuint Height, ILuint Depth);エラー処理
ILenum ilGetError(ILvoid);
const char* iluErrorString(ILenum Error);
Blenderメモ
アーマチャの作成
- オブジェクトモードでスペースバーを押す。
※X-Rayオプションを選ぶとアーマチャがメッシュを通して表示されるようになる。
※人体モデルみたいな左右対称のモデルにボーンを設定する場合は、X-Axis Mirrorオプションを選ぶとX軸を跨がって編集内容がミラーリングされるようになる。
- X-Axis Mirrorオプションを選んだ場合は、「Shift」+「E」でボーンの先端からミラーリングされた押し出しが可能となる。その次の先端以降の押し出しでは「Shift」を押す必要はない。
ボーンの接続を切り離す
- 対象となるボーンを選択し、「Alt」+「P」を押す。この処理はミラーリングでの処理はされないので、左右対象のボーンはそれぞれ左右のボーンで処理する必要がある。
ボーンの回転角を再計算する
- 「A」を押し全てのボーンを選択し、「Ctrl」+「N」を押す。
ボーンの名前のつけ方
末尾を.Rか.L(あるいは_Lか_R)にして左右を表現する。
Ex. UpperArm.L、UpperArm.R
マウスカーソルをボーンの名前のテキストフィールドの上に置き、クリックせずに「Ctrl」+「C」を押す。
右側の対応するボーンを選択してから、同様にクリックせずにテキストフィールドの上で「Ctrl」+「V」を押す。この時名前の重複がおき、末尾に.001というサフィックスがつけられる。「W」キーを押して表示されるメニューで「Flip Lieft-Right Names」を選択すると自動的に名前が(UpperArm.Rといった名前に)書き換えられる。