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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: opengl_print_buffer.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:51:54  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: opengl_print_buffer.cpp,v 1000.1 2004/06/01 20:51:54 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:  Peter Meric
  35.  *
  36.  * File Description:
  37.  *   COpenGLPrintBuffer - GL feedback buffer
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <gui/opengl/opengl_print_buffer.hpp>
  42. #include <gui/opengl/glfont.hpp>
  43. #include <gui/print/vector_object.hpp>
  44. BEGIN_NCBI_SCOPE
  45. COpenGLPrintBuffer::COpenGLPrintBuffer()
  46. {
  47. }
  48. COpenGLPrintBuffer::~COpenGLPrintBuffer()
  49. {
  50. }
  51. /*
  52.    void COpenGLPrintBuffer::x_Print3DcolorVertex(CNcbiOstream& ostream, GLint& count)
  53.    {
  54.    ostream << "  ";
  55.    for (int i = 0;  i < 7;  i++) {
  56. //printf("%4.2f ", buffer[m_DataLength - count--]);
  57. ostream << buffer[m_DataLength - count--];
  58. }
  59. ostream << endl;
  60. }
  61. void COpenGLPrintBuffer::x_Print(CNcbiOstream& ostream)
  62. {
  63. GLint count = m_DataLength;
  64. int token, nvertices;
  65. while (count) {
  66. token = buffer[m_DataLength - count--];
  67. switch (token) {
  68. case GL_PASS_THROUGH_TOKEN:
  69. ostream << "GL_PASS_THROUGH_TOKENn";
  70. ostream << "  %4.2fn", buffer[m_DataLength - count--];
  71. break;
  72. case GL_POINT_TOKEN:
  73. ostream << "GL_POINT_TOKENn";
  74. print3DcolorVertex(ostream, count);
  75. break;
  76. case GL_LINE_TOKEN:
  77. ostream << "GL_LINE_TOKENn";
  78. print3DcolorVertex(ostream, count);
  79. print3DcolorVertex(ostream, count);
  80. break;
  81. case GL_LINE_RESET_TOKEN:
  82. ostream << "GL_LINE_RESET_TOKENn";
  83. print3DcolorVertex(ostream, count);
  84. print3DcolorVertex(ostream, count);
  85. break;
  86. case GL_POLYGON_TOKEN:
  87. printf("GL_POLYGON_TOKENn");
  88. for (nvertices = buffer[m_DataLength - count--];  nvertices > 0;  nvertices--) {
  89. print3DcolorVertex(ostream, count);
  90. }
  91. break;
  92. }
  93. }
  94. }
  95. */
  96. void COpenGLPrintBuffer::Parse(const GLfloat* buffer, GLint data_length)
  97. {
  98.     // 7 ints per vertex(x, y, z, R, G, B, A)
  99.     static const unsigned int VERTEX_SIZE = 7;
  100.     const GLfloat* endptr = buffer + data_length;
  101.     for (const GLfloat* bufptr = buffer;  bufptr < endptr;  ++bufptr) {
  102.         const int token = GLint(*bufptr);
  103.         int N = 0;
  104.         const GLfloat* ptr = bufptr + 1;
  105.         switch (token) {
  106.         case GL_PASS_THROUGH_TOKEN:
  107.             {
  108.                 ptr = bufptr;
  109.                 if (ptr[1] != CGlFeedbackFont::eBeginText) {
  110.                     // skip the data for this pass - through token
  111.                     ++bufptr;
  112.                     break;
  113.                 }
  114.                 //
  115.                 // every second float will be GL_PASS_THROUGH_TOKEN
  116.                 //
  117.                 const size_t size = size_t(ptr[3]);
  118.                 vector<float> textbuf;
  119.                 textbuf.reserve(size);
  120.                 const size_t num_floats = size << 1;
  121.                 for (unsigned int i = 0;  i < num_floats;  ++i) {
  122.                     if (ptr[i] != GL_PASS_THROUGH_TOKEN) {
  123.                         LOG_POST(Error << "COpenGLPrintBuffer::Parse: expecting GL_PASS_THROUGH_TOKEN");
  124.                     }
  125.                     textbuf.push_back(ptr[++i]);
  126.                 }
  127.                 GLfloat pos[4], col[4];
  128.                 string text;
  129.                 CGlFeedbackFont::DecodeText(textbuf, pos, col, text);
  130.                 CGlColor c(col, 4);
  131.                 m_VectObjs.push_back(CRef<CObject > (new CPVecText(text, pos, c)));
  132.                 bufptr += num_floats - 1;
  133.                 break;
  134.             }
  135.         case GL_POINT_TOKEN:
  136.             {
  137.                 N = 1;
  138.                 m_VectObjs.push_back(CRef<CObject > (new CPVecPoint(ptr)));
  139.                 break;
  140.             }
  141.         case GL_LINE_TOKEN:
  142.         case GL_LINE_RESET_TOKEN:
  143.             {
  144.                 N = 2;
  145.                 m_VectObjs.push_back(CRef<CObject > (new CPVecLine(ptr)));
  146.                 break;
  147.             }
  148.         case GL_POLYGON_TOKEN:
  149.             {
  150.                 // increment the buffer pointers to account for the
  151.                 // single - float size parameter
  152.                 N = int(*++bufptr);
  153.                 m_VectObjs.push_back(CRef<CObject > (new CPVecPolygon(N, ++ptr)));
  154.                 break;
  155.             }
  156.         default:
  157.             //LOG_POST(Error << "COpenGLPrintBuffer::Parse: unexpected token: " << token << ", offset: " << (bufptr - buffer) << ", endptr: " << (endptr - buffer));
  158.             break;
  159.         }
  160.         if (N < 1) {
  161.             continue;
  162.         }
  163.         m_BoundingBox.Add(ptr, N, VERTEX_SIZE);
  164.         bufptr += N * VERTEX_SIZE;
  165.     }
  166.     // buffer is not empty
  167.     SetEmpty(false);
  168. }
  169. CBBox<3> COpenGLPrintBuffer::GetBoundingBox(void) const
  170. {
  171.     return m_BoundingBox;
  172. }
  173. END_NCBI_SCOPE
  174. /*
  175.  * ===========================================================================
  176.  * $Log: opengl_print_buffer.cpp,v $
  177.  * Revision 1000.1  2004/06/01 20:51:54  gouriano
  178.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  179.  *
  180.  * Revision 1.7  2004/05/21 22:27:45  gorelenk
  181.  * Added PCH ncbi_pch.hpp
  182.  *
  183.  * Revision 1.6  2003/08/15 17:08:33  meric
  184.  * Update include paths for print-related files moved from gui/utils to gui/print
  185.  *
  186.  * Revision 1.5  2003/06/25 17:58:03  meric
  187.  * Added #include for vector_object.hpp
  188.  *
  189.  * Revision 1.4  2003/06/18 17:26:57  meric
  190.  * Final phase of print reorg: print classes now in gui/utils
  191.  *
  192.  * Revision 1.3  2003/06/18 16:40:33  meric
  193.  * First phase of print reorg: remove dependence on gui/opengl and OpenGL
  194.  * except for class COpenGLPrintBuffer
  195.  *
  196.  * Revision 1.2  2003/06/16 12:44:52  dicuccio
  197.  * Clean-up after initial commit
  198.  *
  199.  * Revision 1.1  2003 / 06 / 13 18:13:56  meric
  200.  * Initial version
  201.  *
  202.  *
  203.  * ===========================================================================
  204.  */