Fixed stereo implementation.

This commit is contained in:
Robert Osfield
2002-02-18 23:01:09 +00:00
parent 6d267336c1
commit aefaafdbf9
7 changed files with 66 additions and 45 deletions

View File

@@ -43,6 +43,8 @@ class OSGUTIL_EXPORT CullVisitor : public osg::NodeVisitor
CullVisitor();
virtual ~CullVisitor();
virtual CullVisitor* cloneType() const { return new CullVisitor(); }
virtual void reset();
virtual void apply(osg::Node&);

View File

@@ -52,6 +52,8 @@ class OSGUTIL_EXPORT RenderGraph : public osg::Referenced
~RenderGraph() {}
RenderGraph* cloneType() const { return new RenderGraph; }
/** return true if all of drawables, lights and children are empty.*/
inline const bool empty() const

View File

@@ -215,7 +215,7 @@ class OSGUTIL_EXPORT SceneView : public osg::Referenced
virtual ~SceneView();
/** Do cull traversal of attached scene graph using Cull NodeVisitor.*/
virtual void cullStage(osg::Camera* camera,osgUtil::RenderStage* renderStage);
virtual void cullStage(osg::Camera* camera,osgUtil::CullVisitor* cullVisitor, osgUtil::RenderGraph* rendergraph, osgUtil::RenderStage* renderStage);
virtual void drawStage(osgUtil::RenderStage* renderStage);
osg::ref_ptr<osg::Node> _sceneData;
@@ -233,8 +233,13 @@ class OSGUTIL_EXPORT SceneView : public osg::Referenced
osg::ref_ptr<osgUtil::RenderStage> _renderStage;
osg::ref_ptr<osg::Camera> _cameraLeft;
osg::ref_ptr<osg::Camera> _cameraRight;
osg::ref_ptr<osgUtil::CullVisitor> _cullVisitorLeft;
osg::ref_ptr<osgUtil::RenderGraph> _rendergraphLeft;
osg::ref_ptr<osgUtil::RenderStage> _renderStageLeft;
osg::ref_ptr<osg::Camera> _cameraRight;
osg::ref_ptr<osgUtil::CullVisitor> _cullVisitorRight;
osg::ref_ptr<osgUtil::RenderGraph> _rendergraphRight;
osg::ref_ptr<osgUtil::RenderStage> _renderStageRight;

View File

@@ -94,7 +94,7 @@ void Camera::copy(const Camera& camera)
// cached matrix and clipping volume derived from above settings.
_dirty = false;// camera._dirty;
_projectionMatrix = NULL; //camera._projectionMatrix;
_modelViewMatrix = NULL; camera._modelViewMatrix;
_modelViewMatrix = NULL; //camera._modelViewMatrix;
// _clippingVolume = camera._clippingVolume;
_mp = NULL;
@@ -757,20 +757,20 @@ void Camera::calculateMatricesAndClippingVolume() const
// note, _left,_right,_top and _bottom are already devided
// by _zNear so no need to take into account for normal
// calculations.
Vec3 leftNormal (1.0f,0.0f,_left);
Vec3 leftNormal (1.0f,0.0f,left);
leftNormal.normalize();
_clippingVolume.add(Plane(leftNormal,0.0f));
Vec3 rightNormal (-1.0f,0.0f,-_right);
Vec3 rightNormal (-1.0f,0.0f,-right);
rightNormal.normalize();
_clippingVolume.add(Plane(rightNormal,0.0f));
Vec3 bottomNormal(0.0f,1.0f,_bottom);
Vec3 bottomNormal(0.0f,1.0f,bottom);
bottomNormal.normalize();
_clippingVolume.add(Plane(bottomNormal,0.0f));
Vec3 topNormal(0.0f,-1.0f,-_top);
Vec3 topNormal(0.0f,-1.0f,-top);
topNormal.normalize();
_clippingVolume.add(Plane(topNormal,0.0f));

View File

@@ -8,7 +8,7 @@ DIRS = osg rgb lib3ds flt obj lwo txp dw bmp pic tga osgtgz tgz zip
# comment in if you want Open DX support, currently not on by default
# since we havn't yet checked compilation on all platforms yet.
# DIRS += dx
DIRS += dx
# comment in if you have Quicktime installed, i.e under Mac OS.
# if in this case then its likely you'll want to comment out the below

View File

@@ -9,7 +9,6 @@ C++FILES = \
ConvertToPerformer.cpp\
ReaderWriterPFB.cpp\
LIB = ../../../lib/osgPlugins/osgdb_pfb.$(SO_EXT)
LIBS = -losg -losgDB \
-lpf3ds\
@@ -45,6 +44,8 @@ LIBS = -losg -losgDB \
# (note: you may need to build libimage.so from libimage.a)
# LIBS += -limage
TARGET_BASENAME = osgdb_pfb
LOADABLE = $(OSGHOME)/lib/osgPlugins/$(TARGET_BASENAME).$(DL_EXT)
LIB=

View File

