asp.net c# view pdf : Break pdf into smaller files Library application component .net azure wpf mvc OpenSceneGraph.3.0.Beginners.Guide-320828-part877

Interac瑩ng with Outside Elements
[
258 
]
7. 
In the case of 
W
M
_
D
E
S
T
R
O
Y
, we have to force exi瑩ng the OSG rendering thread 
before releasing the window handle. The 
s
e
t
D
o
n
e
(
)
method tells OSG to stop all 
work and wait for the applica瑩on to quit. A 
S
l
e
e
p
(
)
method is good for handling 
mul瑩ple threads here, because it yields the current 瑩me slice to the rendering  
thread un瑩l it is finished:
c
a
s
e
W
M
_
D
E
S
T
R
O
Y
:
r
e
t
u
r
n
0
;
8. 
The rou瑩ne that begins execu瑩on of the extra rendering thread will only do one 
thing, that is, it will con瑩nue rendering new frames un瑩l the viewer is told to stop:
v
o
i
d
r
e
n
d
e
r
(
v
o
i
d
*
)
{
}
9. 
Now start the applica瑩on. You will see the Cessna model appearing in a new 
window. The 
r
u
n
(
)
method of 
o
s
g
V
i
e
w
e
r
:
:
V
i
e
w
e
r
is not used directly, but 
a separate rendering thread is used to draw OSG scene graph to the graphics 
context of the window. Of course, the 
W
M
_
T
I
M
E
R
message is also available for 
advancing frames con瑩nuously, if the 瑩me interval is short enough for simula瑩ng  
an ac瑩ve 3D world:
Break pdf into smaller files - Split, seperate PDF into multiple files in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Explain How to Split PDF Document in Visual C#.NET Application
pdf file specification; break a pdf
Break pdf into smaller files - VB.NET PDF File Split Library: Split, seperate PDF into multiple files in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
VB.NET PDF Document Splitter Control to Disassemble PDF Document
split pdf into individual pages; pdf split pages in half
Chapter 9
[
259 
]
W
h
a
t
j
u
s
t
h
a
p
p
e
n
e
d
?
Almost all kinds of opera瑩ng systems supply func瑩onali瑩es for specifying the 
rendering contexts of OpenGL-based applica瑩ons. Under the Windows systems, WGL 
(Windows GL) func瑩ons are used to bring related Windows API support into OpenGL, 
such as 
w
g
l
C
r
e
a
t
e
C
o
n
t
e
x
t
(
)
and 
w
g
l
M
a
k
e
C
u
r
r
e
n
t
(
)
. Developers should first 
create and set up the handle to a GDI-like rendering context, and execute OpenGL 
calls only when the current context is enabled. All of the above are encapsulated in 
the internal 
class. Similarly, there are also 
G
r
a
p
h
i
c
s
W
i
n
d
o
w
X
1
1
G
r
a
p
h
i
c
s
W
i
n
d
o
w
C
a
r
b
o
n
, and 
G
r
a
p
h
i
c
s
W
i
n
d
o
w
C
o
c
o
a
classes 
for different opera瑩ng systems, which liberates OSG programmers from maintaining the 
portability of their applica瑩ons, especially in cross-pla瑦orm GUI systems like Qt.
In other pla瑦orm-dependant GUI systems like MFC, the most important step to follow is to 
obtain and a瑴ach the window handle (HWND) to the traits of the graphic's contexts. This can 
be always acquired from 
C
W
N
D
objects with the 
G
e
t
S
a
f
e
H
w
n
d
(
)
method. It is also smart to 
use a separate thread for rendering frames, if the GUI system permits this.
Interac瑩ng with Outside Elements
[
260 
]
Have a go hero – embedding into GUI systems
There is a special graphics context in OSG, named 
o
s
g
V
i
e
w
e
r
:
:
G
r
a
p
h
i
c
s
W
i
n
d
o
w
E
m
b
e
d
d
e
d
It assumes that the window containing the graphic's context can support OpenGL without 
any other opera瑩ons (like making rendering context current, and so on). In this case, we can 
allocate a new embedded graphics window directly and a瑴ach it to the camera, as follows:
Then we have to draw frames at a certain frequency when the GUI is running, and send 
keyboard and mouse events to the event queue of the graphics context all the 瑩me, for 
example:
A good GUI for tes瑩ng the embedded graphic's contexts is the GLUT library, which supports 
OpenGL calls directly. Try implemen瑩ng OSG and GLUT integra瑩on with the 
o
s
g
V
i
e
w
e
r
class. The 
o
s
g
v
i
e
w
e
r
G
L
U
T
example in the 
e
x
a
m
p
l
e
s
subdirectory can also help a lot.
For your informa瑩on, OSG now implements integra瑩on with GUI systems including Qt, MFC, 
wxWidgets, GTK, SDL, GLUT, FLTK, FOX, and Cocoa. You can find all of the implementa瑩ons in 
the 
e
x
a
m
p
l
e
s
folder of the OSG source code.
Summary
This chapter taught us how users can interact with the 3D scene using OSG's GUI event 
adapters and handlers. Events of different windowing systems under different pla瑦orms  
are translated into a compa瑩ble interface named 
.
We also introduced a common solu瑩on for integra瑩ng OSG scene graph with a 2D windowing 
system. The key element here is to create the graphic's context with the appropriate window 
traits, including the size, display se瑴ngs, and window handle arguments.
In this chapter, we specifically covered:
‹
Handling ordinary user events with the 
class, 
which uses an 
to pass in events, and an 
to receive further requests (actually, a viewer 
object in most cases).
‹
The customiza瑩on and emi瑴ng of user-defined GUI events using 
o
s
g
G
A
:
:
E
v
e
n
t
Q
u
e
u
e
.
Chapter 9
[
261 
]
‹
Intersec瑩on tests of scene objects with the 
visitor, and operators like 
.
‹
How to set up the traits of the to-be-rendered window using 
.
‹
Embedding the graphic context for rendering scenes into a windowing system, 
for example, a Win32 API window handler. More examples can be found in the 
e
x
a
m
p
l
e
s
folder of the source code.
10
Saving and Loading Files
One of the more important concepts in programming is the ability to store 
informa瑩on a晴er the program has terminated. This has many advantages, such 
as a small executable size, easy to implement modularity, and the ability of the 
program remember different user informa瑩on.
The osgDB library provides support for reading and wri瑩ng the scene graph 
nodes, images and other objects. It also implements a plugin framework and 
file I/O u瑩lity classes. It allows various file formats, including the OSG na瑩ve 
formats that wrap up the en瑩re scene graph elements into text or binary files, 
to be dynamically loaded, on demand.
In this chapter, we will discuss:
• The file I/O mechanism implemented in OSG
• A complete list of presently-supported file formats, including models, images,  
fonts, and so on
• The concept and usage of OSG's pseudo-loaders
• How to customize OSG plugin interface and provide support for user-defined 
formats
• How to create class wrappers for suppor瑩ng serialized I/O of the OSG na瑩ve formats
Saving and Loading Files
[
264 
]
Understanding file I/O plugins
We have already learnt a li瑴le about the plugin mechanism of reading and wri瑩ng data files, 
in Chapter 2, Compila瑩on and Installa瑩on of OpenSceneGraph. With the help of specific 
format-managing plugins, OSG can load various models, images, fonts, and even video data 
from external files. A plugin here is a separate func瑩onality component that customizes 
the supported file formats of an OSG-based applica瑩on. It is recognized as a shared library 
file implemen瑩ng the necessary reading or wri瑩ng interface (or both). Different plugins are 
always required by user applica瑩ons to load and construct large and complex scene graphs 
without too much programming work.
All file I/O plugins conform to the same naming conven瑩on; otherwise they are not 
recognizable and can't be used to read files. Take the na瑩ve 
.
o
s
g
file format as an example: 
under the Windows system, the plugin library file is 
o
s
g
d
b
_
o
s
g
.
d
l
l
. Under Linux, it is 
named 
o
s
g
d
b
_
o
s
g
.
s
o
. Both have the prefix 
o
s
g
d
b
_
and the following name usually 
represents the file extension.
However, a plugin may support mul瑩ple extensions. For instance, the JPEG image format 
uses 
.
j
p
e
g
and 
.
j
p
g
as the most common file extensions. There are no essen瑩al 
differences between them, so a unified 
o
s
g
d
b
_
j
p
e
g
plugin should be enough to input and 
output files with either of these extensions. Fortunately, the osgDB library can support such 
kinds of plugins with an internal extension-to-handler map, which will be introduced later.
A晴er the file I/O plugins are prepared and placed at loca瑩ons at which they can be 
referenced, we can read OSG scene nodes or images with the osgDB namespace 
func瑩ons below:
As we just discussed, OSG will automa瑩cally look for plugin library files named 
o
s
g
d
b
_
o
s
g
and 
o
s
g
d
b
_
r
g
b
and read these two files from the hard disk. The required data files should 
exist in specified rela瑩ve or absolute paths, or in the OSG search path defined by the 
environment variable 
O
S
G
_
F
I
L
E
_
P
A
T
H
.
Chapter 10
[
265 
]
Discovery of specified extension
The basic principles of searching and loca瑩ng a plugin for the handling of a specified file type 
can be described in two steps:
Firstly, OSG manages a commonly-used plugin list in the 
o
s
g
D
B
:
:
R
e
g
i
s
t
r
y
class. This class 
is designed as a singleton and can be only instan瑩ated and obtained with the 
i
n
s
t
a
n
c
e
(
)
method. The protected plugin list of the osgDB registry can help quickly find and call the 
corresponding reading or wri瑩ng entries of the required format, based on the chain-of-
responsibility design pa瑴ern. This means that each plugin object, called a reader-writer in OSG, 
will try to process the extension of the input file, and pass it off to the next plugin in the list if 
the extension is unrecognizable to that plugin.
In case all prestored reader-writers fail to handle the file extension, OSG will use the 
extension as a keyword to find and load a plugin from an external shared module, that is, the 
o
s
g
d
b
_
<
e
x
t
>
library file. Here, 
<
e
x
t
>
represents the extension string, but the extension-
to-handler map is also used here to decide the rela瑩onship between the extension and the 
special plugin library name. For example, we can define the rela瑩on of the extension string 
and plugin name with the 
method:
Calling these two lines before any other reading or wri瑩ng opera瑩ons will automa瑩cally link 
both 
*
.
j
p
e
g
and 
*
.
j
p
g
files to the 
o
s
g
d
b
_
j
p
e
g
library file, which is dynamically loaded 
when such types of files are required for use.
Note that we don't have to add such aliases for the JPEG support, because it is already 
embedded when the registry object is being ini瑩alized. Other OSG predefined plugins  
that support mul瑩ple file formats will be listed in the table in the following sec瑩on.
Saving and Loading Files
[
266 
]
Supported file formats
Here, we would like to list all of the supported plugins in OSG 3.0. Some of these require 
third-party dependencies, which are shown in the Notes column. The Interface property 
iden瑩fies whether a plugin supports the reading (R) or wri瑩ng (W) interface. The ellipsis in 
the Extensions column signals whether the plugin supports addi瑩onal file formats. More 
details can also be found in the 
s
r
c
/
o
s
g
P
l
u
g
i
n
s
directory of the source code.
Plugin name
Extensions
Interface
Requirements
o
s
g
d
b
_
3
d
c
(3DC Point cloud)
*
.
3
d
c
*
.
a
s
c
R/W
-
o
s
g
d
b
_
3
d
s
(Autodesk 3DS)
*
.
3
d
s
R/W
-
o
s
g
d
b
_
a
c
(AC3D)
*
.
a
c
R/W
-
o
s
g
d
b
_
b
m
p
(Windows Bitmap)
*
.
b
m
p
R/W
-
o
s
g
d
b
_
b
s
p
(Valve BSP)
*
.
b
s
p
R
-
o
s
g
d
b
_
b
v
h
(Biovision Mo瑩on)
*
.
b
v
h
R
-
o
s
g
d
b
_
c
u
r
l
(Web data with URL)
*
.
c
u
r
l
(pseudo-loader)
R
Needs libcurl (
h
t
t
p
:
/
/
c
u
r
l
.
h
a
x
x
.
s
e
)
o
s
g
d
b
_
d
a
e
(COLLADA DOM)
*
.
d
a
e
R/W
Needs COLLADA (
h
t
t
p
:
/
/
c
o
l
l
a
d
a
.
o
r
g
)
o
s
g
d
b
_
d
d
s
(DirectDraw Surface)
*
.
d
d
s
R/W
-
o
s
g
d
b
_
d
i
c
o
m
(NEMA DICOM)
*
.
d
i
c
o
m
,
*
.
d
c
m
,
R
Needs DCMTK (
h
t
t
p
:
/
/
d
i
c
o
m
.
o
f
f
i
s
.
d
e
/
d
c
m
t
k
or ITK (
h
t
t
p
:
/
/
w
w
w
.
i
t
k
.
o
r
g
)
o
s
g
d
b
_
d
i
r
e
c
t
s
h
o
w
(DirectShow)
*
.
a
v
i
,
*
.
w
m
v
,
R
Needs DirectX SDK (
h
t
t
p
:
/
/
m
s
d
n
.
m
i
c
r
o
s
o
f
t
.
c
o
m
/
e
n
-
u
s
/
d
i
r
e
c
t
x
)
o
s
g
d
b
_
d
o
t
(DOT graph)
*
.
d
o
t
W
Needs Graphviz (
h
t
t
p
:
/
/
w
w
w
.
g
r
a
p
h
v
i
z
.
o
r
g
/
)
o
s
g
d
b
_
d
w
(Designer Workbench)
*
.
d
w
R
-
Chapter 10
[
267 
]
Plugin name
Extensions
Interface
Requirements
o
s
g
d
b
_
d
x
f
(Autodesk DXF)
*
.
d
x
f
R/W
-
o
s
g
d
b
_
e
x
r
(ILM OpenEXR)
*
.
e
x
r
R
Needs OpenEXR (
h
t
t
p
:
/
/
w
w
w
.
o
p
e
n
e
x
r
.
c
o
m
)
o
s
g
d
b
_
f
b
x
(Autodesk FBX)
*
.
f
b
x
R/W
Needs Autodesk FBX SDK 
(
c
o
m
/
f
b
x
)
o
s
g
d
b
_
f
f
m
p
e
g
(FFmpeg)
*
.
f
f
m
p
e
g
(pseudo-loader)
R
Needs FFmpeg (
h
t
t
p
:
/
/
w
w
w
.
f
f
m
p
e
g
.
o
r
g
)
o
s
g
d
b
_
f
r
e
e
t
y
p
e
(FreeType)
*
.
t
t
f
*
.
t
t
c
,
R
Needs FreeType (
h
t
t
p
:
/
/
w
w
w
.
f
r
e
e
t
y
p
e
.
o
r
g
)
o
s
g
d
b
_
g
d
a
l
(GDAL)
*
.
g
d
a
l
(pseudo-loader)
R
Needs GDAL (
h
t
t
p
:
/
/
w
w
w
.
g
d
a
l
.
o
r
g
)
o
s
g
d
b
_
g
e
o
(Carbon Graphics)
*
.
g
e
m
*
.
g
e
o
R
-
o
s
g
d
b
_
g
e
c
k
o
(Mozilla Gecko)
*
.
g
e
c
k
o
R
Needs XULRunner (
h
t
t
p
s
:
/
/
d
e
v
e
l
o
p
e
r
.
m
o
z
i
l
l
a
.
o
r
g
/
e
n
/
X
U
L
R
u
n
n
e
r
)
o
s
g
d
b
_
g
i
f
(Graphics Interchange 
format)
*
.
g
i
f
R
Needs libungif (
h
t
t
p
:
/
/
s
o
u
r
c
e
f
o
r
g
e
.
n
e
t
/
p
r
o
j
e
c
t
s
/
l
i
b
u
n
g
i
f
)
o
s
g
d
b
_
h
d
r
(Radiance HDR)
*
.
h
d
r
R/W
-
o
s
g
d
b
_
i
m
a
g
e
i
o
(Mac OS X ImageIO)
*
.
b
m
p
,
*
.
j
p
g
,
R/W
Available only under Mac OS X
o
s
g
d
b
_
i
v
(Inventor)
*
.
i
v
*
.
w
r
l
R/W
Needs OpenInventor 
(
h
t
t
p
:
/
/
o
s
s
.
s
g
i
.
c
o
m
/
p
r
o
j
e
c
t
s
/
i
n
v
e
n
t
o
r
) or 
Coin3D (
w
w
w
.
c
o
i
n
3
d
.
o
r
g
)
o
s
g
d
b
_
i
v
e
(OSG binary format, 
deprecated)
*
.
i
v
e
R/W
-
o
s
g
d
b
_
j
p
2
(JPEG 2000)
*
.
j
p
2
*
.
j
p
c
R/W
Needs JasPer (
h
t
t
p
:
/
/
w
w
w
.
j
a
s
p
e
r
)
Documents you may be interested
Documents you may be interested