Added DisplaySettings to osg::Camera, and support into osg::View for initializing
the Camera to the DisplaySettings ScreenWidth/Height/Distance. Added support for dual screen horizontal split stereo.
This commit is contained in:
@@ -71,6 +71,16 @@ class OSG_EXPORT Camera : public Transform, public CullSettings
|
||||
bool getAllowEventFocus() const { return _allowEventFocus; }
|
||||
|
||||
|
||||
/** Set the DsplaySettings object associated with this view.*/
|
||||
void setDisplaySettings(osg::DisplaySettings* ds) { _displaySettings = ds; }
|
||||
|
||||
/** Set the DsplaySettings object associated with this view.*/
|
||||
osg::DisplaySettings* getDisplaySettings() { return _displaySettings.get(); }
|
||||
|
||||
/** Set the DsplaySettings object associated with this view.*/
|
||||
const osg::DisplaySettings* getDisplaySettings() const { return _displaySettings.get(); }
|
||||
|
||||
|
||||
/** Sets the clear color. */
|
||||
inline void setClearColor(const Vec4& color) { _clearColor = color; }
|
||||
|
||||
@@ -425,35 +435,37 @@ class OSG_EXPORT Camera : public Transform, public CullSettings
|
||||
|
||||
virtual ~Camera();
|
||||
|
||||
mutable OpenThreads::Mutex _dataChangeMutex;
|
||||
mutable OpenThreads::Mutex _dataChangeMutex;
|
||||
|
||||
|
||||
View* _view;
|
||||
View* _view;
|
||||
|
||||
osg::ref_ptr<osg::Stats> _stats;
|
||||
osg::ref_ptr<osg::Stats> _stats;
|
||||
|
||||
bool _allowEventFocus;
|
||||
bool _allowEventFocus;
|
||||
|
||||
Vec4 _clearColor;
|
||||
GLbitfield _clearMask;
|
||||
ref_ptr<ColorMask> _colorMask;
|
||||
ref_ptr<Viewport> _viewport;
|
||||
osg::ref_ptr<osg::DisplaySettings> _displaySettings;
|
||||
|
||||
TransformOrder _transformOrder;
|
||||
ProjectionResizePolicy _projectionResizePolicy;
|
||||
Vec4 _clearColor;
|
||||
GLbitfield _clearMask;
|
||||
ref_ptr<ColorMask> _colorMask;
|
||||
ref_ptr<Viewport> _viewport;
|
||||
|
||||
Matrixd _projectionMatrix;
|
||||
Matrixd _viewMatrix;
|
||||
TransformOrder _transformOrder;
|
||||
ProjectionResizePolicy _projectionResizePolicy;
|
||||
|
||||
Matrixd _projectionMatrix;
|
||||
Matrixd _viewMatrix;
|
||||
|
||||
RenderOrder _renderOrder;
|
||||
int _renderOrderNum;
|
||||
RenderOrder _renderOrder;
|
||||
int _renderOrderNum;
|
||||
|
||||
GLenum _drawBuffer;
|
||||
GLenum _readBuffer;
|
||||
GLenum _drawBuffer;
|
||||
GLenum _readBuffer;
|
||||
|
||||
RenderTargetImplementation _renderTargetImplementation;
|
||||
RenderTargetImplementation _renderTargetFallback;
|
||||
BufferAttachmentMap _bufferAttachmentMap;
|
||||
RenderTargetImplementation _renderTargetImplementation;
|
||||
RenderTargetImplementation _renderTargetFallback;
|
||||
BufferAttachmentMap _bufferAttachmentMap;
|
||||
|
||||
ref_ptr<OperationsThread> _cameraThread;
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ Camera::Camera(const Camera& camera,const CopyOp& copyop):
|
||||
_view(camera._view),
|
||||
_allowEventFocus(camera._allowEventFocus),
|
||||
_clearColor(camera._clearColor),
|
||||
_displaySettings(camera._displaySettings),
|
||||
_clearMask(camera._clearMask),
|
||||
_colorMask(camera._colorMask),
|
||||
_viewport(camera._viewport),
|
||||
|
||||
@@ -24,7 +24,18 @@ View::View()
|
||||
|
||||
setCamera(new osg::Camera);
|
||||
|
||||
#if 1
|
||||
double height = osg::DisplaySettings::instance()->getScreenHeight();
|
||||
double width = osg::DisplaySettings::instance()->getScreenWidth();
|
||||
double distance = osg::DisplaySettings::instance()->getScreenWidth();
|
||||
|
||||
double vfov = osg::RadiansToDegrees(atan2(height/2.0f,distance)*2.0);
|
||||
|
||||
_camera->setProjectionMatrixAsPerspective( vfov, width/height, 1.0f,10000.0f);
|
||||
#else
|
||||
_camera->setProjectionMatrixAsFrustum(-0.325, 0.325, -0.26, 0.26, 1.0f,10000.0f);
|
||||
#endif
|
||||
|
||||
_camera->setClearColor(osg::Vec4f(0.2f, 0.2f, 0.4f, 1.0f));
|
||||
|
||||
osg::StateSet* stateset = _camera->getOrCreateStateSet();
|
||||
|
||||
@@ -632,7 +632,7 @@ void CompositeViewer::setUpRenderingSupport()
|
||||
|
||||
sceneView->setGlobalStateSet(view ? view->getCamera()->getStateSet() : 0);
|
||||
sceneView->setDefaults();
|
||||
sceneView->setDisplaySettings(ds);
|
||||
sceneView->setDisplaySettings(camera->getDisplaySettings()!=0 ? camera->getDisplaySettings() : ds);
|
||||
sceneView->setCamera(camera);
|
||||
sceneView->setState(state);
|
||||
sceneView->setFrameStamp(frameStamp);
|
||||
@@ -677,7 +677,7 @@ void CompositeViewer::setUpRenderingSupport()
|
||||
|
||||
sceneView->setGlobalStateSet(view->getCamera()->getStateSet());
|
||||
sceneView->setDefaults();
|
||||
sceneView->setDisplaySettings(ds);
|
||||
sceneView->setDisplaySettings(view->getCamera()->getDisplaySettings()!=0 ? view->getCamera()->getDisplaySettings() : ds);
|
||||
sceneView->setCamera(view->getCamera());
|
||||
sceneView->setState(view->getCamera()->getGraphicsContext()->getState());
|
||||
sceneView->setSceneData(view->getSceneData());
|
||||
@@ -699,7 +699,7 @@ void CompositeViewer::setUpRenderingSupport()
|
||||
sceneView->setGlobalStateSet(view->getCamera()->getStateSet());
|
||||
sceneView->setDefaults();
|
||||
sceneView->setCamera(slave._camera.get());
|
||||
sceneView->setDisplaySettings(ds);
|
||||
sceneView->setDisplaySettings(slave._camera->getDisplaySettings()!=0 ? slave._camera->getDisplaySettings() : ds);
|
||||
sceneView->setState(slave._camera->getGraphicsContext()->getState());
|
||||
sceneView->setSceneData(view->getSceneData());
|
||||
sceneView->setFrameStamp(frameStamp);
|
||||
|
||||
@@ -316,6 +316,10 @@ void View::setUpViewAcrossAllScreens()
|
||||
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(i), width, height);
|
||||
translate_x += double(width) / (double(height) * aspectRatio);
|
||||
}
|
||||
|
||||
bool stereoSlitScreens = numScreens==2 &&
|
||||
ds->getStereoMode()==osg::DisplaySettings::HORIZONTAL_SPLIT &&
|
||||
ds->getStereo();
|
||||
|
||||
for(unsigned int i=0; i<numScreens; ++i)
|
||||
{
|
||||
@@ -335,7 +339,9 @@ void View::setUpViewAcrossAllScreens()
|
||||
traits->sharedContext = 0;
|
||||
traits->sampleBuffers = ds->getMultiSamples();
|
||||
traits->samples = ds->getNumMultiSamples();
|
||||
if (ds->getStereo() && (ds->getStereoMode() == osg::DisplaySettings::QUAD_BUFFER)) {
|
||||
|
||||
if (ds->getStereo() && (ds->getStereoMode() == osg::DisplaySettings::QUAD_BUFFER))
|
||||
{
|
||||
traits->quadBufferStereo = true;
|
||||
}
|
||||
|
||||
@@ -362,11 +368,24 @@ void View::setUpViewAcrossAllScreens()
|
||||
camera->setDrawBuffer(buffer);
|
||||
camera->setReadBuffer(buffer);
|
||||
|
||||
double newAspectRatio = double(traits->width) / double(traits->height);
|
||||
double aspectRatioChange = newAspectRatio / aspectRatio;
|
||||
if (stereoSlitScreens)
|
||||
{
|
||||
unsigned int leftCameraNum = (ds->getSplitStereoHorizontalEyeMapping()==osg::DisplaySettings::LEFT_EYE_LEFT_VIEWPORT) ? 0 : 1;
|
||||
|
||||
osg::ref_ptr<osg::DisplaySettings> ds_local = new osg::DisplaySettings(*ds);
|
||||
ds_local->setStereoMode(leftCameraNum==i ? osg::DisplaySettings::LEFT_EYE : osg::DisplaySettings::RIGHT_EYE);
|
||||
camera->setDisplaySettings(ds_local.get());
|
||||
|
||||
addSlave(camera.get(), osg::Matrixd(), osg::Matrixd() );
|
||||
}
|
||||
else
|
||||
{
|
||||
double newAspectRatio = double(traits->width) / double(traits->height);
|
||||
double aspectRatioChange = newAspectRatio / aspectRatio;
|
||||
|
||||
addSlave(camera.get(), osg::Matrixd::translate( translate_x - aspectRatioChange, 0.0, 0.0) * osg::Matrix::scale(1.0/aspectRatioChange,1.0,1.0), osg::Matrixd() );
|
||||
translate_x -= aspectRatioChange * 2.0;
|
||||
addSlave(camera.get(), osg::Matrixd::translate( translate_x - aspectRatioChange, 0.0, 0.0) * osg::Matrix::scale(1.0/aspectRatioChange,1.0,1.0), osg::Matrixd() );
|
||||
translate_x -= aspectRatioChange * 2.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1560,7 +1560,7 @@ void Viewer::setUpRenderingSupport()
|
||||
|
||||
sceneView->setGlobalStateSet(_camera->getStateSet());
|
||||
sceneView->setDefaults(sceneViewOptions);
|
||||
sceneView->setDisplaySettings(ds);
|
||||
sceneView->setDisplaySettings(camera->getDisplaySettings()!=0 ? camera->getDisplaySettings() : ds);
|
||||
sceneView->setCamera(camera);
|
||||
sceneView->setState(state);
|
||||
sceneView->setFrameStamp(frameStamp);
|
||||
@@ -1584,6 +1584,7 @@ void Viewer::setUpRenderingSupport()
|
||||
sceneView->setDefaults(sceneViewOptions);
|
||||
sceneView->setDisplaySettings(ds);
|
||||
sceneView->setCamera(camera);
|
||||
sceneView->setDisplaySettings(camera->getDisplaySettings()!=0 ? camera->getDisplaySettings() : ds);
|
||||
sceneView->setState(state);
|
||||
sceneView->setFrameStamp(frameStamp);
|
||||
|
||||
@@ -1619,7 +1620,7 @@ void Viewer::setUpRenderingSupport()
|
||||
|
||||
sceneView->setGlobalStateSet(_camera->getStateSet());
|
||||
sceneView->setDefaults(sceneViewOptions);
|
||||
sceneView->setDisplaySettings(ds);
|
||||
sceneView->setDisplaySettings(camera->getDisplaySettings()!=0 ? camera->getDisplaySettings() : ds);
|
||||
sceneView->setCamera(camera);
|
||||
sceneView->setState(state);
|
||||
sceneView->setFrameStamp(frameStamp);
|
||||
|
||||
Reference in New Issue
Block a user