@@ -144,6 +144,7 @@ void SceneView::app()
void SceneView::cull()
{
if (_displaySettings.valid() && _displaySettings->getStereo())
{
@@ -157,46 +158,45 @@ void SceneView::cull()
_cameraLeft->adjustEyeOffsetForStereo(osg::Vec3(-iod*0.5,0.0f,0.0f));
_cameraRight->adjustEyeOffsetForStereo(osg::Vec3(iod*0.5,0.0f,0.0f));
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->cloneType());
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->cloneType());
cullStage(_cameraLeft.get(),_renderStageLeft.get());
cullStage(_cameraRight.get(),_renderStageRight.get());
cullStage(_cameraLeft.get(),_cullVisitorLeft.get(),_rendergraphLeft.get(),_renderStageLeft.get());
cullStage(_cameraRight.get(),_cullVisitorRight.get(),_rendergraphRight.get(),_renderStageRight.get());
}
else
{
cullStage(_camera.get(),_renderStage.get());
cullStage(_camera.get(),_cullVisitor.get(),_rendergraph.get(),_renderStage.get());
}
}
void SceneView::cullStage(osg::Camera* camera,osgUtil::RenderStage* renderStage)
void SceneView::cullStage(osg::Camera* camera, osgUtil::CullVisitor* cullVisitor, osgUtil::RenderGraph* rendergraph, osgUtil::RenderStage* renderStage)
{
if (!_sceneData || !_viewport->valid()) return;
if (!_initCalled) init();
_camera->adjustAspectRatio(_viewport->aspectRatio());
camera->adjustAspectRatio(_viewport->aspectRatio());
// comment out reset of rendergraph since clean is more efficient.
// _rendergraph->reset();
// use clean of the rendergraph rather than reset, as it is able to
// reuse the structure on the rendergraph in the next frame. This
// achieves a certain amount of frame cohereancy of memory allocation.
_rendergraph->clean();
cullVisitor->reset();
_cullVisitor->reset();
_cullVisitor->setFrameStamp(_frameStamp.get());
cullVisitor->setFrameStamp(_frameStamp.get());
// use the frame number for the traversal number.
if (_frameStamp.valid())
{
_cullVisitor->setTraversalNumber(_frameStamp->getFrameNumber());
cullVisitor->setTraversalNumber(_frameStamp->getFrameNumber());
}
// get the camera's modelview
@@ -209,18 +209,29 @@ void SceneView::cullStage(osg::Camera* camera,osgUtil::RenderStage* renderStage)
local_camera->attachTransform(osg::Camera::NO_ATTACHED_TRANSFORM);
_cullVisitor->setLODBias(_lodBias);
_cullVisitor->setCamera(*local_camera);
_cullVisitor->setViewport(_viewport.get());
_cullVisitor->setEarthSky(NULL); // reset earth sky on each frame.
cullVisitor->setLODBias(_lodBias);
cullVisitor->setCamera(*local_camera);
cullVisitor->setViewport(_viewport.get());
cullVisitor->setEarthSky(NULL); // reset earth sky on each frame.
cullVisitor->setRenderGraph(rendergraph);
cullVisitor->setRenderStage(renderStage);
// SandB
//now make it compute "clipping directions" needed for detailed culling
if(_cullVisitor->getDetailedCulling())
_cullVisitor->calcClippingDirections();//only once pre frame
if(cullVisitor->getDetailedCulling())
cullVisitor->calcClippingDirections();//only once pre frame
renderStage->reset();
// comment out reset of rendergraph since clean is more efficient.
// rendergraph->reset();
// use clean of the rendergraph rather than reset, as it is able to
// reuse the structure on the rendergraph in the next frame. This
// achieves a certain amount of frame cohereancy of memory allocation.
rendergraph->clean();
renderStage->setViewport(_viewport.get());
renderStage->setCamera(local_camera);
renderStage->setClearColor(_backgroundColor);
@@ -238,21 +249,21 @@ void SceneView::cullStage(osg::Camera* camera,osgUtil::RenderStage* renderStage)
break;
}
if (_globalState.valid()) _cullVisitor->pushStateSet(_globalState.get());
if (_globalState.valid()) cullVisitor->pushStateSet(_globalState.get());
_cullVisitor->pushCullViewState(modelview);
cullVisitor->pushCullViewState(modelview);
// traverse the scene graph to generate the rendergraph.
_sceneData->accept(*_cullVisitor);
_sceneData->accept(*cullVisitor);
if (_globalState.valid()) _cullVisitor->popStateSet();
if (_globalState.valid()) cullVisitor->popStateSet();
_cullVisitor->popCullViewState();
cullVisitor->popCullViewState();
const osg::EarthSky* earthSky = _cullVisitor->getEarthSky();
const osg::EarthSky* earthSky = cullVisitor->getEarthSky();
if (earthSky)
{
if (earthSky->getRequiresClear())
@@ -271,17 +282,11 @@ void SceneView::cullStage(osg::Camera* camera,osgUtil::RenderStage* renderStage)
}
}
// prune out any empty RenderGraph children.
// note, this would be not required if the _renderGraph had been
// reset at the start of each frame (see top of this method) but
// a clean has been used instead to try to minimize the amount of
// allocation and deleteing of the RenderGraph nodes.
_rendergraph->prune();
if (_calc_nearfar)
{
_near_plane = _cullVisitor->getCalculatedNearPlane();
_far_plane = _cullVisitor->getCalculatedFarPlane();
_near_plane = cullVisitor->getCalculatedNearPlane();
_far_plane = cullVisitor->getCalculatedFarPlane();
if (_near_plane<=_far_plane)
{
@@ -295,7 +300,7 @@ void SceneView::cullStage(osg::Camera* camera,osgUtil::RenderStage* renderStage)
// if required clamp the near plane to prevent negative or near zero
// near planes.
if(!_cullVisitor->getDetailedCulling())
if(!cullVisitor->getDetailedCulling())
{
float min_near_plane = _far_plane*0.0005f;
if (_near_plane<min_near_plane) _near_plane=min_near_plane;
@@ -311,6 +316,12 @@ void SceneView::cullStage(osg::Camera* camera,osgUtil::RenderStage* renderStage)
camera->setNearFar(_near_plane,_far_plane);
}
// prune out any empty RenderGraph children.
// note, this would be not required if the rendergraph had been
// reset at the start of each frame (see top of this method) but
// a clean has been used instead to try to minimize the amount of
// allocation and deleteing of the RenderGraph nodes.
rendergraph->prune();
}