From 7f8183f64c585527731e61f3039bfef8da8c2094 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 5 Aug 2008 11:17:48 +0000 Subject: [PATCH] Merged changes to OpenSceneGraph-2.6 into trunk using : svn merge -r 8729:8734 http://www.openscenegraph.org/svn/osg/OpenSceneGraph/branches/OpenSceneGraph-2.6 . --- CMakeLists.txt | 2 +- include/osg/AutoTransform | 32 +++---- include/osg/Version | 2 +- include/osgShadow/ParallelSplitShadowMap | 64 +++++++------- src/osgPlugins/ive/AutoTransform.cpp | 4 +- src/osgPlugins/osg/AutoTransform.cpp | 9 +- src/osgShadow/ParallelSplitShadowMap.cpp | 102 +++++++++++------------ src/osgWrappers/osg/AutoTransform.cpp | 14 ++-- 8 files changed, 115 insertions(+), 114 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 750043465..cc7ed3dcb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,7 +26,7 @@ PROJECT(OpenSceneGraph) SET(OPENSCENEGRAPH_MAJOR_VERSION 2) SET(OPENSCENEGRAPH_MINOR_VERSION 6) SET(OPENSCENEGRAPH_PATCH_VERSION 0) -SET(OPENSCENEGRAPH_SOVERSION 43) +SET(OPENSCENEGRAPH_SOVERSION 44) SET(OPENSCENEGRAPH_VERSION ${OPENSCENEGRAPH_MAJOR_VERSION}.${OPENSCENEGRAPH_MINOR_VERSION}.${OPENSCENEGRAPH_PATCH_VERSION}) diff --git a/include/osg/AutoTransform b/include/osg/AutoTransform index 7e155a22e..e41c6aa64 100644 --- a/include/osg/AutoTransform +++ b/include/osg/AutoTransform @@ -1,13 +1,13 @@ -/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield +/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield * - * This library is open source and may be redistributed and/or modified under - * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or + * This library is open source and may be redistributed and/or modified under + * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details. */ @@ -29,7 +29,7 @@ class OSG_EXPORT AutoTransform : public Transform public : AutoTransform(); - AutoTransform(const AutoTransform& pat,const CopyOp& copyop=CopyOp::SHALLOW_COPY); + AutoTransform(const AutoTransform& pat,const CopyOp& copyop=CopyOp::SHALLOW_COPY); virtual osg::Object* cloneType() const { return new AutoTransform (); } virtual osg::Object* clone(const osg::CopyOp& copyop) const { return new AutoTransform (*this,copyop); } @@ -48,12 +48,12 @@ class OSG_EXPORT AutoTransform : public Transform inline void setRotation(const Quat& quat) { _rotation = quat; _matrixDirty=true; dirtyBound(); } inline const Quat& getRotation() const { return _rotation; } - + inline void setScale(float scale) { setScale(osg::Vec3(scale,scale,scale)); } void setScale(const Vec3& scale); inline const Vec3& getScale() const { return _scale; } - + void setMinimumScale(float minimumScale) { _minimumScale = minimumScale; } float getMinimumScale() const { return _minimumScale; } @@ -62,7 +62,7 @@ class OSG_EXPORT AutoTransform : public Transform inline void setPivotPoint(const Vec3& pivot) { _pivotPoint = pivot; _matrixDirty=true; dirtyBound(); } inline const Vec3& getPivotPoint() const { return _pivotPoint; } - + void setAutoUpdateEyeMovementTolerance(float tolerance) { _autoUpdateEyeMovementTolerance = tolerance; } float getAutoUpdateEyeMovementTolerance() const { return _autoUpdateEyeMovementTolerance; } @@ -74,7 +74,7 @@ class OSG_EXPORT AutoTransform : public Transform ROTATE_TO_SCREEN, ROTATE_TO_CAMERA }; - + void setAutoRotateMode(AutoRotateMode mode) { _autoRotateMode = mode; _firstTimeToInitEyePoint = true; } AutoRotateMode getAutoRotateMode() const { return _autoRotateMode; } @@ -83,8 +83,8 @@ class OSG_EXPORT AutoTransform : public Transform bool getAutoScaleToScreen() const { return _autoScaleToScreen; } - void setAutoScaleTransistionWidthRatio(float ratio) { _autoScaleTransitionWidthRatio = ratio; } - float getAutoScaleTransistionWidthRatio() const { return _autoScaleTransitionWidthRatio; } + void setAutoScaleTransitionWidthRatio(float ratio) { _autoScaleTransitionWidthRatio = ratio; } + float getAutoScaleTransitionWidthRatio() const { return _autoScaleTransitionWidthRatio; } virtual bool computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor* nv) const; @@ -95,7 +95,7 @@ class OSG_EXPORT AutoTransform : public Transform protected : - + virtual ~AutoTransform() {} Vec3 _position; @@ -105,17 +105,17 @@ class OSG_EXPORT AutoTransform : public Transform AutoRotateMode _autoRotateMode; bool _autoScaleToScreen; - + mutable Quat _rotation; mutable Vec3 _scale; mutable bool _firstTimeToInitEyePoint; mutable osg::Vec3 _previousEyePoint; mutable osg::Vec3 _previousLocalUp; mutable Viewport::value_type _previousWidth; - mutable Viewport::value_type _previousHeight; + mutable Viewport::value_type _previousHeight; mutable osg::Matrix _previousProjection; mutable osg::Vec3 _previousPosition; - + float _minimumScale; float _maximumScale; float _autoScaleTransitionWidthRatio; diff --git a/include/osg/Version b/include/osg/Version index 40cda828d..46d4d9294 100644 --- a/include/osg/Version +++ b/include/osg/Version @@ -22,7 +22,7 @@ extern "C" { #define OPENSCENEGRAPH_MAJOR_VERSION 2 #define OPENSCENEGRAPH_MINOR_VERSION 6 #define OPENSCENEGRAPH_PATCH_VERSION 0 -#define OPENSCENEGRAPH_SOVERSION 43 +#define OPENSCENEGRAPH_SOVERSION 44 /** * osgGetVersion() returns the library version number. diff --git a/include/osgShadow/ParallelSplitShadowMap b/include/osgShadow/ParallelSplitShadowMap index 5c713634c..a079ce118 100644 --- a/include/osgShadow/ParallelSplitShadowMap +++ b/include/osgShadow/ParallelSplitShadowMap @@ -1,29 +1,29 @@ -/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield +/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield * - * This library is open source and may be redistributed and/or modified under - * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or + * This library is open source and may be redistributed and/or modified under + * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details. */ -/* ParallelSplitShadowMap written by Adrian Egli +/* ParallelSplitShadowMap written by Adrian Egli * * this version has still a bug in mutli-thread application (flickering problem) * to avoid the flickering problem try osgShadow --pssm --SingleThreaded your_scene.ive * - * The Parallel Split Shadow Map only supports directional light for simulating the shadow. - * It's one of the most robust algorithm for huge terrain sun light's shadow simulation, if - * you need to shadow a terrain, or another huge scene, you should use Parallel Split Shadow Map - * or at least test it against your scene. Have fun. + * The Parallel Split Shadow Map only supports directional light for simulating the shadow. + * It's one of the most robust algorithm for huge terrain sun light's shadow simulation, if + * you need to shadow a terrain, or another huge scene, you should use Parallel Split Shadow Map + * or at least test it against your scene. Have fun. * */ -#ifndef OSGSHADOW_ParallelSplitShadowMap +#ifndef OSGSHADOW_ParallelSplitShadowMap #define OSGSHADOW_ParallelSplitShadowMap 1 #include @@ -35,16 +35,16 @@ namespace osgShadow { -class OSGSHADOW_EXPORT ParallelSplitShadowMap : public ShadowTechnique +class OSGSHADOW_EXPORT ParallelSplitShadowMap : public ShadowTechnique { public: ParallelSplitShadowMap(osg::Geode** debugGroup=NULL, int icountplanes=3); ParallelSplitShadowMap(const ParallelSplitShadowMap& es, const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY); - + META_Object(osgShadow, ParallelSplitShadowMap); - + /** Initialize the ShadowedScene and local cached data structures.*/ virtual void init(); @@ -69,21 +69,21 @@ class OSGSHADOW_EXPORT ParallelSplitShadowMap : public ShadowTechnique /** Set the texture resolution */ inline void setTextureResolution(unsigned int resolution) { _resolution = resolution; } - /** Set the max far distance */ + /** Set the max far distance */ inline void setMaxFarDistance(double farDist) { _setMaxFarDistance = farDist; _isSetMaxFarDistance = true; } /** Set the factor for moving the virtual camera behind the real camera*/ inline void setMoveVCamBehindRCamFactor(double distFactor ) { _move_vcam_behind_rcam_factor = distFactor; } - /** Set min near distance for splits */ + /** Set min near distance for splits */ inline void setMinNearDistanceForSplits(double nd){ _split_min_near_dist=nd; } - /** set a user defined light for shadow simulation (sun light, ... ) - * when this light get passed to pssm, the scene's light are no longer collected - * and simulated. just this user passed light, it needs to be a directional light. + /** set a user defined light for shadow simulation (sun light, ... ) + * when this light get passed to pssm, the scene's light are no longer collected + * and simulated. just this user passed light, it needs to be a directional light. */ inline void setUserLight(osg::Light* light) { _userLight = light; } - + /** Set the values for the ambient bias the shader will use.*/ void setAmbientBias(const osg::Vec2& ambientBias ); @@ -92,32 +92,32 @@ class OSGSHADOW_EXPORT ParallelSplitShadowMap : public ShadowTechnique */ class OSGSHADOW_EXPORT FragmentShaderGenerator : public osg::Referenced { public: - /** - * generate the GLSL fragement shader + /** + * generate the GLSL fragement shader */ virtual std::string generateGLSL_FragmentShader_BaseTex(bool debug, unsigned int splitCount,double textureRes, bool filtered, unsigned int nbrSplits,unsigned int textureOffset); }; - + /** set fragment shader generator */ inline void setFragmentShaderGenerator(FragmentShaderGenerator* fsw) { _FragmentShaderGenerator = fsw;} - + /** enable / disable shadow filtering */ inline void enableShadowGLSLFiltering(bool filtering = true) { _GLSL_shadow_filtered = filtering; } - + enum SplitCalcMode { SPLIT_LINEAR, SPLIT_EXP }; - + /** set split calculation mode */ inline void setSplitCalculationMode(SplitCalcMode scm=SPLIT_EXP) { _SplitCalcMode = scm; } - - + + protected : virtual ~ParallelSplitShadowMap() {} - + struct PSSMShadowSplitTexture { // RTT osg::ref_ptr _camera; @@ -157,7 +157,7 @@ class OSGSHADOW_EXPORT ParallelSplitShadowMap : public ShadowTechnique private: void calculateFrustumCorners(PSSMShadowSplitTexture &pssmShadowSplitTexture,osg::Vec3d *frustumCorners); - void calculateLightInitalPosition(PSSMShadowSplitTexture &pssmShadowSplitTexture,osg::Vec3d *frustumCorners); + void calculateLightInitialPosition(PSSMShadowSplitTexture &pssmShadowSplitTexture,osg::Vec3d *frustumCorners); void calculateLightNearFarFormFrustum(PSSMShadowSplitTexture &pssmShadowSplitTexture,osg::Vec3d *frustumCorners); void calculateLightViewProjectionFormFrustum(PSSMShadowSplitTexture &pssmShadowSplitTexture,osg::Vec3d *frustumCorners); @@ -180,13 +180,13 @@ class OSGSHADOW_EXPORT ParallelSplitShadowMap : public ShadowTechnique double _split_min_near_dist; double _move_vcam_behind_rcam_factor; - + osg::ref_ptr _userLight; osg::ref_ptr _FragmentShaderGenerator; bool _GLSL_shadow_filtered; SplitCalcMode _SplitCalcMode; - + osg::Uniform* _ambientBiasUniform; osg::Vec2d _ambientBias; diff --git a/src/osgPlugins/ive/AutoTransform.cpp b/src/osgPlugins/ive/AutoTransform.cpp index 9324a6e75..55e6dac47 100644 --- a/src/osgPlugins/ive/AutoTransform.cpp +++ b/src/osgPlugins/ive/AutoTransform.cpp @@ -41,7 +41,7 @@ void AutoTransform::write(DataOutputStream* out){ { out->writeFloat(getMinimumScale()); out->writeFloat(getMaximumScale()); - out->writeFloat(getAutoScaleTransistionWidthRatio()); + out->writeFloat(getAutoScaleTransitionWidthRatio()); } out->writeQuat(getRotation()); @@ -76,7 +76,7 @@ void AutoTransform::read(DataInputStream* in){ { setMinimumScale(in->readFloat()); setMaximumScale(in->readFloat()); - setAutoScaleTransistionWidthRatio(in->readFloat()); + setAutoScaleTransitionWidthRatio(in->readFloat()); } setRotation(in->readQuat()); diff --git a/src/osgPlugins/osg/AutoTransform.cpp b/src/osgPlugins/osg/AutoTransform.cpp index 0ddaf720b..f37cb663c 100644 --- a/src/osgPlugins/osg/AutoTransform.cpp +++ b/src/osgPlugins/osg/AutoTransform.cpp @@ -140,12 +140,13 @@ bool AutoTransform_readLocalData(Object& obj, Input& fr) iteratorAdvanced = true; } - if (fr.matchSequence("autoScaleTransistionWidthRatio %f")) + if (fr.matchSequence("autoScaleTransistionWidthRatio %f") || + fr.matchSequence("autoScaleTransitionWidthRatio %f")) { float ratio; fr[1].getFloat(ratio); - transform.setAutoScaleTransistionWidthRatio(ratio); + transform.setAutoScaleTransitionWidthRatio(ratio); fr += 2; iteratorAdvanced = true; @@ -181,9 +182,9 @@ bool AutoTransform_writeLocalData(const Object& obj, Output& fw) fw.indent()<<"autoScaleToScreen "<<(transform.getAutoScaleToScreen()?"TRUE":"FALSE")<getOrCreateStateSet(); - + ////////////////////////////////////////////////////////////////////////// float factor = _polgyonOffset.x(); float units = _polgyonOffset.y(); @@ -356,7 +356,7 @@ void ParallelSplitShadowMap::init(){ ////////////////////////////////////////////////////////////////////////// - if ( ! _GLSL_shadow_filtered ) { + if ( ! _GLSL_shadow_filtered ) { // if not glsl filtering enabled then we should force front face culling to reduce the number of shadow artefacts. osg::ref_ptr cull_face = new osg::CullFace; cull_face->setMode(osg::CullFace::FRONT); @@ -396,7 +396,7 @@ void ParallelSplitShadowMap::init(){ ////////////////////////////////////////////////////////////////////////// // GLSL PROGRAMS - osg::Shader* fragment_shader = new osg::Shader(osg::Shader::FRAGMENT, + osg::Shader* fragment_shader = new osg::Shader(osg::Shader::FRAGMENT, _FragmentShaderGenerator->generateGLSL_FragmentShader_BaseTex( _debug_color_in_GLSL, iCameras, @@ -407,7 +407,7 @@ void ParallelSplitShadowMap::init(){ ).c_str()); program->addShader(fragment_shader); - + ////////////////////////////////////////////////////////////////////////// // UNIFORMS std::stringstream strST; strST << "shadowTexture" << (pssmShadowSplitTexture._textureUnit-_textureUnitOffset); @@ -419,7 +419,7 @@ void ParallelSplitShadowMap::init(){ _ambientBiasUniform = new osg::Uniform("ambientBias",_ambientBias); pssmShadowSplitTexture._stateset->addUniform(_ambientBiasUniform); } - + std::stringstream strzShadow; strzShadow << "zShadow" << (pssmShadowSplitTexture._textureUnit-_textureUnitOffset); pssmShadowSplitTexture._farDistanceSplit = new osg::Uniform(strzShadow.str().c_str(),1.0f); @@ -571,7 +571,7 @@ void ParallelSplitShadowMap::cull(osgUtil::CullVisitor& cv){ ////////////////////////////////////////////////////////////////////////// const osg::Light* selectLight = 0; - /// light pos and light direction + /// light pos and light direction osg::Vec4 lightpos; osg::Vec3 lightDirection; @@ -605,7 +605,7 @@ void ParallelSplitShadowMap::cull(osgUtil::CullVisitor& cv){ lightpos = _userLight->getPosition(); lightDirection = _userLight->getDirection(); selectLight = _userLight.get(); - } + } if (selectLight) { @@ -617,7 +617,7 @@ void ParallelSplitShadowMap::cull(osgUtil::CullVisitor& cv){ { PSSMShadowSplitTexture pssmShadowSplitTexture = it->second; - + ////////////////////////////////////////////////////////////////////////// // SETUP pssmShadowSplitTexture for rendering // @@ -641,7 +641,7 @@ void ParallelSplitShadowMap::cull(osgUtil::CullVisitor& cv){ // Init Light (Directional Light) // - calculateLightInitalPosition(pssmShadowSplitTexture,pCorners); + calculateLightInitialPosition(pssmShadowSplitTexture,pCorners); // Calculate near and far for light view // @@ -682,7 +682,7 @@ void ParallelSplitShadowMap::cull(osgUtil::CullVisitor& cv){ // do RTT camera traversal pssmShadowSplitTexture._camera->accept(cv); - + ////////////////////////////////////////////////////////////////////////// // DEBUG if ( _displayTexturesGroupingNode ) { @@ -781,11 +781,11 @@ void ParallelSplitShadowMap::calculateFrustumCorners( delete[] pSplitDistances; } - - + + pssmShadowSplitTexture._split_far = camFar; - - + + ////////////////////////////////////////////////////////////////////////// /// TRANSFORM frustum corners (Optimized for Orthogonal) @@ -805,7 +805,7 @@ void ParallelSplitShadowMap::calculateFrustumCorners( frustumCorners[4] = const_pointFarTL * invProjViewMat; frustumCorners[5] = const_pointFarBL * invProjViewMat; frustumCorners[6] = const_pointNearBL* invProjViewMat; - frustumCorners[7] = const_pointNearTL* invProjViewMat; + frustumCorners[7] = const_pointNearTL* invProjViewMat; //std::cout << "camFar : "< dist_z_from_light ) zNear = dist_z_from_light; - } + } // update near - far plane pssmShadowSplitTexture._lightNear = max(zNear - _split_min_near_dist - 0.01,0.01); pssmShadowSplitTexture._lightFar = zFar; @@ -874,37 +874,37 @@ void ParallelSplitShadowMap::calculateLightViewProjectionFormFrustum(PSSMShadowS // calculate the camera's coordinate system osg::Vec3d camEye,camCenter,camUp; pssmShadowSplitTexture._cameraView.getLookAt(camEye,camCenter,camUp); - osg::Vec3d viewDir(camCenter-camEye); + osg::Vec3d viewDir(camCenter-camEye); osg::Vec3d camRight(camUp^viewDir); // we force to have normalized vectors (camera's view) camUp.normalize(); viewDir.normalize(); camRight.normalize(); - + // use quaternion -> numerical more robust osg::Quat qRot; qRot.makeRotate(viewDir,pssmShadowSplitTexture._lightDirection); osg::Vec3d top = qRot * camUp; osg::Vec3d right = qRot * camRight; - + // calculate the camera's frustum right,right,bottom,top parameters double maxRight(-DBL_MAX),maxTop(-DBL_MAX); double minRight(DBL_MAX),minTop(DBL_MAX); for(int i(0); i < 8; i++) - { - + { + osg::Vec3d diffCorner(pssmShadowSplitTexture._lightCameraSource - frustumCorners[i]); - double lright(diffCorner*right); - double lTop(diffCorner*top); + double lright(diffCorner*right); + double lTop(diffCorner*top); if ( lright > maxRight ) maxRight = lright; if ( lTop > maxTop ) maxTop = lTop; if ( lright < minRight ) minRight = lright; if ( lTop < minTop ) minTop = lTop; - } + } // make the camera view matrix pssmShadowSplitTexture._camera->setViewMatrixAsLookAt(pssmShadowSplitTexture._lightCameraSource,pssmShadowSplitTexture._lightCameraTarget,top); @@ -918,7 +918,7 @@ void ParallelSplitShadowMap::calculateLightViewProjectionFormFrustum(PSSMShadowS osg::Vec3d vProjCamFraValue = (camEye + viewDir * pssmShadowSplitTexture._split_far) * (pssmShadowSplitTexture._cameraView * pssmShadowSplitTexture._cameraProj); pssmShadowSplitTexture._farDistanceSplit->set((float)vProjCamFraValue.z()); #endif - + } diff --git a/src/osgWrappers/osg/AutoTransform.cpp b/src/osgWrappers/osg/AutoTransform.cpp index 87de74b63..da598a054 100644 --- a/src/osgWrappers/osg/AutoTransform.cpp +++ b/src/osgWrappers/osg/AutoTransform.cpp @@ -179,14 +179,14 @@ BEGIN_OBJECT_REFLECTOR(osg::AutoTransform) __bool__getAutoScaleToScreen, "", ""); - I_Method1(void, setAutoScaleTransistionWidthRatio, IN, float, ratio, + I_Method1(void, setAutoScaleTransitionWidthRatio, IN, float, ratio, Properties::NON_VIRTUAL, - __void__setAutoScaleTransistionWidthRatio__float, + __void__setAutoScaleTransitionWidthRatio__float, "", ""); - I_Method0(float, getAutoScaleTransistionWidthRatio, + I_Method0(float, getAutoScaleTransitionWidthRatio, Properties::NON_VIRTUAL, - __float__getAutoScaleTransistionWidthRatio, + __float__getAutoScaleTransitionWidthRatio, "", ""); I_Method2(bool, computeLocalToWorldMatrix, IN, osg::Matrix &, matrix, IN, osg::NodeVisitor *, nv, @@ -216,9 +216,9 @@ BEGIN_OBJECT_REFLECTOR(osg::AutoTransform) I_SimpleProperty(bool, AutoScaleToScreen, __bool__getAutoScaleToScreen, __void__setAutoScaleToScreen__bool); - I_SimpleProperty(float, AutoScaleTransistionWidthRatio, - __float__getAutoScaleTransistionWidthRatio, - __void__setAutoScaleTransistionWidthRatio__float); + I_SimpleProperty(float, AutoScaleTransitionWidthRatio, + __float__getAutoScaleTransitionWidthRatio, + __void__setAutoScaleTransitionWidthRatio__float); I_SimpleProperty(float, AutoUpdateEyeMovementTolerance, __float__getAutoUpdateEyeMovementTolerance, __void__setAutoUpdateEyeMovementTolerance__float);