> このように対応していないファイルフォーマットから独自の描画形式で描画したモデルからDXライブラリ上で動作するモデルハンドルを作成することはできますか?
すみません、できません
一番簡単なのは voxファイルを xファイルに変換するプログラムを作成して、変換した xファイルを MV1LoadModel または
MV1LoadModelFromMem で読み込むという方法になると思います
( 最速なのは voxファイルを xファイルに変換したものをメモリに格納して、MV1LoadModelFromMem で読み込む方法です )
MV1LoadModelFromMem は MV1LoadModel で読み込めるファイルがメモリ上に存在していた場合に使用する関数なのですが、
MV1LoadModel で読み込めるモデルファイルはモデルファイル単体で完結しない形式が多いので( 主にテクスチャファイルが
別ファイルとなっているので )、テクスチャファイルなどを読み込む関数を引数で渡すようになっています
実装当時の解説をこの書き込みの最後に載せましたので、よろしければご覧ください m(_ _)m
> それとこれは管理人様への私信なのですが、前回私が質問した項目、
> 管理人様の最後の返信が他の方の質問への回答になってしまっています・・・(ここで言うことではありませんが!)
> その件に関しましてもこちらで一応解決したことにしていますので、特に回答してくださらなくても大丈夫です。
おぉ、本当ですね、すみません orz
回答は不要とのことですが、一応書き込みを行った当日に書いていた本来のご返信内容に変更しておきます
-------------------------------------------------------
// メモリ上のモデルファイルイメージと独自の読み込みルーチンを使用してモデルを読み込む
int MV1LoadModelFromMem(
void *FileImage,
int FileSize,
int (* FileReadFunc )( const char *FilePath, void **FileImageAddr, int *FileSize, void *FileReadFuncData ),
int (* FileReleaseFunc )( void *MemoryAddr, void *FileReadFuncData ),
void *FileReadFuncData
) ;
void *FileImage
メモリに読み込んだモデルファイルの先頭アドレス
int FileSize
メモリに読み込んだモデルファイルのサイズ
int (* FileReadFunc )( const char *FilePath, void **FileImageAddr, int *FileSize, void *FileReadFuncData )
ファイルを読み込むコールバック関数のポインタ
const char *FilePath : 読み込むべきファイルのパス( モデルファイル内に記述されているものそのまま )
int **FileImageAddr : 読み込むべきファイルのメモリアドレスを代入するポインタのアドレス
int *FileSize : 読み込むべきファイルのサイズを代入する変数のアドレス
void *FileReadFuncData : 使用者が必要な情報のアドレス( MV1LoadModelFromMem の引数 FileReadFuncData がそのまま渡されます )
コールバック関数で行う必要がある処理は
引数 FileImageAddr が示すアドレスに指定されたファイルをメモリに読み込んだもの( 若しくは既にあるもの )の先頭アドレスを代入して
引数 FileSize が示すアドレスに指定されたファイルのサイズを代入する
です
戻り値はファイルの読み込みに成功した場合は 0 を、失敗した場合は -1 を返してください
int (* FileReleaseFunc )( void *MemoryAddr, void *FileReadFuncData )
読み込んだファイルを解放するコールバック関数のポインタ
void *MemoryAddr : FileReadFunc で指定したコールバック関数内で FileImageAddr に代入したファイルイメージの先頭アドレス
void *FileReadFuncData : 使用者が必要な情報のアドレス( MV1LoadModelFromMem の引数 FileReadFuncData がそのまま渡されます )
例えば引数 FileReadFunc で指定したコールバック関数内でメモリを確保した場合、この関数で解放してください
void *FileReadFuncData
FileReadFunc と FileReleaseFunc で指定したコールバック関数に引数として渡されるアドレスです、
必要な固有データがある場合はこの引数を介して渡すことができます
この関数を使用して普通にファイルから読み込む部分をコールバック関数で処理するようにしたサンプルを
書いてみましたので、よろしければご覧になってみて下さい
#include "DxLib.h"
#include <stdio.h>
#include <malloc.h>
// ファイルを読み込む関数
int LoadFile( const TCHAR *FilePath, void **FileImageAddr, int *FileSize )
{
FILE *fp ;
// ファイルを開く
fp = fopen( FilePath, "rb" ) ;
// 失敗したら -1 を返す
if( fp == NULL ) return -1 ;
// ファイルのサイズを取得
fseek( fp, 0L, SEEK_END ) ;
*FileSize = ftell( fp ) ;
fseek( fp, 0L, SEEK_SET ) ;
// メモリの確保
*FileImageAddr = malloc( *FileSize ) ;
// ファイルの読み込み
fread( *FileImageAddr, *FileSize, 1, fp ) ;
// ファイルを閉じる
fclose( fp ) ;
// 成功なら 0 を返す
return 0 ;
}
// ファイル読み込み用コールバック関数
int FileReadFunc( const TCHAR *FilePath, void **FileImageAddr, int *FileSize, void *FileReadFuncData )
{
return LoadFile( FilePath, FileImageAddr, FileSize ) ;
}
// ファイル解放用コールバック関数
int FileReleaseFunc( void *MemoryAddr, void *FileReadFuncData )
{
// 確保したメモリの解放
free( MemoryAddr ) ;
return 0 ;
}
// WinMain 関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
void *FileImage ;
int FileSize ;
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルファイルの読み込み
LoadFile( "DxChara.x", &FileImage, &FileSize ) ;
// メモリ上に読み込んだ3Dモデルファイルから3Dモデルを作成
ModelHandle = MV1LoadModelFromMem( FileImage, FileSize, FileReadFunc, FileReleaseFunc, NULL ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 300.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}