source: trunk/vizservers/nanovis/RenderVertexArray.cpp @ 979

Last change on this file since 979 was 979, checked in by gah, 16 years ago
File size: 3.6 KB
Line 
1
2/*
3 * ----------------------------------------------------------------------
4 *  Render to vertex array
5 *
6 *  This class implements "render to vertex array" functionality
7 *  using vertex and pixel buffer objects (VBO and PBO).
8 *
9 *  Operation:
10 *  1. A buffer object is created
11 *  2. The buffer object is bound to the pixel pack (destination) buffer
12 *  3. glReadPixels is used to read from the frame buffer to the buffer object
13 *  4. The buffer object is bound to the vertex array
14 *  5. Vertex array pointers are set
15 * 
16 *  Usage:
17 *  1. Create a floating point pbuffer
18 *  2. Create a RenderVertexArray object for each vertex attribute
19 *       you want to render to
20 *  3. Render vertex data to pbuffer using a fragment program (could
21 *       use multiple draw buffers here)
22 *  4. Call Read() method to read data from pbuffer to vertex array
23 *  5. Call SetPointer() method to set vertex array pointers
24 *  6. Set any other other static vertex array attribute pointers
25 *  7. Render geometry as usual using glDrawArrays or glDrawElements
26 *
27 * ======================================================================
28 *  AUTHOR:  Wei Qiao <qiaow@purdue.edu>
29 *           Purdue Rendering and Perceptualization Lab (PURPL)
30 *
31 *  Copyright (c) 2004-2006  Purdue Research Foundation
32 *
33 *  See the file "license.terms" for information on usage and
34 *  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
35 * ======================================================================
36 */
37#include "RenderVertexArray.h"
38#include <GL/gl.h>
39#include <stdio.h>
40
41using namespace std;
42
43RenderVertexArray::RenderVertexArray(int nverts, GLint size, GLenum type) :
44    m_usage(GL_STREAM_COPY),
45    m_nverts(nverts),
46    m_size(size),
47    m_type(type)
48{
49    switch(m_type) {
50    case GL_HALF_FLOAT_NV:
51        m_bytes_per_component = 2; break;
52    case GL_FLOAT:
53        m_bytes_per_component = sizeof(float); break;
54    default:
55        fprintf(stderr, "Error: unsupported RenderVertexArray type\n");
56        return;
57    }
58
59    // create the buffer object
60    glGenBuffersARB(1, &m_buffer);
61    glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, m_buffer);
62    glBufferDataARB(GL_PIXEL_PACK_BUFFER_EXT,
63        m_nverts*m_size*m_bytes_per_component, 0, m_usage); // undefined data
64    glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, 0);
65
66    // set equivalent image format
67    switch(m_size) {
68    case 1:
69        m_format = GL_LUMINANCE; break;
70    case 3:
71        m_format = GL_RGB; break;
72    case 4:
73        m_format = GL_RGBA; break;
74    default:
75        fprintf(stderr, "Error: unsupported RenderVertexArray size\n");
76        return;
77    }
78}
79
80RenderVertexArray::~RenderVertexArray()
81{
82    glDeleteBuffersARB(1, &m_buffer);
83}
84
85void
86RenderVertexArray::LoadData(void *data)
87{
88    // load data to buffer object
89    glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, m_buffer);
90    glBufferDataARB(GL_PIXEL_PACK_BUFFER_EXT,
91                    m_nverts*m_size*m_bytes_per_component, data, m_usage);
92    glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, 0);
93}
94
95void
96RenderVertexArray::Read(/*GLenum buffer,*/ int w, int h)
97{
98    // bind buffer object to pixel pack buffer
99    glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, m_buffer);
100    // read from frame buffer to buffer object
101    //glReadBuffer(buffer); //crash
102    glReadPixels(0, 0, w, h, m_format, m_type, 0);
103
104    glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, 0);
105}
106
107void
108RenderVertexArray::SetPointer(GLuint index)
109{
110    // bind buffer object to vertex array
111    glBindBufferARB(GL_ARRAY_BUFFER, m_buffer);
112    //glVertexAttribPointerARB(index, m_size, m_type, GL_FALSE, 0, 0);          //doesn't work
113    glVertexPointer(m_size, m_type, 0, 0);
114
115    glBindBufferARB(GL_ARRAY_BUFFER, 0);
116}
Note: See TracBrowser for help on using the repository browser.