Interac瑩ng with Outside Elements
[
238 
]
Pop quiz – handling events within nodes
Similar to update callbacks, OSG also allows event callbacks to be set to nodes and 
drawables, using the 
s
e
t
E
v
e
n
t
C
a
l
l
b
a
c
k
(
)
and 
a
d
d
E
v
e
n
t
C
a
l
l
b
a
c
k
(
)
methods, both 
of which accept an 
o
s
g
:
:
N
o
d
e
C
a
l
l
b
a
c
k
pointer as the unique parameter. To obtain the 
event variable in the overrode 
o
p
e
r
a
t
o
r
(
)
, we can just convert the node visitor to an 
o
s
g
:
:
E
v
e
n
t
V
i
s
i
t
o
r
pointer:
{
}
Can you tell the major difference between using node callbacks and event handlers?  
Is it be瑴er to reproduce this example using a customized event callback on the 
transforma瑩on node?
Have a go hero – manipulating the cameras
Believe it or not, the 
class also has a virtual method named 
h
a
n
d
l
e
(
)
. This is actually derived from the 
, but is not 
suitable for adding to the viewer with the 
a
d
d
E
v
e
n
t
H
a
n
d
l
e
r
(
)
method. It navigates the 
main camera by calling the 
g
e
t
I
n
v
e
r
s
e
M
a
t
r
i
x
(
)
virtual method, which computes the 
inverse transforma瑩on matrix of the manipulator, that is, the view matrix, and set it to the 
main camera with the 
s
e
t
V
i
e
w
M
a
t
r
i
x
(
)
method during the update traversal. All OSG 
manipulators, including user customized ones, should override this method to make sure 
that they work properly.
The 
class also provides the 
s
e
t
B
y
M
a
t
r
i
x
(
)
and 
g
e
t
M
a
t
r
i
x
(
)
virtual methods which can be overridden to specify or obtain the 
transforma瑩on matrix. Try rewri瑩ng all of these methods to produce your own camera 
manipulators. The standard manipulators, including 
among others, can be very good references for this ac瑩vity.
Combine pages of pdf documents into one - 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 apart a pdf; break pdf into pages
Combine pages of pdf documents into one - 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
break up pdf file; c# split pdf
Chapter 9
[
239 
]
Adding customized events
OSG uses an internal event queue to manage coming GUI events in a first in first out (FIFO) 
list. Events at the beginning will be handled first and then erased from the list. That is, 
the 
h
a
n
d
l
e
(
)
method of each added event handler will be executed as many 瑩mes as 
the size of the event queue. The event queue class, named 
o
s
g
G
A
:
:
E
v
e
n
t
Q
u
e
u
e
, allows 
new events to be pushed in with the 
a
d
d
E
v
e
n
t
(
)
method at any 瑩me. Its argument is an 
pointer, which uses se瑴ng methods like 
s
e
t
E
v
e
n
t
T
y
p
e
(
)
and 
s
e
t
B
u
t
t
o
n
(
)
to define its behavior.
There are some addi瑩onal methods of the 
o
s
g
G
A
:
:
E
v
e
n
t
Q
u
e
u
e
class that can be used 
to quickly set and add new GUI events. One of them is the 
u
s
e
r
E
v
e
n
t
(
)
method, which 
adapts user-defined events with a user data pointer as the argument. This user data can be 
used to represent any kind of customized event, for instance, the 瑩mer event described in 
the following sec瑩on.
It is of no use to create a completely new event queue object. The viewer class has already 
defined one to operate on:
Here, the variable 
d
a
t
a
is an object derived from 
o
s
g
:
:
R
e
f
e
r
e
n
c
e
d
. A晴er adding this new 
event, the event handler will receive a 
U
S
E
R
event and developers can then read from the 
g
e
t
U
s
e
r
D
a
t
a
(
)
method of the handler and do anything they want.
Time for action – creating a user timer
A 瑩mer event is emi瑴ed whenever the internal counter reaches a specified interval. This 
is common in various GUI systems, and allows users to set a customized 瑩mer callback to 
receive the 瑩ming message and implement related opera瑩ons.
Now we are able to realize the same work in OSG. As there are no standard 瑩mer events 
defined in the 
class, we have to make use of the 
U
S
E
R
event 
type, as well as an addi瑩onal data pointer.
1. 
Include the necessary headers:
#
i
n
c
l
u
d
e
<
i
o
s
t
r
e
a
m
>
C# PDF File Merge Library: Merge, append PDF files in C#.net, ASP.
Free online C#.NET source code for combining multiple PDF pages together in .NET framework. You may also combine more PDF documents together.
combine pages of pdf documents into one; break pdf documents
VB.NET PDF File Merge Library: Merge, append PDF files in vb.net
NET. Batch merge PDF documents in Visual Basic .NET class program. NET. Combine multiple specified PDF pages in into single one file. Able
break apart a pdf file; break pdf password
Interac瑩ng with Outside Elements
[
240 
]
2. 
T
i
m
e
r
I
n
f
o
structure is first defined to manage the parameters (mainly 
the trigger 瑩me of the 瑩mer) of the 瑩mer event. We have to a瑴ach this 
o
s
g
:
:
R
e
f
e
r
e
n
c
e
d
derived pointer to the 
u
s
e
r
E
v
e
n
t
(
)
method, because it 
is the only element for dis瑩nguishing between different customized events:
{
}
;
3. 
The 
T
i
m
e
r
H
a
n
d
l
e
r
is used for both processing the 瑩mer object and handling 
瑩mer events. We would like to switch between normal and afire states of a 
Cessna model every 瑩me we receive such an event. In Chapter 5, Managing 
Scene Graph and Chapter 8Anima瑩ng Scene Object, this is done by customizing 
the 
o
s
g
:
:
N
o
d
e
class and the update callback. But this 瑩me we will try using 
the event handler with an input 
o
s
g
:
:
S
w
i
t
c
h
pointer as the argument:
{
p
u
b
l
i
c
:
 protected:
}
;
4. 
There are two kinds of events to handle in the overrode 
h
a
n
d
l
e
(
)
method. 
The 
F
R
A
M
E
event is automa瑩cally emi瑴ed with every frame and can be 
used to manage and increase an internal counter, and send 
u
s
e
r
E
v
e
n
t
(
)
to the event queue when 瑩me is ripe. In this example, we assume that the 
瑩mer event is emi瑴ed every 100 counts. The other one is the 
U
S
E
R
event, 
which doesn't contain any informa瑩on except a 
T
i
m
e
r
I
n
f
o
object as the 
"user data" to indicate the 瑩mer and its counts. Here, we will print the count 
number and switch between child nodes of the variable 
_
s
w
i
t
c
h
:
{
{
C# PowerPoint - Merge PowerPoint Documents in C#.NET
into One Using C#. This part illustrates how to combine three PowerPoint files into a new file in C# application. You may also combine more PowerPoint documents
break a pdf password; acrobat split pdf into multiple files
C# Word - Merge Word Documents in C#.NET
into One Using C#. This part illustrates how to combine three Word files into a new file in C# application. You may also combine more Word documents together.
split pdf files; pdf no pages selected
Chapter 9
[
241 
]
{
{
}
}
_
c
o
u
n
t
+
+
;
b
r
e
a
k
;
{
)
;
}
b
r
e
a
k
;
d
e
f
a
u
l
t
:
b
r
e
a
k
;
 }   return false;
}
5. 
In the main func瑩on, we simply create the switch node, which contains a normal 
Cessna model and an afire one:
o
s
g
"
)
;
C# PDF: C#.NET PDF Document Merging & Splitting Control SDK
List<BaseDocument> docList, String destFilePath) { PDFDocument.Combine(docList, destFilePath and the rest five pages will be C#.NET APIs to Divide PDF File into
can print pdf no pages selected; can't cut and paste from pdf
VB.NET TIFF: Merge and Split TIFF Documents with RasterEdge .NET
create a new TIFF document from the source pages. docList As [String]()) TIFFDocument.Combine(filePath, docList & profession imaging controls, PDF document,
c# print pdf to specific printer; break pdf into multiple files
Interac瑩ng with Outside Elements
[
242 
]
6. 
Add the 瑩mer event sender and handler to the viewer, and start it:
r
e
t
u
r
n
v
i
e
w
e
r
.
r
u
n
(
)
;
7. 
As we have seen for 瑩mes, the Cessna is alterna瑩ng between intact and afire. 
In addi瑩on, there are messages appearing on the console screen, which tell us  
when the 瑩mer is trigged:
W
h
a
t
j
u
s
t
h
a
p
p
e
n
e
d
?
We made use of the 
F
R
A
M
E
event here to check and emit user events to the event queue. 
This leads to an architecture that is a li瑴le weird: the event sender and the receiver is the 
same 
T
i
m
e
H
a
n
d
l
e
r
class. This is similar to the postman and the addressee being the same 
person!
In fact, we can easily avoid this problem. The occasion to emit a user event is determined 
every frame. A new user event can be added to the event queue at any 瑩me in an update or 
cull traversal. That is, callbacks, customized nodes,and drawables can all be used as an event 
sender, rather than the event handler itself. This makes it possible to obtain and handle 
complex events like joys瑩cks and data gloves. Declare a structure named 
J
o
y
S
t
i
c
k
I
n
f
o
or 
D
a
t
a
G
l
o
v
e
I
n
f
o
with the necessary informa瑩on, set its a瑴ributes, emit user events with 
the instance of the structure in an update callback, and handle user events in the handler. 
That is all we need to make the user event mechanism work.
VB.NET PowerPoint: Merge and Split PowerPoint Document(s) with PPT
Just like we need to combine PPT files, sometimes, we also the split PPT document will contain slides/pages 1-4 If you want to see more PDF processing functions
break a pdf file into parts; break apart pdf
VB.NET Word: Merge Multiple Word Files & Split Word Document
destnPath As [String]) DOCXDocument.Combine(docList, destnPath and encode created sub-documents into stream or profession imaging controls, PDF document, image
pdf format specification; split pdf by bookmark
Chapter 9
[
243 
]
Pop quiz – global and node-related events
We have already demonstrated two kinds of event handlers in the last two examples: the 
M
o
d
e
l
C
o
n
t
r
o
l
l
e
r
, which controls a node's orienta瑩ons, and the 
T
i
m
e
r
H
a
n
d
l
e
r
, which 
simulates 瑩mer events. So, con瑩nue our discussion and quiz: do you think an event callback 
is suitable for re-implemen瑩ng the 瑩mer example? And what about implemen瑩ng the 
picking example in the next sec瑩on with callbacks (read it first and then come back to this 
ques瑩on)?
Picking objects
The picking func瑩onality allows users to move the mouse over a por瑩on of a rendered scene 
and click a bu瑴on. The result may be an ac瑩on of opening or closing a door, or shoo瑩ng on 
an intruding alien in the 3D world. There are three main steps required to perform these 
kinds of ac瑩ons.
Firstly, we use an event handler to receive mouse events. For example, a mouse push event 
comes along with the X and Y posi瑩ons of the cursor, which are of course the most important 
factors of the picking opera瑩on.
Secondly, we have to determine which part of the scene graph is under the mouse cursor. 
This can be done by using the intersec瑩on tools provided by the osgU瑩l library. The 
result is a set of intersec瑩ons that includes the picked drawable, its parent node path, the 
intersec瑩ng point, and so on.
Finally, we are going to make use of the intersec瑩on result to achieve our goals of picking 
objects or making them fight.
Intersection
OSG has its own intersec瑩on strategy that makes use of the node visitor mechanism to 
reduce 瑩me consump瑩on. It is always more efficient than OpenGL's selec瑩on feature. 
The 
class is the implementer. It is derived from 
the 
o
s
g
:
:
N
o
d
e
V
i
s
i
t
o
r
class and can test nodes' bounding volumes against the input 
intersector and quickly skip sub-scene graphs that are not intersectable during the traversal.
The 
object takes an 
o
s
g
U
t
i
l
:
:
I
n
t
e
r
s
e
c
t
o
r
derived 
object as the argument of its constructor. It can be configured for intersec瑩on tests with 
several intersectors, including line segments, planes, and polytopes. An intersector can work 
in four kinds of coordinate system, each of which has different input parameters and can 
convert them to world space with different transforma瑩on matrices. In the following table, 
we will take the line segment intersector class 
, to 
use as an example:
C# PowerPoint: C# Codes to Combine & Split PowerPoint Documents
pages of document 1 and some pages of document docList.Add(doc); } PPTXDocument.Combine( docList, combinedPath & profession imaging controls, PDF document, tiff
break apart pdf pages; can't select text in pdf file
VB.NET Word: Extract Word Pages, DOCX Page Extraction SDK
multiple pages from single or a list of Word documents? What VB.NET demo code can I apply to extract Word page(s) and combine extracted page(s) into one Word
split pdf into multiple files; break up pdf into individual pages
Interac瑩ng with Outside Elements
[
244 
]
Coordinate system
Input parameters
Requirement
M
O
D
E
L
Two 
o
s
g
:
:
V
e
c
3
ver瑩ces 
in the local space as the 
endpoints
No more requirements. The ver瑩ces in the 
world space will be automa瑩cally computed 
during the traversal.
V
I
E
W
Two 
o
s
g
:
:
V
e
c
3
ver瑩ces 
in the view space as the 
endpoints
One or more 
o
s
g
:
:
C
a
m
e
r
a
nodes must 
exist in the 
scene
graph
to be traversed to 
provide a valid 
view
matrix
.
P
R
O
J
E
C
T
I
O
N
Two double values are 
required as a point on the 
projec瑩on plane, ranging 
from (-1, -1) to (1, 1)
One or more 
o
s
g
:
:
C
a
m
e
r
a
nodes must 
exist to provide a valid 
view
matrix
and a 
projec瑩on
matrix
.
W
I
N
D
O
W
Two double values are 
required as a point on the 
screen
One or more 
o
s
g
:
:
C
a
m
e
r
a
nodes must 
exist to provide a valid 
view
matrix
projec瑩on
matrix
, and 
window
matrix
.
Assume that we are going to make an intersec瑩on test in the 
h
a
n
d
l
e
(
)
method of an event 
handler. The 
W
I
N
D
O
W
coordinate system can then be used here to obtain a ray from the 
mouse posi瑩on into the 3D scene. The following code segment shows how this works on a 
camera node 
c
a
m
e
r
a
:
)
;
The 
method of the intersector can be used to 
check if there is any intersec瑩ng result. The 
g
e
t
I
n
t
e
r
s
e
c
t
i
o
n
s
(
)
method 
of 
returns a set of 
I
n
t
e
r
s
e
c
t
i
o
n
variables, ascending from the nearest to the viewer, to the farthest. The intersec瑩on 
point can be found by calling the 
method or 
method of one of these result variables, for example:
The first line can also be rewri瑴en as:
Chapter 9
[
245 
]
Similarly, we can obtain the intersected 
d
r
a
w
a
b
l
e
object, its parent node path 
n
o
d
e
P
a
t
h
and even the 
i
n
d
e
x
L
i
s
t
which lists all ver瑩ces and indices of triangles intersected with the 
line segment, from the result's member variables, for future use.
Time for action – clicking and selecting geometries
Our task this 瑩me is to implement a very common task in 3D so晴ware—clicking to select 
an object in the world and showing a selec瑩on box around the object. The bounding 
box of the selected geometry should be good for represen瑩ng a selec瑩on box, and the 
o
s
g
:
:
S
h
a
p
e
D
r
a
w
a
b
l
e
class can quickly generate a simple box for display purposes. 
The 
o
s
g
:
:
P
o
l
y
g
o
n
M
o
d
e
a瑴ribute will then make the rendering pipeline only draw the 
wireframes of the box, which helps to show the selec瑩on box as brackets. These are all we 
need to produce prac瑩cal picking object func瑩onali瑩es.
1. 
Include the necessary headers:
2. 
The 
P
i
c
k
H
a
n
d
l
e
r
will do everything required for our task, including an 
intersec瑩on test of the mouse cursor and the scene graph, crea瑩ng and returning 
the selec瑩on box node (the 
_
s
e
l
e
c
t
i
o
n
B
o
x
variable in this example), and 
transforming the box around the selected object when pressing the mouse bu瑴on:
{
p
u
b
l
i
c
:
 protected:
}
;
Interac瑩ng with Outside Elements
[
246 
]
3. 
In the following method, we will allocate and return a valid selec瑩on box 
node to the main func瑩on. There are several points to note here: firstly, the 
o
s
g
:
:
B
o
x
object will not be changed at run瑩me, but a parent transforma瑩on 
node will be used and modified instead, for the reason of simplifying 
opera瑩ons; secondly, the 
G
L
_
L
I
G
H
T
I
N
G
mode and the 
o
s
g
:
:
P
o
l
y
g
o
n
M
o
d
e
a瑴ribute should be used to make the selec瑩on box more natural; finally, there 
is also a confusing 
s
e
t
N
o
d
e
M
a
s
k
(
)
call, which will be explained later:
{
{
}
}
4. 
We are going to strictly limit the occasion of picking scene objects to make 
sure camera manipula瑩on opera瑩ons can work. It will only be called when 
the user is holding the 
C
t
r
l
key and releasing the le晴 mouse bu瑴on. A晴er 
that, we obtain the viewer by conver瑩ng the 
object, and create an intersec瑩on visitor to find a node that can possibly be 
picked by the mouse cursor (be aware of the 
s
e
t
T
r
a
v
e
r
s
a
l
M
a
s
k
(
)
method 
here, which will be introduced along with the 
s
e
t
N
o
d
e
M
a
s
k
(
)
method). 
Then the resul瑩ng drawable object and its parent node path can be used 
to describe the world posi瑩on and scale of the bounding selec瑩on box:
{
Chapter 9
[
247 
]
|
|
)
i
f
(
v
i
e
w
e
r
)
 {
)
;
{
}
 }   return false;
}
5. 
The remaining work is not hard to understand. We will first construct the scene 
graph by adding two models to the root node:
)
;
Documents you may be interested
Documents you may be interested