⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rendersurface.cpp

📁 最新osg包
💻 CPP
字号:
/* -*-c++-*- Producer - Copyright (C) 2001-2004  Don Burns * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version.  The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * OpenSceneGraph Public License for more details. */#include "RenderSurface.h"using namespace std;using namespace osgProducer;const std::string RenderSurface::defaultWindowName = std::string(" *** Producer::RenderSurface *** ");const unsigned int RenderSurface::UnknownDimension = 0xFFFFFFFF;const unsigned int RenderSurface::UnknownAmount = 0xFFFFFFFF;unsigned int RenderSurface::_numScreens = RenderSurface::UnknownAmount;bool RenderSurface::_shareAllGLContexts = false;//GLContext RenderSurface::_globallySharedGLContext  = 0L;void RenderSurface::shareAllGLContexts(bool flag){    _shareAllGLContexts = flag;}bool RenderSurface::allGLContextsAreShared(){    return _shareAllGLContexts;}const std::string &RenderSurface::getDefaultWindowName() {     return defaultWindowName; }RenderSurface::RenderSurface( void ){    _drawableType    = DrawableType_Window;    _hostname        = "";    _displayNum     = 0;//     _screen          = 0;    _mayFullScreen   = true;    _isFullScreen    = true;    // This used to be #ifdefed for the X11 implementation    // but the code is pure C++ and should compile anywhere    // The _dislayNum variable is used by CGL as well.#if 0    char *envptr = getenv( "DISPLAY" );    if( envptr != NULL && *envptr != 0 )    {        size_t p0 = 0;        size_t p1 = string(envptr).find(":", p0);        _hostname = string(envptr).substr(p0,p1);        p0 = p1+1;        p1 = string(envptr).find(".", p0);        if( p1 > 0 )        {            _displayNum = atoi((string(envptr).substr(p0,p1)).c_str());            p0 = p1+1;            p1 = string(envptr).length() - p0;            if( p1 > 0 )                _screen = atoi((string(envptr).substr(p0,p1)).c_str());        }        else if( p1 < string(envptr).length() )        {            p1 = string(envptr).length();            _displayNum = atoi((string(envptr).substr(p0,p1)).c_str());            _screen = 0;        }    }#endif    _windowLeft     = 0;    _windowRight    = 1;    _windowBottom   = 0;    _windowTop      = 1;     _windowX        = 0;    _windowY        = 0;    _windowWidth    = UnknownDimension;    _windowHeight   = UnknownDimension;    _screenWidth    = UnknownDimension;    _screenHeight   = UnknownDimension;    _customFullScreenOriginX = 0;    _customFullScreenOriginY = 0;    _customFullScreenWidth   = UnknownDimension;    _customFullScreenHeight  = UnknownDimension;    _useCustomFullScreen     = false;#if 0    _dpy             = NULL;    _win             = 0;    _parent          = 0;    _readDrawableRenderSurface = 0L;    _visualInfo     = NULL;    _visualID       = 0;    _currentCursor   = 0;    _nullCursor      = 0;    _defaultCursor   = 0;    _windowName      = defaultWindowName;    _realized        = false;    _useConfigEventThread = true;    _threadReady = new OpenThreads::Barrier(2);    _overrideRedirectFlag = false;    char *override_envptr = getenv( "PRODUCER_OVERRIDE_REDIRECT" );    if( override_envptr != NULL && *override_envptr != 0 )    {        if (strcmp(override_envptr,"true")==0 || strcmp(override_envptr,"True")==0 || strcmp(override_envptr,"TRUE")==0)        {            _overrideRedirectFlag = true;        }        else        {            _overrideRedirectFlag = false;        }    }#endif    _decorations     = true;    _useCursorFlag   = true;    _useDefaultEsc = true;    _checkOwnEvents = true;    _inputRectangle.set( -1.0,  1.0, -1.0, 1.0 );    _bindInputRectangleToWindowSize = false;        _rtt_mode   = RenderToTextureMode_None;    //_rtt_mode   = RenderToRGBTexture;    _rtt_target = Texture2D;    _rtt_options = RenderToTextureOptions_Default;    _rtt_mipmap = 0;    _rtt_face = PositiveX;    _rtt_dirty_mipmap = true;    _rtt_dirty_face = true;    #ifdef _WIN32_IMPLEMENTATION    _ownWindow = true;    _ownVisualChooser = true;    _ownVisualInfo = true;    _hinstance = NULL;    _glcontext = NULL;    _mx = 0;    _my = 0;    _mbutton = 0;#endif}RenderSurface::~RenderSurface( void ){#if 0     cancel();    _fini();    while (isRunning())    {        //std::cout << "waiting for RenderSurface to cancel"<<std::endl;        OpenThreads::Thread::YieldCurrentThread();    }    delete _threadReady;#endif}void RenderSurface::setDrawableType( RenderSurface::DrawableType drawableType ){    if( _realized )    {        std::cerr << "Warning: RenderSurface::setDrawableType() "                     "has no effect after RenderSurface has been realized\n";        return;    }    _drawableType = drawableType;}RenderSurface::DrawableType RenderSurface::getDrawableType(){    return _drawableType;}void RenderSurface::setReadDrawable( osgProducer::RenderSurface *rs ){    _readDrawableRenderSurface = rs;#if 0    if( _realized )        makeCurrent();#endif}#if 0void RenderSurface::setParentWindow( Window parent ){     _parent = parent;}Producer::Window RenderSurface::getParentWindow( void ) const{    return _parent;}#endifvoid RenderSurface::setWindowName( const std::string &name ){  //    _setWindowName( name );    _windowName = name;}const std::string &RenderSurface::getWindowName( void ) const{    return _windowName;}void RenderSurface::setHostName( const std::string &name ){    _hostname = name;}const std::string &RenderSurface::getHostName( void ) const{    return _hostname;}#if 0void RenderSurface::setDisplay( Display *dpy ){    _dpy = dpy;}Producer::Display *RenderSurface::getDisplay(){#ifdef WIN32    return &_hdc;#else    return _dpy;#endif}const Producer::Display *RenderSurface::getDisplay() const{#ifdef WIN32    return &_hdc;#else    return _dpy;#endif}#endifvoid RenderSurface::setDisplayNum( int num ){    _displayNum = num;}int  RenderSurface::getDisplayNum( void ) const{    return _displayNum;}void RenderSurface::setScreenNum( int num ){    _screen = num;}int  RenderSurface::getScreenNum( void ) const{    return _screen;}void RenderSurface::setWindowRectangle( int x, int y, unsigned int width, unsigned int height, bool resize){    if( _useCustomFullScreen )    {        _windowX = x + _customFullScreenOriginX;        _windowY = y + _customFullScreenOriginY;    }    else    {        _windowX = x;        _windowY = y;    }    _windowWidth = width;    _windowHeight = height;#ifdef _OSX_AGL_IMPLEMENTATION    fullScreen(false);                  // STH: this may break other implementations, but it is necessary for OSX#else    _isFullScreen    = false;#endif#if 0    if( _realized && resize )        _resizeWindow();    else#endif        if( _bindInputRectangleToWindowSize == true )            _inputRectangle.set( 0.0, _windowWidth, 0.0, _windowHeight );}void RenderSurface::getWindowRectangle( int &x, int &y, unsigned int &width, unsigned int &height ) const{    if( _isFullScreen )    {        x = 0;        y = 0;        if( _useCustomFullScreen == true )        {            width  = _customFullScreenWidth;            height = _customFullScreenHeight;        }        else        {            width = _screenWidth;            height = _screenHeight;        }    }    else    {        x      = _windowX;        y      = _windowY;        width  = _windowWidth;        height = _windowHeight;    }}void RenderSurface::useDefaultFullScreenRectangle(){    _useCustomFullScreen = false;}void RenderSurface::setCustomFullScreenRectangle( int x, int y, unsigned int width, unsigned int height ){    _customFullScreenOriginX = x;    _customFullScreenOriginY = y;    _customFullScreenWidth   = width;    _customFullScreenHeight  = height;    _useCustomFullScreen     = true;    _windowX += _customFullScreenOriginX;    _windowY += _customFullScreenOriginY;}int RenderSurface::getWindowOriginX() const{    if( _isFullScreen )     {        if( _useCustomFullScreen == true )            return _customFullScreenOriginX;        else            return 0;    }    return _windowX;}int RenderSurface::getWindowOriginY() const{    if( _isFullScreen )     {        if( _useCustomFullScreen == true )            return _customFullScreenOriginY;        else            return 0;    }    return _windowY;}unsigned int RenderSurface::getWindowWidth() const{    if( _isFullScreen )     {        if( _useCustomFullScreen == true )            return _customFullScreenWidth;        else            return _screenWidth;    }    return _windowWidth;}unsigned int RenderSurface::getWindowHeight() const{    if( _isFullScreen )     {        if( _useCustomFullScreen == true )            return _customFullScreenHeight;        else            return _screenHeight;    }    return _windowHeight;}void RenderSurface::setInputRectangle( const InputRectangle &inputRectangle ){    _inputRectangle = inputRectangle;}const RenderSurface::InputRectangle &RenderSurface::getInputRectangle() const{    return _inputRectangle;}void RenderSurface::bindInputRectangleToWindowSize( bool flag){    _bindInputRectangleToWindowSize = flag;    if( _bindInputRectangleToWindowSize == true )        _inputRectangle.set( 0.0, float(_windowWidth), 0.0, float(_windowHeight) );    else        _inputRectangle.set( -1.0,  1.0, -1.0, 1.0 );}void RenderSurface::useBorder( bool flag ){    _decorations = flag;#if 0    if( _realized )          _setBorder(_decorations);#endif}bool RenderSurface::usesBorder(){    return _decorations;}#if 0void RenderSurface::useCursor( bool flag ){     _useCursor(flag);}void RenderSurface::setCursor( Cursor cursor ){    _setCursor(cursor);}void RenderSurface::setCursorToDefault(){    _setCursorToDefault();}void RenderSurface::setWindow( const Window win ){    if( _realized )    {        std::cerr << "RenderSurface::setWindow() - cannot set window after RenderSurface has been realized\n";        return;    }    _win = win;#ifdef WIN32    _ownWindow = false;#endif}Producer::Window RenderSurface::getWindow( void ) const{    return _win;}GLContext RenderSurface::getGLContext( void) const{    return _glcontext;}void RenderSurface::setGLContext( GLContext glContext ){    if( _realized )    {        std::cerr << "RenderSurface::setGLContext() - Warning: Must be set before realize()." << std::endl;        return;    }    _glcontext = glContext;}bool RenderSurface::isRealized() const{    return _realized;}void RenderSurface::setVisualInfo( VisualInfo *vi ){    if( _realized )    {        std::cerr << "RenderSurface::setVisualInfo():Warning - has no effect after RenderSurface has been realized\n";        return;    }    _visualInfo = vi;#ifdef _WIN32_IMPLEMENTATION    _ownVisualInfo = false;#endif}VisualInfo *RenderSurface::getVisualInfo( void  ){    return _visualInfo;}const VisualInfo *RenderSurface::getVisualInfo( void  ) const{    return _visualInfo;}#endifvoid RenderSurface::setVisualChooser( VisualChooser *vc ){    if( _realized )    {        std::cerr << "RenderSurface::setVisualChooser():Warning - has no effect after RenderSurface has been realized\n";        return;    }    _visualChooser = vc;#ifdef _WIN32_IMPLEMENTATION    _ownVisualChooser = false;#endif}VisualChooser *RenderSurface::getVisualChooser( void ){    return _visualChooser.get();}const VisualChooser *RenderSurface::getVisualChooser( void ) const{    return _visualChooser.get();}#if 0void RenderSurface::getScreenSize( unsigned int &width, unsigned int &height )  const{    if( _realized )    {        if( _useCustomFullScreen == true )        {            width  = _customFullScreenWidth;            height = _customFullScreenHeight;        }        else        {            width  = _screenWidth;            height = _screenHeight;        }    }    else    {        _computeScreenSize(width, height);    }}#endif#if 0void  RenderSurface::useConfigEventThread( bool flag ){    if( _realized )    {        // This message is annoying.  Cameras that share a render surface will call this after the        // render surface has been realized, which is valid.        //std::cerr << "RenderSurface::useConfigEventThread():Warning - has no effect after RenderSurface has been realized\n";        return;    }    _useConfigEventThread = flag;}unsigned int RenderSurface::getRefreshRate() const{    if( !_realized ) return 0;    return _refreshRate; }void RenderSurface::addRealizeCallback( Callback *realizeCB ){    if( _realized )     {        std::cerr << "RenderSurface::addRealizeCallback() : Warning.  RenderSurface is already realized.  ignored.\n";            return;    }    _realizeCallbacks.push_back( realizeCB );}bool RenderSurface::waitForRealize(){    if( _realized ) return true;    while( _realized == false )        _realizeBlock->block();    return true;}void RenderSurface::positionPointer( int x, int y ){    _positionPointer(x,y);}void RenderSurface::initThreads(){    _initThreads();}#endifRenderSurface::RenderToTextureMode RenderSurface::getRenderToTextureMode() const{    return _rtt_mode;}void RenderSurface::setRenderToTextureMode(RenderToTextureMode mode){    _rtt_mode = mode;}RenderSurface::RenderToTextureTarget RenderSurface::getRenderToTextureTarget() const{    return _rtt_target;}void RenderSurface::setRenderToTextureTarget(RenderToTextureTarget target){    _rtt_target = target;}RenderSurface::RenderToTextureOptions RenderSurface::getRenderToTextureOptions() const{    return _rtt_options;}void RenderSurface::setRenderToTextureOptions(RenderToTextureOptions options){    _rtt_options = options;}int RenderSurface::getRenderToTextureMipMapLevel() const{    return _rtt_mipmap;}void RenderSurface::setRenderToTextureMipMapLevel(int level){    _rtt_mipmap = level;    _rtt_dirty_mipmap = true;}RenderSurface::CubeMapFace RenderSurface::getRenderToTextureFace() const{    return _rtt_face;}void RenderSurface::setRenderToTextureFace(CubeMapFace face){    _rtt_face = face;    _rtt_dirty_face = true;}const std::vector<int> &RenderSurface::getPBufferUserAttributes() const{    return _user_pbattr;}std::vector<int> &RenderSurface::getPBufferUserAttributes(){    return _user_pbattr;}void RenderSurface::useOverrideRedirect(bool flag){    _overrideRedirectFlag = flag;}bool RenderSurface::usesOverrideRedirect(){    return _overrideRedirectFlag;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -