Added Dragger::applyAppropriateFrontFace(StateSet*) to make it easy to handle inverted matrices by toggling the FrontFace to sure the correct face is visible.
This commit is contained in:
parent
d16ca33f38
commit
e6052ef4b4
@ -1186,7 +1186,7 @@ int main( int argc, char **argv )
|
|||||||
dragger->setActivationModKeyMask(osgGA::GUIEventAdapter::MODKEY_SHIFT);
|
dragger->setActivationModKeyMask(osgGA::GUIEventAdapter::MODKEY_SHIFT);
|
||||||
dragger->addDraggerCallback(new DraggerVolumeTileCallback(tile.get(), tile->getLocator()));
|
dragger->addDraggerCallback(new DraggerVolumeTileCallback(tile.get(), tile->getLocator()));
|
||||||
dragger->setMatrix(osg::Matrix::translate(0.5,0.5,0.5)*tile->getLocator()->getTransform());
|
dragger->setMatrix(osg::Matrix::translate(0.5,0.5,0.5)*tile->getLocator()->getTransform());
|
||||||
|
dragger->applyAppropriateFrontFace(dragger->getOrCreateStateSet());
|
||||||
|
|
||||||
group->addChild(dragger.get());
|
group->addChild(dragger.get());
|
||||||
|
|
||||||
|
@ -276,7 +276,13 @@ class OSGMANIPULATOR_EXPORT Dragger : public osg::MatrixTransform
|
|||||||
virtual void setIntersectionMask(osg::Node::NodeMask intersectionMask) { _intersectionMask = intersectionMask; }
|
virtual void setIntersectionMask(osg::Node::NodeMask intersectionMask) { _intersectionMask = intersectionMask; }
|
||||||
osg::Node::NodeMask getIntersectionMask() const { return _intersectionMask; }
|
osg::Node::NodeMask getIntersectionMask() const { return _intersectionMask; }
|
||||||
|
|
||||||
protected:
|
/** Return true if the axis of the Locator are inverted requiring the faces of any cubes used from rendering to be flipped to ensure the correct front/back face is used.*/
|
||||||
|
bool inverted() const;
|
||||||
|
|
||||||
|
/** apply the appropriate FrontFace setting to provided StateSet to ensure that the rendering of hull of the volume is the correct orientation.*/
|
||||||
|
void applyAppropriateFrontFace(osg::StateSet* ss) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
Dragger();
|
Dragger();
|
||||||
Dragger(const Dragger& rhs, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);
|
Dragger(const Dragger& rhs, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include <osgManipulator/Dragger>
|
#include <osgManipulator/Dragger>
|
||||||
#include <osgManipulator/Command>
|
#include <osgManipulator/Command>
|
||||||
#include <osg/Material>
|
#include <osg/Material>
|
||||||
|
#include <osg/FrontFace>
|
||||||
#include <osgGA/EventVisitor>
|
#include <osgGA/EventVisitor>
|
||||||
#include <osgViewer/View>
|
#include <osgViewer/View>
|
||||||
#include <osg/io_utils>
|
#include <osg/io_utils>
|
||||||
@ -200,6 +201,27 @@ Dragger::~Dragger()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Dragger::inverted() const
|
||||||
|
{
|
||||||
|
osg::Vec3d xAxis(_matrix(0,0), _matrix(1,0), _matrix(2,0));
|
||||||
|
osg::Vec3d yAxis(_matrix(0,1), _matrix(1,1), _matrix(2,1));
|
||||||
|
osg::Vec3d zAxis(_matrix(0,2), _matrix(1,2), _matrix(2,2));
|
||||||
|
double volume = (xAxis^yAxis)*zAxis;
|
||||||
|
return volume<0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Dragger::applyAppropriateFrontFace(osg::StateSet* ss) const
|
||||||
|
{
|
||||||
|
osg::StateAttribute* sa = ss->getAttribute(osg::StateAttribute::FRONTFACE);
|
||||||
|
osg::FrontFace* ff = dynamic_cast<osg::FrontFace*>(sa);
|
||||||
|
if (!ff)
|
||||||
|
{
|
||||||
|
ff = new osg::FrontFace;
|
||||||
|
ss->setAttribute(ff);
|
||||||
|
}
|
||||||
|
ff->setMode( inverted() ? osg::FrontFace::CLOCKWISE : osg::FrontFace::COUNTER_CLOCKWISE);
|
||||||
|
}
|
||||||
|
|
||||||
void Dragger::setHandleEvents(bool flag)
|
void Dragger::setHandleEvents(bool flag)
|
||||||
{
|
{
|
||||||
if (_handleEvents == flag) return;
|
if (_handleEvents == flag) return;
|
||||||
|
@ -229,7 +229,7 @@ bool Locator::inverted() const
|
|||||||
osg::Vec3d xAxis(_transform(0,0), _transform(1,0), _transform(2,0));
|
osg::Vec3d xAxis(_transform(0,0), _transform(1,0), _transform(2,0));
|
||||||
osg::Vec3d yAxis(_transform(0,1), _transform(1,1), _transform(2,1));
|
osg::Vec3d yAxis(_transform(0,1), _transform(1,1), _transform(2,1));
|
||||||
osg::Vec3d zAxis(_transform(0,2), _transform(1,2), _transform(2,2));
|
osg::Vec3d zAxis(_transform(0,2), _transform(1,2), _transform(2,2));
|
||||||
float volume = (xAxis^yAxis)*zAxis;
|
double volume = (xAxis^yAxis)*zAxis;
|
||||||
return volume<0.0;
|
return volume<0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user