| 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; |