Compare commits
66 Commits
OpenSceneG
...
OpenSceneG
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d011ca4e8d | ||
|
|
3a6b13c46e | ||
|
|
88afccd85e | ||
|
|
d6d6c3cda2 | ||
|
|
ca134dca2d | ||
|
|
66246703bf | ||
|
|
fb09be05a9 | ||
|
|
41fa8fecd1 | ||
|
|
2213011caa | ||
|
|
c2f0da31f2 | ||
|
|
2e14bd52bf | ||
|
|
4ea833cc6b | ||
|
|
7fae3b67cd | ||
|
|
8780347f2f | ||
|
|
22e6f6038f | ||
|
|
385cfa0cbf | ||
|
|
960f4d1ef2 | ||
|
|
257c2deb86 | ||
|
|
4dc6a6c4cd | ||
|
|
2e38e4751c | ||
|
|
dfdb946d60 | ||
|
|
2f056dcaa9 | ||
|
|
d07fe93f34 | ||
|
|
05297f439c | ||
|
|
34d58d447d | ||
|
|
637e1cc33b | ||
|
|
5d6ab3e6b7 | ||
|
|
69667a478f | ||
|
|
f00b7180cb | ||
|
|
6ae1139630 | ||
|
|
a06fcbe5d9 | ||
|
|
5f9c6a0170 | ||
|
|
2a4dd6e03b | ||
|
|
afe5644b9f | ||
|
|
ae3133522d | ||
|
|
5040c583b4 | ||
|
|
61967a7d1a | ||
|
|
bcba3928e6 | ||
|
|
006ca64f4b | ||
|
|
77fd07eaa9 | ||
|
|
8b8c427afe | ||
|
|
f55b864d59 | ||
|
|
d18c498322 | ||
|
|
4f7f34a6b0 | ||
|
|
29789f898b | ||
|
|
dd9312ae35 | ||
|
|
78e050db43 | ||
|
|
250dcc5b6c | ||
|
|
f2dfd78914 | ||
|
|
1819bb32ae | ||
|
|
e043c3db33 | ||
|
|
587e65e674 | ||
|
|
274b6894af | ||
|
|
29e87780f5 | ||
|
|
58a51cbc41 | ||
|
|
7ae7a994b4 | ||
|
|
3808b298d1 | ||
|
|
ed13576d03 | ||
|
|
15f2ae8d15 | ||
|
|
9ab5aafd02 | ||
|
|
2e0e78144f | ||
|
|
ffb68bec7c | ||
|
|
79bc4c3843 | ||
|
|
a7747972dc | ||
|
|
467baa8c00 | ||
|
|
4d6c4a7f1f |
43
AUTHORS.txt
43
AUTHORS.txt
@@ -1,6 +1,6 @@
|
|||||||
OpenSceneGraph Library 3.6.2
|
OpenSceneGraph Library 3.6.3
|
||||||
|
|
||||||
568 Contributors:
|
569 Contributors:
|
||||||
|
|
||||||
Firstname Surname
|
Firstname Surname
|
||||||
-----------------
|
-----------------
|
||||||
@@ -10,10 +10,10 @@ Stephan Huber
|
|||||||
Paul Martz
|
Paul Martz
|
||||||
Laurens Voerman
|
Laurens Voerman
|
||||||
Farshid Lashkari
|
Farshid Lashkari
|
||||||
Mathias Fr<EFBFBD>hlich
|
Mathias Frhlich
|
||||||
Marco Jez
|
Marco Jez
|
||||||
Wang Rui
|
Wang Rui
|
||||||
Jean-S<EFBFBD>bastien Guay
|
Jean-Sbastien Guay
|
||||||
Ulrich Hertlein
|
Ulrich Hertlein
|
||||||
Mike Weiblen
|
Mike Weiblen
|
||||||
Sukender
|
Sukender
|
||||||
@@ -67,11 +67,11 @@ Norman Vine
|
|||||||
Chris Denham
|
Chris Denham
|
||||||
Sherman Wilcox
|
Sherman Wilcox
|
||||||
Serge Lages
|
Serge Lages
|
||||||
Romano Jos<EFBFBD> Magacho da Silva
|
Romano Jos Magacho da Silva
|
||||||
Mourad Boufarguine
|
Mourad Boufarguine
|
||||||
Alberto Farre
|
Alberto Farre
|
||||||
Glenn Waldron
|
Glenn Waldron
|
||||||
Andr<EFBFBD> Garneau
|
Andr Garneau
|
||||||
Adrian Egli
|
Adrian Egli
|
||||||
Sebastian Messerschmidt
|
Sebastian Messerschmidt
|
||||||
Randall Hopper
|
Randall Hopper
|
||||||
@@ -86,7 +86,7 @@ Michael Gronager
|
|||||||
Martin Naylor
|
Martin Naylor
|
||||||
Joakim Simonsson
|
Joakim Simonsson
|
||||||
David Spilling
|
David Spilling
|
||||||
Daniel Sj<EFBFBD>lie
|
Daniel Sjlie
|
||||||
Bryan Thrall
|
Bryan Thrall
|
||||||
Andreas Ekstrand
|
Andreas Ekstrand
|
||||||
Rafa Gaitan
|
Rafa Gaitan
|
||||||
@@ -123,7 +123,7 @@ Gordon Tomlinson
|
|||||||
Frederic Marmond
|
Frederic Marmond
|
||||||
Frederic Bouvier
|
Frederic Bouvier
|
||||||
Carlo Camporesi
|
Carlo Camporesi
|
||||||
Bj<EFBFBD>rn Blissing
|
Bjrn Blissing
|
||||||
Alexander Sinditskiy
|
Alexander Sinditskiy
|
||||||
Vladimir Chebaev
|
Vladimir Chebaev
|
||||||
Thibault Genessay
|
Thibault Genessay
|
||||||
@@ -143,7 +143,7 @@ Uwe Woessner
|
|||||||
Tony Horrobin
|
Tony Horrobin
|
||||||
Thom DeCarlo
|
Thom DeCarlo
|
||||||
Tatsuhiro Nishioka
|
Tatsuhiro Nishioka
|
||||||
Tanguy Fautr<EFBFBD>
|
Tanguy Fautr
|
||||||
Sean Spicer
|
Sean Spicer
|
||||||
Ryan Kawicki
|
Ryan Kawicki
|
||||||
Richard Schmidt
|
Richard Schmidt
|
||||||
@@ -202,7 +202,7 @@ Phil Atkin
|
|||||||
Pawel Ksiezopolski
|
Pawel Ksiezopolski
|
||||||
Patrick Neary
|
Patrick Neary
|
||||||
Nathan Monteleone
|
Nathan Monteleone
|
||||||
Miha Rav<EFBFBD>elj
|
Miha Ravelj
|
||||||
Miguel Escriva
|
Miguel Escriva
|
||||||
Mattias Linde
|
Mattias Linde
|
||||||
Mark Sciabica
|
Mark Sciabica
|
||||||
@@ -234,8 +234,8 @@ Christian Ruzicka
|
|||||||
Christian Buchner
|
Christian Buchner
|
||||||
Charles Cole
|
Charles Cole
|
||||||
Blake Williams
|
Blake Williams
|
||||||
Bj<EFBFBD>rn Hein
|
Bjrn Hein
|
||||||
Aur<EFBFBD>lien Chatelain
|
Aurlien Chatelain
|
||||||
Antoine Hue
|
Antoine Hue
|
||||||
Andrew Bettison
|
Andrew Bettison
|
||||||
Andreas Henne
|
Andreas Henne
|
||||||
@@ -264,7 +264,7 @@ Paul Obermeier
|
|||||||
Nguyen Van Truong
|
Nguyen Van Truong
|
||||||
Nathan Cournia
|
Nathan Cournia
|
||||||
Morten Haukness
|
Morten Haukness
|
||||||
Morn<EFBFBD> Pistorius
|
Morn Pistorius
|
||||||
Michael Mc Donnell
|
Michael Mc Donnell
|
||||||
Michael Henheffer
|
Michael Henheffer
|
||||||
Michael Guerrero
|
Michael Guerrero
|
||||||
@@ -297,7 +297,7 @@ Guillaume Taze
|
|||||||
Guillaume Chouvenc
|
Guillaume Chouvenc
|
||||||
Giuseppe Donvito
|
Giuseppe Donvito
|
||||||
Gill Peacegood
|
Gill Peacegood
|
||||||
Giampaolo Vigan<EFBFBD>
|
Giampaolo Vigan
|
||||||
Gerrick Bivins
|
Gerrick Bivins
|
||||||
George Tarantilis
|
George Tarantilis
|
||||||
Ferdi Smit
|
Ferdi Smit
|
||||||
@@ -305,7 +305,7 @@ Eduardo Poyart
|
|||||||
Edgar Ellis
|
Edgar Ellis
|
||||||
Dmitry Marakasov
|
Dmitry Marakasov
|
||||||
Dimi Christopoulos
|
Dimi Christopoulos
|
||||||
Diane Delall<EFBFBD>e
|
Diane Delalle
|
||||||
David Longest
|
David Longest
|
||||||
David Ergo
|
David Ergo
|
||||||
Daniel Trstenjak
|
Daniel Trstenjak
|
||||||
@@ -337,7 +337,7 @@ Vasily Radostev
|
|||||||
Valery Bickov
|
Valery Bickov
|
||||||
Valeriy Dubov
|
Valeriy Dubov
|
||||||
Vaclav Bilek
|
Vaclav Bilek
|
||||||
Tyge L<EFBFBD>vset
|
Tyge Lvset
|
||||||
Troy Yee
|
Troy Yee
|
||||||
Torben Dannahauer
|
Torben Dannahauer
|
||||||
Tony Vasile
|
Tony Vasile
|
||||||
@@ -387,7 +387,7 @@ Piotr Rak
|
|||||||
Pierre Bourdin
|
Pierre Bourdin
|
||||||
Philipp Svehla
|
Philipp Svehla
|
||||||
Philipp Siemoleit
|
Philipp Siemoleit
|
||||||
Philipp M<EFBFBD>chler
|
Philipp Mchler
|
||||||
Philip Lamb
|
Philip Lamb
|
||||||
Petr Salinger
|
Petr Salinger
|
||||||
Peter Bear
|
Peter Bear
|
||||||
@@ -412,7 +412,7 @@ Nick Thu
|
|||||||
Nick Black
|
Nick Black
|
||||||
Mojtaba Fathi
|
Mojtaba Fathi
|
||||||
Mirko Viviani
|
Mirko Viviani
|
||||||
Mikkel Gj<EFBFBD>l
|
Mikkel Gjl
|
||||||
Mike Krus
|
Mike Krus
|
||||||
Mike Garrity
|
Mike Garrity
|
||||||
Mick Thu
|
Mick Thu
|
||||||
@@ -465,7 +465,7 @@ Juan Hernando
|
|||||||
Josh Portway
|
Josh Portway
|
||||||
Jonathan Greig
|
Jonathan Greig
|
||||||
John Tan
|
John Tan
|
||||||
John Hedström
|
John Hedstrm
|
||||||
John Grant
|
John Grant
|
||||||
John Farrier
|
John Farrier
|
||||||
John Donovan
|
John Donovan
|
||||||
@@ -523,11 +523,11 @@ David Jung
|
|||||||
Danny Valente
|
Danny Valente
|
||||||
Daniel Stien
|
Daniel Stien
|
||||||
Dan Minor
|
Dan Minor
|
||||||
C<EFBFBD>sar L. B. Silveira
|
Csar L. B. Silveira
|
||||||
Cyril Brulebois
|
Cyril Brulebois
|
||||||
Curtis Rubel
|
Curtis Rubel
|
||||||
Cory Slep
|
Cory Slep
|
||||||
Cl<EFBFBD>ment B<EFBFBD>sch
|
Clment Bsch
|
||||||
Clay Fowler
|
Clay Fowler
|
||||||
Claus Steuer
|
Claus Steuer
|
||||||
Chuck Sembroski
|
Chuck Sembroski
|
||||||
@@ -537,6 +537,7 @@ Christophe Herreman
|
|||||||
Christian Noon
|
Christian Noon
|
||||||
Christian Kaser
|
Christian Kaser
|
||||||
Christian Ehrlicher
|
Christian Ehrlicher
|
||||||
|
Chris White
|
||||||
Chris McGlone
|
Chris McGlone
|
||||||
Chris Djali
|
Chris Djali
|
||||||
Carlos Garcea
|
Carlos Garcea
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
#
|
#
|
||||||
SET(OPENSCENEGRAPH_MAJOR_VERSION 3)
|
SET(OPENSCENEGRAPH_MAJOR_VERSION 3)
|
||||||
SET(OPENSCENEGRAPH_MINOR_VERSION 6)
|
SET(OPENSCENEGRAPH_MINOR_VERSION 6)
|
||||||
SET(OPENSCENEGRAPH_PATCH_VERSION 2)
|
SET(OPENSCENEGRAPH_PATCH_VERSION 3)
|
||||||
SET(OPENSCENEGRAPH_SOVERSION 157)
|
SET(OPENSCENEGRAPH_SOVERSION 158)
|
||||||
|
|
||||||
|
|
||||||
# set to 0 when not a release candidate, non zero means that any generated
|
# set to 0 when not a release candidate, non zero means that any generated
|
||||||
|
|||||||
265
ChangeLog
265
ChangeLog
@@ -1,3 +1,268 @@
|
|||||||
|
Fri, 14 Sep 2018 10:41:24 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Updated version number and date for 3.6.3 stable release
|
||||||
|
|
||||||
|
Thu, 13 Sep 2018 08:52:21 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Updated ChangeLog for 3.6.3-rc3
|
||||||
|
|
||||||
|
Thu, 13 Sep 2018 08:47:17 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Updated for 3.6.3-rc3
|
||||||
|
|
||||||
|
Wed, 12 Sep 2018 17:45:49 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Standardized the glTexStorage*() calls to use osg::maximum(_numMipmapLevels,1) of rnumber of mipmaps to keep the usage consistent. Fixed the erronous Texture2DArray glTexStorage call so that it used the _numMipmapLevels as above to resolve bug in allocation.
|
||||||
|
|
||||||
|
Tue, 11 Sep 2018 15:32:44 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Warning fixes
|
||||||
|
|
||||||
|
Tue, 11 Sep 2018 12:29:40 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Fixed warning
|
||||||
|
|
||||||
|
Tue, 11 Sep 2018 12:23:01 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Updated for 3.6.3-rc2
|
||||||
|
|
||||||
|
Tue, 11 Sep 2018 11:56:04 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Updated rc number 2 for 3.6.3-rc2
|
||||||
|
|
||||||
|
Tue, 11 Sep 2018 11:29:36 +0100
|
||||||
|
Author : OpenSceneGraph git repository
|
||||||
|
Merge pull request #620 from LaurensVoerman/txt_SCREEN_COORDSfix scale problem for osgText with characterSizeMode SCREEN_COORDS and _position set.
|
||||||
|
|
||||||
|
Tue, 11 Sep 2018 11:23:34 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Fixed hang using a ReentrantMutex
|
||||||
|
|
||||||
|
Tue, 11 Sep 2018 10:13:49 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Fixed build
|
||||||
|
|
||||||
|
Tue, 11 Sep 2018 09:31:35 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Fixed build
|
||||||
|
|
||||||
|
Tue, 11 Sep 2018 09:03:01 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Cleaned up code
|
||||||
|
|
||||||
|
Mon, 10 Sep 2018 08:00:41 -0400
|
||||||
|
Author : gwaldron
|
||||||
|
osgText: fixed thread-safety issues in Glyph and Font
|
||||||
|
|
||||||
|
Sat, 8 Sep 2018 18:18:33 +0200
|
||||||
|
Author : mp3butcher
|
||||||
|
fix examples context creation for X11 (when display not :0.0)
|
||||||
|
|
||||||
|
Tue, 11 Sep 2018 08:34:20 +0100
|
||||||
|
Author : OpenSceneGraph git repository
|
||||||
|
Merge pull request #619 from mathieu/topic/SaveInlinedImagesAdded saving of inline Images without having the physical image file.
|
||||||
|
|
||||||
|
Tue, 11 Sep 2018 08:11:27 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Added greater control of how cubemap is set up and controlled
|
||||||
|
|
||||||
|
Fri, 7 Sep 2018 15:09:15 +0200
|
||||||
|
Author : Laurens Voerman
|
||||||
|
fix scale problem for osgText with characterSizeMode SCREEN_COORDS and _position set.
|
||||||
|
|
||||||
|
Fri, 7 Sep 2018 14:04:41 +0200
|
||||||
|
Author : Mathieu MARACHE
|
||||||
|
Added saving of inline Images without having the physical image file.The can be read from and inlined image file
|
||||||
|
|
||||||
|
|
||||||
|
Thu, 6 Sep 2018 12:30:18 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Merge branch 'OpenSceneGraph-3.6' of https://github.com/openscenegraph/OpenSceneGraph into OpenSceneGraph-3.6
|
||||||
|
|
||||||
|
Thu, 6 Sep 2018 12:29:44 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Updated for 3.6.3-rc1
|
||||||
|
|
||||||
|
Thu, 6 Sep 2018 11:50:21 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Fixed memory leak with assignment of default value to ObjectSerializer
|
||||||
|
|
||||||
|
Wed, 5 Sep 2018 18:06:25 +0100
|
||||||
|
Author : OpenSceneGraph git repository
|
||||||
|
Merge pull request #616 from eligovision/OpenSceneGraph-3.6_particlesParticleSystem: Added support for GLES2 and upper (GL_QUADS -> GL_TRI…
|
||||||
|
|
||||||
|
Wed, 5 Sep 2018 18:01:33 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Fixed copy constructor
|
||||||
|
|
||||||
|
Wed, 5 Sep 2018 19:00:29 +0300
|
||||||
|
Author : Konstantin S. Matveyev
|
||||||
|
ParticleSystem: Using of GL_TRIANGLES for GLES2 and upper; GL_QUADS otherwise
|
||||||
|
|
||||||
|
Wed, 5 Sep 2018 14:04:57 +0100
|
||||||
|
Author : OpenSceneGraph git repository
|
||||||
|
Merge pull request #617 from aluaces/Image_scaleImage_typoFix typo in the initial check of Image::scaleImage().
|
||||||
|
|
||||||
|
Wed, 5 Sep 2018 13:27:35 +0200
|
||||||
|
Author : Alberto Luaces
|
||||||
|
Fix typo in the initial check of Image::scaleImage().
|
||||||
|
|
||||||
|
Wed, 5 Sep 2018 14:00:09 +0300
|
||||||
|
Author : Konstantin S. Matveyev
|
||||||
|
ParticleSystem: Added support for GLES2 and upper (GL_QUADS -> GL_TRIANGLES)
|
||||||
|
|
||||||
|
Tue, 4 Sep 2018 10:35:38 -0400
|
||||||
|
Author : Jason Beverage
|
||||||
|
Protect the _programSet in Shader with a mutex. This prevents thread safety issues when Shader objects are used in multiple programs.
|
||||||
|
|
||||||
|
Wed, 5 Sep 2018 09:33:24 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Updated ChangeLog
|
||||||
|
|
||||||
|
Tue, 4 Sep 2018 15:26:30 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Changed the ShapeDrawable::build() methpd so that it does run when the ShadpwDrawabe is a KdTree.
|
||||||
|
|
||||||
|
Tue, 4 Sep 2018 14:13:32 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Updated SO version as XmlNode::Input changes change the ABI
|
||||||
|
|
||||||
|
Tue, 4 Sep 2018 12:19:14 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Added support for reading UTF-8 encoded of xml files
|
||||||
|
|
||||||
|
Mon, 3 Sep 2018 12:30:02 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Changed the logic for whether to call setUpThreading() in setThreadingModel() to make it possible to changed threadings even if the threading model starts of as SingleThreaded
|
||||||
|
|
||||||
|
Mon, 3 Sep 2018 11:19:50 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Updated version number to 3.6.3 in prep for next naintainance release
|
||||||
|
|
||||||
|
Mon, 3 Sep 2018 10:16:45 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Merge branch 'OpenSceneGraph-3.6-TexStorage' into OpenSceneGraph-3.6
|
||||||
|
|
||||||
|
Mon, 3 Sep 2018 09:37:36 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Added reset of _stateset to prevent the releaseGLObjects calling release on th StateSet from the destructor
|
||||||
|
|
||||||
|
Mon, 3 Sep 2018 09:37:36 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Added reset of _stateset to prevent the releaseGLObjects calling release on th StateSet from the destructor
|
||||||
|
|
||||||
|
Tue, 28 Aug 2018 11:22:57 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Replaced the glSGetProcAddressARB code with the dlsym() usage as the NVidia driver looks to be returning non NULL pointers for invalid function names.
|
||||||
|
|
||||||
|
Tue, 28 Aug 2018 11:22:57 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Replaced the glSGetProcAddressARB code with the dlsym() usage as the NVidia driver looks to be returning non NULL pointers for invalid function names.
|
||||||
|
|
||||||
|
Wed, 22 Aug 2018 11:13:11 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Enabled point sprite validty modes.
|
||||||
|
|
||||||
|
Wed, 22 Aug 2018 11:13:11 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Enabled point sprite validty modes.
|
||||||
|
|
||||||
|
Wed, 22 Aug 2018 10:42:18 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Merged fix for PointSprite modes validity checks from master.
|
||||||
|
|
||||||
|
Wed, 22 Aug 2018 10:42:18 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Merged fix for PointSprite modes validity checks from master.
|
||||||
|
|
||||||
|
Tue, 21 Aug 2018 09:38:03 -0400
|
||||||
|
Author : plevy
|
||||||
|
Change GL_RGBA16F to GL_RGBA16F_ARB to fix Windows BuildChange GL_RGBA16F to GL_RGBA16F_ARB to fix Windows build.
|
||||||
|
|
||||||
|
Tue, 21 Aug 2018 09:38:03 -0400
|
||||||
|
Author : plevy
|
||||||
|
Change GL_RGBA16F to GL_RGBA16F_ARB to fix Windows BuildChange GL_RGBA16F to GL_RGBA16F_ARB to fix Windows build.
|
||||||
|
|
||||||
|
Tue, 21 Aug 2018 09:19:50 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Replaced GL_RGBA32F with GL_RGBA32F_ARB to fix Windows build
|
||||||
|
|
||||||
|
Tue, 21 Aug 2018 09:19:50 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Replaced GL_RGBA32F with GL_RGBA32F_ARB to fix Windows build
|
||||||
|
|
||||||
|
Mon, 20 Aug 2018 10:08:09 +0100
|
||||||
|
Author : OpenSceneGraph git repository
|
||||||
|
Merge pull request #606 from mp3butcher/OpenSceneGraph-3.6-TexStorageOpen scene graph 3.6 tex storage
|
||||||
|
|
||||||
|
Mon, 20 Aug 2018 05:10:11 +0200
|
||||||
|
Author : mp3butcher
|
||||||
|
complete TexStorage support
|
||||||
|
|
||||||
|
Mon, 20 Aug 2018 04:50:14 +0200
|
||||||
|
Author : mp3butcher
|
||||||
|
add more extensions
|
||||||
|
|
||||||
|
Sun, 19 Aug 2018 22:46:10 +0200
|
||||||
|
Author : mp3butcher
|
||||||
|
remove redondant variable and test
|
||||||
|
|
||||||
|
Fri, 17 Aug 2018 16:51:55 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Removed check as this is better outside of the function
|
||||||
|
|
||||||
|
Fri, 17 Aug 2018 12:20:59 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Created a GLenum Texture::selectSizedInternalFormat(const osg::Image* image=0) const method to help clean up set up of glTexStorage. Fixed typo.
|
||||||
|
|
||||||
|
Fri, 17 Aug 2018 10:31:46 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Merged changes to InternalPixelRelations sizedInternalFormats[] from master
|
||||||
|
|
||||||
|
Thu, 16 Aug 2018 19:23:17 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Fixed memory leak associated with VertexArrayStte objects not getting released on destruction of Geometry/Drawables.
|
||||||
|
|
||||||
|
Wed, 8 Aug 2018 14:42:04 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
From Chris White, Cygwin build fix
|
||||||
|
|
||||||
|
Wed, 8 Aug 2018 15:05:53 +0300
|
||||||
|
Author : Vic-Min
|
||||||
|
Renamed USE_DEPRECATED_API to OSG_USE_DEPRECATED_API
|
||||||
|
|
||||||
|
Tue, 31 Jul 2018 16:58:41 +0100
|
||||||
|
Author : OpenSceneGraph git repository
|
||||||
|
Merge pull request #583 from emminizer/flt-registry-cacheOpenFlight: Replace internal caches with osgDB::ObjectCache use. Fix…
|
||||||
|
|
||||||
|
Tue, 31 Jul 2018 11:45:33 -0400
|
||||||
|
Author : Daniel Emminizer
|
||||||
|
OpenFlight: Replace internal caches with osgDB::ObjectCache use. Fixes unbounded memory growth when using readNode(std::istream&, ...) method.
|
||||||
|
|
||||||
|
Tue, 31 Jul 2018 09:13:20 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Removed unneccessary FIX ME statement.
|
||||||
|
|
||||||
|
Fri, 27 Jul 2018 17:34:30 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Fixed check against dataType changes
|
||||||
|
|
||||||
|
Wed, 25 Nov 2015 09:36:15 +1100
|
||||||
|
Author : Alex Burton
|
||||||
|
updated osgviewerWX to remove deprecated calls in wxWidgets 3.x
|
||||||
|
|
||||||
|
Mon, 9 Jul 2018 17:55:38 +0100
|
||||||
|
Author : OpenSceneGraph git repository
|
||||||
|
Merge pull request #573 from emminizer/fix-flt-typoFLT: Fix texture unit typo and code style from PR 568.
|
||||||
|
|
||||||
|
Mon, 9 Jul 2018 06:34:41 -0400
|
||||||
|
Author : Daniel Emminizer
|
||||||
|
FLT: Fix texture unit typo and code style from PR 568.
|
||||||
|
|
||||||
|
Fri, 29 Jun 2018 10:56:35 +0100
|
||||||
|
Author : Robert Osfield
|
||||||
|
Updated ChangeLog for 3.6.2 release
|
||||||
|
|
||||||
Fri, 29 Jun 2018 10:56:01 +0100
|
Fri, 29 Jun 2018 10:56:01 +0100
|
||||||
Author : Robert Osfield
|
Author : Robert Osfield
|
||||||
Updated date for 3.6.2 releases
|
Updated date for 3.6.2 releases
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ If details below are not sufficient then head over to the openscenegraph.org to
|
|||||||
|
|
||||||
Robert Osfield.
|
Robert Osfield.
|
||||||
Project Lead.
|
Project Lead.
|
||||||
29th June 2018.
|
14th September 2018.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -45,6 +45,8 @@ class MyGraphicsContext {
|
|||||||
traits->doubleBuffer = false;
|
traits->doubleBuffer = false;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
traits->pbuffer = true;
|
traits->pbuffer = true;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
_gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
_gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
|
|
||||||
|
|||||||
@@ -249,6 +249,8 @@ int main( int argc, char **argv )
|
|||||||
traits->width = 1 << 12;
|
traits->width = 1 << 12;
|
||||||
traits->height = 1 << 12;
|
traits->height = 1 << 12;
|
||||||
traits->pbuffer = true;
|
traits->pbuffer = true;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
}
|
}
|
||||||
osg::ref_ptr<osg::GraphicsContext> pbuffer = osg::GraphicsContext::createGraphicsContext(traits.get());
|
osg::ref_ptr<osg::GraphicsContext> pbuffer = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
if (pbuffer.valid())
|
if (pbuffer.valid())
|
||||||
|
|||||||
@@ -209,6 +209,8 @@ osgViewer::View* createView(osg::ref_ptr<osg::Node> scenegraph, osg::ref_ptr<osg
|
|||||||
traits->windowDecoration = true;
|
traits->windowDecoration = true;
|
||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
if (!gc)
|
if (!gc)
|
||||||
@@ -267,7 +269,11 @@ int main(int argc, char** argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned int width, height;
|
unsigned int width, height;
|
||||||
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
|
osg::GraphicsContext::ScreenIdentifier main_screen_id;
|
||||||
|
|
||||||
|
main_screen_id.readDISPLAY();
|
||||||
|
main_screen_id.setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
wsi->getScreenResolution(main_screen_id, width, height);
|
||||||
|
|
||||||
unsigned int x=0, y=0;
|
unsigned int x=0, y=0;
|
||||||
while(arguments.read("--window", x, y, width, height)) {}
|
while(arguments.read("--window", x, y, width, height)) {}
|
||||||
@@ -283,6 +289,8 @@ int main(int argc, char** argv)
|
|||||||
traits->windowDecoration = true;
|
traits->windowDecoration = true;
|
||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
if (!gc)
|
if (!gc)
|
||||||
|
|||||||
@@ -83,7 +83,11 @@ void singleWindowMultipleCameras(osgViewer::Viewer& viewer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned int width, height;
|
unsigned int width, height;
|
||||||
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
|
osg::GraphicsContext::ScreenIdentifier main_screen_id;
|
||||||
|
|
||||||
|
main_screen_id.readDISPLAY();
|
||||||
|
main_screen_id.setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
wsi->getScreenResolution(main_screen_id, width, height);
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
|
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
|
||||||
traits->x = 0;
|
traits->x = 0;
|
||||||
@@ -93,6 +97,8 @@ void singleWindowMultipleCameras(osgViewer::Viewer& viewer)
|
|||||||
traits->windowDecoration = true;
|
traits->windowDecoration = true;
|
||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
if (gc.valid())
|
if (gc.valid())
|
||||||
@@ -134,7 +140,11 @@ void multipleWindowMultipleCameras(osgViewer::Viewer& viewer, bool multipleScree
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned int width, height;
|
unsigned int width, height;
|
||||||
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
|
osg::GraphicsContext::ScreenIdentifier main_screen_id;
|
||||||
|
|
||||||
|
main_screen_id.readDISPLAY();
|
||||||
|
main_screen_id.setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
wsi->getScreenResolution(main_screen_id, width, height);
|
||||||
|
|
||||||
|
|
||||||
unsigned int numCameras = 6;
|
unsigned int numCameras = 6;
|
||||||
@@ -151,6 +161,8 @@ void multipleWindowMultipleCameras(osgViewer::Viewer& viewer, bool multipleScree
|
|||||||
traits->windowDecoration = true;
|
traits->windowDecoration = true;
|
||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
if (gc.valid())
|
if (gc.valid())
|
||||||
|
|||||||
@@ -971,9 +971,7 @@ bool GameEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionA
|
|||||||
{
|
{
|
||||||
createNewCatchable();
|
createNewCatchable();
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
case(osgGA::GUIEventAdapter::KEYDOWN):
|
case(osgGA::GUIEventAdapter::KEYDOWN):
|
||||||
{
|
{
|
||||||
@@ -987,6 +985,7 @@ bool GameEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionA
|
|||||||
_rightKeyPressed=true;
|
_rightKeyPressed=true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
case(osgGA::GUIEventAdapter::KEYUP):
|
case(osgGA::GUIEventAdapter::KEYUP):
|
||||||
{
|
{
|
||||||
@@ -1000,6 +999,7 @@ bool GameEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionA
|
|||||||
_rightKeyPressed=false;
|
_rightKeyPressed=false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
case(osgGA::GUIEventAdapter::DRAG):
|
case(osgGA::GUIEventAdapter::DRAG):
|
||||||
case(osgGA::GUIEventAdapter::MOVE):
|
case(osgGA::GUIEventAdapter::MOVE):
|
||||||
|
|||||||
@@ -289,7 +289,11 @@ int main( int argc, char **argv )
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned int width, height;
|
unsigned int width, height;
|
||||||
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
|
osg::GraphicsContext::ScreenIdentifier main_screen_id;
|
||||||
|
|
||||||
|
main_screen_id.readDISPLAY();
|
||||||
|
main_screen_id.setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
wsi->getScreenResolution(main_screen_id, width, height);
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
|
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
|
||||||
traits->x = 100;
|
traits->x = 100;
|
||||||
@@ -299,6 +303,8 @@ int main( int argc, char **argv )
|
|||||||
traits->windowDecoration = true;
|
traits->windowDecoration = true;
|
||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
if (gc.valid())
|
if (gc.valid())
|
||||||
|
|||||||
@@ -40,33 +40,101 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
void create_specular_highlights(osg::Node *node)
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
osg::StateSet *ss = node->getOrCreateStateSet();
|
// use an ArgumentParser object to manage the program arguments.
|
||||||
|
osg::ArgumentParser arguments(&argc,argv);
|
||||||
|
|
||||||
|
// construct the viewer.
|
||||||
|
osgViewer::Viewer viewer;
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::TextureCubeMap> tcm = new osg::TextureCubeMap;
|
||||||
|
|
||||||
// create and setup the texture object
|
|
||||||
osg::TextureCubeMap *tcm = new osg::TextureCubeMap;
|
|
||||||
tcm->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP);
|
tcm->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP);
|
||||||
tcm->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP);
|
tcm->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP);
|
||||||
tcm->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP);
|
tcm->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP);
|
||||||
tcm->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR);
|
|
||||||
tcm->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
|
|
||||||
|
|
||||||
// generate the six highlight map images (light direction = [1, 1, -1])
|
if (arguments.read("--no-mip-map"))
|
||||||
osgUtil::HighlightMapGenerator *mapgen = new osgUtil::HighlightMapGenerator(
|
{
|
||||||
osg::Vec3(1, 1, -1), // light direction
|
tcm->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR);
|
||||||
osg::Vec4(1, 0.9f, 0.8f, 1), // light color
|
tcm->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
|
||||||
8); // specular exponent
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tcm->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR);
|
||||||
|
tcm->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
|
||||||
|
}
|
||||||
|
|
||||||
mapgen->generateMap();
|
if (arguments.read("--hardware-mip-map") || arguments.read("--hmp"))
|
||||||
|
{
|
||||||
|
OSG_NOTICE<<"tcm->setUseHardwareMipMapGeneration(true)"<<std::endl;
|
||||||
|
tcm->setUseHardwareMipMapGeneration(true);
|
||||||
|
}
|
||||||
|
|
||||||
// assign the six images to the texture object
|
std::string filename;
|
||||||
tcm->setImage(osg::TextureCubeMap::POSITIVE_X, mapgen->getImage(osg::TextureCubeMap::POSITIVE_X));
|
if (arguments.read("--posx", filename)) tcm->setImage(osg::TextureCubeMap::POSITIVE_X, osgDB::readImageFile(filename));
|
||||||
tcm->setImage(osg::TextureCubeMap::NEGATIVE_X, mapgen->getImage(osg::TextureCubeMap::NEGATIVE_X));
|
if (arguments.read("--negx", filename)) tcm->setImage(osg::TextureCubeMap::NEGATIVE_X, osgDB::readImageFile(filename));
|
||||||
tcm->setImage(osg::TextureCubeMap::POSITIVE_Y, mapgen->getImage(osg::TextureCubeMap::POSITIVE_Y));
|
if (arguments.read("--posy", filename)) tcm->setImage(osg::TextureCubeMap::POSITIVE_Y, osgDB::readImageFile(filename));
|
||||||
tcm->setImage(osg::TextureCubeMap::NEGATIVE_Y, mapgen->getImage(osg::TextureCubeMap::NEGATIVE_Y));
|
if (arguments.read("--negy", filename)) tcm->setImage(osg::TextureCubeMap::NEGATIVE_Y, osgDB::readImageFile(filename));
|
||||||
tcm->setImage(osg::TextureCubeMap::POSITIVE_Z, mapgen->getImage(osg::TextureCubeMap::POSITIVE_Z));
|
if (arguments.read("--posz", filename)) tcm->setImage(osg::TextureCubeMap::POSITIVE_Z, osgDB::readImageFile(filename));
|
||||||
tcm->setImage(osg::TextureCubeMap::NEGATIVE_Z, mapgen->getImage(osg::TextureCubeMap::NEGATIVE_Z));
|
if (arguments.read("--negz", filename)) tcm->setImage(osg::TextureCubeMap::NEGATIVE_Z, osgDB::readImageFile(filename));
|
||||||
|
|
||||||
|
|
||||||
|
int numValidImages = 0;
|
||||||
|
if (tcm->getImage(osg::TextureCubeMap::POSITIVE_X)) ++numValidImages;
|
||||||
|
if (tcm->getImage(osg::TextureCubeMap::NEGATIVE_X)) ++numValidImages;
|
||||||
|
if (tcm->getImage(osg::TextureCubeMap::POSITIVE_Y)) ++numValidImages;
|
||||||
|
if (tcm->getImage(osg::TextureCubeMap::NEGATIVE_Y)) ++numValidImages;
|
||||||
|
if (tcm->getImage(osg::TextureCubeMap::POSITIVE_Z)) ++numValidImages;
|
||||||
|
if (tcm->getImage(osg::TextureCubeMap::NEGATIVE_Z)) ++numValidImages;
|
||||||
|
|
||||||
|
if (numValidImages!=6)
|
||||||
|
{
|
||||||
|
// generate the six highlight map images (light direction = [1, 1, -1])
|
||||||
|
osgUtil::HighlightMapGenerator *mapgen = new osgUtil::HighlightMapGenerator(
|
||||||
|
osg::Vec3(1, 1, -1), // light direction
|
||||||
|
osg::Vec4(1, 0.9f, 0.8f, 1), // light color
|
||||||
|
8); // specular exponent
|
||||||
|
|
||||||
|
mapgen->generateMap();
|
||||||
|
|
||||||
|
// assign the six images to the texture object
|
||||||
|
if (!tcm->getImage(osg::TextureCubeMap::POSITIVE_X)) tcm->setImage(osg::TextureCubeMap::POSITIVE_X, mapgen->getImage(osg::TextureCubeMap::POSITIVE_X));
|
||||||
|
if (!tcm->getImage(osg::TextureCubeMap::NEGATIVE_X)) tcm->setImage(osg::TextureCubeMap::NEGATIVE_X, mapgen->getImage(osg::TextureCubeMap::NEGATIVE_X));
|
||||||
|
if (!tcm->getImage(osg::TextureCubeMap::POSITIVE_Y)) tcm->setImage(osg::TextureCubeMap::POSITIVE_Y, mapgen->getImage(osg::TextureCubeMap::POSITIVE_Y));
|
||||||
|
if (!tcm->getImage(osg::TextureCubeMap::NEGATIVE_Y)) tcm->setImage(osg::TextureCubeMap::NEGATIVE_Y, mapgen->getImage(osg::TextureCubeMap::NEGATIVE_Y));
|
||||||
|
if (!tcm->getImage(osg::TextureCubeMap::POSITIVE_Z)) tcm->setImage(osg::TextureCubeMap::POSITIVE_Z, mapgen->getImage(osg::TextureCubeMap::POSITIVE_Z));
|
||||||
|
if (!tcm->getImage(osg::TextureCubeMap::NEGATIVE_Z)) tcm->setImage(osg::TextureCubeMap::NEGATIVE_Z, mapgen->getImage(osg::TextureCubeMap::NEGATIVE_Z));
|
||||||
|
}
|
||||||
|
|
||||||
|
float LODBias;
|
||||||
|
if (arguments.read("--lod",LODBias))
|
||||||
|
{
|
||||||
|
tcm->setLODBias(LODBias);
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Program> program = new osg::Program;
|
||||||
|
std::string shaderFilename;
|
||||||
|
while (arguments.read("-s", shaderFilename))
|
||||||
|
{
|
||||||
|
osg::ref_ptr<osg::Shader> shader = osgDB::readRefShaderFile(shaderFilename);
|
||||||
|
if (shader) program->addShader(shader);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// load the nodes from the commandline arguments.
|
||||||
|
osg::ref_ptr<osg::Node> rootnode = osgDB::readRefNodeFiles(arguments);
|
||||||
|
|
||||||
|
// if not loaded assume no arguments passed in, try use default mode instead.
|
||||||
|
if (!rootnode) rootnode = osgDB::readRefNodeFile("cessna.osgt");
|
||||||
|
|
||||||
|
if (!rootnode)
|
||||||
|
{
|
||||||
|
osg::notify(osg::NOTICE)<<"Please specify a model filename on the command line."<<std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::StateSet *ss = rootnode->getOrCreateStateSet();
|
||||||
|
|
||||||
// enable texturing, replacing any textures in the subgraphs
|
// enable texturing, replacing any textures in the subgraphs
|
||||||
ss->setTextureAttributeAndModes(0, tcm, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON);
|
ss->setTextureAttributeAndModes(0, tcm, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON);
|
||||||
@@ -84,31 +152,13 @@ void create_specular_highlights(osg::Node *node)
|
|||||||
te->setSource1_RGB(osg::TexEnvCombine::PRIMARY_COLOR);
|
te->setSource1_RGB(osg::TexEnvCombine::PRIMARY_COLOR);
|
||||||
te->setOperand1_RGB(osg::TexEnvCombine::SRC_COLOR);
|
te->setOperand1_RGB(osg::TexEnvCombine::SRC_COLOR);
|
||||||
ss->setTextureAttributeAndModes(0, te, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON);
|
ss->setTextureAttributeAndModes(0, te, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON);
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
if (program->getNumShaders()>0)
|
||||||
{
|
|
||||||
// use an ArgumentParser object to manage the program arguments.
|
|
||||||
osg::ArgumentParser arguments(&argc,argv);
|
|
||||||
|
|
||||||
// construct the viewer.
|
|
||||||
osgViewer::Viewer viewer;
|
|
||||||
|
|
||||||
// load the nodes from the commandline arguments.
|
|
||||||
osg::ref_ptr<osg::Node> rootnode = osgDB::readRefNodeFiles(arguments);
|
|
||||||
|
|
||||||
// if not loaded assume no arguments passed in, try use default mode instead.
|
|
||||||
if (!rootnode) rootnode = osgDB::readRefNodeFile("cessna.osgt");
|
|
||||||
|
|
||||||
if (!rootnode)
|
|
||||||
{
|
{
|
||||||
osg::notify(osg::NOTICE)<<"Please specify a model filename on the command line."<<std::endl;
|
ss->setAttribute(program.get());
|
||||||
return 1;
|
ss->addUniform(new osg::Uniform("baseTexture",0));
|
||||||
}
|
}
|
||||||
|
|
||||||
// create specular highlights
|
|
||||||
create_specular_highlights(rootnode.get());
|
|
||||||
|
|
||||||
// run optimization over the scene graph
|
// run optimization over the scene graph
|
||||||
osgUtil::Optimizer optimzer;
|
osgUtil::Optimizer optimzer;
|
||||||
optimzer.optimize(rootnode);
|
optimzer.optimize(rootnode);
|
||||||
|
|||||||
@@ -79,7 +79,11 @@ struct CommandLineOptions
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
|
osg::GraphicsContext::ScreenIdentifier main_screen_id;
|
||||||
|
|
||||||
|
main_screen_id.readDISPLAY();
|
||||||
|
main_screen_id.setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
wsi->getScreenResolution(main_screen_id, width, height);
|
||||||
distance = sqrt(sphere_radius*sphere_radius - collar_radius*collar_radius);
|
distance = sqrt(sphere_radius*sphere_radius - collar_radius*collar_radius);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -274,6 +278,8 @@ void setDomeFaces(osgViewer::Viewer& viewer, CommandLineOptions& options)
|
|||||||
traits->windowDecoration = true;
|
traits->windowDecoration = true;
|
||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
if (!gc)
|
if (!gc)
|
||||||
@@ -502,6 +508,8 @@ void setDomeCorrection(osgViewer::Viewer& viewer, CommandLineOptions& options)
|
|||||||
traits->windowDecoration = false;
|
traits->windowDecoration = false;
|
||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
if (!gc)
|
if (!gc)
|
||||||
|
|||||||
@@ -12,11 +12,6 @@
|
|||||||
|
|
||||||
void textInfo(osgText::Text* text)
|
void textInfo(osgText::Text* text)
|
||||||
{
|
{
|
||||||
const osgText::Text::TextureGlyphQuadMap& tgqm = text->getTextureGlyphQuadMap();
|
|
||||||
|
|
||||||
const osgText::Text::TextureGlyphQuadMap::const_iterator tgqmi = tgqm.begin();
|
|
||||||
|
|
||||||
|
|
||||||
osgText::String& s = text->getText();
|
osgText::String& s = text->getText();
|
||||||
|
|
||||||
for(unsigned int i = 0; i < s.size(); i++)
|
for(unsigned int i = 0; i < s.size(); i++)
|
||||||
|
|||||||
@@ -722,6 +722,8 @@ GraphicsContext* setupGC(osgViewer::Viewer& viewer, ArgumentParser& arguments)
|
|||||||
traits->windowDecoration = decoration;
|
traits->windowDecoration = decoration;
|
||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
ref_ptr<GraphicsContext> gc = GraphicsContext::createGraphicsContext(traits.get());
|
ref_ptr<GraphicsContext> gc = GraphicsContext::createGraphicsContext(traits.get());
|
||||||
osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(gc.get());
|
osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(gc.get());
|
||||||
|
|||||||
@@ -159,6 +159,8 @@ int main( int argc, char **argv )
|
|||||||
traits->windowDecoration = true;
|
traits->windowDecoration = true;
|
||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
if (gc.valid())
|
if (gc.valid())
|
||||||
|
|||||||
@@ -65,6 +65,8 @@ class ContextTest : public MemoryTest
|
|||||||
traits->height = _height;
|
traits->height = _height;
|
||||||
traits->windowDecoration = true;
|
traits->windowDecoration = true;
|
||||||
traits->pbuffer = _pbuffer;
|
traits->pbuffer = _pbuffer;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext> window = osg::GraphicsContext::createGraphicsContext(traits.get());
|
osg::ref_ptr<osg::GraphicsContext> window = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
if (window.valid())
|
if (window.valid())
|
||||||
|
|||||||
@@ -641,7 +641,11 @@ int main(int argc, char** argv)
|
|||||||
if (wsi)
|
if (wsi)
|
||||||
{
|
{
|
||||||
unsigned int width, height;
|
unsigned int width, height;
|
||||||
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
|
osg::GraphicsContext::ScreenIdentifier main_screen_id;
|
||||||
|
|
||||||
|
main_screen_id.readDISPLAY();
|
||||||
|
main_screen_id.setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
wsi->getScreenResolution(main_screen_id, width, height);
|
||||||
|
|
||||||
screenAspectRatio = float(width) / float(height);
|
screenAspectRatio = float(width) / float(height);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,7 +91,11 @@ int main( int argc, char **argv )
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned int width, height;
|
unsigned int width, height;
|
||||||
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
|
osg::GraphicsContext::ScreenIdentifier main_screen_id;
|
||||||
|
|
||||||
|
main_screen_id.readDISPLAY();
|
||||||
|
main_screen_id.setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
wsi->getScreenResolution(main_screen_id, width, height);
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
|
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
|
||||||
traits->x = 100;
|
traits->x = 100;
|
||||||
@@ -101,6 +105,8 @@ int main( int argc, char **argv )
|
|||||||
traits->windowDecoration = true;
|
traits->windowDecoration = true;
|
||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
if (gc.valid())
|
if (gc.valid())
|
||||||
|
|||||||
@@ -109,8 +109,9 @@ bool PickHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapte
|
|||||||
user_event->setName("osc_test_1");
|
user_event->setName("osc_test_1");
|
||||||
|
|
||||||
_device->sendEvent(*user_event);
|
_device->sendEvent(*user_event);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -443,6 +444,8 @@ int main( int argc, char **argv )
|
|||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
traits->windowName = "Receiver / view two";
|
traits->windowName = "Receiver / view two";
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
|
|
||||||
@@ -509,6 +512,8 @@ int main( int argc, char **argv )
|
|||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
traits->windowName = "Sender / view one";
|
traits->windowName = "Sender / view one";
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
|
|
||||||
|
|||||||
@@ -644,6 +644,7 @@ bool SlideEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIAction
|
|||||||
}
|
}
|
||||||
|
|
||||||
_album->setVisibility();
|
_album->setVisibility();
|
||||||
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -712,6 +712,8 @@ int main(int argc, char** argv)
|
|||||||
traits->pbuffer = true;
|
traits->pbuffer = true;
|
||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
pbuffer = osg::GraphicsContext::createGraphicsContext(traits.get());
|
pbuffer = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
if (pbuffer.valid())
|
if (pbuffer.valid())
|
||||||
|
|||||||
@@ -182,7 +182,11 @@ void singleWindowSideBySideCameras(osgViewer::Viewer& viewer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned int width, height;
|
unsigned int width, height;
|
||||||
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
|
osg::GraphicsContext::ScreenIdentifier main_screen_id;
|
||||||
|
|
||||||
|
main_screen_id.readDISPLAY();
|
||||||
|
main_screen_id.setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
wsi->getScreenResolution(main_screen_id, width, height);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -198,6 +202,8 @@ void singleWindowSideBySideCameras(osgViewer::Viewer& viewer)
|
|||||||
traits->windowDecoration = true;
|
traits->windowDecoration = true;
|
||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
if (gc.valid())
|
if (gc.valid())
|
||||||
|
|||||||
@@ -87,6 +87,8 @@ int main( int argc, char** argv )
|
|||||||
traits->windowDecoration = true;
|
traits->windowDecoration = true;
|
||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->glContextVersion = version;
|
traits->glContextVersion = version;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
osg::ref_ptr< osg::GraphicsContext > gc = osg::GraphicsContext::createGraphicsContext( traits.get() );
|
osg::ref_ptr< osg::GraphicsContext > gc = osg::GraphicsContext::createGraphicsContext( traits.get() );
|
||||||
if( !gc.valid() )
|
if( !gc.valid() )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -142,6 +142,8 @@ int main( int argc, char **argv )
|
|||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
traits->pbuffer = false;
|
traits->pbuffer = false;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
if (!gc || !gc->valid())
|
if (!gc || !gc->valid())
|
||||||
|
|||||||
@@ -146,7 +146,11 @@ int main(int argc, char** argv)
|
|||||||
|
|
||||||
|
|
||||||
unsigned int width, height;
|
unsigned int width, height;
|
||||||
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
|
osg::GraphicsContext::ScreenIdentifier main_screen_id;
|
||||||
|
|
||||||
|
main_screen_id.readDISPLAY();
|
||||||
|
main_screen_id.setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
wsi->getScreenResolution(main_screen_id, width, height);
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
|
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
|
||||||
traits->x = 0;
|
traits->x = 0;
|
||||||
@@ -155,6 +159,8 @@ int main(int argc, char** argv)
|
|||||||
traits->height = height;
|
traits->height = height;
|
||||||
traits->windowDecoration = false;
|
traits->windowDecoration = false;
|
||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
if (!gc)
|
if (!gc)
|
||||||
|
|||||||
@@ -140,7 +140,8 @@ END_EVENT_TABLE()
|
|||||||
|
|
||||||
OSGCanvas::OSGCanvas(wxWindow *parent, wxWindowID id,
|
OSGCanvas::OSGCanvas(wxWindow *parent, wxWindowID id,
|
||||||
const wxPoint& pos, const wxSize& size, long style, const wxString& name, int *attributes)
|
const wxPoint& pos, const wxSize& size, long style, const wxString& name, int *attributes)
|
||||||
: wxGLCanvas(parent, id, pos, size, style|wxFULL_REPAINT_ON_RESIZE, name, attributes)
|
: wxGLCanvas(parent, id, attributes, pos, size, style|wxFULL_REPAINT_ON_RESIZE, name)
|
||||||
|
,_context(this)
|
||||||
{
|
{
|
||||||
// default cursor to standard
|
// default cursor to standard
|
||||||
_oldCursor = *wxSTANDARD_CURSOR;
|
_oldCursor = *wxSTANDARD_CURSOR;
|
||||||
@@ -150,6 +151,11 @@ OSGCanvas::~OSGCanvas()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OSGCanvas::SetContextCurrent()
|
||||||
|
{
|
||||||
|
_context.SetCurrent(*this);
|
||||||
|
}
|
||||||
|
|
||||||
void OSGCanvas::OnPaint( wxPaintEvent& WXUNUSED(event) )
|
void OSGCanvas::OnPaint( wxPaintEvent& WXUNUSED(event) )
|
||||||
{
|
{
|
||||||
/* must always be here */
|
/* must always be here */
|
||||||
@@ -158,8 +164,6 @@ void OSGCanvas::OnPaint( wxPaintEvent& WXUNUSED(event) )
|
|||||||
|
|
||||||
void OSGCanvas::OnSize(wxSizeEvent& event)
|
void OSGCanvas::OnSize(wxSizeEvent& event)
|
||||||
{
|
{
|
||||||
// this is also necessary to update the context on some platforms
|
|
||||||
wxGLCanvas::OnSize(event);
|
|
||||||
|
|
||||||
// set GL viewport (not called by wxGLCanvas::OnSize on all platforms...)
|
// set GL viewport (not called by wxGLCanvas::OnSize on all platforms...)
|
||||||
int width, height;
|
int width, height;
|
||||||
@@ -337,7 +341,7 @@ void GraphicsWindowWX::useCursor(bool cursorOn)
|
|||||||
|
|
||||||
bool GraphicsWindowWX::makeCurrentImplementation()
|
bool GraphicsWindowWX::makeCurrentImplementation()
|
||||||
{
|
{
|
||||||
_canvas->SetCurrent();
|
_canvas->SetContextCurrent();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,12 +38,14 @@ public:
|
|||||||
|
|
||||||
void UseCursor(bool value);
|
void UseCursor(bool value);
|
||||||
|
|
||||||
|
void SetContextCurrent();
|
||||||
private:
|
private:
|
||||||
DECLARE_EVENT_TABLE()
|
DECLARE_EVENT_TABLE()
|
||||||
|
|
||||||
osg::ref_ptr<osgViewer::GraphicsWindow> _graphics_window;
|
osg::ref_ptr<osgViewer::GraphicsWindow> _graphics_window;
|
||||||
|
|
||||||
wxCursor _oldCursor;
|
wxCursor _oldCursor;
|
||||||
|
wxGLContext _context;
|
||||||
};
|
};
|
||||||
|
|
||||||
class GraphicsWindowWX : public osgViewer::GraphicsWindow
|
class GraphicsWindowWX : public osgViewer::GraphicsWindow
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ class EscapeHandler : public osgGA::GUIEventHandler
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -58,6 +58,8 @@ int main( int argc, char **argv )
|
|||||||
traits->windowDecoration = true;
|
traits->windowDecoration = true;
|
||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
|
|
||||||
@@ -82,6 +84,8 @@ int main( int argc, char **argv )
|
|||||||
traits->windowDecoration = true;
|
traits->windowDecoration = true;
|
||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
|
traits->readDISPLAY();
|
||||||
|
traits->setUndefinedScreenDetailsToDefaultScreen();
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
|
|
||||||
|
|||||||
@@ -365,11 +365,21 @@ class OSG_EXPORT GLExtensions : public osg::Referenced
|
|||||||
void (GL_APIENTRY * glUniformMatrix4x3dv)( GLint location, GLsizei count, GLboolean transpose, const GLdouble* value );
|
void (GL_APIENTRY * glUniformMatrix4x3dv)( GLint location, GLsizei count, GLboolean transpose, const GLdouble* value );
|
||||||
void (GL_APIENTRY * glGetActiveAtomicCounterBufferiv)( GLuint program, GLuint bufferIndex, GLenum pname, GLint* params );
|
void (GL_APIENTRY * glGetActiveAtomicCounterBufferiv)( GLuint program, GLuint bufferIndex, GLenum pname, GLint* params );
|
||||||
void (GL_APIENTRY * glDispatchCompute)( GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ );
|
void (GL_APIENTRY * glDispatchCompute)( GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ );
|
||||||
GLuint64 (GL_APIENTRY* glGetTextureHandle)(GLint texture);
|
|
||||||
void (GL_APIENTRY* glMakeTextureHandleResident)(GLuint64 handle);
|
// ARB_bindless_texture
|
||||||
void (GL_APIENTRY* glMakeTextureHandleNonResident)(GLuint64 handle);
|
GLuint64 (GL_APIENTRY* glGetTextureHandle)(GLuint texture);
|
||||||
void (GL_APIENTRY* glUniformHandleui64)(GLint location, GLuint64 handle);
|
GLuint64 (GL_APIENTRY* glGetTextureSamplerHandle)(GLuint texture, GLuint sampler);
|
||||||
GLboolean (GL_APIENTRY* glIsTextureHandleResident)(GLuint64 handle);
|
void (GL_APIENTRY* glMakeTextureHandleResident)(GLuint64 handle);
|
||||||
|
void (GL_APIENTRY* glMakeTextureHandleNonResident)(GLuint64 handle);
|
||||||
|
GLboolean (GL_APIENTRY* glIsTextureHandleResident)(GLuint64 handle);
|
||||||
|
GLuint64 (GL_APIENTRY* glGetImageHandle)(GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);
|
||||||
|
void (GL_APIENTRY* glMakeImageHandleResident)(GLuint64 handle);
|
||||||
|
void (GL_APIENTRY* glMakeImageHandleNonResident)(GLuint64 handle);
|
||||||
|
GLboolean (GL_APIENTRY* glIsImageHandleResident)(GLuint64 handle);
|
||||||
|
void (GL_APIENTRY* glUniformHandleui64)(GLint location, GLuint64 handle);
|
||||||
|
void (GL_APIENTRY* glUniformHandleuiv64)(GLint location, GLsizei count, GLuint64 *handles);
|
||||||
|
void (GL_APIENTRY* glProgramUniformHandleui64)(GLuint program, GLint location, GLuint64 handle);
|
||||||
|
void (GL_APIENTRY* glProgramUniformHandleuiv64)(GLuint program, GLint location, GLsizei count, GLuint64 *handles);
|
||||||
|
|
||||||
// Buffer Object extensions
|
// Buffer Object extensions
|
||||||
bool isBufferObjectSupported;
|
bool isBufferObjectSupported;
|
||||||
@@ -538,7 +548,17 @@ class OSG_EXPORT GLExtensions : public osg::Referenced
|
|||||||
isNonPowerOfTwoTextureMipMappedSupported;
|
isNonPowerOfTwoTextureMipMappedSupported;
|
||||||
}
|
}
|
||||||
|
|
||||||
void (GL_APIENTRY * glTexStorage2D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
|
///immutable texture storage and texture view
|
||||||
|
void (GL_APIENTRY * glTexStorage1D) (GLenum target, GLsizei numMipmapLevels, GLenum internalformat, GLsizei width);
|
||||||
|
void (GL_APIENTRY * glTextureStorage1D) (GLuint texture, GLsizei numMipmapLevels, GLenum internalformat, GLsizei width);
|
||||||
|
void (GL_APIENTRY * glTexStorage2D) (GLenum target, GLsizei numMipmapLevels, GLenum internalformat, GLsizei width, GLsizei height);
|
||||||
|
void (GL_APIENTRY * glTextureStorage2D) (GLuint texture, GLsizei numMipmapLevels, GLenum internalformat, GLsizei width, GLsizei height);
|
||||||
|
void (GL_APIENTRY * glTexStorage3D) ( GLenum target, GLsizei numMipmapLevels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
|
||||||
|
void (GL_APIENTRY * glTextureStorage3D) ( GLuint texture, GLsizei numMipmapLevels,GLenum internalformat,GLsizei width,GLsizei height,GLsizei depth);
|
||||||
|
void (GL_APIENTRY * glTexStorage2DMultisample) ( GLenum target, GLsizei numSamples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
|
||||||
|
void (GL_APIENTRY * glTexStorage3DMultisample) ( GLenum target, GLsizei numSamples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
|
||||||
|
void (GL_APIENTRY * glTextureView) ( GLuint texture, GLenum target, GLuint orig, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
|
||||||
|
|
||||||
void (GL_APIENTRY * glCompressedTexImage2D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
|
void (GL_APIENTRY * glCompressedTexImage2D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
|
||||||
void (GL_APIENTRY * glCompressedTexSubImage2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
|
void (GL_APIENTRY * glCompressedTexSubImage2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
|
||||||
void (GL_APIENTRY * glGetCompressedTexImage) (GLenum target, GLint level, GLvoid *data);
|
void (GL_APIENTRY * glGetCompressedTexImage) (GLenum target, GLint level, GLvoid *data);
|
||||||
@@ -557,8 +577,6 @@ class OSG_EXPORT GLExtensions : public osg::Referenced
|
|||||||
|
|
||||||
void (GL_APIENTRY * glTexImage3D) ( GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
|
void (GL_APIENTRY * glTexImage3D) ( GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
|
||||||
void (GL_APIENTRY * glTexSubImage3D) ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
|
void (GL_APIENTRY * glTexSubImage3D) ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
|
||||||
void (GL_APIENTRY * glTexStorage3D) ( GLenum target, GLsizei numMipmapLevels,GLenum sizedInternalFormat,GLsizei width,GLsizei height,GLsizei depth);
|
|
||||||
void (GL_APIENTRY * glTextureStorage3D) ( GLuint texture, GLsizei numMipmapLevels,GLenum sizedInternalFormat,GLsizei width,GLsizei height,GLsizei depth);
|
|
||||||
|
|
||||||
void (GL_APIENTRY * glCopyTexSubImage3D) ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height );
|
void (GL_APIENTRY * glCopyTexSubImage3D) ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height );
|
||||||
void (GL_APIENTRY * glCompressedTexImage3D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
|
void (GL_APIENTRY * glCompressedTexImage3D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
|
||||||
|
|||||||
@@ -327,7 +327,7 @@ class OSG_EXPORT Matrixd
|
|||||||
inline Vec4f operator* ( const Vec4f& v ) const;
|
inline Vec4f operator* ( const Vec4f& v ) const;
|
||||||
inline Vec4d operator* ( const Vec4d& v ) const;
|
inline Vec4d operator* ( const Vec4d& v ) const;
|
||||||
|
|
||||||
#ifdef USE_DEPRECATED_API
|
#ifdef OSG_USE_DEPRECATED_API
|
||||||
inline void set(const Quat& q) { makeRotate(q); } /// deprecated, replace with makeRotate(q)
|
inline void set(const Quat& q) { makeRotate(q); } /// deprecated, replace with makeRotate(q)
|
||||||
inline void get(Quat& q) const { q = getRotate(); } /// deprecated, replace with getRotate()
|
inline void get(Quat& q) const { q = getRotate(); } /// deprecated, replace with getRotate()
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -328,7 +328,7 @@ class OSG_EXPORT Matrixf
|
|||||||
inline Vec4f operator* ( const Vec4f& v ) const;
|
inline Vec4f operator* ( const Vec4f& v ) const;
|
||||||
inline Vec4d operator* ( const Vec4d& v ) const;
|
inline Vec4d operator* ( const Vec4d& v ) const;
|
||||||
|
|
||||||
#ifdef USE_DEPRECATED_API
|
#ifdef OSG_USE_DEPRECATED_API
|
||||||
inline void set(const Quat& q) { makeRotate(q); }
|
inline void set(const Quat& q) { makeRotate(q); }
|
||||||
inline void get(Quat& q) const { q = getRotate(); }
|
inline void get(Quat& q) const { q = getRotate(); }
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -306,6 +306,7 @@ class OSG_EXPORT Shader : public osg::Object
|
|||||||
/** osg::Programs that this osg::Shader is attached to */
|
/** osg::Programs that this osg::Shader is attached to */
|
||||||
typedef std::set< osg::Program* > ProgramSet;
|
typedef std::set< osg::Program* > ProgramSet;
|
||||||
ProgramSet _programSet;
|
ProgramSet _programSet;
|
||||||
|
OpenThreads::Mutex _programSetMutex;
|
||||||
mutable osg::buffered_value< osg::ref_ptr<ShaderObjects> > _pcsList;
|
mutable osg::buffered_value< osg::ref_ptr<ShaderObjects> > _pcsList;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -652,8 +652,10 @@ class OSG_EXPORT Texture : public osg::StateAttribute
|
|||||||
/** Get the internal texture format type. */
|
/** Get the internal texture format type. */
|
||||||
inline InternalFormatType getInternalFormatType() const { return _internalFormatType; }
|
inline InternalFormatType getInternalFormatType() const { return _internalFormatType; }
|
||||||
|
|
||||||
class TextureObject;
|
/* select the size internal format to use based on Image when available or Texture format settings.*/
|
||||||
|
GLenum selectSizedInternalFormat(const osg::Image* image=0) const;
|
||||||
|
|
||||||
|
class TextureObject;
|
||||||
|
|
||||||
/** return true if the texture image data has been modified and the associated GL texture object needs to be updated.*/
|
/** return true if the texture image data has been modified and the associated GL texture object needs to be updated.*/
|
||||||
virtual bool isDirty(unsigned int /*contextID*/) const { return false; }
|
virtual bool isDirty(unsigned int /*contextID*/) const { return false; }
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ public:
|
|||||||
bool operator == (const observer_ptr& wp) const { return _reference == wp._reference; }
|
bool operator == (const observer_ptr& wp) const { return _reference == wp._reference; }
|
||||||
bool operator != (const observer_ptr& wp) const { return _reference != wp._reference; }
|
bool operator != (const observer_ptr& wp) const { return _reference != wp._reference; }
|
||||||
bool operator < (const observer_ptr& wp) const { return _reference < wp._reference; }
|
bool operator < (const observer_ptr& wp) const { return _reference < wp._reference; }
|
||||||
bool operator > (const observer_ptr& wp) const { return _reference > wp._reference; }
|
bool operator > (const observer_ptr& wp) const { return wp._reference < _reference; }
|
||||||
|
|
||||||
// Non-strict interface, for compatibility
|
// Non-strict interface, for compatibility
|
||||||
// comparison operator for const T*.
|
// comparison operator for const T*.
|
||||||
|
|||||||
@@ -551,21 +551,24 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
template<typename C, typename P>
|
template<typename C, typename P>
|
||||||
class ObjectSerializer : public TemplateSerializer<P*>
|
class ObjectSerializer : public BaseSerializer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef TemplateSerializer<P*> ParentType;
|
|
||||||
typedef const P* (C::*Getter)() const;
|
typedef const P* (C::*Getter)() const;
|
||||||
typedef void (C::*Setter)( P* );
|
typedef void (C::*Setter)( P* );
|
||||||
|
|
||||||
ObjectSerializer( const char* name, P* def, Getter gf, Setter sf ) : ParentType(name, def), _getter(gf), _setter(sf)
|
ObjectSerializer( const char* name, P* def, Getter gf, Setter sf ) :
|
||||||
|
BaseSerializer(READ_WRITE_PROPERTY),
|
||||||
|
_name(name), _defaultValue(def), _getter(gf), _setter(sf)
|
||||||
{
|
{
|
||||||
ParentType::setUsage( _getter!=0, _setter!=0);
|
setUsage( _getter!=0, _setter!=0);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool set(osg::Object& obj, void* value) { C& object = OBJECT_CAST<C&>(obj); (object.*_setter)( dynamic_cast<P*>(*(reinterpret_cast<osg::Object**>(value))) ); return true; }
|
virtual bool set(osg::Object& obj, void* value) { C& object = OBJECT_CAST<C&>(obj); (object.*_setter)( dynamic_cast<P*>(*(reinterpret_cast<osg::Object**>(value))) ); return true; }
|
||||||
virtual bool get(const osg::Object& obj, void* value) { const C& object = OBJECT_CAST<const C&>(obj);*(reinterpret_cast<const osg::Object**>(value )) = dynamic_cast<const osg::Object*>((object.*_getter)()); return true; }
|
virtual bool get(const osg::Object& obj, void* value) { const C& object = OBJECT_CAST<const C&>(obj);*(reinterpret_cast<const osg::Object**>(value )) = dynamic_cast<const osg::Object*>((object.*_getter)()); return true; }
|
||||||
|
|
||||||
|
virtual const std::string& getName() const { return _name; }
|
||||||
|
|
||||||
virtual bool read( InputStream& is, osg::Object& obj )
|
virtual bool read( InputStream& is, osg::Object& obj )
|
||||||
{
|
{
|
||||||
C& object = OBJECT_CAST<C&>(obj);
|
C& object = OBJECT_CAST<C&>(obj);
|
||||||
@@ -579,7 +582,7 @@ public:
|
|||||||
(object.*_setter)( value.get() );
|
(object.*_setter)( value.get() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( is.matchString(ParentType::_name) )
|
else if ( is.matchString(_name) )
|
||||||
{
|
{
|
||||||
is >> hasObject;
|
is >> hasObject;
|
||||||
if ( hasObject )
|
if ( hasObject )
|
||||||
@@ -606,9 +609,9 @@ public:
|
|||||||
os.writeObject( value );
|
os.writeObject( value );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( ParentType::_defaultValue!=value )
|
else if ( _defaultValue!=value )
|
||||||
{
|
{
|
||||||
os << os.PROPERTY((ParentType::_name).c_str()) << hasObject;
|
os << os.PROPERTY(_name.c_str()) << hasObject;
|
||||||
if ( hasObject )
|
if ( hasObject )
|
||||||
{
|
{
|
||||||
os << os.BEGIN_BRACKET << std::endl;
|
os << os.BEGIN_BRACKET << std::endl;
|
||||||
@@ -621,8 +624,10 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Getter _getter;
|
std::string _name;
|
||||||
Setter _setter;
|
osg::ref_ptr<P> _defaultValue;
|
||||||
|
Getter _getter;
|
||||||
|
Setter _setter;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename C, typename P>
|
template<typename C, typename P>
|
||||||
|
|||||||
@@ -105,9 +105,9 @@ class OSGDB_EXPORT XmlNode : public osg::Referenced
|
|||||||
|
|
||||||
size_type currentPosition() const { return _currentPos; }
|
size_type currentPosition() const { return _currentPos; }
|
||||||
|
|
||||||
int get() { if (_currentPos<_buffer.size()) return _buffer[_currentPos++]; else return -1; }
|
int get() { if (_currentPos<_buffer.size()) return static_cast<unsigned char>(_buffer[_currentPos++]); else return -1; }
|
||||||
|
|
||||||
int operator [] (size_type i) const { if ((_currentPos+i)<_buffer.size()) return _buffer[_currentPos+i]; else return -1; }
|
int operator [] (size_type i) const { if ((_currentPos+i)<_buffer.size()) return static_cast<unsigned char>(_buffer[_currentPos+i]); else return -1; }
|
||||||
|
|
||||||
void operator ++ () { if (_currentPos<_buffer.size()) ++_currentPos; }
|
void operator ++ () { if (_currentPos<_buffer.size()) ++_currentPos; }
|
||||||
|
|
||||||
@@ -129,12 +129,56 @@ class OSGDB_EXPORT XmlNode : public osg::Referenced
|
|||||||
|
|
||||||
bool match(const std::string& str) { return (_currentPos<_buffer.size()) ? _buffer.compare(_currentPos, str.size(), str)==0 : false; }
|
bool match(const std::string& str) { return (_currentPos<_buffer.size()) ? _buffer.compare(_currentPos, str.size(), str)==0 : false; }
|
||||||
|
|
||||||
|
enum Encoding
|
||||||
|
{
|
||||||
|
ENCODING_ASCII,
|
||||||
|
ENCODING_UTF8
|
||||||
|
};
|
||||||
|
|
||||||
|
void setEncoding(Encoding encoding) { _encoding = encoding; }
|
||||||
|
Encoding getEncoding() const { return _encoding; }
|
||||||
|
|
||||||
|
inline void copyCharacterToString(std::string& str)
|
||||||
|
{
|
||||||
|
if (_currentPos>=_buffer.size()) return;
|
||||||
|
switch (_encoding)
|
||||||
|
{
|
||||||
|
case(ENCODING_UTF8) :
|
||||||
|
{
|
||||||
|
int char0 = static_cast<unsigned char>(_buffer[_currentPos]); ++_currentPos;
|
||||||
|
str.push_back(char0);
|
||||||
|
|
||||||
|
if (char0 < 0x80 || _currentPos>=_buffer.size()) break; // 1-byte character
|
||||||
|
|
||||||
|
str.push_back(_buffer[_currentPos]); ++_currentPos;
|
||||||
|
if (char0<0xe0 || _currentPos<_buffer.size()) break; // 2-byte character
|
||||||
|
|
||||||
|
str.push_back(_buffer[_currentPos]); ++_currentPos;
|
||||||
|
if (char0<0xf0 || _currentPos>=_buffer.size()) break; // 3-byte character
|
||||||
|
|
||||||
|
str.push_back(_buffer[_currentPos]); ++_currentPos;
|
||||||
|
if (char0<0xf8 || _currentPos>=_buffer.size()) break; // 4-byte character
|
||||||
|
|
||||||
|
if (_currentPos>=_buffer.size()) break;
|
||||||
|
str.push_back(_buffer[_currentPos]); ++_currentPos; // 5-byte character?
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case(ENCODING_ASCII) :
|
||||||
|
default:
|
||||||
|
str.push_back(_buffer[_currentPos]);
|
||||||
|
++_currentPos;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
size_type _currentPos;
|
size_type _currentPos;
|
||||||
|
|
||||||
std::ifstream _fin;
|
std::ifstream _fin;
|
||||||
std::string _buffer;
|
std::string _buffer;
|
||||||
|
Encoding _encoding;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -162,7 +162,6 @@ class OSGGA_EXPORT CameraManipulator : public GUIEventHandler
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
Start/restart the manipulator.
|
Start/restart the manipulator.
|
||||||
FIXME: what does this actually mean? Provide examples.
|
|
||||||
*/
|
*/
|
||||||
virtual void init(const GUIEventAdapter& ,GUIActionAdapter&) {}
|
virtual void init(const GUIEventAdapter& ,GUIActionAdapter&) {}
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
#include <osgText/KerningType>
|
#include <osgText/KerningType>
|
||||||
#include <osgText/Style>
|
#include <osgText/Style>
|
||||||
|
|
||||||
#include <OpenThreads/Mutex>
|
#include <OpenThreads/ReentrantMutex>
|
||||||
|
|
||||||
namespace osgText {
|
namespace osgText {
|
||||||
|
|
||||||
@@ -126,6 +126,8 @@ protected:
|
|||||||
|
|
||||||
typedef std::vector< osg::ref_ptr<TextureInfo> > TextureInfoList;
|
typedef std::vector< osg::ref_ptr<TextureInfo> > TextureInfoList;
|
||||||
TextureInfoList _textureInfoList;
|
TextureInfoList _textureInfoList;
|
||||||
|
|
||||||
|
mutable OpenThreads::ReentrantMutex _textureInfoListMutex;
|
||||||
};
|
};
|
||||||
|
|
||||||
class OSGTEXT_EXPORT GlyphGeometry : public osg::Referenced
|
class OSGTEXT_EXPORT GlyphGeometry : public osg::Referenced
|
||||||
|
|||||||
@@ -20,6 +20,11 @@ SET(TARGET_SRC
|
|||||||
../common/Version.cpp
|
../common/Version.cpp
|
||||||
../common/Atomic.cpp
|
../common/Atomic.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
IF(CYGWIN) # define for pthread_{yield,getconcurrency,setconcurrency}
|
||||||
|
ADD_DEFINITIONS(-D_GNU_SOURCE)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
IF(ANDROID)
|
IF(ANDROID)
|
||||||
ADD_DEFINITIONS(-D_GNU_SOURCE)
|
ADD_DEFINITIONS(-D_GNU_SOURCE)
|
||||||
SET(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_GNU_SOURCE")
|
SET(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_GNU_SOURCE")
|
||||||
|
|||||||
@@ -256,7 +256,8 @@ Drawable::Drawable(const Drawable& drawable,const CopyOp& copyop):
|
|||||||
|
|
||||||
Drawable::~Drawable()
|
Drawable::~Drawable()
|
||||||
{
|
{
|
||||||
dirtyGLObjects();
|
_stateset = 0;
|
||||||
|
Drawable::releaseGLObjects();
|
||||||
}
|
}
|
||||||
|
|
||||||
osg::MatrixList Drawable::getWorldMatrices(const osg::Node* haltTraversalAtNode) const
|
osg::MatrixList Drawable::getWorldMatrices(const osg::Node* haltTraversalAtNode) const
|
||||||
@@ -340,7 +341,26 @@ void Drawable::releaseGLObjects(State* state) const
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const_cast<Drawable*>(this)->dirtyGLObjects();
|
#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
|
||||||
|
|
||||||
|
for(unsigned int i=0; i<_vertexArrayStateList.size(); ++i)
|
||||||
|
{
|
||||||
|
VertexArrayState* vas = _vertexArrayStateList[i].get();
|
||||||
|
if (vas)
|
||||||
|
{
|
||||||
|
vas->release();
|
||||||
|
_vertexArrayStateList[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -434,9 +454,8 @@ void Drawable::setUseVertexBufferObjects(bool flag)
|
|||||||
|
|
||||||
void Drawable::dirtyGLObjects()
|
void Drawable::dirtyGLObjects()
|
||||||
{
|
{
|
||||||
unsigned int i;
|
|
||||||
#ifdef OSG_GL_DISPLAYLISTS_AVAILABLE
|
#ifdef OSG_GL_DISPLAYLISTS_AVAILABLE
|
||||||
for(i=0;i<_globjList.size();++i)
|
for(unsigned int i=0;i<_globjList.size();++i)
|
||||||
{
|
{
|
||||||
if (_globjList[i] != 0)
|
if (_globjList[i] != 0)
|
||||||
{
|
{
|
||||||
@@ -446,7 +465,7 @@ void Drawable::dirtyGLObjects()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for(i=0; i<_vertexArrayStateList.size(); ++i)
|
for(unsigned int i=0; i<_vertexArrayStateList.size(); ++i)
|
||||||
{
|
{
|
||||||
VertexArrayState* vas = _vertexArrayStateList[i].get();
|
VertexArrayState* vas = _vertexArrayStateList[i].get();
|
||||||
if (vas) vas->dirty();
|
if (vas) vas->dirty();
|
||||||
|
|||||||
@@ -399,17 +399,6 @@ OSG_INIT_SINGLETON_PROXY(GLExtensionDisableStringInitializationProxy, osg::getGL
|
|||||||
|
|
||||||
#elif defined (__linux__)
|
#elif defined (__linux__)
|
||||||
|
|
||||||
typedef void (*__GLXextFuncPtr)(void);
|
|
||||||
typedef __GLXextFuncPtr (*GetProcAddressARBProc)(const char*);
|
|
||||||
|
|
||||||
#if !defined(OSG_GLES1_AVAILABLE) && !defined(OSG_GLES2_AVAILABLE)
|
|
||||||
static GetProcAddressARBProc s_glXGetProcAddressARB = convertPointerType<GetProcAddressARBProc, void*>(dlsym(0, "glXGetProcAddressARB"));
|
|
||||||
if (s_glXGetProcAddressARB)
|
|
||||||
{
|
|
||||||
return convertPointerType<void*, __GLXextFuncPtr>((s_glXGetProcAddressARB)(funcName));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return dlsym(0, funcName);
|
return dlsym(0, funcName);
|
||||||
|
|
||||||
#elif defined (__QNX__)
|
#elif defined (__QNX__)
|
||||||
@@ -913,18 +902,6 @@ GLExtensions::GLExtensions(unsigned int in_contextID):
|
|||||||
{
|
{
|
||||||
maxTextureSize = osg_max_size;
|
maxTextureSize = osg_max_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
setGLExtensionFuncPtr(glTexStorage2D,"glTexStorage2D","glTexStorage2DARB", validContext);
|
|
||||||
setGLExtensionFuncPtr(glCompressedTexImage2D,"glCompressedTexImage2D","glCompressedTexImage2DARB", validContext);
|
|
||||||
setGLExtensionFuncPtr(glCompressedTexSubImage2D,"glCompressedTexSubImage2D","glCompressedTexSubImage2DARB", validContext);
|
|
||||||
setGLExtensionFuncPtr(glGetCompressedTexImage,"glGetCompressedTexImage","glGetCompressedTexImageARB", validContext);;
|
|
||||||
setGLExtensionFuncPtr(glTexImage2DMultisample, "glTexImage2DMultisample", "glTexImage2DMultisampleARB", validContext);
|
|
||||||
|
|
||||||
setGLExtensionFuncPtr(glTexParameterIiv, "glTexParameterIiv", "glTexParameterIivARB", "glTexParameterIivEXT", validContext);
|
|
||||||
setGLExtensionFuncPtr(glTexParameterIuiv, "glTexParameterIuiv", "glTexParameterIuivARB", "glTexParameterIuivEXT", validContext);
|
|
||||||
|
|
||||||
setGLExtensionFuncPtr(glBindImageTexture, "glBindImageTexture", "glBindImageTextureARB", validContext);
|
|
||||||
|
|
||||||
isTextureMaxLevelSupported = (glVersion >= 1.2f);
|
isTextureMaxLevelSupported = (glVersion >= 1.2f);
|
||||||
|
|
||||||
isTextureStorageEnabled = validContext && ((glVersion >= 4.2f) || isGLExtensionSupported(contextID, "GL_ARB_texture_storage"));
|
isTextureStorageEnabled = validContext && ((glVersion >= 4.2f) || isGLExtensionSupported(contextID, "GL_ARB_texture_storage"));
|
||||||
@@ -939,6 +916,27 @@ GLExtensions::GLExtensions(unsigned int in_contextID):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setGLExtensionFuncPtr(glTexStorage1D,"glTexStorage1D","glTexStorage1DARB", validContext);
|
||||||
|
setGLExtensionFuncPtr(glTextureStorage1D,"glTextureStorage1D","glTextureStorage1DARB", validContext);
|
||||||
|
setGLExtensionFuncPtr(glTexStorage2D,"glTexStorage2D","glTexStorage2DARB", validContext);
|
||||||
|
setGLExtensionFuncPtr(glTextureStorage2D,"glTextureStorage2D","glTextureStorage2DARB", validContext);
|
||||||
|
setGLExtensionFuncPtr(glTexStorage3D, "glTexStorage3D","glTexStorage3DEXT", validContext);
|
||||||
|
setGLExtensionFuncPtr(glTextureStorage3D, "glTextureStorage3D","glTextureStorage3DEXT", validContext);
|
||||||
|
setGLExtensionFuncPtr(glTexStorage2DMultisample, "glTextureStorage2DMultisample","glTextureStorage2DMultisampleEXT", validContext);
|
||||||
|
setGLExtensionFuncPtr(glTexStorage3DMultisample, "glTextureStorage3DMultisample","glTextureStorage3DMultisampleEXT", validContext);
|
||||||
|
setGLExtensionFuncPtr(glTextureView, "glTextureView","glTextureViewEXT", validContext);
|
||||||
|
|
||||||
|
setGLExtensionFuncPtr(glCompressedTexImage2D,"glCompressedTexImage2D","glCompressedTexImage2DARB", validContext);
|
||||||
|
setGLExtensionFuncPtr(glCompressedTexSubImage2D,"glCompressedTexSubImage2D","glCompressedTexSubImage2DARB", validContext);
|
||||||
|
setGLExtensionFuncPtr(glGetCompressedTexImage,"glGetCompressedTexImage","glGetCompressedTexImageARB", validContext);;
|
||||||
|
setGLExtensionFuncPtr(glTexImage2DMultisample, "glTexImage2DMultisample", "glTexImage2DMultisampleARB", validContext);
|
||||||
|
|
||||||
|
setGLExtensionFuncPtr(glTexParameterIiv, "glTexParameterIiv", "glTexParameterIivARB", "glTexParameterIivEXT", validContext);
|
||||||
|
setGLExtensionFuncPtr(glTexParameterIuiv, "glTexParameterIuiv", "glTexParameterIuivARB", "glTexParameterIuivEXT", validContext);
|
||||||
|
|
||||||
|
setGLExtensionFuncPtr(glBindImageTexture, "glBindImageTexture", "glBindImageTextureARB", validContext);
|
||||||
|
|
||||||
|
|
||||||
// Texture3D extensions
|
// Texture3D extensions
|
||||||
isTexture3DFast = validContext && (OSG_GL3_FEATURES || isGLExtensionSupported(contextID,"GL_EXT_texture3D"));
|
isTexture3DFast = validContext && (OSG_GL3_FEATURES || isGLExtensionSupported(contextID,"GL_EXT_texture3D"));
|
||||||
|
|
||||||
@@ -950,8 +948,6 @@ GLExtensions::GLExtensions(unsigned int in_contextID):
|
|||||||
|
|
||||||
setGLExtensionFuncPtr(glTexImage3D, "glTexImage3D","glTexImage3DEXT", validContext);
|
setGLExtensionFuncPtr(glTexImage3D, "glTexImage3D","glTexImage3DEXT", validContext);
|
||||||
setGLExtensionFuncPtr(glTexSubImage3D, "glTexSubImage3D","glTexSubImage3DEXT", validContext);
|
setGLExtensionFuncPtr(glTexSubImage3D, "glTexSubImage3D","glTexSubImage3DEXT", validContext);
|
||||||
setGLExtensionFuncPtr(glTexStorage3D, "glTexStorage3D","glTexStorage3DEXT", validContext);
|
|
||||||
setGLExtensionFuncPtr(glTextureStorage3D, "glTextureStorage3D","glTextureStorage3DEXT", validContext);
|
|
||||||
|
|
||||||
setGLExtensionFuncPtr(glCompressedTexImage3D, "glCompressedTexImage3D","glCompressedTexImage3DARB", validContext);
|
setGLExtensionFuncPtr(glCompressedTexImage3D, "glCompressedTexImage3D","glCompressedTexImage3DARB", validContext);
|
||||||
setGLExtensionFuncPtr(glCompressedTexSubImage3D, "glCompressedTexSubImage3D","glCompressedTexSubImage3DARB", validContext);
|
setGLExtensionFuncPtr(glCompressedTexSubImage3D, "glCompressedTexSubImage3D","glCompressedTexSubImage3DARB", validContext);
|
||||||
@@ -971,12 +967,21 @@ GLExtensions::GLExtensions(unsigned int in_contextID):
|
|||||||
maxLayerCount = 0;
|
maxLayerCount = 0;
|
||||||
if (validContext) glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &maxLayerCount);
|
if (validContext) glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &maxLayerCount);
|
||||||
|
|
||||||
// Bindless textures
|
// ARB_bindless_texture
|
||||||
setGLExtensionFuncPtr(glGetTextureHandle, "glGetTextureHandle", "glGetTextureHandleARB","glGetTextureHandleNV", validContext);
|
setGLExtensionFuncPtr(glGetTextureHandle, "glGetTextureHandle", "glGetTextureHandleARB","glGetTextureHandleNV", validContext);
|
||||||
|
setGLExtensionFuncPtr(glGetTextureSamplerHandle, "glGetTextureSamplerHandle","glGetTextureSamplerHandleARB", "glGetTextureSamplerHandleNV", validContext);
|
||||||
setGLExtensionFuncPtr(glMakeTextureHandleResident, "glMakeTextureHandleResident", "glMakeTextureHandleResidentARB","glMakeTextureHandleResidentNV", validContext);
|
setGLExtensionFuncPtr(glMakeTextureHandleResident, "glMakeTextureHandleResident", "glMakeTextureHandleResidentARB","glMakeTextureHandleResidentNV", validContext);
|
||||||
setGLExtensionFuncPtr(glMakeTextureHandleNonResident, "glMakeTextureHandleNonResident", "glMakeTextureHandleNonResidentARB", "glMakeTextureHandleNonResidentNV",validContext);
|
setGLExtensionFuncPtr(glMakeTextureHandleNonResident, "glMakeTextureHandleNonResident", "glMakeTextureHandleNonResidentARB", "glMakeTextureHandleNonResidentNV",validContext);
|
||||||
setGLExtensionFuncPtr(glUniformHandleui64, "glUniformHandleui64", "glUniformHandleui64ARB","glUniformHandleui64NV", validContext);
|
|
||||||
setGLExtensionFuncPtr(glIsTextureHandleResident, "glIsTextureHandleResident","glIsTextureHandleResidentARB", "glIsTextureHandleResidentNV", validContext);
|
setGLExtensionFuncPtr(glIsTextureHandleResident, "glIsTextureHandleResident","glIsTextureHandleResidentARB", "glIsTextureHandleResidentNV", validContext);
|
||||||
|
setGLExtensionFuncPtr(glGetImageHandle, "glGetImageHandle","glGetImageHandleARB", "glGetImageHandleNV", validContext);
|
||||||
|
setGLExtensionFuncPtr(glMakeImageHandleResident, "glMakeImageHandleResident","glMakeImageHandleResidentARB", "glMakeImageHandleResidentNV", validContext);
|
||||||
|
setGLExtensionFuncPtr(glMakeImageHandleNonResident, "glMakeImageHandleNonResident","glMakeImageHandleNonResidentARB", "glMakeImageHandleNonResidentNV", validContext);
|
||||||
|
setGLExtensionFuncPtr(glIsImageHandleResident, "glIsImageHandleResident","glIsImageHandleResidentARB", "glIsImageHandleResidentNV", validContext);
|
||||||
|
setGLExtensionFuncPtr(glUniformHandleui64, "glUniformHandleui64", "glUniformHandleui64ARB","glUniformHandleui64NV", validContext);
|
||||||
|
setGLExtensionFuncPtr(glUniformHandleuiv64, "glUniformHandleuiv64","glUniformHandleuiv64ARB", "glUniformHandleuiv64NV", validContext);
|
||||||
|
setGLExtensionFuncPtr(glProgramUniformHandleui64, "glProgramUniformHandleui64","glProgramUniformHandleui64ARB", "glProgramUniformHandleui64NV", validContext);
|
||||||
|
setGLExtensionFuncPtr(glProgramUniformHandleuiv64, "glProgramUniformHandleuiv64","glProgramUniformHandleuiv64ARB", "glProgramUniformHandleuiv64NV", validContext);
|
||||||
|
|
||||||
|
|
||||||
// Blending
|
// Blending
|
||||||
isBlendColorSupported = validContext &&
|
isBlendColorSupported = validContext &&
|
||||||
@@ -1054,9 +1059,7 @@ GLExtensions::GLExtensions(unsigned int in_contextID):
|
|||||||
|
|
||||||
|
|
||||||
isPointSpriteSupported = validContext && (OSG_GLES2_FEATURES || OSG_GLES3_FEATURES || OSG_GL3_FEATURES || isGLExtensionSupported(contextID, "GL_ARB_point_sprite") || isGLExtensionSupported(contextID, "GL_OES_point_sprite") || isGLExtensionSupported(contextID, "GL_NV_point_sprite"));
|
isPointSpriteSupported = validContext && (OSG_GLES2_FEATURES || OSG_GLES3_FEATURES || OSG_GL3_FEATURES || isGLExtensionSupported(contextID, "GL_ARB_point_sprite") || isGLExtensionSupported(contextID, "GL_OES_point_sprite") || isGLExtensionSupported(contextID, "GL_NV_point_sprite"));
|
||||||
|
|
||||||
isPointSpriteModeSupported = isPointSpriteSupported && !OSG_GL3_FEATURES;
|
isPointSpriteModeSupported = isPointSpriteSupported && !OSG_GL3_FEATURES;
|
||||||
|
|
||||||
isPointSpriteCoordOriginSupported = validContext && (OSG_GL3_FEATURES || (glVersion >= 2.0f));
|
isPointSpriteCoordOriginSupported = validContext && (OSG_GL3_FEATURES || (glVersion >= 2.0f));
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -82,10 +82,8 @@ Geometry::Geometry(const Geometry& geometry,const CopyOp& copyop):
|
|||||||
|
|
||||||
Geometry::~Geometry()
|
Geometry::~Geometry()
|
||||||
{
|
{
|
||||||
// do dirty here to keep the getGLObjectSizeHint() estimate on the ball
|
_stateset = 0;
|
||||||
dirtyGLObjects();
|
Geometry::releaseGLObjects();
|
||||||
|
|
||||||
// no need to delete, all automatically handled by ref_ptr :-)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ARRAY_NOT_EMPTY(array) (array!=0 && array->getNumElements()!=0)
|
#define ARRAY_NOT_EMPTY(array) (array!=0 && array->getNumElements()!=0)
|
||||||
|
|||||||
@@ -1518,7 +1518,7 @@ void Image::swap(osg::Image& rhs)
|
|||||||
|
|
||||||
void Image::scaleImage(int s,int t,int r, GLenum newDataType)
|
void Image::scaleImage(int s,int t,int r, GLenum newDataType)
|
||||||
{
|
{
|
||||||
if (_s==s && _t==t && _r==r) return;
|
if (_s==s && _t==t && _r==r && _dataType==newDataType) return;
|
||||||
|
|
||||||
if (_data==NULL)
|
if (_data==NULL)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -492,6 +492,8 @@ KdTree::KdTree(const KdTree& rhs, const osg::CopyOp& copyop):
|
|||||||
Shape(rhs, copyop),
|
Shape(rhs, copyop),
|
||||||
_degenerateCount(rhs._degenerateCount),
|
_degenerateCount(rhs._degenerateCount),
|
||||||
_vertices(rhs._vertices),
|
_vertices(rhs._vertices),
|
||||||
|
_primitiveIndices(rhs._primitiveIndices),
|
||||||
|
_vertexIndices(rhs._vertexIndices),
|
||||||
_kdNodes(rhs._kdNodes)
|
_kdNodes(rhs._kdNodes)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -483,6 +483,7 @@ Shader::PerContextShader* Shader::getPCS(osg::State& state) const
|
|||||||
|
|
||||||
bool Shader::addProgramRef( Program* program )
|
bool Shader::addProgramRef( Program* program )
|
||||||
{
|
{
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lk(_programSetMutex);
|
||||||
ProgramSet::iterator itr = _programSet.find(program);
|
ProgramSet::iterator itr = _programSet.find(program);
|
||||||
if( itr != _programSet.end() ) return false;
|
if( itr != _programSet.end() ) return false;
|
||||||
|
|
||||||
@@ -492,6 +493,7 @@ bool Shader::addProgramRef( Program* program )
|
|||||||
|
|
||||||
bool Shader::removeProgramRef( Program* program )
|
bool Shader::removeProgramRef( Program* program )
|
||||||
{
|
{
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lk(_programSetMutex);
|
||||||
ProgramSet::iterator itr = _programSet.find(program);
|
ProgramSet::iterator itr = _programSet.find(program);
|
||||||
if( itr == _programSet.end() ) return false;
|
if( itr == _programSet.end() ) return false;
|
||||||
|
|
||||||
@@ -507,6 +509,7 @@ void Shader::dirtyShader()
|
|||||||
if( _pcsList[cxt].valid() ) _pcsList[cxt]->requestCompile();
|
if( _pcsList[cxt].valid() ) _pcsList[cxt]->requestCompile();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lk(_programSetMutex);
|
||||||
// Also mark Programs that depend on us as needing relink.
|
// Also mark Programs that depend on us as needing relink.
|
||||||
for( ProgramSet::iterator itr = _programSet.begin();
|
for( ProgramSet::iterator itr = _programSet.begin();
|
||||||
itr != _programSet.end(); ++itr )
|
itr != _programSet.end(); ++itr )
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
#include <osg/ShapeDrawable>
|
#include <osg/ShapeDrawable>
|
||||||
#include <osg/GL>
|
#include <osg/GL>
|
||||||
#include <osg/Notify>
|
#include <osg/Notify>
|
||||||
|
#include <osg/KdTree>
|
||||||
|
|
||||||
using namespace osg;
|
using namespace osg;
|
||||||
|
|
||||||
@@ -76,6 +77,9 @@ void ShapeDrawable::setTessellationHints(TessellationHints* hints)
|
|||||||
|
|
||||||
void ShapeDrawable::build()
|
void ShapeDrawable::build()
|
||||||
{
|
{
|
||||||
|
// we can't create a tessellation for a KdTree
|
||||||
|
if (dynamic_cast<KdTree*>(_shape.get())!=0) return;
|
||||||
|
|
||||||
// reset all the properties.
|
// reset all the properties.
|
||||||
setVertexArray(0);
|
setVertexArray(0);
|
||||||
setNormalArray(0);
|
setNormalArray(0);
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
#include <osg/Drawable>
|
#include <osg/Drawable>
|
||||||
#include <osg/ApplicationUsage>
|
#include <osg/ApplicationUsage>
|
||||||
#include <osg/ContextData>
|
#include <osg/ContextData>
|
||||||
|
#include <osg/PointSprite>
|
||||||
#include <osg/os_utils>
|
#include <osg/os_utils>
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@@ -285,6 +286,17 @@ void State::initializeExtensionProcs()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set the validity of Modes
|
||||||
|
{
|
||||||
|
bool pointSpriteModeValid = _glExtensions->isPointSpriteModeSupported;
|
||||||
|
|
||||||
|
#if defined( OSG_GLES1_AVAILABLE ) //point sprites don't exist on es 2.0
|
||||||
|
setModeValidity(GL_POINT_SPRITE_OES, pointSpriteModeValid);
|
||||||
|
#else
|
||||||
|
setModeValidity(GL_POINT_SPRITE_ARB, pointSpriteModeValid);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
_extensionProcsInitialized = true;
|
_extensionProcsInitialized = true;
|
||||||
|
|
||||||
|
|||||||
@@ -137,6 +137,7 @@ InternalPixelRelations sizedInternalFormats[] = {
|
|||||||
|
|
||||||
|
|
||||||
, { GL_RGBA8 , GL_RGBA , GL_UNSIGNED_BYTE }
|
, { GL_RGBA8 , GL_RGBA , GL_UNSIGNED_BYTE }
|
||||||
|
, { GL_RGBA16 , GL_RGBA , GL_UNSIGNED_SHORT }
|
||||||
, { GL_RGB10_A2 , GL_RGBA , GL_UNSIGNED_INT_10_10_10_2 }
|
, { GL_RGB10_A2 , GL_RGBA , GL_UNSIGNED_INT_10_10_10_2 }
|
||||||
, { GL_RGB10_A2 , GL_RGBA , GL_UNSIGNED_INT_2_10_10_10_REV }
|
, { GL_RGB10_A2 , GL_RGBA , GL_UNSIGNED_INT_2_10_10_10_REV }
|
||||||
, { GL_RGBA12 , GL_RGBA , GL_UNSIGNED_SHORT }
|
, { GL_RGBA12 , GL_RGBA , GL_UNSIGNED_SHORT }
|
||||||
@@ -149,8 +150,8 @@ InternalPixelRelations sizedInternalFormats[] = {
|
|||||||
, { GL_RGB5_A1 , GL_RGBA , GL_UNSIGNED_INT_10_10_10_2 }
|
, { GL_RGB5_A1 , GL_RGBA , GL_UNSIGNED_INT_10_10_10_2 }
|
||||||
, { GL_RGB5_A1 , GL_RGBA , GL_UNSIGNED_INT_2_10_10_10_REV }
|
, { GL_RGB5_A1 , GL_RGBA , GL_UNSIGNED_INT_2_10_10_10_REV }
|
||||||
// , { GL_RGBA16F , GL_RGBA , GL_HALF_FLOAT }
|
// , { GL_RGBA16F , GL_RGBA , GL_HALF_FLOAT }
|
||||||
// , { GL_RGBA16F , GL_RGBA , GL_FLOAT }
|
, { GL_RGBA16F_ARB , GL_RGBA , GL_FLOAT }
|
||||||
// , { GL_RGBA32F , GL_RGBA , GL_FLOAT }
|
, { GL_RGBA32F_ARB , GL_RGBA , GL_FLOAT }
|
||||||
|
|
||||||
, { GL_SRGB8 , GL_RGB , GL_UNSIGNED_BYTE }
|
, { GL_SRGB8 , GL_RGB , GL_UNSIGNED_BYTE }
|
||||||
, { GL_SRGB8_ALPHA8 , GL_RGBA , GL_UNSIGNED_BYTE }
|
, { GL_SRGB8_ALPHA8 , GL_RGBA , GL_UNSIGNED_BYTE }
|
||||||
@@ -227,7 +228,7 @@ GLenum assumeSizedInternalFormat(GLint internalFormat, GLenum type)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isCompressedInternalFormatSupportedByTexStorrage(GLint internalFormat)
|
bool isCompressedInternalFormatSupportedByTexStorage(GLint internalFormat)
|
||||||
{
|
{
|
||||||
const size_t formatsCount = sizeof(compressedInternalFormats) / sizeof(compressedInternalFormats[0]);
|
const size_t formatsCount = sizeof(compressedInternalFormats) / sizeof(compressedInternalFormats[0]);
|
||||||
|
|
||||||
@@ -2082,6 +2083,43 @@ bool Texture::areAllTextureObjectsLoaded() const
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLenum Texture::selectSizedInternalFormat(const osg::Image* image) const
|
||||||
|
{
|
||||||
|
if (image)
|
||||||
|
{
|
||||||
|
bool compressed_image = isCompressedInternalFormat((GLenum)image->getPixelFormat());
|
||||||
|
|
||||||
|
//calculate sized internal format
|
||||||
|
if(compressed_image)
|
||||||
|
{
|
||||||
|
if(isCompressedInternalFormatSupportedByTexStorage(_internalFormat))
|
||||||
|
{
|
||||||
|
return _internalFormat;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(isSizedInternalFormat(_internalFormat))
|
||||||
|
{
|
||||||
|
return _internalFormat;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return assumeSizedInternalFormat((GLenum)image->getInternalTextureFormat(), (GLenum)image->getDataType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (isSizedInternalFormat(_internalFormat)) return _internalFormat;
|
||||||
|
|
||||||
|
return assumeSizedInternalFormat(_internalFormat, (_sourceType!=0) ? _sourceType : GL_UNSIGNED_BYTE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Texture::applyTexImage2D_load(State& state, GLenum target, const Image* image, GLsizei inwidth, GLsizei inheight,GLsizei numMipmapLevels) const
|
void Texture::applyTexImage2D_load(State& state, GLenum target, const Image* image, GLsizei inwidth, GLsizei inheight,GLsizei numMipmapLevels) const
|
||||||
{
|
{
|
||||||
@@ -2272,49 +2310,21 @@ void Texture::applyTexImage2D_load(State& state, GLenum target, const Image* ima
|
|||||||
int width = inwidth;
|
int width = inwidth;
|
||||||
int height = inheight;
|
int height = inheight;
|
||||||
|
|
||||||
bool useTexStorrage = extensions->isTextureStorageEnabled;
|
GLenum texStoragesizedInternalFormat = extensions->isTextureStorageEnabled && extensions->isTexStorage2DSupported() && (_borderWidth==0) ? selectSizedInternalFormat(image) : 0;
|
||||||
GLenum sizedInternalFormat = 0;
|
|
||||||
|
|
||||||
if(useTexStorrage)
|
if (texStoragesizedInternalFormat!=0)
|
||||||
{
|
|
||||||
if(extensions->isTexStorage2DSupported() && _borderWidth == 0)
|
|
||||||
{
|
|
||||||
//calculate sized internal format
|
|
||||||
if(!compressed_image)
|
|
||||||
{
|
|
||||||
if(isSizedInternalFormat(_internalFormat))
|
|
||||||
{
|
|
||||||
sizedInternalFormat = _internalFormat;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sizedInternalFormat = assumeSizedInternalFormat((GLenum)image->getInternalTextureFormat(), (GLenum)image->getDataType());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(isCompressedInternalFormatSupportedByTexStorrage(_internalFormat))
|
|
||||||
{
|
|
||||||
sizedInternalFormat = _internalFormat;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
useTexStorrage &= sizedInternalFormat != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(useTexStorrage)
|
|
||||||
{
|
{
|
||||||
if (getTextureTarget()==GL_TEXTURE_CUBE_MAP)
|
if (getTextureTarget()==GL_TEXTURE_CUBE_MAP)
|
||||||
{
|
{
|
||||||
if (target==GL_TEXTURE_CUBE_MAP_POSITIVE_X)
|
if (target==GL_TEXTURE_CUBE_MAP_POSITIVE_X)
|
||||||
{
|
{
|
||||||
extensions->glTexStorage2D(GL_TEXTURE_CUBE_MAP, numMipmapLevels, sizedInternalFormat, width, height);
|
// only allocate on first face image
|
||||||
|
extensions->glTexStorage2D(GL_TEXTURE_CUBE_MAP, numMipmapLevels, texStoragesizedInternalFormat, width, height);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
extensions->glTexStorage2D(target, numMipmapLevels, sizedInternalFormat, width, height);
|
extensions->glTexStorage2D(target, numMipmapLevels, texStoragesizedInternalFormat, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !compressed_image )
|
if( !compressed_image )
|
||||||
|
|||||||
@@ -230,18 +230,30 @@ void Texture1D::apply(State& state) const
|
|||||||
}
|
}
|
||||||
else if ( (_textureWidth!=0) && (_internalFormat!=0) )
|
else if ( (_textureWidth!=0) && (_internalFormat!=0) )
|
||||||
{
|
{
|
||||||
textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_1D,_numMipmapLevels,_internalFormat,_textureWidth,1,1,0);
|
// no image present, but dimensions at set so lets create the texture
|
||||||
|
GLExtensions * extensions = state.get<GLExtensions>();
|
||||||
|
GLenum texStorageSizedInternalFormat = extensions->isTextureStorageEnabled ? selectSizedInternalFormat() : 0;
|
||||||
|
if (texStorageSizedInternalFormat!=0)
|
||||||
|
{
|
||||||
|
textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_1D, _numMipmapLevels, texStorageSizedInternalFormat, _textureWidth, 1, 1, 0);
|
||||||
|
textureObject->bind();
|
||||||
|
applyTexParameters(GL_TEXTURE_1D, state);
|
||||||
|
|
||||||
textureObject->bind();
|
extensions->glTexStorage1D( GL_TEXTURE_1D, osg::maximum(_numMipmapLevels,1), texStorageSizedInternalFormat, _textureWidth);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GLenum internalFormat = _sourceFormat ? _sourceFormat : _internalFormat;
|
||||||
|
textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_1D, _numMipmapLevels, internalFormat, _textureWidth, 1, 1, 0);
|
||||||
|
textureObject->bind();
|
||||||
|
applyTexParameters(GL_TEXTURE_1D, state);
|
||||||
|
|
||||||
applyTexParameters(GL_TEXTURE_1D,state);
|
glTexImage1D( GL_TEXTURE_1D, 0, _internalFormat,
|
||||||
|
|
||||||
// no image present, but dimensions are set so lets create the texture
|
|
||||||
glTexImage1D( GL_TEXTURE_1D, 0, _internalFormat,
|
|
||||||
_textureWidth, _borderWidth,
|
_textureWidth, _borderWidth,
|
||||||
_sourceFormat ? _sourceFormat : _internalFormat,
|
internalFormat,
|
||||||
_sourceType ? _sourceType : GL_UNSIGNED_BYTE,
|
_sourceType ? _sourceType : GL_UNSIGNED_BYTE,
|
||||||
0);
|
0);
|
||||||
|
}
|
||||||
|
|
||||||
if (_readPBuffer.valid())
|
if (_readPBuffer.valid())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -243,6 +243,7 @@ void Texture2D::apply(State& state) const
|
|||||||
}
|
}
|
||||||
else if (_image.valid() && _image->data())
|
else if (_image.valid() && _image->data())
|
||||||
{
|
{
|
||||||
|
GLExtensions * extensions = state.get<GLExtensions>();
|
||||||
|
|
||||||
// keep the image around at least till we go out of scope.
|
// keep the image around at least till we go out of scope.
|
||||||
osg::ref_ptr<osg::Image> image = _image;
|
osg::ref_ptr<osg::Image> image = _image;
|
||||||
@@ -253,7 +254,10 @@ void Texture2D::apply(State& state) const
|
|||||||
// compute the dimensions of the texture.
|
// compute the dimensions of the texture.
|
||||||
computeRequiredTextureDimensions(state,*image,_textureWidth, _textureHeight, _numMipmapLevels);
|
computeRequiredTextureDimensions(state,*image,_textureWidth, _textureHeight, _numMipmapLevels);
|
||||||
|
|
||||||
textureObject = generateAndAssignTextureObject(contextID,GL_TEXTURE_2D,_numMipmapLevels,_internalFormat,_textureWidth,_textureHeight,1,_borderWidth);
|
GLenum texStorageSizedInternalFormat = extensions->isTextureStorageEnabled && (_borderWidth==0) ? selectSizedInternalFormat(_image.get()) : 0;
|
||||||
|
textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_2D, _numMipmapLevels,
|
||||||
|
texStorageSizedInternalFormat!=0 ? texStorageSizedInternalFormat : _internalFormat,
|
||||||
|
_textureWidth, _textureHeight, 1, _borderWidth);
|
||||||
|
|
||||||
textureObject->bind();
|
textureObject->bind();
|
||||||
|
|
||||||
@@ -293,18 +297,30 @@ void Texture2D::apply(State& state) const
|
|||||||
}
|
}
|
||||||
else if ( (_textureWidth!=0) && (_textureHeight!=0) && (_internalFormat!=0) )
|
else if ( (_textureWidth!=0) && (_textureHeight!=0) && (_internalFormat!=0) )
|
||||||
{
|
{
|
||||||
textureObject = generateAndAssignTextureObject(contextID,GL_TEXTURE_2D,_numMipmapLevels,_internalFormat,_textureWidth,_textureHeight,1,_borderWidth);
|
|
||||||
|
|
||||||
textureObject->bind();
|
|
||||||
|
|
||||||
applyTexParameters(GL_TEXTURE_2D,state);
|
|
||||||
|
|
||||||
// no image present, but dimensions at set so lets create the texture
|
// no image present, but dimensions at set so lets create the texture
|
||||||
glTexImage2D( GL_TEXTURE_2D, 0, _internalFormat,
|
GLExtensions * extensions = state.get<GLExtensions>();
|
||||||
_textureWidth, _textureHeight, _borderWidth,
|
GLenum texStorageSizedInternalFormat = extensions->isTextureStorageEnabled && (_borderWidth==0) ? selectSizedInternalFormat() : 0;
|
||||||
_sourceFormat ? _sourceFormat : _internalFormat,
|
if (texStorageSizedInternalFormat!=0)
|
||||||
_sourceType ? _sourceType : GL_UNSIGNED_BYTE,
|
{
|
||||||
0);
|
textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_2D, _numMipmapLevels, texStorageSizedInternalFormat, _textureWidth, _textureHeight, 1, _borderWidth);
|
||||||
|
textureObject->bind();
|
||||||
|
applyTexParameters(GL_TEXTURE_2D, state);
|
||||||
|
extensions->glTexStorage2D( GL_TEXTURE_2D, osg::maximum(_numMipmapLevels,1), texStorageSizedInternalFormat,
|
||||||
|
_textureWidth, _textureHeight);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GLenum internalFormat = _sourceFormat ? _sourceFormat : _internalFormat;
|
||||||
|
textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_2D, _numMipmapLevels, internalFormat, _textureWidth, _textureHeight, 1, _borderWidth);
|
||||||
|
textureObject->bind();
|
||||||
|
applyTexParameters(GL_TEXTURE_2D, state);
|
||||||
|
glTexImage2D( GL_TEXTURE_2D, 0, _internalFormat,
|
||||||
|
_textureWidth, _textureHeight, _borderWidth,
|
||||||
|
internalFormat,
|
||||||
|
_sourceType ? _sourceType : GL_UNSIGNED_BYTE,
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
|
||||||
if (_readPBuffer.valid())
|
if (_readPBuffer.valid())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -336,42 +336,53 @@ void Texture2DArray::apply(State& state) const
|
|||||||
// compute the internal texture format, this set the _internalFormat to an appropriate value.
|
// compute the internal texture format, this set the _internalFormat to an appropriate value.
|
||||||
computeInternalFormat();
|
computeInternalFormat();
|
||||||
|
|
||||||
|
GLenum texStorageSizedInternalFormat = extensions->isTextureStorageEnabled && (_borderWidth==0) ? selectSizedInternalFormat(_images[0].get()) : 0;
|
||||||
|
|
||||||
// compute the dimensions of the texture.
|
// compute the dimensions of the texture.
|
||||||
computeRequiredTextureDimensions(state,*_images[0],_textureWidth, _textureHeight, _numMipmapLevels);
|
computeRequiredTextureDimensions(state,*_images[0],_textureWidth, _textureHeight, _numMipmapLevels);
|
||||||
|
|
||||||
// create texture object
|
// create texture object
|
||||||
textureObject = generateAndAssignTextureObject(
|
textureObject = generateAndAssignTextureObject(
|
||||||
contextID, GL_TEXTURE_2D_ARRAY,_numMipmapLevels, _internalFormat, _textureWidth, _textureHeight, textureDepth,0);
|
contextID, GL_TEXTURE_2D_ARRAY, _numMipmapLevels,
|
||||||
|
texStorageSizedInternalFormat!=0 ? texStorageSizedInternalFormat : _internalFormat,
|
||||||
|
_textureWidth, _textureHeight, textureDepth,0);
|
||||||
|
|
||||||
// bind texture
|
// bind texture
|
||||||
textureObject->bind();
|
textureObject->bind();
|
||||||
|
|
||||||
applyTexParameters(GL_TEXTURE_2D_ARRAY, state);
|
applyTexParameters(GL_TEXTURE_2D_ARRAY, state);
|
||||||
|
|
||||||
// First we need to allocate the texture memory
|
// First we need to allocate the texture memory
|
||||||
int sourceFormat = _sourceFormat ? _sourceFormat : _internalFormat;
|
if(texStorageSizedInternalFormat!=0)
|
||||||
|
|
||||||
if( isCompressedInternalFormat( sourceFormat ) &&
|
|
||||||
sourceFormat == _internalFormat &&
|
|
||||||
extensions->isCompressedTexImage3DSupported() )
|
|
||||||
{
|
{
|
||||||
extensions->glCompressedTexImage3D( GL_TEXTURE_2D_ARRAY, 0, _internalFormat,
|
extensions->glTexStorage3D(GL_TEXTURE_2D_ARRAY, osg::maximum(_numMipmapLevels,1), texStorageSizedInternalFormat, _textureWidth, _textureHeight, textureDepth);
|
||||||
_textureWidth, _textureHeight, textureDepth, _borderWidth,
|
|
||||||
_images[0]->getImageSizeInBytes() * textureDepth,
|
|
||||||
0);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
int sourceFormat = _sourceFormat ? _sourceFormat : _internalFormat;
|
||||||
|
|
||||||
|
if( isCompressedInternalFormat( sourceFormat ) &&
|
||||||
|
sourceFormat == _internalFormat &&
|
||||||
|
extensions->isCompressedTexImage3DSupported() )
|
||||||
|
{
|
||||||
|
extensions->glCompressedTexImage3D( GL_TEXTURE_2D_ARRAY, 0, _internalFormat,
|
||||||
|
_textureWidth, _textureHeight, textureDepth, _borderWidth,
|
||||||
|
_images[0]->getImageSizeInBytes() * textureDepth,
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
// Override compressed source format with safe GL_RGBA value which not generate error
|
// Override compressed source format with safe GL_RGBA value which not generate error
|
||||||
// We can safely do this as source format is not important when source data is NULL
|
// We can safely do this as source format is not important when source data is NULL
|
||||||
if( isCompressedInternalFormat( sourceFormat ) )
|
if( isCompressedInternalFormat( sourceFormat ) )
|
||||||
sourceFormat = GL_RGBA;
|
sourceFormat = GL_RGBA;
|
||||||
|
|
||||||
extensions->glTexImage3D( GL_TEXTURE_2D_ARRAY, 0, _internalFormat,
|
extensions->glTexImage3D( GL_TEXTURE_2D_ARRAY, 0, _internalFormat,
|
||||||
_textureWidth, _textureHeight, textureDepth, _borderWidth,
|
_textureWidth, _textureHeight, textureDepth, _borderWidth,
|
||||||
sourceFormat, _sourceType ? _sourceType : GL_UNSIGNED_BYTE,
|
sourceFormat, _sourceType ? _sourceType : GL_UNSIGNED_BYTE,
|
||||||
0);
|
0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// For certain we have to manually allocate memory for mipmaps if images are compressed
|
// For certain we have to manually allocate memory for mipmaps if images are compressed
|
||||||
// if not allocated OpenGL will produce errors on mipmap upload.
|
// if not allocated OpenGL will produce errors on mipmap upload.
|
||||||
// I have not tested if this is necessary for plain texture formats but
|
// I have not tested if this is necessary for plain texture formats but
|
||||||
@@ -430,19 +441,28 @@ void Texture2DArray::apply(State& state) const
|
|||||||
else if ( (_textureWidth > 0) && (_textureHeight > 0) && (_textureDepth > 0) && (_internalFormat!=0) )
|
else if ( (_textureWidth > 0) && (_textureHeight > 0) && (_textureDepth > 0) && (_internalFormat!=0) )
|
||||||
{
|
{
|
||||||
// generate texture
|
// generate texture
|
||||||
|
GLenum texStorageSizedInternalFormat = extensions->isTextureStorageEnabled ? selectSizedInternalFormat() : 0;
|
||||||
|
|
||||||
textureObject = generateAndAssignTextureObject(
|
textureObject = generateAndAssignTextureObject(
|
||||||
contextID, GL_TEXTURE_2D_ARRAY,_numMipmapLevels,_internalFormat, _textureWidth, _textureHeight, _textureDepth,0);
|
contextID, GL_TEXTURE_2D_ARRAY, _numMipmapLevels,
|
||||||
|
texStorageSizedInternalFormat!=0 ? texStorageSizedInternalFormat :_internalFormat,
|
||||||
|
_textureWidth, _textureHeight, _textureDepth, 0);
|
||||||
|
|
||||||
textureObject->bind();
|
textureObject->bind();
|
||||||
|
|
||||||
applyTexParameters(GL_TEXTURE_2D_ARRAY,state);
|
applyTexParameters(GL_TEXTURE_2D_ARRAY,state);
|
||||||
|
|
||||||
extensions->glTexImage3D( GL_TEXTURE_2D_ARRAY, 0, _internalFormat,
|
if (texStorageSizedInternalFormat!=0)
|
||||||
|
{
|
||||||
|
extensions->glTexStorage3D( GL_TEXTURE_2D_ARRAY, osg::maximum(_numMipmapLevels,1), texStorageSizedInternalFormat, _textureWidth, _textureHeight, _textureDepth);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
extensions->glTexImage3D( GL_TEXTURE_2D_ARRAY, 0, _internalFormat,
|
||||||
_textureWidth, _textureHeight, _textureDepth,
|
_textureWidth, _textureHeight, _textureDepth,
|
||||||
_borderWidth,
|
_borderWidth,
|
||||||
_sourceFormat ? _sourceFormat : _internalFormat,
|
_sourceFormat ? _sourceFormat : _internalFormat,
|
||||||
_sourceType ? _sourceType : GL_UNSIGNED_BYTE,
|
_sourceType ? _sourceType : GL_UNSIGNED_BYTE,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// nothing before, so just unbind the texture target
|
// nothing before, so just unbind the texture target
|
||||||
|
|||||||
@@ -102,29 +102,32 @@ void Texture2DMultisample::apply(State& state) const
|
|||||||
}
|
}
|
||||||
else if ( (_textureWidth!=0) && (_textureHeight!=0) && (_numSamples!=0) )
|
else if ( (_textureWidth!=0) && (_textureHeight!=0) && (_numSamples!=0) )
|
||||||
{
|
{
|
||||||
textureObject = generateAndAssignTextureObject(
|
// no image present, but dimensions at set so lets create the texture
|
||||||
contextID,
|
GLenum texStorageSizedInternalFormat = extensions->isTextureStorageEnabled && (_borderWidth==0) ? selectSizedInternalFormat() : 0;
|
||||||
getTextureTarget(),
|
if (texStorageSizedInternalFormat!=0)
|
||||||
1,
|
{
|
||||||
_internalFormat,
|
textureObject = generateAndAssignTextureObject(contextID, getTextureTarget(), 1, texStorageSizedInternalFormat, _textureWidth, _textureHeight, 1, 0);
|
||||||
_textureWidth,
|
textureObject->bind();
|
||||||
_textureHeight,
|
|
||||||
1,
|
|
||||||
_borderWidth);
|
|
||||||
|
|
||||||
textureObject->bind();
|
extensions->glTexStorage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, _numSamples, texStorageSizedInternalFormat, _textureWidth, _textureHeight, _fixedsamplelocations);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
textureObject = generateAndAssignTextureObject(contextID, getTextureTarget(), 1, _internalFormat, _textureWidth, _textureHeight, 1, _borderWidth);
|
||||||
|
textureObject->bind();
|
||||||
|
|
||||||
extensions->glTexImage2DMultisample( getTextureTarget(),
|
extensions->glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE,
|
||||||
_numSamples,
|
_numSamples,
|
||||||
_internalFormat,
|
_internalFormat,
|
||||||
_textureWidth,
|
_textureWidth,
|
||||||
_textureHeight,
|
_textureHeight,
|
||||||
_fixedsamplelocations );
|
_fixedsamplelocations );
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
glBindTexture( getTextureTarget(), 0 );
|
glBindTexture( GL_TEXTURE_2D_MULTISAMPLE, 0 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -315,20 +315,30 @@ void Texture3D::apply(State& state) const
|
|||||||
}
|
}
|
||||||
else if ( (_textureWidth!=0) && (_textureHeight!=0) && (_textureDepth!=0) && (_internalFormat!=0) )
|
else if ( (_textureWidth!=0) && (_textureHeight!=0) && (_textureDepth!=0) && (_internalFormat!=0) )
|
||||||
{
|
{
|
||||||
textureObject = generateAndAssignTextureObject(
|
|
||||||
contextID,GL_TEXTURE_3D,_numMipmapLevels,_internalFormat,_textureWidth,_textureHeight,_textureDepth,0);
|
|
||||||
|
|
||||||
textureObject->bind();
|
|
||||||
|
|
||||||
applyTexParameters(GL_TEXTURE_3D,state);
|
|
||||||
|
|
||||||
// no image present, but dimensions at set so lets create the texture
|
// no image present, but dimensions at set so lets create the texture
|
||||||
extensions->glTexImage3D( GL_TEXTURE_3D, 0, _internalFormat,
|
GLenum texStorageSizedInternalFormat = extensions->isTextureStorageEnabled ? selectSizedInternalFormat() : 0;
|
||||||
|
if (texStorageSizedInternalFormat!=0)
|
||||||
|
{
|
||||||
|
textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_3D, _numMipmapLevels, texStorageSizedInternalFormat, _textureWidth, _textureHeight, _textureDepth,0);
|
||||||
|
textureObject->bind();
|
||||||
|
applyTexParameters(GL_TEXTURE_3D, state);
|
||||||
|
|
||||||
|
extensions->glTexStorage3D( GL_TEXTURE_3D, osg::maximum(_numMipmapLevels,1), texStorageSizedInternalFormat, _textureWidth, _textureHeight, _textureDepth);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GLenum internalFormat = _sourceFormat ? _sourceFormat : _internalFormat;
|
||||||
|
textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_3D, _numMipmapLevels, internalFormat, _textureWidth, _textureHeight, _textureDepth,0);
|
||||||
|
textureObject->bind();
|
||||||
|
applyTexParameters(GL_TEXTURE_3D, state);
|
||||||
|
|
||||||
|
extensions->glTexImage3D( GL_TEXTURE_3D, 0, _internalFormat,
|
||||||
_textureWidth, _textureHeight, _textureDepth,
|
_textureWidth, _textureHeight, _textureDepth,
|
||||||
_borderWidth,
|
_borderWidth,
|
||||||
_sourceFormat ? _sourceFormat : _internalFormat,
|
internalFormat,
|
||||||
_sourceType ? _sourceType : GL_UNSIGNED_BYTE,
|
_sourceType ? _sourceType : GL_UNSIGNED_BYTE,
|
||||||
0);
|
0);
|
||||||
|
}
|
||||||
|
|
||||||
if (_readPBuffer.valid())
|
if (_readPBuffer.valid())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -293,8 +293,12 @@ void TextureCubeMap::apply(State& state) const
|
|||||||
_textureWidth = _textureHeight = minimum( _textureWidth , _textureHeight );
|
_textureWidth = _textureHeight = minimum( _textureWidth , _textureHeight );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLenum texStorageSizedInternalFormat = extensions->isTextureStorageEnabled && (_borderWidth==0) ? selectSizedInternalFormat(_images[0].get()) : 0;
|
||||||
|
|
||||||
textureObject = generateAndAssignTextureObject(
|
textureObject = generateAndAssignTextureObject(
|
||||||
contextID,GL_TEXTURE_CUBE_MAP,_numMipmapLevels,_internalFormat,_textureWidth,_textureHeight,1,0);
|
contextID, GL_TEXTURE_CUBE_MAP, _numMipmapLevels,
|
||||||
|
texStorageSizedInternalFormat!=0 ? texStorageSizedInternalFormat : _internalFormat,
|
||||||
|
_textureWidth, _textureHeight, 1, 0);
|
||||||
|
|
||||||
textureObject->bind();
|
textureObject->bind();
|
||||||
|
|
||||||
@@ -335,22 +339,33 @@ void TextureCubeMap::apply(State& state) const
|
|||||||
}
|
}
|
||||||
else if ( (_textureWidth!=0) && (_textureHeight!=0) && (_internalFormat!=0) )
|
else if ( (_textureWidth!=0) && (_textureHeight!=0) && (_internalFormat!=0) )
|
||||||
{
|
{
|
||||||
|
|
||||||
|
GLenum texStorageSizedInternalFormat = extensions->isTextureStorageEnabled && (_borderWidth==0) ? selectSizedInternalFormat() : 0;
|
||||||
|
|
||||||
textureObject = generateAndAssignTextureObject(
|
textureObject = generateAndAssignTextureObject(
|
||||||
contextID,GL_TEXTURE_CUBE_MAP,_numMipmapLevels,_internalFormat,_textureWidth,_textureHeight,1,0);
|
contextID, GL_TEXTURE_CUBE_MAP, _numMipmapLevels,
|
||||||
|
texStorageSizedInternalFormat!=0 ? texStorageSizedInternalFormat : _internalFormat,
|
||||||
|
_textureWidth, _textureHeight, 1, 0);
|
||||||
|
|
||||||
textureObject->bind();
|
textureObject->bind();
|
||||||
|
|
||||||
applyTexParameters(GL_TEXTURE_CUBE_MAP,state);
|
applyTexParameters(GL_TEXTURE_CUBE_MAP,state);
|
||||||
|
|
||||||
for (int n=0; n<6; n++)
|
if(texStorageSizedInternalFormat!=0)
|
||||||
{
|
{
|
||||||
// no image present, but dimensions at set so less create the texture
|
extensions->glTexStorage2D(GL_TEXTURE_CUBE_MAP, osg::maximum(_numMipmapLevels,1), texStorageSizedInternalFormat, _textureWidth, _textureHeight);
|
||||||
glTexImage2D( faceTarget[n], 0, _internalFormat,
|
|
||||||
_textureWidth, _textureHeight, _borderWidth,
|
|
||||||
_sourceFormat ? _sourceFormat : _internalFormat,
|
|
||||||
_sourceType ? _sourceType : GL_UNSIGNED_BYTE,
|
|
||||||
0);
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
for (int n=0; n<6; n++)
|
||||||
|
{
|
||||||
|
// no image present, but dimensions at set so less create the texture
|
||||||
|
glTexImage2D( faceTarget[n], 0, _internalFormat,
|
||||||
|
_textureWidth, _textureHeight, _borderWidth,
|
||||||
|
_sourceFormat ? _sourceFormat : _internalFormat,
|
||||||
|
_sourceType ? _sourceType : GL_UNSIGNED_BYTE,
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ void TextureRectangle::apply(State& state) const
|
|||||||
}
|
}
|
||||||
else if (_image.valid() && _image->data())
|
else if (_image.valid() && _image->data())
|
||||||
{
|
{
|
||||||
|
GLExtensions * extensions = state.get<GLExtensions>();
|
||||||
|
|
||||||
// keep the image around at least till we go out of scope.
|
// keep the image around at least till we go out of scope.
|
||||||
osg::ref_ptr<osg::Image> image = _image;
|
osg::ref_ptr<osg::Image> image = _image;
|
||||||
@@ -239,11 +239,16 @@ void TextureRectangle::apply(State& state) const
|
|||||||
// compute the internal texture format, this set the _internalFormat to an appropriate value.
|
// compute the internal texture format, this set the _internalFormat to an appropriate value.
|
||||||
computeInternalFormat();
|
computeInternalFormat();
|
||||||
|
|
||||||
|
//get sizedInternalFormat if TexStorage available
|
||||||
|
GLenum texStorageSizedInternalFormat = extensions->isTextureStorageEnabled && (_borderWidth==0) ? selectSizedInternalFormat(image.get()) : 0;
|
||||||
|
|
||||||
_textureWidth = image->s();
|
_textureWidth = image->s();
|
||||||
_textureHeight = image->t();
|
_textureHeight = image->t();
|
||||||
|
|
||||||
textureObject = generateAndAssignTextureObject(
|
textureObject = generateAndAssignTextureObject(
|
||||||
contextID,GL_TEXTURE_RECTANGLE,1,_internalFormat,_textureWidth,_textureHeight,1,0);
|
contextID, GL_TEXTURE_RECTANGLE, 1,
|
||||||
|
texStorageSizedInternalFormat!=0 ? texStorageSizedInternalFormat : _internalFormat,
|
||||||
|
_textureWidth, _textureHeight, 1, 0);
|
||||||
|
|
||||||
textureObject->bind();
|
textureObject->bind();
|
||||||
|
|
||||||
@@ -268,19 +273,30 @@ void TextureRectangle::apply(State& state) const
|
|||||||
}
|
}
|
||||||
else if ( (_textureWidth!=0) && (_textureHeight!=0) && (_internalFormat!=0) )
|
else if ( (_textureWidth!=0) && (_textureHeight!=0) && (_internalFormat!=0) )
|
||||||
{
|
{
|
||||||
textureObject = generateAndAssignTextureObject(
|
|
||||||
contextID,GL_TEXTURE_RECTANGLE,0,_internalFormat,_textureWidth,_textureHeight,1,0);
|
|
||||||
|
|
||||||
textureObject->bind();
|
|
||||||
|
|
||||||
applyTexParameters(GL_TEXTURE_RECTANGLE,state);
|
|
||||||
|
|
||||||
// no image present, but dimensions at set so lets create the texture
|
// no image present, but dimensions at set so lets create the texture
|
||||||
glTexImage2D( GL_TEXTURE_RECTANGLE, 0, _internalFormat,
|
GLExtensions * extensions = state.get<GLExtensions>();
|
||||||
|
GLenum texStorageSizedInternalFormat = extensions->isTextureStorageEnabled ? selectSizedInternalFormat() : 0;
|
||||||
|
if (texStorageSizedInternalFormat!=0)
|
||||||
|
{
|
||||||
|
textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_RECTANGLE, 0, texStorageSizedInternalFormat, _textureWidth, _textureHeight, 1, 0);
|
||||||
|
textureObject->bind();
|
||||||
|
applyTexParameters(GL_TEXTURE_RECTANGLE, state);
|
||||||
|
|
||||||
|
extensions->glTexStorage2D( GL_TEXTURE_RECTANGLE, 1, texStorageSizedInternalFormat, _textureWidth, _textureHeight);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GLenum internalFormat = _sourceFormat ? _sourceFormat : _internalFormat;
|
||||||
|
textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_RECTANGLE, 0, internalFormat, _textureWidth, _textureHeight, 1, 0);
|
||||||
|
textureObject->bind();
|
||||||
|
applyTexParameters(GL_TEXTURE_RECTANGLE, state);
|
||||||
|
|
||||||
|
glTexImage2D( GL_TEXTURE_RECTANGLE, 0, _internalFormat,
|
||||||
_textureWidth, _textureHeight, _borderWidth,
|
_textureWidth, _textureHeight, _borderWidth,
|
||||||
_sourceFormat ? _sourceFormat : _internalFormat,
|
internalFormat,
|
||||||
_sourceType ? _sourceType : GL_UNSIGNED_BYTE,
|
_sourceType ? _sourceType : GL_UNSIGNED_BYTE,
|
||||||
0);
|
0);
|
||||||
|
}
|
||||||
|
|
||||||
if (_readPBuffer.valid())
|
if (_readPBuffer.valid())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
#include <osgDB/ConvertBase64>
|
#include <osgDB/ConvertBase64>
|
||||||
#include <osgDB/FileUtils>
|
#include <osgDB/FileUtils>
|
||||||
#include <osgDB/WriteFile>
|
#include <osgDB/WriteFile>
|
||||||
|
#include <osgDB/FileNameUtils>
|
||||||
#include <osgDB/ObjectWrapper>
|
#include <osgDB/ObjectWrapper>
|
||||||
#include <osgDB/fstream>
|
#include <osgDB/fstream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@@ -581,35 +582,61 @@ void OutputStream::writeImage( const osg::Image* img )
|
|||||||
if ( isBinary() )
|
if ( isBinary() )
|
||||||
{
|
{
|
||||||
std::string fullPath = osgDB::findDataFile( img->getFileName(), _options.get() );
|
std::string fullPath = osgDB::findDataFile( img->getFileName(), _options.get() );
|
||||||
osgDB::ifstream infile( fullPath.c_str(), std::ios::in|std::ios::binary );
|
if (fullPath.empty()==false)
|
||||||
if ( infile )
|
|
||||||
{
|
{
|
||||||
infile.seekg( 0, std::ios::end );
|
osgDB::ifstream infile( fullPath.c_str(), std::ios::in|std::ios::binary );
|
||||||
unsigned int size = infile.tellg();
|
|
||||||
writeSize(size);
|
|
||||||
|
|
||||||
if ( size>0 )
|
if ( infile )
|
||||||
{
|
{
|
||||||
char* data = new char[size];
|
infile.seekg( 0, std::ios::end );
|
||||||
if ( !data )
|
unsigned int size = infile.tellg();
|
||||||
{
|
writeSize(size);
|
||||||
throwException( "OutputStream::writeImage(): Out of memory." );
|
|
||||||
if ( getException() ) return;
|
|
||||||
}
|
|
||||||
|
|
||||||
infile.seekg( 0, std::ios::beg );
|
if ( size>0 )
|
||||||
infile.read( data, size );
|
{
|
||||||
writeCharArray( data, size );
|
char* data = new char[size];
|
||||||
delete[] data;
|
if ( !data )
|
||||||
|
{
|
||||||
|
throwException( "OutputStream::writeImage(): Out of memory." );
|
||||||
|
if ( getException() ) return;
|
||||||
|
}
|
||||||
|
|
||||||
|
infile.seekg( 0, std::ios::beg );
|
||||||
|
infile.read( data, size );
|
||||||
|
writeCharArray( data, size );
|
||||||
|
delete[] data;
|
||||||
|
}
|
||||||
|
infile.close();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OSG_WARN << "OutputStream::writeImage(): Failed to open image file "
|
||||||
|
<< img->getFileName() << std::endl;
|
||||||
|
*this << (unsigned int)0;
|
||||||
}
|
}
|
||||||
infile.close();
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
OSG_WARN << "OutputStream::writeImage(): Failed to open image file "
|
std::string ext = osgDB::getFileExtension( img->getFileName() );
|
||||||
<< img->getFileName() << std::endl;
|
osgDB::ReaderWriter* writer =
|
||||||
*this << (unsigned int)0;
|
osgDB::Registry::instance()->getReaderWriterForExtension( ext );
|
||||||
|
if ( writer )
|
||||||
|
{
|
||||||
|
std::stringstream outputStream;
|
||||||
|
writer->writeImage(*img, outputStream, getOptions());
|
||||||
|
std::string data (outputStream.str());
|
||||||
|
unsigned int size = data.size();
|
||||||
|
writeSize(size);
|
||||||
|
writeCharArray( data.c_str(), size );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OSG_WARN << "OutputStream::writeImage(): Failed to find a plugin to write the image file "
|
||||||
|
<< img->getFileName() << std::endl;
|
||||||
|
*this << (unsigned int)0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case IMAGE_EXTERNAL:
|
case IMAGE_EXTERNAL:
|
||||||
|
|||||||
@@ -101,13 +101,15 @@ void XmlNode::ControlMap::setUpControlMappings()
|
|||||||
}
|
}
|
||||||
|
|
||||||
XmlNode::Input::Input():
|
XmlNode::Input::Input():
|
||||||
_currentPos(0)
|
_currentPos(0),
|
||||||
|
_encoding(ENCODING_ASCII)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
XmlNode::Input::Input(const Input&):
|
XmlNode::Input::Input(const Input& rhs):
|
||||||
ControlMap(),
|
ControlMap(),
|
||||||
_currentPos(0)
|
_currentPos(0),
|
||||||
|
_encoding(rhs._encoding)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -251,6 +253,11 @@ bool XmlNode::read(Input& input)
|
|||||||
commentNode->contents = input.substr(0, end);
|
commentNode->contents = input.substr(0, end);
|
||||||
if (end!=std::string::npos)
|
if (end!=std::string::npos)
|
||||||
{
|
{
|
||||||
|
if (commentNode->contents.find("encoding=\"UTF-8\"")!=std::string::npos)
|
||||||
|
{
|
||||||
|
input.setEncoding(Input::ENCODING_UTF8);
|
||||||
|
}
|
||||||
|
|
||||||
OSG_INFO<<"Valid information record ["<<commentNode->contents<<"]"<<std::endl;
|
OSG_INFO<<"Valid information record ["<<commentNode->contents<<"]"<<std::endl;
|
||||||
input += (end+2);
|
input += (end+2);
|
||||||
}
|
}
|
||||||
@@ -273,8 +280,7 @@ bool XmlNode::read(Input& input)
|
|||||||
int c = 0;
|
int c = 0;
|
||||||
while ((c=input[0])>=0 && c!=' ' && c!='\n' && c!='\r' && c!='>' && c!='/')
|
while ((c=input[0])>=0 && c!=' ' && c!='\n' && c!='\r' && c!='>' && c!='/')
|
||||||
{
|
{
|
||||||
childNode->name.push_back(c);
|
input.copyCharacterToString(childNode->name);
|
||||||
++input;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((c=input[0])>=0 && c!='>' && c!='/')
|
while ((c=input[0])>=0 && c!='>' && c!='/')
|
||||||
@@ -295,8 +301,7 @@ bool XmlNode::read(Input& input)
|
|||||||
readAndReplaceControl(option, input);
|
readAndReplaceControl(option, input);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
option.push_back(c);
|
input.copyCharacterToString(option);
|
||||||
++input;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
option.push_back(input[0]);
|
option.push_back(input[0]);
|
||||||
@@ -306,8 +311,7 @@ bool XmlNode::read(Input& input)
|
|||||||
{
|
{
|
||||||
while((c=input[0])>=0 && c!='>' && c!='/' && c!='"' && c!='\'' && c!='=' && c!=' ' && c!='\n' && c!='\r')
|
while((c=input[0])>=0 && c!='>' && c!='/' && c!='"' && c!='\'' && c!='=' && c!=' ' && c!='\n' && c!='\r')
|
||||||
{
|
{
|
||||||
option.push_back(c);
|
input.copyCharacterToString(option);
|
||||||
++input;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -327,8 +331,7 @@ bool XmlNode::read(Input& input)
|
|||||||
readAndReplaceControl(value, input);
|
readAndReplaceControl(value, input);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
value.push_back(c);
|
input.copyCharacterToString(value);
|
||||||
++input;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
++input;
|
++input;
|
||||||
@@ -342,8 +345,7 @@ bool XmlNode::read(Input& input)
|
|||||||
readAndReplaceControl(value, input);
|
readAndReplaceControl(value, input);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
value.push_back(c);
|
input.copyCharacterToString(value);
|
||||||
++input;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
++input;
|
++input;
|
||||||
@@ -353,8 +355,7 @@ bool XmlNode::read(Input& input)
|
|||||||
++input;
|
++input;
|
||||||
while((c=input[0])>=0 && c!=' ' && c!='\n' && c!='\r' && c!='"' && c!='\'' && c!='>')
|
while((c=input[0])>=0 && c!=' ' && c!='\n' && c!='\r' && c!='"' && c!='\'' && c!='>')
|
||||||
{
|
{
|
||||||
value.push_back(c);
|
input.copyCharacterToString(value);
|
||||||
++input;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -414,8 +415,7 @@ bool XmlNode::read(Input& input)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
contents.push_back( c );
|
input.copyCharacterToString(contents);
|
||||||
++input;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -394,29 +394,53 @@ void osgParticle::ParticleSystem::drawImplementation(osg::RenderInfo& renderInfo
|
|||||||
case osgParticle::Particle::HEXAGON:
|
case osgParticle::Particle::HEXAGON:
|
||||||
case osgParticle::Particle::QUAD:
|
case osgParticle::Particle::QUAD:
|
||||||
{
|
{
|
||||||
vertices.push_back(xpos-p1-p2);
|
const osg::Vec3 c0(xpos-p1-p2);
|
||||||
colors.push_back(color);
|
const osg::Vec2 t0(s_coord, t_coord);
|
||||||
texcoords.push_back(osg::Vec2(s_coord, t_coord));
|
const osg::Vec3 c1(xpos+p1-p2);
|
||||||
|
const osg::Vec2 t1(s_coord+s_tile, t_coord);
|
||||||
|
const osg::Vec3 c2(xpos+p1+p2);
|
||||||
|
const osg::Vec2 t2(s_coord+s_tile, t_coord+t_tile);
|
||||||
|
const osg::Vec3 c3(xpos-p1+p2);
|
||||||
|
const osg::Vec2 t3(s_coord, t_coord+t_tile);
|
||||||
|
|
||||||
vertices.push_back(xpos+p1-p2);
|
// First 3 points (and texcoords) of quad or triangle
|
||||||
colors.push_back(color);
|
vertices.push_back(c0);
|
||||||
texcoords.push_back(osg::Vec2(s_coord+s_tile, t_coord));
|
vertices.push_back(c1);
|
||||||
|
vertices.push_back(c2);
|
||||||
|
texcoords.push_back(t0);
|
||||||
|
texcoords.push_back(t1);
|
||||||
|
texcoords.push_back(t2);
|
||||||
|
|
||||||
vertices.push_back(xpos+p1+p2);
|
#if !defined(OSG_GLES2_AVAILABLE)
|
||||||
colors.push_back(color);
|
const unsigned int count = 4;
|
||||||
texcoords.push_back(osg::Vec2(s_coord+s_tile, t_coord+t_tile));
|
const GLenum mode = GL_QUADS;
|
||||||
|
|
||||||
vertices.push_back(xpos-p1+p2);
|
// Last point (and texcoord) of quad
|
||||||
colors.push_back(color);
|
vertices.push_back(c3);
|
||||||
texcoords.push_back(osg::Vec2(s_coord, t_coord+t_tile));
|
texcoords.push_back(t3);
|
||||||
|
#else
|
||||||
|
// No GL_QUADS mode on GLES2 and upper
|
||||||
|
const unsigned int count = 6;
|
||||||
|
const GLenum mode = GL_TRIANGLES;
|
||||||
|
|
||||||
if (!primitives.empty() && primitives.back().first==GL_QUADS)
|
// Second triangle
|
||||||
|
vertices.push_back(c2);
|
||||||
|
vertices.push_back(c3);
|
||||||
|
vertices.push_back(c0);
|
||||||
|
texcoords.push_back(t2);
|
||||||
|
texcoords.push_back(t3);
|
||||||
|
texcoords.push_back(t0);
|
||||||
|
#endif
|
||||||
|
for (unsigned int j = 0; j < count; ++j)
|
||||||
|
colors.push_back(color);
|
||||||
|
|
||||||
|
if (!primitives.empty() && primitives.back().first == mode)
|
||||||
{
|
{
|
||||||
primitives.back().second+=4;
|
primitives.back().second += count;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
primitives.push_back(ArrayData::ModeCount(GL_QUADS,4));
|
primitives.push_back(ArrayData::ModeCount(mode, count));
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -495,15 +495,15 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Is texture in local cache?
|
// Is texture in local cache?
|
||||||
osg::StateSet* stateset = flt::Registry::instance()->getTextureFromLocalCache(pathname);
|
osg::ref_ptr<osg::StateSet> stateset = flt::Registry::instance()->getTextureFromLocalCache(pathname);
|
||||||
|
|
||||||
// Read file if not in cache.
|
// Read file if not in cache.
|
||||||
if (!stateset)
|
if (!stateset.valid())
|
||||||
{
|
{
|
||||||
stateset = readTexture(pathname,document);
|
stateset = readTexture(pathname,document);
|
||||||
|
|
||||||
// Add to texture cache.
|
// Add to texture cache.
|
||||||
flt::Registry::instance()->addTextureToLocalCache(pathname,stateset);
|
flt::Registry::instance()->addTextureToLocalCache(pathname,stateset.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add to texture pool.
|
// Add to texture pool.
|
||||||
|
|||||||
@@ -276,8 +276,8 @@ class FLTReaderWriter : public ReaderWriter
|
|||||||
|
|
||||||
// in local cache?
|
// in local cache?
|
||||||
{
|
{
|
||||||
osg::Node* node = flt::Registry::instance()->getExternalFromLocalCache(fileName);
|
osg::ref_ptr<osg::Node> node = flt::Registry::instance()->getExternalFromLocalCache(fileName);
|
||||||
if (node)
|
if (node.valid())
|
||||||
return ReadResult(node, ReaderWriter::ReadResult::FILE_LOADED_FROM_CACHE);
|
return ReadResult(node, ReaderWriter::ReadResult::FILE_LOADED_FROM_CACHE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -299,7 +299,6 @@ class FLTReaderWriter : public ReaderWriter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nestedExternalsLevel = 0;
|
|
||||||
if (rr.success())
|
if (rr.success())
|
||||||
{
|
{
|
||||||
// add to local cache.
|
// add to local cache.
|
||||||
@@ -316,10 +315,8 @@ class FLTReaderWriter : public ReaderWriter
|
|||||||
// read externals.
|
// read externals.
|
||||||
if (rr.getNode())
|
if (rr.getNode())
|
||||||
{
|
{
|
||||||
nestedExternalsLevel++;
|
|
||||||
ReadExternalsVisitor visitor(local_opt.get());
|
ReadExternalsVisitor visitor(local_opt.get());
|
||||||
rr.getNode()->accept(visitor);
|
rr.getNode()->accept(visitor);
|
||||||
nestedExternalsLevel--;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -334,10 +331,6 @@ class FLTReaderWriter : public ReaderWriter
|
|||||||
rr.getNode()->accept(cbov);
|
rr.getNode()->accept(cbov);
|
||||||
}
|
}
|
||||||
|
|
||||||
// clear local cache.
|
|
||||||
if (nestedExternalsLevel==0)
|
|
||||||
flt::Registry::instance()->clearLocalCache();
|
|
||||||
|
|
||||||
return rr;
|
return rr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,8 @@
|
|||||||
#include <queue>
|
#include <queue>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <osg/ref_ptr>
|
#include <osg/ref_ptr>
|
||||||
|
#include <osgDB/ObjectCache>
|
||||||
|
#include <osgDB/Registry>
|
||||||
#include "Opcodes.h"
|
#include "Opcodes.h"
|
||||||
#include "Record.h"
|
#include "Record.h"
|
||||||
|
|
||||||
@@ -51,7 +53,6 @@ class Registry : public osg::Referenced
|
|||||||
osg::Node* getExternalFromLocalCache(const std::string& filename);
|
osg::Node* getExternalFromLocalCache(const std::string& filename);
|
||||||
void addTextureToLocalCache(const std::string& filename, osg::StateSet* stateset);
|
void addTextureToLocalCache(const std::string& filename, osg::StateSet* stateset);
|
||||||
osg::StateSet* getTextureFromLocalCache(const std::string& filename);
|
osg::StateSet* getTextureFromLocalCache(const std::string& filename);
|
||||||
void clearLocalCache();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
@@ -61,14 +62,6 @@ class Registry : public osg::Referenced
|
|||||||
RecordProtoMap _recordProtoMap;
|
RecordProtoMap _recordProtoMap;
|
||||||
|
|
||||||
ExternalQueue _externalReadQueue;
|
ExternalQueue _externalReadQueue;
|
||||||
|
|
||||||
// External cache
|
|
||||||
typedef std::map<std::string, osg::ref_ptr<osg::Node> > ExternalCacheMap;
|
|
||||||
ExternalCacheMap _externalCacheMap;
|
|
||||||
|
|
||||||
// Texture cache
|
|
||||||
typedef std::map<std::string, osg::ref_ptr<osg::StateSet> > TextureCacheMap;
|
|
||||||
TextureCacheMap _textureCacheMap;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inline void Registry::addToExternalReadQueue(const std::string& filename, osg::Group* parent)
|
inline void Registry::addToExternalReadQueue(const std::string& filename, osg::Group* parent)
|
||||||
@@ -78,34 +71,22 @@ inline void Registry::addToExternalReadQueue(const std::string& filename, osg::G
|
|||||||
|
|
||||||
inline void Registry::addExternalToLocalCache(const std::string& filename, osg::Node* node)
|
inline void Registry::addExternalToLocalCache(const std::string& filename, osg::Node* node)
|
||||||
{
|
{
|
||||||
_externalCacheMap[filename] = node;
|
osgDB::Registry::instance()->addEntryToObjectCache(filename, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline osg::Node* Registry::getExternalFromLocalCache(const std::string& filename)
|
inline osg::Node* Registry::getExternalFromLocalCache(const std::string& filename)
|
||||||
{
|
{
|
||||||
ExternalCacheMap::iterator itr = _externalCacheMap.find(filename);
|
return dynamic_cast<osg::Node*>(osgDB::Registry::instance()->getFromObjectCache(filename));
|
||||||
if (itr != _externalCacheMap.end())
|
|
||||||
return (*itr).second.get();
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void Registry::addTextureToLocalCache(const std::string& filename, osg::StateSet* stateset)
|
inline void Registry::addTextureToLocalCache(const std::string& filename, osg::StateSet* stateset)
|
||||||
{
|
{
|
||||||
_textureCacheMap[filename] = stateset;
|
osgDB::Registry::instance()->addEntryToObjectCache(filename, stateset);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline osg::StateSet* Registry::getTextureFromLocalCache(const std::string& filename)
|
inline osg::StateSet* Registry::getTextureFromLocalCache(const std::string& filename)
|
||||||
{
|
{
|
||||||
TextureCacheMap::iterator itr = _textureCacheMap.find(filename);
|
return dynamic_cast<osg::StateSet*>(osgDB::Registry::instance()->getFromObjectCache(filename));
|
||||||
if (itr != _textureCacheMap.end())
|
|
||||||
return (*itr).second.get();
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void Registry::clearLocalCache()
|
|
||||||
{
|
|
||||||
_externalCacheMap.clear();
|
|
||||||
_textureCacheMap.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Proxy class for automatic registration of reader/writers with the Registry.*/
|
/** Proxy class for automatic registration of reader/writers with the Registry.*/
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ FltExportVisitor::isTextured( int unit, const osg::Geometry& geom ) const
|
|||||||
bool texOn( ss->getTextureMode( unit, GL_TEXTURE_2D ) & osg::StateAttribute::ON );
|
bool texOn( ss->getTextureMode( unit, GL_TEXTURE_2D ) & osg::StateAttribute::ON );
|
||||||
#else
|
#else
|
||||||
// In this mode, osg::Texture::getModeUsage() is undefined, so just detect if a texture is present
|
// In this mode, osg::Texture::getModeUsage() is undefined, so just detect if a texture is present
|
||||||
bool texOn = (ss->getTextureAttribute(0, osg::StateAttribute::TEXTURE) != NULL);
|
bool texOn( ss->getTextureAttribute( unit, osg::StateAttribute::TEXTURE ) != NULL );
|
||||||
#endif
|
#endif
|
||||||
bool hasCoords( geom.getTexCoordArray( unit ) != NULL );
|
bool hasCoords( geom.getTexCoordArray( unit ) != NULL );
|
||||||
|
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ SET(TARGET_SRC ReaderWriterEXR.cpp )
|
|||||||
|
|
||||||
SET(TARGET_LIBRARIES_VARS ${OPENEXR_LIBRARIES_VARS} ${ILMBASE_LIBRARIES_VARS} ZLIB_LIBRARIES)
|
SET(TARGET_LIBRARIES_VARS ${OPENEXR_LIBRARIES_VARS} ${ILMBASE_LIBRARIES_VARS} ZLIB_LIBRARIES)
|
||||||
|
|
||||||
IF(CMAKE_COMPILER_IS_GNUCXX)
|
IF(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||||
# Remove -Wshadow flag as it barfs on ffmoeg headers
|
REMOVE_CXX_FLAG(-Wshadow)
|
||||||
STRING(REGEX REPLACE "-Wshadow" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
#### end var setup ###
|
#### end var setup ###
|
||||||
|
|||||||
@@ -12,5 +12,11 @@ SET(TARGET_H
|
|||||||
SET(TARGET_LIBRARIES_VARS GDAL_LIBRARY )
|
SET(TARGET_LIBRARIES_VARS GDAL_LIBRARY )
|
||||||
SET(TARGET_ADDED_LIBRARIES osgTerrain )
|
SET(TARGET_ADDED_LIBRARIES osgTerrain )
|
||||||
|
|
||||||
|
IF(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||||
|
REMOVE_CXX_FLAG(-Wunused-result)
|
||||||
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated")
|
||||||
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-result")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
#### end var setup ###
|
#### end var setup ###
|
||||||
SETUP_PLUGIN(gdal)
|
SETUP_PLUGIN(gdal)
|
||||||
|
|||||||
@@ -239,7 +239,8 @@ void Surface::generate_stateset(unsigned int max_tex_units, bool force_arb_compr
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case Block::SUBTRACTIVE:
|
case Block::SUBTRACTIVE:
|
||||||
OSG_WARN << "Warning: lwosg::Surface: 'Subtractive' blending mode is not supported, falling back to 'Difference' mode" << std::endl;
|
OSG_WARN << "Warning: lwosg::Surface: 'Subtractive' blending mode is not supported." << std::endl;
|
||||||
|
break;
|
||||||
case Block::DIFFERENCE:
|
case Block::DIFFERENCE:
|
||||||
tec->setCombine_RGB(osg::TexEnvCombine::SUBTRACT);
|
tec->setCombine_RGB(osg::TexEnvCombine::SUBTRACT);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -276,7 +276,7 @@ osgDB::ReaderWriter::ReadResult ReaderWriterTXP::local_readNode(const std::strin
|
|||||||
std::string childInfoStr;
|
std::string childInfoStr;
|
||||||
createChildrenLocationString(childrenChildLoc, childInfoStr);
|
createChildrenLocationString(childrenChildLoc, childInfoStr);
|
||||||
|
|
||||||
char pagedLODfile[1024];
|
char pagedLODfile[1084];
|
||||||
sprintf(pagedLODfile,"%s\\subtiles%d_%dx%d_%d%s.txp",
|
sprintf(pagedLODfile,"%s\\subtiles%d_%dx%d_%d%s.txp",
|
||||||
archive->getDir(),
|
archive->getDir(),
|
||||||
loc.lod,
|
loc.lod,
|
||||||
@@ -380,7 +380,7 @@ osgDB::ReaderWriter::ReadResult ReaderWriterTXP::local_readNode(const std::strin
|
|||||||
|
|
||||||
if (tileLOD < (numLods-1))
|
if (tileLOD < (numLods-1))
|
||||||
{
|
{
|
||||||
char pagedLODfile[1024];
|
char pagedLODfile[1094];
|
||||||
sprintf(pagedLODfile,"%s\\subtiles%d_%dx%d_%d.txp",
|
sprintf(pagedLODfile,"%s\\subtiles%d_%dx%d_%d.txp",
|
||||||
archive->getDir(),
|
archive->getDir(),
|
||||||
tileLOD,
|
tileLOD,
|
||||||
|
|||||||
@@ -294,7 +294,7 @@ osg::Node* TXPNode::addPagedLODTile(int x, int y)
|
|||||||
// If you look at the code that calls it, it is effectively called only when
|
// If you look at the code that calls it, it is effectively called only when
|
||||||
// lod = 0. So all is OK
|
// lod = 0. So all is OK
|
||||||
int lod = 0;
|
int lod = 0;
|
||||||
char pagedLODfile[1024];
|
char pagedLODfile[1070];
|
||||||
sprintf(pagedLODfile,"%s\\tile%d_%dx%d_%d.txp",_archive->getDir(),lod,x,y,_archive->getId());
|
sprintf(pagedLODfile,"%s\\tile%d_%dx%d_%d.txp",_archive->getDir(),lod,x,y,_archive->getId());
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ void trpgr_Archive::SetDirectory(const char *in_dir)
|
|||||||
// Open the given file and look for the file specific info
|
// Open the given file and look for the file specific info
|
||||||
bool trpgr_Archive::OpenFile(const char *name)
|
bool trpgr_Archive::OpenFile(const char *name)
|
||||||
{
|
{
|
||||||
char file[1024];
|
char file[1025];
|
||||||
sprintf(file,"%s" PATHSEPERATOR "%s",dir,name);
|
sprintf(file,"%s" PATHSEPERATOR "%s",dir,name);
|
||||||
|
|
||||||
CloseFile();
|
CloseFile();
|
||||||
@@ -138,7 +138,7 @@ bool trpgr_Archive::ReadSubArchive(int row, int col, trpgEndian cpuNess)
|
|||||||
trpgHeader blockHeader;
|
trpgHeader blockHeader;
|
||||||
trpgr_Parser bparser;
|
trpgr_Parser bparser;
|
||||||
|
|
||||||
char blockpath[1024];
|
char blockpath[1060];
|
||||||
//open the block archive
|
//open the block archive
|
||||||
// the block archive will be in the base dir + \\cols\\row\\archive.txp
|
// the block archive will be in the base dir + \\cols\\row\\archive.txp
|
||||||
sprintf(blockpath,"%s%s%d%s%d%sarchive.txp",dir,PATHSEPERATOR,col,PATHSEPERATOR,row,PATHSEPERATOR);
|
sprintf(blockpath,"%s%s%d%s%d%sarchive.txp",dir,PATHSEPERATOR,col,PATHSEPERATOR,row,PATHSEPERATOR);
|
||||||
@@ -325,7 +325,7 @@ bool trpgr_Archive::ReadHeader(bool readAllBlocks)
|
|||||||
tileTable.GetMode(tileMode);
|
tileTable.GetMode(tileMode);
|
||||||
if (tileMode == trpgTileTable::Local) {
|
if (tileMode == trpgTileTable::Local) {
|
||||||
if (tileCache) delete tileCache;
|
if (tileCache) delete tileCache;
|
||||||
char fullBase[1024];
|
char fullBase[1060];
|
||||||
sprintf(fullBase,"%s" PATHSEPERATOR "tileFile",dir);
|
sprintf(fullBase,"%s" PATHSEPERATOR "tileFile",dir);
|
||||||
tileCache = GetNewRAppFileCache(fullBase,"tpf");
|
tileCache = GetNewRAppFileCache(fullBase,"tpf");
|
||||||
}
|
}
|
||||||
@@ -390,7 +390,7 @@ bool trpgr_Archive::ReadTile(uint32 x,uint32 y,uint32 lod,trpgMemReadBuffer &buf
|
|||||||
bool trpgr_Archive::ReadExternalTile(uint32 x,uint32 y,uint32 lod,trpgMemReadBuffer &buf)
|
bool trpgr_Archive::ReadExternalTile(uint32 x,uint32 y,uint32 lod,trpgMemReadBuffer &buf)
|
||||||
{
|
{
|
||||||
// Figure out the file name
|
// Figure out the file name
|
||||||
char filename[1024];
|
char filename[1069];
|
||||||
int majorVer,minorVer;
|
int majorVer,minorVer;
|
||||||
header.GetVersion(majorVer,minorVer);
|
header.GetVersion(majorVer,minorVer);
|
||||||
if((majorVer >= TRPG_NOMERGE_VERSION_MAJOR) && (minorVer >= TRPG_NOMERGE_VERSION_MINOR)) {
|
if((majorVer >= TRPG_NOMERGE_VERSION_MAJOR) && (minorVer >= TRPG_NOMERGE_VERSION_MINOR)) {
|
||||||
@@ -554,7 +554,7 @@ void trpgrImageHelper::Init(trpgEndian inNess,char *inDir,
|
|||||||
|
|
||||||
// Set up the texture cache
|
// Set up the texture cache
|
||||||
// It doesn't do anything until it's called anyway
|
// It doesn't do anything until it's called anyway
|
||||||
char fullBase[1024];
|
char fullBase[1035];
|
||||||
sprintf(fullBase,"%s" PATHSEPERATOR "texFile",dir);
|
sprintf(fullBase,"%s" PATHSEPERATOR "texFile",dir);
|
||||||
texCache = GetNewRAppFileCache(fullBase,"txf");
|
texCache = GetNewRAppFileCache(fullBase,"txf");
|
||||||
if(sepGeoTyp) {
|
if(sepGeoTyp) {
|
||||||
|
|||||||
@@ -681,7 +681,7 @@ trpgrAppFile *trpgrAppFileCache::GetFile(trpgEndian ness,int id,int col,int row)
|
|||||||
OpenFile &of = files[oldID];
|
OpenFile &of = files[oldID];
|
||||||
if (of.afile)
|
if (of.afile)
|
||||||
delete of.afile;
|
delete of.afile;
|
||||||
char fileName[1024];
|
char fileName[1056];
|
||||||
if(col==-1) {
|
if(col==-1) {
|
||||||
sprintf(fileName,"%s_%d.%s",baseName,id,ext);
|
sprintf(fileName,"%s_%d.%s",baseName,id,ext);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -408,7 +408,7 @@ trpgLabelPropertyTable *trpgwArchive::GetLabelPropertyTable()
|
|||||||
// Same as above, only gets a basename as well
|
// Same as above, only gets a basename as well
|
||||||
bool trpgwArchive::OpenFile(const char *in_dir,const char *name)
|
bool trpgwArchive::OpenFile(const char *in_dir,const char *name)
|
||||||
{
|
{
|
||||||
char filename[1024];
|
char filename[1025];
|
||||||
|
|
||||||
strncpy(dir,in_dir,1023);
|
strncpy(dir,in_dir,1023);
|
||||||
|
|
||||||
@@ -773,7 +773,7 @@ bool trpgwArchive::IncrementTileFile()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Open the next one
|
// Open the next one
|
||||||
char filename[1024];
|
char filename[1049];
|
||||||
sprintf(filename,"%s" PATHSEPERATOR "tileFile_%d.tpf",dir,tileFileCount++);
|
sprintf(filename,"%s" PATHSEPERATOR "tileFile_%d.tpf",dir,tileFileCount++);
|
||||||
tileFile = GetNewWAppFile(ness,filename,true);
|
tileFile = GetNewWAppFile(ness,filename,true);
|
||||||
if (!tileFile->isValid())
|
if (!tileFile->isValid())
|
||||||
@@ -802,7 +802,7 @@ bool trpgwArchive::DesignateTileFile(int id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Open a named on
|
// Open a named on
|
||||||
char filename[1024];
|
char filename[1049];
|
||||||
sprintf(filename,"%s" PATHSEPERATOR "tileFile_%d.tpf",dir,id);
|
sprintf(filename,"%s" PATHSEPERATOR "tileFile_%d.tpf",dir,id);
|
||||||
tileFile = GetNewWAppFile(ness,filename);
|
tileFile = GetNewWAppFile(ness,filename);
|
||||||
if (!tileFile->isValid())
|
if (!tileFile->isValid())
|
||||||
@@ -834,7 +834,7 @@ bool trpgwArchive::WriteTile(unsigned int x,unsigned int y,unsigned int lod, flo
|
|||||||
// External tiles get their own individual files
|
// External tiles get their own individual files
|
||||||
if (tileMode == TileExternal || tileMode == TileExternalSaved) {
|
if (tileMode == TileExternal || tileMode == TileExternalSaved) {
|
||||||
// Make a new filename
|
// Make a new filename
|
||||||
char filename[1024];
|
char filename[1069];
|
||||||
// Note: Windows specific
|
// Note: Windows specific
|
||||||
sprintf(filename,"%s" PATHSEPERATOR "tile_%d_%d_%d.tpt",dir,x,y,lod);
|
sprintf(filename,"%s" PATHSEPERATOR "tile_%d_%d_%d.tpt",dir,x,y,lod);
|
||||||
if (!(tfp = osgDB::fopen(filename,"wb")))
|
if (!(tfp = osgDB::fopen(filename,"wb")))
|
||||||
@@ -1502,7 +1502,7 @@ trpgwAppFile* trpgwImageHelper::GetNewWAppFile(trpgEndian inNess,const char *fil
|
|||||||
*/
|
*/
|
||||||
trpgwAppFile * trpgwImageHelper::IncrementTextureFile(bool geotyp)
|
trpgwAppFile * trpgwImageHelper::IncrementTextureFile(bool geotyp)
|
||||||
{
|
{
|
||||||
char filename[1024];
|
char filename[1049];
|
||||||
trpgwAppFile *thefile = texFile;
|
trpgwAppFile *thefile = texFile;
|
||||||
|
|
||||||
if(geotyp && separateGeoTypical) {
|
if(geotyp && separateGeoTypical) {
|
||||||
@@ -1553,7 +1553,7 @@ bool trpgwImageHelper::DesignateTextureFile(int id)
|
|||||||
texFile = NULL;
|
texFile = NULL;
|
||||||
|
|
||||||
// Open one with the given base name
|
// Open one with the given base name
|
||||||
char filename[1024];
|
char filename[1044];
|
||||||
sprintf(filename,"%s" PATHSEPERATOR "texFile_%d.txf",dir,id);
|
sprintf(filename,"%s" PATHSEPERATOR "texFile_%d.txf",dir,id);
|
||||||
texFile = GetNewWAppFile(ness,filename);
|
texFile = GetNewWAppFile(ness,filename);
|
||||||
if (!texFile->isValid())
|
if (!texFile->isValid())
|
||||||
|
|||||||
@@ -11,4 +11,8 @@ SET(TARGET_H
|
|||||||
|
|
||||||
ADD_DEFINITIONS(-DZIP_STD)
|
ADD_DEFINITIONS(-DZIP_STD)
|
||||||
|
|
||||||
|
IF(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||||
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-implicit-fallthrough")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
SETUP_PLUGIN(zip)
|
SETUP_PLUGIN(zip)
|
||||||
|
|||||||
@@ -328,21 +328,19 @@ Glyph* Font::getGlyph(const FontResolution& fontRes, unsigned int charcode)
|
|||||||
FontResolution fontResUsed(0,0);
|
FontResolution fontResUsed(0,0);
|
||||||
if (_implementation->supportsMultipleFontResolutions()) fontResUsed = fontRes;
|
if (_implementation->supportsMultipleFontResolutions()) fontResUsed = fontRes;
|
||||||
|
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_glyphMapMutex);
|
||||||
|
FontSizeGlyphMap::iterator itr = _sizeGlyphMap.find(fontResUsed);
|
||||||
|
if (itr!=_sizeGlyphMap.end())
|
||||||
{
|
{
|
||||||
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_glyphMapMutex);
|
GlyphMap& glyphmap = itr->second;
|
||||||
FontSizeGlyphMap::iterator itr = _sizeGlyphMap.find(fontResUsed);
|
GlyphMap::iterator gitr = glyphmap.find(charcode);
|
||||||
if (itr!=_sizeGlyphMap.end())
|
if (gitr!=glyphmap.end()) return gitr->second.get();
|
||||||
{
|
|
||||||
GlyphMap& glyphmap = itr->second;
|
|
||||||
GlyphMap::iterator gitr = glyphmap.find(charcode);
|
|
||||||
if (gitr!=glyphmap.end()) return gitr->second.get();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Glyph* glyph = _implementation->getGlyph(fontResUsed, charcode);
|
Glyph* glyph = _implementation->getGlyph(fontResUsed, charcode);
|
||||||
if (glyph)
|
if (glyph)
|
||||||
{
|
{
|
||||||
addGlyph(fontResUsed, charcode, glyph);
|
_sizeGlyphMap[fontResUsed][charcode] = glyph;
|
||||||
return glyph;
|
return glyph;
|
||||||
}
|
}
|
||||||
else return 0;
|
else return 0;
|
||||||
@@ -355,21 +353,18 @@ Glyph3D* Font::getGlyph3D(const FontResolution &fontRes, unsigned int charcode)
|
|||||||
FontResolution fontResUsed(0,0);
|
FontResolution fontResUsed(0,0);
|
||||||
if (_implementation->supportsMultipleFontResolutions()) fontResUsed = fontRes;
|
if (_implementation->supportsMultipleFontResolutions()) fontResUsed = fontRes;
|
||||||
|
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_glyphMapMutex);
|
||||||
|
FontSizeGlyph3DMap::iterator itr = _sizeGlyph3DMap.find(fontResUsed);
|
||||||
|
if (itr!=_sizeGlyph3DMap.end())
|
||||||
{
|
{
|
||||||
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_glyphMapMutex);
|
Glyph3DMap& glyphmap = itr->second;
|
||||||
FontSizeGlyph3DMap::iterator itr = _sizeGlyph3DMap.find(fontResUsed);
|
Glyph3DMap::iterator gitr = glyphmap.find(charcode);
|
||||||
if (itr!=_sizeGlyph3DMap.end())
|
if (gitr!=glyphmap.end()) return gitr->second.get();
|
||||||
{
|
|
||||||
Glyph3DMap& glyphmap = itr->second;
|
|
||||||
Glyph3DMap::iterator gitr = glyphmap.find(charcode);
|
|
||||||
if (gitr!=glyphmap.end()) return gitr->second.get();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Glyph3D* glyph = _implementation->getGlyph3D(fontResUsed, charcode);
|
Glyph3D* glyph = _implementation->getGlyph3D(fontResUsed, charcode);
|
||||||
if (glyph)
|
if (glyph)
|
||||||
{
|
{
|
||||||
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_glyphMapMutex);
|
|
||||||
_sizeGlyph3DMap[fontResUsed][charcode] = glyph;
|
_sizeGlyph3DMap[fontResUsed][charcode] = glyph;
|
||||||
return glyph;
|
return glyph;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -464,6 +464,8 @@ float Glyph::getVerticalAdvance() const { return _verticalAdvance; }
|
|||||||
|
|
||||||
void Glyph::setTextureInfo(ShaderTechnique technique, TextureInfo* info)
|
void Glyph::setTextureInfo(ShaderTechnique technique, TextureInfo* info)
|
||||||
{
|
{
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_textureInfoListMutex);
|
||||||
|
|
||||||
if (technique>=_textureInfoList.size())
|
if (technique>=_textureInfoList.size())
|
||||||
{
|
{
|
||||||
_textureInfoList.resize(technique+1);
|
_textureInfoList.resize(technique+1);
|
||||||
@@ -473,11 +475,15 @@ void Glyph::setTextureInfo(ShaderTechnique technique, TextureInfo* info)
|
|||||||
|
|
||||||
const Glyph::TextureInfo* Glyph::getTextureInfo(ShaderTechnique technique) const
|
const Glyph::TextureInfo* Glyph::getTextureInfo(ShaderTechnique technique) const
|
||||||
{
|
{
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_textureInfoListMutex);
|
||||||
|
|
||||||
return (technique<_textureInfoList.size()) ? _textureInfoList[technique].get() : 0;
|
return (technique<_textureInfoList.size()) ? _textureInfoList[technique].get() : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Glyph::TextureInfo* Glyph::getOrCreateTextureInfo(ShaderTechnique technique)
|
Glyph::TextureInfo* Glyph::getOrCreateTextureInfo(ShaderTechnique technique)
|
||||||
{
|
{
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_textureInfoListMutex);
|
||||||
|
|
||||||
if (technique>=_textureInfoList.size())
|
if (technique>=_textureInfoList.size())
|
||||||
{
|
{
|
||||||
_textureInfoList.resize(technique+1);
|
_textureInfoList.resize(technique+1);
|
||||||
|
|||||||
@@ -513,7 +513,7 @@ bool TextBase::computeMatrix(osg::Matrix& matrix, osg::State* state) const
|
|||||||
height = static_cast<value_type>(viewport->height());
|
height = static_cast<value_type>(viewport->height());
|
||||||
}
|
}
|
||||||
|
|
||||||
osg::Matrix mvpw = rotate_matrix * modelview * projection * osg::Matrix::scale(width/2.0, height/2.0, 1.0);
|
osg::Matrix mvpw = rotate_matrix * osg::Matrix::translate(_position) * modelview * projection * osg::Matrix::scale(width/2.0, height/2.0, 1.0);
|
||||||
|
|
||||||
osg::Vec3d origin = osg::Vec3d(0.0, 0.0, 0.0) * mvpw;
|
osg::Vec3d origin = osg::Vec3d(0.0, 0.0, 0.0) * mvpw;
|
||||||
osg::Vec3d left = osg::Vec3d(1.0, 0.0, 0.0) * mvpw - origin;
|
osg::Vec3d left = osg::Vec3d(1.0, 0.0, 0.0) * mvpw - origin;
|
||||||
|
|||||||
@@ -205,13 +205,11 @@ void ViewerBase::setThreadingModel(ThreadingModel threadingModel)
|
|||||||
{
|
{
|
||||||
if (_threadingModel == threadingModel) return;
|
if (_threadingModel == threadingModel) return;
|
||||||
|
|
||||||
bool needSetUpThreading = _threadsRunning;
|
|
||||||
|
|
||||||
if (_threadsRunning) stopThreading();
|
if (_threadsRunning) stopThreading();
|
||||||
|
|
||||||
_threadingModel = threadingModel;
|
_threadingModel = threadingModel;
|
||||||
|
|
||||||
if (needSetUpThreading) setUpThreading();
|
if (isRealized() && _threadingModel!=SingleThreaded) setUpThreading();
|
||||||
}
|
}
|
||||||
|
|
||||||
ViewerBase::ThreadingModel ViewerBase::suggestBestThreadingModel()
|
ViewerBase::ThreadingModel ViewerBase::suggestBestThreadingModel()
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ REGISTER_OBJECT_WRAPPER( DrawArraysIndirect,
|
|||||||
osg::DrawArraysIndirect,
|
osg::DrawArraysIndirect,
|
||||||
"osg::Object osg::BufferData osg::PrimitiveSet osg::DrawArraysIndirect" )
|
"osg::Object osg::BufferData osg::PrimitiveSet osg::DrawArraysIndirect" )
|
||||||
{
|
{
|
||||||
ADD_OBJECT_SERIALIZER( IndirectCommandArray, osg::IndirectCommandDrawArrays ,new osg::DefaultIndirectCommandDrawArrays());
|
ADD_OBJECT_SERIALIZER( IndirectCommandArray, osg::IndirectCommandDrawArrays, new osg::DefaultIndirectCommandDrawArrays());
|
||||||
ADD_UINT_SERIALIZER( FirstCommandToDraw, 0);
|
ADD_UINT_SERIALIZER( FirstCommandToDraw, 0);
|
||||||
ADD_INT_SERIALIZER( Stride, 0);
|
ADD_INT_SERIALIZER( Stride, 0);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user