学习WW有一段时间了,但是若想开发自己基于WW的插件,必然会遇到RendableObject中的DirectX渲染问题。所有需要渲染绘制的 WW三维插件,最终是通过继承RendableObject并实现自己的Initialize()、Update()、Render()方法的。想写自己的Render()方法不是简单的事情,你必然要学习DirectX编程,否则,你连看懂示例中的底层Render()方法都很难,谈何开发自己的插件。
为了突破DirectX编程对我学习WW插件的阻挠,我“快餐式”地突击学习了DirectX,对基本流程和基本原理有了一定认识。今天下午我也对BMNG插件中RendableObject子类——ImageLayer为例进行了分析学习。现在与大家分享一下。
注:请务必先学过
Direct3D学习(资料收集),否则看下面的内容无异于浪费你宝贵的时间。
Image Layer重载实现的Initialize()方法。
Initialize方法代码
/// <summary>
/// Layer initialization code
/// </summary>
public override void Initialize(DrawArgs drawArgs)
{
try
{
//获取绘制设备对象
this.device = drawArgs.device;
if(_imagePath == null && _imageUrl != null && _imageUrl.ToLower().StartsWith("http://"))
{
//根据URL地址,在本地构建同样层次的文件夹路径。这里有个知识点getFilePathFromUrl()方法,自己定位学习
_imagePath = getFilePathFromUrl(_imageUrl);
}
FileInfo imageFileInfo = null;
if(_imagePath != null)
imageFileInfo = new FileInfo(_imagePath);
if(downloadThread != null && downloadThread.IsAlive)
return;
if(_imagePath != null &&
cacheExpiration != TimeSpan.MaxValue &&
cacheExpiration.TotalMilliseconds > 0 &&
_imageUrl.ToLower().StartsWith("http://") &&
imageFileInfo != null &&
imageFileInfo.Exists &&
imageFileInfo.LastWriteTime < System.DateTime.Now - cacheExpiration)
{
//attempt to redownload it
//启用新线程,下载影像图片。我稍后分析DownloadImage()方法,是重点之一
downloadThread = new Thread(new ThreadStart(DownloadImage));
downloadThread.Name = "ImageLayer.DownloadImage";
downloadThread.IsBackground = true;
downloadThread.Start();
return;
}
if(m_TextureStream != null)
{
//从文件流中,更新Texture(纹理),重点分析
UpdateTexture(m_TextureStream, m_TransparentColor);
verticalExaggeration = World.Settings.VerticalExaggeration;
//创建Mesh,稍后重点分析
CreateMesh();
isInitialized = true;
return;
}
else if(imageFileInfo != null && imageFileInfo.Exists)
{
//从文件路径中更新纹理
UpdateTexture(_imagePath);
verticalExaggeration = World.Settings.VerticalExaggeration;
//创建格网Mesh,为了获取Vertex集合。
CreateMesh();
isInitialized = true;
return;
}
if(_imageUrl != null && _imageUrl.ToLower().StartsWith("http://"))
{
//download it...
downloadThread = new Thread(new ThreadStart(DownloadImage));
downloadThread.Name = "ImageLayer.DownloadImage";
downloadThread.IsBackground = true;
downloadThread.Start();
return;
}
// No image available
Dispose();
isOn = false;
return;
}
catch
{
}
}