Added LEFT_EYE and RIGHT_EYE stereo to osg::DisplaySettings/osgUtil::SceneView
Renamed LODBias to LODScale.
This commit is contained in:
parent
6d1ba6c0f4
commit
8e84722f90
@ -82,8 +82,8 @@ echo osglight glider.osg
|
|||||||
osglight glider.osg
|
osglight glider.osg
|
||||||
more memleaks.log
|
more memleaks.log
|
||||||
|
|
||||||
echo osgimpostor Town.osg
|
echo osgimpostor
|
||||||
osgimpostor Town.osg
|
osgimpostor
|
||||||
more memleaks.log
|
more memleaks.log
|
||||||
|
|
||||||
echo osgmultitexture cessnafire.osg
|
echo osgmultitexture cessnafire.osg
|
||||||
|
@ -291,9 +291,10 @@ ifeq ($(OS),Darwin)
|
|||||||
LIB_EXT = dylib
|
LIB_EXT = dylib
|
||||||
QUICKTIME = -framework QuickTime $(CARBON_LIB)
|
QUICKTIME = -framework QuickTime $(CARBON_LIB)
|
||||||
TIFF_LIB = -ltiff
|
TIFF_LIB = -ltiff
|
||||||
SRC_DIRS = osg osgUtil osgDB \
|
# src libs which require external libs: osgText
|
||||||
osgGA osgGLUT \
|
SRC_DIRS = osg osgUtil osgDB osgParticle\
|
||||||
osgPlugins osgParticle \
|
osgGA osgGLUT \
|
||||||
|
osgPlugins \
|
||||||
Demos
|
Demos
|
||||||
LIBVERSION = -dylib_current_version 0.9.1
|
LIBVERSION = -dylib_current_version 0.9.1
|
||||||
|
|
||||||
|
@ -58,8 +58,8 @@ osghud dumptruck.osg
|
|||||||
echo osglight glider.osg
|
echo osglight glider.osg
|
||||||
osglight glider.osg
|
osglight glider.osg
|
||||||
|
|
||||||
echo osgimpostor Town.osg
|
echo osgimpostor
|
||||||
osgimpostor Town.osg
|
osgimpostor
|
||||||
|
|
||||||
echo osgmultitexture cessnafire.osg
|
echo osgmultitexture cessnafire.osg
|
||||||
osgmultitexture cessnafire.osg
|
osgmultitexture cessnafire.osg
|
||||||
|
@ -26,8 +26,8 @@ class SG_EXPORT CollectOccludersVisitor : public osg::NodeVisitor, public osg::C
|
|||||||
|
|
||||||
virtual void reset();
|
virtual void reset();
|
||||||
|
|
||||||
virtual float getDistanceToEyePoint(const Vec3& pos, bool withLODBias) const;
|
virtual float getDistanceToEyePoint(const Vec3& pos, bool withLODScale) const;
|
||||||
virtual float getDistanceFromEyePoint(const Vec3& pos, bool withLODBias) const;
|
virtual float getDistanceFromEyePoint(const Vec3& pos, bool withLODScale) const;
|
||||||
|
|
||||||
virtual void apply(osg::Node&);
|
virtual void apply(osg::Node&);
|
||||||
virtual void apply(osg::Transform& node);
|
virtual void apply(osg::Transform& node);
|
||||||
|
@ -66,8 +66,8 @@ class SG_EXPORT CullStack
|
|||||||
/** Returns the current CullingMode.*/
|
/** Returns the current CullingMode.*/
|
||||||
CullingMode getCullingMode() const { return _cullingMode; }
|
CullingMode getCullingMode() const { return _cullingMode; }
|
||||||
|
|
||||||
void setLODBias(float bias) { _LODBias = bias; }
|
void setLODScale(float bias) { _LODScale = bias; }
|
||||||
float getLODBias() const { return _LODBias; }
|
float getLODScale() const { return _LODScale; }
|
||||||
|
|
||||||
void setSmallFeatureCullingPixelSize(float value) { _smallFeatureCullingPixelSize=value; }
|
void setSmallFeatureCullingPixelSize(float value) { _smallFeatureCullingPixelSize=value; }
|
||||||
float getSmallFeatureCullingPixelSize() const { return _smallFeatureCullingPixelSize; }
|
float getSmallFeatureCullingPixelSize() const { return _smallFeatureCullingPixelSize; }
|
||||||
@ -163,7 +163,7 @@ class SG_EXPORT CullStack
|
|||||||
void popCullingSet();
|
void popCullingSet();
|
||||||
|
|
||||||
CullingMode _cullingMode;
|
CullingMode _cullingMode;
|
||||||
float _LODBias;
|
float _LODScale;
|
||||||
float _smallFeatureCullingPixelSize;
|
float _smallFeatureCullingPixelSize;
|
||||||
|
|
||||||
// base set of shadow volume occluder to use in culling.
|
// base set of shadow volume occluder to use in culling.
|
||||||
|
@ -64,7 +64,9 @@ class SG_EXPORT DisplaySettings : public osg::Referenced
|
|||||||
QUAD_BUFFER,
|
QUAD_BUFFER,
|
||||||
ANAGLYPHIC,
|
ANAGLYPHIC,
|
||||||
HORIZONTAL_SPLIT,
|
HORIZONTAL_SPLIT,
|
||||||
VERTICAL_SPLIT
|
VERTICAL_SPLIT,
|
||||||
|
LEFT_EYE,
|
||||||
|
RIGHT_EYE
|
||||||
};
|
};
|
||||||
|
|
||||||
void setStereoMode(StereoMode mode) { _stereoMode = mode; }
|
void setStereoMode(StereoMode mode) { _stereoMode = mode; }
|
||||||
|
@ -192,12 +192,12 @@ class SG_EXPORT NodeVisitor : public Referenced
|
|||||||
/** Get the distance from a point to the eye point, distance value in local coordinate system.
|
/** Get the distance from a point to the eye point, distance value in local coordinate system.
|
||||||
* Note, not all NodeVisitor implement this method, it is mainly cull visitors which will implement.
|
* Note, not all NodeVisitor implement this method, it is mainly cull visitors which will implement.
|
||||||
* If the getDistianceFromEyePoint(pos) is not implmented than a default value of 0.0 is returned.*/
|
* If the getDistianceFromEyePoint(pos) is not implmented than a default value of 0.0 is returned.*/
|
||||||
virtual float getDistanceToEyePoint(const Vec3& /*pos*/, bool /*useLODBias*/) const { return 0.0f; }
|
virtual float getDistanceToEyePoint(const Vec3& /*pos*/, bool /*useLODScale*/) const { return 0.0f; }
|
||||||
|
|
||||||
/** Get the distance of a point from the eye point, distance value in the eye coordinate system.
|
/** Get the distance of a point from the eye point, distance value in the eye coordinate system.
|
||||||
* Note, not all NodeVisitor implement this method, it is mainly cull visitors which will implement.
|
* Note, not all NodeVisitor implement this method, it is mainly cull visitors which will implement.
|
||||||
* If the getDistianceFromEyePoint(pos) is not implmented than a default value of 0.0 is returned.*/
|
* If the getDistianceFromEyePoint(pos) is not implmented than a default value of 0.0 is returned.*/
|
||||||
virtual float getDistanceFromEyePoint(const Vec3& /*pos*/, bool /*useLODBias*/) const { return 0.0f; }
|
virtual float getDistanceFromEyePoint(const Vec3& /*pos*/, bool /*useLODScale*/) const { return 0.0f; }
|
||||||
|
|
||||||
virtual void apply(Node& node) { traverse(node);}
|
virtual void apply(Node& node) { traverse(node);}
|
||||||
|
|
||||||
|
@ -48,8 +48,8 @@ class OSGUTIL_EXPORT CullVisitor : public osg::NodeVisitor, public osg::CullStac
|
|||||||
|
|
||||||
virtual void reset();
|
virtual void reset();
|
||||||
|
|
||||||
virtual float getDistanceToEyePoint(const osg::Vec3& pos, bool withLODBias) const;
|
virtual float getDistanceToEyePoint(const osg::Vec3& pos, bool withLODScale) const;
|
||||||
virtual float getDistanceFromEyePoint(const osg::Vec3& pos, bool withLODBias) const;
|
virtual float getDistanceFromEyePoint(const osg::Vec3& pos, bool withLODScale) const;
|
||||||
|
|
||||||
virtual void apply(osg::Node&);
|
virtual void apply(osg::Node&);
|
||||||
virtual void apply(osg::Geode& node);
|
virtual void apply(osg::Geode& node);
|
||||||
|
@ -167,10 +167,10 @@ class OSGUTIL_EXPORT SceneView : public osg::Referenced
|
|||||||
const osg::Node::NodeMask getCullMaskRight() const { return _cullMaskRight; }
|
const osg::Node::NodeMask getCullMaskRight() const { return _cullMaskRight; }
|
||||||
|
|
||||||
/** Set the LOD bias for the CullVisitor to use.*/
|
/** Set the LOD bias for the CullVisitor to use.*/
|
||||||
void setLODBias(float bias) { _LODBias = bias; }
|
void setLODScale(float bias) { _LODScale = bias; }
|
||||||
|
|
||||||
/** Get the LOD bias.*/
|
/** Get the LOD bias.*/
|
||||||
float getLODBias() const { return _LODBias; }
|
float getLODScale() const { return _LODScale; }
|
||||||
|
|
||||||
/** Set the Small Feature Culling Pixel Size.*/
|
/** Set the Small Feature Culling Pixel Size.*/
|
||||||
void setSmallFeatureCullingPixelSize(float value) { _smallFeatureCullingPixelSize=value; }
|
void setSmallFeatureCullingPixelSize(float value) { _smallFeatureCullingPixelSize=value; }
|
||||||
@ -319,7 +319,7 @@ class OSGUTIL_EXPORT SceneView : public osg::Referenced
|
|||||||
|
|
||||||
CullVisitor::ComputeNearFarMode _computeNearFar;
|
CullVisitor::ComputeNearFarMode _computeNearFar;
|
||||||
osg::CullStack::CullingMode _cullingMode;
|
osg::CullStack::CullingMode _cullingMode;
|
||||||
float _LODBias;
|
float _LODScale;
|
||||||
float _smallFeatureCullingPixelSize;
|
float _smallFeatureCullingPixelSize;
|
||||||
|
|
||||||
FusionDistanceMode _fusionDistanceMode;
|
FusionDistanceMode _fusionDistanceMode;
|
||||||
|
@ -32,19 +32,19 @@ void CollectOccludersVisitor::reset()
|
|||||||
CullStack::reset();
|
CullStack::reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
float CollectOccludersVisitor::getDistanceToEyePoint(const Vec3& pos, bool withLODBias) const
|
float CollectOccludersVisitor::getDistanceToEyePoint(const Vec3& pos, bool withLODScale) const
|
||||||
{
|
{
|
||||||
if (withLODBias) return (pos-getEyeLocal()).length()*getLODBias();
|
if (withLODScale) return (pos-getEyeLocal()).length()*getLODScale();
|
||||||
else return (pos-getEyeLocal()).length();
|
else return (pos-getEyeLocal()).length();
|
||||||
}
|
}
|
||||||
|
|
||||||
float CollectOccludersVisitor::getDistanceFromEyePoint(const Vec3& pos, bool withLODBias) const
|
float CollectOccludersVisitor::getDistanceFromEyePoint(const Vec3& pos, bool withLODScale) const
|
||||||
{
|
{
|
||||||
const Matrix& matrix = *_modelviewStack.back();
|
const Matrix& matrix = *_modelviewStack.back();
|
||||||
float dist = -(pos[0]*matrix(0,2)+pos[1]*matrix(1,2)+pos[2]*matrix(2,2)+matrix(3,2));
|
float dist = -(pos[0]*matrix(0,2)+pos[1]*matrix(1,2)+pos[2]*matrix(2,2)+matrix(3,2));
|
||||||
|
|
||||||
if (withLODBias) return dist*getLODBias();
|
if (withLODScale) return dist*getLODScale();
|
||||||
else return dist*getLODBias();
|
else return dist*getLODScale();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CollectOccludersVisitor::apply(osg::Node& node)
|
void CollectOccludersVisitor::apply(osg::Node& node)
|
||||||
|
@ -5,7 +5,7 @@ using namespace osg;
|
|||||||
CullStack::CullStack()
|
CullStack::CullStack()
|
||||||
{
|
{
|
||||||
_cullingMode = ENABLE_ALL_CULLING;
|
_cullingMode = ENABLE_ALL_CULLING;
|
||||||
_LODBias = 1.0f;
|
_LODScale = 1.0f;
|
||||||
_smallFeatureCullingPixelSize = 2.0f;
|
_smallFeatureCullingPixelSize = 2.0f;
|
||||||
_frustumVolume=-1.0f;
|
_frustumVolume=-1.0f;
|
||||||
_bbCornerNear = 0;
|
_bbCornerNear = 0;
|
||||||
|
@ -129,6 +129,16 @@ void DisplaySettings::readEnvironmentalVariables()
|
|||||||
{
|
{
|
||||||
_stereoMode = VERTICAL_SPLIT;
|
_stereoMode = VERTICAL_SPLIT;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
if (strcmp(ptr,"LEFT_EYE")==0)
|
||||||
|
{
|
||||||
|
_stereoMode = LEFT_EYE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (strcmp(ptr,"RIGHT_EYE")==0)
|
||||||
|
{
|
||||||
|
_stereoMode = RIGHT_EYE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( (ptr = getenv("OSG_STEREO")) != 0)
|
if( (ptr = getenv("OSG_STEREO")) != 0)
|
||||||
@ -230,6 +240,8 @@ void DisplaySettings::readCommandLine(std::vector<std::string>& commandLine)
|
|||||||
else if (*itr=="QUAD_BUFFER") { _stereo = true;_stereoMode = QUAD_BUFFER; ++itr; }
|
else if (*itr=="QUAD_BUFFER") { _stereo = true;_stereoMode = QUAD_BUFFER; ++itr; }
|
||||||
else if (*itr=="HORIZONTAL_SPLIT") { _stereo = true;_stereoMode = HORIZONTAL_SPLIT; ++itr; }
|
else if (*itr=="HORIZONTAL_SPLIT") { _stereo = true;_stereoMode = HORIZONTAL_SPLIT; ++itr; }
|
||||||
else if (*itr=="VERTICAL_SPLIT") { _stereo = true;_stereoMode = VERTICAL_SPLIT; ++itr; }
|
else if (*itr=="VERTICAL_SPLIT") { _stereo = true;_stereoMode = VERTICAL_SPLIT; ++itr; }
|
||||||
|
else if (*itr=="LEFT_EYE") { _stereo = true;_stereoMode = LEFT_EYE; ++itr; }
|
||||||
|
else if (*itr=="RIGHT_EYE") { _stereo = true;_stereoMode = RIGHT_EYE; ++itr; }
|
||||||
else if (*itr=="ON") { _stereo = true; ++itr; }
|
else if (*itr=="ON") { _stereo = true; ++itr; }
|
||||||
else if (*itr=="OFF") { _stereo = false; ++itr; }
|
else if (*itr=="OFF") { _stereo = false; ++itr; }
|
||||||
}
|
}
|
||||||
|
@ -958,11 +958,11 @@ void Viewer::keyboard(unsigned char key, int x, int y)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case '/' :
|
case '/' :
|
||||||
if (sceneView->getLODBias()>0.5) sceneView->setLODBias(sceneView->getLODBias()/1.5f);
|
if (sceneView->getLODScale()>0.5) sceneView->setLODScale(sceneView->getLODScale()/1.5f);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '*' :
|
case '*' :
|
||||||
if (sceneView->getLODBias()<30) sceneView->setLODBias(sceneView->getLODBias()*1.5f);
|
if (sceneView->getLODScale()<30) sceneView->setLODScale(sceneView->getLODScale()*1.5f);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '+' :
|
case '+' :
|
||||||
|
@ -132,9 +132,9 @@ void CullVisitor::reset()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float CullVisitor::getDistanceToEyePoint(const Vec3& pos, bool withLODBias) const
|
float CullVisitor::getDistanceToEyePoint(const Vec3& pos, bool withLODScale) const
|
||||||
{
|
{
|
||||||
if (withLODBias) return (pos-getEyeLocal()).length()*getLODBias();
|
if (withLODScale) return (pos-getEyeLocal()).length()*getLODScale();
|
||||||
else return (pos-getEyeLocal()).length();
|
else return (pos-getEyeLocal()).length();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,13 +143,13 @@ inline float distance(const osg::Vec3& coord,const osg::Matrix& matrix)
|
|||||||
return -(coord[0]*matrix(0,2)+coord[1]*matrix(1,2)+coord[2]*matrix(2,2)+matrix(3,2));
|
return -(coord[0]*matrix(0,2)+coord[1]*matrix(1,2)+coord[2]*matrix(2,2)+matrix(3,2));
|
||||||
}
|
}
|
||||||
|
|
||||||
float CullVisitor::getDistanceFromEyePoint(const osg::Vec3& pos, bool withLODBias) const
|
float CullVisitor::getDistanceFromEyePoint(const osg::Vec3& pos, bool withLODScale) const
|
||||||
{
|
{
|
||||||
const Matrix& matrix = *_modelviewStack.back();
|
const Matrix& matrix = *_modelviewStack.back();
|
||||||
float dist = distance(pos,matrix);
|
float dist = distance(pos,matrix);
|
||||||
|
|
||||||
if (withLODBias) return dist*getLODBias();
|
if (withLODScale) return dist*getLODScale();
|
||||||
else return dist*getLODBias();
|
else return dist*getLODScale();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CullVisitor::popProjectionMatrix()
|
void CullVisitor::popProjectionMatrix()
|
||||||
@ -561,7 +561,7 @@ void CullVisitor::apply(Impostor& node)
|
|||||||
|
|
||||||
float distance2 = (eyeLocal-bs.center()).length2();
|
float distance2 = (eyeLocal-bs.center()).length2();
|
||||||
if (!_impostorActive ||
|
if (!_impostorActive ||
|
||||||
distance2*_LODBias*_LODBias<node.getImpostorThreshold2() ||
|
distance2*_LODScale*_LODScale<node.getImpostorThreshold2() ||
|
||||||
distance2<bs.radius2()*2.0f)
|
distance2<bs.radius2()*2.0f)
|
||||||
{
|
{
|
||||||
// outwith the impostor distance threshold therefore simple
|
// outwith the impostor distance threshold therefore simple
|
||||||
|
@ -24,7 +24,7 @@ SceneView::SceneView(DisplaySettings* ds)
|
|||||||
_computeNearFar = CullVisitor::COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES;
|
_computeNearFar = CullVisitor::COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES;
|
||||||
|
|
||||||
_cullingMode = osg::CullStack::ENABLE_ALL_CULLING;
|
_cullingMode = osg::CullStack::ENABLE_ALL_CULLING;
|
||||||
_LODBias = 1.0f;
|
_LODScale = 1.0f;
|
||||||
_smallFeatureCullingPixelSize = 3.0f;
|
_smallFeatureCullingPixelSize = 3.0f;
|
||||||
|
|
||||||
_fusionDistanceMode = USE_CAMERA_FUSION_DISTANCE;
|
_fusionDistanceMode = USE_CAMERA_FUSION_DISTANCE;
|
||||||
@ -245,6 +245,22 @@ void SceneView::cull()
|
|||||||
if (!projection) projection = osgNew osg::Matrix();
|
if (!projection) projection = osgNew osg::Matrix();
|
||||||
if (!modelview) modelview = osgNew osg::Matrix();
|
if (!modelview) modelview = osgNew osg::Matrix();
|
||||||
|
|
||||||
|
if (!_cullVisitor)
|
||||||
|
{
|
||||||
|
osg::notify(osg::INFO) << "Warning: no valid osgUtil::SceneView:: attached, creating a default CullVisitor automatically."<< std::endl;
|
||||||
|
_cullVisitor = osgNew CullVisitor;
|
||||||
|
}
|
||||||
|
if (!_rendergraph)
|
||||||
|
{
|
||||||
|
osg::notify(osg::INFO) << "Warning: no valid osgUtil::SceneView:: attached, creating a global default RenderGraph automatically."<< std::endl;
|
||||||
|
_rendergraph = osgNew RenderGraph;
|
||||||
|
}
|
||||||
|
if (!_renderStage)
|
||||||
|
{
|
||||||
|
osg::notify(osg::INFO) << "Warning: no valid osgUtil::SceneView::_renderStage attached, creating a default RenderStage automatically."<< std::endl;
|
||||||
|
_renderStage = osgNew RenderStage;
|
||||||
|
}
|
||||||
|
|
||||||
if (_displaySettings.valid() && _displaySettings->getStereo())
|
if (_displaySettings.valid() && _displaySettings->getStereo())
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -269,74 +285,114 @@ void SceneView::cull()
|
|||||||
float sd = _displaySettings->getScreenDistance();
|
float sd = _displaySettings->getScreenDistance();
|
||||||
float es = 0.5f*iod*(fusionDistance/sd);
|
float es = 0.5f*iod*(fusionDistance/sd);
|
||||||
|
|
||||||
if (!_cullVisitorLeft.valid()) _cullVisitorLeft = dynamic_cast<CullVisitor*>(_cullVisitor->cloneType());
|
if (_displaySettings->getStereoMode()==osg::DisplaySettings::LEFT_EYE)
|
||||||
if (!_rendergraphLeft.valid()) _rendergraphLeft = dynamic_cast<RenderGraph*>(_rendergraph->cloneType());
|
|
||||||
if (!_renderStageLeft.valid()) _renderStageLeft = dynamic_cast<RenderStage*>(_renderStage->clone(osg::CopyOp::DEEP_COPY_ALL));
|
|
||||||
|
|
||||||
if (!_cullVisitorRight.valid()) _cullVisitorRight = dynamic_cast<CullVisitor*>(_cullVisitor->cloneType());
|
|
||||||
if (!_rendergraphRight.valid()) _rendergraphRight = dynamic_cast<RenderGraph*>(_rendergraph->cloneType());
|
|
||||||
if (!_renderStageRight.valid()) _renderStageRight = dynamic_cast<RenderStage*>(_renderStage->clone(osg::CopyOp::DEEP_COPY_ALL));
|
|
||||||
|
|
||||||
|
|
||||||
// set up the left eye.
|
|
||||||
osg::ref_ptr<osg::Matrix> projectionLeft = osgNew osg::Matrix(osg::Matrix(1.0f,0.0f,0.0f,0.0f,
|
|
||||||
0.0f,1.0f,0.0f,0.0f,
|
|
||||||
iod/(2.0f*sd),0.0f,1.0f,0.0f,
|
|
||||||
0.0f,0.0f,0.0f,1.0f)*
|
|
||||||
(*projection));
|
|
||||||
|
|
||||||
|
|
||||||
osg::ref_ptr<osg::Matrix> modelviewLeft = osgNew osg::Matrix( (*modelview) *
|
|
||||||
osg::Matrix(1.0f,0.0f,0.0f,0.0f,
|
|
||||||
0.0f,1.0f,0.0f,0.0f,
|
|
||||||
0.0f,0.0f,1.0f,0.0f,
|
|
||||||
es,0.0f,0.0f,1.0f));
|
|
||||||
|
|
||||||
_cullVisitorLeft->setTraversalMask(_cullMaskLeft);
|
|
||||||
cullStage(projectionLeft.get(),modelviewLeft.get(),_cullVisitorLeft.get(),_rendergraphLeft.get(),_renderStageLeft.get());
|
|
||||||
|
|
||||||
|
|
||||||
// set up the right eye.
|
|
||||||
osg::ref_ptr<osg::Matrix> projectionRight = osgNew osg::Matrix(osg::Matrix(1.0f,0.0f,0.0f,0.0f,
|
|
||||||
0.0f,1.0f,0.0f,0.0f,
|
|
||||||
-iod/(2.0f*sd),0.0f,1.0f,0.0f,
|
|
||||||
0.0f,0.0f,0.0f,1.0f)*
|
|
||||||
(*projection));
|
|
||||||
|
|
||||||
osg::ref_ptr<osg::Matrix> modelviewRight = osgNew osg::Matrix( (*modelview) *
|
|
||||||
osg::Matrix(1.0f,0.0f,0.0f,0.0f,
|
|
||||||
0.0f,1.0f,0.0f,0.0f,
|
|
||||||
0.0f,0.0f,1.0f,0.0f,
|
|
||||||
-es,0.0f,0.0f,1.0f));
|
|
||||||
|
|
||||||
_cullVisitorRight->setTraversalMask(_cullMaskRight);
|
|
||||||
cullStage(projectionRight.get(),modelviewRight.get(),_cullVisitorRight.get(),_rendergraphRight.get(),_renderStageRight.get());
|
|
||||||
|
|
||||||
|
|
||||||
if (_camera.valid() && _computeNearFar != CullVisitor::DO_NOT_COMPUTE_NEAR_FAR)
|
|
||||||
{
|
{
|
||||||
// clamp the camera to the near/far computed in cull traversal.
|
// set up the left eye.
|
||||||
_camera->setNearFar(_cullVisitorRight->getCalculatedNearPlane(),_cullVisitorRight->getCalculatedFarPlane());
|
osg::ref_ptr<osg::Matrix> projectionLeft = osgNew osg::Matrix(osg::Matrix(1.0f,0.0f,0.0f,0.0f,
|
||||||
|
0.0f,1.0f,0.0f,0.0f,
|
||||||
|
iod/(2.0f*sd),0.0f,1.0f,0.0f,
|
||||||
|
0.0f,0.0f,0.0f,1.0f)*
|
||||||
|
(*projection));
|
||||||
|
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Matrix> modelviewLeft = osgNew osg::Matrix( (*modelview) *
|
||||||
|
osg::Matrix(1.0f,0.0f,0.0f,0.0f,
|
||||||
|
0.0f,1.0f,0.0f,0.0f,
|
||||||
|
0.0f,0.0f,1.0f,0.0f,
|
||||||
|
es,0.0f,0.0f,1.0f));
|
||||||
|
|
||||||
|
_cullVisitor->setTraversalMask(_cullMaskLeft);
|
||||||
|
cullStage(projectionLeft.get(),modelviewLeft.get(),_cullVisitor.get(),_rendergraph.get(),_renderStage.get());
|
||||||
|
|
||||||
|
if (_camera.valid() && _computeNearFar != CullVisitor::DO_NOT_COMPUTE_NEAR_FAR)
|
||||||
|
{
|
||||||
|
// clamp the camera to the near/far computed in cull traversal.
|
||||||
|
_camera->setNearFar(_cullVisitor->getCalculatedNearPlane(),_cullVisitor->getCalculatedFarPlane());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (_displaySettings->getStereoMode()==osg::DisplaySettings::RIGHT_EYE)
|
||||||
|
{
|
||||||
|
// set up the right eye.
|
||||||
|
osg::ref_ptr<osg::Matrix> projectionRight = osgNew osg::Matrix(osg::Matrix(1.0f,0.0f,0.0f,0.0f,
|
||||||
|
0.0f,1.0f,0.0f,0.0f,
|
||||||
|
-iod/(2.0f*sd),0.0f,1.0f,0.0f,
|
||||||
|
0.0f,0.0f,0.0f,1.0f)*
|
||||||
|
(*projection));
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Matrix> modelviewRight = osgNew osg::Matrix( (*modelview) *
|
||||||
|
osg::Matrix(1.0f,0.0f,0.0f,0.0f,
|
||||||
|
0.0f,1.0f,0.0f,0.0f,
|
||||||
|
0.0f,0.0f,1.0f,0.0f,
|
||||||
|
-es,0.0f,0.0f,1.0f));
|
||||||
|
|
||||||
|
_cullVisitor->setTraversalMask(_cullMaskRight);
|
||||||
|
cullStage(projectionRight.get(),modelviewRight.get(),_cullVisitor.get(),_rendergraph.get(),_renderStage.get());
|
||||||
|
|
||||||
|
|
||||||
|
if (_camera.valid() && _computeNearFar != CullVisitor::DO_NOT_COMPUTE_NEAR_FAR)
|
||||||
|
{
|
||||||
|
// clamp the camera to the near/far computed in cull traversal.
|
||||||
|
_camera->setNearFar(_cullVisitor->getCalculatedNearPlane(),_cullVisitor->getCalculatedFarPlane());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
if (!_cullVisitorLeft.valid()) _cullVisitorLeft = dynamic_cast<CullVisitor*>(_cullVisitor->cloneType());
|
||||||
|
if (!_rendergraphLeft.valid()) _rendergraphLeft = dynamic_cast<RenderGraph*>(_rendergraph->cloneType());
|
||||||
|
if (!_renderStageLeft.valid()) _renderStageLeft = dynamic_cast<RenderStage*>(_renderStage->clone(osg::CopyOp::DEEP_COPY_ALL));
|
||||||
|
|
||||||
|
if (!_cullVisitorRight.valid()) _cullVisitorRight = dynamic_cast<CullVisitor*>(_cullVisitor->cloneType());
|
||||||
|
if (!_rendergraphRight.valid()) _rendergraphRight = dynamic_cast<RenderGraph*>(_rendergraph->cloneType());
|
||||||
|
if (!_renderStageRight.valid()) _renderStageRight = dynamic_cast<RenderStage*>(_renderStage->clone(osg::CopyOp::DEEP_COPY_ALL));
|
||||||
|
|
||||||
|
|
||||||
|
// set up the left eye.
|
||||||
|
osg::ref_ptr<osg::Matrix> projectionLeft = osgNew osg::Matrix(osg::Matrix(1.0f,0.0f,0.0f,0.0f,
|
||||||
|
0.0f,1.0f,0.0f,0.0f,
|
||||||
|
iod/(2.0f*sd),0.0f,1.0f,0.0f,
|
||||||
|
0.0f,0.0f,0.0f,1.0f)*
|
||||||
|
(*projection));
|
||||||
|
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Matrix> modelviewLeft = osgNew osg::Matrix( (*modelview) *
|
||||||
|
osg::Matrix(1.0f,0.0f,0.0f,0.0f,
|
||||||
|
0.0f,1.0f,0.0f,0.0f,
|
||||||
|
0.0f,0.0f,1.0f,0.0f,
|
||||||
|
es,0.0f,0.0f,1.0f));
|
||||||
|
|
||||||
|
_cullVisitorLeft->setTraversalMask(_cullMaskLeft);
|
||||||
|
cullStage(projectionLeft.get(),modelviewLeft.get(),_cullVisitorLeft.get(),_rendergraphLeft.get(),_renderStageLeft.get());
|
||||||
|
|
||||||
|
|
||||||
|
// set up the right eye.
|
||||||
|
osg::ref_ptr<osg::Matrix> projectionRight = osgNew osg::Matrix(osg::Matrix(1.0f,0.0f,0.0f,0.0f,
|
||||||
|
0.0f,1.0f,0.0f,0.0f,
|
||||||
|
-iod/(2.0f*sd),0.0f,1.0f,0.0f,
|
||||||
|
0.0f,0.0f,0.0f,1.0f)*
|
||||||
|
(*projection));
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Matrix> modelviewRight = osgNew osg::Matrix( (*modelview) *
|
||||||
|
osg::Matrix(1.0f,0.0f,0.0f,0.0f,
|
||||||
|
0.0f,1.0f,0.0f,0.0f,
|
||||||
|
0.0f,0.0f,1.0f,0.0f,
|
||||||
|
-es,0.0f,0.0f,1.0f));
|
||||||
|
|
||||||
|
_cullVisitorRight->setTraversalMask(_cullMaskRight);
|
||||||
|
cullStage(projectionRight.get(),modelviewRight.get(),_cullVisitorRight.get(),_rendergraphRight.get(),_renderStageRight.get());
|
||||||
|
|
||||||
|
|
||||||
|
if (_camera.valid() && _computeNearFar != CullVisitor::DO_NOT_COMPUTE_NEAR_FAR)
|
||||||
|
{
|
||||||
|
// clamp the camera to the near/far computed in cull traversal.
|
||||||
|
_camera->setNearFar(_cullVisitorRight->getCalculatedNearPlane(),_cullVisitorRight->getCalculatedFarPlane());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!_cullVisitor)
|
|
||||||
{
|
|
||||||
osg::notify(osg::INFO) << "Warning: no valid osgUtil::SceneView:: attached, creating a default CullVisitor automatically."<< std::endl;
|
|
||||||
_cullVisitor = osgNew CullVisitor;
|
|
||||||
}
|
|
||||||
if (!_rendergraph)
|
|
||||||
{
|
|
||||||
osg::notify(osg::INFO) << "Warning: no valid osgUtil::SceneView:: attached, creating a global default RenderGraph automatically."<< std::endl;
|
|
||||||
_rendergraph = osgNew RenderGraph;
|
|
||||||
}
|
|
||||||
if (!_renderStage)
|
|
||||||
{
|
|
||||||
osg::notify(osg::INFO) << "Warning: no valid osgUtil::SceneView::_renderStage attached, creating a default RenderStage automatically."<< std::endl;
|
|
||||||
_renderStage = osgNew RenderStage;
|
|
||||||
}
|
|
||||||
|
|
||||||
_cullVisitor->setTraversalMask(_cullMask);
|
_cullVisitor->setTraversalMask(_cullMask);
|
||||||
cullStage(projection.get(),modelview.get(),_cullVisitor.get(),_rendergraph.get(),_renderStage.get());
|
cullStage(projection.get(),modelview.get(),_cullVisitor.get(),_rendergraph.get(),_renderStage.get());
|
||||||
@ -410,7 +466,7 @@ void SceneView::cullStage(osg::Matrix* projection,osg::Matrix* modelview,osgUtil
|
|||||||
|
|
||||||
cullVisitor->setCullingMode(_cullingMode);
|
cullVisitor->setCullingMode(_cullingMode);
|
||||||
cullVisitor->setComputeNearFarMode(_computeNearFar);
|
cullVisitor->setComputeNearFarMode(_computeNearFar);
|
||||||
cullVisitor->setLODBias(_LODBias);
|
cullVisitor->setLODScale(_LODScale);
|
||||||
cullVisitor->setSmallFeatureCullingPixelSize(_smallFeatureCullingPixelSize);
|
cullVisitor->setSmallFeatureCullingPixelSize(_smallFeatureCullingPixelSize);
|
||||||
|
|
||||||
cullVisitor->setClearNode(NULL); // reset earth sky on each frame.
|
cullVisitor->setClearNode(NULL); // reset earth sky on each frame.
|
||||||
@ -638,12 +694,17 @@ void SceneView::draw()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case(osg::DisplaySettings::RIGHT_EYE):
|
||||||
|
case(osg::DisplaySettings::LEFT_EYE):
|
||||||
|
{
|
||||||
|
_globalState->setAttribute(_viewport.get());
|
||||||
|
_renderStage->drawPreRenderStages(*_state,previous);
|
||||||
|
_renderStage->draw(*_state,previous);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
osg::notify(osg::NOTICE)<<"Warning: stereo camera mode not implemented yet."<< std::endl;
|
osg::notify(osg::NOTICE)<<"Warning: stereo camera mode not implemented yet."<< std::endl;
|
||||||
_globalState->setAttribute(_viewport.get());
|
|
||||||
_renderStageLeft->drawPreRenderStages(*_state,previous);
|
|
||||||
_renderStageLeft->draw(*_state,previous);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -651,9 +712,9 @@ void SceneView::draw()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
_globalState->setAttribute(_viewport.get());
|
_globalState->setAttribute(_viewport.get());
|
||||||
osg::ref_ptr<osg::ColorMask> cmask = osgNew osg::ColorMask;
|
// osg::ref_ptr<osg::ColorMask> cmask = osgNew osg::ColorMask;
|
||||||
cmask->setMask(true,true,true,true);
|
// cmask->setMask(true,true,true,true);
|
||||||
_globalState->setAttribute(cmask.get());
|
// _globalState->setAttribute(cmask.get());
|
||||||
|
|
||||||
// bog standard draw.
|
// bog standard draw.
|
||||||
_renderStage->drawPreRenderStages(*_state,previous);
|
_renderStage->drawPreRenderStages(*_state,previous);
|
||||||
|
Loading…
Reference in New Issue
Block a user