Saving and Loading Files
[
288 
]
The 
macro will define the prototype and inheritance rela瑩ons 
for a specified class. Similar to 
R
E
G
I
S
T
E
R
_
O
S
G
P
L
U
G
I
N
, it is actually a global variable, 
which registers the wrapper to the OSG registry object. When a dynamic library containing 
these wrappers is loaded, or the global variable is allocated in the executable segment of 
the applica瑩on, all of the wrappers will be immediately ready-to-use for the na瑩ve 
.
o
s
g
t
.
o
s
g
b
, and 
.
o
s
g
x
formats.
Pop quiz – understanding the inheritance relations
As we have implemented it, the 
E
x
a
m
p
l
e
N
o
d
e
class is derived from 
o
s
g
:
:
N
o
d
e
. According 
to the inheritance rela瑩ons, it must record all changed proper瑩es in its super classes and 
itself. But what will happen if we remove the string 
o
s
g
:
:
N
o
d
e
from the inheritance 
rela瑩ons string? Will the wrapper fail or lose its effec瑩veness? Or it will just miss some 
informa瑩on and s瑩ll work in most cases? Do you have any good ideas or test code to verify 
your answer?
Have a go hero – adding more serializers
Obviously, the 
A
D
D
_
U
I
N
T
_
S
E
R
I
A
L
I
Z
E
R
(
)
macro is used to call class methods to set or get 
an unsigned integer property. In fact, there are some more predefined serializers, including 
A
D
D
_
B
O
O
L
_
S
E
R
I
A
L
I
Z
E
R
(
)
A
D
D
_
F
L
O
A
T
_
S
E
R
I
A
L
I
Z
E
R
(
)
A
D
D
_
V
E
C
3
_
S
E
R
I
A
L
I
Z
E
R
(
)
and so on. To define enumera瑩on proper瑩es, the 
B
E
G
I
N
_
E
N
U
M
_
S
E
R
I
A
L
I
Z
E
R
(
)
A
D
D
_
E
N
U
M
_
V
A
L
U
E
(
)
, and 
E
N
D
_
E
N
U
M
_
S
E
R
I
A
L
I
Z
E
R
(
)
macros should be used to form a 
complete serializer. There is also an 
A
D
D
_
U
S
E
R
_
S
E
R
I
A
L
I
Z
E
R
(
)
macro that is used to design 
user-defined serializers. Any source files in the 
s
r
c
/
o
s
g
W
r
a
p
p
e
r
s
/
s
e
r
i
a
l
i
z
e
r
s
should 
be useful to learn about them, and the following link can also be used as a quick reference 
document: 
h
t
t
p
:
/
/
w
w
w
.
o
p
e
n
s
c
e
n
e
g
r
a
p
h
.
o
r
g
/
p
r
o
j
e
c
t
s
/
o
s
g
/
w
i
k
i
/
S
u
p
p
o
r
t
/
K
n
o
w
l
e
d
g
e
B
a
s
e
/
S
e
r
i
a
l
i
z
a
t
i
o
n
S
u
p
p
o
r
t
.
Now, let's try adding some more proper瑩es to the 
E
x
a
m
p
l
e
N
o
d
e
class, as well as the 
corresponding se瑴er and ge瑴er methods. Could you implement different serializers for 
addi瑩onal proper瑩es and make the class always serializable to OSG na瑩ve formats?
Pdf no pages selected - 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
break a pdf into multiple files; pdf format specification
Pdf no pages selected - 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
acrobat split pdf into multiple files; pdf specification
Chapter 10
[
289 
]
Summary
In this chapter, we mainly discussed about the file I/O mechanism, including the use of 
plugins and the chain-of-responsibility design pa瑴ern in OSG. The 
o
s
g
D
B
:
:
R
e
g
i
s
t
r
y
is the 
singleton class storing all of the reader-writers and wrappers which are linked in at run瑩me 
for reading na瑩ve and non-na瑩ve file formats. By the end of this chapter, we were able to 
understand how OSG plugins work, and how to implement a new plugin reading and wri瑩ng 
interface with user-defined subclasses of the 
o
s
g
D
B
:
:
R
e
a
d
e
r
W
r
i
t
e
r
base class.
In this chapter, we have learnt:
‹
How to load files of a specified extension, and searching for a specific plugin in the 
table provided
‹
How to understand the pseudo-loaders, and how to load files from the Internet, 
using the 
o
s
g
d
b
_
c
u
r
l
plugin
‹
Re-configuring the CMake build system to set third-party dependency op瑩ons for 
OSG plugins, which will enable related file formats to be readable or writable
‹
A basic way to construct the na瑩ve compiling tool-chain of OSG and third-party 
dependencies
‹
How to implement customized reader-writer interfaces from the 
o
s
g
D
B
:
:
R
e
a
d
e
r
W
r
i
t
e
r
base class
‹
How to design serializable classes for OSG na瑩ve formats
VB.NET TWAIN: TWAIN Image Scanning in Console Application
First, there is no SelectSourceDialog in VB.NET TWAIN console scanning application. image scanning SDK, like how to scan multiple pages to one PDF or TIFF
break pdf into pages; break pdf file into parts
VB.NET PowerPoint: Convert & Render PPT into PDF Document
VB.NET programmers can easily render selected PowerPoint slide our VB.NET PowerPoint to PDF conversion add pptx document file independently, no other external
c# print pdf to specific printer; break pdf into multiple pages
C# HTML5 PDF Viewer SDK deployment on IIS in .NET
the place where you store XDoc.PDF.HTML5 Viewer Bit Applications" in accordance with the selected DLL (x86 site configured in IIS has no sufficient authority
acrobat split pdf; combine pages of pdf documents into one
VB.NET PDF - VB.NET HTML5 PDF Viewer Deployment on IIS
the place where you store XDoc.PDF.HTML5 Viewer Bit Applications" in accordance with the selected DLL (x86 site configured in IIS has no sufficient authority
pdf split pages in half; can't select text in pdf file
11
Developing Visual Components
In the past 10 chapters, we have introduced the history and installa瑩on of OSG, 
and the concepts and tutorials of geometries, scene graph nodes, rendering 
states, cameras, anima瑩ons, interac瑩ons and the file I/O mechanism. However, 
there are s瑩ll many aspects of a complete 3D rendering API, including text 
display, par瑩cles, shadows, special effects, volume rendering, and a lot more 
modules that are collec瑩vely called NodeKits. It is impossible to explain all of 
them in this or any book, but it is worth showing you how to make use of some 
typical visual components and get the ball rolling by providing a list of prac瑩cal 
NodeKits at the end of this chapter.
In this chapter, we will learn:
‹
How to create geometries as billboards in the scene
‹
How to display 2D and 3D texts in the scene
‹
How to design a par瑩cle system and animate it
‹
How to cast shadows onto scene objects
‹
The theory and implementa瑩on of special effects
C# Image: Create C#.NET Windows Document Image Viewer | Online
C# Windows Document Image Viewer Features. No need for viewing multiple document & image formats (PDF, MS Word value of selected drop-down list to switch pages.
pdf split; break pdf into separate pages
VB.NET TIFF: .NET TIFF Printer Control; Print TIFF Using VB.NET
document printing add-on has no limitation on the function to print multiple TIFF pages by defining powerful & profession imaging controls, PDF document, image
break pdf documents; pdf split file
Developing Visual Components
[
292 
]
Creating billboards in a scene
In the 3D world, a billboard is a 2D image that is always facing a designated direc瑩on. 
Applica瑩ons can use billboard techniques to create many kinds of special effects, such as 
explosions, flares, sky, clouds, and trees. In fact, any object can be treated as a billboard 
with itself cached as the texture, while looking from a distance. Thus, the implementa瑩on of 
billboards becomes one of the most popular techniques, widely used in computer games and 
real-瑩me visual simula瑩on programs.
The 
o
s
g
:
:
B
i
l
l
B
o
a
r
d
class is used to represent a list of billboard objects in a 3D scene. It 
is derived from 
o
s
g
:
:
G
e
o
d
e
, and can orient all of its children (
o
s
g
:
:
D
r
a
w
a
b
l
e
objects) 
to face the viewer's viewpoint. It has an important method, 
s
e
t
M
o
d
e
(
)
, that is used to 
determine the rota瑩on behavior, which must set one of the following enumera瑩ons as the 
argument:
Enumera瑩on
Usage
P
O
I
N
T
_
R
O
T
_
E
Y
E
Set if all of the drawables are to be rotated about the viewer's posi瑩on 
with the object coordinate Z axis constrained to the window coordinate 
Y axis
P
O
I
N
T
_
R
O
T
_
W
O
R
L
D
Set if all of the drawables are to be rotated about the viewer directly 
from their original orienta瑩on to the current eye direc瑩on in the world 
space.
A
X
I
A
L
_
R
O
T
Set if all of the  drawables are to be rotated about an axis specified by 
s
e
t
A
x
i
s
(
)
.
Every drawable in the 
o
s
g
:
:
B
i
l
l
B
o
a
r
d
node should have a pivot point posi瑩on, which is 
specified via the overloaded 
a
d
d
D
r
a
w
a
b
l
e
(
)
method, for example:
All drawables also need a unified ini瑩al front face orienta瑩on, which is used for compu瑩ng 
rota瑩on values. The ini瑩al orienta瑩on is set by the 
s
e
t
N
o
r
m
a
l
(
)
method. And each 
newly-added drawable must ensure that its front face orienta瑩on is in the same direc瑩on  
as this normal value; otherwise the billboard results may be incorrect.
Time for action – creating banners facing you
The prerequisite for implemen瑩ng billboards in OSG is to create one or more quad 
geometries first. These quads are then managed by the 
o
s
g
:
:
B
i
l
l
B
o
a
r
d
class. This forces 
all child drawables to automa瑩cally rotate around a specified axis, or face the viewer. These 
can be done by prese瑴ng a unified normal value and rota瑩ng each billboard according to 
the normal and current rota瑩on axis or viewing vector.
VB.NET Word: Use VB.NET Code to Convert Word Document to TIFF
Render one or multiple selected DOCXPage instances into to TIFF image converting application, no external Word user guides with RasteEdge .NET PDF SDK using VB
break a pdf apart; pdf split pages
C# Word: C#.NET Word Rotator, How to Rotate and Reorient Word Page
Remarkably, no other external products, including Microsoft Office rotate all MS Word document pages by 90 & profession imaging controls, PDF document, image
break a pdf; acrobat split pdf pages
Chapter 11
[
293 
]
We will create two banks of OSG banners, arranged in a V, to demonstrate the use of 
billboards in OSG. No ma瑴er where the viewer is and how he manipulates the scene camera, 
the front faces of banners are facing the viewer all the 瑩me. This feature can then be used to 
represent textured trees and par瑩cles in user applica瑩ons.
1. 
Include the necessary headers:
2. 
Create the quad geometry directly from the 
o
m
e
t
r
y
(
)
func瑩on. Every generated quad is of the same size and origin point, 
and uses the same image file. Note that the 
o
s
g
2
5
6
.
p
n
g
file can be found in 
the data directory of your OSG installa瑩on path, but it requires the 
o
s
g
d
b
_
p
n
g
plugin for reading image data. Please refer to Chapter 10, Saving and Loading 
Files if you have any problems in configuring and compiling this plugin.
{
}
3. 
In the main entry, we first create the billboard node and set the mode to 
P
O
I
N
T
_
R
O
T
_
E
Y
E
. That is, the drawable will rotate to face the viewer and keep 
its Z axis upright in the rendering window. The default normal se瑴ng of the 
o
s
g
:
:
B
i
l
l
B
o
a
r
d
class is the nega瑩ve Y axis, so rota瑩ng it to the viewing 
vector will show the quads on the XOZ plane in the best appearance:
Developing Visual Components
[
294 
]
4. 
Now let's create the banner quads and arrange them in a V forma瑩on:
{
)
;
)
;
}
5. 
All quad textures' backgrounds are automa瑩cally cleared because of the alpha 
test, which is performed internally in the 
o
s
g
d
b
_
p
n
g
plugin. That means we have to 
set correct rendering order of all the drawables to ensure that the en瑩re process  
is working properly:
6. 
It's 瑩me for us to start the viewer, as there are no important steps le晴 to create 
and render billboards:
r
e
t
u
r
n
v
i
e
w
e
r
.
r
u
n
(
)
;
7. 
Try naviga瑩ng in the scene graph:
8. 
You will find that the billboard's children are always rota瑩ng to face the viewer, 
but the images' Y direc瑩ons are never changed (point to the window's Y coordinate  
all along). Replace the mode 
P
O
I
N
T
_
R
O
T
_
E
Y
E
to 
P
O
I
N
T
_
R
O
T
_
W
O
R
L
D
and see if 
there is any difference:
Chapter 11
[
295 
]
W
h
a
t
j
u
s
t
h
a
p
p
e
n
e
d
?
The basic usage of billboards in OSG scene graph is shown in this example. But it is s瑩ll 
possible to be further improved. All the banner geometries here are created with the 
c
r
e
a
t
e
Q
u
a
d
(
)
func瑩on, which means that the same quad and the same texture are 
reallocated at least 20 瑩mes! The object sharing mechanism is certainly an op瑩miza瑩on 
here. Unfortunately, it is not clever enough to add the same drawable object to 
o
s
g
:
:
B
i
l
l
b
o
a
r
d
with different posi瑩ons, which could cause the node to work improperly. 
What we could do is to create mul瑩ple quad geometries that share the same texture object. 
This will highly reduce the video card's texture memory occupancy and the rendering load.
Another possible issue is that somebody may require loaded nodes to be rendered as 
billboards, not only as drawables. A node can consist of different kinds of child nodes,  
and is much richer than a basic shape or geometry mesh. OSG also provides the 
o
s
g
:
:
A
u
t
o
T
r
a
n
s
f
o
r
m
class, which automa瑩cally rotates an object's children to be 
aligned with screen coordinates.
Developing Visual Components
[
296 
]
Have a go hero – planting massive trees on the ground
Billboards are widely used for simula瑩ng massive trees and plants. One or more tree pictures 
with transparent backgrounds are applied to quads of different sizes, and then added to 
the billboard node. These trees will automa瑩cally face the viewer, or to be more real, rotate 
about an axis as if its branches and leaves are always at the front. Now let's try to create 
some simple billboard trees. We only need to prepare an image nice enough (for instance, 
I
m
a
g
e
s
/
t
r
e
e
0
.
r
g
b
a
in the 
d
a
t
a
folder of the OpenSceneGraph prebuilts introduced in 
Chapter 2Compila瑩on and Installa瑩on of OpenSceneGraph), and follow the steps given for 
the previous example to create your own trees and plants.
Creating texts
Text is one of the most important components in all kinds of virtual reality programs. It 
is used everywhere—for displaying stats on the screen, labeling 3D objects, logging, and 
debugging. Texts always have at least one font to specify the typeface and quali瑩es, as well 
as other parameters, including size, alignment, layout (le晴-to-right or right-to-le晴), and 
resolu瑩on, to determine its display behaviors. OpenGL doesn't directly support the loading 
of fonts and displaying texts in 3D space, but OSG provides full support for rendering high 
quality texts and configuring different text a瑴ributes, which makes it much easier to develop 
related applica瑩ons.
The osgText library actually implements all font and text func瑩onali瑩es. It requires the 
o
s
g
d
b
_
f
r
e
e
t
y
p
e
plugin to work properly. This plugin can load and parse 
T
r
u
e
T
y
p
e
fonts with the help of FreeType, a famous third-party dependency. A晴er that, it returns an 
o
s
g
T
e
x
t
:
:
F
o
n
t
instance, which is made up of a complete set of texture glyphs. The en瑩re 
process can be described with the 
func瑩on.
The 
o
s
g
T
e
x
t
:
:
T
e
x
t
B
a
s
e
class is the pure base class of all OSG text types. It is derived from 
o
s
g
:
:
D
r
a
w
a
b
l
e
, but doesn't support display lists by default. Its subclass, 
o
s
g
T
e
x
t
:
:
T
e
x
t
is used to manage flat characters in the world coordinates. Important methods includes 
s
e
t
F
o
n
t
(
)
s
e
t
P
o
s
i
t
i
o
n
(
)
s
e
t
C
h
a
r
a
c
t
e
r
S
i
z
e
(
)
, and 
s
e
t
T
e
x
t
(
)
, each of which is 
easy to understand and use, as shown in the following example.
Chapter 11
[
297 
]
Time for action – writing descriptions for the Cessna
This 瑩me we are going to display a Cessna in the 3D space and provide descrip瑩ve texts in 
front of the rendered scene. A heads-up display (HUD) camera can be used here, which is 
rendered a晴er the main camera, and only clears the depth buffer for directly upda瑩ng texts 
to the frame buffer. The HUD camera will then render its child nodes in a way that is always 
visible.
1. 
Include the necessary headers:
2. 
The 
func瑩on is used for reading a suitable font 
file, for instance, an undistorted 
T
r
u
e
T
y
p
e
font. The OSG data paths (specified 
with 
O
S
G
_
F
I
L
E
_
P
A
T
H
) and the windows system path will be searched to see 
if the specified file exists:
3. 
Create a standard HUD camera and set a 2D orthographic projec瑩on 
matrix for the purpose of drawing 3D texts in two dimensions. The 
camera should not receive any user events, and should never be 
affected by any parent transforma瑩ons. These are guaranteed by the 
and 
s
e
t
R
e
f
e
r
e
n
c
e
F
r
a
m
e
(
)
methods:
{
}
Documents you may be interested
Documents you may be interested