Compare commits
303 Commits
OpenSceneG
...
OpenSceneG
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a827840baf | ||
|
|
35f3876797 | ||
|
|
2e0472ba7e | ||
|
|
36e47d31bd | ||
|
|
994ea4d203 | ||
|
|
54ac72a126 | ||
|
|
6559295768 | ||
|
|
9b41f260d9 | ||
|
|
7a442801cd | ||
|
|
f3c615631b | ||
|
|
62cd8850e2 | ||
|
|
14e7bc5a17 | ||
|
|
5ac3a982ae | ||
|
|
a90a9a0a15 | ||
|
|
995e849e8a | ||
|
|
ddb72691bc | ||
|
|
817d92b703 | ||
|
|
8fb5ba4a3f | ||
|
|
3ef5d2b331 | ||
|
|
c64b94da2e | ||
|
|
19cf8b46c3 | ||
|
|
2568d1ac79 | ||
|
|
84ee98d9c4 | ||
|
|
49921bf300 | ||
|
|
b063f510c1 | ||
|
|
396cfca1ae | ||
|
|
aebc71a113 | ||
|
|
d8896f4bcb | ||
|
|
b2b6ee952b | ||
|
|
fbe4e1cf2f | ||
|
|
2b9c501e18 | ||
|
|
3930621edc | ||
|
|
9305485a11 | ||
|
|
9e75926338 | ||
|
|
d969516595 | ||
|
|
457d12d9b2 | ||
|
|
61c7ee76c5 | ||
|
|
605821e655 | ||
|
|
d1ff16614c | ||
|
|
8551f25da0 | ||
|
|
315031fa3b | ||
|
|
f4fe1e5cec | ||
|
|
7e8665308d | ||
|
|
c50b699992 | ||
|
|
cd5740e98f | ||
|
|
023bfb8bbb | ||
|
|
c5ff9e63df | ||
|
|
e5e5ea6239 | ||
|
|
9ae47b921b | ||
|
|
994b066329 | ||
|
|
ad82aea2e3 | ||
|
|
5f2a3ef76f | ||
|
|
2e7a7d786a | ||
|
|
67523373a9 | ||
|
|
f38fa9e9c3 | ||
|
|
99b2fffa7c | ||
|
|
3fbf24759f | ||
|
|
d215b255c4 | ||
|
|
51fee80224 | ||
|
|
fefabb6c2b | ||
|
|
27e3f57da2 | ||
|
|
56835cf821 | ||
|
|
445596e59c | ||
|
|
c0ea4c6310 | ||
|
|
ddea94b41c | ||
|
|
5f1e33fcb3 | ||
|
|
46e17699b3 | ||
|
|
38807c4bb8 | ||
|
|
987521ba9c | ||
|
|
6776cc2c63 | ||
|
|
3fe2e5a9e0 | ||
|
|
0d94d8e5a6 | ||
|
|
c8e283cfe9 | ||
|
|
b1314c0fb8 | ||
|
|
a86b90ca4a | ||
|
|
bc3372fda0 | ||
|
|
6477397b95 | ||
|
|
8f6eff9de5 | ||
|
|
c4e7a07367 | ||
|
|
23b7c4d47d | ||
|
|
a9900712a4 | ||
|
|
6774f77779 | ||
|
|
5516f86f9e | ||
|
|
a9546da368 | ||
|
|
415925b024 | ||
|
|
30aae63c3b | ||
|
|
694b1c3d32 | ||
|
|
a2436fa8b5 | ||
|
|
64d9b51f91 | ||
|
|
a3b507bb01 | ||
|
|
cbac09902d | ||
|
|
515a0bbe65 | ||
|
|
0c142215b9 | ||
|
|
dcc6dce8e3 | ||
|
|
7b3d1dff25 | ||
|
|
842b334803 | ||
|
|
8f5695eafb | ||
|
|
0a704161fe | ||
|
|
149c04b0df | ||
|
|
92abaca210 | ||
|
|
0e5bb43841 | ||
|
|
b3808ef89c | ||
|
|
99847c3ef2 | ||
|
|
0a6bea870c | ||
|
|
312f640a4a | ||
|
|
2b0105f875 | ||
|
|
b0c89b137d | ||
|
|
b2daa32420 | ||
|
|
bf208e1d10 | ||
|
|
24d61c2df0 | ||
|
|
e6f6de640a | ||
|
|
00679c7631 | ||
|
|
4e126469fc | ||
|
|
ccbc632afc | ||
|
|
060a641c2b | ||
|
|
cd124228fd | ||
|
|
4ad34877d2 | ||
|
|
2a8b760833 | ||
|
|
8dea265a91 | ||
|
|
7ec8b65ec4 | ||
|
|
c6c49c3745 | ||
|
|
acac960227 | ||
|
|
da6b4df00a | ||
|
|
7f370bdfc6 | ||
|
|
587fd6a022 | ||
|
|
730e6ad8f5 | ||
|
|
a8017cb807 | ||
|
|
ac6b082963 | ||
|
|
61957024fc | ||
|
|
117fd42efc | ||
|
|
387e66911b | ||
|
|
dc9f6f2751 | ||
|
|
8a4cdcf264 | ||
|
|
02d91a3eea | ||
|
|
59f417f1e0 | ||
|
|
9ad7ae5524 | ||
|
|
0c7fda710c | ||
|
|
cbf5b14f61 | ||
|
|
2e33cf0abc | ||
|
|
361ea5d15d | ||
|
|
a3b2ac63b3 | ||
|
|
3f9ab5689c | ||
|
|
af5a794a82 | ||
|
|
faa2b1d964 | ||
|
|
ab95a79540 | ||
|
|
079cf6c090 | ||
|
|
7dbcb4b7d3 | ||
|
|
634bd7f12d | ||
|
|
384cc25380 | ||
|
|
b43a59aa5d | ||
|
|
e135a85c1a | ||
|
|
2f914506e9 | ||
|
|
e5c951f5a3 | ||
|
|
9566fb7acf | ||
|
|
511f7be394 | ||
|
|
56e2a03378 | ||
|
|
5fc917881d | ||
|
|
00e2930fb7 | ||
|
|
fe9c235806 | ||
|
|
8d505e80a9 | ||
|
|
b6cb11b655 | ||
|
|
4b6d9287bc | ||
|
|
b41c5bde96 | ||
|
|
2ac97b5ece | ||
|
|
21c0affe66 | ||
|
|
68fc6ca610 | ||
|
|
52edc4af8d | ||
|
|
c1757aadb4 | ||
|
|
cfd190a9fa | ||
|
|
5311d6fb6b | ||
|
|
e31afbf78a | ||
|
|
be6bc39016 | ||
|
|
38727ed4b4 | ||
|
|
8491fd780d | ||
|
|
3ccdc66717 | ||
|
|
2f71c55da9 | ||
|
|
7b6135f0f7 | ||
|
|
05e896af7e | ||
|
|
33bf30cd8c | ||
|
|
fd014e3b52 | ||
|
|
3f0c1daaa2 | ||
|
|
c9fc6e0f79 | ||
|
|
348fbfe410 | ||
|
|
47ec2c7951 | ||
|
|
6ea8ebf25a | ||
|
|
2b65555d5f | ||
|
|
2439679b0c | ||
|
|
0cbf839425 | ||
|
|
82cae6daf4 | ||
|
|
6767ff540b | ||
|
|
69ebfecfcc | ||
|
|
3834172342 | ||
|
|
036bb7b472 | ||
|
|
b5dff94107 | ||
|
|
1784381dc7 | ||
|
|
9e18a7542b | ||
|
|
1c6fd4da9b | ||
|
|
e1b3c78013 | ||
|
|
f263ad29db | ||
|
|
dd32ee2945 | ||
|
|
0b5cb65cdd | ||
|
|
a8e78fde99 | ||
|
|
43b274f65c | ||
|
|
f97ea3577d | ||
|
|
9726617b6e | ||
|
|
997276d359 | ||
|
|
dceb353fe6 | ||
|
|
d8600411bd | ||
|
|
066c272f7a | ||
|
|
7ebe56291f | ||
|
|
c89a7fe67c | ||
|
|
b14bb21801 | ||
|
|
37eae8c719 | ||
|
|
12b298130a | ||
|
|
c548289ac1 | ||
|
|
2ebde09aff | ||
|
|
049f88325a | ||
|
|
cc68d7f151 | ||
|
|
5770774e00 | ||
|
|
5624a22fe4 | ||
|
|
9905b90a18 | ||
|
|
6d5c6ad6cc | ||
|
|
971eba37ad | ||
|
|
43574b52c1 | ||
|
|
625c771641 | ||
|
|
1504a54cd8 | ||
|
|
0f2e9e6557 | ||
|
|
cd150cbe96 | ||
|
|
02d7d980a7 | ||
|
|
c8521068a5 | ||
|
|
832d8d5228 | ||
|
|
bdd0be2f8f | ||
|
|
968a427e00 | ||
|
|
b8f9249bea | ||
|
|
e2fb88e187 | ||
|
|
749dc86dd3 | ||
|
|
84bae01643 | ||
|
|
8a5d1b9f44 | ||
|
|
488b4854b2 | ||
|
|
6455159757 | ||
|
|
2e68db5b55 | ||
|
|
2e29085669 | ||
|
|
f223fec92d | ||
|
|
cc3cb92ddc | ||
|
|
4dcb2bbf3c | ||
|
|
eeb13d1efc | ||
|
|
fe98c3d7f5 | ||
|
|
46b07141e8 | ||
|
|
02bfd05d6f | ||
|
|
035abfdb71 | ||
|
|
0c99326db3 | ||
|
|
8103da6ef1 | ||
|
|
bd83044c08 | ||
|
|
f6b64afdfc | ||
|
|
1c65815f4e | ||
|
|
5e9be10da6 | ||
|
|
820532ddff | ||
|
|
6951c44464 | ||
|
|
e12049ed47 | ||
|
|
fd47b84bd7 | ||
|
|
b7947b13f3 | ||
|
|
7a601753e0 | ||
|
|
07e5480b57 | ||
|
|
ea1e832d4d | ||
|
|
da7bf3ff81 | ||
|
|
a6fbf73f36 | ||
|
|
ef8fd268de | ||
|
|
064c39a7f3 | ||
|
|
5eb9ab1d75 | ||
|
|
e8ba57b22f | ||
|
|
47aa320787 | ||
|
|
3a3ddfce49 | ||
|
|
dc2aa77d98 | ||
|
|
aa6cd2d7da | ||
|
|
658fd4d19d | ||
|
|
8b4359b77e | ||
|
|
c5d00bc223 | ||
|
|
1eedae844e | ||
|
|
e819ea9c0e | ||
|
|
15b9a493ed | ||
|
|
0341d6f873 | ||
|
|
3577fd9d90 | ||
|
|
a47294a580 | ||
|
|
452802b168 | ||
|
|
5a3f2e287c | ||
|
|
bf5a88870f | ||
|
|
8af46a6e98 | ||
|
|
56617a4bfb | ||
|
|
7eaceb0baa | ||
|
|
8feae585e1 | ||
|
|
fa7843d520 | ||
|
|
d48a304569 | ||
|
|
ce90a9b2da | ||
|
|
273dd046c2 | ||
|
|
627c3df093 | ||
|
|
ab372b9ead | ||
|
|
247eee2ca1 | ||
|
|
d4bbec4a0c | ||
|
|
114c818f2e | ||
|
|
1ee6d476f8 | ||
|
|
8a29c504e4 | ||
|
|
f376af1fd5 | ||
|
|
e663330bdf |
11
.gitignore
vendored
11
.gitignore
vendored
@@ -6,6 +6,10 @@ doc/openthreads.doxyfile
|
||||
|
||||
doc/OpenSceneGraphReferenceDocs/
|
||||
doc/OpenThreadsReferenceDocs/
|
||||
doc/*.chm
|
||||
|
||||
CMakeDoxyfile.in
|
||||
CMakeDoxygenDefaults.cmake
|
||||
|
||||
cmake_uninstall.cmake
|
||||
|
||||
@@ -59,6 +63,10 @@ install_manifest*.txt
|
||||
*.out
|
||||
*.app
|
||||
|
||||
# Automatically generated Package files
|
||||
packaging/cmake/*
|
||||
configure/*
|
||||
|
||||
# Platform Specifics - auto generated files
|
||||
PlatformSpecifics/Windows/*.rc
|
||||
|
||||
@@ -79,6 +87,9 @@ PlatformSpecifics/Windows/*.rc
|
||||
*.sdf
|
||||
*.opensdf
|
||||
|
||||
# Visual Studio - Cache/Options Directory
|
||||
.vs/
|
||||
|
||||
#osx xcode
|
||||
DerivedData/
|
||||
*.DS_Store
|
||||
|
||||
@@ -15,8 +15,8 @@ matrix:
|
||||
dist: trusty
|
||||
language: cpp
|
||||
env:
|
||||
- CMAKECMD_ARGS="-DBUILD_OSG_EXAMPLES=ON -DBUILD_OSG_PLUGINS_BY_DEFAULT=ON -DBUILD_OSG_APPLICATIONS=ON"
|
||||
# - CMAKECMD_ARGS="-DBUILD_OSG_EXAMPLES=OFF -DBUILD_OSG_PLUGINS_BY_DEFAULT=ON -DBUILD_OSG_APPLICATIONS=ON"
|
||||
# - CMAKECMD_ARGS="-DBUILD_OSG_EXAMPLES=ON -DBUILD_OSG_PLUGINS_BY_DEFAULT=ON -DBUILD_OSG_APPLICATIONS=ON"
|
||||
- CMAKECMD_ARGS="-DBUILD_OSG_EXAMPLES=OFF -DBUILD_OSG_PLUGINS_BY_DEFAULT=ON -DBUILD_OSG_APPLICATIONS=ON"
|
||||
#- LLVM_VERSION=3.8
|
||||
sudo: false
|
||||
cache:
|
||||
|
||||
47
AUTHORS.txt
47
AUTHORS.txt
@@ -1,6 +1,6 @@
|
||||
OpenSceneGraph Library 3.6.3
|
||||
OpenSceneGraph Library 3.6.4
|
||||
|
||||
569 Contributors:
|
||||
570 Contributors:
|
||||
|
||||
Firstname Surname
|
||||
-----------------
|
||||
@@ -10,10 +10,10 @@ Stephan Huber
|
||||
Paul Martz
|
||||
Laurens Voerman
|
||||
Farshid Lashkari
|
||||
Mathias Frhlich
|
||||
Mathias Fr<EFBFBD>hlich
|
||||
Marco Jez
|
||||
Wang Rui
|
||||
Jean-Sbastien Guay
|
||||
Jean-S<EFBFBD>bastien Guay
|
||||
Ulrich Hertlein
|
||||
Mike Weiblen
|
||||
Sukender
|
||||
@@ -43,8 +43,8 @@ Chris Hanson
|
||||
Roland Smeenk
|
||||
Roger James
|
||||
Jeremy Moles
|
||||
J.P. Delport
|
||||
Andy Skinner
|
||||
J.P. Delport
|
||||
Magnus Kessler
|
||||
David Fries
|
||||
Tom Jolley
|
||||
@@ -67,11 +67,11 @@ Norman Vine
|
||||
Chris Denham
|
||||
Sherman Wilcox
|
||||
Serge Lages
|
||||
Romano Jos Magacho da Silva
|
||||
Romano Jos<EFBFBD> Magacho da Silva
|
||||
Mourad Boufarguine
|
||||
Alberto Farre
|
||||
Glenn Waldron
|
||||
Andr Garneau
|
||||
Andr<EFBFBD> Garneau
|
||||
Adrian Egli
|
||||
Sebastian Messerschmidt
|
||||
Randall Hopper
|
||||
@@ -86,7 +86,7 @@ Michael Gronager
|
||||
Martin Naylor
|
||||
Joakim Simonsson
|
||||
David Spilling
|
||||
Daniel Sjlie
|
||||
Daniel Sj<EFBFBD>lie
|
||||
Bryan Thrall
|
||||
Andreas Ekstrand
|
||||
Rafa Gaitan
|
||||
@@ -123,7 +123,7 @@ Gordon Tomlinson
|
||||
Frederic Marmond
|
||||
Frederic Bouvier
|
||||
Carlo Camporesi
|
||||
Bjrn Blissing
|
||||
Bj<EFBFBD>rn Blissing
|
||||
Alexander Sinditskiy
|
||||
Vladimir Chebaev
|
||||
Thibault Genessay
|
||||
@@ -143,7 +143,7 @@ Uwe Woessner
|
||||
Tony Horrobin
|
||||
Thom DeCarlo
|
||||
Tatsuhiro Nishioka
|
||||
Tanguy Fautr
|
||||
Tanguy Fautr<EFBFBD>
|
||||
Sean Spicer
|
||||
Ryan Kawicki
|
||||
Richard Schmidt
|
||||
@@ -202,7 +202,7 @@ Phil Atkin
|
||||
Pawel Ksiezopolski
|
||||
Patrick Neary
|
||||
Nathan Monteleone
|
||||
Miha Ravelj
|
||||
Miha Rav<EFBFBD>elj
|
||||
Miguel Escriva
|
||||
Mattias Linde
|
||||
Mark Sciabica
|
||||
@@ -232,10 +232,11 @@ Dietmar Funck
|
||||
Colin Cochran
|
||||
Christian Ruzicka
|
||||
Christian Buchner
|
||||
Chris Djali
|
||||
Charles Cole
|
||||
Blake Williams
|
||||
Bjrn Hein
|
||||
Aurlien Chatelain
|
||||
Bj<EFBFBD>rn Hein
|
||||
Aur<EFBFBD>lien Chatelain
|
||||
Antoine Hue
|
||||
Andrew Bettison
|
||||
Andreas Henne
|
||||
@@ -264,7 +265,7 @@ Paul Obermeier
|
||||
Nguyen Van Truong
|
||||
Nathan Cournia
|
||||
Morten Haukness
|
||||
Morn Pistorius
|
||||
Morn<EFBFBD> Pistorius
|
||||
Michael Mc Donnell
|
||||
Michael Henheffer
|
||||
Michael Guerrero
|
||||
@@ -297,7 +298,7 @@ Guillaume Taze
|
||||
Guillaume Chouvenc
|
||||
Giuseppe Donvito
|
||||
Gill Peacegood
|
||||
Giampaolo Vigan
|
||||
Giampaolo Vigan<EFBFBD>
|
||||
Gerrick Bivins
|
||||
George Tarantilis
|
||||
Ferdi Smit
|
||||
@@ -305,7 +306,7 @@ Eduardo Poyart
|
||||
Edgar Ellis
|
||||
Dmitry Marakasov
|
||||
Dimi Christopoulos
|
||||
Diane Delalle
|
||||
Diane Delall<EFBFBD>e
|
||||
David Longest
|
||||
David Ergo
|
||||
Daniel Trstenjak
|
||||
@@ -337,7 +338,7 @@ Vasily Radostev
|
||||
Valery Bickov
|
||||
Valeriy Dubov
|
||||
Vaclav Bilek
|
||||
Tyge Lvset
|
||||
Tyge L<EFBFBD>vset
|
||||
Troy Yee
|
||||
Torben Dannahauer
|
||||
Tony Vasile
|
||||
@@ -387,7 +388,7 @@ Piotr Rak
|
||||
Pierre Bourdin
|
||||
Philipp Svehla
|
||||
Philipp Siemoleit
|
||||
Philipp Mchler
|
||||
Philipp M<EFBFBD>chler
|
||||
Philip Lamb
|
||||
Petr Salinger
|
||||
Peter Bear
|
||||
@@ -412,7 +413,7 @@ Nick Thu
|
||||
Nick Black
|
||||
Mojtaba Fathi
|
||||
Mirko Viviani
|
||||
Mikkel Gjl
|
||||
Mikkel Gj<EFBFBD>l
|
||||
Mike Krus
|
||||
Mike Garrity
|
||||
Mick Thu
|
||||
@@ -465,7 +466,7 @@ Juan Hernando
|
||||
Josh Portway
|
||||
Jonathan Greig
|
||||
John Tan
|
||||
John Hedstrm
|
||||
John Hedström
|
||||
John Grant
|
||||
John Farrier
|
||||
John Donovan
|
||||
@@ -523,11 +524,11 @@ David Jung
|
||||
Danny Valente
|
||||
Daniel Stien
|
||||
Dan Minor
|
||||
Csar L. B. Silveira
|
||||
C<EFBFBD>sar L. B. Silveira
|
||||
Cyril Brulebois
|
||||
Curtis Rubel
|
||||
Cory Slep
|
||||
Clment Bsch
|
||||
Cl<EFBFBD>ment B<EFBFBD>sch
|
||||
Clay Fowler
|
||||
Claus Steuer
|
||||
Chuck Sembroski
|
||||
@@ -539,8 +540,8 @@ Christian Kaser
|
||||
Christian Ehrlicher
|
||||
Chris White
|
||||
Chris McGlone
|
||||
Chris Djali
|
||||
Carlos Garcea
|
||||
Capostrophic
|
||||
Bryce Eldridge
|
||||
Bruno Herbelin
|
||||
Brian Keener
|
||||
|
||||
242
CMakeLists.txt
242
CMakeLists.txt
@@ -3,8 +3,8 @@
|
||||
#
|
||||
SET(OPENSCENEGRAPH_MAJOR_VERSION 3)
|
||||
SET(OPENSCENEGRAPH_MINOR_VERSION 6)
|
||||
SET(OPENSCENEGRAPH_PATCH_VERSION 3)
|
||||
SET(OPENSCENEGRAPH_SOVERSION 158)
|
||||
SET(OPENSCENEGRAPH_PATCH_VERSION 5)
|
||||
SET(OPENSCENEGRAPH_SOVERSION 161)
|
||||
|
||||
|
||||
# set to 0 when not a release candidate, non zero means that any generated
|
||||
@@ -41,6 +41,8 @@ IF(APPLE)
|
||||
OSG_OSX_VERSION "${OSG_OSX_VERSION}")
|
||||
ENDIF()
|
||||
|
||||
PROJECT(OpenSceneGraph)
|
||||
|
||||
# Set OSX architecture flags here, since they must be specified before
|
||||
# creating the actual OSG project.
|
||||
# Note that the CMAKE_OSX_* variables are not well documented in
|
||||
@@ -48,67 +50,74 @@ ENDIF()
|
||||
# See https://cmake.org/Bug/view.php?id=14695#c34953
|
||||
# Additionally, OSG_WINDOWING_SYSTEM is set here for OSX since its
|
||||
# value is needed to find the correct version of OpenGL (X11 or Cocoa).
|
||||
IF(APPLE AND NOT ANDROID)
|
||||
|
||||
# Here we check if the user specified IPhone SDK
|
||||
# These options are formally defined later, but can also be specified
|
||||
# by the user at the command line using the cmake -D switch
|
||||
# Note that FORCE is used since the user will likely enable IPhone
|
||||
# build via CMake GUI after already having configured once
|
||||
IF(OSG_BUILD_PLATFORM_IPHONE OR OSG_BUILD_PLATFORM_IPHONE_SIMULATOR)
|
||||
SET(OSG_WINDOWING_SYSTEM "IOS" CACHE STRING "Windowing system type for graphics window creation, options only IOS.")
|
||||
IF(ANDROID)
|
||||
SET(OSG_WINDOWING_SYSTEM "None" CACHE STRING "Windowing system type for graphics window creation; options: None.")
|
||||
ELSEIF(WIN32 OR MINGW)
|
||||
SET(OSG_WINDOWING_SYSTEM "Win32" CACHE STRING "Windowing system type for graphics window creation; options: Win32 or None.")
|
||||
ELSEIF(APPLE)
|
||||
# custom option to flag an iOS build
|
||||
OPTION(OSG_BUILD_PLATFORM_IPHONE "Enable IPhoneSDK Device support" OFF)
|
||||
|
||||
#set iphone arch and flags taken from http://sites.google.com/site/michaelsafyan/coding/resources/how-to-guides/cross-compile-for-the-iphone/how-to-cross-compile-for-the-iphone-using-cmake
|
||||
IF(OSG_BUILD_PLATFORM_IPHONE)
|
||||
IF(${IPHONE_VERSION_MIN} LESS "7.0")
|
||||
SET(CMAKE_OSX_ARCHITECTURES "armv6;armv7" CACHE STRING "Build architectures for iOS" FORCE)
|
||||
ELSE()
|
||||
SET(CMAKE_OSX_ARCHITECTURES "armv7;armv7s;arm64" CACHE STRING "Build architectures for iOS" FORCE)
|
||||
ENDIF()
|
||||
|
||||
# set sdk and min versions
|
||||
SET (IPHONE_SDKVER "10.2" CACHE STRING "IOS SDK-Version")
|
||||
SET (IPHONE_VERSION_MIN "7.0" CACHE STRING "IOS minimum os version, use 7.0 or greater to get 64bit support")
|
||||
|
||||
# get full path to sdk from requested versions
|
||||
SET (IPHONE_DEVROOT "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer")
|
||||
SET (IPHONE_SDKROOT "${IPHONE_DEVROOT}/SDKs/iPhoneOS${IPHONE_SDKVER}.sdk")
|
||||
|
||||
# optionally enable bitcode for the build
|
||||
SET (IPHONE_ENABLE_BITCODE "NO" CACHE STRING "IOS Enable Bitcode")
|
||||
|
||||
# seamless toggle between device and simulator
|
||||
SET(CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphoneos;-iphonesimulator" CACHE STRING "Xcode effective platforms for iOS")
|
||||
|
||||
# set deployment target to min version
|
||||
SET(CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "${IPHONE_VERSION_MIN}" CACHE STRING "Xcode deployment target for iOS")
|
||||
|
||||
# Set standard architectures
|
||||
SET(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD)" CACHE STRING "Build architectures for iOS")
|
||||
|
||||
ELSE()
|
||||
#simulator uses i386 and x86_64 architectures
|
||||
SET(CMAKE_OSX_ARCHITECTURES "i386;x86_64" CACHE STRING "Build architectures for iOS Simulator" FORCE)
|
||||
ENDIF()
|
||||
# OSX >= 10.5 uses Cocoa windowing system, otherwise Carbon
|
||||
IF(OSG_OSX_VERSION VERSION_LESS 10.5)
|
||||
SET(OSG_WINDOWING_SYSTEM "Carbon" CACHE STRING "Windowing system type for graphics window creation; options: Carbon, Cocoa, X11 or None.")
|
||||
SET(OSG_WINDOWING_SYSTEM_CARBON ON INTERNAL "use Carbon (apple; 32 bit only)")
|
||||
ELSE()
|
||||
SET(OSG_WINDOWING_SYSTEM "Cocoa" CACHE STRING "Windowing system type for graphics window creation; options: Carbon, Cocoa, X11 or None.")
|
||||
ENDIF()
|
||||
|
||||
#here we set the specific iphone sdk version. We can only set either device or simulator sdk. So if you want both you currently have to have two separate projects
|
||||
SET(CMAKE_OSX_SYSROOT "${IPHONE_SDKROOT}" CACHE STRING "System root for iOS" FORCE)
|
||||
|
||||
ELSE()
|
||||
# OSX >= 10.5 uses Cocoa windowing system, otherwise Carbon
|
||||
IF(OSG_OSX_VERSION VERSION_LESS 10.5)
|
||||
SET(OSG_WINDOWING_SYSTEM "Carbon" CACHE STRING "Windowing system type for graphics window creation, options Carbon, Cocoa or X11.")
|
||||
ELSE()
|
||||
SET(OSG_WINDOWING_SYSTEM "Cocoa" CACHE STRING "Windowing system type for graphics window creation, options Carbon, Cocoa or X11.")
|
||||
# Set defaults for Universal Binaries. We want 32-bit Intel/PPC on 10.4
|
||||
# and 32/64-bit Intel/PPC on >= 10.5. Anything <= 10.3 doesn't support.
|
||||
# These are set the first time CMake is run, and can be changed by
|
||||
# the user at any time.
|
||||
IF(OSG_OSX_VERSION VERSION_GREATER 10.7)
|
||||
# 64 Bit Works, i386,ppc is not supported any more
|
||||
SET(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE STRING "Build architectures for OSX")
|
||||
SET(CMAKE_OSX_DEPLOYMENT_TARGET "10.8" CACHE STRING "Target OSX version")
|
||||
ELSEIF(OSG_OSX_VERSION VERSION_EQUAL 10.7)
|
||||
# 64 Bit Works, PPC is not supported any more
|
||||
SET(CMAKE_OSX_ARCHITECTURES "i386;x86_64" CACHE STRING "Build architectures for OSX")
|
||||
ELSEIF(OSG_OSX_VERSION VERSION_GREATER 10.4)
|
||||
# 64-bit compiles are not supported with Carbon.
|
||||
SET(CMAKE_OSX_ARCHITECTURES "ppc;i386" CACHE STRING "Build architectures for OSX")
|
||||
SET(CMAKE_OSX_DEPLOYMENT_TARGET "10.5" CACHE STRING "Target OSX version")
|
||||
ELSEIF(OSG_OSX_VERSION VERSION_EQUAL 10.4)
|
||||
# 64-bit compiles are not supported with Carbon.
|
||||
SET(CMAKE_OSX_ARCHITECTURES "ppc;i386" CACHE STRING "Build architectures for OSX")
|
||||
ELSE()
|
||||
# No Universal Binary support and SDK detection is too unreliable.
|
||||
# Warn user and continue at their own peril.
|
||||
MESSAGE(WARNING "OSX 10.3 and earlier not supported.")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
# Set defaults for Universal Binaries. We want 32-bit Intel/PPC on 10.4
|
||||
# and 32/64-bit Intel/PPC on >= 10.5. Anything <= 10.3 doesn't support.
|
||||
# These are set the first time CMake is run, and can be changed by
|
||||
# the user at any time.
|
||||
IF(OSG_OSX_VERSION VERSION_GREATER 10.7)
|
||||
# 64 Bit Works, i386,ppc is not supported any more
|
||||
SET(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE STRING "Build architectures for OSX")
|
||||
SET(CMAKE_OSX_DEPLOYMENT_TARGET "10.8" CACHE STRING "Target OSX version")
|
||||
ELSEIF(OSG_OSX_VERSION VERSION_EQUAL 10.7)
|
||||
# 64 Bit Works, PPC is not supported any more
|
||||
SET(CMAKE_OSX_ARCHITECTURES "i386;x86_64" CACHE STRING "Build architectures for OSX")
|
||||
ELSEIF(OSG_OSX_VERSION VERSION_GREATER 10.4)
|
||||
# 64-bit compiles are not supported with Carbon.
|
||||
SET(CMAKE_OSX_ARCHITECTURES "ppc;i386" CACHE STRING "Build architectures for OSX")
|
||||
SET(CMAKE_OSX_DEPLOYMENT_TARGET "10.5" CACHE STRING "Target OSX version")
|
||||
ELSEIF(OSG_OSX_VERSION VERSION_EQUAL 10.4)
|
||||
# 64-bit compiles are not supported with Carbon.
|
||||
SET(CMAKE_OSX_ARCHITECTURES "ppc;i386" CACHE STRING "Build architectures for OSX")
|
||||
ELSE()
|
||||
# No Universal Binary support and SDK detection is too unreliable.
|
||||
# Warn user and continue at their own peril.
|
||||
MESSAGE(WARNING "OSX 10.3 and earlier not supported.")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
ELSE()
|
||||
SET(OSG_WINDOWING_SYSTEM "X11" CACHE STRING "Windowing system type for graphics window creation; options: X11 or None.")
|
||||
ENDIF()
|
||||
|
||||
PROJECT(OpenSceneGraph)
|
||||
|
||||
SET(OPENSCENEGRAPH_VERSION ${OPENSCENEGRAPH_MAJOR_VERSION}.${OPENSCENEGRAPH_MINOR_VERSION}.${OPENSCENEGRAPH_PATCH_VERSION})
|
||||
|
||||
@@ -218,40 +227,15 @@ ENDIF(OSG_MAINTAINER)
|
||||
|
||||
IF(NOT ANDROID)
|
||||
IF(APPLE)
|
||||
# Trying to get CMake to generate an XCode IPhone project, current efforts are to get iphoneos sdk 3.1 working
|
||||
# Added option which needs manually setting to select the IPhone SDK for building. We can only have one of the below
|
||||
# set to true. Should really have an OSG_BUILD_PLATFORM variable that we set to our desired platform
|
||||
OPTION(OSG_BUILD_PLATFORM_IPHONE "Enable IPhoneSDK Device support" OFF)
|
||||
OPTION(OSG_BUILD_PLATFORM_IPHONE_SIMULATOR "Enable IPhoneSDK Simulator support" OFF)
|
||||
|
||||
IF(OSG_BUILD_PLATFORM_IPHONE OR OSG_BUILD_PLATFORM_IPHONE_SIMULATOR)
|
||||
IF(OSG_BUILD_PLATFORM_IPHONE)
|
||||
|
||||
#you need to manually set the default sdk version here
|
||||
SET (IPHONE_SDKVER "10.2" CACHE STRING "IOS SDK-Version")
|
||||
SET (IPHONE_VERSION_MIN "7.0" CACHE STRING "IOS minimum os version, use 7.0 or greater to get 64bit support")
|
||||
# set the sdk path as our sysroot, if we set this before the project is defined cmake fails to build its test program
|
||||
SET(CMAKE_OSX_SYSROOT "${IPHONE_SDKROOT}" CACHE STRING "System root for iOS" FORCE)
|
||||
|
||||
#the below is taken from ogre, it states the gcc stuff needs to happen before PROJECT() is called. I've no clue if we even need it
|
||||
# Force gcc <= 4.2 on iPhone
|
||||
IF(IPHONE_VERSION_MIN LESS "6.0")
|
||||
include(CMakeForceCompiler)
|
||||
CMAKE_FORCE_C_COMPILER(llvm-gcc-4.2 GNU)
|
||||
CMAKE_FORCE_CXX_COMPILER(llvm-gcc-4.2 GNU)
|
||||
SET(GCC_THUMB_SUPPORT NO)
|
||||
ENDIF()
|
||||
# Set the path to OpenGL library
|
||||
SET(OPENGL_gl_LIBRARY "${IPHONE_SDKROOT}/System/Library/Frameworks/OpenGLES.framework")
|
||||
|
||||
#set either the device sdk or the simulator sdk. Can't find away to separate these in the same project
|
||||
IF(OSG_BUILD_PLATFORM_IPHONE)
|
||||
SET (IPHONE_DEVROOT "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer")
|
||||
SET (IPHONE_SDKROOT "${IPHONE_DEVROOT}/SDKs/iPhoneOS${IPHONE_SDKVER}.sdk")
|
||||
ELSE()
|
||||
SET (IPHONE_DEVROOT "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer")
|
||||
SET (IPHONE_SDKROOT "${IPHONE_DEVROOT}/SDKs/iPhoneSimulator${IPHONE_SDKVER}.sdk")
|
||||
ENDIF()
|
||||
|
||||
SET (IPHONE_ENABLE_BITCODE "NO" CACHE STRING "IOS Enable Bitcode")
|
||||
|
||||
# Apple iOS: Find OpenGLES
|
||||
FIND_LIBRARY(OPENGLES_LIBRARY OpenGLES)
|
||||
ELSE ()
|
||||
FIND_LIBRARY(CARBON_LIBRARY Carbon)
|
||||
FIND_LIBRARY(COCOA_LIBRARY Cocoa)
|
||||
@@ -454,6 +438,9 @@ MARK_AS_ADVANCED(OSG_USE_FLOAT_BOUNDINGSPHERE)
|
||||
OPTION(OSG_USE_FLOAT_BOUNDINGBOX "Set to ON to build OpenSceneGraph with float BoundingBox instead of double." ON)
|
||||
MARK_AS_ADVANCED(OSG_USE_FLOAT_BOUNDINGBOX)
|
||||
|
||||
OPTION(OSG_USE_FLOAT_QUAT "Set to ON to build OpenSceneGraph with float Quat instead of double." OFF)
|
||||
MARK_AS_ADVANCED(OSG_USE_FLOAT_QUAT)
|
||||
|
||||
IF (WIN32)
|
||||
OPTION(OSG_USE_UTF8_FILENAME "Set to ON to use a UTF8 locale for filenames instead of the default locale." OFF)
|
||||
MARK_AS_ADVANCED(OSG_USE_UTF8_FILENAME)
|
||||
@@ -515,6 +502,12 @@ ENDIF()
|
||||
|
||||
OPTION(OSG_GL_LIBRARY_STATIC "Set to ON to statically link with OpenGL/GLES library." OFF)
|
||||
|
||||
IF (OSG_BUILD_PLATFORM_IPHONE OR ANDROID)
|
||||
OPTION(OSG_TEXT_USE_FONTCONFIG "Set to ON to enable attempt to use FontConfig in osgText." OFF)
|
||||
ELSE ()
|
||||
OPTION(OSG_TEXT_USE_FONTCONFIG "Set to OFF to disable attempt to use FontConfig in osgText." ON)
|
||||
ENDIF ()
|
||||
|
||||
# Map the OSG_GL*_AVAILABLE settings to OSG_GL_* settings
|
||||
IF (OSG_GLES2_AVAILABLE OR OSG_GLES3_AVAILABLE OR OSG_GL3_AVAILABLE)
|
||||
OPTION(OSG_GL_DISPLAYLISTS_AVAILABLE "Set to OFF to disable use of OpenGL display lists." OFF)
|
||||
@@ -542,12 +535,12 @@ ELSE()
|
||||
OPTION(OSG_CPP_EXCEPTIONS_AVAILABLE "Set to OFF to disable compile of OSG components that use C++ exceptions." ON)
|
||||
ENDIF()
|
||||
|
||||
SET(OSG_GL_CONTEXT_VERSION "1.0" CACHE STRING "GL Context String to pass when creaing graphics contexts")
|
||||
|
||||
# Map the OSG_GL*_AVAILABLE settings to OpenGL header settings
|
||||
SET(DEFAULT_GL_CONTEXT_VERSION "1.0")
|
||||
IF (OSG_GL3_AVAILABLE)
|
||||
|
||||
SET(OSG_GL_CONTEXT_VERSION "3.3")
|
||||
SET(DEFAULT_GL_CONTEXT_VERSION "3.3")
|
||||
|
||||
IF (APPLE)
|
||||
SET(OPENGL_HEADER1 "#include <OpenGL/gl.h>" CACHE STRING "#include<> line for OpenGL Header")
|
||||
@@ -600,6 +593,8 @@ ELSE()
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
SET(OSG_GL_CONTEXT_VERSION ${DEFAULT_GL_CONTEXT_VERSION} CACHE STRING "GL Context String to pass when creaing graphics contexts")
|
||||
|
||||
IF (OSG_GL1_AVAILABLE)
|
||||
SET(OSG_GL1_FEATURES 1)
|
||||
ELSE()
|
||||
@@ -752,7 +747,6 @@ ELSE()
|
||||
FIND_PACKAGE(COLLADA)
|
||||
FIND_PACKAGE(FBX)
|
||||
FIND_PACKAGE(ZLIB)
|
||||
FIND_PACKAGE(OpenVRML)
|
||||
FIND_PACKAGE(GDAL)
|
||||
FIND_PACKAGE(GTA)
|
||||
FIND_PACKAGE(CURL)
|
||||
@@ -798,9 +792,7 @@ IF (BUILD_OSG_EXAMPLES AND NOT ANDROID)
|
||||
|
||||
FIND_PACKAGE(FLTK)
|
||||
FIND_PACKAGE(FOX)
|
||||
|
||||
SET(wxWidgets_USE_LIBS base core gl net)
|
||||
FIND_PACKAGE(wxWidgets)
|
||||
FIND_PACKAGE(wxWidgets COMPONENTS base core gl net)
|
||||
|
||||
ENDIF(BUILD_OSG_EXAMPLES AND NOT ANDROID)
|
||||
|
||||
@@ -891,10 +883,26 @@ IF(CYGWIN)
|
||||
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
|
||||
ENDIF()
|
||||
|
||||
IF(UNIX AND NOT WIN32 AND NOT APPLE)
|
||||
IF(CMAKE_SIZEOF_VOID_P MATCHES "8")
|
||||
SET(LIB_POSTFIX "64" CACHE STRING "suffix for 32/64 dir placement")
|
||||
MARK_AS_ADVANCED(LIB_POSTFIX)
|
||||
# Set OSG_INSTALL_LIBDIR to specify the installation directories of object code libraries
|
||||
IF(DEFINED LIB_POSTFIX)
|
||||
# Use LIB_POSTFIX if defined
|
||||
SET(OSG_INSTALL_LIBDIR lib${LIB_POSTFIX})
|
||||
ELSE()
|
||||
IF(CMAKE_VERSION VERSION_LESS "2.8.5")
|
||||
IF(UNIX AND NOT WIN32 AND NOT APPLE)
|
||||
IF(CMAKE_SIZEOF_VOID_P MATCHES "8")
|
||||
SET(LIB_POSTFIX "64" CACHE STRING "suffix for 32/64 dir placement")
|
||||
MARK_AS_ADVANCED(LIB_POSTFIX)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
IF(NOT DEFINED LIB_POSTFIX)
|
||||
SET(LIB_POSTFIX "")
|
||||
ENDIF()
|
||||
SET(OSG_INSTALL_LIBDIR lib${LIB_POSTFIX})
|
||||
ELSE()
|
||||
# Use the GNU standard installation directories for CMake >= 2.8.5
|
||||
INCLUDE(GNUInstallDirs)
|
||||
SET(OSG_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR})
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
IF(NOT DEFINED LIB_POSTFIX)
|
||||
@@ -1105,41 +1113,15 @@ ENDIF()
|
||||
|
||||
IF(APPLE AND NOT ANDROID)
|
||||
|
||||
#Here we check if the user specified IPhone SDK
|
||||
IF(OSG_BUILD_PLATFORM_IPHONE OR OSG_BUILD_PLATFORM_IPHONE_SIMULATOR)
|
||||
IF(OSG_BUILD_PLATFORM_IPHONE)
|
||||
|
||||
#set iphone arch and flags taken from http://sites.google.com/site/michaelsafyan/coding/resources/how-to-guides/cross-compile-for-the-iphone/how-to-cross-compile-for-the-iphone-using-cmake
|
||||
IF(OSG_BUILD_PLATFORM_IPHONE)
|
||||
IF(${IPHONE_VERSION_MIN} LESS "7.0")
|
||||
SET(CMAKE_OSX_ARCHITECTURES "armv6;armv7" CACHE STRING "Build architectures for iOS" FORCE)
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-thumb -pipe -no-cpp-precomp" CACHE STRING "Flags used by the compiler during all build types." FORCE)
|
||||
ELSE()
|
||||
SET(CMAKE_OSX_ARCHITECTURES "armv7;armv7s;arm64" CACHE STRING "Build architectures for iOS" FORCE)
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pipe -no-cpp-precomp" CACHE STRING "Flags used by the compiler during all build types." FORCE)
|
||||
ENDIF()
|
||||
# set osg window system to iOS
|
||||
SET(OSG_WINDOWING_SYSTEM "IOS" CACHE STRING "Windowing system type for graphics window creation, options only IOS." FORCE)
|
||||
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -miphoneos-version-min=${IPHONE_VERSION_MIN}" FORCE)
|
||||
|
||||
ELSE()
|
||||
#simulator uses i386 and x86_64 architectures
|
||||
SET(CMAKE_OSX_ARCHITECTURES "i386;x86_64" CACHE STRING "Build architectures for iOS Simulator" FORCE)
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-thumb -pipe -no-cpp-precomp" CACHE STRING "Flags used by the compiler during all build types." FORCE)
|
||||
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mios-simulator-version-min=${IPHONE_VERSION_MIN}" FORCE)
|
||||
|
||||
ENDIF()
|
||||
|
||||
#here we set the specific iphone sdk version. We can only set either device or simulator sdk. So if you want both you currently have to have two separate projects
|
||||
SET(CMAKE_OSX_SYSROOT "${IPHONE_SDKROOT}" CACHE STRING "System root for iOS" FORCE)
|
||||
|
||||
#hack, force link to opengles
|
||||
set(CMAKE_EXE_LINKER_FLAGS "-framework Foundation -framework OpenGLES")
|
||||
|
||||
#use the IPhone windowing system
|
||||
SET(OSG_WINDOWING_SYSTEM "IOS" CACHE STRING "Forced IPhone windowing system on iOS" FORCE)
|
||||
# set osg default image plugin
|
||||
SET(OSG_DEFAULT_IMAGE_PLUGIN_FOR_OSX "imageio" CACHE STRING "Forced imageio default image plugin for iOS" FORCE)
|
||||
|
||||
#I think this or similar will be required for IPhone apps
|
||||
# ensure app bundles for example app
|
||||
OPTION(OSG_BUILD_APPLICATION_BUNDLES "Enable the building of applications and examples as OSX Bundles" ON)
|
||||
|
||||
ELSE()
|
||||
@@ -1365,6 +1347,13 @@ IF(NOT OSG_CONFIG_HAS_BEEN_RUN_BEFORE)
|
||||
SET(OSG_CONFIG_HAS_BEEN_RUN_BEFORE 1 CACHE INTERNAL "Flag to track whether this is the first time running CMake or if CMake has been configured before")
|
||||
ENDIF()
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# add clobber build target to clear all the non git registered files/directories
|
||||
#-----------------------------------------------------------------------------
|
||||
add_custom_target(clobber
|
||||
COMMAND git clean -d -f -x
|
||||
)
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
### uninstall target
|
||||
#-----------------------------------------------------------------------------
|
||||
@@ -1376,4 +1365,5 @@ ADD_CUSTOM_TARGET(uninstall
|
||||
"${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
|
||||
|
||||
#
|
||||
|
||||
include(FeatureSummary)
|
||||
feature_summary(WHAT ALL)
|
||||
|
||||
@@ -25,11 +25,14 @@ ENDIF()
|
||||
|
||||
IF(APPLE)
|
||||
SET(COLLADA_BUILDNAME "mac")
|
||||
SET(COLLADA_BOOST_BUILDNAME ${COLLADA_BUILDNAME})
|
||||
SET(COLLADA_BOOST_BUILDNAME ${COLLADA_BUILDNAME})
|
||||
ELSEIF(MINGW)
|
||||
SET(COLLADA_BUILDNAME "mingw")
|
||||
SET(COLLADA_BOOST_BUILDNAME ${COLLADA_BUILDNAME})
|
||||
ELSEIF(MSVC_VERSION EQUAL 1900 OR MSVC_VERSION EQUAL 1910 )
|
||||
SET(COLLADA_BOOST_BUILDNAME ${COLLADA_BUILDNAME})
|
||||
ELSEIF((MSVC_VERSION GREATER 1910) OR (MSVC_VERSION EQUAL 1910))
|
||||
SET(COLLADA_BUILDNAME "vc14")
|
||||
SET(COLLADA_BOOST_BUILDNAME "vc141")
|
||||
ELSEIF(MSVC_VERSION EQUAL 1900)
|
||||
SET(COLLADA_BUILDNAME "vc14")
|
||||
SET(COLLADA_BOOST_BUILDNAME "vc140")
|
||||
ELSEIF(MSVC_VERSION EQUAL 1800)
|
||||
|
||||
@@ -25,17 +25,22 @@ ELSEIF(MSVC10)
|
||||
SET(FBX_LIBDIR "vs2010")
|
||||
ELSEIF(MSVC11)
|
||||
SET(FBX_LIBDIR "vs2012")
|
||||
ELSEIF(MSVC12 OR MSVC_VERSION==1800)
|
||||
ELSEIF(MSVC_VERSION EQUAL 1800)
|
||||
SET(FBX_LIBDIR "vs2013")
|
||||
ELSEIF(MSVC14 OR MSVC_VERSION>1900)
|
||||
ELSEIF(MSVC_VERSION EQUAL 1900)
|
||||
SET(FBX_LIBDIR "vs2015")
|
||||
ELSEIF(MSVC_VERSION GREATER_EQUAL 1910 AND MSVC_VERSION LESS 1920)
|
||||
SET(FBX_LIBDIR "vs2017")
|
||||
ELSEIF(MSVC_VERSION GREATER_EQUAL 1920 AND MSVC_VERSION LESS 1930)
|
||||
# SET(FBX_LIBDIR "vs2019") # FBX doesn't have this yet as of version 2020.0.1
|
||||
SET(FBX_LIBDIR "vs2017") # Binary compatible with vs2019
|
||||
ENDIF()
|
||||
|
||||
IF(APPLE)
|
||||
# do nothing
|
||||
ELSEIF(CMAKE_CL_64)
|
||||
SET(FBX_LIBDIR ${FBX_LIBDIR}/x64)
|
||||
ELSEIF(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
ELSEIF(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
SET(FBX_LIBDIR ${FBX_LIBDIR}/x64)
|
||||
ELSE()
|
||||
SET(FBX_LIBDIR ${FBX_LIBDIR}/x86)
|
||||
@@ -53,6 +58,10 @@ ELSE()
|
||||
SET(FBX_LIBNAME "libfbxsdk")
|
||||
ELSE()
|
||||
SET(FBX_LIBNAME "libfbxsdk-md")
|
||||
IF(WIN32)
|
||||
SET(FBX_XML2_LIBNAME "libxml2-md")
|
||||
SET(FBX_ZLIB_LIBNAME "zlib-md")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
@@ -60,16 +69,41 @@ SET(FBX_LIBNAME_DEBUG ${FBX_LIBNAME}d)
|
||||
|
||||
SET( FBX_SEARCH_PATHS
|
||||
$ENV{FBX_DIR}
|
||||
"$ENV{ProgramW6432}/Autodesk/FBX/FBX SDK/2020.0.1"
|
||||
"$ENV{PROGRAMFILES}/Autodesk/FBX/FBX SDK/2020.0.1"
|
||||
"/Applications/Autodesk/FBX SDK/2020.0.1"
|
||||
"$ENV{ProgramW6432}/Autodesk/FBX/FBX SDK/2020.0"
|
||||
"$ENV{PROGRAMFILES}/Autodesk/FBX/FBX SDK/2020.0"
|
||||
"/Applications/Autodesk/FBX SDK/2020.0"
|
||||
"$ENV{ProgramW6432}/Autodesk/FBX/FBX SDK/2019.5"
|
||||
"$ENV{PROGRAMFILES}/Autodesk/FBX/FBX SDK/2019.5"
|
||||
"/Applications/Autodesk/FBX SDK/2019.5"
|
||||
"$ENV{ProgramW6432}/Autodesk/FBX/FBX SDK/2019.2"
|
||||
"$ENV{PROGRAMFILES}/Autodesk/FBX/FBX SDK/2019.2"
|
||||
"/Applications/Autodesk/FBX SDK/2019.2"
|
||||
"$ENV{ProgramW6432}/Autodesk/FBX/FBX SDK/2019.0"
|
||||
"$ENV{PROGRAMFILES}/Autodesk/FBX/FBX SDK/2019.0"
|
||||
"/Applications/Autodesk/FBX SDK/2019.0"
|
||||
"$ENV{ProgramW6432}/Autodesk/FBX/FBX SDK/2018.1.1"
|
||||
"$ENV{PROGRAMFILES}/Autodesk/FBX/FBX SDK/2018.1.1"
|
||||
"/Applications/Autodesk/FBX\ SDK/2018.0"
|
||||
"/Applications/Autodesk/FBX SDK/2018.1.1"
|
||||
"$ENV{ProgramW6432}/Autodesk/FBX/FBX SDK/2018.0"
|
||||
"$ENV{PROGRAMFILES}/Autodesk/FBX/FBX SDK/2018.0"
|
||||
"/Applications/Autodesk/FBX SDK/2018.0"
|
||||
"$ENV{ProgramW6432}/Autodesk/FBX/FBX SDK/2017.1"
|
||||
"$ENV{PROGRAMFILES}/Autodesk/FBX/FBX SDK/2017.1"
|
||||
"/Applications/Autodesk/FBX SDK/2017.1"
|
||||
"$ENV{ProgramW6432}/Autodesk/FBX/FBX SDK/2017.0"
|
||||
"$ENV{PROGRAMFILES}/Autodesk/FBX/FBX SDK/2017.0"
|
||||
"/Applications/Autodesk/FBX SDK/2017.0"
|
||||
"$ENV{ProgramW6432}/Autodesk/FBX/FBX SDK/2016.1.2"
|
||||
"$ENV{PROGRAMFILES}/Autodesk/FBX/FBX SDK/2016.1.2"
|
||||
"/Applications/Autodesk/FBX/FBX SDK/2016.1.2"
|
||||
/Applications/Autodesk/FBXSDK201612
|
||||
"$ENV{ProgramW6432}/Autodesk/FBX/FBX SDK/2016.1.1"
|
||||
"$ENV{PROGRAMFILES}/Autodesk/FBX/FBX SDK/2016.1.1"
|
||||
"/Applications/Autodesk/FBX/FBX SDK/2016.1.1"
|
||||
/Applications/Autodesk/FBXSDK201611
|
||||
"$ENV{ProgramW6432}/Autodesk/FBX/FBX SDK/2015.1"
|
||||
"$ENV{PROGRAMFILES}/Autodesk/FBX/FBX SDK/2015.1"
|
||||
"/Applications/Autodesk/FBX/FBX SDK/2015.1"
|
||||
@@ -98,6 +132,21 @@ FIND_LIBRARY( FBX_LIBRARY_DEBUG ${FBX_LIBNAME_DEBUG}
|
||||
PATHS ${FBX_SEARCH_PATHS}
|
||||
PATH_SUFFIXES "lib/${FBX_LIBDIR}")
|
||||
|
||||
IF(WIN32)
|
||||
FIND_LIBRARY( FBX_XML2_LIBRARY ${FBX_XML2_LIBNAME}
|
||||
PATHS ${FBX_SEARCH_PATHS}
|
||||
PATH_SUFFIXES "lib/${FBX_LIBDIR}/release" "lib/${FBX_LIBDIR}")
|
||||
FIND_LIBRARY( FBX_ZLIB_LIBRARY ${FBX_ZLIB_LIBNAME}
|
||||
PATHS ${FBX_SEARCH_PATHS}
|
||||
PATH_SUFFIXES "lib/${FBX_LIBDIR}/release" "lib/${FBX_LIBDIR}")
|
||||
FIND_LIBRARY( FBX_XML2_LIBRARY_DEBUG ${FBX_XML2_LIBNAME}
|
||||
PATHS ${FBX_SEARCH_PATHS}
|
||||
PATH_SUFFIXES "lib/${FBX_LIBDIR}/debug")
|
||||
FIND_LIBRARY( FBX_ZLIB_LIBRARY_DEBUG ${FBX_ZLIB_LIBNAME}
|
||||
PATHS ${FBX_SEARCH_PATHS}
|
||||
PATH_SUFFIXES "lib/${FBX_LIBDIR}/debug")
|
||||
ENDIF()
|
||||
|
||||
IF(FBX_LIBRARY AND FBX_LIBRARY_DEBUG AND FBX_INCLUDE_DIR)
|
||||
SET(FBX_FOUND "YES")
|
||||
ELSE()
|
||||
|
||||
98
CMakeModules/FindFontconfig.cmake
Normal file
98
CMakeModules/FindFontconfig.cmake
Normal file
@@ -0,0 +1,98 @@
|
||||
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||
#[[=======================================================================.rst:
|
||||
FindFontconfig
|
||||
--------------
|
||||
|
||||
Find Fontconfig headers and library.
|
||||
|
||||
Imported Targets
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``Fontconfig::Fontconfig``
|
||||
The Fontconfig library, if found.
|
||||
|
||||
Result Variables
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
This will define the following variables in your project:
|
||||
|
||||
``FONTCONFIG_FOUND``
|
||||
true if (the requested version of) Fontconfig is available.
|
||||
``FONTCONFIG_VERSION``
|
||||
the version of Fontconfig.
|
||||
``FONTCONFIG_LIBRARIES``
|
||||
the libraries to link against to use Fontconfig.
|
||||
``FONTCONFIG_INCLUDE_DIRS``
|
||||
where to find the Fontconfig headers.
|
||||
``FONTCONFIG_COMPILE_OPTIONS``
|
||||
this should be passed to target_compile_options(), if the
|
||||
target is not used for linking
|
||||
=======================================================================]]
|
||||
|
||||
# use pkg-config to get the directories and then use these values
|
||||
# in the FIND_PATH() and FIND_LIBRARY() calls
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(PKG_FONTCONFIG QUIET fontconfig)
|
||||
set(FONTCONFIG_COMPILE_OPTIONS ${PKG_FONTCONFIG_CFLAGS_OTHER})
|
||||
set(FONTCONFIG_VERSION ${PKG_FONTCONFIG_VERSION})
|
||||
|
||||
find_path( FONTCONFIG_INCLUDE_DIR
|
||||
NAMES
|
||||
fontconfig/fontconfig.h
|
||||
HINTS
|
||||
${PKG_FONTCONFIG_INCLUDE_DIRS}
|
||||
/usr/X11/include
|
||||
)
|
||||
|
||||
find_library( FONTCONFIG_LIBRARY
|
||||
NAMES
|
||||
fontconfig
|
||||
PATHS
|
||||
${PKG_FONTCONFIG_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
if (FONTCONFIG_INCLUDE_DIR AND NOT FONTCONFIG_VERSION)
|
||||
file(STRINGS ${FONTCONFIG_INCLUDE_DIR}/fontconfig/fontconfig.h _contents REGEX "^#define[ \t]+FC_[A-Z]+[ \t]+[0-9]+$")
|
||||
unset(FONTCONFIG_VERSION)
|
||||
foreach(VPART MAJOR MINOR REVISION)
|
||||
foreach(VLINE ${_contents})
|
||||
if(VLINE MATCHES "^#define[\t ]+FC_${VPART}[\t ]+([0-9]+)$")
|
||||
set(FONTCONFIG_VERSION_PART "${CMAKE_MATCH_1}")
|
||||
if(FONTCONFIG_VERSION)
|
||||
string(APPEND FONTCONFIG_VERSION ".${FONTCONFIG_VERSION_PART}")
|
||||
else()
|
||||
set(FONTCONFIG_VERSION "${FONTCONFIG_VERSION_PART}")
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
endforeach()
|
||||
endif ()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(Fontconfig
|
||||
FOUND_VAR
|
||||
FONTCONFIG_FOUND
|
||||
REQUIRED_VARS
|
||||
FONTCONFIG_LIBRARY
|
||||
FONTCONFIG_INCLUDE_DIR
|
||||
VERSION_VAR
|
||||
FONTCONFIG_VERSION
|
||||
)
|
||||
|
||||
|
||||
if(FONTCONFIG_FOUND AND NOT TARGET Fontconfig::Fontconfig)
|
||||
add_library(Fontconfig::Fontconfig UNKNOWN IMPORTED)
|
||||
set_target_properties(Fontconfig::Fontconfig PROPERTIES
|
||||
IMPORTED_LOCATION "${FONTCONFIG_LIBRARY}"
|
||||
INTERFACE_COMPILE_OPTIONS "${FONTCONFIG_COMPILE_OPTIONS}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${FONTCONFIG_INCLUDE_DIR}"
|
||||
)
|
||||
endif()
|
||||
|
||||
mark_as_advanced(FONTCONFIG_LIBRARY FONTCONFIG_INCLUDE_DIR)
|
||||
|
||||
if(FONTCONFIG_FOUND)
|
||||
set(FONTCONFIG_LIBRARIES ${FONTCONFIG_LIBRARY})
|
||||
set(FONTCONFIG_INCLUDE_DIRS ${FONTCONFIG_INCLUDE_DIR})
|
||||
endif()
|
||||
@@ -101,5 +101,8 @@ if(LIBLAS_LIBRARY AND LIBLAS_INCLUDE_DIR)
|
||||
if(Boost_FOUND)
|
||||
set(LIBLAS_LIBRARIES ${LIBLAS_LIBRARY} )
|
||||
set(LIBLAS_FOUND "YES")
|
||||
if(WIN32)
|
||||
link_directories(${Boost_LIBRARY_DIRS})
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
# correspond to the ./configure --prefix=$OPENCASCADE_DIR
|
||||
# used in building OPENCASCADE.
|
||||
|
||||
FIND_PATH(OPENCASCADE_INCLUDE_DIR BRepMesh.hxx
|
||||
FIND_PATH(OPENCASCADE_INCLUDE_DIR Standard_Version.hxx
|
||||
PATHS
|
||||
${OPENCASCADE_DIR}
|
||||
$ENV{OPENCASCADE_DIR}
|
||||
@@ -98,6 +98,7 @@ FIND_OPENCASCADE_LIBRARY(OPENCASCADE_TKXml TKXml)
|
||||
FIND_OPENCASCADE_LIBRARY(OPENCASCADE_TKXmlTObj TKXmlTObj)
|
||||
FIND_OPENCASCADE_LIBRARY(OPENCASCADE_TKXmlXCAF TKXmlXCAF)
|
||||
FIND_OPENCASCADE_LIBRARY(OPENCASCADE_TKXSBase TKXSBase)
|
||||
FIND_OPENCASCADE_LIBRARY(OPENCASCADE_TKXCAF TKXCAF)
|
||||
|
||||
set (OPENCASCADE_LIBRARY_TYPE_DESCR
|
||||
"Specifies the type of library to be used. 'Shared' libraries
|
||||
|
||||
@@ -34,6 +34,9 @@ INSTALL(
|
||||
|
||||
IF(MSVC AND DYNAMIC_OPENSCENEGRAPH)
|
||||
GET_TARGET_PROPERTY(PREFIX ${LIB_NAME} PREFIX)
|
||||
IF("${PREFIX}" STREQUAL PREFIX-NOTFOUND) # Fix for PREFIX-NOTFOUND left in file names
|
||||
SET(PREFIX "")
|
||||
ENDIF()
|
||||
INSTALL(FILES ${OUTPUT_BINDIR}/${PREFIX}${LIB_NAME}${CMAKE_RELWITHDEBINFO_POSTFIX}.pdb DESTINATION ${INSTALL_BINDIR} COMPONENT libopenscenegraph CONFIGURATIONS RelWithDebInfo)
|
||||
INSTALL(FILES ${OUTPUT_BINDIR}/${PREFIX}${LIB_NAME}${CMAKE_DEBUG_POSTFIX}.pdb DESTINATION ${INSTALL_BINDIR} COMPONENT libopenscenegraph CONFIGURATIONS Debug)
|
||||
ENDIF(MSVC AND DYNAMIC_OPENSCENEGRAPH)
|
||||
|
||||
@@ -225,7 +225,7 @@ MACRO(SETUP_LIBRARY LIB_NAME)
|
||||
)
|
||||
SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES FOLDER "OSG Core")
|
||||
IF(APPLE)
|
||||
IF(OSG_BUILD_PLATFORM_IPHONE OR OSG_BUILD_PLATFORM_IPHONE_SIMULATOR)
|
||||
IF(OSG_BUILD_PLATFORM_IPHONE)
|
||||
SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES XCODE_ATTRIBUTE_ENABLE_BITCODE ${IPHONE_ENABLE_BITCODE})
|
||||
ENDIF()
|
||||
SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES XCODE_ATTRIBUTE_WARNING_CFLAGS "")
|
||||
@@ -336,7 +336,7 @@ MACRO(SETUP_PLUGIN PLUGIN_NAME)
|
||||
SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES FOLDER "Plugins")
|
||||
IF(APPLE)
|
||||
SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES XCODE_ATTRIBUTE_WARNING_CFLAGS "")
|
||||
IF(OSG_BUILD_PLATFORM_IPHONE OR OSG_BUILD_PLATFORM_IPHONE_SIMULATOR)
|
||||
IF(OSG_BUILD_PLATFORM_IPHONE)
|
||||
SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES XCODE_ATTRIBUTE_ENABLE_BITCODE ${IPHONE_ENABLE_BITCODE})
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
@@ -429,7 +429,7 @@ MACRO(SETUP_EXE IS_COMMANDLINE_APP)
|
||||
|
||||
IF(APPLE)
|
||||
SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES XCODE_ATTRIBUTE_WARNING_CFLAGS "")
|
||||
IF(OSG_BUILD_PLATFORM_IPHONE OR OSG_BUILD_PLATFORM_IPHONE_SIMULATOR)
|
||||
IF(OSG_BUILD_PLATFORM_IPHONE)
|
||||
SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES XCODE_ATTRIBUTE_ENABLE_BITCODE ${IPHONE_ENABLE_BITCODE})
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
24
README.md
24
README.md
@@ -25,12 +25,17 @@ If details below are not sufficient then head over to the openscenegraph.org to
|
||||
|
||||
Robert Osfield.
|
||||
Project Lead.
|
||||
14th September 2018.
|
||||
31th January 2020.
|
||||
|
||||
---
|
||||
|
||||
## Section 1. How to build OpenSceneGraph
|
||||
|
||||
If you are using the [vcpkg](https://github.com/Microsoft/vcpkg/) dependency manager you can download and install OpenSceneGraph from source with CMake integration using a single command:
|
||||
```
|
||||
vcpkg install osg
|
||||
```
|
||||
|
||||
The OpenSceneGraph uses the CMake build system to generate a platform-specific build environment. CMake reads the `CMakeLists.txt` files that you'll find throughout the OpenSceneGraph directories, checks for installed dependencies and then generates files for the selected build system.
|
||||
|
||||
If you don't already have CMake installed on your system you can grab it from http://www.cmake.org, use version 2.8.0 or later. Details on the OpenSceneGraph's CMake build can be found at:
|
||||
@@ -88,13 +93,14 @@ Many of the example programs use command-line arguments. When double-clicking on
|
||||
|
||||
## Section 3. Release notes on iOS build, by Thomas Hogarth
|
||||
|
||||
With CMake, XCode and the iOS sdk installed you can generate an iOS XCode project using the following command line:
|
||||
With CMake 3.11, XCode 9.4 and the iOS sdk 11.4 installed you can generate an iOS XCode project using the following command line:
|
||||
|
||||
export THIRDPARTY_PATH=/path/to/my/3rdParty
|
||||
export THIRDPARTY_PATH=/path/to/3rdParty
|
||||
cmake ./ -G Xcode -DOSG_BUILD_PLATFORM_IPHONE:BOOL=ON \
|
||||
-DIPHONE_SDKVER="10.2" \
|
||||
-DIPHONE_VERSION_MIN="8.0" \
|
||||
-DOPENGL_PROFILE:STRING=GLES2 \
|
||||
-DIPHONE_SDKVER="11.4" \
|
||||
-DIPHONE_VERSION_MIN="10.0" \
|
||||
-DOPENGL_PROFILE:STRING=GLES3 \
|
||||
-DOSG_CPP_EXCEPTIONS_AVAILABLE:BOOL=ON \
|
||||
-DBUILD_OSG_APPLICATIONS:BOOL=OFF \
|
||||
-DBUILD_OSG_EXAMPLES:BOOL=ON \
|
||||
-DOSG_WINDOWING_SYSTEM:STRING=IOS \
|
||||
@@ -105,15 +111,15 @@ With CMake, XCode and the iOS sdk installed you can generate an iOS XCode projec
|
||||
-DCURL_LIBRARY:PATH="$THIRDPARTY_PATH/curl-ios-device/lib/libcurl.a" \
|
||||
-DFREETYPE_INCLUDE_DIR_freetype2:PATH="$THIRDPARTY_PATH/freetype-ios-universal/include/freetype" \
|
||||
-DFREETYPE_INCLUDE_DIR_ft2build:PATH="$THIRDPARTY_PATH/freetype-ios-universal/include" \
|
||||
-DFREETYPE_LIBRARY:PATH="$THIRDPARTY_PATH/freetype-ios-universal/lib/libFreeType_iphone_universal.a" \
|
||||
-DFREETYPE_LIBRARY:PATH="$THIRDPARTY_PATH/freetype-ios-universal/lib/libFreetype2.a" \
|
||||
-DTIFF_INCLUDE_DIR:PATH="$THIRDPARTY_PATH/tiff-ios-device/include" \
|
||||
-DTIFF_LIBRARY:PATH="$THIRDPARTY_PATH/tiff-ios-device/lib/libtiff.a" \
|
||||
-DGDAL_INCLUDE_DIR:PATH="$THIRDPARTY_PATH/gdal-ios-device/include" \
|
||||
-DGDAL_LIBRARY:PATH="$THIRDPARTY_PATH/gdal-ios-device/lib/libgdal.a"
|
||||
|
||||
|
||||
Be sure to set the THIRDPARTY_PATH to the path containing your thirdparty dependencies. Set IPHONE_SDKVER to the version of the iOS sdk you have installed, in this instance 10.2. IPHONE_VERSION_MIN controls the base sdk used by xcode, and lastly set OPENGL_PROFILE to the version of GLES you want to use.
|
||||
Be sure to set the THIRDPARTY_PATH to the path containing your thirdparty dependencies. Set IPHONE_SDKVER to the version of the iOS sdk you have installed, in this instance 11.4. IPHONE_VERSION_MIN controls the deployment sdk used by xcode, and lastly set OPENGL_PROFILE to the version of GLES you want to use.
|
||||
|
||||
Once this completes an XCode project will have been generated in the osg root folder. Open the generated Xcode project, select the example_osgViewerIPhone target. In 'General' tab set a development team. In the 'Build Settings' tab search for 'Other Linker Flags', then for each target type (debug, release etc) that you want to use open the list of arguments and delete the 'OpenGL' line and the '-framework' line above it. This is because cmake has tried to add the desktop OpenGL library which we don't want.
|
||||
Once this completes an XCode project will have been generated in the osg root folder. Open the generated Xcode project, select the example_osgViewerIPhone target. In 'General' tab set a development team.
|
||||
|
||||
Once this is done you should be able to build and deploy the `example_osgViewerIPhone` target on your device.
|
||||
|
||||
@@ -771,7 +771,7 @@ int main( int argc, char **argv )
|
||||
osgDB::Registry::instance()->getOptions()->setObjectCacheHint(osgDB::Options::CACHE_ALL);
|
||||
}
|
||||
|
||||
std::string fileNameOut("converted.osg");
|
||||
std::string fileNameOut("converted.osgt");
|
||||
if (fileNames.size()>1)
|
||||
{
|
||||
fileNameOut = fileNames.back();
|
||||
@@ -780,29 +780,66 @@ int main( int argc, char **argv )
|
||||
|
||||
osg::Timer_t startTick = osg::Timer::instance()->tick();
|
||||
|
||||
osg::ref_ptr<osg::Node> root = osgDB::readRefNodeFiles(fileNames);
|
||||
typedef std::vector< osg::ref_ptr<osg::Image> > Images;
|
||||
typedef std::vector< osg::ref_ptr<osg::Node> > Nodes;
|
||||
typedef std::vector< osg::ref_ptr<osg::Object> > Objects;
|
||||
|
||||
if (root.valid())
|
||||
Images images;
|
||||
Nodes nodes;
|
||||
Objects objects;
|
||||
|
||||
for(FileNameList::iterator itr = fileNames.begin();
|
||||
itr != fileNames.end();
|
||||
++itr)
|
||||
{
|
||||
osg::Timer_t endTick = osg::Timer::instance()->tick();
|
||||
osg::notify(osg::INFO)<<"Time to load files "<<osg::Timer::instance()->delta_m(startTick, endTick)<<" ms"<<std::endl;
|
||||
osg::ref_ptr<osg::Object> object = osgDB::readObjectFile(*itr);
|
||||
if (object.valid())
|
||||
{
|
||||
if (object->asNode()) nodes.push_back(object->asNode());
|
||||
else if (object->asImage()) images.push_back(object->asImage());
|
||||
else objects.push_back(object);
|
||||
}
|
||||
}
|
||||
|
||||
if (images.empty() && nodes.empty() && objects.empty())
|
||||
{
|
||||
osg::notify(osg::NOTICE)<<"Warning: failed to load any files"<<std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
if (pruneStateSet)
|
||||
{
|
||||
PruneStateSetVisitor pssv;
|
||||
root->accept(pssv);
|
||||
}
|
||||
osg::Timer_t endTick = osg::Timer::instance()->tick();
|
||||
osg::notify(osg::INFO)<<"Time to load files "<<osg::Timer::instance()->delta_m(startTick, endTick)<<" ms"<<std::endl;
|
||||
|
||||
if (fixTransparencyMode != FixTransparencyVisitor::NO_TRANSPARANCY_FIXING)
|
||||
osg::ref_ptr<osg::Node> root;
|
||||
|
||||
if (nodes.size()==1) root = nodes.front();
|
||||
else if (nodes.size()>1)
|
||||
{
|
||||
FixTransparencyVisitor atv(fixTransparencyMode);
|
||||
root->accept(atv);
|
||||
osg::ref_ptr<osg::Group> group = new osg::Group;
|
||||
for(Nodes::iterator itr = nodes.begin();
|
||||
itr != nodes.end();
|
||||
++itr)
|
||||
{
|
||||
group->addChild(itr->get());
|
||||
}
|
||||
|
||||
root = group;
|
||||
}
|
||||
|
||||
if ( root.valid() )
|
||||
{
|
||||
if (pruneStateSet)
|
||||
{
|
||||
PruneStateSetVisitor pssv;
|
||||
root->accept(pssv);
|
||||
}
|
||||
|
||||
if (fixTransparencyMode != FixTransparencyVisitor::NO_TRANSPARANCY_FIXING)
|
||||
{
|
||||
FixTransparencyVisitor atv(fixTransparencyMode);
|
||||
root->accept(atv);
|
||||
}
|
||||
|
||||
if (smooth)
|
||||
{
|
||||
@@ -868,6 +905,20 @@ int main( int argc, char **argv )
|
||||
osg::notify(osg::NOTICE)<<result.message()<< std::endl;
|
||||
}
|
||||
}
|
||||
else if (!images.empty())
|
||||
{
|
||||
if (images.size()>1)
|
||||
{
|
||||
OSG_NOTICE<<"Warning: osgconv does not support writing multiple to a single file."<<std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
osgDB::writeImageFile(*images.front(), fileNameOut);
|
||||
}
|
||||
else if (!objects.empty())
|
||||
{
|
||||
osgDB::writeObjectFile(*images.front(), fileNameOut);
|
||||
}
|
||||
else
|
||||
{
|
||||
osg::notify(osg::NOTICE)<<"Error no data loaded."<< std::endl;
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include <osg/Plane>
|
||||
#include <osg/BoundingBox>
|
||||
#include <osg/BoundingSphere>
|
||||
#include <osg/Quat>
|
||||
|
||||
#ifdef BUILD_CONTRIBUTORS
|
||||
extern void printContributors(const std::string& changeLog, bool printNumEntries);
|
||||
@@ -40,6 +41,7 @@ int main( int argc, char** argv)
|
||||
arguments.getApplicationUsage()->addCommandLineOption("Plane::value_type", "Print the value of Plane::value_type");
|
||||
arguments.getApplicationUsage()->addCommandLineOption("BoundingSphere::value_type", "Print the value of BoundingSphere::value_type");
|
||||
arguments.getApplicationUsage()->addCommandLineOption("BoundingBox::value_type", "Print the value of BoundingBox::value_type");
|
||||
arguments.getApplicationUsage()->addCommandLineOption("Quat::value_type", "Print the value of Quat::value_type");
|
||||
|
||||
#ifdef BUILD_CONTRIBUTORS
|
||||
arguments.getApplicationUsage()->addCommandLineOption("-r <file> or --read <file>", "Read the ChangeLog to generate an estimated contributors list.");
|
||||
@@ -139,6 +141,12 @@ int main( int argc, char** argv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (arguments.read("Quat::value_type"))
|
||||
{
|
||||
cout << ((sizeof(osg::Quat::value_type) == 4) ? "float" : "double") << endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
cout << osgGetLibraryName() << " " << osgGetVersion() << endl << endl;
|
||||
|
||||
#ifdef BUILD_CONTRIBUTORS
|
||||
|
||||
@@ -48,6 +48,7 @@ int main(int argc, char** argv)
|
||||
arguments.getApplicationUsage()->addCommandLineOption("-p <filename>","Play specified camera path animation file, previously saved with 'z' key.");
|
||||
arguments.getApplicationUsage()->addCommandLineOption("--speed <factor>","Speed factor for animation playing (1 == normal speed).");
|
||||
arguments.getApplicationUsage()->addCommandLineOption("--device <device-name>","add named device to the viewer");
|
||||
arguments.getApplicationUsage()->addCommandLineOption("--stats","print out load and compile timing stats");
|
||||
|
||||
osgViewer::Viewer viewer(arguments);
|
||||
|
||||
@@ -71,6 +72,8 @@ int main(int argc, char** argv)
|
||||
return 1;
|
||||
}
|
||||
|
||||
bool printStats = arguments.read("--stats");
|
||||
|
||||
std::string url, username, password;
|
||||
while(arguments.read("--login",url, username, password))
|
||||
{
|
||||
@@ -109,7 +112,7 @@ int main(int argc, char** argv)
|
||||
while (arguments.read("-p",pathfile))
|
||||
{
|
||||
osgGA::AnimationPathManipulator* apm = new osgGA::AnimationPathManipulator(pathfile);
|
||||
if (apm || !apm->valid())
|
||||
if (apm && !apm->getAnimationPath()->empty())
|
||||
{
|
||||
apm->setTimeScale(animationSpeed);
|
||||
|
||||
@@ -147,6 +150,8 @@ int main(int argc, char** argv)
|
||||
// add the screen capture handler
|
||||
viewer.addEventHandler(new osgViewer::ScreenCaptureHandler);
|
||||
|
||||
osg::ElapsedTime elapsedTime;
|
||||
|
||||
// load the data
|
||||
osg::ref_ptr<osg::Node> loadedModel = osgDB::readRefNodeFiles(arguments);
|
||||
if (!loadedModel)
|
||||
@@ -155,6 +160,15 @@ int main(int argc, char** argv)
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (printStats)
|
||||
{
|
||||
double loadTime = elapsedTime.elapsedTime_m();
|
||||
std::cout<<"Load time "<<loadTime<<"ms"<<std::endl;
|
||||
|
||||
viewer.getStats()->collectStats("compile", true);
|
||||
}
|
||||
|
||||
|
||||
// any option left unread are converted into errors to write out later.
|
||||
arguments.reportRemainingOptionsAsUnrecognized();
|
||||
|
||||
|
||||
@@ -484,7 +484,7 @@ int main( int argc, char **argv )
|
||||
while (arguments.read("-p",pathfile))
|
||||
{
|
||||
osgGA::AnimationPathManipulator* apm = new osgGA::AnimationPathManipulator(pathfile);
|
||||
if (apm || !apm->valid())
|
||||
if (apm && !apm->getAnimationPath()->empty())
|
||||
{
|
||||
unsigned int num = keyswitchManipulator->getNumMatrixManipulators();
|
||||
keyswitchManipulator->addMatrixManipulator( keyForAnimationPath, "Path", apm );
|
||||
|
||||
@@ -243,13 +243,11 @@ ELSE(DYNAMIC_OPENSCENEGRAPH)
|
||||
#needed on win32 or the linker get confused by _declspec declarations
|
||||
ADD_DEFINITIONS(-DOSG_LIBRARY_STATIC)
|
||||
|
||||
ADD_SUBDIRECTORY(osgstaticviewer)
|
||||
|
||||
# IPHONE_PORT@tom
|
||||
IF(OSG_BUILD_PLATFORM_IPHONE OR OSG_BUILD_PLATFORM_IPHONE_SIMULATOR)
|
||||
IF(OSG_BUILD_PLATFORM_IPHONE)
|
||||
ADD_SUBDIRECTORY(osgviewerIPhone)
|
||||
ELSE()
|
||||
ADD_SUBDIRECTORY(osgstaticviewer)
|
||||
ENDIF()
|
||||
# IPHONE_PORT@tom
|
||||
|
||||
ENDIF(DYNAMIC_OPENSCENEGRAPH)
|
||||
|
||||
|
||||
@@ -103,7 +103,9 @@ void OsgMainApp::initOsgWindow(int x,int y,int width,int height){
|
||||
osg::notify(osg::ALWAYS)<<"Testing"<<std::endl;
|
||||
|
||||
_viewer = new osgViewer::Viewer();
|
||||
_viewer->setUpViewerAsEmbeddedInWindow(x, y, width, height);
|
||||
osgViewer::GraphicsWindowEmbedded* window = _viewer->setUpViewerAsEmbeddedInWindow(x, y, width, height);
|
||||
_viewer->getEventQueue()->setGraphicsContext(window);
|
||||
_viewer->getEventQueue()->syncWindowRectangleWithGraphicsContext();
|
||||
_viewer->setThreadingModel(osgViewer::ViewerBase::SingleThreaded);
|
||||
|
||||
_root = new osg::Group();
|
||||
|
||||
@@ -113,7 +113,7 @@ int main(int argc, char** argv)
|
||||
while (arguments.read("-p",pathfile))
|
||||
{
|
||||
osgGA::AnimationPathManipulator* apm = new osgGA::AnimationPathManipulator(pathfile);
|
||||
if (apm || !apm->valid())
|
||||
if (apm && !apm->getAnimationPath()->empty())
|
||||
{
|
||||
apm->setTimeScale(animationSpeed);
|
||||
|
||||
|
||||
@@ -59,6 +59,7 @@ createStateSet()
|
||||
// render each instance uniquely. gl_InstanceID will be in the range
|
||||
// 0 to numInstances-1 (1023 in our case).
|
||||
std::string vertexSource =
|
||||
"#extension GL_EXT_gpu_shader4 : enable\n"
|
||||
"uniform sampler2D osgLogo; \n"
|
||||
"uniform float osg_SimulationTime; \n"
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <osg/FragmentProgram>
|
||||
|
||||
#include <osgDB/ReadFile>
|
||||
#include <osgDB/WriteFile>
|
||||
#include <osgDB/FileUtils>
|
||||
|
||||
#include <osgUtil/LineSegmentIntersector>
|
||||
@@ -64,6 +65,18 @@ public:
|
||||
|
||||
ForestTechniqueManager() {}
|
||||
|
||||
enum Features
|
||||
{
|
||||
HUD_TEXT = 1,
|
||||
BILLBOARD_GRAPH = 2,
|
||||
X_GRAPH = 4,
|
||||
TRANSFORM_GRAPH = 8,
|
||||
SHADER_GRAPH = 16,
|
||||
GEOMETRY_SHADER_GRAPH = 32,
|
||||
TEXTURE_BUFFER_GRAPH = 64,
|
||||
ALL_FEATURES = (TEXTURE_BUFFER_GRAPH<<1)-1
|
||||
};
|
||||
|
||||
class Tree : public osg::Referenced
|
||||
{
|
||||
public:
|
||||
@@ -150,7 +163,7 @@ public:
|
||||
|
||||
osg::Node* createHUDWithText(const std::string& text);
|
||||
|
||||
osg::Node* createScene(unsigned int numTreesToCreates, unsigned int maxNumTreesPerCell);
|
||||
osg::Node* createScene(unsigned int numTreesToCreates, unsigned int maxNumTreesPerCell, unsigned int mask=ALL_FEATURES);
|
||||
|
||||
void advanceToNextTechnique(int delta=1)
|
||||
{
|
||||
@@ -803,6 +816,18 @@ class ShaderGeometry : public osg::Drawable
|
||||
|
||||
typedef std::vector<osg::Vec4> PositionSizeList;
|
||||
|
||||
virtual void resizeGLObjectBuffers(unsigned int maxSize)
|
||||
{
|
||||
osg::Drawable::resizeGLObjectBuffers(maxSize);
|
||||
if (_geometry) _geometry->resizeGLObjectBuffers(maxSize);
|
||||
}
|
||||
|
||||
virtual void releaseGLObjects(osg::State* state) const
|
||||
{
|
||||
osg::Drawable::releaseGLObjects(state);
|
||||
if (_geometry) _geometry->releaseGLObjects(state);
|
||||
}
|
||||
|
||||
virtual void drawImplementation(osg::RenderInfo& renderInfo) const
|
||||
{
|
||||
for(PositionSizeList::const_iterator itr = _trees.begin();
|
||||
@@ -1160,7 +1185,7 @@ osg::Node* ForestTechniqueManager::createHUDWithText(const std::string& str)
|
||||
return projection;
|
||||
}
|
||||
|
||||
osg::Node* ForestTechniqueManager::createScene(unsigned int numTreesToCreates, unsigned int maxNumTreesPerCell)
|
||||
osg::Node* ForestTechniqueManager::createScene(unsigned int numTreesToCreates, unsigned int maxNumTreesPerCell, unsigned int mask)
|
||||
{
|
||||
osg::Vec3 origin(0.0f,0.0f,0.0f);
|
||||
osg::Vec3 size(1000.0f,1000.0f,200.0f);
|
||||
@@ -1206,33 +1231,37 @@ osg::Node* ForestTechniqueManager::createScene(unsigned int numTreesToCreates, u
|
||||
|
||||
_techniqueSwitch = new osg::Switch;
|
||||
|
||||
if ((mask & BILLBOARD_GRAPH)!=0)
|
||||
{
|
||||
std::cout<<"Creating osg::Billboard based forest...";
|
||||
osg::Group* group = new osg::Group;
|
||||
group->addChild(createBillboardGraph(cell.get(),dstate));
|
||||
group->addChild(createHUDWithText("Using osg::Billboard's to create a forest\n\nPress left cursor key to select geometry instancing with Texture Buffer Object\nPress right cursor key to select double quad based forest"));
|
||||
if ((mask & HUD_TEXT)!=0) group->addChild(createHUDWithText("Using osg::Billboard's to create a forest\n\nPress left cursor key to select geometry instancing with Texture Buffer Object\nPress right cursor key to select double quad based forest"));
|
||||
_techniqueSwitch->addChild(group);
|
||||
std::cout<<"done."<<std::endl;
|
||||
}
|
||||
|
||||
if ((mask & X_GRAPH)!=0)
|
||||
{
|
||||
std::cout<<"Creating double quad based forest...";
|
||||
osg::Group* group = new osg::Group;
|
||||
group->addChild(createXGraph(cell.get(),dstate));
|
||||
group->addChild(createHUDWithText("Using double quads to create a forest\n\nPress left cursor key to select osg::Billboard based forest\nPress right cursor key to select osg::MatrixTransform based forest\n"));
|
||||
if ((mask & HUD_TEXT)!=0) group->addChild(createHUDWithText("Using double quads to create a forest\n\nPress left cursor key to select osg::Billboard based forest\nPress right cursor key to select osg::MatrixTransform based forest\n"));
|
||||
_techniqueSwitch->addChild(group);
|
||||
std::cout<<"done."<<std::endl;
|
||||
}
|
||||
|
||||
if ((mask & TRANSFORM_GRAPH)!=0)
|
||||
{
|
||||
std::cout<<"Creating osg::MatrixTransform based forest...";
|
||||
osg::Group* group = new osg::Group;
|
||||
group->addChild(createTransformGraph(cell.get(),dstate));
|
||||
group->addChild(createHUDWithText("Using osg::MatrixTransform's to create a forest\n\nPress left cursor key to select double quad based forest\nPress right cursor key to select osg::Vertex/FragmentProgram based forest"));
|
||||
if ((mask & HUD_TEXT)!=0) group->addChild(createHUDWithText("Using osg::MatrixTransform's to create a forest\n\nPress left cursor key to select double quad based forest\nPress right cursor key to select osg::Vertex/FragmentProgram based forest"));
|
||||
_techniqueSwitch->addChild(group);
|
||||
std::cout<<"done."<<std::endl;
|
||||
}
|
||||
|
||||
if ((mask & SHADER_GRAPH)!=0)
|
||||
{
|
||||
std::cout<<"Creating osg::Vertex/FragmentProgram based forest...";
|
||||
osg::Group* group = new osg::Group;
|
||||
@@ -1289,11 +1318,12 @@ osg::Node* ForestTechniqueManager::createScene(unsigned int numTreesToCreates, u
|
||||
}
|
||||
|
||||
group->addChild(createShaderGraph(cell.get(),stateset));
|
||||
group->addChild(createHUDWithText("Using osg::Vertex/FragmentProgram to create a forest\n\nPress left cursor key to select osg::MatrixTransform's based forest\nPress right cursor key to select OpenGL shader based forest"));
|
||||
if ((mask & HUD_TEXT)!=0) group->addChild(createHUDWithText("Using osg::Vertex/FragmentProgram to create a forest\n\nPress left cursor key to select osg::MatrixTransform's based forest\nPress right cursor key to select OpenGL shader based forest"));
|
||||
_techniqueSwitch->addChild(group);
|
||||
std::cout<<"done."<<std::endl;
|
||||
}
|
||||
|
||||
if ((mask & SHADER_GRAPH)!=0)
|
||||
{
|
||||
std::cout<<"Creating OpenGL shader based forest...";
|
||||
osg::Group* group = new osg::Group;
|
||||
@@ -1351,11 +1381,12 @@ osg::Node* ForestTechniqueManager::createScene(unsigned int numTreesToCreates, u
|
||||
}
|
||||
|
||||
group->addChild(createShaderGraph(cell.get(),stateset));
|
||||
group->addChild(createHUDWithText("Using OpenGL Shader to create a forest\n\nPress left cursor key to select osg::Vertex/FragmentProgram based forest\nPress right cursor key to select osg::Vertex/Geometry/FragmentProgram based forest"));
|
||||
if ((mask & HUD_TEXT)!=0) group->addChild(createHUDWithText("Using OpenGL Shader to create a forest\n\nPress left cursor key to select osg::Vertex/FragmentProgram based forest\nPress right cursor key to select osg::Vertex/Geometry/FragmentProgram based forest"));
|
||||
_techniqueSwitch->addChild(group);
|
||||
std::cout<<"done."<<std::endl;
|
||||
}
|
||||
|
||||
if ((mask & GEOMETRY_SHADER_GRAPH)!=0)
|
||||
{
|
||||
std::cout<<"Creating Geometry Shader based forest...";
|
||||
|
||||
@@ -1363,12 +1394,13 @@ osg::Node* ForestTechniqueManager::createScene(unsigned int numTreesToCreates, u
|
||||
|
||||
osg::Group* group = new osg::Group;
|
||||
group->addChild(createGeometryShaderGraph(cell.get(), stateset));
|
||||
group->addChild(createHUDWithText("Using osg::Vertex/Geometry/FragmentProgram to create a forest\n\nPress left cursor key to select OpenGL Shader based forest\nPress right cursor key to select geometry instancing with Texture Buffer Object"));
|
||||
if ((mask & HUD_TEXT)!=0) group->addChild(createHUDWithText("Using osg::Vertex/Geometry/FragmentProgram to create a forest\n\nPress left cursor key to select OpenGL Shader based forest\nPress right cursor key to select geometry instancing with Texture Buffer Object"));
|
||||
|
||||
_techniqueSwitch->addChild(group);
|
||||
std::cout<<"done."<<std::endl;
|
||||
}
|
||||
|
||||
if ((mask & TEXTURE_BUFFER_GRAPH)!=0)
|
||||
{
|
||||
std::cout<<"Creating forest using geometry instancing and texture buffer objects ...";
|
||||
|
||||
@@ -1430,7 +1462,7 @@ osg::Node* ForestTechniqueManager::createScene(unsigned int numTreesToCreates, u
|
||||
textureBufferGraph->setStateSet( stateset );
|
||||
osg::Group* group = new osg::Group;
|
||||
group->addChild(textureBufferGraph);
|
||||
group->addChild(createHUDWithText("Using geometry instancing to create a forest\n\nPress left cursor key to select osg::Vertex/Geometry/FragmentProgram based forest\nPress right cursor key to select osg::Billboard based forest"));
|
||||
if ((mask & HUD_TEXT)!=0) group->addChild(createHUDWithText("Using geometry instancing to create a forest\n\nPress left cursor key to select osg::Vertex/Geometry/FragmentProgram based forest\nPress right cursor key to select osg::Billboard based forest"));
|
||||
|
||||
_techniqueSwitch->addChild(group);
|
||||
|
||||
@@ -1466,6 +1498,16 @@ int main( int argc, char **argv )
|
||||
|
||||
arguments.read("--trees-per-cell",maxNumTreesPerCell);
|
||||
|
||||
|
||||
unsigned int features = ForestTechniqueManager::ALL_FEATURES;
|
||||
while(arguments.read("--features", features))
|
||||
{
|
||||
std::cout<<"features = "<<features<<std::endl;
|
||||
}
|
||||
|
||||
std::string outputFilename;
|
||||
while(arguments.read("-o", outputFilename)) {}
|
||||
|
||||
osg::ref_ptr<ForestTechniqueManager> ttm = new ForestTechniqueManager;
|
||||
|
||||
// add the stats handler
|
||||
@@ -1475,8 +1517,13 @@ int main( int argc, char **argv )
|
||||
viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()));
|
||||
|
||||
// add model to viewer.
|
||||
viewer.setSceneData( ttm->createScene(numTreesToCreate, maxNumTreesPerCell) );
|
||||
viewer.setSceneData( ttm->createScene(numTreesToCreate, maxNumTreesPerCell, features) );
|
||||
|
||||
if (!outputFilename.empty())
|
||||
{
|
||||
osgDB::writeNodeFile(*viewer.getSceneData(), outputFilename);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return viewer.run();
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
*/
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include <Windows.h>
|
||||
#include <windows.h>
|
||||
#pragma warning( disable : 4244 )
|
||||
#endif
|
||||
|
||||
|
||||
@@ -440,7 +440,7 @@ osg::Group* create3DText(const osg::Vec3& center,float radius)
|
||||
text5->setFont("fonts/times.ttf");
|
||||
//text5->setCharacterSize(characterSize);
|
||||
text5->setCharacterSize(32.0f); // medium
|
||||
text5->setPosition(center - osg::Vec3(0.0, 0.0, 0.2));
|
||||
text5->setPosition(center - osg::Vec3(0.0, 0.0, 0.2) * radius);
|
||||
text5->setAxisAlignment(osgText::Text::SCREEN);
|
||||
text5->setCharacterSizeMode(osgText::Text::SCREEN_COORDS);
|
||||
text5->setDrawMode(osgText::Text::TEXT | osgText::Text::BOUNDINGBOX);
|
||||
@@ -451,7 +451,7 @@ osg::Group* create3DText(const osg::Vec3& center,float radius)
|
||||
text6->setColor(characterSizeModeColor);
|
||||
text6->setFont("fonts/times.ttf");
|
||||
text6->setCharacterSize(characterSize);
|
||||
text6->setPosition(center - osg::Vec3(0.0, 0.0, 0.4));
|
||||
text6->setPosition(center - osg::Vec3(0.0, 0.0, 0.4) * radius);
|
||||
text6->setAxisAlignment(osgText::Text::SCREEN);
|
||||
text6->setCharacterSizeMode(osgText::Text::OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT);
|
||||
text6->setText("CharacterSizeMode OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT");
|
||||
@@ -461,7 +461,7 @@ osg::Group* create3DText(const osg::Vec3& center,float radius)
|
||||
text7->setColor(characterSizeModeColor);
|
||||
text7->setFont("fonts/times.ttf");
|
||||
text7->setCharacterSize(characterSize);
|
||||
text7->setPosition(center - osg::Vec3(0.0, 0.0, 0.6));
|
||||
text7->setPosition(center - osg::Vec3(0.0, 0.0, 0.6) * radius);
|
||||
text7->setAxisAlignment(osgText::Text::SCREEN);
|
||||
text7->setCharacterSizeMode(osgText::Text::OBJECT_COORDS);
|
||||
text7->setText("CharacterSizeMode OBJECT_COORDS (default)");
|
||||
@@ -692,7 +692,7 @@ int main(int argc, char** argv)
|
||||
text->setFont("fonts/times.ttf");
|
||||
text->setAxisAlignment(osgText::Text::XZ_PLANE);
|
||||
text->setText("Alingment\nAfter:");
|
||||
text->setAlignment(osgText::Text::RIGHT_TOP);
|
||||
text->setAlignment(osgText::Text::LEFT_TOP);
|
||||
group->addChild(text);
|
||||
}
|
||||
|
||||
@@ -754,7 +754,7 @@ int main(int argc, char** argv)
|
||||
{
|
||||
// prepare scene.
|
||||
osg::Vec3 center(0.0f,0.0f,0.0f);
|
||||
float radius = 1.0f;
|
||||
float radius = 100.0f;
|
||||
|
||||
// make sure the root node is group so we can add extra nodes to it.
|
||||
osg::Group* group = new osg::Group;
|
||||
|
||||
@@ -43,9 +43,15 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter&)
|
||||
virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
|
||||
{
|
||||
if (ea.getEventType() == osgGA::GUIEventAdapter::KEYUP)
|
||||
if (ea.getEventType() == osgGA::GUIEventAdapter::PUSH)
|
||||
{
|
||||
osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);
|
||||
if (view) pick(view,ea);
|
||||
return false;
|
||||
}
|
||||
else if (ea.getEventType() == osgGA::GUIEventAdapter::KEYUP)
|
||||
{
|
||||
if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Up)
|
||||
{
|
||||
@@ -83,6 +89,24 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
void pick(osgViewer::View* view, const osgGA::GUIEventAdapter& ea)
|
||||
{
|
||||
osgUtil::LineSegmentIntersector::Intersections intersections;
|
||||
if (view->computeIntersections(ea, intersections))
|
||||
{
|
||||
OSG_NOTICE<<"found intersections : "<<std::endl;
|
||||
for(osgUtil::LineSegmentIntersector::Intersections::iterator itr = intersections.begin();
|
||||
itr != intersections.end();
|
||||
++itr)
|
||||
{
|
||||
OSG_NOTICE<<" intersection "<<itr->localIntersectionPoint<<std::endl;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
OSG_NOTICE<<"failed to get intersection "<<std::endl;
|
||||
}
|
||||
}
|
||||
private:
|
||||
osgText::Text3D* m_Text3D;
|
||||
};
|
||||
|
||||
@@ -27,7 +27,7 @@ SET(TARGET_ADDED_LIBRARIES ${TARGET_ADDED_LIBRARIES}
|
||||
#backup setting
|
||||
SET(TMP_OSG_BUILD_APPLICATION_BUNDLES {$OSG_BUILD_APPLICATION_BUNDLES})
|
||||
SET(OSG_BUILD_APPLICATION_BUNDLES TRUE)
|
||||
SET(MACOSX_DEPLOYMENT_TARGET, ${IPHONE_VERSION_MIN})
|
||||
#SET(MACOSX_DEPLOYMENT_TARGET, ${IPHONE_VERSION_MIN})
|
||||
SETUP_EXAMPLE(osgViewerIPhone)
|
||||
SET_TARGET_PROPERTIES(example_osgViewerIPhone PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer"
|
||||
XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET ${IPHONE_VERSION_MIN}
|
||||
@@ -35,4 +35,4 @@ SET_TARGET_PROPERTIES(example_osgViewerIPhone PROPERTIES XCODE_ATTRIBUTE_CODE_SI
|
||||
|
||||
#restore setting
|
||||
SET(OSG_BUILD_APPLICATION_BUNDLES {$TMP_OSG_BUILD_APPLICATION_BUNDLES})
|
||||
SET(CMAKE_EXE_LINKER_FLAGS "-framework QuartzCore -framework Foundation -framework OpenGLES -framework UIKit -framework ImageIO -framework CoreImage -framework MobileCoreServices -framework CoreGraphics")
|
||||
SET(CMAKE_EXE_LINKER_FLAGS "-framework QuartzCore -framework Foundation -framework UIKit -framework ImageIO -framework CoreImage -framework MobileCoreServices -framework CoreGraphics")
|
||||
|
||||
@@ -109,10 +109,15 @@ public:
|
||||
|
||||
|
||||
/**
|
||||
* Return a pointer to the current running thread
|
||||
* Return a pointer to the current running thread, returns NULL for a non OpenThreads thread.
|
||||
*/
|
||||
static Thread *CurrentThread();
|
||||
|
||||
/**
|
||||
* Return the id of the current thread
|
||||
*/
|
||||
static size_t CurrentThreadId();
|
||||
|
||||
|
||||
/**
|
||||
* Initialize Threading in a program. This method must be called before
|
||||
@@ -147,7 +152,7 @@ public:
|
||||
*
|
||||
* @return a unique thread identifier
|
||||
*/
|
||||
int getThreadId();
|
||||
size_t getThreadId();
|
||||
|
||||
/**
|
||||
* Get the thread's process id. This is the pthread_t or pid_t value
|
||||
|
||||
@@ -599,12 +599,12 @@ class OSG_EXPORT Camera : public Transform, public CullSettings
|
||||
Callback(org, copyop) {}
|
||||
|
||||
META_Object(osg, DrawCallback);
|
||||
|
||||
|
||||
/** Functor method called by rendering thread to recursively launch operator() on _nestedcallback **/
|
||||
inline void run(osg::RenderInfo& renderInfo) const
|
||||
{
|
||||
operator () (renderInfo);
|
||||
|
||||
|
||||
if (_nestedCallback.valid())
|
||||
((const DrawCallback*)_nestedCallback.get())->run(renderInfo);
|
||||
}
|
||||
@@ -614,6 +614,23 @@ class OSG_EXPORT Camera : public Transform, public CullSettings
|
||||
|
||||
/** Functor method, provided for backwards compatibility, called by operator() (osg::RenderInfo& renderInfo) method.**/
|
||||
virtual void operator () (const osg::Camera& /*camera*/) const {}
|
||||
|
||||
/** Resize any per context GLObject buffers to specified size. */
|
||||
virtual void resizeGLObjectBuffers(unsigned int maxSize)
|
||||
{
|
||||
if (_nestedCallback.valid())
|
||||
_nestedCallback->resizeGLObjectBuffers(maxSize);
|
||||
}
|
||||
|
||||
/** If State is non-zero, this function releases any associated OpenGL objects for
|
||||
* the specified graphics context. Otherwise, releases OpenGL objexts
|
||||
* for all graphics contexts. */
|
||||
virtual void releaseGLObjects(osg::State* state = 0) const
|
||||
{
|
||||
if (_nestedCallback.valid())
|
||||
_nestedCallback->releaseGLObjects(state);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/** Set the initial draw callback for custom operations to be done before the drawing of the camera's subgraph and pre render stages.*/
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
#endif
|
||||
|
||||
|
||||
// #define INLINE_DRAWABLE_DRAW
|
||||
#define INLINE_DRAWABLE_DRAW
|
||||
|
||||
namespace osg {
|
||||
|
||||
|
||||
@@ -304,6 +304,9 @@ class OSG_EXPORT FrameBufferAttachment
|
||||
unsigned int getTexture3DZOffset() const;
|
||||
unsigned int getTextureArrayLayer() const;
|
||||
|
||||
void resizeGLObjectBuffers(unsigned int maxSize);
|
||||
void releaseGLObjects(osg::State* = 0) const;
|
||||
|
||||
private:
|
||||
// use the Pimpl idiom to avoid dependency from
|
||||
// all Texture* headers
|
||||
|
||||
@@ -656,6 +656,9 @@ class OSG_EXPORT GLExtensions : public osg::Referenced
|
||||
// FrameBuferObject
|
||||
bool isFrameBufferObjectSupported;
|
||||
bool isPackedDepthStencilSupported;
|
||||
bool isMultisampledRenderToTextureSupported;
|
||||
bool isInvalidateFramebufferSupported;
|
||||
|
||||
bool isRenderbufferMultisampleSupported() const { return glRenderbufferStorageMultisample != 0; }
|
||||
bool isRenderbufferMultisampleCoverageSupported() const { return glRenderbufferStorageMultisampleCoverageNV != 0; }
|
||||
|
||||
@@ -672,6 +675,7 @@ class OSG_EXPORT GLExtensions : public osg::Referenced
|
||||
|
||||
void (GL_APIENTRY * glFramebufferTexture1D) (GLenum, GLenum, GLenum, GLuint, GLint);
|
||||
void (GL_APIENTRY * glFramebufferTexture2D) (GLenum, GLenum, GLenum, GLuint, GLint);
|
||||
void (GL_APIENTRY * glFramebufferTexture2DMultisample) (GLenum, GLenum, GLenum, GLuint, GLint, GLsizei);
|
||||
void (GL_APIENTRY * glFramebufferTexture3D) (GLenum, GLenum, GLenum, GLuint, GLint, GLint);
|
||||
void (GL_APIENTRY * glFramebufferTexture) (GLenum, GLenum, GLint, GLint);
|
||||
void (GL_APIENTRY * glFramebufferTextureLayer) (GLenum, GLenum, GLuint, GLint, GLint);
|
||||
@@ -680,6 +684,7 @@ class OSG_EXPORT GLExtensions : public osg::Referenced
|
||||
|
||||
void (GL_APIENTRY * glGenerateMipmap) (GLenum);
|
||||
void (GL_APIENTRY * glBlitFramebuffer) (GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum);
|
||||
void (GL_APIENTRY * glInvalidateFramebuffer) (GLenum, GLsizei, const GLenum*); // GL_ARB_invalidate_subdata or GL 4.3 or GLES 3
|
||||
void (GL_APIENTRY * glGetRenderbufferParameteriv) (GLenum, GLenum, GLint*);
|
||||
|
||||
//ARB_framebuffer_no_attachments
|
||||
@@ -813,6 +818,9 @@ class OSG_EXPORT GLExtensions : public osg::Referenced
|
||||
|
||||
/** convenience wrapper around glObjectLabel that calls glObjectLabel if it's supported and using std::string as a label parameter.*/
|
||||
void debugObjectLabel(GLenum identifier, GLuint name, const std::string& label) const { if (glObjectLabel && !label.empty()) glObjectLabel(identifier, name, label.size(), label.c_str()); }
|
||||
|
||||
protected:
|
||||
virtual ~GLExtensions();
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -390,7 +390,7 @@ class OSG_EXPORT GraphicsContext : public Object
|
||||
bool releaseContext();
|
||||
|
||||
/** Return true if the current thread has this OpenGL graphics context.*/
|
||||
inline bool isCurrent() const { return _threadOfLastMakeCurrent == OpenThreads::Thread::CurrentThread(); }
|
||||
inline bool isCurrent() const { return _threadOfLastMakeCurrent == OpenThreads::Thread::CurrentThreadId(); }
|
||||
|
||||
/** Bind the graphics context to associated texture.*/
|
||||
inline void bindPBufferToTexture(GLenum buffer) { bindPBufferToTextureImplementation(buffer); }
|
||||
@@ -547,7 +547,7 @@ class OSG_EXPORT GraphicsContext : public Object
|
||||
Vec4 _clearColor;
|
||||
GLbitfield _clearMask;
|
||||
|
||||
OpenThreads::Thread* _threadOfLastMakeCurrent;
|
||||
size_t _threadOfLastMakeCurrent;
|
||||
|
||||
OpenThreads::Mutex _operationsMutex;
|
||||
osg::ref_ptr<osg::RefBlock> _operationsBlock;
|
||||
|
||||
@@ -42,6 +42,14 @@ struct OSG_EXPORT GraphicsOperation : public Operation
|
||||
virtual void operator () (Object* object);
|
||||
|
||||
virtual void operator () (GraphicsContext* context) = 0;
|
||||
|
||||
/** Resize any per context GLObject buffers to specified size. */
|
||||
virtual void resizeGLObjectBuffers(unsigned int /*maxSize*/) {}
|
||||
|
||||
/** If State is non-zero, this function releases any associated OpenGL objects for
|
||||
* the specified graphics context. Otherwise, releases OpenGL objects
|
||||
* for all graphics contexts. */
|
||||
virtual void releaseGLObjects(osg::State* = 0) const {}
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
namespace osg {
|
||||
|
||||
// forward declare
|
||||
class State;
|
||||
class UserDataContainer;
|
||||
class Node;
|
||||
class NodeVisitor;
|
||||
|
||||
@@ -72,7 +72,19 @@ public:
|
||||
|
||||
virtual void drawImplementation( osg::RenderInfo& renderInfo ) const;
|
||||
|
||||
unsigned int getNumPixels( const osg::Camera* cam );
|
||||
struct QueryResult
|
||||
{
|
||||
QueryResult() : valid(false), numPixels(0) {}
|
||||
QueryResult(bool v, unsigned int p) : valid(v), numPixels(p) {}
|
||||
|
||||
bool valid;
|
||||
unsigned int numPixels;
|
||||
};
|
||||
|
||||
/** return a QueryResult for specified Camera, where the QueryResult.valid is true when query results are available, and in which case the QueryResult.numPixels provides the num of pixels in the query result.*/
|
||||
QueryResult getQueryResult( const osg::Camera* cam ) const;
|
||||
|
||||
unsigned int getNumPixels( const osg::Camera* cam ) const;
|
||||
|
||||
virtual void releaseGLObjects( osg::State* state = 0 ) const;
|
||||
|
||||
@@ -125,6 +137,11 @@ public:
|
||||
void setQueryFrameCount( unsigned int frames ) { _queryFrameCount = frames; }
|
||||
unsigned int getQueryFrameCount() const { return _queryFrameCount; }
|
||||
|
||||
// Resets the queries. The next frame will issue a new query.
|
||||
// This is useful for big view changes, if it shouldn't be waited for
|
||||
// '_queryFrameCount' till the frame contents change.
|
||||
void resetQueries();
|
||||
|
||||
// Indicate whether or not the bounding box used in the occlusion query test
|
||||
// should be rendered. Handy for debugging and development.
|
||||
// Should only be called outside of cull/draw. No thread issues.
|
||||
@@ -141,8 +158,11 @@ public:
|
||||
osg::StateSet* getQueryStateSet();
|
||||
const osg::StateSet* getQueryStateSet() const;
|
||||
|
||||
// Get the QueryGeometry object used for occlusion query. Returns 0 if no QueryGeometry is created.
|
||||
osg::QueryGeometry* getQueryGeometry();
|
||||
// Set and get the QueryGeometry object used for the occlusion query.
|
||||
// By default an axis aligned box is used as the query geometry.
|
||||
// Resetting to the default query geometry is done by setting it to 0.
|
||||
// Returns 0 if no QueryGeometry is created.
|
||||
void setQueryGeometry( osg::QueryGeometry* geom );
|
||||
const osg::QueryGeometry* getQueryGeometry() const;
|
||||
|
||||
// Set and get the StateSet used by the OcclusionQueryNode
|
||||
@@ -172,15 +192,31 @@ public:
|
||||
static void discardDeletedQueryObjects( unsigned int contextID );
|
||||
|
||||
protected:
|
||||
enum QueryGeometryState {
|
||||
INVALID,
|
||||
VALID,
|
||||
USER_DEFINED
|
||||
};
|
||||
|
||||
virtual ~OcclusionQueryNode();
|
||||
|
||||
virtual void createSupportNodes();
|
||||
|
||||
bool isQueryGeometryValid() const { return _queryGeometryState != INVALID; }
|
||||
|
||||
void setQueryGeometryInternal( osg::QueryGeometry* queryGeom,
|
||||
osg::Geometry* debugQueryGeom,
|
||||
QueryGeometryState state );
|
||||
|
||||
void updateDefaultQueryGeometry();
|
||||
|
||||
osg::ref_ptr< osg::Geode > _queryGeode;
|
||||
osg::ref_ptr< osg::Geode > _debugGeode;
|
||||
|
||||
bool _enabled;
|
||||
|
||||
mutable QueryGeometryState _queryGeometryState;
|
||||
|
||||
// Tracks the last frame number that we performed a query.
|
||||
// User can set how many times (See setQueryFrameCount).
|
||||
typedef std::map< const osg::Camera*, unsigned int > FrameCountMap;
|
||||
|
||||
@@ -32,7 +32,11 @@ class OSG_EXPORT Quat
|
||||
public:
|
||||
|
||||
/** Data type of vector components.*/
|
||||
#ifdef OSG_USE_FLOAT_QUAT
|
||||
typedef float value_type;
|
||||
#else
|
||||
typedef double value_type;
|
||||
#endif
|
||||
|
||||
/** Number of vector components. */
|
||||
enum { num_components = 4 };
|
||||
|
||||
@@ -30,6 +30,7 @@ namespace osg {
|
||||
class DeleteHandler;
|
||||
class Observer;
|
||||
class ObserverSet;
|
||||
class State;
|
||||
|
||||
/** template class to help enforce static initialization order. */
|
||||
template <typename T, T M()>
|
||||
@@ -114,8 +115,16 @@ class OSG_EXPORT Referenced
|
||||
|
||||
/** Remove Observer that is observing this object.*/
|
||||
void removeObserver(Observer* observer) const;
|
||||
#if 0
|
||||
/** Resize any per context GLObject buffers to specified size. */
|
||||
virtual void resizeGLObjectBuffers(unsigned int /*maxSize*/) {}
|
||||
|
||||
public:
|
||||
/** If State is non-zero, this function releases any associated OpenGL objects for
|
||||
* the specified graphics context. Otherwise, releases OpenGL objects
|
||||
* for all graphics contexts. */
|
||||
virtual void releaseGLObjects(osg::State* = 0) const {}
|
||||
#endif
|
||||
public:
|
||||
|
||||
friend class DeleteHandler;
|
||||
|
||||
|
||||
@@ -549,6 +549,13 @@ class OSG_EXPORT State : public Referenced
|
||||
/** Set the getCurrentVertexArrayState to the GlobalVertexArrayState.*/
|
||||
void setCurrentToGlobalVertexArrayState() { _vas = _globalVertexArrayState.get(); }
|
||||
|
||||
/** Reset the CurrentVertexArrayState/VertexArrayObject if it's value matches the specificied vas - use when deleting a vas.*/
|
||||
void resetCurrentVertexArrayStateOnMatch(VertexArrayState* vas)
|
||||
{
|
||||
if (vas->getVertexArrayObject()== _currentVAO) _currentVAO = 0;
|
||||
if (_vas==vas) _vas = _globalVertexArrayState.get();
|
||||
}
|
||||
|
||||
|
||||
/** disable the vertex, normal, color, tex coords, secondary color, fog coord and index arrays.*/
|
||||
void disableAllVertexArrays();
|
||||
|
||||
@@ -182,10 +182,12 @@ class OSG_EXPORT VertexArrayState : public osg::Referenced
|
||||
|
||||
public:
|
||||
|
||||
virtual ~VertexArrayState();
|
||||
|
||||
// osg::GLBufferObject* getGLBufferObject(osg::Array* array);
|
||||
|
||||
osg::State* _state;
|
||||
osg::ref_ptr<ObserverSet> _stateObserverSet;
|
||||
osg::ref_ptr<osg::GLExtensions> _ext;
|
||||
|
||||
bool _isVertexBufferObjectSupported;
|
||||
|
||||
@@ -161,6 +161,9 @@ class OSG_EXPORT View : public virtual osg::Object
|
||||
|
||||
void updateSlaves();
|
||||
|
||||
virtual void resizeGLObjectBuffers(unsigned int maxSize);
|
||||
virtual void releaseGLObjects(osg::State* = 0) const;
|
||||
|
||||
protected :
|
||||
|
||||
virtual ~View();
|
||||
|
||||
@@ -66,7 +66,6 @@ class MakeString
|
||||
inline operator std::string () const { return sstream.str(); }
|
||||
|
||||
inline std::string str() const { return sstream.str(); }
|
||||
inline const char* c_str() const { return sstream.str().c_str(); }
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -120,6 +120,8 @@ class OSGDB_EXPORT ImageOptions : public osgDB::Options
|
||||
}
|
||||
|
||||
double _x,_y,_w,_h;
|
||||
protected:
|
||||
virtual ~TexCoordRange() {}
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -55,10 +55,10 @@ class OSGDB_EXPORT ObjectCache : public osg::Referenced
|
||||
/** Remove Object from cache.*/
|
||||
void removeFromObjectCache(const std::string& fileName, const Options *options = NULL);
|
||||
|
||||
/** Get an Object from the object cache*/
|
||||
/** Deprecated, the getFromObjectCache() returns a C pointer that is not thread safe when using database paging, please use the thread safe getRefFromObjectCache() method instead. */
|
||||
osg::Object* getFromObjectCache(const std::string& fileName, const Options *options = NULL);
|
||||
|
||||
/** Get an ref_ptr<Object> from the object cache*/
|
||||
/** Get a thread safe ref_ptr<Object> from the object cache*/
|
||||
osg::ref_ptr<osg::Object> getRefFromObjectCache(const std::string& fileName, const Options *options = NULL);
|
||||
|
||||
/** call rleaseGLObjects on all objects attached to the object cache.*/
|
||||
|
||||
@@ -62,8 +62,9 @@ protected:
|
||||
// Return true if the manipulator is std::endl
|
||||
bool isEndl( std::ostream& (*fn)(std::ostream&) )
|
||||
{
|
||||
#ifdef __sun
|
||||
#if defined (__sun) || (defined _WIN32 && !defined OSG_LIBRARY_STATIC)
|
||||
// What a mess, but solaris does not like taking the address below
|
||||
// windows std::endl is a template with different adresses in different dll's
|
||||
std::stringstream ss;
|
||||
ss << fn;
|
||||
std::string s = ss.str();
|
||||
|
||||
@@ -119,6 +119,9 @@ namespace osgFX
|
||||
/** default traversal */
|
||||
inline void inherited_traverse(osg::NodeVisitor& nv);
|
||||
|
||||
virtual void resizeGLObjectBuffers(unsigned int maxSize);
|
||||
virtual void releaseGLObjects(osg::State* state = 0) const;
|
||||
|
||||
protected:
|
||||
virtual ~Effect();
|
||||
Effect &operator=(const Effect &) { return *this; }
|
||||
|
||||
@@ -42,6 +42,21 @@ namespace osgParticle
|
||||
return y1 + (y2 - y1) * t;
|
||||
}
|
||||
|
||||
virtual osg::Vec2 interpolate(float t, const osg::Vec2& y1, const osg::Vec2& y2) const
|
||||
{
|
||||
return y1 + (y2 - y1) * t;
|
||||
}
|
||||
|
||||
virtual osg::Vec3 interpolate(float t, const osg::Vec3& y1, const osg::Vec3& y2) const
|
||||
{
|
||||
return y1 + (y2 - y1) * t;
|
||||
}
|
||||
|
||||
virtual osg::Vec4 interpolate(float t, const osg::Vec4& y1, const osg::Vec4& y2) const
|
||||
{
|
||||
return y1 + (y2 - y1) * t;
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual ~LinearInterpolator() {}
|
||||
};
|
||||
|
||||
@@ -265,7 +265,7 @@ namespace osgParticle
|
||||
* for all graphics contexts. */
|
||||
virtual void releaseGLObjects(osg::State* state=0) const;
|
||||
|
||||
virtual osg::VertexArrayState* createVertexArrayStateImplemenation(osg::RenderInfo& renderInfo) const;
|
||||
virtual osg::VertexArrayState* createVertexArrayStateImplementation(osg::RenderInfo& renderInfo) const;
|
||||
|
||||
void adjustEstimatedMaxNumOfParticles(int delta) { _estimatedMaxNumOfParticles += delta; }
|
||||
|
||||
|
||||
@@ -37,8 +37,10 @@ namespace osgParticle
|
||||
virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const PrecipitationEffect*>(obj) != 0; }
|
||||
virtual void accept(osg::NodeVisitor& nv) { if (nv.validNodeMask(*this)) { nv.pushOntoNodePath(this); nv.apply(*this); nv.popFromNodePath(); } }
|
||||
|
||||
virtual void traverse(osg::NodeVisitor& nv);
|
||||
virtual void resizeGLObjectBuffers(unsigned int maxSize);
|
||||
virtual void releaseGLObjects(osg::State* state = 0) const;
|
||||
|
||||
virtual void traverse(osg::NodeVisitor& nv);
|
||||
|
||||
/** Set all the parameters to create an rain effect of specified intensity.*/
|
||||
void rain(float intensity);
|
||||
@@ -117,6 +119,9 @@ namespace osgParticle
|
||||
void setNumberOfVertices(unsigned int numVertices) { _numberOfVertices = numVertices; }
|
||||
unsigned int getNumberOfVertices() const { return _numberOfVertices; }
|
||||
|
||||
virtual void resizeGLObjectBuffers(unsigned int maxSize);
|
||||
virtual void releaseGLObjects(osg::State* state) const;
|
||||
|
||||
virtual void drawImplementation(osg::RenderInfo& renderInfo) const;
|
||||
|
||||
struct Cell
|
||||
@@ -174,7 +179,7 @@ namespace osgParticle
|
||||
|
||||
protected:
|
||||
|
||||
virtual ~PrecipitationDrawable() {}
|
||||
virtual ~PrecipitationDrawable();
|
||||
|
||||
bool _requiresPreviousMatrix;
|
||||
|
||||
|
||||
@@ -240,6 +240,10 @@ public:
|
||||
/** recompute the primitives rendering meshes/lines thtat represent the sphere segment.*/
|
||||
void updatePrimitives();
|
||||
|
||||
|
||||
virtual void resizeGLObjectBuffers(unsigned int maxSize);
|
||||
virtual void releaseGLObjects(osg::State* state = 0) const;
|
||||
|
||||
virtual osg::BoundingSphere computeBound() const;
|
||||
|
||||
private:
|
||||
|
||||
@@ -83,7 +83,7 @@ public:
|
||||
|
||||
virtual std::string getFileName() const;
|
||||
|
||||
static osg::ref_ptr<Font>& getDefaultFont();
|
||||
static osg::ref_ptr<Font> getDefaultFont();
|
||||
|
||||
typedef std::vector< osg::ref_ptr<osg::StateSet> > StateSets;
|
||||
StateSets& getCachedStateSets() { return _statesets; }
|
||||
|
||||
@@ -60,7 +60,8 @@ class OSGTEXT_EXPORT String : public VectorUInt
|
||||
ENCODING_UTF32, /// 32-bit signature
|
||||
ENCODING_UTF32_BE, /// 32-bit big-endian
|
||||
ENCODING_UTF32_LE, /// 32-bit little-endian
|
||||
ENCODING_SIGNATURE /// detect encoding from signature
|
||||
ENCODING_SIGNATURE, /// detect encoding from signature
|
||||
ENCODING_CURRENT_CODE_PAGE /// Use Windows Current Code Page ecoding
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -265,7 +265,6 @@ protected:
|
||||
virtual osg::StateSet* createStateSet();
|
||||
|
||||
Font* getActiveFont();
|
||||
const Font* getActiveFont() const;
|
||||
|
||||
String::iterator computeLastCharacterOnLine(osg::Vec2& cursor, String::iterator first,String::iterator last);
|
||||
|
||||
|
||||
@@ -312,6 +312,7 @@ protected:
|
||||
// members which have public access.
|
||||
osg::Vec4 _color;
|
||||
osg::ref_ptr<Font> _font;
|
||||
osg::ref_ptr<Font> _fontFallback;
|
||||
osg::ref_ptr<Style> _style;
|
||||
FontResolution _fontSize;
|
||||
float _characterHeight;
|
||||
|
||||
@@ -46,11 +46,16 @@ class OSGUTIL_EXPORT IndexMeshVisitor : public GeometryCollector
|
||||
{
|
||||
public:
|
||||
IndexMeshVisitor(Optimizer* optimizer = 0)
|
||||
: GeometryCollector(optimizer, Optimizer::INDEX_MESH)
|
||||
: GeometryCollector(optimizer, Optimizer::INDEX_MESH), _generateNewIndicesOnAllGeometries(false)
|
||||
{
|
||||
}
|
||||
inline void setGenerateNewIndicesOnAllGeometries(bool b) { _generateNewIndicesOnAllGeometries = b; }
|
||||
inline bool getGenerateNewIndicesOnAllGeometries() const { return _generateNewIndicesOnAllGeometries; }
|
||||
|
||||
void makeMesh(osg::Geometry& geom);
|
||||
void makeMesh();
|
||||
protected:
|
||||
bool _generateNewIndicesOnAllGeometries;
|
||||
};
|
||||
|
||||
// Optimize the triangle order in a mesh for best use of the GPU's
|
||||
|
||||
@@ -72,6 +72,16 @@ class OSGUTIL_EXPORT RenderLeaf : public osg::Referenced
|
||||
|
||||
virtual void render(osg::RenderInfo& renderInfo,RenderLeaf* previous);
|
||||
|
||||
virtual void resizeGLObjectBuffers(unsigned int maxSize)
|
||||
{
|
||||
if (_drawable) _drawable->resizeGLObjectBuffers(maxSize);
|
||||
}
|
||||
|
||||
virtual void releaseGLObjects(osg::State* state=0) const
|
||||
{
|
||||
if (_drawable) _drawable->releaseGLObjects(state);
|
||||
}
|
||||
|
||||
/// Allow StateGraph to change the RenderLeaf's _parent.
|
||||
friend class osgUtil::StateGraph;
|
||||
|
||||
|
||||
@@ -38,6 +38,8 @@ class OSGUTIL_EXPORT RenderStage : public RenderBin
|
||||
{
|
||||
public:
|
||||
|
||||
typedef std::pair< int , osg::ref_ptr<RenderStage> > RenderStageOrderPair;
|
||||
typedef std::list< RenderStageOrderPair > RenderStageList;
|
||||
|
||||
RenderStage();
|
||||
RenderStage(SortMode mode);
|
||||
@@ -236,6 +238,12 @@ class OSGUTIL_EXPORT RenderStage : public RenderBin
|
||||
|
||||
void addPostRenderStage(RenderStage* rs, int order = 0);
|
||||
|
||||
const RenderStageList& getPreRenderList() const { return _preRenderList; }
|
||||
RenderStageList& getPreRenderList() { return _preRenderList; }
|
||||
|
||||
const RenderStageList& getPostRenderList() const { return _postRenderList; }
|
||||
RenderStageList& getPostRenderList() { return _postRenderList; }
|
||||
|
||||
/** Extract stats for current draw list. */
|
||||
bool getStats(Statistics& stats) const;
|
||||
|
||||
@@ -266,8 +274,6 @@ protected:
|
||||
|
||||
virtual ~RenderStage();
|
||||
|
||||
typedef std::pair< int , osg::ref_ptr<RenderStage> > RenderStageOrderPair;
|
||||
typedef std::list< RenderStageOrderPair > RenderStageList;
|
||||
typedef std::vector< osg::ref_ptr<osg::Camera> > Cameras;
|
||||
|
||||
bool _stageDrawnThisFrame;
|
||||
|
||||
@@ -484,6 +484,9 @@ class OSGUTIL_EXPORT SceneView : public osg::Object, public osg::CullSettings
|
||||
* then need to be deleted in OpenGL by SceneView::flushAllDeleteGLObjects(). */
|
||||
virtual void releaseAllGLObjects();
|
||||
|
||||
virtual void resizeGLObjectBuffers(unsigned int maxSize);
|
||||
virtual void releaseGLObjects(osg::State* = 0) const;
|
||||
|
||||
/** Flush all deleted OpenGL objects, such as texture objects, display lists, etc.*/
|
||||
virtual void flushAllDeletedGLObjects();
|
||||
|
||||
|
||||
@@ -38,13 +38,13 @@ struct LessDepthSortFunctor
|
||||
|
||||
/** StateGraph - contained in a renderBin, defines the scene to be drawn.
|
||||
*/
|
||||
class OSGUTIL_EXPORT StateGraph : public osg::Referenced
|
||||
class OSGUTIL_EXPORT StateGraph : public osg::Object
|
||||
{
|
||||
public:
|
||||
|
||||
|
||||
typedef std::map< const osg::StateSet*, osg::ref_ptr<StateGraph> > ChildList;
|
||||
typedef std::vector< osg::ref_ptr<RenderLeaf> > LeafList;
|
||||
typedef std::map< const osg::StateSet*, osg::ref_ptr<StateGraph> > ChildList;
|
||||
typedef std::vector< osg::ref_ptr<RenderLeaf> > LeafList;
|
||||
|
||||
StateGraph* _parent;
|
||||
|
||||
@@ -66,7 +66,6 @@ class OSGUTIL_EXPORT StateGraph : public osg::Referenced
|
||||
bool _dynamic;
|
||||
|
||||
StateGraph():
|
||||
osg::Referenced(false),
|
||||
_parent(NULL),
|
||||
_stateset(NULL),
|
||||
_depth(0),
|
||||
@@ -78,7 +77,6 @@ class OSGUTIL_EXPORT StateGraph : public osg::Referenced
|
||||
}
|
||||
|
||||
StateGraph(StateGraph* parent,const osg::StateSet* stateset):
|
||||
osg::Referenced(false),
|
||||
_parent(parent),
|
||||
_stateset(stateset),
|
||||
_depth(0),
|
||||
@@ -95,7 +93,13 @@ class OSGUTIL_EXPORT StateGraph : public osg::Referenced
|
||||
|
||||
~StateGraph() {}
|
||||
|
||||
StateGraph* cloneType() const { return new StateGraph; }
|
||||
|
||||
virtual osg::Object* cloneType() const { return new StateGraph(); }
|
||||
virtual StateGraph* cloneStateGraph() const { return new StateGraph(); }
|
||||
virtual osg::Object* clone(const osg::CopyOp&) const { return new StateGraph(); }
|
||||
virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const StateGraph*>(obj)!=0L; }
|
||||
virtual const char* libraryName() const { return "osgUtil"; }
|
||||
virtual const char* className() const { return "StateGraph"; }
|
||||
|
||||
void setUserData(osg::Referenced* obj) { _userData = obj; }
|
||||
osg::Referenced* getUserData() { return _userData.get(); }
|
||||
@@ -172,6 +176,42 @@ class OSGUTIL_EXPORT StateGraph : public osg::Referenced
|
||||
void prune();
|
||||
|
||||
|
||||
void resizeGLObjectBuffers(unsigned int maxSize)
|
||||
{
|
||||
for(ChildList::iterator itr = _children.begin();
|
||||
itr != _children.end();
|
||||
++itr)
|
||||
{
|
||||
(itr->second)->resizeGLObjectBuffers(maxSize);
|
||||
}
|
||||
|
||||
for(LeafList::iterator itr = _leaves.begin();
|
||||
itr != _leaves.end();
|
||||
++itr)
|
||||
{
|
||||
(*itr)->resizeGLObjectBuffers(maxSize);
|
||||
}
|
||||
}
|
||||
|
||||
void releaseGLObjects(osg::State* state=0) const
|
||||
{
|
||||
if (_stateset) _stateset->releaseGLObjects(state);
|
||||
|
||||
for(ChildList::const_iterator itr = _children.begin();
|
||||
itr != _children.end();
|
||||
++itr)
|
||||
{
|
||||
(itr->second)->releaseGLObjects(state);
|
||||
}
|
||||
|
||||
for(LeafList::const_iterator itr = _leaves.begin();
|
||||
itr != _leaves.end();
|
||||
++itr)
|
||||
{
|
||||
(*itr)->releaseGLObjects(state);
|
||||
}
|
||||
}
|
||||
|
||||
inline StateGraph* find_or_insert(const osg::StateSet* stateset)
|
||||
{
|
||||
// search for the appropriate state group, return it if found.
|
||||
@@ -309,7 +349,7 @@ class OSGUTIL_EXPORT StateGraph : public osg::Referenced
|
||||
private:
|
||||
|
||||
/// disallow copy construction.
|
||||
StateGraph(const StateGraph&):osg::Referenced() {}
|
||||
StateGraph(const StateGraph&) : osg::Object() {}
|
||||
/// disallow copy operator.
|
||||
StateGraph& operator = (const StateGraph&) { return *this; }
|
||||
|
||||
|
||||
@@ -286,7 +286,11 @@ struct GraphicsWindowFunctionProxy
|
||||
#if defined(_WIN32)
|
||||
#define USE_GRAPHICSWINDOW() USE_GRAPICSWINDOW_IMPLEMENTATION(Win32)
|
||||
#elif defined(__APPLE__)
|
||||
#if defined(OSG_WINDOWING_SYSTEM_CARBON)
|
||||
#define USE_GRAPHICSWINDOW() USE_GRAPICSWINDOW_IMPLEMENTATION(Carbon)
|
||||
#else
|
||||
#define USE_GRAPHICSWINDOW() USE_GRAPICSWINDOW_IMPLEMENTATION(Cocoa)
|
||||
#endif
|
||||
#else
|
||||
#define USE_GRAPHICSWINDOW() USE_GRAPICSWINDOW_IMPLEMENTATION(X11)
|
||||
#endif
|
||||
|
||||
@@ -60,6 +60,9 @@ class OSGVIEWER_EXPORT Renderer : public osg::GraphicsOperation
|
||||
|
||||
virtual void compile();
|
||||
|
||||
virtual void resizeGLObjectBuffers(unsigned int maxSize);
|
||||
virtual void releaseGLObjects(osg::State* = 0) const;
|
||||
|
||||
void setCompileOnNextDraw(bool flag) { _compileOnNextDraw = flag; }
|
||||
bool getCompileOnNextDraw() const { return _compileOnNextDraw; }
|
||||
|
||||
|
||||
@@ -113,6 +113,9 @@ class OSGVIEWER_EXPORT Viewer : public ViewerBase, public osgViewer::View
|
||||
/** Get the keyboard and mouse usage of this viewer.*/
|
||||
virtual void getUsage(osg::ApplicationUsage& usage) const;
|
||||
|
||||
// ensure that osg::View provides the reiszerGLObjects and releaseGLObjects methods
|
||||
virtual void resizeGLObjectBuffers(unsigned int maxSize) { osg::View::resizeGLObjectBuffers(maxSize); }
|
||||
virtual void releaseGLObjects(osg::State* state = 0) const { osg::View::releaseGLObjects(state); }
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
@@ -285,14 +285,16 @@ class OSGWIDGET_EXPORT WindowManager: public osg::Switch, public UIObjectParent<
|
||||
|
||||
private:
|
||||
// A functor used to sort the Windows by their Z component in descending order.
|
||||
struct WindowZCompare: public std::binary_function<ptr_type, ptr_type, bool> {
|
||||
struct WindowZCompare
|
||||
{
|
||||
bool operator()(const ptr_type& x, const ptr_type& y) {
|
||||
return x.get()->getZ() > y.get()->getZ();
|
||||
}
|
||||
};
|
||||
|
||||
// A functor used to sort the Windows by their BinNum component in descending order.
|
||||
struct WindowBinNumberCompare: public std::binary_function<ptr_type, ptr_type, bool> {
|
||||
struct WindowBinNumberCompare
|
||||
{
|
||||
bool operator()(const ptr_type& x, const ptr_type& y) {
|
||||
return
|
||||
x.get()->getOrCreateStateSet()->getBinNumber() >
|
||||
|
||||
@@ -80,8 +80,15 @@ ELSE()
|
||||
# double check that pthread_setaffinity_np is available as FreeBSD header doesn't contain required function
|
||||
CHECK_CXX_SOURCE_COMPILES("
|
||||
#include <pthread.h>
|
||||
#ifdef __FreeBSD__
|
||||
#include <pthread_np.h>
|
||||
#endif
|
||||
int main() {
|
||||
#ifdef __FreeBSD__
|
||||
cpuset_t cpumask;
|
||||
#else
|
||||
cpu_set_t cpumask;
|
||||
#endif
|
||||
CPU_ZERO( &cpumask );
|
||||
CPU_SET( 0, &cpumask );
|
||||
pthread_setaffinity_np( pthread_self(), sizeof(cpumask), &cpumask);
|
||||
@@ -130,7 +137,7 @@ ELSE()
|
||||
ENDIF()
|
||||
|
||||
IF(APPLE)
|
||||
IF(OSG_BUILD_PLATFORM_IPHONE OR OSG_BUILD_PLATFORM_IPHONE_SIMULATOR)
|
||||
IF(OSG_BUILD_PLATFORM_IPHONE)
|
||||
SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES XCODE_ATTRIBUTE_ENABLE_BITCODE ${IPHONE_ENABLE_BITCODE})
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
#if defined(HAVE_PTHREAD_SETAFFINITY_NP) && defined(__FreeBSD__)
|
||||
#include <pthread_np.h>
|
||||
#endif
|
||||
#include <limits.h>
|
||||
|
||||
#if defined __linux__ || defined __sun || defined __APPLE__ || ANDROID
|
||||
@@ -45,6 +48,11 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__) || defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__ANDROID__)
|
||||
# include <unistd.h>
|
||||
# include <sys/syscall.h>
|
||||
#endif
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
#ifndef PAGE_SIZE
|
||||
#define PAGE_SIZE 0x400
|
||||
@@ -65,11 +73,6 @@ using namespace OpenThreads;
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Initialize the static unique ids.
|
||||
//
|
||||
int PThreadPrivateData::nextId = 0;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Initialize thread master priority level
|
||||
//
|
||||
@@ -113,7 +116,11 @@ namespace OpenThreads
|
||||
static void setAffinity(const Affinity& affinity)
|
||||
{
|
||||
//std::cout<<"setProcessAffinity : "<< affinity.activeCPUs.size() <<std::endl;
|
||||
#if defined(__FreeBSD__)
|
||||
cpuset_t cpumask;
|
||||
#else
|
||||
cpu_set_t cpumask;
|
||||
#endif
|
||||
CPU_ZERO( &cpumask );
|
||||
unsigned int numprocessors = OpenThreads::GetNumberOfProcessors();
|
||||
if (affinity)
|
||||
@@ -177,8 +184,7 @@ private:
|
||||
|
||||
Thread *thread = static_cast<Thread *>(data);
|
||||
|
||||
PThreadPrivateData *pd =
|
||||
static_cast<PThreadPrivateData *>(thread->_prvData);
|
||||
PThreadPrivateData *pd = static_cast<PThreadPrivateData *>(thread->_prvData);
|
||||
|
||||
// set up processor affinity
|
||||
setAffinity( pd->affinity );
|
||||
@@ -205,6 +211,8 @@ private:
|
||||
|
||||
#endif // ] ALLOW_PRIORITY_SCHEDULING
|
||||
|
||||
pd->uniqueId = Thread::CurrentThreadId();
|
||||
|
||||
pd->setRunning(true);
|
||||
|
||||
// release the thread that created this thread.
|
||||
@@ -456,6 +464,25 @@ Thread *Thread::CurrentThread()
|
||||
|
||||
}
|
||||
|
||||
size_t Thread::CurrentThreadId()
|
||||
{
|
||||
#if defined(__APPLE__)
|
||||
return (size_t)::syscall(SYS_thread_selfid);
|
||||
#elif defined(__ANDROID__)
|
||||
return (size_t)gettid();
|
||||
#elif defined(__linux__)
|
||||
return (size_t)::syscall(SYS_gettid);
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
long tid;
|
||||
syscall(SYS_thr_self, &tid);
|
||||
return (size_t)tid;
|
||||
#else
|
||||
return (size_t)pthread_self();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// Description: Initialize Threading
|
||||
@@ -521,7 +548,7 @@ void Thread::Init()
|
||||
//
|
||||
// Use: public
|
||||
//
|
||||
int Thread::getThreadId()
|
||||
size_t Thread::getThreadId()
|
||||
{
|
||||
|
||||
PThreadPrivateData *pd = static_cast<PThreadPrivateData *> (_prvData);
|
||||
|
||||
@@ -49,8 +49,7 @@ private:
|
||||
setRunning(false);
|
||||
isCanceled = false;
|
||||
tid = 0;
|
||||
uniqueId = nextId;
|
||||
nextId++;
|
||||
uniqueId = 0;
|
||||
threadPriority = Thread::THREAD_PRIORITY_DEFAULT;
|
||||
threadPolicy = Thread::THREAD_SCHEDULE_DEFAULT;
|
||||
};
|
||||
@@ -78,12 +77,10 @@ private:
|
||||
|
||||
pthread_t tid;
|
||||
|
||||
volatile int uniqueId;
|
||||
size_t uniqueId;
|
||||
|
||||
Affinity affinity;
|
||||
|
||||
static int nextId;
|
||||
|
||||
static pthread_key_t s_tls_key;
|
||||
|
||||
};
|
||||
|
||||
@@ -103,6 +103,8 @@ namespace OpenThreads {
|
||||
|
||||
pd->isRunning = true;
|
||||
|
||||
pd->uniqueId = Thread::CurrentThreadId();
|
||||
|
||||
// release the thread that created this thread.
|
||||
pd->threadStartedBlock.release();
|
||||
|
||||
@@ -210,6 +212,11 @@ Thread* Thread::CurrentThread()
|
||||
return (Thread* )TlsGetValue(ID);
|
||||
}
|
||||
|
||||
size_t Thread::CurrentThreadId()
|
||||
{
|
||||
return (size_t)::GetCurrentThreadId();
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
//
|
||||
// Description: Set the concurrency level (no-op)
|
||||
@@ -300,7 +307,7 @@ void Thread::Init() {
|
||||
//
|
||||
// Use: public
|
||||
//
|
||||
int Thread::getThreadId() {
|
||||
size_t Thread::getThreadId() {
|
||||
Win32ThreadPrivateData *pd = static_cast<Win32ThreadPrivateData *> (_prvData);
|
||||
return pd->uniqueId;
|
||||
}
|
||||
@@ -352,7 +359,7 @@ int Thread::start() {
|
||||
pd->tid.set( (void*)_beginthreadex(NULL,static_cast<unsigned>(pd->stackSize),ThreadPrivateActions::StartThread,static_cast<void *>(this),CREATE_SUSPENDED,&ID));
|
||||
ResumeThread(pd->tid.get());
|
||||
|
||||
pd->uniqueId = (int)ID;
|
||||
pd->uniqueId = (size_t)ID;
|
||||
|
||||
if(!pd->tid) {
|
||||
return -1;
|
||||
@@ -442,9 +449,9 @@ int Thread::testCancel()
|
||||
if(pd->cancelMode == 2)
|
||||
return 0;
|
||||
|
||||
DWORD curr = GetCurrentThreadId();
|
||||
size_t curr = Thread::CurrentThreadId();
|
||||
|
||||
if( pd->uniqueId != (int)curr )
|
||||
if( pd->uniqueId != curr )
|
||||
return -1;
|
||||
|
||||
// pd->isRunning = false;
|
||||
|
||||
@@ -54,7 +54,7 @@ private:
|
||||
|
||||
HandleHolder tid;
|
||||
|
||||
int uniqueId;
|
||||
size_t uniqueId;
|
||||
|
||||
Affinity affinity;
|
||||
|
||||
|
||||
@@ -153,7 +153,7 @@ osg::Matrixd AutoTransform::computeMatrix(const osg::NodeVisitor* nv) const
|
||||
{
|
||||
double size = 1.0/cs->pixelSize(getPosition(),0.48f);
|
||||
|
||||
//if (_autoScaleTransitionWidthRatio>0.0)
|
||||
if (_autoScaleTransitionWidthRatio>0.0)
|
||||
{
|
||||
if (_minimumScale>0.0)
|
||||
{
|
||||
@@ -185,6 +185,18 @@ osg::Matrixd AutoTransform::computeMatrix(const osg::NodeVisitor* nv) const
|
||||
else if (size>m) size = a + b*size + c*(size*size);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_minimumScale>0.0 && size<_minimumScale)
|
||||
{
|
||||
size = _minimumScale;
|
||||
}
|
||||
|
||||
if (_maximumScale<DBL_MAX && size>_maximumScale)
|
||||
{
|
||||
size = _maximumScale;
|
||||
}
|
||||
}
|
||||
|
||||
// TODO setScale(size);
|
||||
scale.set(size, size, size);
|
||||
|
||||
@@ -330,20 +330,26 @@ void Camera::detach(BufferComponent buffer)
|
||||
|
||||
void Camera::resizeGLObjectBuffers(unsigned int maxSize)
|
||||
{
|
||||
if (_renderingCache.valid())
|
||||
{
|
||||
const_cast<Camera*>(this)->_renderingCache->resizeGLObjectBuffers(maxSize);
|
||||
}
|
||||
if (_renderer.valid()) _renderer->resizeGLObjectBuffers(maxSize);
|
||||
if (_renderingCache.valid()) _renderingCache->resizeGLObjectBuffers(maxSize);
|
||||
|
||||
if (_initialDrawCallback.valid()) _initialDrawCallback->resizeGLObjectBuffers(maxSize);
|
||||
if (_preDrawCallback.valid()) _preDrawCallback->resizeGLObjectBuffers(maxSize);
|
||||
if (_postDrawCallback.valid()) _postDrawCallback->resizeGLObjectBuffers(maxSize);
|
||||
if (_finalDrawCallback.valid()) _finalDrawCallback->resizeGLObjectBuffers(maxSize);
|
||||
|
||||
Transform::resizeGLObjectBuffers(maxSize);
|
||||
}
|
||||
|
||||
void Camera::releaseGLObjects(osg::State* state) const
|
||||
{
|
||||
if (_renderingCache.valid())
|
||||
{
|
||||
const_cast<Camera*>(this)->_renderingCache->releaseGLObjects(state);
|
||||
}
|
||||
if (_renderer.valid()) _renderer->releaseGLObjects(state);
|
||||
if (_renderingCache.valid()) _renderingCache->releaseGLObjects(state);
|
||||
|
||||
if (_initialDrawCallback.valid()) _initialDrawCallback->releaseGLObjects(state);
|
||||
if (_preDrawCallback.valid()) _preDrawCallback->releaseGLObjects(state);
|
||||
if (_postDrawCallback.valid()) _postDrawCallback->releaseGLObjects(state);
|
||||
if (_finalDrawCallback.valid()) _finalDrawCallback->releaseGLObjects(state);
|
||||
|
||||
Transform::releaseGLObjects(state);
|
||||
}
|
||||
|
||||
@@ -49,7 +49,9 @@ void ClampColor::apply(State& state) const
|
||||
return;
|
||||
}
|
||||
|
||||
#if !defined(OSG_GL3_AVAILABLE)
|
||||
extensions->glClampColor(GL_CLAMP_VERTEX_COLOR, _clampVertexColor);
|
||||
extensions->glClampColor(GL_CLAMP_FRAGMENT_COLOR, _clampFragmentColor);
|
||||
#endif
|
||||
extensions->glClampColor(GL_CLAMP_READ_COLOR, _clampReadColor);
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#cmakedefine OSG_USE_FLOAT_PLANE
|
||||
#cmakedefine OSG_USE_FLOAT_BOUNDINGSPHERE
|
||||
#cmakedefine OSG_USE_FLOAT_BOUNDINGBOX
|
||||
#cmakedefine OSG_USE_FLOAT_QUAT
|
||||
#cmakedefine OSG_USE_REF_PTR_IMPLICIT_OUTPUT_CONVERSION
|
||||
#cmakedefine OSG_USE_REF_PTR_SAFE_DEREFERENCE
|
||||
#cmakedefine OSG_USE_UTF8_FILENAME
|
||||
@@ -35,5 +36,6 @@
|
||||
#cmakedefine OSG_PROVIDE_READFILE
|
||||
#cmakedefine OSG_USE_DEPRECATED_API
|
||||
#cmakedefine OSG_ENVVAR_SUPPORTED
|
||||
#cmakedefine OSG_WINDOWING_SYSTEM_CARBON
|
||||
|
||||
#endif
|
||||
|
||||
@@ -117,6 +117,8 @@ void CullSettings::readEnvironmentalVariables()
|
||||
|
||||
void CullSettings::readCommandLine(ArgumentParser& arguments)
|
||||
{
|
||||
OSG_INFO<<"CullSettings::readCommandLine(ArgumentParser& arguments)"<<std::endl;
|
||||
|
||||
// report the usage options.
|
||||
if (arguments.getApplicationUsage())
|
||||
{
|
||||
@@ -124,6 +126,11 @@ void CullSettings::readCommandLine(ArgumentParser& arguments)
|
||||
arguments.getApplicationUsage()->addCommandLineOption("--NEAR_FAR_RATIO <float>","Set the ratio between near and far planes - must greater than 0.0 but less than 1.0.");
|
||||
}
|
||||
|
||||
while(arguments.read("--NO_CULLING")) setCullingMode(NO_CULLING);
|
||||
while(arguments.read("--VIEW_FRUSTUM")) setCullingMode(VIEW_FRUSTUM_CULLING);
|
||||
while(arguments.read("--VIEW_FRUSTUM_SIDES") || arguments.read("--vfs") ) setCullingMode(VIEW_FRUSTUM_SIDES_CULLING);
|
||||
|
||||
|
||||
std::string str;
|
||||
while(arguments.read("--COMPUTE_NEAR_FAR_MODE",str))
|
||||
{
|
||||
|
||||
@@ -256,8 +256,28 @@ Drawable::Drawable(const Drawable& drawable,const CopyOp& copyop):
|
||||
|
||||
Drawable::~Drawable()
|
||||
{
|
||||
_stateset = 0;
|
||||
Drawable::releaseGLObjects();
|
||||
// clean up display lists if assigned, for the display lists size we can't use glGLObjectSizeHint() as it's a virtual function, so have to default to a 0 size hint.
|
||||
#ifdef OSG_GL_DISPLAYLISTS_AVAILABLE
|
||||
for(unsigned int i=0;i<_globjList.size();++i)
|
||||
{
|
||||
if (_globjList[i] != 0)
|
||||
{
|
||||
Drawable::deleteDisplayList(i,_globjList[i], 0); // we don't know getGLObjectSizeHint()
|
||||
_globjList[i] = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// clean up VertexArrayState
|
||||
for(unsigned int i=0; i<_vertexArrayStateList.size(); ++i)
|
||||
{
|
||||
VertexArrayState* vas = _vertexArrayStateList[i].get();
|
||||
if (vas)
|
||||
{
|
||||
vas->release();
|
||||
_vertexArrayStateList[i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
osg::MatrixList Drawable::getWorldMatrices(const osg::Node* haltTraversalAtNode) const
|
||||
@@ -319,6 +339,7 @@ void Drawable::releaseGLObjects(State* state) const
|
||||
// current OpenGL context.
|
||||
unsigned int contextID = state->getContextID();
|
||||
|
||||
#ifdef OSG_GL_DISPLAYLISTS_AVAILABLE
|
||||
if (_useDisplayList)
|
||||
{
|
||||
// get the globj for the current contextID.
|
||||
@@ -331,6 +352,7 @@ void Drawable::releaseGLObjects(State* state) const
|
||||
globj = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
VertexArrayState* vas = contextID <_vertexArrayStateList.size() ? _vertexArrayStateList[contextID].get() : 0;
|
||||
if (vas)
|
||||
|
||||
@@ -565,6 +565,18 @@ unsigned int FrameBufferAttachment::getTextureArrayLayer() const
|
||||
return _ximpl->zoffset;
|
||||
}
|
||||
|
||||
void FrameBufferAttachment::resizeGLObjectBuffers(unsigned int maxSize)
|
||||
{
|
||||
if (_ximpl->renderbufferTarget.valid()) _ximpl->renderbufferTarget->resizeGLObjectBuffers(maxSize);
|
||||
if (_ximpl->textureTarget.valid()) _ximpl->textureTarget->resizeGLObjectBuffers(maxSize);
|
||||
}
|
||||
|
||||
void FrameBufferAttachment::releaseGLObjects(osg::State* state) const
|
||||
{
|
||||
if (_ximpl->renderbufferTarget.valid()) _ximpl->renderbufferTarget->releaseGLObjects(state);
|
||||
if (_ximpl->textureTarget.valid()) _ximpl->textureTarget->releaseGLObjects(state);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* FrameBufferObject
|
||||
**************************************************************************/
|
||||
@@ -594,6 +606,11 @@ void FrameBufferObject::resizeGLObjectBuffers(unsigned int maxSize)
|
||||
_fboID.resize(maxSize);
|
||||
_unsupported.resize(maxSize);
|
||||
_fboID.resize(maxSize);
|
||||
|
||||
for(AttachmentMap::iterator itr = _attachments.begin(); itr != _attachments.end(); ++itr)
|
||||
{
|
||||
itr->second.resizeGLObjectBuffers(maxSize);
|
||||
}
|
||||
}
|
||||
|
||||
void FrameBufferObject::releaseGLObjects(osg::State* state) const
|
||||
@@ -618,6 +635,11 @@ void FrameBufferObject::releaseGLObjects(osg::State* state) const
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(AttachmentMap::const_iterator itr = _attachments.begin(); itr != _attachments.end(); ++itr)
|
||||
{
|
||||
itr->second.releaseGLObjects(state);
|
||||
}
|
||||
}
|
||||
|
||||
void FrameBufferObject::setAttachment(BufferComponent attachment_point, const FrameBufferAttachment &attachment)
|
||||
|
||||
@@ -63,10 +63,6 @@ static osg::buffered_object<ExtensionSet> s_glExtensionSetList;
|
||||
static osg::buffered_object<std::string> s_glRendererList;
|
||||
static osg::buffered_value<int> s_glInitializedList;
|
||||
|
||||
static osg::buffered_object<ExtensionSet> s_gluExtensionSetList;
|
||||
static osg::buffered_object<std::string> s_gluRendererList;
|
||||
static osg::buffered_value<int> s_gluInitializedList;
|
||||
|
||||
static ApplicationUsageProxy GLEXtension_e0(ApplicationUsage::ENVIRONMENTAL_VARIABLE, "OSG_GL_EXTENSION_DISABLE <value>", "Use space deliminarted list of GL extensions to disable associated GL extensions");
|
||||
static ApplicationUsageProxy GLEXtension_e1(ApplicationUsage::ENVIRONMENTAL_VARIABLE, "OSG_MAX_TEXTURE_SIZE <value>", "Clamp the maximum GL texture size to specified value.");
|
||||
|
||||
@@ -459,7 +455,7 @@ GLExtensions::GLExtensions(unsigned int in_contextID):
|
||||
isVertexShaderSupported = validContext && (shadersBuiltIn || osg::isGLExtensionSupported(contextID,"GL_ARB_vertex_shader"));
|
||||
isFragmentShaderSupported = validContext && (shadersBuiltIn || osg::isGLExtensionSupported(contextID,"GL_ARB_fragment_shader"));
|
||||
isLanguage100Supported = validContext && (shadersBuiltIn || osg::isGLExtensionSupported(contextID,"GL_ARB_shading_language_100"));
|
||||
isGeometryShader4Supported = validContext && (osg::isGLExtensionSupported(contextID,"GL_EXT_geometry_shader4") || osg::isGLExtensionSupported(contextID,"GL_OES_geometry_shader") || osg::isGLExtensionOrVersionSupported(contextID,"GL_ARB_geometry_shader4", 3.2f));
|
||||
isGeometryShader4Supported = validContext && (osg::isGLExtensionSupported(contextID,"GL_EXT_geometry_shader4") || osg::isGLExtensionSupported(contextID,"GL_ARB_geometry_shader4"));
|
||||
isGpuShader4Supported = validContext && osg::isGLExtensionOrVersionSupported(contextID,"GL_EXT_gpu_shader4", 3.0f);
|
||||
areTessellationShadersSupported = validContext && (osg::isGLExtensionOrVersionSupported(contextID, "GL_ARB_tessellation_shader", 4.0f) || osg::isGLExtensionSupported(contextID,"GL_OES_tessellation_shader"));
|
||||
isUniformBufferObjectSupported = validContext && osg::isGLExtensionOrVersionSupported(contextID,"GL_ARB_uniform_buffer_object", 3.1f);
|
||||
@@ -725,9 +721,9 @@ GLExtensions::GLExtensions(unsigned int in_contextID):
|
||||
setGLExtensionFuncPtr(glTexBuffer, "glTexBuffer","glTexBufferARB" , validContext);
|
||||
|
||||
isVBOSupported = validContext && (OSG_GLES2_FEATURES || OSG_GLES3_FEATURES || OSG_GL3_FEATURES || osg::isGLExtensionSupported(contextID,"GL_ARB_vertex_buffer_object"));
|
||||
isPBOSupported = validContext && (OSG_GLES3_FEATURES || OSG_GL3_FEATURES || osg::isGLExtensionSupported(contextID,"GL_ARB_pixel_buffer_object"));
|
||||
isPBOSupported = validContext && ((OSG_GLES3_FEATURES && glVersion >= 3.0) || OSG_GL3_FEATURES || osg::isGLExtensionSupported(contextID,"GL_ARB_pixel_buffer_object"));
|
||||
isTBOSupported = validContext && osg::isGLExtensionSupported(contextID,"GL_ARB_texture_buffer_object");
|
||||
isVAOSupported = validContext && (OSG_GLES3_FEATURES || OSG_GL3_FEATURES || osg::isGLExtensionSupported(contextID, "GL_ARB_vertex_array_object", "GL_OES_vertex_array_object"));
|
||||
isVAOSupported = validContext && ((OSG_GLES3_FEATURES && glVersion >= 3.0) || OSG_GL3_FEATURES || osg::isGLExtensionSupported(contextID, "GL_ARB_vertex_array_object", "GL_OES_vertex_array_object"));
|
||||
isTransformFeedbackSupported = validContext && osg::isGLExtensionSupported(contextID, "GL_ARB_transform_feedback2");
|
||||
isBufferObjectSupported = isVBOSupported || isPBOSupported;
|
||||
|
||||
@@ -1081,6 +1077,9 @@ GLExtensions::GLExtensions(unsigned int in_contextID):
|
||||
|
||||
|
||||
// FrameBufferObject
|
||||
isMultisampledRenderToTextureSupported = validContext && isGLExtensionSupported(contextID, "GL_EXT_multisampled_render_to_texture");
|
||||
isInvalidateFramebufferSupported = validContext && (isGLExtensionSupported(contextID, "GL_ARB_invalidate_subdata") || (OSG_GLES3_FEATURES && glVersion >= 3.0) || glVersion >= 4.3);
|
||||
|
||||
setGLExtensionFuncPtr(glBindRenderbuffer, "glBindRenderbuffer", "glBindRenderbufferEXT", "glBindRenderbufferOES", validContext);
|
||||
setGLExtensionFuncPtr(glDeleteRenderbuffers, "glDeleteRenderbuffers", "glDeleteRenderbuffersEXT", "glDeleteRenderbuffersOES", validContext);
|
||||
setGLExtensionFuncPtr(glGenRenderbuffers, "glGenRenderbuffers", "glGenRenderbuffersEXT", "glGenRenderbuffersOES", validContext);
|
||||
@@ -1094,6 +1093,7 @@ GLExtensions::GLExtensions(unsigned int in_contextID):
|
||||
|
||||
setGLExtensionFuncPtr(glFramebufferTexture1D, "glFramebufferTexture1D", "glFramebufferTexture1DEXT", "glFramebufferTexture1DOES", validContext);
|
||||
setGLExtensionFuncPtr(glFramebufferTexture2D, "glFramebufferTexture2D", "glFramebufferTexture2DEXT", "glFramebufferTexture2DOES", validContext);
|
||||
setGLExtensionFuncPtr(glFramebufferTexture2DMultisample, "glFramebufferTexture2DMultisample", "glFramebufferTexture2DMultisampleEXT", validContext);
|
||||
setGLExtensionFuncPtr(glFramebufferTexture3D, "glFramebufferTexture3D", "glFramebufferTexture3DEXT", "glFramebufferTexture3DOES", validContext);
|
||||
setGLExtensionFuncPtr(glFramebufferTexture, "glFramebufferTexture", "glFramebufferTextureEXT", "glFramebufferTextureOES", validContext);
|
||||
setGLExtensionFuncPtr(glFramebufferTextureLayer, "glFramebufferTextureLayer", "glFramebufferTextureLayerEXT", "glFramebufferTextureLayerOES", validContext);
|
||||
@@ -1109,6 +1109,7 @@ GLExtensions::GLExtensions(unsigned int in_contextID):
|
||||
|
||||
setGLExtensionFuncPtr(glGenerateMipmap, "glGenerateMipmap", "glGenerateMipmapEXT", "glGenerateMipmapOES", validContext);
|
||||
setGLExtensionFuncPtr(glBlitFramebuffer, "glBlitFramebuffer", "glBlitFramebufferEXT", "glBlitFramebufferOES", validContext);
|
||||
setGLExtensionFuncPtr(glInvalidateFramebuffer, "glInvalidateFramebuffer", "glInvalidateFramebufferEXT", validContext);
|
||||
setGLExtensionFuncPtr(glGetRenderbufferParameteriv, "glGetRenderbufferParameteriv", "glGetRenderbufferParameterivEXT", "glGetRenderbufferParameterivOES", validContext);
|
||||
|
||||
|
||||
@@ -1284,6 +1285,13 @@ GLExtensions::GLExtensions(unsigned int in_contextID):
|
||||
|
||||
}
|
||||
|
||||
GLExtensions::~GLExtensions()
|
||||
{
|
||||
// Remove s_gl*List
|
||||
s_glExtensionSetList[contextID] = ExtensionSet();
|
||||
s_glRendererList[contextID] = std::string();
|
||||
s_glInitializedList[contextID] = 0;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++-friendly convenience methods
|
||||
|
||||
@@ -62,12 +62,10 @@ GraphicsObjectManager::GraphicsObjectManager(const std::string& name, unsigned i
|
||||
_name(name),
|
||||
_contextID(contextID)
|
||||
{
|
||||
OSG_INFO<<_name<<"::"<<_name<<"()"<<this<<std::endl;
|
||||
}
|
||||
|
||||
GraphicsObjectManager::~GraphicsObjectManager()
|
||||
{
|
||||
OSG_INFO<<_name<<"::~"<<_name<<"()"<<this<<std::endl;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -82,8 +82,17 @@ Geometry::Geometry(const Geometry& geometry,const CopyOp& copyop):
|
||||
|
||||
Geometry::~Geometry()
|
||||
{
|
||||
_stateset = 0;
|
||||
Geometry::releaseGLObjects();
|
||||
// clean up display lists if assigned, and use the GLObjectSizeHint() while prior to it being invalidated by the automatic clean up of arrays that will invalidate the getGLObjectSizeHint() value.
|
||||
#ifdef OSG_GL_DISPLAYLISTS_AVAILABLE
|
||||
for(unsigned int i=0;i<_globjList.size();++i)
|
||||
{
|
||||
if (_globjList[i] != 0)
|
||||
{
|
||||
Drawable::deleteDisplayList(i,_globjList[i], getGLObjectSizeHint());
|
||||
_globjList[i] = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#define ARRAY_NOT_EMPTY(array) (array!=0 && array->getNumElements()!=0)
|
||||
|
||||
@@ -438,7 +438,7 @@ bool GraphicsContext::realize()
|
||||
|
||||
void GraphicsContext::close(bool callCloseImplementation)
|
||||
{
|
||||
OSG_INFO<<"close("<<callCloseImplementation<<")"<<this<<std::endl;
|
||||
OSG_INFO<<"GraphicsContext::close("<<callCloseImplementation<<")"<<this<<std::endl;
|
||||
|
||||
// switch off the graphics thread...
|
||||
setGraphicsThread(0);
|
||||
@@ -526,7 +526,7 @@ void GraphicsContext::close(bool callCloseImplementation)
|
||||
|
||||
bool GraphicsContext::makeCurrent()
|
||||
{
|
||||
_threadOfLastMakeCurrent = OpenThreads::Thread::CurrentThread();
|
||||
_threadOfLastMakeCurrent = OpenThreads::Thread::CurrentThreadId();
|
||||
|
||||
bool result = makeCurrentImplementation();
|
||||
|
||||
@@ -546,7 +546,7 @@ bool GraphicsContext::makeContextCurrent(GraphicsContext* readContext)
|
||||
|
||||
if (result)
|
||||
{
|
||||
_threadOfLastMakeCurrent = OpenThreads::Thread::CurrentThread();
|
||||
_threadOfLastMakeCurrent = OpenThreads::Thread::CurrentThreadId();
|
||||
|
||||
// initialize extension process, not only initializes on first
|
||||
// call, will be a non-op on subsequent calls.
|
||||
@@ -560,7 +560,7 @@ bool GraphicsContext::releaseContext()
|
||||
{
|
||||
bool result = releaseContextImplementation();
|
||||
|
||||
_threadOfLastMakeCurrent = (OpenThreads::Thread*)(-1);
|
||||
_threadOfLastMakeCurrent = 0;
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -573,7 +573,7 @@ void GraphicsContext::swapBuffers()
|
||||
clear();
|
||||
}
|
||||
else if (_graphicsThread.valid() &&
|
||||
_threadOfLastMakeCurrent == _graphicsThread.get())
|
||||
_threadOfLastMakeCurrent == _graphicsThread->getThreadId())
|
||||
{
|
||||
_graphicsThread->add(new SwapBuffersOperation);
|
||||
}
|
||||
|
||||
@@ -356,14 +356,58 @@ GLenum Image::computePixelFormat(GLenum format)
|
||||
case(GL_LUMINANCE_ALPHA32F_ARB):
|
||||
return GL_LUMINANCE_ALPHA;
|
||||
|
||||
case (GL_R16F):
|
||||
case (GL_R32F):
|
||||
case (GL_R8):
|
||||
case (GL_R8_SNORM):
|
||||
case (GL_R16):
|
||||
case (GL_R16_SNORM):
|
||||
return GL_RED;
|
||||
|
||||
case (GL_R8I):
|
||||
case (GL_R8UI):
|
||||
case (GL_R16I):
|
||||
case (GL_R16UI):
|
||||
case (GL_R32I):
|
||||
case (GL_R32UI):
|
||||
return GL_RED_INTEGER_EXT;
|
||||
|
||||
case (GL_RG16F):
|
||||
case (GL_RG32F):
|
||||
case (GL_RG8):
|
||||
case (GL_RG8_SNORM):
|
||||
case (GL_RG16):
|
||||
case (GL_RG16_SNORM):
|
||||
return GL_RG;
|
||||
|
||||
case (GL_RG8I):
|
||||
case (GL_RG8UI):
|
||||
case (GL_RG16I):
|
||||
case (GL_RG16UI):
|
||||
case (GL_RG32I):
|
||||
case (GL_RG32UI):
|
||||
return GL_RG_INTEGER;
|
||||
|
||||
case(GL_RGB32F_ARB):
|
||||
case(GL_RGB16F_ARB):
|
||||
case(GL_R3_G3_B2):
|
||||
case(GL_RGB4):
|
||||
case(GL_RGB5):
|
||||
case(GL_RGB8):
|
||||
case(GL_RGB8_SNORM):
|
||||
case(GL_RGB10):
|
||||
case(GL_RGB12):
|
||||
case(GL_SRGB8):
|
||||
return GL_RGB;
|
||||
|
||||
case(GL_RGBA8):
|
||||
case(GL_RGBA16):
|
||||
case(GL_RGBA32F_ARB):
|
||||
case(GL_RGBA16F_ARB):
|
||||
case(GL_RGBA8_SNORM):
|
||||
case(GL_RGB10_A2):
|
||||
case(GL_RGBA12):
|
||||
case(GL_SRGB8_ALPHA8):
|
||||
return GL_RGBA;
|
||||
|
||||
case(GL_ALPHA8I_EXT):
|
||||
@@ -535,9 +579,31 @@ unsigned int Image::computeNumComponents(GLenum pixelFormat)
|
||||
case(GL_ALPHA32UI_EXT): return 1;
|
||||
case(GL_ALPHA16F_ARB): return 1;
|
||||
case(GL_ALPHA32F_ARB): return 1;
|
||||
case(GL_R16F): return 1;
|
||||
case(GL_R32F): return 1;
|
||||
case(GL_R8): return 1;
|
||||
case(GL_R8_SNORM): return 1;
|
||||
case(GL_R16): return 1;
|
||||
case(GL_R16_SNORM): return 1;
|
||||
case(GL_R8I): return 1;
|
||||
case(GL_R8UI): return 1;
|
||||
case(GL_R16I): return 1;
|
||||
case(GL_R16UI): return 1;
|
||||
case(GL_R32I): return 1;
|
||||
case(GL_R32UI): return 1;
|
||||
case(GL_RG): return 2;
|
||||
case(GL_RG16F): return 2;
|
||||
case(GL_RG32F): return 2;
|
||||
case(GL_RG8): return 2;
|
||||
case(GL_RG8_SNORM): return 2;
|
||||
case(GL_RG16): return 2;
|
||||
case(GL_RG16_SNORM): return 2;
|
||||
case(GL_RG8I): return 2;
|
||||
case(GL_RG8UI): return 2;
|
||||
case(GL_RG16I): return 2;
|
||||
case(GL_RG16UI): return 2;
|
||||
case(GL_RG32I): return 2;
|
||||
case(GL_RG32UI): return 2;
|
||||
case(GL_RGB): return 3;
|
||||
case(GL_BGR): return 3;
|
||||
case(GL_RGB8I_EXT): return 3;
|
||||
@@ -1630,11 +1696,11 @@ void Image::copySubImage(int s_offset, int t_offset, int r_offset, const osg::Im
|
||||
}
|
||||
unsigned int rowWidthInBlocks = (_s + footprint.x() - 1) / footprint.x();
|
||||
unsigned int blockSize = computeBlockSize(_pixelFormat, 0);
|
||||
data_destination = _data + blockSize * (rowWidthInBlocks * t_offset + (s_offset / footprint.x()));
|
||||
data_destination = _data + blockSize * (rowWidthInBlocks * (t_offset / footprint.y()) + (s_offset / footprint.x()));
|
||||
unsigned int copy_width = (osg::minimum(source->s(), _s - s_offset) + footprint.x() - 1) / footprint.x();
|
||||
unsigned int copy_height = (osg::minimum(source->t(), _t - t_offset) + footprint.y() - 1) / footprint.y();
|
||||
unsigned int dstRowStep = blockSize * rowWidthInBlocks;
|
||||
unsigned int srcRowStep = blockSize * (source->_s + footprint.x() - 1) / footprint.x();
|
||||
unsigned int srcRowStep = blockSize * ((source->_s + footprint.x() - 1) / footprint.x());
|
||||
const unsigned char* data_source = source->data(0, 0, 0);
|
||||
for (unsigned int row = 0; row < copy_height; row += 1) { //copy blocks in a row, footprint.y() rows at a time
|
||||
memcpy(data_destination, data_source, copy_width * blockSize);
|
||||
|
||||
@@ -747,18 +747,22 @@ bool Matrix_implementation::transpose(const Matrix_implementation&mat){
|
||||
Matrix_implementation tm(mat);
|
||||
return transpose(tm);
|
||||
}
|
||||
_mat[0][0]=mat._mat[0][0];
|
||||
_mat[0][1]=mat._mat[1][0];
|
||||
_mat[0][2]=mat._mat[2][0];
|
||||
_mat[0][3]=mat._mat[3][0];
|
||||
_mat[1][0]=mat._mat[0][1];
|
||||
_mat[1][1]=mat._mat[1][1];
|
||||
_mat[1][2]=mat._mat[2][1];
|
||||
_mat[1][3]=mat._mat[3][1];
|
||||
_mat[2][0]=mat._mat[0][2];
|
||||
_mat[2][1]=mat._mat[1][2];
|
||||
_mat[2][2]=mat._mat[2][2];
|
||||
_mat[2][3]=mat._mat[3][2];
|
||||
_mat[3][0]=mat._mat[0][3];
|
||||
_mat[3][1]=mat._mat[1][3];
|
||||
_mat[3][2]=mat._mat[2][3];
|
||||
_mat[3][3]=mat._mat[3][3];
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -767,12 +771,15 @@ bool Matrix_implementation::transpose3x3(const Matrix_implementation&mat){
|
||||
Matrix_implementation tm(mat);
|
||||
return transpose3x3(tm);
|
||||
}
|
||||
_mat[0][0]=mat._mat[0][0];
|
||||
_mat[0][1]=mat._mat[1][0];
|
||||
_mat[0][2]=mat._mat[2][0];
|
||||
_mat[1][0]=mat._mat[0][1];
|
||||
_mat[1][1]=mat._mat[1][1];
|
||||
_mat[1][2]=mat._mat[2][1];
|
||||
_mat[2][0]=mat._mat[0][2];
|
||||
_mat[2][1]=mat._mat[1][2];
|
||||
_mat[2][2]=mat._mat[2][2];
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -48,6 +48,36 @@
|
||||
namespace osg
|
||||
{
|
||||
|
||||
QueryGeometry* createDefaultQueryGeometry( const std::string& name )
|
||||
{
|
||||
GLushort indices[] = { 0, 1, 2, 3, 4, 5, 6, 7,
|
||||
0, 3, 6, 5, 2, 1, 4, 7,
|
||||
5, 4, 1, 0, 2, 7, 6, 3 };
|
||||
|
||||
ref_ptr<QueryGeometry> geom = new QueryGeometry( name );
|
||||
geom->setDataVariance( Object::DYNAMIC );
|
||||
geom->addPrimitiveSet( new DrawElementsUShort( PrimitiveSet::QUADS, 24, indices ) );
|
||||
|
||||
return geom.release();
|
||||
}
|
||||
|
||||
Geometry* createDefaultDebugQueryGeometry()
|
||||
{
|
||||
GLushort indices[] = { 0, 1, 2, 3, 4, 5, 6, 7,
|
||||
0, 3, 6, 5, 2, 1, 4, 7,
|
||||
5, 4, 1, 0, 2, 7, 6, 3 };
|
||||
|
||||
ref_ptr<Vec4Array> ca = new Vec4Array;
|
||||
ca->push_back( Vec4( 1.f, 1.f, 1.f, 1.f ) );
|
||||
|
||||
ref_ptr<Geometry> geom = new Geometry;
|
||||
geom->setDataVariance( Object::DYNAMIC );
|
||||
geom->setColorArray( ca.get(), Array::BIND_OVERALL );
|
||||
geom->addPrimitiveSet( new DrawElementsUShort( PrimitiveSet::QUADS, 24, indices ) );
|
||||
|
||||
return geom.release();
|
||||
}
|
||||
|
||||
// Create and return a StateSet appropriate for performing an occlusion
|
||||
// query test (disable lighting, texture mapping, etc). Probably some
|
||||
// room for improvement here. Could disable shaders, for example.
|
||||
@@ -364,9 +394,7 @@ QueryGeometry::drawImplementation( osg::RenderInfo& renderInfo ) const
|
||||
|
||||
}
|
||||
|
||||
|
||||
unsigned int
|
||||
QueryGeometry::getNumPixels( const osg::Camera* cam )
|
||||
QueryGeometry::QueryResult QueryGeometry::getQueryResult( const osg::Camera* cam ) const
|
||||
{
|
||||
osg::ref_ptr<osg::TestResult> tr;
|
||||
{
|
||||
@@ -378,13 +406,20 @@ QueryGeometry::getNumPixels( const osg::Camera* cam )
|
||||
_results[ cam ] = tr;
|
||||
}
|
||||
}
|
||||
return tr->_numPixels;
|
||||
return QueryResult((tr->_init && !tr->_active), tr->_numPixels);
|
||||
}
|
||||
|
||||
unsigned int
|
||||
QueryGeometry::getNumPixels( const osg::Camera* cam ) const
|
||||
{
|
||||
return getQueryResult(cam).numPixels;
|
||||
}
|
||||
|
||||
void
|
||||
QueryGeometry::releaseGLObjects( osg::State* state ) const
|
||||
{
|
||||
Geometry::releaseGLObjects(state);
|
||||
|
||||
if (!state)
|
||||
{
|
||||
// delete all query IDs for all contexts.
|
||||
@@ -437,6 +472,7 @@ QueryGeometry::discardDeletedQueryObjects( unsigned int contextID )
|
||||
|
||||
OcclusionQueryNode::OcclusionQueryNode()
|
||||
: _enabled( true ),
|
||||
_queryGeometryState( INVALID ),
|
||||
_passed(false),
|
||||
_visThreshold( 500 ),
|
||||
_queryFrameCount( 5 ),
|
||||
@@ -454,6 +490,7 @@ OcclusionQueryNode::~OcclusionQueryNode()
|
||||
|
||||
OcclusionQueryNode::OcclusionQueryNode( const OcclusionQueryNode& oqn, const CopyOp& copyop )
|
||||
: Group( oqn, copyop ),
|
||||
_queryGeometryState( INVALID ),
|
||||
_passed( false )
|
||||
{
|
||||
_enabled = oqn._enabled;
|
||||
@@ -469,9 +506,27 @@ OcclusionQueryNode::OcclusionQueryNode( const OcclusionQueryNode& oqn, const Cop
|
||||
bool OcclusionQueryNode::getPassed( const Camera* camera, NodeVisitor& nv )
|
||||
{
|
||||
if ( !_enabled )
|
||||
{
|
||||
// Queries are not enabled. The caller should be osgUtil::CullVisitor,
|
||||
// return true to traverse the subgraphs.
|
||||
return true;
|
||||
_passed = true;
|
||||
return _passed;
|
||||
}
|
||||
|
||||
QueryGeometry* qg = static_cast< QueryGeometry* >( _queryGeode->getDrawable( 0 ) );
|
||||
|
||||
if ( !isQueryGeometryValid() )
|
||||
{
|
||||
// There're cases that the occlusion test result has been retrieved
|
||||
// after the query geometry has been changed, it's the result of the
|
||||
// geometry before the change.
|
||||
qg->reset();
|
||||
|
||||
// The box of the query geometry is invalid, return false to not traverse
|
||||
// the subgraphs.
|
||||
_passed = false;
|
||||
return _passed;
|
||||
}
|
||||
|
||||
{
|
||||
// Two situations where we want to simply do a regular traversal:
|
||||
@@ -482,16 +537,19 @@ bool OcclusionQueryNode::getPassed( const Camera* camera, NodeVisitor& nv )
|
||||
const unsigned int& lastQueryFrame( _frameCountMap[ camera ] );
|
||||
if( ( lastQueryFrame == 0 ) ||
|
||||
( (nv.getTraversalNumber() - lastQueryFrame) > (_queryFrameCount + 1) ) )
|
||||
return true;
|
||||
{
|
||||
_passed = true;
|
||||
return _passed;
|
||||
}
|
||||
}
|
||||
|
||||
if (_queryGeode->getDrawable( 0 ) == NULL)
|
||||
{
|
||||
OSG_FATAL << "osgOQ: OcclusionQueryNode: No QueryGeometry." << std::endl;
|
||||
// Something's broke. Return true so we at least render correctly.
|
||||
return true;
|
||||
_passed = true;
|
||||
return _passed;
|
||||
}
|
||||
QueryGeometry* qg = static_cast< QueryGeometry* >( _queryGeode->getDrawable( 0 ) );
|
||||
|
||||
// Get the near plane for the upcoming distance calculation.
|
||||
osg::Matrix::value_type nearPlane;
|
||||
@@ -511,8 +569,16 @@ bool OcclusionQueryNode::getPassed( const Camera* camera, NodeVisitor& nv )
|
||||
_passed = ( distance <= 0.0 );
|
||||
if (!_passed)
|
||||
{
|
||||
int result = qg->getNumPixels( camera );
|
||||
_passed = ( (unsigned int)(result) > _visThreshold );
|
||||
QueryGeometry::QueryResult result = qg->getQueryResult( camera );
|
||||
if (!result.valid)
|
||||
{
|
||||
// The query hasn't finished yet and the result still
|
||||
// isn't available, return true to traverse the subgraphs.
|
||||
_passed = true;
|
||||
return _passed;
|
||||
}
|
||||
|
||||
_passed = ( result.numPixels > _visThreshold );
|
||||
}
|
||||
|
||||
return _passed;
|
||||
@@ -520,6 +586,9 @@ bool OcclusionQueryNode::getPassed( const Camera* camera, NodeVisitor& nv )
|
||||
|
||||
void OcclusionQueryNode::traverseQuery( const Camera* camera, NodeVisitor& nv )
|
||||
{
|
||||
if (!isQueryGeometryValid() || !_enabled)
|
||||
return;
|
||||
|
||||
bool issueQuery;
|
||||
{
|
||||
const int curFrame = nv.getTraversalNumber();
|
||||
@@ -536,9 +605,11 @@ void OcclusionQueryNode::traverseQuery( const Camera* camera, NodeVisitor& nv )
|
||||
|
||||
void OcclusionQueryNode::traverseDebug( NodeVisitor& nv )
|
||||
{
|
||||
if (_debugBB)
|
||||
if (_debugBB && _enabled)
|
||||
{
|
||||
// If requested, display the debug geometry
|
||||
_debugGeode->accept( nv );
|
||||
}
|
||||
}
|
||||
|
||||
BoundingSphere OcclusionQueryNode::computeBound() const
|
||||
@@ -549,31 +620,13 @@ BoundingSphere OcclusionQueryNode::computeBound() const
|
||||
// an application thread or by a non-osgViewer application.
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> lock( _computeBoundMutex ) ;
|
||||
|
||||
// This is the logical place to put this code, but the method is const. Cast
|
||||
// away constness to compute the bounding box and modify the query geometry.
|
||||
osg::OcclusionQueryNode* nonConstThis = const_cast<osg::OcclusionQueryNode*>( this );
|
||||
|
||||
|
||||
ComputeBoundsVisitor cbv;
|
||||
nonConstThis->accept( cbv );
|
||||
BoundingBox bb = cbv.getBoundingBox();
|
||||
|
||||
osg::ref_ptr<Vec3Array> v = new Vec3Array;
|
||||
v->resize( 8 );
|
||||
(*v)[0] = Vec3( bb._min.x(), bb._min.y(), bb._min.z() );
|
||||
(*v)[1] = Vec3( bb._max.x(), bb._min.y(), bb._min.z() );
|
||||
(*v)[2] = Vec3( bb._max.x(), bb._min.y(), bb._max.z() );
|
||||
(*v)[3] = Vec3( bb._min.x(), bb._min.y(), bb._max.z() );
|
||||
(*v)[4] = Vec3( bb._max.x(), bb._max.y(), bb._min.z() );
|
||||
(*v)[5] = Vec3( bb._min.x(), bb._max.y(), bb._min.z() );
|
||||
(*v)[6] = Vec3( bb._min.x(), bb._max.y(), bb._max.z() );
|
||||
(*v)[7] = Vec3( bb._max.x(), bb._max.y(), bb._max.z() );
|
||||
|
||||
Geometry* geom = static_cast< Geometry* >( nonConstThis->_queryGeode->getDrawable( 0 ) );
|
||||
geom->setVertexArray( v.get() );
|
||||
|
||||
geom = static_cast< osg::Geometry* >( nonConstThis->_debugGeode->getDrawable( 0 ) );
|
||||
geom->setVertexArray( v.get() );
|
||||
if (_queryGeometryState != USER_DEFINED)
|
||||
{
|
||||
// This is the logical place to put this code, but the method is const. Cast
|
||||
// away constness to compute the bounding box and modify the query geometry.
|
||||
osg::OcclusionQueryNode* nonConstThis = const_cast<osg::OcclusionQueryNode*>( this );
|
||||
nonConstThis->updateDefaultQueryGeometry();
|
||||
}
|
||||
}
|
||||
|
||||
return Group::computeBound();
|
||||
@@ -586,6 +639,12 @@ void OcclusionQueryNode::setQueriesEnabled( bool enable )
|
||||
_enabled = enable;
|
||||
}
|
||||
|
||||
void OcclusionQueryNode::resetQueries()
|
||||
{
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> lock( _frameCountMutex );
|
||||
_frameCountMap.clear();
|
||||
}
|
||||
|
||||
// Should only be called outside of cull/draw. No thread issues.
|
||||
void OcclusionQueryNode::setDebugDisplay( bool debug )
|
||||
{
|
||||
@@ -665,21 +724,12 @@ bool OcclusionQueryNode::getPassed() const
|
||||
|
||||
void OcclusionQueryNode::createSupportNodes()
|
||||
{
|
||||
GLushort indices[] = { 0, 1, 2, 3, 4, 5, 6, 7,
|
||||
0, 3, 6, 5, 2, 1, 4, 7,
|
||||
5, 4, 1, 0, 2, 7, 6, 3 };
|
||||
|
||||
{
|
||||
// Add the test geometry Geode
|
||||
_queryGeode = new Geode;
|
||||
_queryGeode->setName( "OQTest" );
|
||||
_queryGeode->setDataVariance( Object::DYNAMIC );
|
||||
|
||||
ref_ptr< QueryGeometry > geom = new QueryGeometry( getName() );
|
||||
geom->setDataVariance( Object::DYNAMIC );
|
||||
geom->addPrimitiveSet( new DrawElementsUShort( PrimitiveSet::QUADS, 24, indices ) );
|
||||
|
||||
_queryGeode->addDrawable( geom.get() );
|
||||
_queryGeode->addDrawable( createDefaultQueryGeometry( getName() ) );
|
||||
}
|
||||
|
||||
{
|
||||
@@ -688,17 +738,7 @@ void OcclusionQueryNode::createSupportNodes()
|
||||
_debugGeode = new Geode;
|
||||
_debugGeode->setName( "Debug" );
|
||||
_debugGeode->setDataVariance( Object::DYNAMIC );
|
||||
|
||||
ref_ptr<Geometry> geom = new Geometry;
|
||||
geom->setDataVariance( Object::DYNAMIC );
|
||||
|
||||
ref_ptr<Vec4Array> ca = new Vec4Array;
|
||||
ca->push_back( Vec4( 1.f, 1.f, 1.f, 1.f ) );
|
||||
geom->setColorArray( ca.get(), Array::BIND_OVERALL );
|
||||
|
||||
geom->addPrimitiveSet( new DrawElementsUShort( PrimitiveSet::QUADS, 24, indices ) );
|
||||
|
||||
_debugGeode->addDrawable( geom.get() );
|
||||
_debugGeode->addDrawable( createDefaultDebugQueryGeometry() );
|
||||
}
|
||||
|
||||
// Creste state sets. Note that the osgOQ visitors (which place OQNs throughout
|
||||
@@ -709,6 +749,69 @@ void OcclusionQueryNode::createSupportNodes()
|
||||
}
|
||||
|
||||
|
||||
void OcclusionQueryNode::setQueryGeometryInternal( QueryGeometry* queryGeom,
|
||||
Geometry* debugQueryGeom,
|
||||
QueryGeometryState state )
|
||||
{
|
||||
if (!queryGeom || !debugQueryGeom)
|
||||
{
|
||||
OSG_FATAL << "osgOQ: OcclusionQueryNode: No QueryGeometry." << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
_queryGeometryState = state;
|
||||
|
||||
_queryGeode->removeDrawables(0, _queryGeode->getNumDrawables());
|
||||
_queryGeode->addDrawable(queryGeom);
|
||||
|
||||
_debugGeode->removeDrawables(0, _debugGeode->getNumDrawables());
|
||||
_debugGeode->addDrawable(debugQueryGeom);
|
||||
}
|
||||
|
||||
|
||||
void OcclusionQueryNode::updateDefaultQueryGeometry()
|
||||
{
|
||||
if (_queryGeometryState == USER_DEFINED)
|
||||
{
|
||||
OSG_FATAL << "osgOQ: OcclusionQueryNode: Unexpected QueryGeometryState=USER_DEFINED." << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
ComputeBoundsVisitor cbv;
|
||||
accept( cbv );
|
||||
|
||||
BoundingBox bb = cbv.getBoundingBox();
|
||||
const bool bbValid = bb.valid();
|
||||
_queryGeometryState = bbValid ? VALID : INVALID;
|
||||
|
||||
osg::ref_ptr<Vec3Array> v = new Vec3Array;
|
||||
v->resize( 8 );
|
||||
|
||||
// Having (0,0,0) as vertices for the case of the invalid query geometry
|
||||
// still isn't quite the right thing. But the query geometry is public
|
||||
// accessible and therefore a user might expect eight vertices, so
|
||||
// it seems safer to keep eight vertices in the geometry.
|
||||
|
||||
if (bbValid)
|
||||
{
|
||||
(*v)[0] = Vec3( bb._min.x(), bb._min.y(), bb._min.z() );
|
||||
(*v)[1] = Vec3( bb._max.x(), bb._min.y(), bb._min.z() );
|
||||
(*v)[2] = Vec3( bb._max.x(), bb._min.y(), bb._max.z() );
|
||||
(*v)[3] = Vec3( bb._min.x(), bb._min.y(), bb._max.z() );
|
||||
(*v)[4] = Vec3( bb._max.x(), bb._max.y(), bb._min.z() );
|
||||
(*v)[5] = Vec3( bb._min.x(), bb._max.y(), bb._min.z() );
|
||||
(*v)[6] = Vec3( bb._min.x(), bb._max.y(), bb._max.z() );
|
||||
(*v)[7] = Vec3( bb._max.x(), bb._max.y(), bb._max.z() );
|
||||
}
|
||||
|
||||
Geometry* geom = static_cast< Geometry* >( _queryGeode->getDrawable( 0 ) );
|
||||
geom->setVertexArray( v.get() );
|
||||
|
||||
geom = static_cast< osg::Geometry* >( _debugGeode->getDrawable( 0 ) );
|
||||
geom->setVertexArray( v.get() );
|
||||
}
|
||||
|
||||
|
||||
void OcclusionQueryNode::releaseGLObjects( State* state ) const
|
||||
{
|
||||
if (_queryGeode.valid()) _queryGeode->releaseGLObjects(state);
|
||||
@@ -729,14 +832,22 @@ void OcclusionQueryNode::discardDeletedQueryObjects( unsigned int contextID )
|
||||
QueryGeometry::discardDeletedQueryObjects( contextID );
|
||||
}
|
||||
|
||||
osg::QueryGeometry* OcclusionQueryNode::getQueryGeometry()
|
||||
void OcclusionQueryNode::setQueryGeometry( QueryGeometry* geom )
|
||||
{
|
||||
if (_queryGeode && _queryGeode->getDrawable( 0 ))
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> lock( _computeBoundMutex ) ;
|
||||
|
||||
if (geom)
|
||||
{
|
||||
QueryGeometry* qg = static_cast< QueryGeometry* >( _queryGeode->getDrawable( 0 ) );
|
||||
return qg;
|
||||
setQueryGeometryInternal( geom, geom, USER_DEFINED );
|
||||
}
|
||||
else
|
||||
{
|
||||
setQueryGeometryInternal( createDefaultQueryGeometry( getName() ),
|
||||
createDefaultDebugQueryGeometry(),
|
||||
INVALID);
|
||||
|
||||
updateDefaultQueryGeometry();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
const osg::QueryGeometry* OcclusionQueryNode::getQueryGeometry() const
|
||||
|
||||
@@ -2752,7 +2752,7 @@ Texture::GenerateMipmapMode Texture::mipmapBeforeTexImage(const State& state, bo
|
||||
if (useGenerateMipMap) return GENERATE_MIPMAP;
|
||||
}
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
|
||||
glTexParameteri(getTextureTarget(), GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
|
||||
return GENERATE_MIPMAP_TEX_PARAMETER;
|
||||
#endif
|
||||
}
|
||||
@@ -2775,7 +2775,7 @@ void Texture::mipmapAfterTexImage(State& state, GenerateMipmapMode beforeResult)
|
||||
break;
|
||||
}
|
||||
case GENERATE_MIPMAP_TEX_PARAMETER:
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_FALSE);
|
||||
glTexParameteri(getTextureTarget(), GL_GENERATE_MIPMAP_SGIS, GL_FALSE);
|
||||
break;
|
||||
case GENERATE_MIPMAP_NONE:
|
||||
break;
|
||||
|
||||
@@ -123,7 +123,7 @@ void Uniform::setNumElements( unsigned int numElements )
|
||||
void Uniform::allocateDataArray()
|
||||
{
|
||||
// if one array is already allocated, the job is done.
|
||||
if( _floatArray.valid() || _doubleArray.valid() || _intArray.valid() || _uintArray.valid() ) return;
|
||||
if( _floatArray.valid() || _doubleArray.valid() || _intArray.valid() || _uintArray.valid() || _int64Array.valid() || _uint64Array.valid()) return;
|
||||
|
||||
// array cannot be created until _type and _numElements are specified
|
||||
int arrayNumElements = getInternalArrayNumElements();
|
||||
@@ -147,6 +147,14 @@ void Uniform::allocateDataArray()
|
||||
_uintArray = new UIntArray(arrayNumElements);
|
||||
return;
|
||||
|
||||
case GL_INT64_ARB:
|
||||
_int64Array = new Int64Array(arrayNumElements);
|
||||
return;
|
||||
|
||||
case GL_UNSIGNED_INT64_ARB:
|
||||
_uint64Array = new UInt64Array(arrayNumElements);
|
||||
return;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -241,7 +249,7 @@ bool Uniform::setArray( UInt64Array* array )
|
||||
if( !array ) return false;
|
||||
|
||||
// incoming array must match configuration of the Uniform
|
||||
if( getInternalArrayType(getType())!=GL_UNSIGNED_INT || getInternalArrayNumElements()!=array->getNumElements() )
|
||||
if( getInternalArrayType(getType())!=GL_UNSIGNED_INT64_ARB || getInternalArrayNumElements()!=array->getNumElements() )
|
||||
{
|
||||
OSG_WARN << "Uniform::setArray : incompatible array" << std::endl;
|
||||
return false;
|
||||
@@ -262,7 +270,7 @@ bool Uniform::setArray( Int64Array* array )
|
||||
if( !array ) return false;
|
||||
|
||||
// incoming array must match configuration of the Uniform
|
||||
if( getInternalArrayType(getType())!=GL_UNSIGNED_INT || getInternalArrayNumElements()!=array->getNumElements() )
|
||||
if( getInternalArrayType(getType())!=GL_UNSIGNED_INT64_ARB || getInternalArrayNumElements()!=array->getNumElements() )
|
||||
{
|
||||
OSG_WARN << "Uniform::setArray : incompatible array" << std::endl;
|
||||
return false;
|
||||
|
||||
@@ -488,7 +488,7 @@ struct VertexAttribArrayDispatch : public VertexArrayState::ArrayDispatch
|
||||
virtual void enable_and_dispatch(osg::State& state, GLint size, GLenum type, GLsizei stride, const GLvoid *ptr, GLboolean normalized)
|
||||
{
|
||||
GLExtensions* ext = state.get<GLExtensions>();
|
||||
|
||||
|
||||
ext->glEnableVertexAttribArray( unit );
|
||||
ext->glVertexAttribPointer(static_cast<GLuint>(unit), size, type, normalized, stride, ptr);
|
||||
}
|
||||
@@ -526,10 +526,19 @@ VertexArrayState::VertexArrayState(osg::State* state):
|
||||
_currentEBO(0),
|
||||
_requiresSetArrays(true)
|
||||
{
|
||||
_stateObserverSet = _state->getOrCreateObserverSet();
|
||||
_ext = _state->get<GLExtensions>();
|
||||
_isVertexBufferObjectSupported = _ext->isBufferObjectSupported;
|
||||
}
|
||||
|
||||
VertexArrayState::~VertexArrayState()
|
||||
{
|
||||
if (_stateObserverSet->getObserverdObject())
|
||||
{
|
||||
_state->resetCurrentVertexArrayStateOnMatch(this);
|
||||
}
|
||||
}
|
||||
|
||||
void VertexArrayState::generateVertexArrayObject()
|
||||
{
|
||||
_ext->glGenVertexArrays(1, &_vertexArrayObject);
|
||||
@@ -539,10 +548,10 @@ void VertexArrayState::deleteVertexArrayObject()
|
||||
{
|
||||
if (_vertexArrayObject)
|
||||
{
|
||||
VAS_NOTICE<<" VertexArrayState::deleteVertexArrayObject() "<<_vertexArrayObject<<std::endl;
|
||||
VAS_NOTICE<<" VertexArrayState::deleteVertexArrayObject() "<<_vertexArrayObject<<" "<<_stateObserverSet->getObserverdObject()<<std::endl;
|
||||
|
||||
_ext->glDeleteVertexArrays(1, &_vertexArrayObject);
|
||||
_vertexArrayObject = 0;
|
||||
//_vertexArrayObject = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -553,7 +562,19 @@ bool VertexArrayState::correctArrayDispatchAssigned(const ArrayDispatch* ad)
|
||||
#else
|
||||
return ad!=0;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
namespace {
|
||||
VertexArrayState::ArrayDispatch* getOrCreateVertexAttributeDispatch(VertexArrayState::ArrayDispatchList& list, int slot)
|
||||
{
|
||||
list.resize(slot + 1);
|
||||
osg::ref_ptr<VertexArrayState::ArrayDispatch>& ad = list[slot];
|
||||
if (!ad.valid())
|
||||
ad = new VertexAttribArrayDispatch(slot);
|
||||
|
||||
return ad.get();
|
||||
}
|
||||
}// anonymous namespace
|
||||
|
||||
void VertexArrayState::assignVertexArrayDispatcher()
|
||||
{
|
||||
@@ -567,9 +588,9 @@ void VertexArrayState::assignVertexArrayDispatcher()
|
||||
else
|
||||
#endif
|
||||
{
|
||||
if (_vertexArray.valid()) return;
|
||||
VAS_NOTICE<<"VertexArrayState::assignVertexArrayDispatcher() _state->getVertexAlias()._location="<<_state->getVertexAlias()._location<<std::endl;
|
||||
_vertexArray = new VertexAttribArrayDispatch(_state->getVertexAlias()._location);
|
||||
int slot = _state->getVertexAlias()._location;
|
||||
VAS_NOTICE << "VertexArrayState::assignVertexArrayDispatcher() _state->getVertexAlias()._location = " << slot << std::endl;
|
||||
_vertexArray = getOrCreateVertexAttributeDispatch(_vertexAttribArrays, slot);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -585,8 +606,9 @@ void VertexArrayState::assignNormalArrayDispatcher()
|
||||
else
|
||||
#endif
|
||||
{
|
||||
VAS_NOTICE<<"VertexArrayState::assignNormalArrayDispatcher() _state->getNormalAlias()._location="<<_state->getNormalAlias()._location<<std::endl;
|
||||
_normalArray = new VertexAttribArrayDispatch(_state->getNormalAlias()._location);
|
||||
int slot = _state->getNormalAlias()._location;
|
||||
VAS_NOTICE << "VertexArrayState::assignNormalArrayDispatcher() _state->getNormalAlias()._location = " << slot << std::endl;
|
||||
_normalArray = getOrCreateVertexAttributeDispatch(_vertexAttribArrays, slot);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -602,8 +624,9 @@ void VertexArrayState::assignColorArrayDispatcher()
|
||||
else
|
||||
#endif
|
||||
{
|
||||
VAS_NOTICE<<"VertexArrayState::assignColorArrayDispatcher() _state->getColorAlias()._location="<<_state->getColorAlias()._location<<std::endl;
|
||||
_colorArray = new VertexAttribArrayDispatch(_state->getColorAlias()._location);
|
||||
int slot = _state->getColorAlias()._location;
|
||||
VAS_NOTICE << "VertexArrayState::assignColorArrayDispatcher() _state->getColorAlias()._location = " << slot << std::endl;
|
||||
_colorArray = getOrCreateVertexAttributeDispatch(_vertexAttribArrays, slot);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -619,7 +642,9 @@ void VertexArrayState::assignSecondaryColorArrayDispatcher()
|
||||
else
|
||||
#endif
|
||||
{
|
||||
_secondaryColorArray = new VertexAttribArrayDispatch(_state->getSecondaryColorAlias()._location);
|
||||
int slot = _state->getSecondaryColorAlias()._location;
|
||||
VAS_NOTICE << "VertexArrayState::assignSecondaryColorArrayDispatcher() _state->getSecondaryColorAlias()._location = " << slot << std::endl;
|
||||
_secondaryColorArray = getOrCreateVertexAttributeDispatch(_vertexAttribArrays, slot);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -635,7 +660,9 @@ void VertexArrayState::assignFogCoordArrayDispatcher()
|
||||
else
|
||||
#endif
|
||||
{
|
||||
_fogCoordArray = new VertexAttribArrayDispatch(_state->getFogCoordAlias()._location);
|
||||
int slot = _state->getFogCoordAlias()._location;
|
||||
VAS_NOTICE << "VertexArrayState::assignFogCoordArrayDispatcher() _state->getFogCoordAlias()._location = " << slot << std::endl;
|
||||
_fogCoordArray = getOrCreateVertexAttributeDispatch(_vertexAttribArrays, slot);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -655,7 +682,9 @@ void VertexArrayState::assignTexCoordArrayDispatcher(unsigned int numUnits)
|
||||
else
|
||||
#endif
|
||||
{
|
||||
_texCoordArrays[i] = new VertexAttribArrayDispatch(_state->getTexCoordAliasList()[i]._location);
|
||||
int slot = _state->getTexCoordAliasList()[i]._location;
|
||||
VAS_NOTICE << "VertexArrayState::assignTexCoordArrayDispatcher() _state->getTexCoordAliasList()[" << i << "]._location = " << slot << std::endl;
|
||||
_texCoordArrays[i] = getOrCreateVertexAttributeDispatch(_vertexAttribArrays, slot);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -677,13 +706,14 @@ void VertexArrayState::assignAllDispatchers()
|
||||
unsigned int numUnits = 8;
|
||||
unsigned int numVertexAttrib = 16;
|
||||
|
||||
assignVertexAttribArrayDispatcher(numVertexAttrib);
|
||||
|
||||
assignVertexArrayDispatcher();
|
||||
assignNormalArrayDispatcher();
|
||||
assignColorArrayDispatcher();
|
||||
assignSecondaryColorArrayDispatcher();
|
||||
assignFogCoordArrayDispatcher();
|
||||
assignTexCoordArrayDispatcher(numUnits);
|
||||
assignVertexAttribArrayDispatcher(numVertexAttrib);
|
||||
}
|
||||
|
||||
void VertexArrayState::release()
|
||||
|
||||
@@ -222,3 +222,26 @@ unsigned int View::findSlaveIndexForCamera(osg::Camera* camera) const
|
||||
return _slaves.size();
|
||||
}
|
||||
|
||||
void View::resizeGLObjectBuffers(unsigned int maxSize)
|
||||
{
|
||||
if (_camera) _camera->resizeGLObjectBuffers(maxSize);
|
||||
|
||||
for(Slaves::iterator itr = _slaves.begin();
|
||||
itr != _slaves.end();
|
||||
++itr)
|
||||
{
|
||||
if (itr->_camera.valid()) itr->_camera->resizeGLObjectBuffers(maxSize);
|
||||
}
|
||||
}
|
||||
|
||||
void View::releaseGLObjects(osg::State* state) const
|
||||
{
|
||||
if (_camera) _camera->releaseGLObjects(state);
|
||||
|
||||
for(Slaves::const_iterator itr = _slaves.begin();
|
||||
itr != _slaves.end();
|
||||
++itr)
|
||||
{
|
||||
if (itr->_camera.valid()) itr->_camera->releaseGLObjects(state);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,9 +41,7 @@ void StackedTransform::update(float t)
|
||||
continue;
|
||||
// update and check if there are changes
|
||||
element->update(t);
|
||||
if (!dirty && !element->isIdentity()){
|
||||
dirty = true;
|
||||
}
|
||||
dirty = true;
|
||||
}
|
||||
|
||||
if (!dirty)
|
||||
|
||||
@@ -126,7 +126,7 @@ SET(TARGET_SRC
|
||||
)
|
||||
|
||||
IF(APPLE AND NOT ANDROID)
|
||||
IF(NOT OSG_BUILD_PLATFORM_IPHONE AND NOT OSG_BUILD_PLATFORM_IPHONE_SIMULATOR)
|
||||
IF(NOT OSG_BUILD_PLATFORM_IPHONE)
|
||||
# Needs CoreFoundation calls and a Carbon function
|
||||
SET(OSGDB_PLATFORM_SPECIFIC_LIBRARIES ${CARBON_LIBRARY} ${COCOA_LIBRARY})
|
||||
ENDIF()
|
||||
@@ -147,8 +147,8 @@ IF(AV_FOUNDATION_FOUND)
|
||||
ADD_DEFINITIONS(-DUSE_AV_FOUNDATION)
|
||||
ENDIF()
|
||||
|
||||
IF(XINE_FOUND)
|
||||
ADD_DEFINITIONS(-DUSE_XINE)
|
||||
IF(FFMPEG_FOUND)
|
||||
ADD_DEFINITIONS(-DUSE_FFMPEG)
|
||||
ENDIF()
|
||||
|
||||
IF(INVENTOR_FOUND)
|
||||
|
||||
@@ -49,57 +49,6 @@ static osg::ApplicationUsageProxy DatabasePager_e4(osg::ApplicationUsage::ENVIRO
|
||||
static osg::ApplicationUsageProxy DatabasePager_e11(osg::ApplicationUsage::ENVIRONMENTAL_VARIABLE,"OSG_MAX_PAGEDLOD <num>","Set the target maximum number of PagedLOD to maintain.");
|
||||
static osg::ApplicationUsageProxy DatabasePager_e12(osg::ApplicationUsage::ENVIRONMENTAL_VARIABLE,"OSG_ASSIGN_PBO_TO_IMAGES <ON/OFF>","Set whether PixelBufferObjects should be assigned to Images to aid download to the GPU.");
|
||||
|
||||
// Convert function objects that take pointer args into functions that a
|
||||
// reference to an osg::ref_ptr. This is quite useful for doing STL
|
||||
// operations on lists of ref_ptr. This code assumes that a function
|
||||
// with an argument const Foo* should be composed into a function of
|
||||
// argument type ref_ptr<Foo>&, not ref_ptr<const Foo>&. Some support
|
||||
// for that should be added to make this more general.
|
||||
|
||||
namespace
|
||||
{
|
||||
template <typename U>
|
||||
struct PointerTraits
|
||||
{
|
||||
typedef class NullType {} PointeeType;
|
||||
};
|
||||
|
||||
template <typename U>
|
||||
struct PointerTraits<U*>
|
||||
{
|
||||
typedef U PointeeType;
|
||||
};
|
||||
|
||||
template <typename U>
|
||||
struct PointerTraits<const U*>
|
||||
{
|
||||
typedef U PointeeType;
|
||||
};
|
||||
|
||||
template <typename FuncObj>
|
||||
class RefPtrAdapter
|
||||
: public std::unary_function<const osg::ref_ptr<typename PointerTraits<typename FuncObj::argument_type>::PointeeType>,
|
||||
typename FuncObj::result_type>
|
||||
{
|
||||
public:
|
||||
typedef typename PointerTraits<typename FuncObj::argument_type>::PointeeType PointeeType;
|
||||
typedef osg::ref_ptr<PointeeType> RefPtrType;
|
||||
explicit RefPtrAdapter(const FuncObj& funcObj) : _func(funcObj) {}
|
||||
typename FuncObj::result_type operator()(const RefPtrType& refPtr) const
|
||||
{
|
||||
return _func(refPtr.get());
|
||||
}
|
||||
protected:
|
||||
FuncObj _func;
|
||||
};
|
||||
|
||||
template <typename FuncObj>
|
||||
RefPtrAdapter<FuncObj> refPtrAdapt(const FuncObj& func)
|
||||
{
|
||||
return RefPtrAdapter<FuncObj>(func);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
@@ -1714,12 +1663,6 @@ void DatabasePager::addLoadedDataToSceneGraph(const osg::FrameStamp &frameStamp)
|
||||
registerPagedLODs(databaseRequest->_loadedModel.get(), frameNumber);
|
||||
}
|
||||
|
||||
if (databaseRequest->_objectCache.valid() && osgDB::Registry::instance()->getObjectCache())
|
||||
{
|
||||
// insert loaded model into Registry ObjectCache
|
||||
osgDB::Registry::instance()->getObjectCache()->addObjectCache( databaseRequest->_objectCache.get());
|
||||
}
|
||||
|
||||
// OSG_NOTICE<<"merged subgraph"<<databaseRequest->_fileName<<" after "<<databaseRequest->_numOfRequests<<" requests and time="<<(timeStamp-databaseRequest->_timestampFirstRequest)*1000.0<<std::endl;
|
||||
|
||||
double timeToMerge = timeStamp-databaseRequest->_timestampFirstRequest;
|
||||
@@ -1735,6 +1678,13 @@ void DatabasePager::addLoadedDataToSceneGraph(const osg::FrameStamp &frameStamp)
|
||||
OSG_INFO<<"DatabasePager::addLoadedDataToSceneGraph() node in parental chain deleted, discarding subgaph."<<std::endl;
|
||||
}
|
||||
|
||||
|
||||
if (databaseRequest->_objectCache.valid() && osgDB::Registry::instance()->getObjectCache())
|
||||
{
|
||||
// insert loaded model into Registry ObjectCache
|
||||
osgDB::Registry::instance()->getObjectCache()->addObjectCache( databaseRequest->_objectCache.get());
|
||||
databaseRequest->_objectCache->clear();
|
||||
}
|
||||
// reset the loadedModel pointer
|
||||
databaseRequest->_loadedModel = 0;
|
||||
|
||||
|
||||
@@ -77,6 +77,8 @@ DynamicLibrary* DynamicLibrary::loadLibrary(const std::string& libraryName)
|
||||
|
||||
HANDLE handle = NULL;
|
||||
|
||||
OSG_DEBUG << "DynamicLibrary::try to load library \"" << libraryName << "\"" << std::endl;
|
||||
|
||||
std::string fullLibraryName = osgDB::findLibraryFile(libraryName);
|
||||
if (!fullLibraryName.empty()) handle = getLibraryHandle( fullLibraryName ); // try the lib we have found
|
||||
else handle = getLibraryHandle( libraryName ); // haven't found a lib ourselves, see if the OS can find it simply from the library name.
|
||||
@@ -113,6 +115,11 @@ DynamicLibrary::HANDLE DynamicLibrary::getLibraryHandle( const std::string& libr
|
||||
return handle;
|
||||
#else // other unix
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
// Library can be found in APK/lib/armeabi-v7a etc.
|
||||
// Should not be prefaced with './'
|
||||
std::string localLibraryName = libraryName;
|
||||
#else
|
||||
// dlopen will not work with files in the current directory unless
|
||||
// they are prefaced with './' (DB - Nov 5, 2003).
|
||||
std::string localLibraryName;
|
||||
@@ -120,6 +127,7 @@ DynamicLibrary::HANDLE DynamicLibrary::getLibraryHandle( const std::string& libr
|
||||
localLibraryName = "./" + libraryName;
|
||||
else
|
||||
localLibraryName = libraryName;
|
||||
#endif
|
||||
|
||||
handle = dlopen( localLibraryName.c_str(), RTLD_LAZY | RTLD_GLOBAL);
|
||||
if( handle == NULL )
|
||||
|
||||
@@ -342,6 +342,11 @@ std::string osgDB::findFileInPath(const std::string& filename, const FilePathLis
|
||||
OSG_DEBUG << "itr='" <<*itr<< "'\n";
|
||||
std::string path = itr->empty() ? filename : concatPaths(*itr, filename);
|
||||
|
||||
#ifdef WIN32
|
||||
// if combined file path exceeds MAX_PATH then ignore as it's not a legal path otherwise subsequent IO calls with this path may result in undefined behavior
|
||||
if (path.length()>MAX_PATH) continue;
|
||||
#endif
|
||||
|
||||
path = getRealPath(path);
|
||||
|
||||
OSG_DEBUG << "FindFileInPath() : trying " << path << " ...\n";
|
||||
|
||||
@@ -187,7 +187,10 @@ InputStream& InputStream::operator>>( osg::Vec4d& v )
|
||||
|
||||
|
||||
InputStream& InputStream::operator>>( osg::Quat& q )
|
||||
{ *this >> q.x() >> q.y() >> q.z() >> q.w(); return *this; }
|
||||
{
|
||||
double x, y, z, w; *this >> x >> y >> z >> w;
|
||||
q.set( x, y, z, w ); return *this;
|
||||
}
|
||||
|
||||
InputStream& InputStream::operator>>( osg::Plane& p )
|
||||
{
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
* OpenSceneGraph Public License for more details.
|
||||
*/
|
||||
|
||||
#include <osg/Texture>
|
||||
#include <osgDB/ObjectCache>
|
||||
#include <osgDB/Options>
|
||||
|
||||
@@ -188,15 +189,95 @@ void ObjectCache::clear()
|
||||
_objectCache.clear();
|
||||
}
|
||||
|
||||
namespace ObjectCacheUtils
|
||||
{
|
||||
|
||||
struct ContainsUnreffedTextures : public osg::NodeVisitor
|
||||
{
|
||||
ContainsUnreffedTextures() :
|
||||
osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN),
|
||||
foundUnreffedTexture(false)
|
||||
{}
|
||||
|
||||
bool foundUnreffedTexture;
|
||||
|
||||
bool check(const osg::Texture* texture)
|
||||
{
|
||||
if (!texture) return false;
|
||||
|
||||
unsigned int numImages = 0;
|
||||
for(unsigned int i=0; i<texture->getNumImages(); ++i)
|
||||
{
|
||||
if (texture->getImage(i)) ++numImages;
|
||||
}
|
||||
|
||||
return numImages==0;
|
||||
}
|
||||
|
||||
bool check(const osg::StateSet* stateset)
|
||||
{
|
||||
for(unsigned int i=0; i<stateset->getNumTextureAttributeLists(); ++i)
|
||||
{
|
||||
const osg::StateAttribute* sa = stateset->getTextureAttribute(i, osg::StateAttribute::TEXTURE);
|
||||
if (sa && check(sa->asTexture())) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool check(osg::Object* object)
|
||||
{
|
||||
if (object->asStateAttribute()) return check(dynamic_cast<const osg::Texture*>(object));
|
||||
if (object->asStateSet()) return check(object->asStateSet());
|
||||
if (!object->asNode()) return false;
|
||||
|
||||
foundUnreffedTexture = false;
|
||||
|
||||
object->asNode()->accept(*this);
|
||||
|
||||
return foundUnreffedTexture;
|
||||
}
|
||||
|
||||
void apply(osg::Node& node)
|
||||
{
|
||||
if (node.getStateSet())
|
||||
{
|
||||
if (check(node.getStateSet()))
|
||||
{
|
||||
foundUnreffedTexture = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
traverse(node);
|
||||
}
|
||||
};
|
||||
|
||||
} // ObjectCacheUtils
|
||||
|
||||
void ObjectCache::releaseGLObjects(osg::State* state)
|
||||
{
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_objectCacheMutex);
|
||||
|
||||
ObjectCacheUtils::ContainsUnreffedTextures cut;
|
||||
|
||||
for(ObjectCacheMap::iterator itr = _objectCache.begin();
|
||||
itr != _objectCache.end();
|
||||
++itr)
|
||||
)
|
||||
{
|
||||
ObjectCacheMap::iterator curr_itr = itr;
|
||||
|
||||
// get object and advance iterator to next item
|
||||
osg::Object* object = itr->second.first.get();
|
||||
|
||||
bool needToRemoveEntry = cut.check(itr->second.first.get());
|
||||
|
||||
object->releaseGLObjects(state);
|
||||
|
||||
++itr;
|
||||
|
||||
if (needToRemoveEntry)
|
||||
{
|
||||
_objectCache.erase(curr_itr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,7 +172,7 @@ OutputStream& OutputStream::operator<<( const osg::Vec4ui& v )
|
||||
|
||||
|
||||
OutputStream& OutputStream::operator<<( const osg::Quat& q )
|
||||
{ *this << q.x() << q.y() << q.z() << q.w(); return *this; }
|
||||
{ *this << (double)q.x() << (double)q.y() << (double)q.z() << (double)q.w(); return *this; }
|
||||
|
||||
OutputStream& OutputStream::operator<<( const osg::Plane& p )
|
||||
{ *this << (double)p[0] << (double)p[1] << (double)p[2] << (double)p[3]; return *this; }
|
||||
@@ -495,6 +495,12 @@ void OutputStream::writeImage( const osg::Image* img )
|
||||
imageFileName = "image.dds";
|
||||
}
|
||||
|
||||
std::string imagePath = osgDB::getFilePath(imageFileName);
|
||||
if (!imagePath.empty() && !osgDB::fileExists(imagePath))
|
||||
{
|
||||
osgDB::makeDirectory(imagePath);
|
||||
}
|
||||
|
||||
bool result = osgDB::writeImageFile( *img, imageFileName );
|
||||
OSG_NOTICE << "OutputStream::writeImage(): Write image data to external file " << imageFileName << std::endl;
|
||||
if ( !result )
|
||||
@@ -925,24 +931,31 @@ template<typename T>
|
||||
void OutputStream::writeArrayImplementation( const T* a, int write_size, unsigned int numInRow )
|
||||
{
|
||||
*this << write_size << BEGIN_BRACKET;
|
||||
if ( numInRow>1 )
|
||||
if ( isBinary() )
|
||||
{
|
||||
for ( int i=0; i<write_size; ++i )
|
||||
{
|
||||
if ( !(i%numInRow) )
|
||||
{
|
||||
*this << std::endl << (*a)[i];
|
||||
}
|
||||
else
|
||||
*this << (*a)[i];
|
||||
}
|
||||
*this << std::endl;
|
||||
if (write_size) writeCharArray((char*)&((*a)[0]), write_size * sizeof((*a)[0]));
|
||||
}
|
||||
else
|
||||
{
|
||||
*this << std::endl;
|
||||
for ( int i=0; i<write_size; ++i )
|
||||
*this << (*a)[i] << std::endl;
|
||||
if ( numInRow>1 )
|
||||
{
|
||||
for ( int i=0; i<write_size; ++i )
|
||||
{
|
||||
if ( !(i%numInRow) )
|
||||
{
|
||||
*this << std::endl << (*a)[i];
|
||||
}
|
||||
else
|
||||
*this << (*a)[i];
|
||||
}
|
||||
*this << std::endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
*this << std::endl;
|
||||
for ( int i=0; i<write_size; ++i )
|
||||
*this << (*a)[i] << std::endl;
|
||||
}
|
||||
}
|
||||
*this << END_BRACKET << std::endl;
|
||||
}
|
||||
|
||||
@@ -288,6 +288,9 @@ Registry::Registry()
|
||||
addFileExtensionAlias("terrain", "osgterrain");
|
||||
addFileExtensionAlias("view", "osgviewer");
|
||||
|
||||
//addFileExtensionAlias("vsga", "vsg");
|
||||
//addFileExtensionAlias("vsgb", "vsg");
|
||||
|
||||
addFileExtensionAlias("sgi", "rgb");
|
||||
addFileExtensionAlias("rgba", "rgb");
|
||||
addFileExtensionAlias("int", "rgb");
|
||||
@@ -377,16 +380,16 @@ Registry::Registry()
|
||||
addFileExtensionAlias("tif", "tiff");
|
||||
|
||||
// really need to decide this at runtime...
|
||||
#if defined(USE_XINE)
|
||||
#if defined(USE_FFMPEG)
|
||||
|
||||
addFileExtensionAlias("mov", "xine");
|
||||
addFileExtensionAlias("mpg", "xine");
|
||||
addFileExtensionAlias("ogv", "xine");
|
||||
addFileExtensionAlias("mpv", "xine");
|
||||
addFileExtensionAlias("dv", "xine");
|
||||
addFileExtensionAlias("avi", "xine");
|
||||
addFileExtensionAlias("wmv", "xine");
|
||||
addFileExtensionAlias("flv", "xine");
|
||||
addFileExtensionAlias("mov", "ffmpeg");
|
||||
addFileExtensionAlias("mpg", "ffmpeg");
|
||||
addFileExtensionAlias("ogv", "ffmpeg");
|
||||
addFileExtensionAlias("mpv", "ffmpeg");
|
||||
addFileExtensionAlias("dv", "ffmpeg");
|
||||
addFileExtensionAlias("avi", "ffmpeg");
|
||||
addFileExtensionAlias("wmv", "ffmpeg");
|
||||
addFileExtensionAlias("flv", "ffmpeg");
|
||||
#endif
|
||||
|
||||
// support QuickTime for Windows
|
||||
|
||||
@@ -135,6 +135,20 @@ void Effect::traverse(osg::NodeVisitor& nv)
|
||||
// wow, we're finished! :)
|
||||
}
|
||||
|
||||
void Effect::resizeGLObjectBuffers(unsigned int maxSize)
|
||||
{
|
||||
Group::resizeGLObjectBuffers(maxSize);
|
||||
if (_dummy_for_validation) _dummy_for_validation->resizeGLObjectBuffers(maxSize);
|
||||
}
|
||||
|
||||
void Effect::releaseGLObjects(osg::State* state) const
|
||||
{
|
||||
Group::releaseGLObjects(state);
|
||||
if (_dummy_for_validation) _dummy_for_validation->releaseGLObjects(state);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Effect::build_dummy_node()
|
||||
{
|
||||
_dummy_for_validation = new osg::Geode;
|
||||
|
||||
@@ -186,8 +186,7 @@ void AnimationPathManipulator::handleFrame( double time )
|
||||
{
|
||||
double delta = time-_realStartOfTimedPeriod;
|
||||
double frameRate = (double)_numOfFramesSinceStartOfTimedPeriod/delta;
|
||||
OSG_NOTICE <<"AnimatonPath completed in "<<delta<<" seconds, completing "<<_numOfFramesSinceStartOfTimedPeriod<<" frames,"<<std::endl;
|
||||
OSG_NOTICE <<" average frame rate = "<<frameRate<<std::endl;
|
||||
OSG_NOTICE <<"AnimatonPath completed in "<<delta<<" seconds, completing "<<_numOfFramesSinceStartOfTimedPeriod<<" frames, average frame rate = "<<frameRate<<std::endl;
|
||||
}
|
||||
|
||||
// reset counters for next loop.
|
||||
|
||||
@@ -96,8 +96,10 @@ void CameraManipulator::computeHomePosition(const osg::Camera *camera, bool useB
|
||||
OSG_INFO<<" boundingSphere.center() = ("<<boundingSphere.center()<<")"<<std::endl;
|
||||
OSG_INFO<<" boundingSphere.radius() = "<<boundingSphere.radius()<<std::endl;
|
||||
|
||||
double radius = osg::maximum(double(boundingSphere.radius()), 1e-6);
|
||||
|
||||
// set dist to default
|
||||
double dist = 3.5f * boundingSphere.radius();
|
||||
double dist = 3.5f * radius;
|
||||
|
||||
if (camera)
|
||||
{
|
||||
@@ -110,7 +112,7 @@ void CameraManipulator::computeHomePosition(const osg::Camera *camera, bool useB
|
||||
double horizontal2 = fabs(top - bottom) / zNear / 2.;
|
||||
double dim = horizontal2 < vertical2 ? horizontal2 : vertical2;
|
||||
double viewAngle = atan2(dim,1.);
|
||||
dist = boundingSphere.radius() / sin(viewAngle);
|
||||
dist = radius / sin(viewAngle);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -357,7 +357,7 @@ osgGA::GUIEventAdapter* EventQueue::mouseButtonRelease(float x, float y, unsigne
|
||||
|
||||
osgGA::GUIEventAdapter* EventQueue::keyPress(int key, double time, int unmodifiedKey)
|
||||
{
|
||||
switch(key)
|
||||
switch(unmodifiedKey)
|
||||
{
|
||||
case(GUIEventAdapter::KEY_Shift_L): _accumulateEventState->setModKeyMask(GUIEventAdapter::MODKEY_LEFT_SHIFT | _accumulateEventState->getModKeyMask()); break;
|
||||
case(GUIEventAdapter::KEY_Shift_R): _accumulateEventState->setModKeyMask(GUIEventAdapter::MODKEY_RIGHT_SHIFT | _accumulateEventState->getModKeyMask()); break;
|
||||
@@ -403,7 +403,7 @@ osgGA::GUIEventAdapter* EventQueue::keyPress(int key, double time, int unmodifie
|
||||
|
||||
osgGA::GUIEventAdapter* EventQueue::keyRelease(int key, double time, int unmodifiedKey)
|
||||
{
|
||||
switch(key)
|
||||
switch(unmodifiedKey)
|
||||
{
|
||||
case(GUIEventAdapter::KEY_Shift_L): _accumulateEventState->setModKeyMask(~GUIEventAdapter::MODKEY_LEFT_SHIFT & _accumulateEventState->getModKeyMask()); break;
|
||||
case(GUIEventAdapter::KEY_Shift_R): _accumulateEventState->setModKeyMask(~GUIEventAdapter::MODKEY_RIGHT_SHIFT & _accumulateEventState->getModKeyMask()); break;
|
||||
|
||||
@@ -86,7 +86,7 @@ void GUIEventAdapter::setWindowRectangle(int x, int y, int width, int height, bo
|
||||
|
||||
if (updateMouseRange)
|
||||
{
|
||||
setInputRange(0, 0, width, height);
|
||||
setInputRange(0, 0, width - 1, height - 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -405,7 +405,7 @@ osg::Quat SpherePlaneProjector::getRotation(const osg::Vec3d& p1, bool p1OnSpher
|
||||
osg::Quat rotation;
|
||||
rotation.makeRotate(p1 - getSphere()->getCenter(), p2 - getSphere()->getCenter());
|
||||
|
||||
osg::Vec3d axis; double angle;
|
||||
osg::Vec3d axis; osg::Quat::value_type angle;
|
||||
rotation.getRotate(angle, axis);
|
||||
|
||||
osg::Vec3d realAxis;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user