您的位置:首页 > 运维架构

OpenCascade显示模块的OpenGL层的实现

2009-07-28 21:12 141 查看
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"/@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->

OpenGL
层是最低层
,
实现了上面层准备好的数据的绘制工作
,
主要通过
OpenGL
的相关功能来实现
.
其实现代码主要在
OpenGL
目录下
.
当拓扑或几何对象传人显示模块
,
要进行显示时
,
上面几层对曲线
/
曲面进行了剖分
,
生成了三角剖分数据
,
并且设置了显示的视图信息
,
设置了一些颜色、字体等相关显示属性,最终的显示将通过
OpenGL
层调用对应的
OpenGL
功能来绘制出来。

       OpenGL
层本身也可以大致分为细小的层,首先,对外提供了一个封装类
OpenGL_GraphicDriver
类,封装了几乎所有的低层功能,提供了比较方便的接口供上层调用。下面是
OpenGL_togl_*
的文件,可以认为是对低层的又一层封装,其功能实现主要是调用低层的功能,而上面类的实现也主要调用该层的函数(
togl = top gl ?
)。下面一层是
OpenGL_*.H

OpenGL_*.C
的文件应当是最低层的功能实现了,实现了最终的
GL
功能。

      
在最底层,
OpenGL_cmn_*
文件,实现了一套简单但有效的内存管理机制,用于固定大小内存块的管理,包括一个
table
结构和一个
hashtable
结构,是存储图形显示数据的主要数据结构。
Table
负责多个固定大小内存块的分配和释放,而
hashtable
中则记录了上层传下的数据结构的指针,不同类型的数据有不同的
table

hashtable


      
目前定义了三个
hashtable
的变量:

       stid_tbl(OpenGL_tsm.c):hash
table for stid vs structure ptr,
保存了图形显示
tsm_struct
结构指针,
key

stid
,即
struct

id


       Ws_htbl(OpenGL_ws.c):
记录了
wsid
的信息,即窗口
id
的信息。
Key

id
,值为
0.

Txgltbl:
(OpenGL_txgl.c):
记录了
GLContext
的信息。
Key
:是
window
,数据是:
GLContext
句柄。

      
重点关注一下
stid_tbl
。这里
key

id
,值为
tsm_struct
的指针。

这里
tsm_struct
结构如下:

/* A Structure
having fixed header and array of elements */

typedef  struct 
TSM_STRUCT_STRUCT

{

    TSM_HEAD 
header;

    Tint     
alloc;           /* number of
elements that can be accomodated */

    TSM_ELEM 
elem[1];

} TSM_STRUCT,
*tsm_struct;//
当为数组形式的存放。

      
是一个
TSM_ELEM
的数组,
alloc
是个数。而
TSM_ELEM
结构如下:

       typedef  union 
TSM_ELEM_DATA_UNION

       {

           void     
*pdata;

           Tint      
ldata;

} TSM_ELEM_DATA,
*tsm_elem_data;//
保存任何类型的数据。

 

typedef  struct 
TSM_ELEM_STRUCT

{

           TelType        el;//
类型,

           TSM_ELEM_DATA  data;//
相应的数据

} TSM_ELEM,
*tsm_elem;//
基本元素,保存了类型和数据。主要为参数。

为各个类型的数据,保存其对应的数据。这些数据可能包括很多类型,单是
TelType
的枚举就有很多的类型。通过这些表和各种的
teltype
类型,记录了不同类型的显示数据信息,供
openGL
绘制时使用。

      
而和此相关的文件
OpenGL_tsm.c
就是底层比较核心的实现了,它记录了所有类型数据的操作函数:添加、显示、删除等,并根据传入的数据类型和数据调用相应的函数进行相应的操作,记录新添加的数据、修改已有的数据。采用了类似消息分发的机制,每种类型的数据根据共同的几种操作(消息)注册各自对应的处理函数,上层根据数据类型和操作类型,查找到对应的处理函数,调用该函数进行处理。

      
其中,
OpenGL_txgl.c
中实现窗口和
HGLRC
句柄的绑定功能及其相应的管理功能,
OpenGL_view.c
中实现了视图相关功能,包括:模型矩阵、投影机制的管理和计算等。而
OpenGL_togl_redraw.c
中实现了整个的绘制过程,可以参考代码的实现。

      
最后,关注一下两个类:
Device
类和
Driver
类。

      
先看
GraphicDevice
类,继承类如下:

Aspect_GraphicDevice

      
――
Xw_GraphicDevice

      
――――
Graphic3d_GraphicDevice

      
――
WNT_GraphicDevice

      
――――
Graphic3d_WNTGraphicDevice

      
由于是跨平台支持,因此这里支持两种平台,对
windows
平台来说,显然是下面两个
WNT
类。

WNT_GrpahicDevice
类,主要进行颜色管理(
A Graphic Device defines
color management
)。可以在三种不同的
color
model
下运行:高分辨率、中分辨率、低分辨率。也定义了屏幕的物理大小。

Graphic3d_WNTGraphicDevice
类是最终的实现类,主要是具有一个
graphicDriver
属性,并加载和初始化该
GraphicDriver
。在这里,就是动态加载
TkOpengl.dll
动态库,以允许
OpenGL
层的功能可以使用。因而,关联的
Driver
是基于
OpenGL

Driver


 

再来看
GraphicDriver
类,继承树如下:

Aspect_GraphicDriver

――
Graphic3d_GraphicDriver

――――
OpenGl_GraphicDriver

而最终的
OpenGL_GraphicDriver
类就是底层
OpenGL
层的接口,因此是底层
OpenGL
层的封装类。该类拥有丰富的功能和接口,实现了底层显示的全部功能。其和显示图元相关接口有:

Polygon
:显示多边形

PolygonHoles
:带洞的多边形。

Polyline:
多段线。主要用于曲线的显示

QuadrangleMesh


QuadrangleSet
:四边形集合。

Text
:文本显示

TriangleMesh:

TriangleSet:
三角形的集合
.

PrimitiveArray:
允许添加各种图元的集合数据到
openGL
层。

 

显示模块的模型数据添加看来有两种实现方法,原来的方法是基于不同图元不同接口的方法,例如:多段线是多段线的接口函数、三角面片有其独立的接口函数等,新的实现方法,主要是采用
PrimitiveArray
方法,可以添加多种图元。在具体显示图元时,新方法允许使用顶点数组的方法显示,提高显示效率。从代码中容易看出这一点。

关于这些图元绘制接口,主要在
Graphic3d_Group
中调用,
Group
又对这些调用添加了一层封装。

当然还有其他很多接口,比如和视图有关的接口等。

上述这些图元接口,将图元数据添加到
OpenGL
层,并记录到对应的
hashtable
中,以便绘制时显示。基本上,数据(比如:三角面片数组、
vertex
数组等)在显示模块的生层都组织好了,记录到最低层
OpenGL
层,供绘制使用,各种显示数据的生成、内存分配、组织等都在
openGL
层之上进行了。

总之,
OpenCascade
的显示模块是一个相对比较简单的显示模块,但对于常用的显示功能,基本上够用了,适用于快速模型的开发,内部程序开发等,但拿来做大的商品软件开发,功能似乎还比较欠缺,例如:即使开源软件
FreeCad
的显示功能,也没有采用
OpenCascade
的显示模块。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息