Compare commits
49 Commits
OpenSceneG
...
OpenSceneG
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ace1188557 | ||
|
|
817780e67c | ||
|
|
7ed9ef7db0 | ||
|
|
12d20ee257 | ||
|
|
2bed6a2dca | ||
|
|
315e749cce | ||
|
|
0b5d743411 | ||
|
|
0029d8fc46 | ||
|
|
a5d6c1a6a3 | ||
|
|
65f85fee6d | ||
|
|
df14b9980a | ||
|
|
7ba85b16db | ||
|
|
bda1350be4 | ||
|
|
31f2e7902f | ||
|
|
e89336a306 | ||
|
|
9a8abe7fee | ||
|
|
01b27a9fb2 | ||
|
|
21f735d653 | ||
|
|
4dfa7485c1 | ||
|
|
7bbc1c419b | ||
|
|
ab029febbd | ||
|
|
d5d19ac1a4 | ||
|
|
44da3958c3 | ||
|
|
26e3f00882 | ||
|
|
fb6e1d4d9f | ||
|
|
e4fa4f9119 | ||
|
|
a9c1dd1a4a | ||
|
|
102e5c2439 | ||
|
|
264746a5c2 | ||
|
|
dfa3c9a2c9 | ||
|
|
b795e65a39 | ||
|
|
b1dbb9e96b | ||
|
|
4f6add4c14 | ||
|
|
edb1eede40 | ||
|
|
9cccbcd7b7 | ||
|
|
1bf529b391 | ||
|
|
83b84eb2f4 | ||
|
|
90325a5895 | ||
|
|
c2bc684eb2 | ||
|
|
5b439806ce | ||
|
|
5574c50607 | ||
|
|
31cb807db3 | ||
|
|
3326c26a60 | ||
|
|
8d70cc0b0f | ||
|
|
3558d1d010 | ||
|
|
be47c9f44a | ||
|
|
6dab8c3380 | ||
|
|
bbc8e7b58c | ||
|
|
9d8c98395e |
23
AUTHORS.txt
23
AUTHORS.txt
@@ -1,6 +1,6 @@
|
|||||||
OpenSceneGraph Library 2.8.1
|
OpenSceneGraph Library 2.8.2
|
||||||
|
|
||||||
372 Contributors:
|
373 Contributors:
|
||||||
|
|
||||||
Firstname Surname
|
Firstname Surname
|
||||||
-----------------
|
-----------------
|
||||||
@@ -9,9 +9,9 @@ Don Burns
|
|||||||
Marco Jez
|
Marco Jez
|
||||||
Paul Martz
|
Paul Martz
|
||||||
Mike Weiblen
|
Mike Weiblen
|
||||||
|
Mathias Fr<46>hlich
|
||||||
Eric Wing
|
Eric Wing
|
||||||
Stephan Huber
|
Stephan Huber
|
||||||
Mathias Fr<46>hlich
|
|
||||||
Brede Johansen
|
Brede Johansen
|
||||||
Geoff Michel
|
Geoff Michel
|
||||||
Farshid Lashkari
|
Farshid Lashkari
|
||||||
@@ -63,16 +63,16 @@ Alberto Luaces
|
|||||||
Philip Lowman
|
Philip Lowman
|
||||||
Chris Denham
|
Chris Denham
|
||||||
Melchior Franz
|
Melchior Franz
|
||||||
Serge Lages
|
|
||||||
Lionel Lagarde
|
Lionel Lagarde
|
||||||
Joran Jessurun
|
|
||||||
Frederic Marmond
|
|
||||||
David Fries
|
David Fries
|
||||||
Bryan Thrall
|
Bryan Thrall
|
||||||
|
Terry Welsh
|
||||||
|
Serge Lages
|
||||||
|
Joran Jessurun
|
||||||
|
Frederic Marmond
|
||||||
Boris Bralo
|
Boris Bralo
|
||||||
Yefei He
|
Yefei He
|
||||||
Tim Moore
|
Tim Moore
|
||||||
Terry Welsh
|
|
||||||
Stephane Lamoliatte
|
Stephane Lamoliatte
|
||||||
Sondra Iverson
|
Sondra Iverson
|
||||||
Rune Schmidt Jensen
|
Rune Schmidt Jensen
|
||||||
@@ -176,6 +176,7 @@ Stephan Eilemann
|
|||||||
Stanislav Blinov
|
Stanislav Blinov
|
||||||
Sergey Leontyev
|
Sergey Leontyev
|
||||||
Sebastian Messerschmidt
|
Sebastian Messerschmidt
|
||||||
|
Rene Molenaar
|
||||||
Ralf Kern
|
Ralf Kern
|
||||||
Pierre Haritchabalet
|
Pierre Haritchabalet
|
||||||
Perry Miller
|
Perry Miller
|
||||||
@@ -190,6 +191,7 @@ Max Bandazian
|
|||||||
Mathew May
|
Mathew May
|
||||||
Martin Spott
|
Martin Spott
|
||||||
Martijn Kragtwijk
|
Martijn Kragtwijk
|
||||||
|
Konstantin Sinitsyn
|
||||||
Kevin Moiule
|
Kevin Moiule
|
||||||
Keith Steffen
|
Keith Steffen
|
||||||
Katharina Plugge
|
Katharina Plugge
|
||||||
@@ -208,6 +210,7 @@ Frederic Bouvier
|
|||||||
Ferdi Smit
|
Ferdi Smit
|
||||||
Ewe Woessner
|
Ewe Woessner
|
||||||
Erik den Dekker
|
Erik den Dekker
|
||||||
|
Emmanuel Roche
|
||||||
Edgar Ellis
|
Edgar Ellis
|
||||||
Don Leich
|
Don Leich
|
||||||
David Ergo
|
David Ergo
|
||||||
@@ -234,7 +237,6 @@ Tomas Hnilica
|
|||||||
Tino Schwarze
|
Tino Schwarze
|
||||||
Thomas Weidner
|
Thomas Weidner
|
||||||
Thom Carlo
|
Thom Carlo
|
||||||
Tery Welsh
|
|
||||||
Steven Thomas
|
Steven Thomas
|
||||||
Simon Hammett
|
Simon Hammett
|
||||||
Sid Byce
|
Sid Byce
|
||||||
@@ -250,7 +252,6 @@ Rob Bloemkool
|
|||||||
Rick Pingry
|
Rick Pingry
|
||||||
Rick Appleton
|
Rick Appleton
|
||||||
Ricard Schmidt
|
Ricard Schmidt
|
||||||
Rene Molenaar
|
|
||||||
Reinhard Sainitzer
|
Reinhard Sainitzer
|
||||||
Rein Kadijk
|
Rein Kadijk
|
||||||
Raymond de Vries
|
Raymond de Vries
|
||||||
@@ -262,6 +263,7 @@ Philipp M
|
|||||||
Petr Salinger
|
Petr Salinger
|
||||||
Paul Palumbo
|
Paul Palumbo
|
||||||
Paul Fredrikson
|
Paul Fredrikson
|
||||||
|
Paul Fotheringham
|
||||||
Patrick Hartling
|
Patrick Hartling
|
||||||
Parag Chaudhur
|
Parag Chaudhur
|
||||||
Panagiotis Papadakos
|
Panagiotis Papadakos
|
||||||
@@ -298,7 +300,6 @@ Lewis Harmon
|
|||||||
Lars Nilson
|
Lars Nilson
|
||||||
Kyle Centers
|
Kyle Centers
|
||||||
Kristopher Bixler
|
Kristopher Bixler
|
||||||
Konstantin Sinitsyn
|
|
||||||
Karsten Weiss
|
Karsten Weiss
|
||||||
Karl Heijdenberg
|
Karl Heijdenberg
|
||||||
Jutta Sauer
|
Jutta Sauer
|
||||||
@@ -332,7 +333,6 @@ Frank Lichtenheld
|
|||||||
Ferdinand Cornelissen
|
Ferdinand Cornelissen
|
||||||
Fajran Iman
|
Fajran Iman
|
||||||
Fabien Dachicourt
|
Fabien Dachicourt
|
||||||
Emmanuel Roche
|
|
||||||
Edmond Gheury
|
Edmond Gheury
|
||||||
Ed Ralston
|
Ed Ralston
|
||||||
Duvan Cope
|
Duvan Cope
|
||||||
@@ -346,6 +346,7 @@ Danny Valente
|
|||||||
Daniel Stien
|
Daniel Stien
|
||||||
Dan Minor
|
Dan Minor
|
||||||
Cyril Brulebois
|
Cyril Brulebois
|
||||||
|
Cory Riddell
|
||||||
Clay Fowler
|
Clay Fowler
|
||||||
Chuck Sembroski
|
Chuck Sembroski
|
||||||
Chuck Seberion
|
Chuck Seberion
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
|
||||||
|
|
||||||
IF(WIN32)
|
IF(WIN32)
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.4.6 FATAL_ERROR)
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.4.6 FATAL_ERROR)
|
||||||
ELSE(WIN32)
|
ELSE(WIN32)
|
||||||
@@ -28,7 +30,7 @@ PROJECT(OpenSceneGraph)
|
|||||||
|
|
||||||
SET(OPENSCENEGRAPH_MAJOR_VERSION 2)
|
SET(OPENSCENEGRAPH_MAJOR_VERSION 2)
|
||||||
SET(OPENSCENEGRAPH_MINOR_VERSION 8)
|
SET(OPENSCENEGRAPH_MINOR_VERSION 8)
|
||||||
SET(OPENSCENEGRAPH_PATCH_VERSION 1)
|
SET(OPENSCENEGRAPH_PATCH_VERSION 2)
|
||||||
SET(OPENSCENEGRAPH_SOVERSION 55)
|
SET(OPENSCENEGRAPH_SOVERSION 55)
|
||||||
|
|
||||||
# set to 0 when not a release candidate, non zero means that any generated
|
# set to 0 when not a release candidate, non zero means that any generated
|
||||||
|
|||||||
@@ -8,6 +8,6 @@ set(CTEST_PROJECT_NAME "OpenSceneGraph")
|
|||||||
set(CTEST_NIGHTLY_START_TIME "00:00:00 CET")
|
set(CTEST_NIGHTLY_START_TIME "00:00:00 CET")
|
||||||
|
|
||||||
set(CTEST_DROP_METHOD "http")
|
set(CTEST_DROP_METHOD "http")
|
||||||
set(CTEST_DROP_SITE "www.cdash.org")
|
set(CTEST_DROP_SITE "cdash.openscenegraph.org")
|
||||||
set(CTEST_DROP_LOCATION "/CDashPublic/submit.php?project=OpenSceneGraph")
|
set(CTEST_DROP_LOCATION "/submit.php?project=OpenSceneGraph")
|
||||||
set(CTEST_DROP_SITE_CDASH TRUE)
|
set(CTEST_DROP_SITE_CDASH TRUE)
|
||||||
|
|||||||
430
ChangeLog
430
ChangeLog
@@ -1,3 +1,433 @@
|
|||||||
|
2009-07-28 06:02 robert
|
||||||
|
|
||||||
|
* CMakeLists.txt, NEWS.txt, README.txt: Updated dates for 2.8.2
|
||||||
|
stable release
|
||||||
|
|
||||||
|
2009-07-24 12:12 robert
|
||||||
|
|
||||||
|
* CTestConfig.cmake: From Jean-Sebastien Guay, updated CTestConfig
|
||||||
|
to point to new cdash.openscenegraph.org site
|
||||||
|
|
||||||
|
2009-07-17 07:50 robert
|
||||||
|
|
||||||
|
* src/osgPlugins/jpeg, src/osgPlugins/jpeg/ReaderWriterJPEG.cpp:
|
||||||
|
From J.P. Delport, "attached a modified jpeg plugin that allows
|
||||||
|
writing of grayscale images."
|
||||||
|
|
||||||
|
2009-07-16 13:30 robert
|
||||||
|
|
||||||
|
* ChangeLog, NEWS.txt: Update ChangeLog and NEWS for 2.8.2-rc4
|
||||||
|
|
||||||
|
2009-07-16 13:18 robert
|
||||||
|
|
||||||
|
* CMakeLists.txt: Updated release candidate number to 4
|
||||||
|
|
||||||
|
2009-07-16 12:11 robert
|
||||||
|
|
||||||
|
* src/osgPlugins/OpenFlight,
|
||||||
|
src/osgPlugins/OpenFlight/FltExportVisitor.cpp: From Fabien
|
||||||
|
Lavignotte, "When exporting some models to OpenFlight, i found a
|
||||||
|
crash if the texture
|
||||||
|
unit does not contain a TexEnv object.
|
||||||
|
Here's the small fix, just a test on the pointer."
|
||||||
|
|
||||||
|
Merged from svn trunk using:
|
||||||
|
|
||||||
|
svn merge -r 10490:10491
|
||||||
|
http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk/src/osgPlugins/OpenFlight
|
||||||
|
|
||||||
|
2009-07-16 12:06 robert
|
||||||
|
|
||||||
|
* src/osgWidget, src/osgWidget/Window.cpp: From Stephane
|
||||||
|
Lamoliatte, "The vertical anchor is inverted in the
|
||||||
|
osgWidget::Window::update function.
|
||||||
|
Here is a small patch to fix that."
|
||||||
|
|
||||||
|
2009-07-16 11:52 robert
|
||||||
|
|
||||||
|
* examples/osganimationtimeline,
|
||||||
|
examples/osganimationtimeline/osganimationtimeline.cpp: From
|
||||||
|
Cedric Pinson, crash fix for osganimationtimeline that was caused
|
||||||
|
by not checking if nathan.osg test file had be loaded or not.
|
||||||
|
|
||||||
|
2009-07-16 11:42 robert
|
||||||
|
|
||||||
|
* src/osgPlugins/bsp, src/osgPlugins/bsp/VBSPEntity.cpp,
|
||||||
|
src/osgPlugins/bsp/VBSPEntity.h,
|
||||||
|
src/osgPlugins/bsp/VBSPGeometry.cpp,
|
||||||
|
src/osgPlugins/bsp/VBSPReader.cpp, src/osgPlugins/mdl,
|
||||||
|
src/osgPlugins/mdl/MDLReader.cpp,
|
||||||
|
src/osgPlugins/mdl/MDL_README.txt: From Jason Daly, "These are
|
||||||
|
some fixes to the mdl and bsp plugins to handle transparency and
|
||||||
|
lighting better, plus a few other tweaks."
|
||||||
|
|
||||||
|
2009-07-16 11:09 robert
|
||||||
|
|
||||||
|
* src/osgUtil/Optimizer.cpp: From Colin MacDonald, "The Optimizer
|
||||||
|
Merge Geometry visitor is always merging geometries,
|
||||||
|
even if they have had DataVariance DYNAMIC explicitly specified.
|
||||||
|
Then
|
||||||
|
when an application attempts to dynamically update the geometry
|
||||||
|
in the
|
||||||
|
frame loop the primitive sets and data arrays are no longer as
|
||||||
|
expected, leading to display and/or memory corruption.
|
||||||
|
|
||||||
|
Attached is a simple fix."
|
||||||
|
|
||||||
|
Note from Robert Osfield, tweaked Colin's changes so that it uses
|
||||||
|
!= DYNAMIC rather == STATIC in the additional test.
|
||||||
|
|
||||||
|
Merged from svn/trunk using:
|
||||||
|
|
||||||
|
svn merge -r 10479:10480
|
||||||
|
http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk/src/osgUtil/Optimizer.cpp
|
||||||
|
|
||||||
|
|
||||||
|
2009-07-14 16:02 robert
|
||||||
|
|
||||||
|
* NEWS.txt: Tweaked news
|
||||||
|
|
||||||
|
2009-07-14 15:49 robert
|
||||||
|
|
||||||
|
* AUTHORS.txt, CMakeLists.txt, ChangeLog, NEWS.txt,
|
||||||
|
applications/osgversion/Contributors.cpp: Updated contributors,
|
||||||
|
authors file, news and changelog for 2.8.2-rc3
|
||||||
|
|
||||||
|
2009-07-13 16:45 robert
|
||||||
|
|
||||||
|
* src/osgViewer, src/osgViewer/GraphicsWindowWin32.cpp: From Cory
|
||||||
|
Riddell based on suggestion from Robert Osfield, "I've been
|
||||||
|
running with your suggested changes for a few days now and it
|
||||||
|
has been working perfectly. I'm still not entirely clear why
|
||||||
|
adding a
|
||||||
|
slave/subgraph causes the problem."
|
||||||
|
|
||||||
|
2009-07-13 16:07 robert
|
||||||
|
|
||||||
|
* src/OpenThreads/win32,
|
||||||
|
src/OpenThreads/win32/Win32ConditionPrivateData.h: From David
|
||||||
|
Fries, "Here is a fix for a deadlock seen under Windows using
|
||||||
|
OpenThreads
|
||||||
|
Barrier operations. The error is with atomic operations in the
|
||||||
|
win32 condition implementation. The attached sample program will
|
||||||
|
reliably trigger with as few as three threads and a dual core
|
||||||
|
system,
|
||||||
|
though sometimes it will take 65,000 iterations.
|
||||||
|
|
||||||
|
2.8.1 was the base for these changes
|
||||||
|
|
||||||
|
Win32ConditionPrivateData.h
|
||||||
|
Win32ConditionPrivateData::wait does two operations to decrement
|
||||||
|
waiters_ then read, when InterlockedDecrement decrements and
|
||||||
|
returns
|
||||||
|
the value in one operation. The two operations allows another
|
||||||
|
thread
|
||||||
|
to also decrement with both getting 0 for an answer.
|
||||||
|
|
||||||
|
Win32ConditionPrivateData::broadcast is using waiters_ directly
|
||||||
|
instead of using the w value read earlier, if it was safe to use
|
||||||
|
waiters_ directly there would be no need for InterlockedGet or w.
|
||||||
|
|
||||||
|
overview of deadlock in barrier with three threads
|
||||||
|
one thread in broadcast, 2 threads in wait,
|
||||||
|
release semaphore 2, waits on waiters_done_
|
||||||
|
both threads wake, decrement waiters_, get 0 for w,
|
||||||
|
<logic error here>
|
||||||
|
one calls set waiters_done_,
|
||||||
|
broadcast thread comes out of waiters_done_,
|
||||||
|
other thread calls waiters_done_, (which leaves waiters_done_ in
|
||||||
|
the
|
||||||
|
signaled state)
|
||||||
|
<sets the trap>
|
||||||
|
broadcast thread returns releases mutex, other threads get
|
||||||
|
mutex and also return,
|
||||||
|
next barrier, first two threads enter wait, one goes to
|
||||||
|
broadcast, release
|
||||||
|
semaphore 2, skips waiters_done_ as it had been released last
|
||||||
|
time
|
||||||
|
returns, processes, enters the barrier for the next barrier
|
||||||
|
operation
|
||||||
|
and waits,
|
||||||
|
three threads are now in wait, two have the previous barrier
|
||||||
|
phase,
|
||||||
|
one the current phase, there's one count left in the semaphore
|
||||||
|
which a
|
||||||
|
thread gets, returns, enters the barrier as a waiter, sleeps, and
|
||||||
|
the
|
||||||
|
deadlock is completed"
|
||||||
|
|
||||||
|
Merged from svn/trunk using:
|
||||||
|
|
||||||
|
svn merge -r 10456:10457
|
||||||
|
http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk/src/OpenThreads/win32
|
||||||
|
|
||||||
|
2009-07-03 19:08 robert
|
||||||
|
|
||||||
|
* src/osgPlugins/dicom/CMakeLists.txt: From Paul Fotheringham,
|
||||||
|
fixed linux build error when compiling dicom plugin against ITK
|
||||||
|
by adding define VCL_CAN_STATIC_CONST_INIT_FLOAT to be zero.
|
||||||
|
|
||||||
|
From Robert Osfield, general clean up of CMakeLists.txt under ITK
|
||||||
|
side
|
||||||
|
|
||||||
|
2009-07-01 15:39 robert
|
||||||
|
|
||||||
|
* src/osgPlugins/OpenFlight/ExportOptions.cpp: From Bryan Thrall,
|
||||||
|
"The OpenFlight plugin doesn't handle unrecognized options or
|
||||||
|
extra
|
||||||
|
whitespace in all cases, causing it to crash."
|
||||||
|
|
||||||
|
2009-06-29 09:50 robert
|
||||||
|
|
||||||
|
* NEWS.txt, README.txt: Updated NEWS for and READE for 2.9.2-rc2.
|
||||||
|
|
||||||
|
2009-06-29 09:47 robert
|
||||||
|
|
||||||
|
* CMakeLists.txt: Updated release candidate to 2
|
||||||
|
|
||||||
|
2009-06-29 09:46 robert
|
||||||
|
|
||||||
|
* examples/osgshadow/osgshadow.cpp: Made --pssm and --sv options
|
||||||
|
use SingleThreaded viewer to workaround threading issues with
|
||||||
|
ParallelSplitShadowMap and ShadowVolume techniques.
|
||||||
|
|
||||||
|
2009-06-25 16:08 robert
|
||||||
|
|
||||||
|
* NEWS.txt: Updated to NEWS to map to wiki NEWS item
|
||||||
|
|
||||||
|
2009-06-25 14:06 robert
|
||||||
|
|
||||||
|
* src/osg/ArgumentParser.cpp, src/osg/CullSettings.cpp,
|
||||||
|
src/osg/DisplaySettings.cpp, src/osgDB/DatabasePager.cpp,
|
||||||
|
src/osgGA/DriveManipulator.cpp,
|
||||||
|
src/osgPlugins/bsp/VBSPEntity.cpp,
|
||||||
|
src/osgPlugins/cfg/ConfigParser.cpp,
|
||||||
|
src/osgPlugins/dw/ReaderWriterDW.cpp,
|
||||||
|
src/osgPlugins/ive/DataOutputStream.cpp,
|
||||||
|
src/osgPlugins/normals/ReaderWriterNormals.cpp,
|
||||||
|
src/osgPlugins/txp/ReaderWriterTXP.cpp,
|
||||||
|
src/osgPlugins/txp/TXPParser.cpp,
|
||||||
|
src/osgViewer/ViewerEventHandlers.cpp: From Mathias Froehlich,
|
||||||
|
changes from atof to use osg::asciiToFloat() to avoid locale
|
||||||
|
issues with atof
|
||||||
|
|
||||||
|
2009-06-25 13:27 robert
|
||||||
|
|
||||||
|
* include/osg, include/osg/Endian: From Mathias Froehlich, "Fix
|
||||||
|
possible problem with aliasing rules... and fix a gcc warning :)
|
||||||
|
Use a union to determine if we are on a little endian or big
|
||||||
|
endian machine."
|
||||||
|
|
||||||
|
Merged from svn/trunk using :
|
||||||
|
|
||||||
|
svn merge -r 10409:10410
|
||||||
|
http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk/include/osg/
|
||||||
|
|
||||||
|
2009-06-22 16:04 robert
|
||||||
|
|
||||||
|
* src/osgPlugins/txp, src/osgPlugins/txp/trpage_swap.cpp: Fixed
|
||||||
|
swap size error.
|
||||||
|
|
||||||
|
Merged from svn/trunk using:
|
||||||
|
|
||||||
|
svn merge -r 10386:10387
|
||||||
|
http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk/src/osgPlugins/txp/
|
||||||
|
|
||||||
|
2009-06-22 09:32 robert
|
||||||
|
|
||||||
|
* AUTHORS.txt, ChangeLog, NEWS.txt,
|
||||||
|
applications/osgversion/Contributors.cpp: Updated NEWS, AUTHORS
|
||||||
|
and ChangeLog for 2.8.2-rc1 release
|
||||||
|
|
||||||
|
2009-06-22 07:42 robert
|
||||||
|
|
||||||
|
* src/osgPlugins/osg/StateSet.cpp: Merged from svn/trunk fix to
|
||||||
|
initGLNames() which addressed thread safety issue
|
||||||
|
|
||||||
|
2009-06-20 11:38 robert
|
||||||
|
|
||||||
|
* src/osgText/TextBase.cpp: From Farshid Lashkari, "I found a bug
|
||||||
|
in the osgText library in version 1.2 that I believe still exists
|
||||||
|
in the latest version.
|
||||||
|
|
||||||
|
I found that changing the alignment of a text object does not
|
||||||
|
work properly if the text contains newline characters. I've
|
||||||
|
attached a simple test case that shows the problem. If I set the
|
||||||
|
text AFTER setting the alignment, everything works fine. But if I
|
||||||
|
set the text BEFORE setting the alignment then the text is
|
||||||
|
displayed incorrectly.
|
||||||
|
|
||||||
|
The fix is very simple. Instead of calling computePositions() in
|
||||||
|
TextBase::setAlignment(), it calls computeGlyphRepresentation().
|
||||||
|
I've attached the modified TextBase.cpp."
|
||||||
|
|
||||||
|
Merged from svn/trunk using:
|
||||||
|
|
||||||
|
svn merge -r 10375:10376
|
||||||
|
http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk/src/osgText/TextBase.cpp
|
||||||
|
|
||||||
|
2009-06-19 11:02 robert
|
||||||
|
|
||||||
|
* src/osgViewer, src/osgViewer/CompositeViewer.cpp,
|
||||||
|
src/osgViewer/GraphicsWindowWin32.cpp, src/osgViewer/Viewer.cpp:
|
||||||
|
Added clears of input vectors in various get*() methods
|
||||||
|
|
||||||
|
2009-06-19 10:44 robert
|
||||||
|
|
||||||
|
* ChangeLog: Updated ChangeLog
|
||||||
|
|
||||||
|
2009-06-18 08:19 robert
|
||||||
|
|
||||||
|
* src/osgManipulator, src/osgManipulator/AntiSquish.cpp: From Rene
|
||||||
|
Molenaar, "The bug is as described above:
|
||||||
|
|
||||||
|
"The dragger's corner tabs are no longer in the corners."
|
||||||
|
|
||||||
|
this fix places the cornertabs back in the corners.
|
||||||
|
(the manipulator does not make sense otherwise)."
|
||||||
|
|
||||||
|
2009-06-17 15:10 robert
|
||||||
|
|
||||||
|
* CMakeLists.txt: Added CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS
|
||||||
|
|
||||||
|
2009-06-17 08:55 robert
|
||||||
|
|
||||||
|
* include/osg/DisplaySettings: Fixed error in
|
||||||
|
DisplaySetting::setNumOfHttpDatabaseThreadsHint()
|
||||||
|
|
||||||
|
2009-06-12 09:53 robert
|
||||||
|
|
||||||
|
* src/osg/Texture2DArray.cpp: From Konstantin Sinitsyn, "I've fixed
|
||||||
|
bug with loading of compressed texture to texture array!"
|
||||||
|
|
||||||
|
Merged from svn/trunk using:
|
||||||
|
|
||||||
|
svn merge -r 10336:10337
|
||||||
|
http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk/src/osg
|
||||||
|
|
||||||
|
2009-06-08 13:53 robert
|
||||||
|
|
||||||
|
* src/osg: From Mathias Froehlich, "Without this change packed
|
||||||
|
depth stencil attachments are only supported if the
|
||||||
|
GL_EXT_framebuffer_blit extension is available. This is due to
|
||||||
|
the early
|
||||||
|
return from the constructor if this is missing.
|
||||||
|
As far as I read the standard extension documents, this blit call
|
||||||
|
is not
|
||||||
|
required to have packed depth stencil fbos.
|
||||||
|
The change fixes this and allows packed stencil attachments on
|
||||||
|
machines
|
||||||
|
without the multisample blit command."
|
||||||
|
|
||||||
|
Merged from svn/trunk using:
|
||||||
|
|
||||||
|
svn merge -r 10326:10327
|
||||||
|
http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk
|
||||||
|
|
||||||
|
2009-06-08 11:14 robert
|
||||||
|
|
||||||
|
* src/osgSim, src/osgSim/Sector.cpp: From Lionel Largade, "this
|
||||||
|
correction makes the intensity interpolated in the correct
|
||||||
|
direction when the angle is between _cosFadeAngle and _cosAngle."
|
||||||
|
|
||||||
|
Merged from svn/trunk using:
|
||||||
|
|
||||||
|
svn merge -r 10320:10321
|
||||||
|
http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk/src/osgSim
|
||||||
|
|
||||||
|
2009-06-06 10:08 robert
|
||||||
|
|
||||||
|
* include/osg/Referenced, src/osgUtil/RenderBin.cpp: Introduced
|
||||||
|
depend_on template and usage in RenderBin.cpp's singleton to
|
||||||
|
solve crash on exit in static builds.
|
||||||
|
|
||||||
|
2009-06-04 19:22 paulmelis
|
||||||
|
|
||||||
|
* applications/osgversion/CMakeLists.txt: Fixed incorrect ENDIF()
|
||||||
|
in applications/osgversion/CMakeLists.txt
|
||||||
|
(CMake 2.4 complained about this, while 2.6 seems to ignore it)
|
||||||
|
|
||||||
|
2009-06-02 14:48 robert
|
||||||
|
|
||||||
|
* ChangeLog, NEWS.txt: Update ChangeLog and NEWS
|
||||||
|
|
||||||
|
2009-06-02 14:44 robert
|
||||||
|
|
||||||
|
* src/osg/Texture2D.cpp: Merged from svn/trunk : "Moved assigned of
|
||||||
|
texture object to
|
||||||
|
_textureObjectBuffer to earlier in Texture2D::apply() to prevent
|
||||||
|
problems with non power of two texture mipmap generation."
|
||||||
|
|
||||||
|
2009-06-02 14:42 robert
|
||||||
|
|
||||||
|
* ChangeLog, NEWS.txt: Updated ChangeLog and NEWS.txt in prep for
|
||||||
|
2.8.2
|
||||||
|
|
||||||
|
2009-06-02 09:23 robert
|
||||||
|
|
||||||
|
* CMakeLists.txt, include/osg/Version: Updated version numbers for
|
||||||
|
2.8.2 release
|
||||||
|
|
||||||
|
2009-06-02 09:20 robert
|
||||||
|
|
||||||
|
* src/osg/GraphicsContext.cpp: Merged from svn/trunk : "Fixed
|
||||||
|
handling of case where the
|
||||||
|
master and the slave camera are placed on the same
|
||||||
|
GraphisContext, or when the master camera and slave camera are
|
||||||
|
assigned to different Camers. Note normally one doesn't mix
|
||||||
|
master with GraphicsContexts and slave cameras so neither case is
|
||||||
|
common."
|
||||||
|
|
||||||
|
2009-06-02 09:17 robert
|
||||||
|
|
||||||
|
* src/osgParticle/ParticleSystemUpdater.cpp: Merged from svn/trunk:
|
||||||
|
"Added initializer of ParticleSystemUpdater::_frameNumber"
|
||||||
|
|
||||||
|
2009-06-02 09:16 robert
|
||||||
|
|
||||||
|
* src/osgViewer/GraphicsWindowX11.cpp: Merged from svn/trunk two
|
||||||
|
submissions:
|
||||||
|
|
||||||
|
"Refactored the adaption of X11 key symbols into OSG key events
|
||||||
|
to fix problems with handling wide range of locales."
|
||||||
|
|
||||||
|
From Mathias Froehlich, "This frees some memory that is allocated
|
||||||
|
by the X11 functions."
|
||||||
|
|
||||||
|
2009-06-02 09:15 robert
|
||||||
|
|
||||||
|
* src/osgUtil/GLObjectsVisitor.cpp: Merged from svn/trunk.
|
||||||
|
|
||||||
|
2009-06-02 09:14 robert
|
||||||
|
|
||||||
|
* src/osg/Transform.cpp: From Emmanuel Roche, "I've also updated
|
||||||
|
the computeBound() method from the osg::Transform class : this
|
||||||
|
method was using float based temporary variables and thus the
|
||||||
|
double precision is lost here. I've changed that to use the
|
||||||
|
generic types osg::BoundingSphere::vec_type and
|
||||||
|
osg::BoundingSphere::value_type instead."
|
||||||
|
|
||||||
|
Merged from svn/trunk.
|
||||||
|
|
||||||
|
2009-05-27 12:11 robert
|
||||||
|
|
||||||
|
* src/osgUtil/RenderStage.cpp: Fixed glStencilMask setting.
|
||||||
|
|
||||||
|
2009-05-25 16:36 robert
|
||||||
|
|
||||||
|
* src/osgViewer/GraphicsWindowX11.cpp: Refactored the
|
||||||
|
GraphicsWindowX11::adaptKey() implementation so that it always
|
||||||
|
uses the reampX11Key(ks) method, and for the mapping to handle
|
||||||
|
case correctly. Merged from svn/trunk revision.
|
||||||
|
|
||||||
|
2009-05-19 16:21 robert
|
||||||
|
|
||||||
|
* AUTHORS.txt: Updated AUTHORS file to 2.8.1 release
|
||||||
|
|
||||||
|
2009-05-19 16:08 robert
|
||||||
|
|
||||||
|
* ChangeLog: Updated ChangeLog for 2.8.1 release
|
||||||
|
|
||||||
2009-05-19 16:05 robert
|
2009-05-19 16:05 robert
|
||||||
|
|
||||||
* CMakeLists.txt, NEWS.txt, README.txt: Updated dates and reset
|
* CMakeLists.txt, NEWS.txt, README.txt: Updated dates and reset
|
||||||
|
|||||||
117
NEWS.txt
117
NEWS.txt
@@ -1,6 +1,123 @@
|
|||||||
OSG News
|
OSG News
|
||||||
========
|
========
|
||||||
|
|
||||||
|
= !OpenSceneGraph 2.8.2 release - bug fix release =
|
||||||
|
|
||||||
|
PERTHSHIRE, Scotland - 28th July 2009 - !OpenSceneGraph Professional Services announces the release of !OpenSceneGraph 2.8.2, the industry's leading open-source scene graph technology, designed to accelerate application development and improve 3D graphics performance. !OpenSceneGraph 2.8 written entirely in Standard C++ and built upon OpenGL, offers developers working in the visual simulation, game development, virtual reality, scientific visualization and modeling markets - a real-time visualization tool which eclipses commercial scene graph toolkits in functionality, stability and performance. !OpenSceneGraph 2.8 runs on all Microsoft Windows platforms, Apple OS/X, GNU/Linux, IRIX, Solaris, HP-UX, AIX and FreeBSD operating systems.
|
||||||
|
|
||||||
|
=== Open-source development delivers industry-leading features and performance ===
|
||||||
|
The !OpenSceneGraph 2.8.2 release is the culmination of 10 years of work by the lead developers and the open-source community that has grown up around the project. The real-time graphics industry and academia embraced it from the very beginning, deploying it in real-world applications, and actively participating in its development, testing and refinement. The end result is a high-quality library with a feature set relevant to application developers' needs.
|
||||||
|
|
||||||
|
=== Updates between 2.8.2 and 2.8.1 releases include: ===
|
||||||
|
|
||||||
|
* Build fixes for:
|
||||||
|
* !RedHat Enterprise Linux
|
||||||
|
* Building of dicom plugin with ITK under Linux
|
||||||
|
* Crash fixes to:
|
||||||
|
* crash during window destruction under Windows when using closing a MFC based !GraphicsWindow
|
||||||
|
* deadlock under Windows due threading issues with atomic operations in Win32 Barrier implementation
|
||||||
|
* !OpenFlight plugin crashed due to not handling spaces at the end of option strings
|
||||||
|
* !OpenFlight plugin crashed when exported scene graphs contain no TexEnv objects
|
||||||
|
* osganimationtimeline crashed when example model was not found
|
||||||
|
* Bug fixes to :
|
||||||
|
* vertical anchor in osgWidget::Widow was inverted
|
||||||
|
* bsp an mdl plugins to better handling transparency and lighting
|
||||||
|
* computation of sector range in osgSim::!LightPoint
|
||||||
|
* extension checking of FBO packed stencil support
|
||||||
|
* position of tabs at corners of manipulators
|
||||||
|
* threading bug in .osg plugin that occurred during multi-threaded initialization
|
||||||
|
* alignment of Text what setting alignment after assign text string
|
||||||
|
* loading of compressed texture arrays
|
||||||
|
* texture generate mipmap for non power of two textures
|
||||||
|
* regression in X11 key symbol remapping, improved support for Russian keyboards
|
||||||
|
* regression of !StencilMask setting in !RenderStage
|
||||||
|
* small memory leak in X11 usage
|
||||||
|
* Transform::computeBound() double !BoundingSphere support
|
||||||
|
* Resize handling when master and slave Cameras share the same !GraphicsContext
|
||||||
|
* Handling of locale in plugins and env var parsing so it always follows the '.' decimal place convention regardless of the desktop/application locale.
|
||||||
|
|
||||||
|
=== Updates between 2.8.1 and 2.8.0 releases include: ===
|
||||||
|
|
||||||
|
* Build fixes under FreeBSD and IBM AIX, and RedHat Enterprise Linux
|
||||||
|
* Improved compatibility with SWIG wrapper building
|
||||||
|
* Crash fixes in osg::State, osg::Geometry and osgWidget
|
||||||
|
* Bug fixes to :
|
||||||
|
* draw instanced support
|
||||||
|
* Optimizer - MergeGeometryVisitor, RemoveLoadedProxyNodesVisitor and SpatializeGroupsVistor
|
||||||
|
* hdr image loader
|
||||||
|
* handling of opacity maps in 3ds loader
|
||||||
|
* dxf loader
|
||||||
|
* frame buffer object
|
||||||
|
* cursor/event handling in windows
|
||||||
|
* windows threading
|
||||||
|
* memory leak in Collada loader
|
||||||
|
* fixes to display lists/vbo creation that prevent crash under ATI drivers
|
||||||
|
* subface PolygonOffset setting in OpenFlight
|
||||||
|
* osgconv --formats under OSX
|
||||||
|
* osgTerrain::Layer bounding volume calculation
|
||||||
|
|
||||||
|
=== Updates between 2.8 and 2.6 include: ===
|
||||||
|
|
||||||
|
* New osgVolume library for volume rendering, with support for:
|
||||||
|
* High quality GPU based Ray tracing
|
||||||
|
* Transfer functions
|
||||||
|
* Per pixel lighting
|
||||||
|
* Iso surface rendering
|
||||||
|
* Maximum Intensity Projection rendering
|
||||||
|
* Non-power-of-two 3D textures, and 3D texture compression
|
||||||
|
* DICOM loading for reading dicom medical data
|
||||||
|
* New osgAnimation library for character and scene animation.
|
||||||
|
* New plugin for reading Biovision hierarchical files (.BVH) to generate character motion animations.
|
||||||
|
* New osgShadow support for Light Space Perspective Shadow Maps (LispSM).
|
||||||
|
* Three new scene graph widgets for placing traditional 2D capability into fully interactive 3D scenes:
|
||||||
|
* PDF widget (based on libPoppler)
|
||||||
|
* VNC client widget (based on libVNCServer)
|
||||||
|
* Internet browser client widget (based on Gecko/UBrowser)
|
||||||
|
* New plugins for loading Half-Life 2 maps and models.
|
||||||
|
* New plugin for loading EXR, high dynamic range imagery
|
||||||
|
* Improvements to !DatabasePager, tailored for low latency paging.
|
||||||
|
* Improved runtime stats collection and on screen reporting.
|
||||||
|
* Performance improvements through optimization of matrix operations.
|
||||||
|
* Support for the OpenGL "draw instanced" extension.
|
||||||
|
* Support for zlib compressed native .ive and .gz files
|
||||||
|
* Improvements to COLLADA support.
|
||||||
|
* Build reporting using CDash
|
||||||
|
* New packaging support using CPack
|
||||||
|
* A wide range of build and bug fixes
|
||||||
|
|
||||||
|
=== Downloads and Licensing ===
|
||||||
|
!OpenSceneGraph is open-source, so full source code is provided, and can be copied, modified and used free of charge for commercial and non-commercial use. Access to the source allows end users greater flexibility in how they develop, debug and deploy their applications. They gain productivity and freedom by being able to leverage the tool chain in accordance with their own release cycles. Downloads of binaries and source can be found in the [http://www.openscenegraph.org/projects/osg/wiki/Downloads Downloads] section of the openscenegraph.org website.
|
||||||
|
|
||||||
|
!OpenSceneGraph is released under the [http://www.openscenegraph.org/projects/osg/wiki/Legal OpenSceneGraph Public License], which is based on the Lesser GNU Public License (LGPL), permitting the software to be used free of charge across the full spectrum of commercial and open-source applications. Furthermore, it allows both static and dynamic linking of the !OpenSceneGraph libraries without restricting the licensing of the user's software.
|
||||||
|
|
||||||
|
=== !OpenSceneGraph Books now available ===
|
||||||
|
|
||||||
|
The !OpenSceneGraph Quick Start Guide is now available in Chinese as well as English, and alongside the Reference Manual, books can be found at [http://www.osgbooks.com OsgBooks].
|
||||||
|
|
||||||
|
=== Professional support and services ===
|
||||||
|
!OpenSceneGraph project is backed up with professional services by [http://www.openscenegraph.com OpenSceneGraph Professional Services], based in Scotland, and [http://www.skew-matrix.com Skew-Matrix] and [http://www.blue-newt.com Blue-Newt Software] both based in the USA, and a range of [wiki:Community/Contractors Contractors] from around the world. Services available include:
|
||||||
|
|
||||||
|
* Confidential Professional Support
|
||||||
|
* Bespoke development
|
||||||
|
* Consultancy
|
||||||
|
* Training
|
||||||
|
|
||||||
|
=== Community support and contributions ===
|
||||||
|
The diverse and growing community of over 2000 developers is centred around the public osg-users mailing list, where members discuss how best to use !OpenSceneGraph, provide mutual support, and coordinate development of new features and bug fixes. Members of this community come from many different countries with backgrounds ranging from some of the world's largest aerospace companies, game companies, and visual simulation specialists to university researchers, students and hobbyists.
|
||||||
|
|
||||||
|
The !OpenSceneGraph project owes a great deal to the community for its development and support, in particular we wish to thank the [http://www.openscenegraph.org/projects/osg/wiki/Support/Contributors/TwoPointEight 365 individuals] from around the world that have directly contributed to the development and refinement of the !OpenSceneGraph code base.
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
About !OpenSceneGraph: [[BR]]
|
||||||
|
The !OpenSceneGraph Project was founded in September 1999 by Don Burns and Robert Osfield.
|
||||||
|
Further information, screenshots, downloads, documentation, and support links can be found on the !OpenSceneGraph project website http://www.openscenegraph.org.
|
||||||
|
|
||||||
|
About !OpenSceneGraph Professional Services:[[BR]]
|
||||||
|
!OpenSceneGraph Professional Services, founded by project lead Robert Osfield in April 2001, is based in Callander, Perhshire, Scotland, and provides professional services on top of !OpenSceneGraph. Further information about the services it provides can be found at http://www.openscenegraph.com.
|
||||||
|
|
||||||
|
----------------------------------------------------------------------------------------
|
||||||
|
|
||||||
= !OpenSceneGraph 2.8.1 release - bug fix release =
|
= !OpenSceneGraph 2.8.1 release - bug fix release =
|
||||||
|
|
||||||
PERTHSHIRE, Scotland - 19th May 2009 - !OpenSceneGraph Professional Services announces the release of !OpenSceneGraph 2.8.1, the industry's leading open-source scene graph technology, designed to accelerate application development and improve 3D graphics performance. !OpenSceneGraph 2.8 written entirely in Standard C++ and built upon OpenGL, offers developers working in the visual simulation, game development, virtual reality, scientific visualization and modeling markets - a real-time visualization tool which eclipses commercial scene graph toolkits in functionality, stability and performance. !OpenSceneGraph 2.8 runs on all Microsoft Windows platforms, Apple OS/X, GNU/Linux, IRIX, Solaris, HP-UX, AIX and FreeBSD operating systems.
|
PERTHSHIRE, Scotland - 19th May 2009 - !OpenSceneGraph Professional Services announces the release of !OpenSceneGraph 2.8.1, the industry's leading open-source scene graph technology, designed to accelerate application development and improve 3D graphics performance. !OpenSceneGraph 2.8 written entirely in Standard C++ and built upon OpenGL, offers developers working in the visual simulation, game development, virtual reality, scientific visualization and modeling markets - a real-time visualization tool which eclipses commercial scene graph toolkits in functionality, stability and performance. !OpenSceneGraph 2.8 runs on all Microsoft Windows platforms, Apple OS/X, GNU/Linux, IRIX, Solaris, HP-UX, AIX and FreeBSD operating systems.
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ subscribe to our public mailing list:
|
|||||||
|
|
||||||
Robert Osfield.
|
Robert Osfield.
|
||||||
Project Lead.
|
Project Lead.
|
||||||
19th May 2009.
|
28th July 2009.
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ SET(TARGET_SRC osgversion.cpp )
|
|||||||
IF (OSG_MAINTAINER)
|
IF (OSG_MAINTAINER)
|
||||||
SET(TARGET_SRC ${TARGET_SRC} Contributors.cpp )
|
SET(TARGET_SRC ${TARGET_SRC} Contributors.cpp )
|
||||||
ADD_DEFINITIONS("-DBUILD_CONTRIBUTORS")
|
ADD_DEFINITIONS("-DBUILD_CONTRIBUTORS")
|
||||||
ENDIF()
|
ENDIF(OSG_MAINTAINER)
|
||||||
|
|
||||||
SET(TARGET_COMMON_LIBRARIES
|
SET(TARGET_COMMON_LIBRARIES
|
||||||
OpenThreads
|
OpenThreads
|
||||||
|
|||||||
@@ -311,6 +311,7 @@ TypoCorrection typoCorrections[] =
|
|||||||
{"Keuhne", "Kuehne"},
|
{"Keuhne", "Kuehne"},
|
||||||
{"Kheune", "Kuehne"},
|
{"Kheune", "Kuehne"},
|
||||||
{"Lagrade", "Lagarde"},
|
{"Lagrade", "Lagarde"},
|
||||||
|
{"Largade", "Lagarde"},
|
||||||
{"Larshkari", "Lashkari"},
|
{"Larshkari", "Lashkari"},
|
||||||
{"Lashakari", "Lashkari"},
|
{"Lashakari", "Lashkari"},
|
||||||
{"Lashari", "Lashkari"},
|
{"Lashari", "Lashkari"},
|
||||||
@@ -377,6 +378,7 @@ TypoCorrection typoCorrections[] =
|
|||||||
{"Sylvan", "Sylvain"},
|
{"Sylvan", "Sylvain"},
|
||||||
{"Takeahei", "Takahei"},
|
{"Takeahei", "Takahei"},
|
||||||
{"Takehei", "Takahei"},
|
{"Takehei", "Takahei"},
|
||||||
|
{"Tery", "Terry"},
|
||||||
{"Tarantilils", "Tarantilis"},
|
{"Tarantilils", "Tarantilis"},
|
||||||
{"Trastenjak", "Trstenjak"},
|
{"Trastenjak", "Trstenjak"},
|
||||||
{"Urlich", "Ulrich"},
|
{"Urlich", "Ulrich"},
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/* -*-c++-*-
|
/* -*-c++-*-
|
||||||
* Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
|
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net>
|
||||||
*
|
*
|
||||||
* This library is open source and may be redistributed and/or modified under
|
* This library is open source and may be redistributed and/or modified under
|
||||||
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
@@ -157,22 +157,26 @@ struct ExampleTimelineUsage : public osgGA::GUIEventHandler
|
|||||||
|
|
||||||
int main (int argc, char* argv[])
|
int main (int argc, char* argv[])
|
||||||
{
|
{
|
||||||
std::cerr << "This example works only with osgAnimation/nathan.osg" << std::endl;
|
std::cerr << "This example works only with nathan.osg" << std::endl;
|
||||||
|
|
||||||
osg::ArgumentParser psr(&argc, argv);
|
osg::ArgumentParser psr(&argc, argv);
|
||||||
|
|
||||||
osgViewer::Viewer viewer(psr);
|
osgViewer::Viewer viewer(psr);
|
||||||
|
|
||||||
std::string file = "osgAnimation/nathan.osg";
|
std::string file = "nathan.osg";
|
||||||
if(argc >= 2)
|
if(argc >= 2)
|
||||||
file = psr[1];
|
file = psr[1];
|
||||||
|
|
||||||
// replace the manager
|
// replace the manager
|
||||||
osg::Group* root = dynamic_cast<osg::Group*>(osgDB::readNodeFile(file));
|
osg::Group* root = dynamic_cast<osg::Group*>(osgDB::readNodeFile(file));
|
||||||
|
if (!root) {
|
||||||
|
osg::notify(osg::FATAL) << "can't read file " << file << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
osgAnimation::AnimationManagerBase* animationManager = dynamic_cast<osgAnimation::AnimationManagerBase*>(root->getUpdateCallback());
|
osgAnimation::AnimationManagerBase* animationManager = dynamic_cast<osgAnimation::AnimationManagerBase*>(root->getUpdateCallback());
|
||||||
if(!animationManager)
|
if(!animationManager)
|
||||||
{
|
{
|
||||||
std::cerr << "Did not find AnimationManagerBase updateCallback needed to animate elements" << std::endl;
|
osg::notify(osg::FATAL) << "Did not find AnimationManagerBase updateCallback needed to animate elements" << std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -600,6 +600,9 @@ int main(int argc, char** argv)
|
|||||||
|
|
||||||
if (arguments.read("--sv"))
|
if (arguments.read("--sv"))
|
||||||
{
|
{
|
||||||
|
// sv isn't yet thread safe
|
||||||
|
viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);
|
||||||
|
|
||||||
// hint to tell viewer to request stencil buffer when setting up windows
|
// hint to tell viewer to request stencil buffer when setting up windows
|
||||||
osg::DisplaySettings::instance()->setMinimumNumStencilBits(8);
|
osg::DisplaySettings::instance()->setMinimumNumStencilBits(8);
|
||||||
|
|
||||||
@@ -622,6 +625,9 @@ int main(int argc, char** argv)
|
|||||||
}
|
}
|
||||||
else if (arguments.read("--pssm"))
|
else if (arguments.read("--pssm"))
|
||||||
{
|
{
|
||||||
|
// pssm isn't yet thread safe
|
||||||
|
viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);
|
||||||
|
|
||||||
int mapcount = 3;
|
int mapcount = 3;
|
||||||
while (arguments.read("--mapcount", mapcount));
|
while (arguments.read("--mapcount", mapcount));
|
||||||
osg::ref_ptr<osgShadow::ParallelSplitShadowMap> pssm = new osgShadow::ParallelSplitShadowMap(NULL,mapcount);
|
osg::ref_ptr<osgShadow::ParallelSplitShadowMap> pssm = new osgShadow::ParallelSplitShadowMap(NULL,mapcount);
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ class OSG_EXPORT DisplaySettings : public osg::Referenced
|
|||||||
unsigned int getNumOfDatabaseThreadsHint() const { return _numDatabaseThreadsHint; }
|
unsigned int getNumOfDatabaseThreadsHint() const { return _numDatabaseThreadsHint; }
|
||||||
|
|
||||||
/** Set the hint for number of threads in the DatbasePager to dedicate to reading http requests.*/
|
/** Set the hint for number of threads in the DatbasePager to dedicate to reading http requests.*/
|
||||||
void setNumOfHttpDatabaseThreadsHint(unsigned int numThreads) { _numDatabaseThreadsHint = numThreads; }
|
void setNumOfHttpDatabaseThreadsHint(unsigned int numThreads) { _numHttpDatabaseThreadsHint = numThreads; }
|
||||||
|
|
||||||
/** Get the hint for number of threads in the DatbasePager dedicated to reading http requests.*/
|
/** Get the hint for number of threads in the DatbasePager dedicated to reading http requests.*/
|
||||||
unsigned int getNumOfHttpDatabaseThreadsHint() const { return _numHttpDatabaseThreadsHint; }
|
unsigned int getNumOfHttpDatabaseThreadsHint() const { return _numHttpDatabaseThreadsHint; }
|
||||||
|
|||||||
@@ -26,9 +26,14 @@ enum Endian
|
|||||||
|
|
||||||
inline Endian getCpuByteOrder()
|
inline Endian getCpuByteOrder()
|
||||||
{
|
{
|
||||||
static char big_endian_1[2] = { 0, 1 };
|
union {
|
||||||
|
char big_endian_1[2];
|
||||||
|
short is_it_really_1;
|
||||||
|
} u;
|
||||||
|
u.big_endian_1[0] = 0;
|
||||||
|
u.big_endian_1[1] = 1;
|
||||||
|
|
||||||
if ( (*((short*) big_endian_1)) == 1)
|
if (u.is_it_really_1 == 1)
|
||||||
return BigEndian;
|
return BigEndian;
|
||||||
else
|
else
|
||||||
return LittleEndian;
|
return LittleEndian;
|
||||||
|
|||||||
@@ -31,6 +31,13 @@ namespace osg {
|
|||||||
class DeleteHandler;
|
class DeleteHandler;
|
||||||
class Observer;
|
class Observer;
|
||||||
|
|
||||||
|
/** template class to help enforce static initialization order. */
|
||||||
|
template <typename T, T M()>
|
||||||
|
struct depends_on
|
||||||
|
{
|
||||||
|
depends_on() { M(); }
|
||||||
|
};
|
||||||
|
|
||||||
/** Base class from providing referencing counted objects.*/
|
/** Base class from providing referencing counted objects.*/
|
||||||
class OSG_EXPORT Referenced
|
class OSG_EXPORT Referenced
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ extern "C" {
|
|||||||
|
|
||||||
#define OPENSCENEGRAPH_MAJOR_VERSION 2
|
#define OPENSCENEGRAPH_MAJOR_VERSION 2
|
||||||
#define OPENSCENEGRAPH_MINOR_VERSION 8
|
#define OPENSCENEGRAPH_MINOR_VERSION 8
|
||||||
#define OPENSCENEGRAPH_PATCH_VERSION 1
|
#define OPENSCENEGRAPH_PATCH_VERSION 2
|
||||||
#define OPENSCENEGRAPH_SOVERSION 55
|
#define OPENSCENEGRAPH_SOVERSION 55
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ public:
|
|||||||
if (have_waiters)
|
if (have_waiters)
|
||||||
{
|
{
|
||||||
// Wake up all the waiters.
|
// Wake up all the waiters.
|
||||||
ReleaseSemaphore(sema_.get(),waiters_,NULL);
|
ReleaseSemaphore(sema_.get(), w, NULL);
|
||||||
|
|
||||||
cooperativeWait(waiters_done_.get(), INFINITE);
|
cooperativeWait(waiters_done_.get(), INFINITE);
|
||||||
|
|
||||||
@@ -112,8 +112,7 @@ public:
|
|||||||
}
|
}
|
||||||
catch(...){
|
catch(...){
|
||||||
// thread is canceled in cooperative wait , do cleanup
|
// thread is canceled in cooperative wait , do cleanup
|
||||||
InterlockedDecrement(&waiters_);
|
long w = InterlockedDecrement(&waiters_);
|
||||||
long w = InterlockedGet(&waiters_);
|
|
||||||
int last_waiter = was_broadcast_ && w == 0;
|
int last_waiter = was_broadcast_ && w == 0;
|
||||||
|
|
||||||
if (last_waiter) SetEvent(waiters_done_.get());
|
if (last_waiter) SetEvent(waiters_done_.get());
|
||||||
@@ -123,8 +122,7 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
// We're ready to return, so there's one less waiter.
|
// We're ready to return, so there's one less waiter.
|
||||||
InterlockedDecrement(&waiters_);
|
long w = InterlockedDecrement(&waiters_);
|
||||||
long w = InterlockedGet(&waiters_);
|
|
||||||
int last_waiter = was_broadcast_ && w == 0;
|
int last_waiter = was_broadcast_ && w == 0;
|
||||||
|
|
||||||
if (result != -1 && last_waiter)
|
if (result != -1 && last_waiter)
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
#include <osg/ArgumentParser>
|
#include <osg/ArgumentParser>
|
||||||
#include <osg/ApplicationUsage>
|
#include <osg/ApplicationUsage>
|
||||||
|
#include <osg/Math>
|
||||||
#include <osg/Notify>
|
#include <osg/Notify>
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
@@ -163,8 +164,8 @@ bool ArgumentParser::Parameter::assign(const char* str)
|
|||||||
*_value._bool = (strcmp(str,"True")==0 || strcmp(str,"true")==0 || strcmp(str,"TRUE")==0);
|
*_value._bool = (strcmp(str,"True")==0 || strcmp(str,"true")==0 || strcmp(str,"TRUE")==0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Parameter::FLOAT_PARAMETER: *_value._float = atof(str); break;
|
case Parameter::FLOAT_PARAMETER: *_value._float = osg::asciiToFloat(str); break;
|
||||||
case Parameter::DOUBLE_PARAMETER: *_value._double = atof(str); break;
|
case Parameter::DOUBLE_PARAMETER: *_value._double = osg::asciiToDouble(str); break;
|
||||||
case Parameter::INT_PARAMETER: *_value._int = atoi(str); break;
|
case Parameter::INT_PARAMETER: *_value._int = atoi(str); break;
|
||||||
case Parameter::UNSIGNED_INT_PARAMETER: *_value._uint = atoi(str); break;
|
case Parameter::UNSIGNED_INT_PARAMETER: *_value._uint = atoi(str); break;
|
||||||
case Parameter::STRING_PARAMETER: *_value._string = str; break;
|
case Parameter::STRING_PARAMETER: *_value._string = str; break;
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ void CullSettings::readEnvironmentalVariables()
|
|||||||
|
|
||||||
if ((ptr = getenv("OSG_NEAR_FAR_RATIO")) != 0)
|
if ((ptr = getenv("OSG_NEAR_FAR_RATIO")) != 0)
|
||||||
{
|
{
|
||||||
_nearFarRatio = atof(ptr);
|
_nearFarRatio = osg::asciiToDouble(ptr);
|
||||||
|
|
||||||
osg::notify(osg::INFO)<<"Set near/far ratio to "<<_nearFarRatio<<std::endl;
|
osg::notify(osg::INFO)<<"Set near/far ratio to "<<_nearFarRatio<<std::endl;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
#include <osg/DisplaySettings>
|
#include <osg/DisplaySettings>
|
||||||
#include <osg/ArgumentParser>
|
#include <osg/ArgumentParser>
|
||||||
#include <osg/ApplicationUsage>
|
#include <osg/ApplicationUsage>
|
||||||
|
#include <osg/Math>
|
||||||
#include <osg/Notify>
|
#include <osg/Notify>
|
||||||
#include <osg/ref_ptr>
|
#include <osg/ref_ptr>
|
||||||
|
|
||||||
@@ -267,22 +268,22 @@ void DisplaySettings::readEnvironmentalVariables()
|
|||||||
|
|
||||||
if( (ptr = getenv("OSG_EYE_SEPARATION")) != 0)
|
if( (ptr = getenv("OSG_EYE_SEPARATION")) != 0)
|
||||||
{
|
{
|
||||||
_eyeSeparation = atof(ptr);
|
_eyeSeparation = osg::asciiToFloat(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( (ptr = getenv("OSG_SCREEN_WIDTH")) != 0)
|
if( (ptr = getenv("OSG_SCREEN_WIDTH")) != 0)
|
||||||
{
|
{
|
||||||
_screenWidth = atof(ptr);
|
_screenWidth = osg::asciiToFloat(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( (ptr = getenv("OSG_SCREEN_HEIGHT")) != 0)
|
if( (ptr = getenv("OSG_SCREEN_HEIGHT")) != 0)
|
||||||
{
|
{
|
||||||
_screenHeight = atof(ptr);
|
_screenHeight = osg::asciiToFloat(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( (ptr = getenv("OSG_SCREEN_DISTANCE")) != 0)
|
if( (ptr = getenv("OSG_SCREEN_DISTANCE")) != 0)
|
||||||
{
|
{
|
||||||
_screenDistance = atof(ptr);
|
_screenDistance = osg::asciiToFloat(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( (ptr = getenv("OSG_SPLIT_STEREO_HORIZONTAL_EYE_MAPPING")) != 0)
|
if( (ptr = getenv("OSG_SPLIT_STEREO_HORIZONTAL_EYE_MAPPING")) != 0)
|
||||||
|
|||||||
@@ -819,6 +819,7 @@ void GraphicsContext::resizedImplementation(int x, int y, int width, int height)
|
|||||||
osg::View* view = camera->getView();
|
osg::View* view = camera->getView();
|
||||||
osg::View::Slave* slave = view ? view->findSlaveForCamera(camera) : 0;
|
osg::View::Slave* slave = view ? view->findSlaveForCamera(camera) : 0;
|
||||||
|
|
||||||
|
|
||||||
if (slave)
|
if (slave)
|
||||||
{
|
{
|
||||||
if (camera->getReferenceFrame()==osg::Transform::RELATIVE_RF)
|
if (camera->getReferenceFrame()==osg::Transform::RELATIVE_RF)
|
||||||
@@ -849,6 +850,29 @@ void GraphicsContext::resizedImplementation(int x, int y, int width, int height)
|
|||||||
case(osg::Camera::VERTICAL): camera->getProjectionMatrix() *= osg::Matrix::scale(1.0, aspectRatioChange,1.0); break;
|
case(osg::Camera::VERTICAL): camera->getProjectionMatrix() *= osg::Matrix::scale(1.0, aspectRatioChange,1.0); break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
osg::Camera* master = view ? view->getCamera() : 0;
|
||||||
|
if (view && camera==master)
|
||||||
|
{
|
||||||
|
for(unsigned int i=0; i<view->getNumSlaves(); ++i)
|
||||||
|
{
|
||||||
|
osg::View::Slave& child = view->getSlave(i);
|
||||||
|
if (child._camera.valid() && child._camera->getReferenceFrame()==osg::Transform::RELATIVE_RF)
|
||||||
|
{
|
||||||
|
// scale the slaves by the inverse of the change that has been applied to master, to avoid them be
|
||||||
|
// scaled twice (such as when both master and slave are on the same GraphicsContexts) or by the wrong scale
|
||||||
|
// when master and slave are on different GraphicsContexts.
|
||||||
|
switch(policy)
|
||||||
|
{
|
||||||
|
case(osg::Camera::HORIZONTAL): child._projectionOffset *= osg::Matrix::scale(aspectRatioChange,1.0,1.0); break;
|
||||||
|
case(osg::Camera::VERTICAL): child._projectionOffset *= osg::Matrix::scale(1.0, 1.0/aspectRatioChange,1.0); break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -198,8 +198,7 @@ void Texture2D::apply(State& state) const
|
|||||||
// compute the dimensions of the texture.
|
// compute the dimensions of the texture.
|
||||||
computeRequiredTextureDimensions(state,*image,_textureWidth, _textureHeight, _numMipmapLevels);
|
computeRequiredTextureDimensions(state,*image,_textureWidth, _textureHeight, _numMipmapLevels);
|
||||||
|
|
||||||
|
_textureObjectBuffer[contextID] = textureObject = generateTextureObject(
|
||||||
textureObject = generateTextureObject(
|
|
||||||
contextID,GL_TEXTURE_2D,_numMipmapLevels,_internalFormat,_textureWidth,_textureHeight,1,0);
|
contextID,GL_TEXTURE_2D,_numMipmapLevels,_internalFormat,_textureWidth,_textureHeight,1,0);
|
||||||
|
|
||||||
textureObject->bind();
|
textureObject->bind();
|
||||||
@@ -221,12 +220,9 @@ void Texture2D::apply(State& state) const
|
|||||||
textureObject->setAllocated(true);
|
textureObject->setAllocated(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// update the modified tag to show that it is upto date.
|
// update the modified tag to show that it is upto date.
|
||||||
getModifiedCount(contextID) = image->getModifiedCount();
|
getModifiedCount(contextID) = image->getModifiedCount();
|
||||||
|
|
||||||
_textureObjectBuffer[contextID] = textureObject;
|
|
||||||
|
|
||||||
if (_unrefImageDataAfterApply && areAllTextureObjectsLoaded() && image->getDataVariance()==STATIC)
|
if (_unrefImageDataAfterApply && areAllTextureObjectsLoaded() && image->getDataVariance()==STATIC)
|
||||||
{
|
{
|
||||||
Texture2D* non_const_this = const_cast<Texture2D*>(this);
|
Texture2D* non_const_this = const_cast<Texture2D*>(this);
|
||||||
|
|||||||
@@ -420,7 +420,7 @@ void Texture2DArray::applyTexImage2DArray_subload(State& state, Image* image, GL
|
|||||||
numMipmapLevels = 1;
|
numMipmapLevels = 1;
|
||||||
|
|
||||||
GLint blockSize, size;
|
GLint blockSize, size;
|
||||||
getCompressedSize(_internalFormat, inwidth, inheight, indepth, blockSize,size);
|
getCompressedSize(_internalFormat, inwidth, inheight, 1, blockSize,size);
|
||||||
|
|
||||||
extensions->glCompressedTexSubImage3D(target, 0,
|
extensions->glCompressedTexSubImage3D(target, 0,
|
||||||
0, 0, indepth,
|
0, 0, indepth,
|
||||||
|
|||||||
@@ -163,29 +163,28 @@ BoundingSphere Transform::computeBound() const
|
|||||||
|
|
||||||
computeLocalToWorldMatrix(l2w,NULL);
|
computeLocalToWorldMatrix(l2w,NULL);
|
||||||
|
|
||||||
Vec3 xdash = bsphere._center;
|
osg::BoundingSphere::vec_type xdash = bsphere._center;
|
||||||
xdash.x() += bsphere._radius;
|
xdash.x() += bsphere._radius;
|
||||||
xdash = xdash*l2w;
|
xdash = xdash*l2w;
|
||||||
|
|
||||||
Vec3 ydash = bsphere._center;
|
osg::BoundingSphere::vec_type ydash = bsphere._center;
|
||||||
ydash.y() += bsphere._radius;
|
ydash.y() += bsphere._radius;
|
||||||
ydash = ydash*l2w;
|
ydash = ydash*l2w;
|
||||||
|
|
||||||
Vec3 zdash = bsphere._center;
|
osg::BoundingSphere::vec_type zdash = bsphere._center;
|
||||||
zdash.z() += bsphere._radius;
|
zdash.z() += bsphere._radius;
|
||||||
zdash = zdash*l2w;
|
zdash = zdash*l2w;
|
||||||
|
|
||||||
|
|
||||||
bsphere._center = bsphere._center*l2w;
|
bsphere._center = bsphere._center*l2w;
|
||||||
|
|
||||||
xdash -= bsphere._center;
|
xdash -= bsphere._center;
|
||||||
float len_xdash = xdash.length();
|
osg::BoundingSphere::value_type len_xdash = xdash.length();
|
||||||
|
|
||||||
ydash -= bsphere._center;
|
ydash -= bsphere._center;
|
||||||
float len_ydash = ydash.length();
|
osg::BoundingSphere::value_type len_ydash = ydash.length();
|
||||||
|
|
||||||
zdash -= bsphere._center;
|
zdash -= bsphere._center;
|
||||||
float len_zdash = zdash.length();
|
osg::BoundingSphere::value_type len_zdash = zdash.length();
|
||||||
|
|
||||||
bsphere._radius = len_xdash;
|
bsphere._radius = len_xdash;
|
||||||
if (bsphere._radius<len_ydash) bsphere._radius = len_ydash;
|
if (bsphere._radius<len_ydash) bsphere._radius = len_ydash;
|
||||||
|
|||||||
@@ -885,7 +885,7 @@ DatabasePager::DatabasePager()
|
|||||||
_expiryDelay = 10.0;
|
_expiryDelay = 10.0;
|
||||||
if( (ptr = getenv("OSG_EXPIRY_DELAY")) != 0)
|
if( (ptr = getenv("OSG_EXPIRY_DELAY")) != 0)
|
||||||
{
|
{
|
||||||
_expiryDelay = atof(ptr);
|
_expiryDelay = osg::asciiToDouble(ptr);
|
||||||
osg::notify(osg::NOTICE)<<"Expiry delay = "<<_expiryDelay<<std::endl;
|
osg::notify(osg::NOTICE)<<"Expiry delay = "<<_expiryDelay<<std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -904,7 +904,7 @@ DatabasePager::DatabasePager()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
setReleaseDelay(atof(ptr));
|
setReleaseDelay(osg::asciiToDouble(ptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
osg::notify(osg::NOTICE)<<"Release delay = "<<_releaseDelay<<std::endl;
|
osg::notify(osg::NOTICE)<<"Release delay = "<<_releaseDelay<<std::endl;
|
||||||
@@ -943,7 +943,7 @@ DatabasePager::DatabasePager()
|
|||||||
_maximumNumOfObjectsToCompilePerFrame = 4;
|
_maximumNumOfObjectsToCompilePerFrame = 4;
|
||||||
if( (ptr = getenv("OSG_MINIMUM_COMPILE_TIME_PER_FRAME")) != 0)
|
if( (ptr = getenv("OSG_MINIMUM_COMPILE_TIME_PER_FRAME")) != 0)
|
||||||
{
|
{
|
||||||
_minimumTimeAvailableForGLCompileAndDeletePerFrame = atof(ptr);
|
_minimumTimeAvailableForGLCompileAndDeletePerFrame = osg::asciiToDouble(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( (ptr = getenv("OSG_MAXIMUM_OBJECTS_TO_COMPILE_PER_FRAME")) != 0)
|
if( (ptr = getenv("OSG_MAXIMUM_OBJECTS_TO_COMPILE_PER_FRAME")) != 0)
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ static double getHeightOfDriver()
|
|||||||
double height = 1.5;
|
double height = 1.5;
|
||||||
if (getenv("OSG_DRIVE_MANIPULATOR_HEIGHT"))
|
if (getenv("OSG_DRIVE_MANIPULATOR_HEIGHT"))
|
||||||
{
|
{
|
||||||
height = atof(getenv("OSG_DRIVE_MANIPULATOR_HEIGHT"));
|
height = osg::asciiToDouble(getenv("OSG_DRIVE_MANIPULATOR_HEIGHT"));
|
||||||
}
|
}
|
||||||
osg::notify(osg::INFO)<<"DriveManipulator::_height set to =="<<height<<std::endl;
|
osg::notify(osg::INFO)<<"DriveManipulator::_height set to =="<<height<<std::endl;
|
||||||
return height;
|
return height;
|
||||||
|
|||||||
@@ -148,9 +148,9 @@ osg::Matrix AntiSquish::computeUnSquishedMatrix(const osg::Matrix& LTW, bool& fl
|
|||||||
|
|
||||||
// Position
|
// Position
|
||||||
if (_usePosition)
|
if (_usePosition)
|
||||||
unsquished.postMult(_position);
|
unsquished.postMultTranslate(_position);
|
||||||
else
|
else
|
||||||
unsquished.postMult(_pivot);
|
unsquished.postMultTranslate(_pivot);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ osgParticle::ParticleSystemUpdater::ParticleSystemUpdater()
|
|||||||
}
|
}
|
||||||
|
|
||||||
osgParticle::ParticleSystemUpdater::ParticleSystemUpdater(const ParticleSystemUpdater& copy, const osg::CopyOp& copyop)
|
osgParticle::ParticleSystemUpdater::ParticleSystemUpdater(const ParticleSystemUpdater& copy, const osg::CopyOp& copyop)
|
||||||
: osg::Node(copy, copyop), _t0(copy._t0)
|
: osg::Node(copy, copyop), _t0(copy._t0), _frameNumber(0)
|
||||||
{
|
{
|
||||||
ParticleSystem_Vector::const_iterator i;
|
ParticleSystem_Vector::const_iterator i;
|
||||||
for (i=copy._psv.begin(); i!=copy._psv.end(); ++i) {
|
for (i=copy._psv.begin(); i!=copy._psv.end(); ++i) {
|
||||||
|
|||||||
@@ -163,6 +163,12 @@ ExportOptions::parseOptionsString()
|
|||||||
setStripTextureFilePath( true );
|
setStripTextureFilePath( true );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
// Protect against unrecognized options without values
|
||||||
|
if ( pos == str.npos )
|
||||||
|
{
|
||||||
|
osg::notify( osg::WARN ) << "fltexp: Bogus OptionString: " << token << std::endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Not a Boolean/toggle. Must have a value.
|
// Not a Boolean/toggle. Must have a value.
|
||||||
// Get the value of the token, which could be double-quoted.
|
// Get the value of the token, which could be double-quoted.
|
||||||
|
|||||||
@@ -647,24 +647,27 @@ FltExportVisitor::writeATTRFile( int unit, const osg::Texture2D* texture ) const
|
|||||||
const osg::StateSet* ss = getCurrentStateSet();
|
const osg::StateSet* ss = getCurrentStateSet();
|
||||||
const osg::TexEnv* texenv = dynamic_cast<const osg::TexEnv*>(
|
const osg::TexEnv* texenv = dynamic_cast<const osg::TexEnv*>(
|
||||||
ss->getTextureAttribute( unit, osg::StateAttribute::TEXENV ) );
|
ss->getTextureAttribute( unit, osg::StateAttribute::TEXENV ) );
|
||||||
switch( texenv->getMode())
|
if (texenv)
|
||||||
{
|
{
|
||||||
case osg::TexEnv::DECAL:
|
switch( texenv->getMode())
|
||||||
ad.texEnvMode = AttrData::TEXENV_DECAL;
|
{
|
||||||
break;
|
case osg::TexEnv::DECAL:
|
||||||
case osg::TexEnv::MODULATE:
|
ad.texEnvMode = AttrData::TEXENV_DECAL;
|
||||||
default:
|
break;
|
||||||
ad.texEnvMode = AttrData::TEXENV_MODULATE;
|
case osg::TexEnv::MODULATE:
|
||||||
break;
|
default:
|
||||||
case osg::TexEnv::BLEND:
|
ad.texEnvMode = AttrData::TEXENV_MODULATE;
|
||||||
ad.texEnvMode = AttrData::TEXENV_BLEND;
|
break;
|
||||||
break;
|
case osg::TexEnv::BLEND:
|
||||||
case osg::TexEnv::REPLACE:
|
ad.texEnvMode = AttrData::TEXENV_BLEND;
|
||||||
ad.texEnvMode = AttrData::TEXENV_COLOR;
|
break;
|
||||||
break;
|
case osg::TexEnv::REPLACE:
|
||||||
case osg::TexEnv::ADD:
|
ad.texEnvMode = AttrData::TEXENV_COLOR;
|
||||||
ad.texEnvMode = AttrData::TEXENV_ADD;
|
break;
|
||||||
break;
|
case osg::TexEnv::ADD:
|
||||||
|
ad.texEnvMode = AttrData::TEXENV_ADD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
osgDB::writeObjectFile( ad, name, _fltOpt.get() );
|
osgDB::writeObjectFile( ad, name, _fltOpt.get() );
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ void VBSPEntity::processItem()
|
|||||||
|
|
||||||
Vec3f VBSPEntity::getVector(std::string str)
|
Vec3f VBSPEntity::getVector(std::string str)
|
||||||
{
|
{
|
||||||
double x, y, z;
|
float x, y, z;
|
||||||
|
|
||||||
// Look for the first non-whitespace
|
// Look for the first non-whitespace
|
||||||
std::string::size_type start = str.find_first_not_of(" \t\r\n", 0);
|
std::string::size_type start = str.find_first_not_of(" \t\r\n", 0);
|
||||||
@@ -190,7 +190,7 @@ Vec3f VBSPEntity::getVector(std::string str)
|
|||||||
std::string::size_type end = str.find_first_of(" \t\r\n", start);
|
std::string::size_type end = str.find_first_of(" \t\r\n", start);
|
||||||
|
|
||||||
if ((end > start) && (start != std::string::npos))
|
if ((end > start) && (start != std::string::npos))
|
||||||
x = atof(str.substr(start, end-start).c_str());
|
x = osg::asciiToFloat(str.substr(start, end-start).c_str());
|
||||||
else
|
else
|
||||||
return Vec3f();
|
return Vec3f();
|
||||||
|
|
||||||
@@ -201,7 +201,7 @@ Vec3f VBSPEntity::getVector(std::string str)
|
|||||||
end = str.find_first_of(" \t\r\n", start);
|
end = str.find_first_of(" \t\r\n", start);
|
||||||
|
|
||||||
if ((end > start) && (start != std::string::npos))
|
if ((end > start) && (start != std::string::npos))
|
||||||
y = atof(str.substr(start, end-start).c_str());
|
y = osg::asciiToFloat(str.substr(start, end-start).c_str());
|
||||||
else
|
else
|
||||||
return Vec3f();
|
return Vec3f();
|
||||||
|
|
||||||
@@ -214,7 +214,7 @@ Vec3f VBSPEntity::getVector(std::string str)
|
|||||||
end = str.length();
|
end = str.length();
|
||||||
|
|
||||||
if ((end > start) && (start != std::string::npos))
|
if ((end > start) && (start != std::string::npos))
|
||||||
z = atof(str.substr(start, end-start).c_str());
|
z = osg::asciiToFloat(str.substr(start, end-start).c_str());
|
||||||
else
|
else
|
||||||
return Vec3f();
|
return Vec3f();
|
||||||
|
|
||||||
@@ -315,45 +315,45 @@ void VBSPEntity::parseParameters(std::string & entityText)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get the class name and process the entity appropriately
|
// Get the class name and process the entity appropriately
|
||||||
std::string className = (*param).second;
|
class_name = (*param).second;
|
||||||
if (className.compare("worldspawn") == 0)
|
if (class_name.compare("worldspawn") == 0)
|
||||||
{
|
{
|
||||||
// This is the entity that represents the main geometry of the map
|
// This is the entity that represents the main geometry of the map
|
||||||
// (the terrain and much of the static geometry)
|
// (the terrain and much of the static geometry)
|
||||||
entity_class = ENTITY_WORLDSPAWN;
|
entity_class = ENTITY_WORLDSPAWN;
|
||||||
processWorldSpawn();
|
processWorldSpawn();
|
||||||
}
|
}
|
||||||
else if (className.compare(0, 3, "env") == 0)
|
else if (class_name.compare(0, 3, "env") == 0)
|
||||||
{
|
{
|
||||||
// This is an environmental effect (such as a fire or dust cloud)
|
// This is an environmental effect (such as a fire or dust cloud)
|
||||||
entity_class = ENTITY_ENV;
|
entity_class = ENTITY_ENV;
|
||||||
processEnv();
|
processEnv();
|
||||||
}
|
}
|
||||||
else if ((className.compare("func_brush") == 0) ||
|
else if ((class_name.compare("func_brush") == 0) ||
|
||||||
(className.compare("func_illusionary") == 0) ||
|
(class_name.compare("func_illusionary") == 0) ||
|
||||||
(className.compare("func_wall_toggle") == 0) ||
|
(class_name.compare("func_wall_toggle") == 0) ||
|
||||||
(className.compare("func_breakable") == 0))
|
(class_name.compare("func_breakable") == 0))
|
||||||
{
|
{
|
||||||
// This is secondary map geometry, created along with the main
|
// This is secondary map geometry, created along with the main
|
||||||
// map geometry (not an external model)
|
// map geometry (not an external model)
|
||||||
entity_class = ENTITY_FUNC_BRUSH;
|
entity_class = ENTITY_FUNC_BRUSH;
|
||||||
processFuncBrush();
|
processFuncBrush();
|
||||||
}
|
}
|
||||||
else if (className.compare(0, 4, "prop") == 0)
|
else if (class_name.compare(0, 4, "prop") == 0)
|
||||||
{
|
{
|
||||||
// This is a "prop", an external model placed somewhere in the
|
// This is a "prop", an external model placed somewhere in the
|
||||||
// scene
|
// scene
|
||||||
entity_class = ENTITY_PROP;
|
entity_class = ENTITY_PROP;
|
||||||
processProp();
|
processProp();
|
||||||
}
|
}
|
||||||
else if (className.compare("infodecal") == 0)
|
else if (class_name.compare("infodecal") == 0)
|
||||||
{
|
{
|
||||||
// This is a decal, which applies a texture to some surface in the
|
// This is a decal, which applies a texture to some surface in the
|
||||||
// scene
|
// scene
|
||||||
entity_class = ENTITY_INFO_DECAL;
|
entity_class = ENTITY_INFO_DECAL;
|
||||||
processInfoDecal();
|
processInfoDecal();
|
||||||
}
|
}
|
||||||
else if (className.compare(0, 4, "item") == 0)
|
else if (class_name.compare(0, 4, "item") == 0)
|
||||||
{
|
{
|
||||||
// This is an "item". Like a prop, these are external models
|
// This is an "item". Like a prop, these are external models
|
||||||
// placed in the scene, but the specific model is determined
|
// placed in the scene, but the specific model is determined
|
||||||
@@ -367,19 +367,20 @@ void VBSPEntity::parseParameters(std::string & entityText)
|
|||||||
|
|
||||||
ref_ptr<Group> VBSPEntity::createBrushGeometry()
|
ref_ptr<Group> VBSPEntity::createBrushGeometry()
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int numGeoms;
|
int numGeoms;
|
||||||
VBSPGeometry ** vbspGeomList;
|
VBSPGeometry ** vbspGeomList;
|
||||||
Model currentModel;
|
Model currentModel;
|
||||||
Face currentFace;
|
Face currentFace;
|
||||||
TexInfo currentTexInfo;
|
TexInfo currentTexInfo;
|
||||||
TexData currentTexData;
|
TexData currentTexData;
|
||||||
const char * texName;
|
const char * texName;
|
||||||
char currentTexName[256];
|
char currentTexName[256];
|
||||||
int currentGeomIndex;
|
int currentGeomIndex;
|
||||||
VBSPGeometry * currentGeom;
|
VBSPGeometry * currentGeom;
|
||||||
ref_ptr<Group> entityGroup;
|
ref_ptr<Group> entityGroup;
|
||||||
ref_ptr<Group> geomGroup;
|
ref_ptr<Group> geomGroup;
|
||||||
|
std::stringstream groupName;
|
||||||
|
|
||||||
// Create a list of VBSPGeometry objects for each texdata entry in the
|
// Create a list of VBSPGeometry objects for each texdata entry in the
|
||||||
// scene. These objects will hold the necessary geometry data until we
|
// scene. These objects will hold the necessary geometry data until we
|
||||||
@@ -501,6 +502,10 @@ ref_ptr<Group> VBSPEntity::createBrushGeometry()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Name the entity group
|
||||||
|
groupName << class_name << ":" << entity_model_index;
|
||||||
|
entityGroup->setName(groupName.str());
|
||||||
|
|
||||||
// Return the group we created
|
// Return the group we created
|
||||||
return entityGroup;
|
return entityGroup;
|
||||||
}
|
}
|
||||||
@@ -549,6 +554,9 @@ ref_ptr<Group> VBSPEntity::createModelGeometry()
|
|||||||
|
|
||||||
// Add the model node to the group
|
// Add the model node to the group
|
||||||
entityGroup->addChild(modelNode.get());
|
entityGroup->addChild(modelNode.get());
|
||||||
|
|
||||||
|
// Set the group's name
|
||||||
|
entityGroup->setName(class_name + std::string(":") + entity_model);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ protected:
|
|||||||
VBSPData * bsp_data;
|
VBSPData * bsp_data;
|
||||||
|
|
||||||
EntityClass entity_class;
|
EntityClass entity_class;
|
||||||
|
std::string class_name;
|
||||||
|
|
||||||
typedef std::pair<std::string, std::string> EntityParameter;
|
typedef std::pair<std::string, std::string> EntityParameter;
|
||||||
typedef std::map<std::string, std::string> EntityParameters;
|
typedef std::map<std::string, std::string> EntityParameters;
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <osg/Geode>
|
#include <osg/Geode>
|
||||||
|
#include <osgUtil/TriStripVisitor>
|
||||||
|
|
||||||
#include "VBSPGeometry.h"
|
#include "VBSPGeometry.h"
|
||||||
|
|
||||||
@@ -647,6 +648,12 @@ ref_ptr<Group> VBSPGeometry::createGeometry()
|
|||||||
|
|
||||||
// Add the geometry to the geode
|
// Add the geometry to the geode
|
||||||
geode->addDrawable(geometry.get());
|
geode->addDrawable(geometry.get());
|
||||||
|
|
||||||
|
// Now, stripify the geode to convert the POLYGON primitives to
|
||||||
|
// triangle strips
|
||||||
|
osgUtil::TriStripVisitor tsv;
|
||||||
|
geode->accept(tsv);
|
||||||
|
tsv.stripify();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now do the same for the displacement surfaces (if any)
|
// Now do the same for the displacement surfaces (if any)
|
||||||
|
|||||||
@@ -745,8 +745,10 @@ ref_ptr<StateSet> VBSPReader::readMaterialFile(std::string materialName)
|
|||||||
std::string tex2Name;
|
std::string tex2Name;
|
||||||
ref_ptr<Texture> texture;
|
ref_ptr<Texture> texture;
|
||||||
ref_ptr<Texture> texture2;
|
ref_ptr<Texture> texture2;
|
||||||
|
ref_ptr<Material> material;
|
||||||
ref_ptr<BlendFunc> blend;
|
ref_ptr<BlendFunc> blend;
|
||||||
bool translucent;
|
bool translucent;
|
||||||
|
double alpha;
|
||||||
|
|
||||||
// Find the material file
|
// Find the material file
|
||||||
mtlFileName = std::string(materialName) + ".vmt";
|
mtlFileName = std::string(materialName) + ".vmt";
|
||||||
@@ -818,6 +820,9 @@ ref_ptr<StateSet> VBSPReader::readMaterialFile(std::string materialName)
|
|||||||
// Assume no transparency unless the properties say otherwise
|
// Assume no transparency unless the properties say otherwise
|
||||||
translucent = false;
|
translucent = false;
|
||||||
|
|
||||||
|
// Assume fully opaque
|
||||||
|
alpha = 1.0;
|
||||||
|
|
||||||
// Read the material properties next
|
// Read the material properties next
|
||||||
while (!mtlFile->eof())
|
while (!mtlFile->eof())
|
||||||
{
|
{
|
||||||
@@ -858,6 +863,17 @@ ref_ptr<StateSet> VBSPReader::readMaterialFile(std::string materialName)
|
|||||||
if ((token == "1") || (token == "true"))
|
if ((token == "1") || (token == "true"))
|
||||||
translucent = true;
|
translucent = true;
|
||||||
}
|
}
|
||||||
|
else if (equalCaseInsensitive(token, "$alpha"))
|
||||||
|
{
|
||||||
|
// Get the translucency setting
|
||||||
|
token = getToken(line, " \t\n\r\"", start);
|
||||||
|
|
||||||
|
// Interpret the setting
|
||||||
|
if (!token.empty())
|
||||||
|
{
|
||||||
|
alpha = atof(token.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Try the next token
|
// Try the next token
|
||||||
token = getToken(line, " \t\n\r\"", start);
|
token = getToken(line, " \t\n\r\"", start);
|
||||||
@@ -873,6 +889,20 @@ ref_ptr<StateSet> VBSPReader::readMaterialFile(std::string materialName)
|
|||||||
// This shader blends between two textures based on a per-vertex
|
// This shader blends between two textures based on a per-vertex
|
||||||
// attribute. This is used for displaced terrain surfaces in HL2 maps.
|
// attribute. This is used for displaced terrain surfaces in HL2 maps.
|
||||||
stateSet = createBlendShader(texture.get(), texture2.get());
|
stateSet = createBlendShader(texture.get(), texture2.get());
|
||||||
|
|
||||||
|
// Add a material to the state set
|
||||||
|
material = new Material();
|
||||||
|
material->setAmbient(Material::FRONT_AND_BACK,
|
||||||
|
Vec4(1.0, 1.0, 1.0, 1.0) );
|
||||||
|
material->setDiffuse(Material::FRONT_AND_BACK,
|
||||||
|
Vec4(1.0, 1.0, 1.0, 1.0) );
|
||||||
|
material->setSpecular(Material::FRONT_AND_BACK,
|
||||||
|
Vec4(0.0, 0.0, 0.0, 1.0) );
|
||||||
|
material->setShininess(Material::FRONT_AND_BACK, 1.0);
|
||||||
|
material->setEmission(Material::FRONT_AND_BACK,
|
||||||
|
Vec4(0.0, 0.0, 0.0, 1.0) );
|
||||||
|
material->setAlpha(Material::FRONT_AND_BACK, alpha);
|
||||||
|
stateSet->setAttributeAndModes(material.get(), StateAttribute::ON);
|
||||||
}
|
}
|
||||||
else if (equalCaseInsensitive(shaderName, "UnlitGeneric"))
|
else if (equalCaseInsensitive(shaderName, "UnlitGeneric"))
|
||||||
{
|
{
|
||||||
@@ -916,6 +946,20 @@ ref_ptr<StateSet> VBSPReader::readMaterialFile(std::string materialName)
|
|||||||
// Create the StateSet
|
// Create the StateSet
|
||||||
stateSet = new StateSet();
|
stateSet = new StateSet();
|
||||||
|
|
||||||
|
// Add a material to the state set
|
||||||
|
material = new Material();
|
||||||
|
material->setAmbient(Material::FRONT_AND_BACK,
|
||||||
|
Vec4(1.0, 1.0, 1.0, 1.0) );
|
||||||
|
material->setDiffuse(Material::FRONT_AND_BACK,
|
||||||
|
Vec4(1.0, 1.0, 1.0, 1.0) );
|
||||||
|
material->setSpecular(Material::FRONT_AND_BACK,
|
||||||
|
Vec4(0.0, 0.0, 0.0, 1.0) );
|
||||||
|
material->setShininess(Material::FRONT_AND_BACK, 1.0);
|
||||||
|
material->setEmission(Material::FRONT_AND_BACK,
|
||||||
|
Vec4(0.0, 0.0, 0.0, 1.0) );
|
||||||
|
material->setAlpha(Material::FRONT_AND_BACK, alpha);
|
||||||
|
stateSet->setAttributeAndModes(material.get(), StateAttribute::ON);
|
||||||
|
|
||||||
// Add the texture attribute (or disable texturing if no base texture)
|
// Add the texture attribute (or disable texturing if no base texture)
|
||||||
if (texture != NULL)
|
if (texture != NULL)
|
||||||
{
|
{
|
||||||
@@ -1081,8 +1125,13 @@ void VBSPReader::createScene()
|
|||||||
// If we loaded the prop correctly, add it to the scene
|
// If we loaded the prop correctly, add it to the scene
|
||||||
if (propNode.valid())
|
if (propNode.valid())
|
||||||
{
|
{
|
||||||
|
// Add the model to the transform node, and attach the transform
|
||||||
|
// to the scene
|
||||||
propXform->addChild(propNode.get());
|
propXform->addChild(propNode.get());
|
||||||
group->addChild(propXform.get());
|
group->addChild(propXform.get());
|
||||||
|
|
||||||
|
// Name the prop
|
||||||
|
propXform->setName(std::string("prop_static:" + propModel));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1932,21 +1932,21 @@ yyreduce:
|
|||||||
case 114:
|
case 114:
|
||||||
|
|
||||||
{
|
{
|
||||||
yyval.real = atof(flexer->YYText());
|
yyval.real = osg::asciiToFloat(flexer->YYText());
|
||||||
;}
|
;}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 115:
|
case 115:
|
||||||
|
|
||||||
{
|
{
|
||||||
yyval.real = atof(flexer->YYText());
|
yyval.real = osg::asciiToFloat(flexer->YYText());
|
||||||
;}
|
;}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 116:
|
case 116:
|
||||||
|
|
||||||
{
|
{
|
||||||
yyval.real = atof(flexer->YYText());
|
yyval.real = osg::asciiToFloat(flexer->YYText());
|
||||||
;}
|
;}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
IF (DCMTK_FOUND)
|
IF (DCMTK_FOUND)
|
||||||
|
|
||||||
# note, we have to include a '/' in front of the directory string to prevent a CMake bug from ignoring the directory
|
# note, we have to include a '/' in front of the directory string to prevent a CMake bug from ignoring the directory
|
||||||
INCLUDE_DIRECTORIES(/${DCMTK_ROOT_INCLUDE_DIR})
|
INCLUDE_DIRECTORIES(${DCMTK_ROOT_INCLUDE_DIR})
|
||||||
|
|
||||||
SET(TARGET_SRC ReaderWriterDICOM.cpp )
|
SET(TARGET_SRC ReaderWriterDICOM.cpp )
|
||||||
|
|
||||||
@@ -15,23 +15,22 @@ ELSE(DCMTK_FOUND)
|
|||||||
|
|
||||||
INCLUDE(${ITK_USE_FILE})
|
INCLUDE(${ITK_USE_FILE})
|
||||||
|
|
||||||
INCLUDE_DIRECTORIES( ITK_INCLUDE_DIRS )
|
|
||||||
|
|
||||||
SET(TARGET_SRC ReaderWriterDICOM.cpp )
|
SET(TARGET_SRC ReaderWriterDICOM.cpp )
|
||||||
|
|
||||||
LINK_DIRECTORIES(${ITK_LIBRARY_DIRS})
|
|
||||||
|
|
||||||
# LINK_LIBRARIES(${ITK_LIBRARIES})
|
|
||||||
|
|
||||||
LINK_LIBRARIES(ITKCommon ITKIO)
|
LINK_LIBRARIES(ITKCommon ITKIO)
|
||||||
|
|
||||||
ADD_DEFINITIONS(-DUSE_ITK)
|
ADD_DEFINITIONS(-DUSE_ITK)
|
||||||
|
ADD_DEFINITIONS(-DVCL_CAN_STATIC_CONST_INIT_FLOAT=0)
|
||||||
|
|
||||||
ENDIF(ITK_FOUND)
|
ENDIF(ITK_FOUND)
|
||||||
|
|
||||||
ENDIF(DCMTK_FOUND)
|
ENDIF(DCMTK_FOUND)
|
||||||
|
|
||||||
SET(TARGET_ADDED_LIBRARIES osgVolume )
|
SET(TARGET_ADDED_LIBRARIES osgVolume )
|
||||||
|
|
||||||
|
IF(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
|
# Remove -pedantic flag as it barfs on ffmoeg headers
|
||||||
|
STRING(REGEX REPLACE "-pedantic" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
#### end var setup ###
|
#### end var setup ###
|
||||||
SETUP_PLUGIN(dicom dicom)
|
SETUP_PLUGIN(dicom dicom)
|
||||||
|
|||||||
@@ -858,33 +858,33 @@ class ReaderWriterDW : public osgDB::ReaderWriter
|
|||||||
} else if (strncmp(buff, "CurrPhase:",10)==0) {
|
} else if (strncmp(buff, "CurrPhase:",10)==0) {
|
||||||
} else if (strncmp(buff, "numPhases:",10)==0) {
|
} else if (strncmp(buff, "numPhases:",10)==0) {
|
||||||
} else if (strncmp(buff, "Opacity:",8)==0) {
|
} else if (strncmp(buff, "Opacity:",8)==0) {
|
||||||
float opacity=atof(buff+8);
|
float opacity=osg::asciiToFloat(buff+8);
|
||||||
matpalet[nmat].setopacity(opacity);
|
matpalet[nmat].setopacity(opacity);
|
||||||
} else if (strncmp(buff, "FallOff:",8)==0) {
|
} else if (strncmp(buff, "FallOff:",8)==0) {
|
||||||
float fo=atof(buff+8);
|
float fo=osg::asciiToFloat(buff+8);
|
||||||
matpalet[nmat].setFallOff(fo);
|
matpalet[nmat].setFallOff(fo);
|
||||||
} else if (strncmp(buff, "InnerHalfAngle:",15)==0) {
|
} else if (strncmp(buff, "InnerHalfAngle:",15)==0) {
|
||||||
float ha=atof(buff+15);
|
float ha=osg::asciiToFloat(buff+15);
|
||||||
matpalet[nmat].setHalfAngleIn(ha);
|
matpalet[nmat].setHalfAngleIn(ha);
|
||||||
} else if (strncmp(buff, "OuterHalfAngle:",15)==0) {
|
} else if (strncmp(buff, "OuterHalfAngle:",15)==0) {
|
||||||
float ha=atof(buff+15);
|
float ha=osg::asciiToFloat(buff+15);
|
||||||
matpalet[nmat].setHalfAngleOut(ha);
|
matpalet[nmat].setHalfAngleOut(ha);
|
||||||
} else if (strncmp(buff, "Brightness:",11)==0) {
|
} else if (strncmp(buff, "Brightness:",11)==0) {
|
||||||
float br=atof(buff+11);
|
float br=osg::asciiToFloat(buff+11);
|
||||||
matpalet[nmat].setBright(br);
|
matpalet[nmat].setBright(br);
|
||||||
} else if (strncmp(buff, "Attentuation:",13)==0) { // oops - they can't spell
|
} else if (strncmp(buff, "Attentuation:",13)==0) { // oops - they can't spell
|
||||||
matpalet[nmat].setAtten(buff+13);
|
matpalet[nmat].setAtten(buff+13);
|
||||||
} else if (strncmp(buff, "MaterialType:",13)==0) {
|
} else if (strncmp(buff, "MaterialType:",13)==0) {
|
||||||
matpalet[nmat].setType(buff+14);
|
matpalet[nmat].setType(buff+14);
|
||||||
} else if (strncmp(buff, "SpecularReflectivity:",21)==0) {
|
} else if (strncmp(buff, "SpecularReflectivity:",21)==0) {
|
||||||
float spec=atof(buff+21);
|
float spec=osg::asciiToFloat(buff+21);
|
||||||
matpalet[nmat].setspecular(spec);
|
matpalet[nmat].setspecular(spec);
|
||||||
} else if (strncmp(buff, "SmoothnessExponent:",19)==0) {
|
} else if (strncmp(buff, "SmoothnessExponent:",19)==0) {
|
||||||
float spec=atof(buff+19);
|
float spec=osg::asciiToFloat(buff+19);
|
||||||
matpalet[nmat].setspecexp(spec*128.0f/100.0f); // convert to 0-128 range from percent
|
matpalet[nmat].setspecexp(spec*128.0f/100.0f); // convert to 0-128 range from percent
|
||||||
} else if (strncmp(buff, "TextureWidthAndHeight:",22)==0) {
|
} else if (strncmp(buff, "TextureWidthAndHeight:",22)==0) {
|
||||||
char *ct=strchr(buff+22,',');
|
char *ct=strchr(buff+22,',');
|
||||||
float repx=atof(buff+23), repy=atof(ct+1);
|
float repx=osg::asciiToFloat(buff+23), repy=osg::asciiToFloat(ct+1);
|
||||||
matpalet[nmat].settxrep(repx, repy);
|
matpalet[nmat].settxrep(repx, repy);
|
||||||
} else if (strncmp(buff, "PictureFile:",12)==0) {
|
} else if (strncmp(buff, "PictureFile:",12)==0) {
|
||||||
char *end=strchr(buff,'\n'); // end of line
|
char *end=strchr(buff,'\n'); // end of line
|
||||||
|
|||||||
@@ -172,7 +172,7 @@ DataOutputStream::DataOutputStream(std::ostream * ostream, const osgDB::ReaderWr
|
|||||||
if (numOfCharInNumber>0)
|
if (numOfCharInNumber>0)
|
||||||
{
|
{
|
||||||
std::string numberString = optionsString.substr(endOfToken+1, numOfCharInNumber);
|
std::string numberString = optionsString.substr(endOfToken+1, numOfCharInNumber);
|
||||||
_maximumErrorToSizeRatio = atof(numberString.c_str());
|
_maximumErrorToSizeRatio = osg::asciiToDouble(numberString.c_str());
|
||||||
|
|
||||||
osg::notify(osg::DEBUG_INFO)<<"TerrainMaximumErrorToSizeRatio = "<<_maximumErrorToSizeRatio<<std::endl;
|
osg::notify(osg::DEBUG_INFO)<<"TerrainMaximumErrorToSizeRatio = "<<_maximumErrorToSizeRatio<<std::endl;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -620,11 +620,33 @@ int *numComponents_ret)
|
|||||||
class ReaderWriterJPEG : public osgDB::ReaderWriter
|
class ReaderWriterJPEG : public osgDB::ReaderWriter
|
||||||
{
|
{
|
||||||
|
|
||||||
WriteResult::WriteStatus write_JPEG_file (std::ostream &fout,int image_width,int image_height,JSAMPLE* image_buffer,int quality = 100) const
|
WriteResult::WriteStatus write_JPEG_file (std::ostream &fout, const osg::Image &img, int quality = 100) const
|
||||||
{
|
{
|
||||||
|
int image_width = img.s();
|
||||||
|
int image_height = img.t();
|
||||||
if ( (image_width == 0) || (image_height == 0) )
|
if ( (image_width == 0) || (image_height == 0) )
|
||||||
return WriteResult::ERROR_IN_WRITING_FILE;
|
return WriteResult::ERROR_IN_WRITING_FILE;
|
||||||
|
|
||||||
|
J_COLOR_SPACE image_color_space = JCS_RGB;
|
||||||
|
int image_components = 3;
|
||||||
|
// Only cater for gray, alpha and RGB for now
|
||||||
|
switch(img.getPixelFormat()) {
|
||||||
|
case(GL_LUMINANCE):
|
||||||
|
case(GL_ALPHA): {
|
||||||
|
image_color_space = JCS_GRAYSCALE;
|
||||||
|
image_components = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case(GL_RGB): {
|
||||||
|
image_color_space = JCS_RGB;
|
||||||
|
image_components = 3;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: return WriteResult::ERROR_IN_WRITING_FILE; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
JSAMPLE* image_buffer = (JSAMPLE*)(img.data());
|
||||||
|
|
||||||
/* This struct contains the JPEG compression parameters and pointers to
|
/* This struct contains the JPEG compression parameters and pointers to
|
||||||
* working space (which is allocated as needed by the JPEG library).
|
* working space (which is allocated as needed by the JPEG library).
|
||||||
* It is possible to have several such structures, representing multiple
|
* It is possible to have several such structures, representing multiple
|
||||||
@@ -680,8 +702,8 @@ class ReaderWriterJPEG : public osgDB::ReaderWriter
|
|||||||
*/
|
*/
|
||||||
cinfo.image_width = image_width; /* image width and height, in pixels */
|
cinfo.image_width = image_width; /* image width and height, in pixels */
|
||||||
cinfo.image_height = image_height;
|
cinfo.image_height = image_height;
|
||||||
cinfo.input_components = 3; /* # of color components per pixel */
|
cinfo.input_components = image_components; /* # of color components per pixel */
|
||||||
cinfo.in_color_space = JCS_RGB; /* colorspace of input image */
|
cinfo.in_color_space = image_color_space; /* colorspace of input image */
|
||||||
/* Now use the library's routine to set default compression parameters.
|
/* Now use the library's routine to set default compression parameters.
|
||||||
* (You must set at least cinfo.in_color_space before calling this,
|
* (You must set at least cinfo.in_color_space before calling this,
|
||||||
* since the defaults depend on the source color space.)
|
* since the defaults depend on the source color space.)
|
||||||
@@ -707,7 +729,7 @@ class ReaderWriterJPEG : public osgDB::ReaderWriter
|
|||||||
* To keep things simple, we pass one scanline per call; you can pass
|
* To keep things simple, we pass one scanline per call; you can pass
|
||||||
* more if you wish, though.
|
* more if you wish, though.
|
||||||
*/
|
*/
|
||||||
row_stride = image_width * 3; /* JSAMPLEs per row in image_buffer */
|
row_stride = image_width * image_components; /* JSAMPLEs per row in image_buffer */
|
||||||
|
|
||||||
while (cinfo.next_scanline < cinfo.image_height)
|
while (cinfo.next_scanline < cinfo.image_height)
|
||||||
{
|
{
|
||||||
@@ -833,7 +855,7 @@ class ReaderWriterJPEG : public osgDB::ReaderWriter
|
|||||||
{
|
{
|
||||||
osg::ref_ptr<osg::Image> tmp_img = new osg::Image(img);
|
osg::ref_ptr<osg::Image> tmp_img = new osg::Image(img);
|
||||||
tmp_img->flipVertical();
|
tmp_img->flipVertical();
|
||||||
WriteResult::WriteStatus ws = write_JPEG_file(fout,img.s(),img.t(),(JSAMPLE*)(tmp_img->data()),getQuality(options));
|
WriteResult::WriteStatus ws = write_JPEG_file(fout, *(tmp_img.get()), getQuality(options));
|
||||||
return ws;
|
return ws;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -191,8 +191,10 @@ ref_ptr<StateSet> MDLReader::readMaterialFile(std::string materialName)
|
|||||||
std::string tex2Name;
|
std::string tex2Name;
|
||||||
ref_ptr<Texture> texture;
|
ref_ptr<Texture> texture;
|
||||||
ref_ptr<Texture> texture2;
|
ref_ptr<Texture> texture2;
|
||||||
|
ref_ptr<Material> material;
|
||||||
ref_ptr<BlendFunc> blend;
|
ref_ptr<BlendFunc> blend;
|
||||||
bool translucent;
|
bool translucent;
|
||||||
|
double alpha;
|
||||||
|
|
||||||
// Find the material file
|
// Find the material file
|
||||||
mtlFileName = std::string(materialName) + ".vmt";
|
mtlFileName = std::string(materialName) + ".vmt";
|
||||||
@@ -298,6 +300,9 @@ ref_ptr<StateSet> MDLReader::readMaterialFile(std::string materialName)
|
|||||||
// Assume not translucent unless the properties say otherwise
|
// Assume not translucent unless the properties say otherwise
|
||||||
translucent = false;
|
translucent = false;
|
||||||
|
|
||||||
|
// Assume full opacity
|
||||||
|
alpha = 1.0;
|
||||||
|
|
||||||
// Read the material properties next
|
// Read the material properties next
|
||||||
while (!mtlFile->eof())
|
while (!mtlFile->eof())
|
||||||
{
|
{
|
||||||
@@ -341,6 +346,17 @@ ref_ptr<StateSet> MDLReader::readMaterialFile(std::string materialName)
|
|||||||
translucent = true;
|
translucent = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (equalCaseInsensitive(token, "$alpha"))
|
||||||
|
{
|
||||||
|
// Get the translucency setting
|
||||||
|
token = getToken(line, " \t\n\r\"", start);
|
||||||
|
|
||||||
|
// Interpret the setting
|
||||||
|
if (!token.empty())
|
||||||
|
{
|
||||||
|
alpha = atof(token.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Try the next token
|
// Try the next token
|
||||||
token = getToken(line, " \t\n\r\"", start);
|
token = getToken(line, " \t\n\r\"", start);
|
||||||
@@ -379,6 +395,7 @@ ref_ptr<StateSet> MDLReader::readMaterialFile(std::string materialName)
|
|||||||
blend = new BlendFunc(BlendFunc::SRC_ALPHA,
|
blend = new BlendFunc(BlendFunc::SRC_ALPHA,
|
||||||
BlendFunc::ONE_MINUS_SRC_ALPHA);
|
BlendFunc::ONE_MINUS_SRC_ALPHA);
|
||||||
stateSet->setAttributeAndModes(blend.get(), StateAttribute::ON);
|
stateSet->setAttributeAndModes(blend.get(), StateAttribute::ON);
|
||||||
|
stateSet->setMode(GL_BLEND, StateAttribute::ON);
|
||||||
|
|
||||||
// Set the rendering hint for this stateset to transparent
|
// Set the rendering hint for this stateset to transparent
|
||||||
stateSet->setRenderingHint(StateSet::TRANSPARENT_BIN);
|
stateSet->setRenderingHint(StateSet::TRANSPARENT_BIN);
|
||||||
@@ -387,11 +404,24 @@ ref_ptr<StateSet> MDLReader::readMaterialFile(std::string materialName)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// All other shaders fall back to fixed function
|
// All other shaders fall back to fixed function
|
||||||
// TODO: LightMappedGeneric shader
|
|
||||||
|
|
||||||
// Create the StateSet
|
// Create the StateSet
|
||||||
stateSet = new StateSet();
|
stateSet = new StateSet();
|
||||||
|
|
||||||
|
// Add a material to the state set
|
||||||
|
material = new Material();
|
||||||
|
material->setAmbient(Material::FRONT_AND_BACK,
|
||||||
|
Vec4(1.0, 1.0, 1.0, 1.0) );
|
||||||
|
material->setDiffuse(Material::FRONT_AND_BACK,
|
||||||
|
Vec4(1.0, 1.0, 1.0, 1.0) );
|
||||||
|
material->setSpecular(Material::FRONT_AND_BACK,
|
||||||
|
Vec4(0.0, 0.0, 0.0, 1.0) );
|
||||||
|
material->setShininess(Material::FRONT_AND_BACK, 1.0);
|
||||||
|
material->setEmission(Material::FRONT_AND_BACK,
|
||||||
|
Vec4(0.0, 0.0, 0.0, 1.0) );
|
||||||
|
material->setAlpha(Material::FRONT_AND_BACK, alpha);
|
||||||
|
stateSet->setAttributeAndModes(material.get(), StateAttribute::ON);
|
||||||
|
|
||||||
// Add the texture attribute (or disable texturing if no base texture)
|
// Add the texture attribute (or disable texturing if no base texture)
|
||||||
if (texture != NULL)
|
if (texture != NULL)
|
||||||
{
|
{
|
||||||
@@ -399,13 +429,14 @@ ref_ptr<StateSet> MDLReader::readMaterialFile(std::string materialName)
|
|||||||
StateAttribute::ON);
|
StateAttribute::ON);
|
||||||
|
|
||||||
// See if the material is translucent
|
// See if the material is translucent
|
||||||
if (translucent)
|
if ((translucent) || (alpha < 1.0))
|
||||||
{
|
{
|
||||||
// Add the blending attribute as well
|
// Add the blending attribute as well
|
||||||
blend = new BlendFunc(BlendFunc::SRC_ALPHA,
|
blend = new BlendFunc(BlendFunc::SRC_ALPHA,
|
||||||
BlendFunc::ONE_MINUS_SRC_ALPHA);
|
BlendFunc::ONE_MINUS_SRC_ALPHA);
|
||||||
stateSet->setAttributeAndModes(blend.get(),
|
stateSet->setAttributeAndModes(blend.get(),
|
||||||
StateAttribute::ON);
|
StateAttribute::ON);
|
||||||
|
stateSet->setMode(GL_BLEND, StateAttribute::ON);
|
||||||
|
|
||||||
// Set the rendering hint for this stateset to transparent
|
// Set the rendering hint for this stateset to transparent
|
||||||
stateSet->setRenderingHint(StateSet::TRANSPARENT_BIN);
|
stateSet->setRenderingHint(StateSet::TRANSPARENT_BIN);
|
||||||
@@ -633,14 +664,15 @@ bool MDLReader::readFile(const std::string & file)
|
|||||||
mdlRoot->addBodyPart(partNode);
|
mdlRoot->addBodyPart(partNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open the VVD file that goes with this model
|
// Open the VVD (vertex data) file that goes with this model
|
||||||
vvdFile = findDataFile(getNameLessExtension(file) + ".vvd",
|
vvdFile = findDataFile(getNameLessExtension(file) + ".vvd",
|
||||||
CASE_INSENSITIVE);
|
CASE_INSENSITIVE);
|
||||||
vvdReader = new VVDReader();
|
vvdReader = new VVDReader();
|
||||||
vvdReader->readFile(vvdFile);
|
vvdReader->readFile(vvdFile);
|
||||||
|
|
||||||
// Open the VTX file that goes with this model (at this point, I don't
|
// Open the VTX file (index and primitive data) that goes with this model
|
||||||
// see a reason not to always just use the DX9 version)
|
// (at this point, I don't see a reason not to always just use the DX9
|
||||||
|
// version)
|
||||||
vtxFile = findDataFile(getNameLessExtension(file) + ".dx90.vtx",
|
vtxFile = findDataFile(getNameLessExtension(file) + ".dx90.vtx",
|
||||||
CASE_INSENSITIVE);
|
CASE_INSENSITIVE);
|
||||||
vtxReader = new VTXReader(vvdReader, mdlRoot);
|
vtxReader = new VTXReader(vvdReader, mdlRoot);
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ Overview
|
|||||||
This plugin allows .mdl files from games that make use of Valve's Source
|
This plugin allows .mdl files from games that make use of Valve's Source
|
||||||
engine (Half Life 2, etc) to be loaded by OSG.
|
engine (Half Life 2, etc) to be loaded by OSG.
|
||||||
|
|
||||||
I've tested this plugin with dozens of on several HL2 models, as well as some
|
I've tested this plugin with dozens of HL2 models, as well as some 3rd party
|
||||||
3rd party models.
|
models.
|
||||||
|
|
||||||
|
|
||||||
Using the Plugin
|
Using the Plugin
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ class NormalsReader: public osgDB::ReaderWriter
|
|||||||
std::string value = opt.substr(index+1);
|
std::string value = opt.substr(index+1);
|
||||||
if( key == "scale" || key == "SCALE" )
|
if( key == "scale" || key == "SCALE" )
|
||||||
{
|
{
|
||||||
scale = atof( value.c_str() );
|
scale = osg::asciiToFloat( value.c_str() );
|
||||||
}
|
}
|
||||||
else if( key == "mode" || key == "MODE" )
|
else if( key == "mode" || key == "MODE" )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,6 +7,9 @@
|
|||||||
#include <osgDB/Input>
|
#include <osgDB/Input>
|
||||||
#include <osgDB/Output>
|
#include <osgDB/Output>
|
||||||
|
|
||||||
|
#include <OpenThreads/Mutex>
|
||||||
|
#include <OpenThreads/ScopedLock>
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@@ -66,6 +69,11 @@ void initGLNames()
|
|||||||
static bool first_time = true;
|
static bool first_time = true;
|
||||||
if (!first_time) return;
|
if (!first_time) return;
|
||||||
|
|
||||||
|
static OpenThreads::Mutex s_initGLNames;
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(s_initGLNames);
|
||||||
|
|
||||||
|
if (!first_time) return;
|
||||||
|
|
||||||
ADD_NAME("GL_ALPHA_TEST",GL_ALPHA_TEST)
|
ADD_NAME("GL_ALPHA_TEST",GL_ALPHA_TEST)
|
||||||
ADD_NAME("GL_BLEND",GL_BLEND)
|
ADD_NAME("GL_BLEND",GL_BLEND)
|
||||||
ADD_NAME("GL_COLOR_MATERIAL",GL_COLOR_MATERIAL)
|
ADD_NAME("GL_COLOR_MATERIAL",GL_COLOR_MATERIAL)
|
||||||
|
|||||||
@@ -539,14 +539,14 @@ bool ReaderWriterTXP::extractChildrenLocations(const std::string& name, int pare
|
|||||||
token = strtok(0, "_");
|
token = strtok(0, "_");
|
||||||
if(!token)
|
if(!token)
|
||||||
break;
|
break;
|
||||||
locs[idx].zmin = (float)atof(token);
|
locs[idx].zmin = osg::asciiToFloat(token);
|
||||||
nbTokenRead++;
|
nbTokenRead++;
|
||||||
|
|
||||||
// ZMAX
|
// ZMAX
|
||||||
token = strtok(0, "_");
|
token = strtok(0, "_");
|
||||||
if(!token)
|
if(!token)
|
||||||
break;
|
break;
|
||||||
locs[idx].zmax= (float)atof(token);
|
locs[idx].zmax = osg::asciiToFloat(token);
|
||||||
nbTokenRead++;
|
nbTokenRead++;
|
||||||
|
|
||||||
locs[idx].lod = parentLod+1;
|
locs[idx].lod = parentLod+1;
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ TXPParser::TXPParser():
|
|||||||
|
|
||||||
if (getenv("OSG_TXP_DEFAULT_MAX_ANISOTROPY"))
|
if (getenv("OSG_TXP_DEFAULT_MAX_ANISOTROPY"))
|
||||||
{
|
{
|
||||||
_defaultMaxAnisotropy = atof(getenv("OSG_TXP_DEFAULT_MAX_ANISOTROPY"));
|
_defaultMaxAnisotropy = osg::asciiToFloat(getenv("OSG_TXP_DEFAULT_MAX_ANISOTROPY"));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ trpgllong trpg_byteswap_llong ( trpgllong number )
|
|||||||
{
|
{
|
||||||
trpgllong result;
|
trpgllong result;
|
||||||
|
|
||||||
trpg_swap_sixteen ( (char *) &number, (char *) &result);
|
trpg_swap_eight ( (char *) &number, (char *) &result);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -323,7 +323,7 @@ float DirectionalSector::operator() (const osg::Vec3& eyeLocal) const
|
|||||||
if ( EPyz[0] < _cosVertAngle ) {
|
if ( EPyz[0] < _cosVertAngle ) {
|
||||||
// In the fade range
|
// In the fade range
|
||||||
//fprintf(stderr, " >> inside el fade range\n") ;
|
//fprintf(stderr, " >> inside el fade range\n") ;
|
||||||
elev_intensity = (_cosVertAngle-EPyz[0])/(_cosVertAngle-_cosVertFadeAngle) ;
|
elev_intensity = (EPyz[0]-_cosVertFadeAngle)/(_cosVertAngle-_cosVertFadeAngle) ;
|
||||||
} else {
|
} else {
|
||||||
// Fully in elevation range
|
// Fully in elevation range
|
||||||
elev_intensity = 1.0 ;
|
elev_intensity = 1.0 ;
|
||||||
@@ -349,7 +349,7 @@ float DirectionalSector::operator() (const osg::Vec3& eyeLocal) const
|
|||||||
if ( EPxy[1] < _cosHorizAngle ) {
|
if ( EPxy[1] < _cosHorizAngle ) {
|
||||||
// In fade range
|
// In fade range
|
||||||
//fprintf(stderr, " >> inside az fade range\n") ;
|
//fprintf(stderr, " >> inside az fade range\n") ;
|
||||||
azim_intensity = (_cosHorizAngle-EPxy[1])/(_cosHorizAngle-_cosHorizFadeAngle) ;
|
azim_intensity = (EPxy[1]-_cosHorizFadeAngle)/(_cosHorizAngle-_cosHorizFadeAngle) ;
|
||||||
} else {
|
} else {
|
||||||
// Fully in azimuth range
|
// Fully in azimuth range
|
||||||
//fprintf(stderr, " >> fully inside az range\n") ;
|
//fprintf(stderr, " >> fully inside az range\n") ;
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ void TextBase::setAlignment(AlignmentType alignment)
|
|||||||
if (_alignment==alignment) return;
|
if (_alignment==alignment) return;
|
||||||
|
|
||||||
_alignment = alignment;
|
_alignment = alignment;
|
||||||
computePositions();
|
computeGlyphRepresentation();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextBase::setAxisAlignment(AxisAlignment axis)
|
void TextBase::setAxisAlignment(AxisAlignment axis)
|
||||||
|
|||||||
@@ -11,12 +11,18 @@
|
|||||||
* OpenSceneGraph Public License for more details.
|
* OpenSceneGraph Public License for more details.
|
||||||
*/
|
*/
|
||||||
#include <osgUtil/GLObjectsVisitor>
|
#include <osgUtil/GLObjectsVisitor>
|
||||||
|
|
||||||
#include <osg/Drawable>
|
#include <osg/Drawable>
|
||||||
#include <osg/Notify>
|
#include <osg/Notify>
|
||||||
|
#include <osg/Timer>
|
||||||
|
|
||||||
using namespace osg;
|
namespace osgUtil
|
||||||
using namespace osgUtil;
|
{
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// GLObjectsVisitor
|
||||||
|
//
|
||||||
GLObjectsVisitor::GLObjectsVisitor(Mode mode)
|
GLObjectsVisitor::GLObjectsVisitor(Mode mode)
|
||||||
{
|
{
|
||||||
setTraversalMode(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN);
|
setTraversalMode(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN);
|
||||||
@@ -45,7 +51,7 @@ void GLObjectsVisitor::apply(osg::Geode& node)
|
|||||||
|
|
||||||
for(unsigned int i=0;i<node.getNumDrawables();++i)
|
for(unsigned int i=0;i<node.getNumDrawables();++i)
|
||||||
{
|
{
|
||||||
Drawable* drawable = node.getDrawable(i);
|
osg::Drawable* drawable = node.getDrawable(i);
|
||||||
if (drawable)
|
if (drawable)
|
||||||
{
|
{
|
||||||
apply(*drawable);
|
apply(*drawable);
|
||||||
@@ -105,7 +111,12 @@ void GLObjectsVisitor::apply(osg::StateSet& stateset)
|
|||||||
stateset.compileGLObjects(*_renderInfo.getState());
|
stateset.compileGLObjects(*_renderInfo.getState());
|
||||||
|
|
||||||
osg::Program* program = dynamic_cast<osg::Program*>(stateset.getAttribute(osg::StateAttribute::PROGRAM));
|
osg::Program* program = dynamic_cast<osg::Program*>(stateset.getAttribute(osg::StateAttribute::PROGRAM));
|
||||||
if (program) _lastCompiledProgram = program;
|
if (program) {
|
||||||
|
if( program->isFixedFunction() )
|
||||||
|
_lastCompiledProgram = NULL; // It does not make sense to apply uniforms on fixed pipe
|
||||||
|
else
|
||||||
|
_lastCompiledProgram = program;
|
||||||
|
}
|
||||||
|
|
||||||
if (_lastCompiledProgram.valid() && !stateset.getUniformList().empty())
|
if (_lastCompiledProgram.valid() && !stateset.getUniformList().empty())
|
||||||
{
|
{
|
||||||
@@ -127,7 +138,7 @@ void GLObjectsVisitor::apply(osg::StateSet& stateset)
|
|||||||
}
|
}
|
||||||
else if(_renderInfo.getState()->getLastAppliedProgramObject()){
|
else if(_renderInfo.getState()->getLastAppliedProgramObject()){
|
||||||
|
|
||||||
GL2Extensions* extensions = GL2Extensions::Get(_renderInfo.getState()->getContextID(), true);
|
osg::GL2Extensions* extensions = osg::GL2Extensions::Get(_renderInfo.getState()->getContextID(), true);
|
||||||
extensions->glUseProgram(0);
|
extensions->glUseProgram(0);
|
||||||
_renderInfo.getState()->setLastAppliedProgramObject(0);
|
_renderInfo.getState()->setLastAppliedProgramObject(0);
|
||||||
}
|
}
|
||||||
@@ -145,6 +156,11 @@ void GLObjectsVisitor::apply(osg::StateSet& stateset)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// GLObjectsVisitor
|
||||||
|
//
|
||||||
|
|
||||||
GLObjectsOperation::GLObjectsOperation(GLObjectsVisitor::Mode mode):
|
GLObjectsOperation::GLObjectsOperation(GLObjectsVisitor::Mode mode):
|
||||||
osg::GraphicsOperation("GLObjectOperation",false),
|
osg::GraphicsOperation("GLObjectOperation",false),
|
||||||
_mode(mode)
|
_mode(mode)
|
||||||
@@ -182,3 +198,6 @@ void GLObjectsOperation::operator () (osg::GraphicsContext* context)
|
|||||||
}
|
}
|
||||||
// osg::notify(osg::NOTICE)<<"GLObjectsOperation::after >>>>>>>>>>> "<<std::endl;
|
// osg::notify(osg::NOTICE)<<"GLObjectsOperation::after >>>>>>>>>>> "<<std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // end of namespace osgUtil
|
||||||
|
|||||||
@@ -1811,7 +1811,9 @@ bool Optimizer::MergeGeometryVisitor::mergeGeode(osg::Geode& geode)
|
|||||||
{
|
{
|
||||||
//geom->computeCorrectBindingsAndArraySizes();
|
//geom->computeCorrectBindingsAndArraySizes();
|
||||||
|
|
||||||
if (!geometryContainsSharedArrays(*geom) && isOperationPermissibleForObject(geom))
|
if (!geometryContainsSharedArrays(*geom) &&
|
||||||
|
geom->getDataVariance()!=osg::Object::DYNAMIC &&
|
||||||
|
isOperationPermissibleForObject(geom))
|
||||||
{
|
{
|
||||||
geometryDuplicateMap[geom].push_back(geom);
|
geometryDuplicateMap[geom].push_back(geom);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,8 +26,8 @@
|
|||||||
using namespace osg;
|
using namespace osg;
|
||||||
using namespace osgUtil;
|
using namespace osgUtil;
|
||||||
|
|
||||||
|
class RenderBinPrototypeList : osg::depends_on<OpenThreads::Mutex*, osg::Referenced::getGlobalReferencedMutex>,
|
||||||
class RenderBinPrototypeList : public osg::Referenced, public std::map< std::string, osg::ref_ptr<RenderBin> >
|
public osg::Referenced, public std::map< std::string, osg::ref_ptr<RenderBin> >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RenderBinPrototypeList() {}
|
RenderBinPrototypeList() {}
|
||||||
@@ -83,8 +83,17 @@ void RenderBin::removeRenderBinPrototype(RenderBin* proto)
|
|||||||
RenderBinPrototypeList* list = renderBinPrototypeList();
|
RenderBinPrototypeList* list = renderBinPrototypeList();
|
||||||
if (list && proto)
|
if (list && proto)
|
||||||
{
|
{
|
||||||
RenderBinPrototypeList::iterator itr = list->find(proto->className());
|
for(RenderBinPrototypeList::iterator itr = list->begin();
|
||||||
if (itr != list->end()) list->erase(itr);
|
itr != list->end();
|
||||||
|
++itr)
|
||||||
|
{
|
||||||
|
if (itr->second == proto)
|
||||||
|
{
|
||||||
|
// osg::notify(osg::NOTICE)<<"Found protype, now erasing "<<itr->first<<std::endl;
|
||||||
|
list->erase(itr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1230,7 +1230,7 @@ void RenderStage::drawImplementation(osg::RenderInfo& renderInfo,RenderLeaf*& pr
|
|||||||
if (_clearMask & GL_STENCIL_BUFFER_BIT)
|
if (_clearMask & GL_STENCIL_BUFFER_BIT)
|
||||||
{
|
{
|
||||||
glClearStencil( _clearStencil);
|
glClearStencil( _clearStencil);
|
||||||
glStencilMask ( GL_TRUE );
|
glStencilMask ( ~0u );
|
||||||
state.haveAppliedAttribute( osg::StateAttribute::STENCIL );
|
state.haveAppliedAttribute( osg::StateAttribute::STENCIL );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -348,6 +348,8 @@ void CompositeViewer::getCameras(Cameras& cameras, bool onlyActive)
|
|||||||
|
|
||||||
void CompositeViewer::getScenes(Scenes& scenes, bool onlyValid)
|
void CompositeViewer::getScenes(Scenes& scenes, bool onlyValid)
|
||||||
{
|
{
|
||||||
|
scenes.clear();
|
||||||
|
|
||||||
typedef std::set<osgViewer::Scene*> SceneSet;
|
typedef std::set<osgViewer::Scene*> SceneSet;
|
||||||
SceneSet sceneSet;
|
SceneSet sceneSet;
|
||||||
|
|
||||||
@@ -369,6 +371,8 @@ void CompositeViewer::getScenes(Scenes& scenes, bool onlyValid)
|
|||||||
|
|
||||||
void CompositeViewer::getViews(Views& views, bool onlyValid)
|
void CompositeViewer::getViews(Views& views, bool onlyValid)
|
||||||
{
|
{
|
||||||
|
views.clear();
|
||||||
|
|
||||||
for(RefViews::iterator vitr = _views.begin();
|
for(RefViews::iterator vitr = _views.begin();
|
||||||
vitr != _views.end();
|
vitr != _views.end();
|
||||||
++vitr)
|
++vitr)
|
||||||
@@ -379,6 +383,8 @@ void CompositeViewer::getViews(Views& views, bool onlyValid)
|
|||||||
|
|
||||||
void CompositeViewer::getAllThreads(Threads& threads, bool onlyActive)
|
void CompositeViewer::getAllThreads(Threads& threads, bool onlyActive)
|
||||||
{
|
{
|
||||||
|
threads.clear();
|
||||||
|
|
||||||
OperationThreads operationThreads;
|
OperationThreads operationThreads;
|
||||||
getOperationThreads(operationThreads);
|
getOperationThreads(operationThreads);
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
#include <osgViewer/api/Win32/GraphicsWindowWin32>
|
#include <osgViewer/api/Win32/GraphicsWindowWin32>
|
||||||
#include <osgViewer/api/Win32/PixelBufferWin32>
|
#include <osgViewer/api/Win32/PixelBufferWin32>
|
||||||
|
#include <osgViewer/View>
|
||||||
|
|
||||||
#include <osg/DeleteHandler>
|
#include <osg/DeleteHandler>
|
||||||
#include <osg/ApplicationUsage>
|
#include <osg/ApplicationUsage>
|
||||||
@@ -1266,6 +1267,21 @@ void GraphicsWindowWin32::destroyWindow( bool deleteNativeWindow )
|
|||||||
if (_destroying) return;
|
if (_destroying) return;
|
||||||
_destroying = true;
|
_destroying = true;
|
||||||
|
|
||||||
|
if (_graphicsThread && _graphicsThread->isRunning())
|
||||||
|
{
|
||||||
|
// find all the viewers that might own use this graphics context
|
||||||
|
osg::GraphicsContext::Cameras cameras = getCameras();
|
||||||
|
for(osg::GraphicsContext::Cameras::iterator it=cameras.begin(); it!=cameras.end(); ++it)
|
||||||
|
{
|
||||||
|
osgViewer::View* view = dynamic_cast<osgViewer::View*>((*it)->getView());
|
||||||
|
osgViewer::ViewerBase* viewerBase = view ? view->getViewerBase() : 0;
|
||||||
|
if (viewerBase && viewerBase->areThreadsRunning())
|
||||||
|
{
|
||||||
|
viewerBase->stopThreading();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (_hdc)
|
if (_hdc)
|
||||||
{
|
{
|
||||||
releaseContext();
|
releaseContext();
|
||||||
|
|||||||
@@ -44,137 +44,184 @@ class X11KeyboardMap
|
|||||||
|
|
||||||
X11KeyboardMap()
|
X11KeyboardMap()
|
||||||
{
|
{
|
||||||
_keymap[XK_Escape ] = osgGA::GUIEventAdapter::KEY_Escape;
|
#if 0
|
||||||
_keymap[XK_F1 ] = osgGA::GUIEventAdapter::KEY_F1;
|
_extendKeymap[8 ] = osgGA::GUIEventAdapter::KEY_BackSpace;
|
||||||
_keymap[XK_F2 ] = osgGA::GUIEventAdapter::KEY_F2;
|
_extendKeymap[127 ] = osgGA::GUIEventAdapter::KEY_Delete;
|
||||||
_keymap[XK_F3 ] = osgGA::GUIEventAdapter::KEY_F3;
|
_extendKeymap[27 ] = osgGA::GUIEventAdapter::KEY_Escape;
|
||||||
_keymap[XK_F4 ] = osgGA::GUIEventAdapter::KEY_F4;
|
// _extendKeymap[13 ] = osgGA::GUIEventAdapter::KEY_Enter;
|
||||||
_keymap[XK_F5 ] = osgGA::GUIEventAdapter::KEY_F5;
|
#endif
|
||||||
_keymap[XK_F6 ] = osgGA::GUIEventAdapter::KEY_F6;
|
_extendedKeymap[XK_Escape ] = osgGA::GUIEventAdapter::KEY_Escape;
|
||||||
_keymap[XK_F7 ] = osgGA::GUIEventAdapter::KEY_F7;
|
_extendedKeymap[XK_F1 ] = osgGA::GUIEventAdapter::KEY_F1;
|
||||||
_keymap[XK_F8 ] = osgGA::GUIEventAdapter::KEY_F8;
|
_extendedKeymap[XK_F2 ] = osgGA::GUIEventAdapter::KEY_F2;
|
||||||
_keymap[XK_F9 ] = osgGA::GUIEventAdapter::KEY_F9;
|
_extendedKeymap[XK_F3 ] = osgGA::GUIEventAdapter::KEY_F3;
|
||||||
_keymap[XK_F10 ] = osgGA::GUIEventAdapter::KEY_F10;
|
_extendedKeymap[XK_F4 ] = osgGA::GUIEventAdapter::KEY_F4;
|
||||||
_keymap[XK_F11 ] = osgGA::GUIEventAdapter::KEY_F11;
|
_extendedKeymap[XK_F5 ] = osgGA::GUIEventAdapter::KEY_F5;
|
||||||
_keymap[XK_F12 ] = osgGA::GUIEventAdapter::KEY_F12;
|
_extendedKeymap[XK_F6 ] = osgGA::GUIEventAdapter::KEY_F6;
|
||||||
_keymap[XK_quoteleft ] = '"';
|
_extendedKeymap[XK_F7 ] = osgGA::GUIEventAdapter::KEY_F7;
|
||||||
_keymap[XK_1 ] = '1';
|
_extendedKeymap[XK_F8 ] = osgGA::GUIEventAdapter::KEY_F8;
|
||||||
_keymap[XK_2 ] = '2';
|
_extendedKeymap[XK_F9 ] = osgGA::GUIEventAdapter::KEY_F9;
|
||||||
_keymap[XK_3 ] = '3';
|
_extendedKeymap[XK_F10 ] = osgGA::GUIEventAdapter::KEY_F10;
|
||||||
_keymap[XK_4 ] = '4';
|
_extendedKeymap[XK_F11 ] = osgGA::GUIEventAdapter::KEY_F11;
|
||||||
_keymap[XK_5 ] = '5';
|
_extendedKeymap[XK_F12 ] = osgGA::GUIEventAdapter::KEY_F12;
|
||||||
_keymap[XK_6 ] = '6';
|
_extendedKeymap[XK_quoteleft ] = '`';
|
||||||
_keymap[XK_7 ] = '7';
|
_extendedKeymap[XK_minus ] = '-';
|
||||||
_keymap[XK_8 ] = '8';
|
_extendedKeymap[XK_equal ] = '=';
|
||||||
_keymap[XK_9 ] = '9';
|
_extendedKeymap[XK_BackSpace ] = osgGA::GUIEventAdapter::KEY_BackSpace;
|
||||||
_keymap[XK_0 ] = '0';
|
_extendedKeymap[XK_Tab ] = osgGA::GUIEventAdapter::KEY_Tab;
|
||||||
_keymap[XK_minus ] = '-';
|
_extendedKeymap[XK_bracketleft ] = '(';
|
||||||
_keymap[XK_equal ] = '=';
|
_extendedKeymap[XK_bracketright ] = ')';
|
||||||
_keymap[XK_BackSpace ] = osgGA::GUIEventAdapter::KEY_BackSpace;
|
_extendedKeymap[XK_backslash ] = '\\';
|
||||||
_keymap[XK_Tab ] = osgGA::GUIEventAdapter::KEY_Tab;
|
_extendedKeymap[XK_Caps_Lock ] = osgGA::GUIEventAdapter::KEY_Caps_Lock;
|
||||||
_keymap[XK_a ] = 'A';
|
_extendedKeymap[XK_semicolon ] = ';';
|
||||||
_keymap[XK_b ] = 'B';
|
_extendedKeymap[XK_apostrophe ] = '\'';
|
||||||
_keymap[XK_c ] = 'C';
|
_extendedKeymap[XK_Return ] = osgGA::GUIEventAdapter::KEY_Return;
|
||||||
_keymap[XK_d ] = 'D';
|
_extendedKeymap[XK_comma ] = ',';
|
||||||
_keymap[XK_e ] = 'E';
|
_extendedKeymap[XK_period ] = '.';
|
||||||
_keymap[XK_f ] = 'F';
|
_extendedKeymap[XK_slash ] = '/';
|
||||||
_keymap[XK_g ] = 'G';
|
_extendedKeymap[XK_space ] = ' ';
|
||||||
_keymap[XK_h ] = 'H';
|
_extendedKeymap[XK_Shift_L ] = osgGA::GUIEventAdapter::KEY_Shift_L;
|
||||||
_keymap[XK_i ] = 'I';
|
_extendedKeymap[XK_Shift_R ] = osgGA::GUIEventAdapter::KEY_Shift_R;
|
||||||
_keymap[XK_j ] = 'J';
|
_extendedKeymap[XK_Control_L ] = osgGA::GUIEventAdapter::KEY_Control_L;
|
||||||
_keymap[XK_k ] = 'K';
|
_extendedKeymap[XK_Control_R ] = osgGA::GUIEventAdapter::KEY_Control_R;
|
||||||
_keymap[XK_l ] = 'L';
|
_extendedKeymap[XK_Meta_L ] = osgGA::GUIEventAdapter::KEY_Meta_L;
|
||||||
_keymap[XK_m ] = 'M';
|
_extendedKeymap[XK_Meta_R ] = osgGA::GUIEventAdapter::KEY_Meta_R;
|
||||||
_keymap[XK_n ] = 'N';
|
_extendedKeymap[XK_Alt_L ] = osgGA::GUIEventAdapter::KEY_Alt_L;
|
||||||
_keymap[XK_o ] = 'O';
|
_extendedKeymap[XK_Alt_R ] = osgGA::GUIEventAdapter::KEY_Alt_R;
|
||||||
_keymap[XK_p ] = 'P';
|
_extendedKeymap[XK_Super_L ] = osgGA::GUIEventAdapter::KEY_Super_L;
|
||||||
_keymap[XK_q ] = 'Q';
|
_extendedKeymap[XK_Super_R ] = osgGA::GUIEventAdapter::KEY_Super_R;
|
||||||
_keymap[XK_r ] = 'R';
|
_extendedKeymap[XK_Hyper_L ] = osgGA::GUIEventAdapter::KEY_Hyper_L;
|
||||||
_keymap[XK_s ] = 'S';
|
_extendedKeymap[XK_Hyper_R ] = osgGA::GUIEventAdapter::KEY_Hyper_R;
|
||||||
_keymap[XK_t ] = 'T';
|
_extendedKeymap[XK_Menu ] = osgGA::GUIEventAdapter::KEY_Menu;
|
||||||
_keymap[XK_u ] = 'U';
|
_extendedKeymap[XK_Print ] = osgGA::GUIEventAdapter::KEY_Print;
|
||||||
_keymap[XK_v ] = 'V';
|
_extendedKeymap[XK_Scroll_Lock ] = osgGA::GUIEventAdapter::KEY_Scroll_Lock;
|
||||||
_keymap[XK_w ] = 'W';
|
_extendedKeymap[XK_Pause ] = osgGA::GUIEventAdapter::KEY_Pause;
|
||||||
_keymap[XK_x ] = 'X';
|
_extendedKeymap[XK_Home ] = osgGA::GUIEventAdapter::KEY_Home;
|
||||||
_keymap[XK_y ] = 'Y';
|
_extendedKeymap[XK_Page_Up ] = osgGA::GUIEventAdapter::KEY_Page_Up;
|
||||||
_keymap[XK_z ] = 'Z';
|
_extendedKeymap[XK_End ] = osgGA::GUIEventAdapter::KEY_End;
|
||||||
_keymap[XK_bracketleft ] = '(';
|
_extendedKeymap[XK_Page_Down ] = osgGA::GUIEventAdapter::KEY_Page_Down;
|
||||||
_keymap[XK_bracketright ] = ')';
|
_extendedKeymap[XK_Delete ] = osgGA::GUIEventAdapter::KEY_Delete;
|
||||||
_keymap[XK_backslash ] = '\\';
|
_extendedKeymap[XK_Insert ] = osgGA::GUIEventAdapter::KEY_Insert;
|
||||||
_keymap[XK_Caps_Lock ] = osgGA::GUIEventAdapter::KEY_Caps_Lock;
|
_extendedKeymap[XK_Left ] = osgGA::GUIEventAdapter::KEY_Left;
|
||||||
_keymap[XK_semicolon ] = ';';
|
_extendedKeymap[XK_Up ] = osgGA::GUIEventAdapter::KEY_Up;
|
||||||
_keymap[XK_apostrophe ] = '\'';
|
_extendedKeymap[XK_Right ] = osgGA::GUIEventAdapter::KEY_Right;
|
||||||
_keymap[XK_Return ] = osgGA::GUIEventAdapter::KEY_Return;
|
_extendedKeymap[XK_Down ] = osgGA::GUIEventAdapter::KEY_Down;
|
||||||
_keymap[XK_comma ] = ',';
|
_extendedKeymap[XK_Num_Lock ] = osgGA::GUIEventAdapter::KEY_Num_Lock;
|
||||||
_keymap[XK_period ] = '.';
|
_extendedKeymap[XK_KP_Divide ] = osgGA::GUIEventAdapter::KEY_KP_Divide;
|
||||||
_keymap[XK_slash ] = '/';
|
_extendedKeymap[XK_KP_Multiply ] = osgGA::GUIEventAdapter::KEY_KP_Multiply;
|
||||||
_keymap[XK_space ] = ' ';
|
_extendedKeymap[XK_KP_Subtract ] = osgGA::GUIEventAdapter::KEY_KP_Subtract;
|
||||||
_keymap[XK_Shift_L ] = osgGA::GUIEventAdapter::KEY_Shift_L;
|
_extendedKeymap[XK_KP_Add ] = osgGA::GUIEventAdapter::KEY_KP_Add;
|
||||||
_keymap[XK_Shift_R ] = osgGA::GUIEventAdapter::KEY_Shift_R;
|
_extendedKeymap[XK_KP_Home ] = osgGA::GUIEventAdapter::KEY_KP_Home;
|
||||||
_keymap[XK_Control_L ] = osgGA::GUIEventAdapter::KEY_Control_L;
|
_extendedKeymap[XK_KP_Up ] = osgGA::GUIEventAdapter::KEY_KP_Up;
|
||||||
_keymap[XK_Control_R ] = osgGA::GUIEventAdapter::KEY_Control_R;
|
_extendedKeymap[XK_KP_Page_Up ] = osgGA::GUIEventAdapter::KEY_KP_Page_Up;
|
||||||
_keymap[XK_Meta_L ] = osgGA::GUIEventAdapter::KEY_Meta_L;
|
_extendedKeymap[XK_KP_Left ] = osgGA::GUIEventAdapter::KEY_KP_Left;
|
||||||
_keymap[XK_Meta_R ] = osgGA::GUIEventAdapter::KEY_Meta_R;
|
_extendedKeymap[XK_KP_Begin ] = osgGA::GUIEventAdapter::KEY_KP_Begin;
|
||||||
_keymap[XK_Alt_L ] = osgGA::GUIEventAdapter::KEY_Alt_L;
|
_extendedKeymap[XK_KP_Right ] = osgGA::GUIEventAdapter::KEY_KP_Right;
|
||||||
_keymap[XK_Alt_R ] = osgGA::GUIEventAdapter::KEY_Alt_R;
|
_extendedKeymap[XK_KP_End ] = osgGA::GUIEventAdapter::KEY_KP_End;
|
||||||
_keymap[XK_Super_L ] = osgGA::GUIEventAdapter::KEY_Super_L;
|
_extendedKeymap[XK_KP_Down ] = osgGA::GUIEventAdapter::KEY_KP_Down;
|
||||||
_keymap[XK_Super_R ] = osgGA::GUIEventAdapter::KEY_Super_R;
|
_extendedKeymap[XK_KP_Page_Down ] = osgGA::GUIEventAdapter::KEY_KP_Page_Down;
|
||||||
_keymap[XK_Hyper_L ] = osgGA::GUIEventAdapter::KEY_Hyper_L;
|
_extendedKeymap[XK_KP_Insert ] = osgGA::GUIEventAdapter::KEY_KP_Insert;
|
||||||
_keymap[XK_Hyper_R ] = osgGA::GUIEventAdapter::KEY_Hyper_R;
|
_extendedKeymap[XK_KP_Delete ] = osgGA::GUIEventAdapter::KEY_KP_Delete;
|
||||||
_keymap[XK_Menu ] = osgGA::GUIEventAdapter::KEY_Menu;
|
_extendedKeymap[XK_KP_Enter ] = osgGA::GUIEventAdapter::KEY_KP_Enter;
|
||||||
_keymap[XK_Print ] = osgGA::GUIEventAdapter::KEY_Print;
|
|
||||||
_keymap[XK_Scroll_Lock ] = osgGA::GUIEventAdapter::KEY_Scroll_Lock;
|
|
||||||
_keymap[XK_Pause ] = osgGA::GUIEventAdapter::KEY_Pause;
|
|
||||||
_keymap[XK_Home ] = osgGA::GUIEventAdapter::KEY_Home;
|
|
||||||
_keymap[XK_Page_Up ] = osgGA::GUIEventAdapter::KEY_Page_Up;
|
|
||||||
_keymap[XK_End ] = osgGA::GUIEventAdapter::KEY_End;
|
|
||||||
_keymap[XK_Page_Down ] = osgGA::GUIEventAdapter::KEY_Page_Down;
|
|
||||||
_keymap[XK_Delete ] = osgGA::GUIEventAdapter::KEY_Delete;
|
|
||||||
_keymap[XK_Insert ] = osgGA::GUIEventAdapter::KEY_Insert;
|
|
||||||
_keymap[XK_Left ] = osgGA::GUIEventAdapter::KEY_Left;
|
|
||||||
_keymap[XK_Up ] = osgGA::GUIEventAdapter::KEY_Up;
|
|
||||||
_keymap[XK_Right ] = osgGA::GUIEventAdapter::KEY_Right;
|
|
||||||
_keymap[XK_Down ] = osgGA::GUIEventAdapter::KEY_Down;
|
|
||||||
_keymap[XK_Num_Lock ] = osgGA::GUIEventAdapter::KEY_Num_Lock;
|
|
||||||
_keymap[XK_KP_Divide ] = osgGA::GUIEventAdapter::KEY_KP_Divide;
|
|
||||||
_keymap[XK_KP_Multiply ] = osgGA::GUIEventAdapter::KEY_KP_Multiply;
|
|
||||||
_keymap[XK_KP_Subtract ] = osgGA::GUIEventAdapter::KEY_KP_Subtract;
|
|
||||||
_keymap[XK_KP_Add ] = osgGA::GUIEventAdapter::KEY_KP_Add;
|
|
||||||
_keymap[XK_KP_Home ] = osgGA::GUIEventAdapter::KEY_KP_Home;
|
|
||||||
_keymap[XK_KP_Up ] = osgGA::GUIEventAdapter::KEY_KP_Up;
|
|
||||||
_keymap[XK_KP_Page_Up ] = osgGA::GUIEventAdapter::KEY_KP_Page_Up;
|
|
||||||
_keymap[XK_KP_Left ] = osgGA::GUIEventAdapter::KEY_KP_Left;
|
|
||||||
_keymap[XK_KP_Begin ] = osgGA::GUIEventAdapter::KEY_KP_Begin;
|
|
||||||
_keymap[XK_KP_Right ] = osgGA::GUIEventAdapter::KEY_KP_Right;
|
|
||||||
_keymap[XK_KP_End ] = osgGA::GUIEventAdapter::KEY_KP_End;
|
|
||||||
_keymap[XK_KP_Down ] = osgGA::GUIEventAdapter::KEY_KP_Down;
|
|
||||||
_keymap[XK_KP_Page_Down ] = osgGA::GUIEventAdapter::KEY_KP_Page_Down;
|
|
||||||
_keymap[XK_KP_Insert ] = osgGA::GUIEventAdapter::KEY_KP_Insert;
|
|
||||||
_keymap[XK_KP_Delete ] = osgGA::GUIEventAdapter::KEY_KP_Delete;
|
|
||||||
_keymap[XK_KP_Enter ] = osgGA::GUIEventAdapter::KEY_KP_Enter;
|
|
||||||
|
|
||||||
|
_standardKeymap[XK_1 ] = '1';
|
||||||
|
_standardKeymap[XK_2 ] = '2';
|
||||||
|
_standardKeymap[XK_3 ] = '3';
|
||||||
|
_standardKeymap[XK_4 ] = '4';
|
||||||
|
_standardKeymap[XK_5 ] = '5';
|
||||||
|
_standardKeymap[XK_6 ] = '6';
|
||||||
|
_standardKeymap[XK_7 ] = '7';
|
||||||
|
_standardKeymap[XK_8 ] = '8';
|
||||||
|
_standardKeymap[XK_9 ] = '9';
|
||||||
|
_standardKeymap[XK_0 ] = '0';
|
||||||
|
_standardKeymap[XK_A ] = 'A';
|
||||||
|
_standardKeymap[XK_B ] = 'B';
|
||||||
|
_standardKeymap[XK_C ] = 'C';
|
||||||
|
_standardKeymap[XK_D ] = 'D';
|
||||||
|
_standardKeymap[XK_E ] = 'E';
|
||||||
|
_standardKeymap[XK_F ] = 'F';
|
||||||
|
_standardKeymap[XK_G ] = 'G';
|
||||||
|
_standardKeymap[XK_H ] = 'H';
|
||||||
|
_standardKeymap[XK_I ] = 'I';
|
||||||
|
_standardKeymap[XK_J ] = 'J';
|
||||||
|
_standardKeymap[XK_K ] = 'K';
|
||||||
|
_standardKeymap[XK_L ] = 'L';
|
||||||
|
_standardKeymap[XK_M ] = 'M';
|
||||||
|
_standardKeymap[XK_N ] = 'N';
|
||||||
|
_standardKeymap[XK_O ] = 'O';
|
||||||
|
_standardKeymap[XK_P ] = 'P';
|
||||||
|
_standardKeymap[XK_Q ] = 'Q';
|
||||||
|
_standardKeymap[XK_R ] = 'R';
|
||||||
|
_standardKeymap[XK_S ] = 'S';
|
||||||
|
_standardKeymap[XK_T ] = 'T';
|
||||||
|
_standardKeymap[XK_U ] = 'U';
|
||||||
|
_standardKeymap[XK_V ] = 'V';
|
||||||
|
_standardKeymap[XK_W ] = 'W';
|
||||||
|
_standardKeymap[XK_X ] = 'X';
|
||||||
|
_standardKeymap[XK_Y ] = 'Y';
|
||||||
|
_standardKeymap[XK_Z ] = 'Z';
|
||||||
|
_standardKeymap[XK_a ] = 'a';
|
||||||
|
_standardKeymap[XK_b ] = 'b';
|
||||||
|
_standardKeymap[XK_c ] = 'c';
|
||||||
|
_standardKeymap[XK_d ] = 'd';
|
||||||
|
_standardKeymap[XK_e ] = 'e';
|
||||||
|
_standardKeymap[XK_f ] = 'f';
|
||||||
|
_standardKeymap[XK_g ] = 'g';
|
||||||
|
_standardKeymap[XK_h ] = 'h';
|
||||||
|
_standardKeymap[XK_i ] = 'i';
|
||||||
|
_standardKeymap[XK_j ] = 'j';
|
||||||
|
_standardKeymap[XK_k ] = 'k';
|
||||||
|
_standardKeymap[XK_l ] = 'l';
|
||||||
|
_standardKeymap[XK_m ] = 'm';
|
||||||
|
_standardKeymap[XK_n ] = 'n';
|
||||||
|
_standardKeymap[XK_o ] = 'o';
|
||||||
|
_standardKeymap[XK_p ] = 'p';
|
||||||
|
_standardKeymap[XK_q ] = 'q';
|
||||||
|
_standardKeymap[XK_r ] = 'r';
|
||||||
|
_standardKeymap[XK_s ] = 's';
|
||||||
|
_standardKeymap[XK_t ] = 't';
|
||||||
|
_standardKeymap[XK_u ] = 'u';
|
||||||
|
_standardKeymap[XK_v ] = 'v';
|
||||||
|
_standardKeymap[XK_w ] = 'w';
|
||||||
|
_standardKeymap[XK_x ] = 'x';
|
||||||
|
_standardKeymap[XK_y ] = 'y';
|
||||||
|
_standardKeymap[XK_z ] = 'z';
|
||||||
}
|
}
|
||||||
|
|
||||||
~X11KeyboardMap() {}
|
~X11KeyboardMap() {}
|
||||||
|
|
||||||
int remapKey(int key)
|
int remapKey(int key)
|
||||||
{
|
{
|
||||||
KeyMap::iterator itr = _keymap.find(key);
|
KeyMap::iterator itr = _extendedKeymap.find(key);
|
||||||
if (itr == _keymap.end()) return key;
|
if (itr != _extendedKeymap.end()) return itr->second;
|
||||||
else return itr->second;
|
|
||||||
|
itr = _standardKeymap.find(key);
|
||||||
|
if (itr != _standardKeymap.end()) return itr->second;
|
||||||
|
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool remapExtendedKey(int& key)
|
||||||
|
{
|
||||||
|
KeyMap::iterator itr = _extendedKeymap.find(key);
|
||||||
|
if (itr != _extendedKeymap.end())
|
||||||
|
{
|
||||||
|
key = itr->second;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
|
||||||
typedef std::map<int, int> KeyMap;
|
typedef std::map<int, int> KeyMap;
|
||||||
KeyMap _keymap;
|
KeyMap _extendedKeymap;
|
||||||
|
KeyMap _standardKeymap;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int remapX11Key(int key)
|
static bool remapExtendedX11Key(int& key)
|
||||||
{
|
{
|
||||||
static X11KeyboardMap s_x11KeyboardMap;
|
static X11KeyboardMap s_x11KeyboardMap;
|
||||||
return s_x11KeyboardMap.remapKey(key);
|
return s_x11KeyboardMap.remapExtendedKey(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Functions to handle key maps of type char[32] as contained in
|
// Functions to handle key maps of type char[32] as contained in
|
||||||
@@ -1304,22 +1351,15 @@ void GraphicsWindowX11::transformMouseXY(float& x, float& y)
|
|||||||
|
|
||||||
void GraphicsWindowX11::adaptKey(XKeyEvent& keyevent, int& keySymbol)
|
void GraphicsWindowX11::adaptKey(XKeyEvent& keyevent, int& keySymbol)
|
||||||
{
|
{
|
||||||
Display* display = _eventDisplay;
|
unsigned char buffer_return[32];
|
||||||
|
int bytes_buffer = 32;
|
||||||
|
KeySym keysym_return;
|
||||||
|
|
||||||
unsigned char keybuf[32];
|
int numChars = XLookupString(&keyevent, reinterpret_cast<char*>(buffer_return), bytes_buffer, &keysym_return, NULL);
|
||||||
XLookupString( &keyevent, (char *)keybuf, sizeof(keybuf), NULL, NULL );
|
keySymbol = keysym_return;
|
||||||
|
if (!remapExtendedX11Key(keySymbol) && (numChars==1))
|
||||||
KeySym ks = XKeycodeToKeysym( display, keyevent.keycode, 0 );
|
|
||||||
int remappedKey = remapX11Key(ks);
|
|
||||||
if (remappedKey & 0xff00)
|
|
||||||
{
|
{
|
||||||
// special keyboard character
|
keySymbol = buffer_return[0];
|
||||||
keySymbol = remappedKey;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// normal ascii key
|
|
||||||
keySymbol = keybuf[0];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1391,6 +1431,8 @@ void GraphicsWindowX11::rescanModifierMapping()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
XFree(mkm->modifiermap);
|
||||||
|
XFree(mkm);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphicsWindowX11::flushKeyEvents()
|
void GraphicsWindowX11::flushKeyEvents()
|
||||||
@@ -1410,6 +1452,8 @@ void GraphicsWindowX11::getModifierMap(char* keymap) const
|
|||||||
{
|
{
|
||||||
if (*m) keyMapSetKey(keymap, *m);
|
if (*m) keyMapSetKey(keymap, *m);
|
||||||
}
|
}
|
||||||
|
XFree(mkm->modifiermap);
|
||||||
|
XFree(mkm);
|
||||||
}
|
}
|
||||||
|
|
||||||
int GraphicsWindowX11::getModifierMask() const
|
int GraphicsWindowX11::getModifierMask() const
|
||||||
@@ -1424,6 +1468,8 @@ int GraphicsWindowX11::getModifierMask() const
|
|||||||
mask |= 1 << (i / mkm->max_keypermod);
|
mask |= 1 << (i / mkm->max_keypermod);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
XFree(mkm->modifiermap);
|
||||||
|
XFree(mkm);
|
||||||
return mask;
|
return mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -939,16 +939,20 @@ void Viewer::updateTraversal()
|
|||||||
|
|
||||||
void Viewer::getScenes(Scenes& scenes, bool onlyValid)
|
void Viewer::getScenes(Scenes& scenes, bool onlyValid)
|
||||||
{
|
{
|
||||||
|
scenes.clear();
|
||||||
scenes.push_back(_scene.get());
|
scenes.push_back(_scene.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Viewer::getViews(Views& views, bool onlyValid)
|
void Viewer::getViews(Views& views, bool onlyValid)
|
||||||
{
|
{
|
||||||
|
views.clear();
|
||||||
views.push_back(this);
|
views.push_back(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Viewer::getAllThreads(Threads& threads, bool onlyActive)
|
void Viewer::getAllThreads(Threads& threads, bool onlyActive)
|
||||||
{
|
{
|
||||||
|
threads.clear();
|
||||||
|
|
||||||
OperationThreads operationThreads;
|
OperationThreads operationThreads;
|
||||||
getOperationThreads(operationThreads);
|
getOperationThreads(operationThreads);
|
||||||
|
|
||||||
|
|||||||
@@ -389,7 +389,7 @@ RecordCameraPathHandler::RecordCameraPathHandler(const std::string& filename, fl
|
|||||||
const char* str = getenv("OSG_RECORD_CAMERA_PATH_FPS");
|
const char* str = getenv("OSG_RECORD_CAMERA_PATH_FPS");
|
||||||
if (str)
|
if (str)
|
||||||
{
|
{
|
||||||
_interval = 1.0f / atof(str);
|
_interval = 1.0f / osg::asciiToDouble(str);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -316,9 +316,9 @@ void Window::update() {
|
|||||||
|
|
||||||
// We only honor ANCHOR requests on topmost Windows, not embedded ones.
|
// We only honor ANCHOR requests on topmost Windows, not embedded ones.
|
||||||
if((_vAnchor != VA_NONE || _hAnchor != HA_NONE) && !_parent && _wm) {
|
if((_vAnchor != VA_NONE || _hAnchor != HA_NONE) && !_parent && _wm) {
|
||||||
if(_vAnchor == VA_TOP) y = 0.0f;
|
if(_vAnchor == VA_TOP) y = _wm->getHeight() - _height.current;
|
||||||
else if(_vAnchor == VA_CENTER) y = osg::round(_wm->getHeight() / 2.0f);
|
else if(_vAnchor == VA_CENTER) y = osg::round(_wm->getHeight() / 2.0f);
|
||||||
else if(_vAnchor == VA_BOTTOM) y = _wm->getHeight() - _height.current;
|
else if(_vAnchor == VA_BOTTOM) y = 0.0f;
|
||||||
|
|
||||||
if(_hAnchor == HA_LEFT) x = 0.0f;
|
if(_hAnchor == HA_LEFT) x = 0.0f;
|
||||||
else if(_hAnchor == HA_CENTER) x = osg::round(_wm->getWidth() / 2.0f);
|
else if(_hAnchor == HA_CENTER) x = osg::round(_wm->getWidth() / 2.0f);
|
||||||
|
|||||||
Reference in New Issue
Block a user