Changeset 10807

Show
Ignore:
Timestamp:
11/20/09 13:32:51 (4 years ago)
Author:
robert
Message:

From Farshid Lashkari, "I noticed that the code for rendering vertical interlace, horizontal interlace, and checkerboard stereo are practically identical, except for the stipple pattern. I combined the code blocks for rendering the 3 stereo modes into a single block. I also fixed a small issue with retrieving stats in checkerboard stereo mode."

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osgUtil/SceneView.cpp

    r10765 r10807  
    12911291            break; 
    12921292        case(osg::DisplaySettings::VERTICAL_INTERLACE): 
     1293        case(osg::DisplaySettings::HORIZONTAL_INTERLACE): 
     1294        case(osg::DisplaySettings::CHECKERBOARD): 
    12931295            { 
    12941296            #if !defined(OSG_GLES1_AVAILABLE) && !defined(OSG_GLES2_AVAILABLE) && !defined(OSG_GL3_AVAILABLE) 
     
    13391341                    glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); 
    13401342                    glStencilFunc(GL_ALWAYS, 1, ~0u); 
    1341                     glPolygonStipple(patternVertEven); 
     1343                    if(_displaySettings->getStereoMode() == osg::DisplaySettings::VERTICAL_INTERLACE) 
     1344                    { 
     1345                        glPolygonStipple(patternVertEven); 
     1346                    } 
     1347                    else if(_displaySettings->getStereoMode() == osg::DisplaySettings::HORIZONTAL_INTERLACE) 
     1348                    { 
     1349                        glPolygonStipple(patternHorzEven); 
     1350                    } 
     1351                    else 
     1352                    { 
     1353                        glPolygonStipple(patternCheckerboard); 
     1354                    } 
    13421355                    getState()->applyMode(GL_POLYGON_STIPPLE,true); 
    13431356                    glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
     
    13691382                glDisable(GL_STENCIL_TEST); 
    13701383            #else 
    1371                 osg::notify(osg::NOTICE)<<"Warning: SceneView::draw() - VERTICAL_INTERLACE stereo not supported."<<std::endl; 
    1372             #endif 
    1373             } 
    1374             break; 
    1375         case(osg::DisplaySettings::HORIZONTAL_INTERLACE): 
    1376             { 
    1377             #if !defined(OSG_GLES1_AVAILABLE) && !defined(OSG_GLES2_AVAILABLE) && !defined(OSG_GL3_AVAILABLE) 
    1378                 if( 0 == ( _camera->getInheritanceMask() & DRAW_BUFFER) ) 
    1379                 { 
    1380                 _renderStageLeft->setDrawBuffer(_camera->getDrawBuffer()); 
    1381                 _renderStageLeft->setReadBuffer(_camera->getDrawBuffer()); 
    1382                 _renderStageRight->setDrawBuffer(_camera->getDrawBuffer()); 
    1383                 _renderStageRight->setReadBuffer(_camera->getDrawBuffer()); 
    1384                 } 
    1385                 _localStateSet->setAttribute(getViewport()); 
    1386  
    1387                 // ensure that all color planes are active. 
    1388                 osg::ColorMask* cmask = static_cast<osg::ColorMask*>(_localStateSet->getAttribute(osg::StateAttribute::COLORMASK)); 
    1389                 if (cmask) 
    1390                 { 
    1391                     cmask->setMask(true,true,true,true); 
    1392                 } 
    1393                 else 
    1394                 { 
    1395                     cmask = new osg::ColorMask(true,true,true,true); 
    1396                     _localStateSet->setAttribute(cmask); 
    1397                 } 
    1398                 _renderStageLeft->setColorMask(cmask); 
    1399                 _renderStageRight->setColorMask(cmask); 
    1400  
    1401                 _renderStageLeft->drawPreRenderStages(_renderInfo,previous); 
    1402                 _renderStageRight->drawPreRenderStages(_renderInfo,previous); 
    1403  
    1404                 glEnable(GL_STENCIL_TEST); 
    1405  
    1406                 if(_redrawInterlacedStereoStencilMask || 
    1407                    _interlacedStereoStencilWidth != getViewport()->width() || 
    1408                   _interlacedStereoStencilHeight != getViewport()->height() ) 
    1409                 { 
    1410                     glMatrixMode(GL_PROJECTION); 
    1411                     glLoadIdentity(); 
    1412                     glOrtho(getViewport()->x(), getViewport()->width(), getViewport()->y(), getViewport()->height(), -1.0, 1.0); 
    1413                     glMatrixMode(GL_MODELVIEW); 
    1414                     glLoadIdentity(); 
    1415                      
    1416                     getViewport()->apply(*state); 
    1417                     getState()->applyMode(GL_LIGHTING,false); 
    1418                     getState()->applyMode(GL_DEPTH_TEST,false); 
    1419                     glStencilMask(~0u); 
    1420                     glClear(GL_STENCIL_BUFFER_BIT); 
    1421                     glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); 
    1422                     glStencilFunc(GL_ALWAYS, 1, ~0u); 
    1423                     glPolygonStipple(patternHorzEven); 
    1424                     getState()->applyMode(GL_POLYGON_STIPPLE,true); 
    1425                     glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
    1426  
    1427                     glRecti(static_cast<GLint>(getViewport()->x()), 
    1428                             static_cast<GLint>(getViewport()->y()), 
    1429                             static_cast<GLint>(getViewport()->width()), 
    1430                             static_cast<GLint>(getViewport()->height()) ); 
    1431                              
    1432                     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
    1433                     getState()->applyMode(GL_POLYGON_STIPPLE,false); 
    1434                     getState()->applyMode(GL_LIGHTING,true); 
    1435                     getState()->applyMode(GL_DEPTH_TEST,true); 
    1436                      
    1437                     _redrawInterlacedStereoStencilMask = false; 
    1438                     _interlacedStereoStencilWidth = static_cast<int>(getViewport()->width()); 
    1439                     _interlacedStereoStencilHeight = static_cast<int>(getViewport()->height()); 
    1440                 } 
    1441  
    1442                 _renderStageLeft->setClearMask(_renderStageLeft->getClearMask() & ~(GL_STENCIL_BUFFER_BIT)); 
    1443                 _renderStageRight->setClearMask(_renderStageRight->getClearMask() & ~(GL_STENCIL_BUFFER_BIT|GL_COLOR_BUFFER_BIT)); 
    1444  
    1445                 glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 
    1446                 glStencilFunc(GL_EQUAL, 0, ~0u);     
    1447                 _renderStageLeft->draw(_renderInfo,previous); 
    1448                  
    1449                 glStencilFunc(GL_NOTEQUAL, 0, ~0u); 
    1450                 _renderStageRight->draw(_renderInfo,previous); 
    1451                 glDisable(GL_STENCIL_TEST); 
    1452             #else 
    1453                 osg::notify(osg::NOTICE)<<"Warning: SceneView::draw() - HORIZONTAL_INTERLACE stereo not supported."<<std::endl; 
    1454             #endif 
    1455             } 
    1456             break; 
    1457         case(osg::DisplaySettings::CHECKERBOARD): 
    1458             { 
    1459             #if !defined(OSG_GLES1_AVAILABLE) && !defined(OSG_GLES2_AVAILABLE) && !defined(OSG_GL3_AVAILABLE) 
    1460                 if( 0 == ( _camera->getInheritanceMask() & DRAW_BUFFER) ) 
    1461                 { 
    1462                 _renderStageLeft->setDrawBuffer(_camera->getDrawBuffer()); 
    1463                 _renderStageLeft->setReadBuffer(_camera->getDrawBuffer()); 
    1464                 _renderStageRight->setDrawBuffer(_camera->getDrawBuffer()); 
    1465                 _renderStageRight->setReadBuffer(_camera->getDrawBuffer()); 
    1466                 } 
    1467                 _localStateSet->setAttribute(getViewport()); 
    1468  
    1469                 // ensure that all color planes are active. 
    1470                 osg::ColorMask* cmask = static_cast<osg::ColorMask*>(_localStateSet->getAttribute(osg::StateAttribute::COLORMASK)); 
    1471                 if (cmask) 
    1472                 { 
    1473                     cmask->setMask(true,true,true,true); 
    1474                 } 
    1475                 else 
    1476                 { 
    1477                     cmask = new osg::ColorMask(true,true,true,true); 
    1478                     _localStateSet->setAttribute(cmask); 
    1479                 } 
    1480                 _renderStageLeft->setColorMask(cmask); 
    1481                 _renderStageRight->setColorMask(cmask); 
    1482  
    1483                 _renderStageLeft->drawPreRenderStages(_renderInfo,previous); 
    1484                 _renderStageRight->drawPreRenderStages(_renderInfo,previous); 
    1485  
    1486                 glEnable(GL_STENCIL_TEST); 
    1487  
    1488                 if(_redrawInterlacedStereoStencilMask || 
    1489                    _interlacedStereoStencilWidth != getViewport()->width() || 
    1490                   _interlacedStereoStencilHeight != getViewport()->height() ) 
    1491                 { 
    1492  
    1493                     glMatrixMode(GL_PROJECTION); 
    1494                     glLoadIdentity(); 
    1495                     glOrtho(getViewport()->x(), getViewport()->width(), getViewport()->y(), getViewport()->height(), -1.0, 1.0); 
    1496                     glMatrixMode(GL_MODELVIEW); 
    1497                     glLoadIdentity(); 
    1498                      
    1499                      
    1500                     getViewport()->apply(*state); 
    1501                     glDisable(GL_LIGHTING); 
    1502                     glDisable(GL_DEPTH_TEST); 
    1503                     glStencilMask(~0u); 
    1504                     glClear(GL_STENCIL_BUFFER_BIT); 
    1505                     glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); 
    1506                     glStencilFunc(GL_ALWAYS, 1, ~0u); 
    1507                     glPolygonStipple(patternCheckerboard); 
    1508                     glEnable(GL_POLYGON_STIPPLE); 
    1509                     glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
    1510  
    1511                     glRecti(static_cast<GLint>(getViewport()->x()), 
    1512                             static_cast<GLint>(getViewport()->y()), 
    1513                             static_cast<GLint>(getViewport()->width()), 
    1514                             static_cast<GLint>(getViewport()->height()) ); 
    1515                              
    1516                     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
    1517                     glDisable(GL_POLYGON_STIPPLE); 
    1518                     glEnable(GL_LIGHTING); 
    1519                     glEnable(GL_DEPTH_TEST); 
    1520                      
    1521                     _redrawInterlacedStereoStencilMask = false; 
    1522                     _interlacedStereoStencilWidth = static_cast<int>(getViewport()->width()); 
    1523                     _interlacedStereoStencilHeight = static_cast<int>(getViewport()->height()); 
    1524                 } 
    1525  
    1526                 _renderStageLeft->setClearMask(_renderStageLeft->getClearMask() & ~(GL_STENCIL_BUFFER_BIT)); 
    1527                 _renderStageRight->setClearMask(_renderStageRight->getClearMask() & ~(GL_STENCIL_BUFFER_BIT|GL_COLOR_BUFFER_BIT)); 
    1528  
    1529                 glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 
    1530                 glStencilFunc(GL_EQUAL, 0, ~0u);     
    1531                 _renderStageLeft->draw(_renderInfo,previous); 
    1532                  
    1533                 glStencilFunc(GL_NOTEQUAL, 0, ~0u); 
    1534                 _renderStageRight->draw(_renderInfo,previous); 
    1535                 glDisable(GL_STENCIL_TEST); 
    1536             #else 
    1537                 osg::notify(osg::NOTICE)<<"Warning: SceneView::draw() - CHECKERBOARD stereo not supported."<<std::endl; 
     1384                osg::notify(osg::NOTICE)<<"Warning: SceneView::draw() - VERTICAL_INTERLACE, HORIZONTAL_INTERLACE, and CHECKERBOARD stereo not supported."<<std::endl; 
    15381385            #endif 
    15391386            } 
     
    17601607        case(osg::DisplaySettings::VERTICAL_INTERLACE): 
    17611608        case(osg::DisplaySettings::HORIZONTAL_INTERLACE): 
     1609        case(osg::DisplaySettings::CHECKERBOARD): 
    17621610        { 
    17631611            bool resultLeft = _renderStageLeft->getStats(stats);