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といった名前に)書き換えられる。