00001 #include <math.h>
00002 #include <GL/glew.h>
00003 #include <Cg/cgGL.h>
00004 #include <stdio.h>
00005
00006 #include "VolumeBuffer.h"
00007
00008 #ifdef _WIN32
00009 #include<windows.h>
00010 #else
00011 #include <string.h>
00012 #endif
00013
00014 VolumeBuffer::VolumeBuffer(GLint format, int width, int height, int depth, int banks)
00015 : m_width(width),
00016 m_height(height),
00017 m_depth(depth),
00018 m_banks(banks),
00019 m_blendMode(BLEND_NONE)
00020 {
00021 m_volume_size = m_width*m_height*m_depth;
00022 m_volume_data_raw = new unsigned char [m_volume_size];
00023 m_volume_data_rgba = new unsigned char [m_volume_size*4];
00024
00025 m_volume_file_name = new char[FILE_NAME_LENGTH];
00026
00027
00028 m_histogram_bin_count = HISTOGRAM_BIN_COUNT;
00029 m_histogram = (unsigned int *)malloc(HISTOGRAM_SIZE);
00030
00031 memset(m_volume_data_raw,0,m_volume_size*sizeof(unsigned char));
00032 memset(m_volume_data_rgba,0,m_volume_size*4*sizeof(unsigned char));
00033
00034
00035 memset(m_histogram,0,HISTOGRAM_SIZE);
00036
00037 glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &m_max_banks);
00038 if (m_banks > m_max_banks) m_banks = m_max_banks;
00039
00040
00041 m_tex = new GLuint [m_banks];
00042 for(int i=0; i<m_banks; i++) {
00043 m_tex[i] = create3dTexture(format, m_width, m_height, m_depth);
00044 }
00045 }
00046
00047 VolumeBuffer::~VolumeBuffer()
00048 {
00049
00050 for(int i=0; i<m_banks; i++) {
00051 glDeleteTextures(1, &m_tex[i]);
00052 }
00053 delete [] m_tex;
00054 delete [] m_volume_data_raw;
00055 delete [] m_volume_data_rgba;
00056
00057 delete [] m_histogram;
00058 delete [] m_volume_file_name;
00059 }
00060
00061 GLuint
00062 VolumeBuffer::create3dTexture(GLint internalformat, int w, int h, int d)
00063 {
00064 GLuint tex;
00065 glGenTextures(1, &tex);
00066 glBindTexture(GL_TEXTURE_3D, tex);
00067 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
00068 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
00069 GLint mode = GL_CLAMP_TO_BORDER;
00070 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, mode);
00071 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, mode);
00072 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, mode);
00073 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, w, h, d, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
00074 return tex;
00075 }
00076
00077 void
00078 VolumeBuffer::setWrapMode(GLint mode, int bank)
00079 {
00080 glBindTexture(GL_TEXTURE_3D, m_tex[bank]);
00081 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, mode);
00082 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, mode);
00083 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, mode);
00084 }
00085
00086 void
00087 VolumeBuffer::setFiltering(GLint mode, int bank)
00088 {
00089 glBindTexture(GL_TEXTURE_3D, m_tex[bank]);
00090 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, mode);
00091 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, mode);
00092 }
00093
00094 void
00095 VolumeBuffer::setData(unsigned char *data, int bank)
00096 {
00097 glBindTexture(GL_TEXTURE_3D, m_tex[bank]);
00098 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, m_width, m_height, m_depth, 0 , GL_RGBA, GL_UNSIGNED_BYTE, data);
00099 }
00100
00101
00102 void
00103 VolumeBuffer::drawSlice(float z)
00104 {
00105 glBegin(GL_QUADS);
00106 glTexCoord3f(0.0f, 0.0f, z); glVertex2f(-1.0f, -1.0f);
00107 glTexCoord3f(1.0f, 0.0f, z); glVertex2f(1.0f, -1.0f);
00108 glTexCoord3f(1.0f, 1.0f, z); glVertex2f(1.0f, 1.0f);
00109 glTexCoord3f(0.0f, 1.0f, z); glVertex2f(-1.0f, 1.0f);
00110 glEnd();
00111 }
00112
00113 int
00114 VolumeBuffer::readRawFile(char *filename)
00115 {
00116 FILE *fp = fopen(filename, "rb");
00117
00118 if (!fp) {
00119 fprintf(stderr, "Error opening file '%s'\n", filename);
00120 return 0;
00121 }
00122
00123 size_t read = fread(m_volume_data_raw, sizeof(unsigned char), m_volume_size, fp);
00124 fclose(fp);
00125
00126 int i, j, k, c;
00127
00128 for (i = 0; i < m_depth; i++) {
00129 for (j = 0; j < m_height; j++) {
00130 for (k = 0; k < m_width; k++) {
00131
00132 c = m_volume_data_raw[(m_height*m_width)*i + (m_width)*j + k];
00133
00134 m_volume_data_rgba[(m_height*m_width)*i*4 + ((m_width)*j + k)*4 + 0] = (GLubyte) c;
00135 m_volume_data_rgba[(m_height*m_width)*i*4 + ((m_width)*j + k)*4 + 1] = (GLubyte) c;
00136 m_volume_data_rgba[(m_height*m_width)*i*4 + ((m_width)*j + k)*4 + 2] = (GLubyte) c;
00137 m_volume_data_rgba[(m_height*m_width)*i*4 + ((m_width)*j + k)*4 + 3] = (GLubyte) 255;
00138 }
00139 }
00140 }
00141
00142 printf("Read '%s', %d bytes\n", filename, read);
00143
00144 updateHistogram();
00145
00146 }
00147
00148 void VolumeBuffer::updateHistogram()
00149 {
00150 int i;
00151
00152 printf("updating histogram...\n");
00153
00154
00155 for(i = 0; i < HISTOGRAM_BIN_COUNT; i++)
00156 {
00157 m_histogram[i] = 0;
00158 }
00159
00160 int h_index;
00161
00162
00163 for(i = 0; i < m_volume_size; i++)
00164 {
00165 h_index = m_volume_data_raw[i];
00166 m_histogram[h_index]++;
00167 }
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 }
00178
00179 void VolumeBuffer::setVolumeFileName(char *file_name)
00180 {
00181 strcpy(m_volume_file_name, file_name);
00182 }