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
的显示模块。
/* 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
的显示模块。
相关文章推荐
- OpenCascade的显示模块中visual3d层实现
- jQuery实现左侧导航模块的显示与隐藏效果
- OpenGL: OpenGL下实现图片满屏显示
- 通过opengl来实现yuv的显示
- OpenCascade的显示模块中显示管理层
- opengl中实现MIF文件按某一字段3维显示
- jQuery实现web页面区域模块 隐藏显示
- 实现首页框架的tab签,点击模块在首页添加tab签之后,同时显示其对应的页面
- OpenCascade的显示模块(visualization模块)概要说明
- OpenGL立体显示实现
- QT 实现在一个模块中间显示一个红色提示框,3秒后消失
- WIN32 实现OPenGL显示源码
- 第二人生的源码分析(八十五)LLView实现OpenGL窗口显示
- Servlet+JSP+MySQL实现用户管理模块之四、实现用户列表显示
- 基于OpenGL的三维曲面动态显示实现
- QT-opengl实现点云读取和显示
- listview的Adapter使用布局实现消息模块左右两边消息的显示布局遇到的问题
- 二、实现从一页面跳转到指定模块的位置,并将该模块在主区域中显示出来
- OpenGL下实现图片满屏显示
- 第二人生的源码分析(八十五)LLView实现OpenGL窗口显示