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

📄 visualchooser.cpp

📁 最新osg包
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* -*-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 <stdio.h>#include <iostream>#include "VisualChooser.h"#include <osg/Referenced>using namespace std;using namespace osgProducer;VisualChooser::VisualChooser( void ){//     _visual_id = 0;//     _vinfo = 0L;    _strictAdherence = false;}VisualChooser::~VisualChooser(void){   clear();}#if 0void VisualChooser::setVisual( VisualInfo *vinfo ){    clear();    _vinfo = vinfo;}#endifvoid VisualChooser::resetVisualInfo(){#ifdef _WIN32_IMPLEMENTATION    if (_vinfo != NULL) delete _vinfo;#endif#ifdef _OSX_AGL_IMPLEMENTATION    if(_vinfo != NULL) free(_vinfo);#endif    //    _vinfo = 0L;}void VisualChooser::addAttribute( AttributeName attribute ){    resetVisualInfo();    _visual_attributes.push_back( VisualAttribute( attribute ) );}void VisualChooser::addAttribute( AttributeName attribute, int parameter ){    resetVisualInfo();    _visual_attributes.push_back( VisualAttribute( attribute, parameter ) );}void VisualChooser::addExtendedAttribute( unsigned int attribute ){    resetVisualInfo();    _visual_attributes.push_back( VisualAttribute( attribute ) );}void VisualChooser::addExtendedAttribute( unsigned int attribute, int parameter ){    resetVisualInfo();    _visual_attributes.push_back( VisualAttribute( attribute, parameter ) );}void VisualChooser::setBufferSize( unsigned int size ){    addAttribute( BufferSize, size );}void VisualChooser::setLevel( int level ){    addAttribute( Level, level );}void VisualChooser::useRGBA(){    addAttribute( RGBA );}void VisualChooser::useDoubleBuffer(){    addAttribute( DoubleBuffer );}void VisualChooser::useStereo(){    addAttribute( Stereo );}void VisualChooser::setAuxBuffers( unsigned int num ){    addAttribute( AuxBuffers, num );}void VisualChooser::setRedSize( unsigned int size ){    addAttribute( RedSize, size );}void VisualChooser::setGreenSize( unsigned int size ){    addAttribute( GreenSize, size );}void VisualChooser::setBlueSize( unsigned int size ){    addAttribute( BlueSize, size );}void VisualChooser::setAlphaSize( unsigned int size ){    addAttribute( AlphaSize, size );}void VisualChooser::setDepthSize( unsigned int size ){    addAttribute( DepthSize, size );}void VisualChooser::setStencilSize( unsigned int size ){    addAttribute( StencilSize, size );}void VisualChooser::setAccumRedSize( unsigned int size ){    addAttribute( AccumRedSize, size );}void VisualChooser::setAccumGreenSize( unsigned int size ){    addAttribute( AccumGreenSize, size );}void VisualChooser::setAccumBlueSize( unsigned int size ){    addAttribute( AccumBlueSize, size );}void VisualChooser::setAccumAlphaSize( unsigned int size ){    addAttribute( AccumAlphaSize, size );}void VisualChooser::setSamples( unsigned int size ){    addAttribute( Samples, size );}void VisualChooser::setSampleBuffers( unsigned int size ){    addAttribute( SampleBuffers, size );}void VisualChooser::setVisualID( unsigned int id ) {     _visual_id = id; }void VisualChooser::setSimpleConfiguration( bool doublebuffer ){    clear();    addAttribute( RGBA );    addAttribute( DepthSize, 16 );    if (doublebuffer)        addAttribute( DoubleBuffer );}void VisualChooser::clear() {    _visual_attributes.clear();    resetVisualInfo();    // Always use UseGL    addAttribute( UseGL );}#ifdef _OSX_AGL_IMPLEMENTATION#include <AGL/agl.h>void VisualChooser::applyAttribute(const VisualAttribute &va, std::vector<int> &attribs){    if(va.isExtension())    {      attribs.push_back(static_cast<int>(va.attribute()));    }    else    {      switch(va.attribute())      {        case UseGL:          attribs.push_back(AGL_COMPLIANT); break;        case BufferSize:     attribs.push_back(AGL_BUFFER_SIZE); break;        case Level:          attribs.push_back(AGL_LEVEL); break;        case RGBA:           attribs.push_back(AGL_RGBA); break;        case DoubleBuffer:   attribs.push_back(AGL_DOUBLEBUFFER); break;        case Stereo:         attribs.push_back(AGL_STEREO); break;        case AuxBuffers:     attribs.push_back(AGL_AUX_BUFFERS); break;        case RedSize:        attribs.push_back(AGL_RED_SIZE); break;        case GreenSize:      attribs.push_back(AGL_GREEN_SIZE); break;        case BlueSize:       attribs.push_back(AGL_BLUE_SIZE); break;        case AlphaSize:      attribs.push_back(AGL_ALPHA_SIZE); break;        case DepthSize:      attribs.push_back(AGL_DEPTH_SIZE); break;        case StencilSize:    attribs.push_back(AGL_STENCIL_SIZE); break;        case AccumRedSize:   attribs.push_back(AGL_ACCUM_RED_SIZE); break;        case AccumGreenSize: attribs.push_back(AGL_ACCUM_GREEN_SIZE); break;        case AccumBlueSize:  attribs.push_back(AGL_ACCUM_BLUE_SIZE); break;        case AccumAlphaSize: attribs.push_back(AGL_ACCUM_ALPHA_SIZE); break;#if defined (AGL_SAMPLE_BUFFERS_ARB) && defined (AGL_SAMPLES_ARB)        case SampleBuffers:  attribs.push_back(AGL_SAMPLE_BUFFERS_ARB); break;        case Samples:        attribs.push_back(AGL_SAMPLES_ARB); break;#endif        default: attribs.push_back((int)va.attribute()); break;      }    }    if (va.hasParameter())    {      attribs.push_back(va.parameter());    }}VisualInfo *VisualChooser::choose( Display *dpy, int screen, bool strict_adherence){    if(_vinfo != NULL)    {      // If VisualInfo exists, then we may be able to reuse it      GLint val;      if((*_vinfo) && (aglDescribePixelFormat(*_vinfo, AGL_NO_RECOVERY, &val))) return _vinfo;    }    else     {      // Use malloc() since new() causes a bus error      _vinfo = (VisualInfo*)malloc(sizeof(VisualInfo*));    }    // Set up basic attributes if needed    if( _visual_attributes.size() == 0 ) setSimpleConfiguration();    bool fullscreen = (screen == 1); // Whether to fullscreen or not    std::vector<int> va; // Visual attributes    va.push_back(AGL_NO_RECOVERY);    if(fullscreen) va.push_back(AGL_FULLSCREEN);    vector<VisualAttribute>::const_iterator p;    for( p = _visual_attributes.begin(); p != _visual_attributes.end(); p++ )    {      applyAttribute(*p, va);    }    va.push_back(AGL_NONE); // Must be last element    // Copy to GLint vector, since this is what the agl functions require    std::vector<GLint> glva;    std::vector<int>::iterator i;    for(i = va.begin(); i != va.end(); i++)    {      glva.push_back(*i);    }    if(fullscreen)    {      GDHandle gdhDisplay;      DMGetGDeviceByDisplayID((DisplayIDType)*dpy, &gdhDisplay, false);      *_vinfo = aglChoosePixelFormat(&gdhDisplay, 1, &(glva.front()));    }    else    {      *_vinfo = aglChoosePixelFormat(NULL, 0, &(glva.front()));    }    if(*_vinfo == NULL)    {      std::cerr<< "aglChoosePixelFormat failed: " << aglGetError() << std::endl;      for(i=va.begin(); i!=va.end(); ++i)       {        std::cerr << (*i) << ", ";      }      std::cerr << std::endl;    }    return _vinfo;}#endif#ifdef _OSX_CGL_IMPLEMENTATIONvoid VisualChooser::applyAttribute(const VisualAttribute &va, std::vector<int> &attribs){    if(va.isExtension())    {      attribs.push_back(static_cast<int>(va.attribute()));    }    else    {      switch(va.attribute())      {        case UseGL:          attribs.push_back(kCGLPFACompliant); break;        case BufferSize:     attribs.push_back(kCGLPFAColorSize); break;        //case Level:          attribs.push_back(GLX_LEVEL); break;        //case RGBA:           attribs.push_back(GLX_RGBA); break;        case DoubleBuffer:   attribs.push_back(kCGLPFADoubleBuffer); break;        case Stereo:         attribs.push_back(kCGLPFAStereo); break;        case AuxBuffers:     attribs.push_back(kCGLPFAAuxBuffers); break;        case RedSize:        attribs.push_back(kCGLPFAColorSize); break;        case GreenSize:      attribs.push_back(kCGLPFAColorSize); break;        case BlueSize:       attribs.push_back(kCGLPFAColorSize); break;        case AlphaSize:      attribs.push_back(kCGLPFAAlphaSize); break;        case DepthSize:      attribs.push_back(kCGLPFADepthSize); break;        case StencilSize:    attribs.push_back(kCGLPFAStencilSize); break;        case AccumRedSize:   attribs.push_back(kCGLPFAAccumSize); break;        case AccumGreenSize: attribs.push_back(kCGLPFAAccumSize); break;        case AccumBlueSize:  attribs.push_back(kCGLPFAAccumSize); break;        case AccumAlphaSize: attribs.push_back(kCGLPFAAccumSize); break;        case SampleBuffers:  attribs.push_back(kCGLPFASampleBuffers); break;        case Samples:        attribs.push_back(kCGLPFASamples); break;        default: attribs.push_back(va.attribute()); break;      }    }    if (va.hasParameter())    {      attribs.push_back(va.parameter());    }}VisualInfo *VisualChooser::choose( Display *dpy, int screen, bool strict_adherence){    if(_vinfo != NULL)    {      // If VisualInfo exists, then we may be able to reuse it      GLint val;      if(!CGLDescribePixelFormat(*_vinfo, 0L, kCGLPFANoRecovery, &val))         return _vinfo;    }    // Set up basic attributes if needed    if( _visual_attributes.size() == 0 ) setSimpleConfiguration();    u_int32_t display_id = CGDisplayIDToOpenGLDisplayMask(*dpy);    std::vector<int> va; // Visual attributes    va.push_back(kCGLPFADisplayMask);    va.push_back((CGLPixelFormatAttribute)display_id);    va.push_back(kCGLPFANoRecovery);    va.push_back( kCGLPFAAccelerated );    va.push_back( kCGLPFAFullScreen );    vector<VisualAttribute>::const_iterator p;    for( p = _visual_attributes.begin(); p != _visual_attributes.end(); p++ )    {      applyAttribute(*p, va);    }    va.push_back(CGLPixelFormatAttribute(0)); // Must be last element    long nvirt;    CGLPixelFormatAttribute *array = new CGLPixelFormatAttribute[va.size()];    memcpy(array, &(va.front()), va.size()*sizeof(CGLPixelFormatAttribute));    CGLError err = CGLChoosePixelFormat(array, _vinfo, &nvirt);    if(err)    {      std::cerr<< "CGLChoosePixelFormat failed: " << CGLErrorString(err) << std::endl;

⌨️ 快捷键说明

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