一応現在のバージョンでもメモリから mv1ファイルを読み込む関数があります
// メモリ上のモデルファイルイメージと独自の読み込みルーチンを使用してモデルを読み込む
int MV1LoadModelFromMem(
void *FileImage,
int FileSize,
int (* FileReadFunc )( const TCHAR *FilePath, void **FileImageAddr, int *FileSize, void *FileReadFuncData ),
int (* FileReleaseFunc )( void *MemoryAddr, void *FileReadFuncData ),
void *FileReadFuncData = NULL
) ;
追加した当時の説明を載せますので、よろしければご覧ください m(_ _)m
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
// メモリ上のモデルファイルイメージと独自の読み込みルーチンを使用してモデルを読み込む
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 ;
}
もしご不明な点がありましたら仰ってください