www.pudn.com > ReadXfile.rar > FrmMain.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
namespace World_Earth
{
public partial class FrmMain : Form
{
//ShowPMesh SPmeshClass = new ShowPMesh();//渐进模型
ShowPMesh SPmeshClass = new ShowPMesh();//单独打开给定个数渐进模型
public FrmMain()
{
//this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
InitializeComponent();
}
///
/// 打开被选中的X模型
///
///
///
private void 打开X模型MenuItem_Click(object sender, EventArgs e)
{
OpenFileDia = new OpenFileDialog();
OpenFileDia.InitialDirectory = Application.StartupPath + "\\杭州项目模型\\";
OpenFileDia.Filter = "x files (*.x)|*.x";
OpenFileDia.Multiselect = true;
OpenFileDia.FilterIndex = 1;
if (OpenFileDia.ShowDialog() == DialogResult.OK)
{
//第一种打开方法
//string[] files = OpenFileDia.FileNames;];
//SPmeshClass.OpenAllXModel(this, files);
//第二种打开方法
SPmeshClass.filenamepath = OpenFileDia.FileNames;
SPmeshClass.xfilenum = OpenFileDia.FileNames.Length;//选中文件个数
//SPmeshClass.meshMaterials = new Material[SPmeshClass.xfilenum, 100];
//SPmeshClass.meshTextures = new Texture[SPmeshClass.xfilenum, 100];
SPmeshClass.InitBinary();
if (SPmeshClass.device == null)
{
SPmeshClass.InitD3D(this);
}
SPmeshClass.mtrlNum = new int[SPmeshClass.xfilenum];//xhl 2007-3-28 数组没有重新定义 导致出错
////////////进度条窗口/////////////
FrmPro frm = new FrmPro();
frm.Show();
frm.ProBar.Maximum = SPmeshClass.xfilenum;
int nProNum = SPmeshClass.xfilenum;//估计时间
TimeSpan start = new TimeSpan(DateTime.Now.Ticks);
//////////////////////////////////////////
for (int nIndex = 0; nIndex < SPmeshClass.xfilenum; nIndex++)
{
SPmeshClass.LoadMesh(SPmeshClass.filenamepath[nIndex], nIndex);
if (SPmeshClass.device != null)
{
SPmeshClass.device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Blue, 1.0f, 0);
SPmeshClass.device.BeginScene();
//xfilenum = filenamepath.Length;
for (int nInd= 0; nInd < SPmeshClass.xfilenum; nInd++)
{
SPmeshClass.SetCamera(nInd);
SPmeshClass.DrawMesh(nInd);
TimeSpan end = new TimeSpan(DateTime.Now.Ticks);
TimeSpan ts = end.Subtract(start);
double dtotals = ts.TotalSeconds * SPmeshClass.xfilenum / (nInd + 1);
double shenyu = dtotals - ts.TotalSeconds;
shenyu = System.Math.Round(shenyu);
//string strTime = ts.Days.ToString() + "天" + ts.Hours.ToString() + "小时"
// + ts.Minutes.ToString() + "分" + ts.Seconds.ToString() + "秒" + ts.Milliseconds.ToString () + "毫秒";
string strTime = shenyu.ToString() + "秒";//剩余时间
////进度条/////////////////////////////////////////////
frm.ProBar.Value = nIndex;
int nfi = SPmeshClass.filenamepath[nIndex].LastIndexOf("\\") + 1;
string strname = SPmeshClass.filenamepath[nInd].Substring(nfi);//当前加载的模型名
frm.labTip.Text = "Loading: " + strname;
frm.labTime.Text = "剩余时间:" + strTime;
frm.Update();
}
//int vertices = new int();
//int faces = new int();
//for (int nIn = 0; nIndex < SPmeshClass.xfilenum; nIn++)
//{
// BaseMesh b = SPmeshClass.progressiveMesh[nIn];
// vertices = vertices + b.NumberVertices;
// faces = faces + b.NumberFaces;
//}
//SPmeshClass.font.DrawText(null, string.Format("Number vertices in mesh: {0}", vertices),
// new Rectangle(10, 26, 0, 0),
// DrawTextFormat.NoClip, Color.BlanchedAlmond);
//SPmeshClass.font.DrawText(null, string.Format("Number faces in mesh: {0}", faces),
// new Rectangle(10, 42, 0, 0),
// DrawTextFormat.NoClip, Color.BlanchedAlmond);
SPmeshClass.device.EndScene();
SPmeshClass.device.Present();
}
}
/////关闭滚动条窗口
frm.Hide();
//SPmeshClass.ShowXModel();
}
else
{
return;
}
}
///
///
///
///
///
private void FrmMain_Paint(object sender, PaintEventArgs e)
{
if (SPmeshClass.progressiveMesh[0] != null)
if (this.WindowState != FormWindowState.Minimized)
{
SPmeshClass.ShowXModel();
}
}
///
///
///
///
///
private void FrmMain_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 's')
{
for (int i = 0; i < SPmeshClass.xfilenum; i++)
{
//cameraPos -= (MoveAmount * 2);
SPmeshClass.pos[i].Z -= (SPmeshClass.MoveAmount * 2);
SPmeshClass.progressiveMesh[i].NumberVertices =
((BaseMesh)SPmeshClass.progressiveMesh[i]).NumberVertices + SPmeshClass.MoveAmount;
SPmeshClass.progressiveMesh[i].NumberFaces =
((BaseMesh)SPmeshClass.progressiveMesh[i]).NumberFaces + SPmeshClass.MoveAmount;
}
}
if (e.KeyChar == 'w')
{
for (int i = 0; i < SPmeshClass.xfilenum; i++)
{
//cameraPos += (MoveAmount * 2);
SPmeshClass.pos[i].Z += (SPmeshClass.MoveAmount * 2);
SPmeshClass.progressiveMesh[i].NumberVertices =
((BaseMesh)SPmeshClass.progressiveMesh[i]).NumberVertices - SPmeshClass.MoveAmount;
SPmeshClass.progressiveMesh[i].NumberFaces =
((BaseMesh)SPmeshClass.progressiveMesh[i]).NumberFaces - SPmeshClass.MoveAmount;
}
}
if (e.KeyChar == 'a')
{
//for (int i = 0; i < SPmeshClass.xfilenum; i++)
//{
// SPmeshClass.pos[i].X -= (SPmeshClass.MoveAmount * 2);
//}
SPmeshClass.offsetx = SPmeshClass.offsetx + 4f;
SPmeshClass.device.Transform.World = Matrix.Translation(SPmeshClass.offsetx, 0, 0);
}
if (e.KeyChar == 'd')
{
//for (int i = 0; i < SPmeshClass.xfilenum; i++)
//{
// SPmeshClass.pos[i].X += (SPmeshClass.MoveAmount * 2);
//}
SPmeshClass.offsetx = SPmeshClass.offsetx - 4f;
SPmeshClass.device.Transform.World = Matrix.Translation(SPmeshClass.offsetx, 0, 0);
}
if (e.KeyChar == 'e')//线显示
{
SPmeshClass.device.RenderState.FillMode = FillMode.WireFrame;
}
if (e.KeyChar == 'f')//面显示
{
SPmeshClass.device.RenderState.FillMode = FillMode.Solid;
}
//this.Invalidate(); //不在paint事件中画便可以去除屏幕闪烁
SPmeshClass.ShowXModel();
}
///
/// 递归实现查找目录下的所有子目录和文件
///
/// 为指定的文件夹路径
public void FindFile(string dir)
{
//在指定目录及子目录下查找文件
DirectoryInfo Dir = new DirectoryInfo(dir);
try
{
foreach (DirectoryInfo d in Dir.GetDirectories()) //查找子目录
{
FindFile(Dir + "\\" + d.ToString() + "\\");
//listBox1.Items.Add(Dir + "\\" + d.ToString() + "\\"); //listBox1中填加目录名
}
foreach (FileInfo f in Dir.GetFiles("*.x")) //查找x文件
{
//listBox1.Items.Add(Dir+f.ToString()); //listBox1中填加文件名
SPmeshClass.filenamepath[SPmeshClass.xfilenum] = Dir + "\\" + f.ToString();
SPmeshClass.xfilenum++;
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
///
/// 释放内存
///
///
///
private void FrmMain_FormClosed(object sender, FormClosedEventArgs e)
{
if (SPmeshClass.device != null)
SPmeshClass.device.Dispose();
SPmeshClass.device = null;
if (SPmeshClass.progressiveMesh != null)
{
SPmeshClass.progressiveMesh = null;
}
}
///
///
///
///
///
private void FrmMain_KeyDown(object sender, KeyEventArgs e)
{
// 前后左右旋转
if (e.KeyCode==Keys.Left)
{
SPmeshClass.angle = SPmeshClass.angle + 0.2f;
SPmeshClass.device.Transform.World = Matrix.RotationY(SPmeshClass.angle);
}
else if (e.KeyCode == Keys.Right)
{
SPmeshClass.angle = SPmeshClass.angle - 0.2f;
SPmeshClass.device.Transform.World = Matrix.RotationY(SPmeshClass.angle);
}
else if (e.KeyCode == Keys.Up)
{
SPmeshClass.angle = SPmeshClass.angle + 0.2f;
SPmeshClass.device.Transform.World = Matrix.RotationX(SPmeshClass.angle);
//device.Transform.World = Matrix.RotationX(Environment.TickCount / 100.0f);
}
else if (e.KeyCode == Keys.Down)
{
SPmeshClass.angle = SPmeshClass.angle - 0.2f;
SPmeshClass.device.Transform.World = Matrix.RotationX(SPmeshClass.angle);
//device.Transform.World = Matrix.RotationX(-Environment.TickCount / 100.0f);
}
//this.Invalidate();//不在paint事件中画便可以去除屏幕闪烁
SPmeshClass.ShowXModel();
}
///
/// 打开窗口FrmTest来导入普通模型
///
///
///
private void showtestToolStripMenuItem_Click(object sender, EventArgs e)
{
FrmTest ff = new FrmTest();
ff.Show();
}
private void FrmMain_Resize(object sender, EventArgs e)
{
//if (this.WindowState != FormWindowState.Minimized)
//SPmeshClass.ShowXModel();
}
private void 测试MenuItem_Click(object sender, EventArgs e)
{
OpenFileDia = new OpenFileDialog();
OpenFileDia.InitialDirectory = Application.StartupPath + "\\模型\\";
OpenFileDia.Filter = "x files (*.x)|*.x";
//OpenFileDia.Multiselect = true;
OpenFileDia.FilterIndex = 1;
if (OpenFileDia.ShowDialog() == DialogResult.OK)
{
//第一种打开方法
//string[] files = OpenFileDia.FileNames;];
//SPmeshClass.OpenAllXModel(this, files);
//第二种打开方法
string strfname = OpenFileDia.FileName;
SPmeshClass.xfilenum = 30;
//SPmeshClass.filenamepath = OpenFileDia.FileNames;
//SPmeshClass.xfilenum = OpenFileDia.FileNames.Length;//选中文件个数
//SPmeshClass.meshMaterials = new Material[SPmeshClass.xfilenum, 100];
//SPmeshClass.meshTextures = new Texture[SPmeshClass.xfilenum, 100];
SPmeshClass.InitBinary();
if (SPmeshClass.device == null)
{
SPmeshClass.InitD3D(this);
}
SPmeshClass.mtrlNum = new int[SPmeshClass.xfilenum];//xhl 2007-3-28 数组没有重新定义 导致出错
////////////进度条窗口/////////////
FrmPro frm = new FrmPro();
frm.Show();
frm.ProBar.Maximum = SPmeshClass.xfilenum;
int nProNum = SPmeshClass.xfilenum;//估计时间
TimeSpan start = new TimeSpan(DateTime.Now.Ticks);
//////////////////////////////////////////
for (int nIndex = 0; nIndex < SPmeshClass.xfilenum; nIndex++)
{
//SPmeshClass.LoadMesh(SPmeshClass.filenamepath[nIndex], nIndex);
SPmeshClass.LoadMesh(strfname, nIndex);
TimeSpan end = new TimeSpan(DateTime.Now.Ticks);
TimeSpan ts = end.Subtract(start);
double dtotals = ts.TotalSeconds * SPmeshClass.xfilenum / (nIndex + 1);
double shenyu = dtotals - ts.TotalSeconds;
shenyu = System.Math.Round(shenyu);
//string strTime = ts.Days.ToString() + "天" + ts.Hours.ToString() + "小时"
// + ts.Minutes.ToString() + "分" + ts.Seconds.ToString() + "秒" + ts.Milliseconds.ToString () + "毫秒";
string strTime = shenyu.ToString() + "秒";//剩余时间
////进度条/////////////////////////////////////////////
frm.ProBar.Value = nIndex;
int nfi = strfname.LastIndexOf("\\") + 1;
string strname = strfname.Substring(nfi);//当前加载的模型名
//int nfi = SPmeshClass.filenamepath[nIndex].LastIndexOf("\\") + 1;
//string strname = SPmeshClass.filenamepath[nIndex].Substring(nfi);//当前加载的模型名
frm.labTip.Text = "Loading: " + strname + "-" + nIndex.ToString();
frm.labTime.Text = "剩余时间:" + strTime ;
frm.Update();
}
/////关闭滚动条窗口
frm.Hide();
SPmeshClass.ShowXModel();
}
else
{
return;
}
}
}
}