glutils.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:9k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: glutils.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:51:07  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: glutils.cpp,v 1000.1 2004/06/01 20:51:07 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *    OpenGL utility functions
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/opengl.h>
  41. #include <gui/opengl/glutils.hpp>
  42. #include <gui/opengl/glexception.hpp>
  43. BEGIN_NCBI_SCOPE
  44. // static accelerated state - default to 'not determined'
  45. CGlUtils::EAccelState CGlUtils::m_Accel = CGlUtils::eNotDetermined;
  46. //
  47. // access the accelerated flag
  48. // this defaults to autodetect, and is user-overridable
  49. //
  50. CGlUtils::EAccelState CGlUtils::GetAccelerated(void)
  51. {
  52.     if ( m_Accel != eNotDetermined ) {
  53.         return m_Accel;
  54.     }
  55.     const char* str = reinterpret_cast<const char*> (glGetString(GL_RENDERER));
  56.     if ( !str ) {
  57.         return eNotDetermined;
  58.     }
  59.     _TRACE("GL_VERSION = "    << glGetString(GL_VERSION));
  60.     _TRACE("GL_RENDERER = "   << glGetString(GL_RENDERER));
  61.     _TRACE("GL_EXTENSIONS = " << glGetString(GL_EXTENSIONS));
  62.     // Solaris software renderer returns:
  63.     // GL_RENDERER = Sun dpa software renderer, VIS
  64.     string s(str);
  65.     if (s.find("software renderer") != string::npos) {
  66.         LOG_POST(Info
  67.                  << "CGlUtils::GetAccelerated(): "
  68.                  "auto-detected non-hardware-accelerated platform");
  69.         m_Accel = eNotAccelerated;
  70.     } else {
  71.         LOG_POST(Info
  72.                  << "CGlUtils::GetAccelerated(): "
  73.                  "auto-detected hardware-accelerated platform");
  74.         m_Accel = eAccelerated;
  75.     }
  76.     return m_Accel;
  77. }
  78. //
  79. // check for and report OpenGL errors
  80. //
  81. void CGlUtils::CheckGlError(void)
  82. {
  83.     GLint error = glGetError();
  84.     if (error == GL_NO_ERROR) {
  85.         return;
  86.     }
  87.     static int mode = 0;
  88.     if ( !mode ) {
  89.         const char* value = getenv("NCBI_GBENCH_GLERROR");
  90.         if ( !value ) {
  91.             mode = 1;
  92.         } else {
  93.             if (strcmp(value, "ABORT") == 0) {
  94.                 mode = 2;
  95.             } else {
  96.                 mode = 3;
  97.             }
  98.         }
  99.     }
  100.     string msg;
  101.     switch ( error ) {
  102.     default:
  103.         msg = "CGlUtils::CheckGlError(): unknown error";
  104.         break;
  105.     case GL_INVALID_OPERATION:
  106.         msg = "CGlUtils::CheckGlError(): invalid operation";
  107.         break;
  108.     case GL_INVALID_ENUM:
  109.         msg = "CGlUtils::CheckGlError(): invalid enum";
  110.         break;
  111.     case GL_INVALID_VALUE:
  112.         msg = "CGlUtils::CheckGlError(): invalid value";
  113.         break;
  114.     case GL_STACK_OVERFLOW:
  115.         msg = "CGlUtils::CheckGlError(): stack overflow";
  116.         break;
  117.     case GL_STACK_UNDERFLOW:
  118.         msg = "CGlUtils::CheckGlError(): stack underflow";
  119.         break;
  120.     case GL_OUT_OF_MEMORY:
  121.         msg = "CGlUtils::CheckGlError(): out of memory";
  122.         break;
  123.     }
  124.     switch (mode) {
  125.     case 0:
  126.     default:
  127.         // shouldn't happen
  128.         LOG_POST(Error << msg);
  129.         break;
  130.     case 1:
  131.         // abort
  132.         LOG_POST(Error << msg);
  133.         Abort();
  134.         break;
  135.     case 2:
  136.         // throw
  137.         NCBI_THROW(COpenGLException, eGlError, msg);
  138.         break;
  139.     }
  140. }
  141. #ifdef _DEBUG
  142. //
  143. // dumpState()
  144. // this is a debugging function designed to show a bunch of OpenGL enables
  145. //
  146. void CGlUtils::DumpState(void)
  147. {
  148.     LOG_POST(Info << "OpenGL Vendor: " << glGetString(GL_VENDOR));
  149.     LOG_POST(Info << "OpenGL Renderer: " << glGetString(GL_RENDERER));
  150.     LOG_POST(Info << "OpenGL Version: " << glGetString(GL_VERSION));
  151.     LOG_POST(Info << "OpenGL Extensions: " << glGetString(GL_EXTENSIONS));
  152.     LOG_POST(Info << "n");
  153.     GLint viewport[4];
  154.     float modelview[16];
  155.     float projection[16];
  156.     float color[4];
  157.     glGetIntegerv(GL_VIEWPORT, viewport);
  158.     glGetFloatv(GL_MODELVIEW_MATRIX, modelview);
  159.     glGetFloatv(GL_PROJECTION_MATRIX, projection);
  160.     glGetFloatv(GL_CURRENT_COLOR, color);
  161.     GLint red_bits = 0;
  162.     GLint green_bits = 0;
  163.     GLint blue_bits = 0;
  164.     GLint alpha_bits = 0;
  165.     GLint depth_bits = 0;
  166.     GLint stencil_bits = 0;
  167.     glGetIntegerv(GL_RED_BITS,     &red_bits);
  168.     glGetIntegerv(GL_GREEN_BITS,   &green_bits);
  169.     glGetIntegerv(GL_BLUE_BITS,    &blue_bits);
  170.     glGetIntegerv(GL_ALPHA_BITS,   &alpha_bits);
  171.     glGetIntegerv(GL_DEPTH_BITS,   &depth_bits);
  172.     glGetIntegerv(GL_STENCIL_BITS, &stencil_bits);
  173.     LOG_POST(Info << "Buffers:");
  174.     LOG_POST(Info << "  Color:"
  175.              << " Red=" << red_bits << " bits"
  176.              << " Green=" << green_bits << " bits"
  177.              << " Blue=" << blue_bits << " bits"
  178.              << " Alpha=" << alpha_bits << " bits");
  179.     LOG_POST(Info << "  Depth: " << depth_bits << " bits");
  180.     LOG_POST(Info << "  Stencil: " << alpha_bits << " bits");
  181.     LOG_POST(Info << "Viewport: "
  182.         << viewport[0] << ", " << viewport[1] << ", "
  183.         << viewport[2] << ", " << viewport[3]);
  184.     int i;
  185.     int j;
  186.     LOG_POST(Info << "Projection matrix:");
  187.     for (i = 0;  i < 4;  ++i) {
  188.         string msg;
  189.         for (j = 0;  j < 4;  ++j) {
  190.             // remember, OpenGL matrices are transposed!
  191.             msg += NStr::DoubleToString(projection[j * 4+i]) + " ";
  192.         }
  193.         LOG_POST(Info << msg);
  194.     }
  195.     LOG_POST(Info << "Modelview matrix:");
  196.     for (i = 0;  i < 4;  ++i) {
  197.         string msg;
  198.         for (j = 0;  j < 4;  ++j) {
  199.             // remember, OpenGL matrices are transposed!
  200.             msg += NStr::DoubleToString(modelview[j * 4+i]) + " ";
  201.         }
  202.         LOG_POST(Info << msg);
  203.     }
  204.     LOG_POST(Info << "Current draw color: "
  205.         << color[0] << ", " << color[1] << ", "
  206.         << color[2] << ", " << color[3]);
  207.     LOG_POST(Info << "Lighting:      "
  208.              << (glIsEnabled(GL_LIGHTING)   ? "enabled" : "disabled"));
  209.     LOG_POST(Info << "Depth Testing: "
  210.              << (glIsEnabled(GL_DEPTH_TEST) ? "enabled" : "disabled"));
  211.     LOG_POST(Info << "Face Culling:  "
  212.              << (glIsEnabled(GL_CULL_FACE)  ? "enabled" : "disabled"));
  213.     LOG_POST(Info << "Blending:      "
  214.              << (glIsEnabled(GL_BLEND)      ? "enabled" : "disabled"));
  215.     LOG_POST(Info << "Alpha Testing: "
  216.              << (glIsEnabled(GL_ALPHA_TEST) ? "enabled" : "disabled"));
  217.     LOG_POST(Info << "2D Texture:    "
  218.              << (glIsEnabled(GL_TEXTURE_2D) ? "enabled" : "disabled"));
  219. }
  220. #endif
  221. END_NCBI_SCOPE
  222. /*
  223.  * ===========================================================================
  224.  * $Log: glutils.cpp,v $
  225.  * Revision 1000.1  2004/06/01 20:51:07  gouriano
  226.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  227.  *
  228.  * Revision 1.10  2004/05/21 22:27:45  gorelenk
  229.  * Added PCH ncbi_pch.hpp
  230.  *
  231.  * Revision 1.9  2003/10/23 16:20:41  dicuccio
  232.  * Changed CheckGlError() to respond to an environment variable and, potentially,
  233.  * either abort or throw an exception on error
  234.  *
  235.  * Revision 1.8  2003/06/09 19:25:25  dicuccio
  236.  * Changed dumping of GL strings to _TRACE.  Added dumping of buffer resolution
  237.  *
  238.  * Revision 1.7  2003/06/03 17:42:06  dicuccio
  239.  * Added texture support.  Added classes to handle OpenGL camera setup and
  240.  * viewport specification.
  241.  *
  242.  * Revision 1.6  2003/05/06 15:59:59  dicuccio
  243.  * Moved hardware check from CGlCanvas into CGlUtils
  244.  *
  245.  * Revision 1.5  2003/04/01 21:05:11  rsmith
  246.  * in CGlUtils::DumpState, change type of viewport from int to GLint for better
  247.  * compiler portability.
  248.  *
  249.  * Revision 1.4  2003/01/13 13:10:11  dicuccio
  250.  * Namespace clean-up.  Retired namespace gui -> converted all to namespace
  251.  * ncbi.  Moved all FLUID-generated code into namespace ncbi.
  252.  *
  253.  * Revision 1.3  2002/11/14 16:24:44  dicuccio
  254.  * Changed to include standard OpenGL headers through 'gui/opengl.h'
  255.  *
  256.  * Revision 1.2  2002/11/07 18:57:47  dicuccio
  257.  * Changed code to use LOG_POST() and _TRACE().
  258.  *
  259.  * Revision 1.1  2002/11/05 20:21:48  dicuccio
  260.  * Initial revision
  261.  *
  262.  * ===========================================================================
  263.  */