Updates to Transform and CullVistor to support new getLocalToWorldMatrix methods.

This commit is contained in:
Robert Osfield 2002-02-12 08:23:07 +00:00
parent e6ac4cd190
commit b2e2a971fd
2 changed files with 45 additions and 9 deletions

View File

@ -66,6 +66,11 @@ class SG_EXPORT Transform : public Group
/** Get the transform mode.*/ /** Get the transform mode.*/
inline const MatrixMode getMatrixMode() const { return _mode; } inline const MatrixMode getMatrixMode() const { return _mode; }
/** Does the tranform set up the projection matrix.*/
inline const bool isProjectionTransform() const { return _mode==PROJECTION; }
/** Does the tranform set up the modelview matrix.*/
inline const bool isModelViewTransform() const { return _mode!=PROJECTION; }
/** Callback attached to an Transform to specifiy how to compute the modelview or projection transformation /** Callback attached to an Transform to specifiy how to compute the modelview or projection transformation
* for the transform below the Transform node.*/ * for the transform below the Transform node.*/
@ -115,16 +120,16 @@ class SG_EXPORT Transform : public Group
/** Set the transform's matrix.*/ /** Set the transform's matrix.*/
void setMatrix(const Matrix& mat) { (*_matrix) = mat; dirtyBound(); } void setMatrix(const Matrix& mat) { (*_matrix) = mat; _inverseDirty=true; dirtyBound(); }
/** Get the transform's matrix. */ /** Get the transform's matrix. */
inline const Matrix& getMatrix() const { return *_matrix; } inline const Matrix& getMatrix() const { return *_matrix; }
/** preMult transform.*/ /** preMult transform.*/
void preMult(const Matrix& mat) { _matrix->preMult(mat); dirtyBound(); } void preMult(const Matrix& mat) { _matrix->preMult(mat); _inverseDirty=true; dirtyBound(); }
/** postMult transform.*/ /** postMult transform.*/
void postMult(const Matrix& mat) { _matrix->postMult(mat); dirtyBound(); } void postMult(const Matrix& mat) { _matrix->postMult(mat); _inverseDirty=true; dirtyBound(); }
protected : protected :
@ -137,16 +142,43 @@ class SG_EXPORT Transform : public Group
virtual const bool computeBound() const; virtual const bool computeBound() const;
virtual const bool computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor*) const virtual const bool computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor*) const
{
if (_mode==VIEW)
{
computeInverse();
matrix = *_inverse;
return true;
}
else
{ {
matrix = *_matrix; matrix = *_matrix;
return true; return true;
} }
}
virtual const bool computeWorldToLocalMatrix(Matrix& matrix,NodeVisitor*) const virtual const bool computeWorldToLocalMatrix(Matrix& matrix,NodeVisitor*) const
{ {
matrix.invert(*_matrix); if (_mode==VIEW)
{
matrix = *_matrix;
return true; return true;
} }
else
{
computeInverse();
matrix = *_inverse;
return true;
}
}
inline void computeInverse() const
{
if (_inverseDirty)
{
_inverse->invert(*_matrix);
_inverseDirty = false;
}
}
Type _type; Type _type;
@ -154,7 +186,8 @@ class SG_EXPORT Transform : public Group
ref_ptr<ComputeTransformCallback> _computeTransformCallback; ref_ptr<ComputeTransformCallback> _computeTransformCallback;
ref_ptr<Matrix> _matrix; ref_ptr<Matrix> _matrix;
mutable ref_ptr<Matrix> _inverse;
mutable bool _inverseDirty;
}; };

View File

@ -126,7 +126,10 @@ class OSGUTIL_EXPORT CullVisitor : public osg::NodeVisitor
/** Get the viewport. */ /** Get the viewport. */
osg::Viewport* getViewport() { return _viewport.get(); } osg::Viewport* getViewport() { return _viewport.get(); }
void pushCullViewState(osg::Matrix* matrix=NULL); inline void pushCullViewState() { pushCullViewState(NULL,NULL); }
void pushCullViewState(osg::Matrix* matrix);
void pushCullViewState(osg::Matrix* matrix,osg::Matrix* inverse);
void popCullViewState(); void popCullViewState();
/** Push state set on the current state group. /** Push state set on the current state group.