トップページ > 記事閲覧
mv1ファイルをメモリから(要望)
名前:ギウ 日時: 2017/07/28 22:27

お世話になっております。 メモリにあるmv1ファイル(モデルデータ)を読み込みたいのですが、可能でしょうか。 必要なテクスチャーもメモリにあるので、後からファイル名付きで設定するとか(?) ご検討お願いいたします。 ====== やりたいことは、バイナリ圧縮してあるファイルから、mv1とjpgをメモリに解凍し、 int h_mv1 = MV1LoadModelMem( p_mv1_data ); // メモリ内のmv1からハンドルを作成 MV1LoadTextureMem( h_mv1, "tex.jpg", p_jpg_data ); みたいな感じです。 あ、テクスチャーは↓を使えば設定できるのかも(?) MV1GetTextureName MV1SetTextureGraphHandle
メンテ

Page: 1 |

Re: mv1ファイルをメモリから(要望) ( No.1 )
名前:管理人 日時:2017/07/29 01:14

一応現在のバージョンでもメモリから 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 ; } もしご不明な点がありましたら仰ってください
メンテ
Re: mv1ファイルをメモリから(要望) ( No.2 )
名前:ギウ 日時:2017/07/29 10:41

おお! 有難うございます。既にありましたか。 読み込みは成功しました! けど、テクスチャーの読み込み指示に、存在しないjpegを読み込めというのが来ます。 Xファイル(テキスト)で確認したところ、使用してるテクスチャーは、tex.jpegの1枚だけなのですが、 2回目のFileReadFuncのFilePathに、tex_a.jpeg というが入ってきます。 デバッグ用の何かでしょうか? あと確認ですが、 複数のMV1で同じテクスチャーを使ってる場合、VRAMに複数の同じ画像が生成されてる状態でしょうか。 良い対策方法がありましたら教えてください。
メンテ
Re: mv1ファイルをメモリから(要望) ( No.3 )
名前:ギウ 日時:2017/07/29 13:01

追伸 tex_a.jpegに対して、tex.jpegを読み込ませたら、0.9fくらい半透明になりました。 アルファ値読み込み用な感じでしょうか。
メンテ
Re: mv1ファイルをメモリから(要望) ( No.4 )
名前:管理人 日時:2017/07/31 01:09

> tex_a.jpegに対して、tex.jpegを読み込ませたら、0.9fくらい半透明になりました。 > アルファ値読み込み用な感じでしょうか。 はい、そうです、bmpファイルや jpegファイルのようにアルファチャンネルの無いフォーマットの 画像を読み込んだ場合は、末尾に _a のついたアルファチャンネル用の画像があるかもしれないということで 追加で読み込み処理を行っています 特にアルファチャンネル用の画像が無い場合は『ファイル読み込み失敗』の扱いで大丈夫な筈ですが、 モデルファイルの読み込みえエラーになってしまうということでしょうか? > 複数のMV1で同じテクスチャーを使ってる場合、VRAMに複数の同じ画像が生成されてる状態でしょうか。 はい、その通りです > 良い対策方法がありましたら教えてください。 すみません、今のところ対策はありません… ただ、読み込み処理自体を抑制する手段はありませんが、読み込まれたモデルに対して MV1GetTextureGraphHandle で 取得できるグラフィックハンドルを DeleteGraph で削除するということが可能なので、重複しているテクスチャの グラフィックハンドルを削除した後 MV1SetTextureGraphHandle で代わりのグラフィックハンドルを設定するという 力技を行えばVRAM の節約はできます
メンテ
Re: mv1ファイルをメモリから(要望) ( No.5 )
名前:ギウ 日時:2017/07/31 06:59

>画像を読み込んだ場合は、末尾に _a のついたアルファチャンネル用の画像があるかもしれないということで >追加で読み込み処理を行っています 了解です! (モデルの読み込みは成功してますので大丈夫です) >グラフィックハンドルを削除した後 MV1SetTextureGraphHandle で代わりのグラフィックハンドルを設定するという力技を行えばVRAM の節約はできます お。了解です! あと、確認ですが、 MV1DuplicateModelで複製したモデルデータの場合は、同じテクスチャー(同じVRAM領域)を使ってくれてると考えて大丈夫でしょうか。
メンテ
Re: mv1ファイルをメモリから(要望) ( No.6 )
名前:管理人 日時:2017/08/01 01:22

> あと、確認ですが、 > MV1DuplicateModelで複製したモデルデータの場合は、同じテクスチャー(同じVRAM領域)を使ってくれてると考えて大丈夫でしょうか。 はい、同じテクスチャを使用しています MV1DuplicateModel 元のモデルハンドルと MV1DuplicateModel で得られるモデルハンドルで グラフィックハンドルを共有していますので、No.4 の方法で MV1GetTextureGraphHandle で取得した グラフィックハンドルを削除すると MV1DuplicateModel 元のモデルハンドルと MV1DuplicateModel したモデルハンドル全てに 影響が出ますので注意してください m(_ _)m
メンテ
Re: mv1ファイルをメモリから(要望) ( No.7 )
名前:ギウ(解決) 日時:2017/08/01 05:15

諸々了解です。 ご対応有難うございました!
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存