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->addDraggerCallback(new DraggerVolumeTileCallback(tile.get(), tile->getLocator()));
|
||||
dragger->setMatrix(osg::Matrix::translate(0.5,0.5,0.5)*tile->getLocator()->getTransform());
|
||||
|
||||
dragger->applyAppropriateFrontFace(dragger->getOrCreateStateSet());
|
||||
|
||||
group->addChild(dragger.get());
|
||||
|
||||
|
@ -276,7 +276,13 @@ class OSGMANIPULATOR_EXPORT Dragger : public osg::MatrixTransform
|
||||
virtual void setIntersectionMask(osg::Node::NodeMask intersectionMask) { _intersectionMask = 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(const Dragger& rhs, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include <osgManipulator/Dragger>
|
||||
#include <osgManipulator/Command>
|
||||
#include <osg/Material>
|
||||
#include <osg/FrontFace>
|
||||
#include <osgGA/EventVisitor>
|
||||
#include <osgViewer/View>
|
||||
#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)
|
||||
{
|
||||
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 yAxis(_transform(0,1), _transform(1,1), _transform(2,1));
|
||||
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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user