はじめまして。DxLib を初めて使わせていただいており、おそらく初手の段階で躓いています。
使用言語: C#(.NET Framework 4.7.2)
OS: Windows 10 64bit
--------------------
■やりたいこと
・メインフォームに入力されたファイルパスを元に、サブフォームにそのモデルをDxLibで描画したい
・サブフォームは開閉でき、ファイルパスを変更した際には該当モデルを読み直して描画したい
・サブフォームのPictureBoxを対象として描画したい
--------------------
■悩んでいること
最初にサブフォームを表示した時にはモデルが正常に描画されるのですが、一度閉じて開き直すとモデルが表示されません。
背景色も描画されていないので、何か設定が抜けているのではないかとは考えてますが、理由が分からないでいます。
--------------------
■サブフォームのコード
public partial class PmxViewer : System.Windows.Forms.Form
{
public List<PmxModel> PmxModels { get; set; } = new List<PmxModel>();
public CancellationTokenSource boxTaskTokenSource;
public PmxViewer()
{
InitializeComponent();
PmxLabel.Text = Properties.Resources.PmxLabel;
VmdLabel.Text = Properties.Resources.VmdLabel;
// ウィンドウモードで描画
ChangeWindowMode(TRUE);
// Direct3D9Ex を使用する
SetUseDirect3DVersion(DX_DIRECT3D_9EX);
// DxLib_Init の前に出力先ウインドウを SetUserWindow で指定する
SetUserWindow(ViewerBox.Handle);
// 背景色設定
SetBackgroundColor(140, 140, 140);
// 計算速度を犠牲にしてでも精度を double で計算する
SetUseFPUPreserveFlag(TRUE);
// 透過色を指定しない、これが無いとデフォルトでは黒が透過されてしまう
SetUseTransColor(FALSE);
}
private float Degree2Radian(float degree)
{
return (float)(degree / 180 * Math.PI);
}
private void PmxViewer_Shown(object sender, EventArgs e)
{
foreach (PmxModel model in PmxModels)
{
// 3Dモデルの読み込み
model.InitDraw();
}
}
private void ViewerBox_Paint(object sender, PaintEventArgs e)
{
boxTaskTokenSource = new CancellationTokenSource();
CancellationToken boxTaskToken = boxTaskTokenSource.Token;
Task.Run(() =>
{
// DXライブラリの初期化
if (DxLib_Init() < 0)
{
// エラーが発生したら直ちに終了
return;
}
while (true & !boxTaskToken.IsCancellationRequested)
{
DrawModel();
}
// DXライブラリの破棄
DxLib_End();
});
}
private void DrawModel()
{
ClearDrawScreen();
ProcessMessage();
// 描画先を裏画面にする
SetDrawScreen(DX_SCREEN_BACK);
// Zバッファを使用する
SetUseZBufferFlag(TRUE);
// Zバッファへの書き込みを行う
SetWriteZBufferFlag(TRUE);
// バックカリングを行う
SetUseBackCulling(TRUE);
// pngなどの透過チャンネルを有効に設定
SetMovieColorA8R8G8B8Flag(TRUE);
// モデルの見える位置にカメラを配置
SetCameraPositionAndTarget_UpVecY(VGet(0.0f, 16.0f, -50.0f), VGet(0.0f, 14.0f, 0.0f));
// 視野角設定
SetupCamera_Perspective(Degree2Radian(35.0f));
foreach (PmxModel model in PmxModels)
{
// 3Dモデルの描画
model.Draw();
}
ScreenFlip();
}
private void PmxViewer_FormClosing(object sender, FormClosingEventArgs e)
{
boxTaskTokenSource.Cancel();
}
}
--------------------
サブフォームを何度開き直してもモデルを描画させられるようにしたいのですが、どのように記述すればよろしいでしょうか。
(下記コードには拘っておらず、やりたい事ができれば、どのような表記でも構いません)
お忙しいところ大変恐縮ですが、何卒ご教示いただけますよう、よろしくお願いいたします。