Show
Ignore:
Timestamp:
04/21/10 19:16:13 (4 years ago)
Author:
robert
Message:

From Ulrich Hertlien with little bits from Robert Osfield and Chris Hanson, added provisionl support for controlling sync to vblank.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osgViewer/GraphicsWindowCarbon.cpp

    r11263 r11357  
    346346bool GraphicsWindowCarbon::realizeImplementation() 
    347347{ 
    348      
    349348    if (!_initialized) init(); 
    350349    if (!_initialized) return false; 
    351350    if (!_traits) return false; 
    352      
    353     OSG_NOTIFY(osg::INFO) << "GraphicsWindowCarbon:: realizeIMplementation" << std::endl; 
     351  
     352    osg::notify(osg::INFO) << "GraphicsWindowCarbon::realizeImplementation" << std::endl; 
    354353     
    355354    setWindowDecoration(_traits->windowDecoration); 
     
    358357    // move the window to the right screen 
    359358    DarwinWindowingSystemInterface* wsi = dynamic_cast<DarwinWindowingSystemInterface*>(osg::GraphicsContext::getWindowingSystemInterface()); 
    360     int screenLeft(0), screenTop(0); 
     359    int screenLeft = 0, screenTop = 0; 
    361360    if (wsi)  
    362361    { 
     
    378377 
    379378        if (err) { 
    380             OSG_NOTIFY(osg::WARN) << "GraphicsWindowCarbon::realizeImplementation() failed creating a window: " << err << std::endl; 
     379            OSG_NOTIFY(osg::WARN) << "GraphicsWindowCarbon::realizeImplementation: failed to create window: " << err << std::endl; 
    381380            return false; 
    382381        } else { 
    383             OSG_NOTIFY(osg::INFO) << "GraphicsWindowCarbon::realizeImplementation() - window created with bounds(" << bounds.top << ", " << bounds.left << ", " << bounds.bottom << ", " << bounds.right << ")" << std::endl; 
     382            OSG_NOTIFY(osg::INFO) << "GraphicsWindowCarbon::realizeImplementation: window created with bounds(" << bounds.top << ", " << bounds.left << ", " << bounds.bottom << ", " << bounds.right << ")" << std::endl; 
    384383        } 
    385384    } 
     
    408407 
    409408    _context = aglCreateContext (_pixelFormat, sharedContextCarbon); 
    410  
    411  
    412409    if (!_context) { 
    413         OSG_NOTIFY(osg::WARN) << "GraphicsWindowCarbon::realizeImplementation failed creating a context: " << aglGetError() << std::endl; 
     410        OSG_NOTIFY(osg::WARN) << "GraphicsWindowCarbon::realizeImplementation: failed to create context: " << aglGetError() << std::endl; 
    414411        return false; 
    415412    } 
     
    442439        if (cgerr != kCGLNoError ) 
    443440        { 
    444             OSG_NOTIFY(osg::INFO) << "GraphicsWindowCarbon:: Multi-threaded OpenGL Execution not available" << std::endl; 
     441            OSG_NOTIFY(osg::INFO) << "GraphicsWindowCarbon::realizeImplementation: multi-threaded OpenGL Execution not available" << std::endl; 
    445442        }  
    446443    } 
    447      
     444 
    448445    InitCursor(); 
    449      
    450     //enable vsync 
     446 
     447    // enable vsync 
    451448    if (_traits->vsync) { 
    452449        GLint swap = 1; 
    453450        aglSetInteger (_context, AGL_SWAP_INTERVAL, &swap); 
    454451    } 
     452    _currentVSync = _traits->vsync; 
    455453 
    456454    _realized = true; 
     
    486484    _valid = false; 
    487485    _realized = false; 
    488      
     486 
    489487    // there's a possibility that the MenubarController is destructed already, so prevent a crash: 
    490488    MenubarController* mbc = MenubarController::instance(); 
     
    496494        _pixelFormat = NULL; 
    497495    } 
    498      
     496  
    499497    if (_context)  
    500498    { 
     
    504502        _context = NULL; 
    505503    } 
    506      
     504  
    507505    if (_ownsWindow && _window) DisposeWindow(_window); 
    508506    _window = NULL; 
     
    513511void GraphicsWindowCarbon::swapBuffersImplementation() 
    514512{ 
     513    // check for vsync change 
     514    if (_traits.valid() && _traits->vsync != _currentVSync) 
     515    { 
     516        const bool on = _traits->vsync; 
     517        GLint swap = (on ? 1 : 0); 
     518        aglSetInteger (_context, AGL_SWAP_INTERVAL, &swap); 
     519        osg::notify(osg::NOTICE) << "GraphicsWindowCarbon: VSync=" << (on ? "on" : "off") << std::endl; 
     520        _currentVSync = on; 
     521    } 
     522 
    515523    aglSwapBuffers(_context); 
    516524} 
     
    567575        else if (mouseButton==2) mouseButton = 3; 
    568576         
    569         // check tablet pointer device and map it to a musebutton 
     577        // check tablet pointer device and map it to a mouse button 
    570578        TabletProximityRec    theTabletRecord;    // The Tablet Proximity Record 
    571579        // Extract the Tablet Proximity reccord from the event. 
     
    586594                    break; 
    587595                     
    588                 case 3: //eraser 
     596                case 3: // eraser 
    589597                    pointerType = osgGA::GUIEventAdapter::ERASER; 
    590598                    break; 
     
    616624            case kEventMouseDown: 
    617625                { 
    618                     float mx =wheresMyMouse.h; 
    619                     float my =wheresMyMouse.v; 
     626                    float mx = wheresMyMouse.h; 
     627                    float my = wheresMyMouse.v; 
    620628                    transformMouseXY(mx, my); 
    621629                     
     
    642650            case kEventMouseUp: 
    643651                { 
    644                     float mx =wheresMyMouse.h; 
    645                     float my =wheresMyMouse.v; 
     652                    float mx = wheresMyMouse.h; 
     653                    float my = wheresMyMouse.v; 
    646654                    transformMouseXY(mx, my); 
    647655                    if (lastEmulatedMouseButton > 0) { 
     
    663671                     
    664672                        getEventQueue()->penPressure(theTabletRecord.pressure / 65535.0f); 
    665              
    666673                    } 
    667674                     
    668                     float mx =wheresMyMouse.h; 
    669                     float my =wheresMyMouse.v; 
     675                    float mx = wheresMyMouse.h; 
     676                    float my = wheresMyMouse.v; 
    670677                    transformMouseXY(mx, my); 
    671678                    getEventQueue()->mouseMotion(mx, my); 
     
    706713                { 
    707714                    enum 
    708                         { 
     715                    { 
    709716                        kEventParamMouseWheelSmoothVerticalDelta       = 'saxy', // typeSInt32 
    710717                        kEventParamMouseWheelSmoothHorizontalDelta     = 'saxx' // typeSInt32 
    711                         }; 
     718                    }; 
    712719                     
    713720                    SInt32 scroll_delta_x = 0; 
     
    716723                    err = GetEventParameter( theEvent, kEventParamMouseWheelSmoothVerticalDelta, typeLongInteger, NULL, sizeof(scroll_delta_y), NULL, &scroll_delta_y ); 
    717724                    err = GetEventParameter( theEvent, kEventParamMouseWheelSmoothHorizontalDelta, typeLongInteger, NULL, sizeof(scroll_delta_x), NULL, &scroll_delta_x ); 
    718                      
     725 
    719726                    if ((scroll_delta_x != 0) || (scroll_delta_y != 0)) { 
    720727                        getEventQueue()->mouseScroll2D( scroll_delta_x, scroll_delta_y); 
     
    722729                } 
    723730                break; 
    724              
     731  
    725732            default: 
    726733                return false; 
     
    760767        case kEventRawKeyRepeat: 
    761768        { 
     769            //osg::notify(osg::INFO) << "GraphicsWindowCarbon::keyPress Up" << std::endl; 
    762770            //getEventQueue()->getCurrentEventState()->setModKeyMask(modifierMask); 
    763             OSG_NOTIFY(osg::INFO) << "GraphicsWindowCarbon::keyPress" << std::endl; 
     771            //OSG_NOTIFY(osg::INFO) << "GraphicsWindowCarbon::keyPress" << std::endl; 
    764772            getEventQueue()->keyPress(keychar); 
    765773            break; 
     
    768776        case kEventRawKeyUp: 
    769777        {                  
    770             OSG_NOTIFY(osg::INFO) << "GraphicsWindowCarbon::keyPress" << std::endl; 
     778            //OSG_NOTIFY(osg::INFO) << "GraphicsWindowCarbon::keyPress" << std::endl; 
    771779            //getEventQueue()->getCurrentEventState()->setModKeyMask(modifierMask); 
    772780            getEventQueue()->keyRelease(keychar); 
     
    941949{ 
    942950   // TODO: implement 
    943    OSG_NOTIFY(osg::ALWAYS) << "GraphicsWindowCarbon::grabFocusIfPointerInWindow" << std::endl; 
     951   OSG_NOTIFY(osg::ALWAYS) << "GraphicsWindowCarbon::grabFocusIfPointerInWindow: not implemented" << std::endl; 
    944952} 
    945953 
     
    947955void GraphicsWindowCarbon::useCursor(bool cursorOn) 
    948956{ 
    949  
    950957    if (_traits.valid()) 
    951958        _traits->useCursor = cursorOn; 
    952959    DarwinWindowingSystemInterface* wsi = dynamic_cast<DarwinWindowingSystemInterface*>(osg::GraphicsContext::getWindowingSystemInterface()); 
    953960    if (wsi == NULL) { 
    954         OSG_NOTIFY(osg::WARN) << "GraphicsWindowCarbon::useCursor :: could not get OSXCarbonWindowingSystemInterface" << std::endl; 
     961        OSG_NOTIFY(osg::WARN) << "GraphicsWindowCarbon::useCursor: could not get OSXCarbonWindowingSystemInterface" << std::endl; 
    955962        return; 
    956963    } 
    957964     
    958965    CGDirectDisplayID displayId = wsi->getDisplayID((*_traits)); 
    959     CGDisplayErr err = kCGErrorSuccess; 
    960     switch (cursorOn) 
    961     { 
    962         case true: 
    963             err = CGDisplayShowCursor(displayId); 
    964             break; 
    965         case false: 
    966             err = CGDisplayHideCursor(displayId); 
    967             break; 
    968     } 
     966    CGDisplayErr err = (cursorOn ? CGDisplayShowCursor(displayId) : CGDisplayHideCursor(displayId)); 
    969967    if (err != kCGErrorSuccess) { 
    970         OSG_NOTIFY(osg::WARN) << "GraphicsWindowCarbon::useCursor failed with " << err << std::endl; 
     968        OSG_NOTIFY(osg::WARN) << "GraphicsWindowCarbon::useCursor: failed with " << err << std::endl; 
    971969    } 
    972970} 
     
    976974void GraphicsWindowCarbon::setCursor(MouseCursor mouseCursor) 
    977975{ 
    978     UInt32 cursor; 
    979976    if (_currentCursor == mouseCursor) 
    980977      return; 
     978 
     979    UInt32 cursor; 
    981980    switch (mouseCursor)  
    982981    { 
     
    10101009} 
    10111010 
     1011void GraphicsWindowCarbon::setSyncToVBlank(bool on) 
     1012{ 
     1013    if (_traits.valid()) { 
     1014        _traits->vsync = on; 
     1015    } 
     1016} 
    10121017 
    10131018void GraphicsWindowCarbon::setWindowName (const std::string& name)  
     
    10271032    DarwinWindowingSystemInterface* wsi = dynamic_cast<DarwinWindowingSystemInterface*>(osg::GraphicsContext::getWindowingSystemInterface()); 
    10281033    if (wsi == NULL) { 
    1029         OSG_NOTIFY(osg::WARN) << "GraphicsWindowCarbon::useCursor :: could not get OSXCarbonWindowingSystemInterface" << std::endl; 
     1034        OSG_NOTIFY(osg::WARN) << "GraphicsWindowCarbon::useCursor: could not get OSXCarbonWindowingSystemInterface" << std::endl; 
    10301035        return; 
    10311036    }