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:
Robert Osfield 2016-11-11 17:16:40 +00:00
parent d16ca33f38
commit e6052ef4b4
4 changed files with 31 additions and 3 deletions

View File

@ -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());

View File

@ -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);

View File

@ -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;

View File

@ -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;
} }