From 7a7c197af3b52649a33c4f56ea113b1a3ac91a9a Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 17 Mar 2008 15:22:03 +0000 Subject: [PATCH] Added minimum and maximum scale support to osg::AutoTransform --- include/osg/AutoTransform | 14 ++++++++++++-- src/osg/AutoTransform.cpp | 24 ++++++++++++++++++++++++ src/osgPlugins/osg/AutoTransform.cpp | 27 +++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/include/osg/AutoTransform b/include/osg/AutoTransform index 1a987088f..e7908eca0 100644 --- a/include/osg/AutoTransform +++ b/include/osg/AutoTransform @@ -49,10 +49,17 @@ 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) { _scale.set(scale,scale,scale); _matrixDirty=true; dirtyBound(); } - inline void setScale(const Vec3& scale) { _scale = scale; _matrixDirty=true; dirtyBound(); } + 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; } + + void setMaximumScale(float maximumScale) { _maximumScale = maximumScale; } + float getMaximumScale() const { return _maximumScale; } + inline void setPivotPoint(const Vec3& pivot) { _pivotPoint = pivot; _matrixDirty=true; dirtyBound(); } inline const Vec3& getPivotPoint() const { return _pivotPoint; } @@ -105,6 +112,9 @@ class OSG_EXPORT AutoTransform : public Transform mutable Viewport::value_type _previousHeight; mutable osg::Matrix _previousProjection; mutable osg::Vec3 _previousPosition; + + float _minimumScale; + float _maximumScale; void computeMatrix() const; diff --git a/src/osg/AutoTransform.cpp b/src/osg/AutoTransform.cpp index 28b4176e9..ee44eafd1 100644 --- a/src/osg/AutoTransform.cpp +++ b/src/osg/AutoTransform.cpp @@ -23,6 +23,8 @@ AutoTransform::AutoTransform(): _autoScaleToScreen(false), _scale(1.0f,1.0f,1.0f), _firstTimeToInitEyePoint(true), + _minimumScale(0.0f), + _maximumScale(FLT_MAX), _matrixDirty(true) { // setNumChildrenRequiringUpdateTraversal(1); @@ -38,11 +40,29 @@ AutoTransform::AutoTransform(const AutoTransform& pat,const CopyOp& copyop): _rotation(pat._rotation), _scale(pat._scale), _firstTimeToInitEyePoint(true), + _minimumScale(pat._minimumScale), + _maximumScale(pat._maximumScale), _matrixDirty(true) { // setNumChildrenRequiringUpdateTraversal(getNumChildrenRequiringUpdateTraversal()+1); } +void AutoTransform::setScale(const Vec3& scale) +{ + _scale = scale; + if (_scale.x()<_minimumScale) _scale.x() = _minimumScale; + if (_scale.y()<_minimumScale) _scale.y() = _minimumScale; + if (_scale.z()<_minimumScale) _scale.z() = _minimumScale; + + if (_scale.x()>_maximumScale) _scale.x() = _maximumScale; + if (_scale.y()>_maximumScale) _scale.y() = _maximumScale; + if (_scale.z()>_maximumScale) _scale.z() = _maximumScale; + + _matrixDirty=true; + dirtyBound(); +} + + bool AutoTransform::computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor*) const { if (_matrixDirty) computeMatrix(); @@ -158,6 +178,10 @@ void AutoTransform::accept(NodeVisitor& nv) if (getAutoScaleToScreen()) { float size = 1.0f/cs->pixelSize(getPosition(),0.48f); + + if (size<_minimumScale) size = _minimumScale; + if (size>_maximumScale) size = _maximumScale; + setScale(size); } diff --git a/src/osgPlugins/osg/AutoTransform.cpp b/src/osgPlugins/osg/AutoTransform.cpp index a99550c42..0d0d11e2d 100644 --- a/src/osgPlugins/osg/AutoTransform.cpp +++ b/src/osgPlugins/osg/AutoTransform.cpp @@ -69,6 +69,28 @@ bool AutoTransform_readLocalData(Object& obj, Input& fr) iteratorAdvanced = true; } + if (fr.matchSequence("minimumScale %f")) + { + float scale; + fr[1].getFloat(scale); + + transform.setMinimumScale(scale); + + fr += 2; + iteratorAdvanced = true; + } + + if (fr.matchSequence("maximumScale %f")) + { + float scale; + fr[1].getFloat(scale); + + transform.setMaximumScale(scale); + + fr += 2; + iteratorAdvanced = true; + } + if (fr.matchSequence("pivotPoint %f %f %f")) { osg::Vec3 pivot; @@ -129,6 +151,11 @@ bool AutoTransform_writeLocalData(const Object& obj, Output& fw) fw.indent()<<"position "<0.0) fw.indent()<<"minimumScale "<