00001 #ifndef _VOLUME_BUFFER_H
00002 #define _VOLUME_BUFFER_H
00003
00004 #include <GL/glew.h>
00005
00006
00007 #define HISTOGRAM_BIN_COUNT 256
00008 #define HISTOGRAM_SIZE (HISTOGRAM_BIN_COUNT * sizeof(unsigned int))
00009 #define FILE_NAME_LENGTH 256
00010
00011
00012 class VolumeBuffer {
00013 public:
00014 VolumeBuffer(GLint format, int width, int height, int depth, int banks);
00015 ~VolumeBuffer();
00016
00017 enum BlendMode { BLEND_NONE = 0, BLEND_ADDITIVE };
00018
00019 void setData(unsigned char *data, int bank=0);
00020
00021 void setWrapMode(GLint mode, int bank=0);
00022 void setFiltering(GLint mode, int bank=0);
00023 void setBlendMode(BlendMode mode) { m_blendMode = mode; }
00024
00025 GLuint getTexture(int bank = 0) { return m_tex[bank]; }
00026
00027 int readRawFile(char *filename);
00028 unsigned char *m_volume_data_raw;
00029 unsigned char *m_volume_data_rgba;
00030
00031 void updateHistogram();
00032
00033 unsigned int *m_histogram;
00034
00035 int getWidth() { return m_width; }
00036 int getHeight() { return m_height; }
00037 int getDepth() { return m_depth; }
00038
00039 int getHistogramBinCount() { return m_histogram_bin_count; }
00040
00041 void setVolumeFileName(char *file_name);
00042 char *getVolumeFileName() { return m_volume_file_name; }
00043
00044 void drawSlice(float z);
00045
00046 private:
00047 GLuint create3dTexture(GLint internalformat, int w, int h, int d);
00048
00049 int m_width, m_height, m_depth;
00050 int m_volume_size;
00051 int m_max_banks;
00052 int m_banks;
00053 int m_histogram_bin_count;
00054
00055 char *m_volume_file_name;
00056
00057 BlendMode m_blendMode;
00058
00059 GLuint *m_tex;
00060 };
00061
00062 #endif