Nanashi-soft○プログラマ専用○DirectX11開発○
class pmd{ヘッダーファイル記述のポイントは,#pragma(プラグマ)を使ってアラインメント制御を行う点でしょうか
public:
#pragma pack(push,1) //アラインメント制御をオフる
//ヘッダー
struct t_header{
unsigned char magic[3];
float version;
unsigned char model_name[20];
unsigned char comment[256];
};
t_header header;
//頂点リスト
unsigned long vert_count;
struct t_vertex{
float pos[3];
float normal_vec[3];
float uv[2];
unsigned short bone_num[2];
unsigned char bone_weight;
unsigned char edge_flag;
};
t_vertex *vertex;
//面頂点リスト
unsigned long face_vert_count;
unsigned short *face_vert_index;
#pragma pack(pop) //アラインメント制御エンド
//コンストラクタ
pmd(char *);
//デストラクタ
~pmd();
};
struct t_header{その方が速いから,コンパイラが予期に計らってくれたわけですが
unsigned char magic[3]; ←3バイト
<ここに自動的に1バイト分の空きができる>
float version;
unsigned char model_name[20];
unsigned char comment[256];
};
#include "pmd.h"これをメインプログラムに繋ぐ('-'*)
#include <windows.h>
#include <stdio.h>
//コンストラクタ
pmd::pmd(char *filename)
{
FILE *hFP;
hFP = fopen(filename, "rb");
if(hFP != 0){
//ヘッダー読み込み
fread(&header, sizeof(struct t_header), 1, hFP);
//頂点数読み込み
fread(&vert_count, sizeof(vert_count), 1, hFP);
//頂点データ読み込み
vertex = new t_vertex[vert_count];
fread(vertex, 38, vert_count, hFP);
//面頂点リスト読み込み
fread(&face_vert_count, sizeof(face_vert_count), 1, hFP);
//面頂点リストデータ読み込み
face_vert_index = new unsigned short[face_vert_count];
fread(face_vert_index, 2, face_vert_count, hFP);
fclose(hFP);
}else{
MessageBoxW(NULL, L"fopen", L"Err", MB_ICONSTOP);
}
}
//デストラクタ
pmd::~pmd(void)
{
}
#include "pmd.h" //PMDローダーを追記
const int TYOUTENと,Vertex3D hVectorData[TYOUTEN] = {のデータ定義部分を削除まぁ,エラーになった変数を削除すればいいです(ぉ
unsigned short hIndexData[24] = {のインデックスデータ部分も削除
//pmdクラスを生成する。その際にコンストラクタにファイル名を教える一見複雑そうですが,そんな事はありません。メンドイだけです(^^;
pmd *modeldata;
modeldata = new pmd("rippoutai.pmd");
//頂点データを取得
int TYOUTEN = modeldata->vert_count;
for(int i=0; i < TYOUTEN; i++){
hVectorData[i].pos[0] = modeldata->vertex[i].pos[0];
hVectorData[i].pos[1] = modeldata->vertex[i].pos[1];
hVectorData[i].pos[2] = modeldata->vertex[i].pos[2];
hVectorData[i].col[0] = 0.0f;
hVectorData[i].col[1] = 0.0f;
hVectorData[i].col[2] = 0.5f;
hVectorData[i].col[3] = 1.0f;
hVectorData[i].tex[0] = 0.0f;
hVectorData[i].tex[1] = 1.0f;
}
//インデックスデータを取得
int INDEXSU = modeldata->face_vert_count;
unsigned short *hIndexData;
hIndexData = new unsigned short[INDEXSU];
for(int i=0; i < INDEXSU; i++){
hIndexData[i] = modeldata->face_vert_index[i];
}
hBufferDesc.ByteWidth = sizeof(unsigned short) * INDEXSU;あとは,描画の際に DrawIndexedを使うのが注意点です
hpDeviceContext->DrawIndexed(INDEXSU, 0, 0);これを実行すると,立方体が表示されました
D3D11_FILL_SOLID,↓
D3D11_FILL_WIREFRAME,