WorldWind学习系列六:渲染过程解析篇
2009-12-14 21:37
176 查看
今天主要是分析学习了Render问题,搞明白了WorldWind中整个Render绘制处理过程。其中关键类是:RenderableObject.cs ,RenderobjectList.cs.
WW中所有需要绘制的对象都RenderableObject,WW的各功能的执行显示都是不断地调用相应的Render方法。
1.RenderableObject整个绘制对象继承图
WavingFlagLayer类渲染代码
public override void Render(DrawArgs drawArgs)
{
if (!isInitialized)
return;
if (m_polygonFeature == null || !drawArgs.WorldCamera.ViewFrustum.Intersects(m_polygonFeature.BoundingBox))
return;
try
{
double offset = 0;
if (Bar3D != null && Bar3D.IsOn)
{
Bar3D.Render(drawArgs);
offset = Bar3D.RenderedHeight;
}
Cull cull = drawArgs.device.RenderState.CullMode;
drawArgs.device.RenderState.CullMode = Cull.None;
drawArgs.device.RenderState.ZBufferEnable = true;
drawArgs.device.TextureState[0].ColorOperation = TextureOperation.SelectArg1;
drawArgs.device.TextureState[0].ColorArgument1 = TextureArgument.TextureColor;
Vector3 surfacePos = MathEngine.SphericalToCartesian(m_latitude, m_longitude, World.EquatorialRadius);
Vector3 rc = new Vector3(
(float)drawArgs.WorldCamera.ReferenceCenter.X,
(float)drawArgs.WorldCamera.ReferenceCenter.Y,
(float)drawArgs.WorldCamera.ReferenceCenter.Z
);
Vector3 projectedPoint = drawArgs.WorldCamera.Project(surfacePos - rc);
int mouseBuffer = 15;
if (projectedPoint.X > DrawArgs.LastMousePosition.X - mouseBuffer &&
projectedPoint.X < DrawArgs.LastMousePosition.X + mouseBuffer &&
projectedPoint.Y > DrawArgs.LastMousePosition.Y - mouseBuffer &&
projectedPoint.Y < DrawArgs.LastMousePosition.Y + mouseBuffer)
{
if (!m_isMouseInside)
{
m_isMouseInside = true;
if (OnMouseEnterEvent != null)
{
OnMouseEnterEvent(this, null);
}
}
}
else
{
if (m_isMouseInside)
{
m_isMouseInside = false;
if (OnMouseLeaveEvent != null)
{
OnMouseLeaveEvent(this, null);
}
}
}
drawArgs.device.RenderState.CullMode = Cull.None;
if (ShowHighlight)
renderHighlight(drawArgs);
RenderFlag(drawArgs, offset);
drawArgs.device.RenderState.CullMode = cull;
}
catch (Exception ex)
{
Log.Write(ex);
}
}
本系列其他部分:
WorldWind学习系列五:插件加载过程全解析
WorldWind学习系列四:功能分析——Show Planet Axis、Show Position 、Show Cross Hairs功能
WorldWind学习系列三:简单功能分析——主窗体的键盘监听处理及拷贝和粘贴位置坐标功能
WorldWind学习系列三:功能分析——截屏功能和“关于”窗体分析
WorldWind学习系列二:擒贼先擒王篇2
WorldWind学习系列二:擒贼先擒王篇1
WorldWind学习系列一:顺利起航篇
WW中所有需要绘制的对象都RenderableObject,WW的各功能的执行显示都是不断地调用相应的Render方法。
1.RenderableObject整个绘制对象继承图
WavingFlagLayer类渲染代码
public override void Render(DrawArgs drawArgs)
{
if (!isInitialized)
return;
if (m_polygonFeature == null || !drawArgs.WorldCamera.ViewFrustum.Intersects(m_polygonFeature.BoundingBox))
return;
try
{
double offset = 0;
if (Bar3D != null && Bar3D.IsOn)
{
Bar3D.Render(drawArgs);
offset = Bar3D.RenderedHeight;
}
Cull cull = drawArgs.device.RenderState.CullMode;
drawArgs.device.RenderState.CullMode = Cull.None;
drawArgs.device.RenderState.ZBufferEnable = true;
drawArgs.device.TextureState[0].ColorOperation = TextureOperation.SelectArg1;
drawArgs.device.TextureState[0].ColorArgument1 = TextureArgument.TextureColor;
Vector3 surfacePos = MathEngine.SphericalToCartesian(m_latitude, m_longitude, World.EquatorialRadius);
Vector3 rc = new Vector3(
(float)drawArgs.WorldCamera.ReferenceCenter.X,
(float)drawArgs.WorldCamera.ReferenceCenter.Y,
(float)drawArgs.WorldCamera.ReferenceCenter.Z
);
Vector3 projectedPoint = drawArgs.WorldCamera.Project(surfacePos - rc);
int mouseBuffer = 15;
if (projectedPoint.X > DrawArgs.LastMousePosition.X - mouseBuffer &&
projectedPoint.X < DrawArgs.LastMousePosition.X + mouseBuffer &&
projectedPoint.Y > DrawArgs.LastMousePosition.Y - mouseBuffer &&
projectedPoint.Y < DrawArgs.LastMousePosition.Y + mouseBuffer)
{
if (!m_isMouseInside)
{
m_isMouseInside = true;
if (OnMouseEnterEvent != null)
{
OnMouseEnterEvent(this, null);
}
}
}
else
{
if (m_isMouseInside)
{
m_isMouseInside = false;
if (OnMouseLeaveEvent != null)
{
OnMouseLeaveEvent(this, null);
}
}
}
drawArgs.device.RenderState.CullMode = Cull.None;
if (ShowHighlight)
renderHighlight(drawArgs);
RenderFlag(drawArgs, offset);
drawArgs.device.RenderState.CullMode = cull;
}
catch (Exception ex)
{
Log.Write(ex);
}
}
本系列其他部分:
WorldWind学习系列五:插件加载过程全解析
WorldWind学习系列四:功能分析——Show Planet Axis、Show Position 、Show Cross Hairs功能
WorldWind学习系列三:简单功能分析——主窗体的键盘监听处理及拷贝和粘贴位置坐标功能
WorldWind学习系列三:功能分析——截屏功能和“关于”窗体分析
WorldWind学习系列二:擒贼先擒王篇2
WorldWind学习系列二:擒贼先擒王篇1
WorldWind学习系列一:顺利起航篇
相关文章推荐
- WorldWind学习系列六:渲染过程解析篇
- WorldWind学习系列六:渲染过程解析篇
- WorldWind学习系列五:插件加载过程全解析
- WorldWind Java 版学习:5、贴地面渲染过程
- Caffe学习系列(10):命令行解析
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q118-Q120)
- Hadoop 学习总结之二:HDFS读写过程解析(转载)
- 浏览器的解析渲染过程
- 浏览器加载、解析、渲染的过程
- 【PSI/SI学习系列】2.PSI/SI深入学习3——SI信息解析2(SDT, EIT, TDT,TOT)——神文004
- Sharepoint学习笔记—习题系列--70-576习题解析 --索引目录
- 浏览器加载、渲染和解析过程的黑箱分析
- 了解html页面的渲染过程以备学习前端的性能优化
- Lucene学习总结之七:Lucene搜索过程解析(6)
- 基于Cocos2d-x学习OpenGL ES 2.0系列——OpenGL ES渲染之Shader准备(7)
- 【PSI/SI学习系列】2.PSI/SI深入学习2——PSI信息解析(PAT,PMT,CAT)
- BREW高手之路——解析BREW学习过程
- AutoCAD 二次开发学习系列【5】 - 开发过程中的问题整理