📄 visualchooser.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 <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 + -