00001 #include "3d.h"
00002 #include <fstream.h>
00003 #include <stdio.h>
00004 #include <GL/gl.h>
00005
00006
00007
00008
00009
00010 vu1512::vu1512()
00011 {
00012 m_Dim1Size = 0;
00013 m_Dim2Size = 0;
00014 m_Dim3Size = 0;
00015
00016 m_Spacing = 0;
00017
00018 m_Dim1Origin = 0;
00019 m_Dim2Origin = 0;
00020 m_Dim3Origin = 0;
00021 }
00022
00023
00024
00025
00026
00027 vu1512::vu1512(const vu1512& inst) : vu151(inst)
00028 {
00029 m_Dim1Size = inst.m_Dim1Size;
00030 m_Dim2Size = inst.m_Dim2Size;
00031 m_Dim3Size = inst.m_Dim3Size;
00032
00033 m_Spacing = inst.m_Spacing;
00034
00035 m_Dim1Origin = inst.m_Dim1Origin;
00036 m_Dim2Origin = inst.m_Dim2Origin;
00037 m_Dim3Origin = inst.m_Dim3Origin;
00038 }
00039
00040
00041
00042
00043
00044 vu1512& vu1512::operator=(const vu1512& rhs)
00045 {
00046 if (this != &rhs)
00047 {
00048 m_Dim1Size = rhs.m_Dim1Size;
00049 m_Dim2Size = rhs.m_Dim2Size;
00050 m_Dim3Size = rhs.m_Dim3Size;
00051
00052 m_Spacing = rhs.m_Spacing;
00053
00054 m_Dim1Origin = rhs.m_Dim1Origin;
00055 m_Dim2Origin = rhs.m_Dim2Origin;
00056 m_Dim3Origin = rhs.m_Dim3Origin;
00057 vu151::operator=(rhs);
00058 }
00059 return *this;
00060 }
00061
00062
00063
00064
00065
00066 dword vu1512::getDim1Size(void) const
00067 {
00068 return m_Dim1Size;
00069 }
00070
00071 dword vu1512::getDim2Size(void) const
00072 {
00073 return m_Dim2Size;
00074 }
00075
00076 dword vu1512::getDim3Size(void) const
00077 {
00078 return m_Dim3Size;
00079 }
00080
00081 dword vu1512::getSpacing(void) const
00082 {
00083 return m_Spacing;
00084 }
00085
00086 int vu1512::getDim1Origin(void) const
00087 {
00088 return m_Dim1Origin;
00089 }
00090
00091 int vu1512::getDim2Origin(void) const
00092 {
00093 return m_Dim2Origin;
00094 }
00095
00096 int vu1512::getDim3Origin(void) const
00097 {
00098 return m_Dim3Origin;
00099 }
00100
00101
00102
00103
00104
00105 bool vu1512::read(FILE *file)
00106 {
00107 int ret = 0;
00108
00109 bool success = vu151::read(file);
00110 if (!success) return false;
00111
00112
00113 dword d4=0;
00114 ret = fscanf(file,"DIMENSIONS %lu %lu %lu %lu ",&m_Dim1Size,&m_Dim2Size,
00115 &m_Dim3Size,&d4);
00116 if (ret != 4) return setInvalidFormatError();
00117
00118
00119 int do4=0;
00120 ret = fscanf(file,"ORIGIN %i %i %i %i ",&m_Dim1Origin,&m_Dim2Origin,
00121 &m_Dim3Origin,&do4);
00122 if (ret != 4) return setInvalidFormatError();
00123
00124
00125 dword ds1,ds2,ds3,ds4;
00126 ret = fscanf(file,"SPACING %lu %lu %lu %lu ",&ds1,&ds2,&ds3,&ds4);
00127 if (ret != 4) return setInvalidFormatError();
00128 m_Spacing = ds1;
00129
00130
00131 ret = fscanf(file,"POINT_DATA %lu ",&m_DataSize);
00132 if (ret != 1) return setInvalidFormatError();
00133
00134
00135 if ( (m_Dim1Size<=1) || (m_Dim2Size<=1) || (m_Dim3Size<=1) || (d4!=1) )
00136 return setInvalidFormatError();
00137 else if ( (ds1 != ds2) || (ds2 != ds3))
00138 return setInvalidFormatError();
00139 else if (m_DataSize != (m_Dim1Size * m_Dim2Size * m_Dim3Size))
00140 return setInvalidFormatError();
00141
00142 return true;
00143 }
00144
00145
00146
00147
00148
00149 bool vu1512::write(FILE *file)
00150 {
00151 int ret = 0;
00152
00153 bool success = vu151::write(file);
00154 if (!success) return false;
00155
00156
00157 ret = fprintf(file,"DIMENSIONS %lu %lu %lu %lu\n",m_Dim1Size,m_Dim2Size,
00158 m_Dim3Size,(dword)1);
00159
00160
00161 ret = fprintf(file,"ORIGIN %i %i %i %i\n",m_Dim1Origin,m_Dim2Origin,
00162 m_Dim3Origin,0);
00163
00164
00165 ret = fprintf(file,"SPACING %lu %lu %lu %lu\n",m_Spacing,m_Spacing,
00166 m_Spacing,(dword)0);
00167
00168
00169 ret = fprintf(file,"POINT_DATA %lu\n",m_DataSize);
00170
00171 if (ret > 0)
00172 return true;
00173 else
00174 return setWriteError();
00175 }
00176
00177
00178
00179 vuVector vu1512::getVoxelPosition(int x, int y, int z) const
00180 {
00181 vuVector pos;
00182 if(z&0x01){
00183
00184 pos[0] = (float(x)+0.5)*T;
00185 pos[1] = (float(y)+0.5)*T;
00186 pos[2] = (float(z))*(T*0.5);
00187 } else {
00188
00189 pos[0] = float(x)*T;
00190 pos[1] = float(y)*T;
00191 pos[2] = float(z)*(T*0.5);
00192 }
00193
00194 return pos;
00195 }
00196
00197 void vu1512::preview(int hint)
00198 {
00199 vuCamera *camera = getCameraPtr();
00200
00201 if (camera != NULL) {
00202 glEnable(GL_DEPTH_TEST);
00203 glDepthFunc(GL_LESS);
00204 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
00205
00206
00207 camera->glViewport();
00208
00209
00210 glMatrixMode(GL_PROJECTION);
00211 glLoadIdentity();
00212
00213 camera->glInit();
00214 glMatrixMode(GL_MODELVIEW);
00215 glLoadIdentity();
00216 camera->gluLookAt();
00217
00218
00219 int minImg = camera->getWidth();
00220 vuVector volsiz(getVoxelPosition(m_Dim1Size, m_Dim2Size, m_Dim3Size));
00221 dword maxVol = (dword)((volsiz[0] > volsiz[1]) ? volsiz[0] : volsiz[1]);
00222
00223 minImg = (minImg < camera->getHeight()) ? minImg : camera->getHeight();
00224 maxVol = (dword)((maxVol > volsiz[2]) ? maxVol : volsiz[2]);
00225
00226 float fac = (float)maxVol/(float)minImg;
00227 fac*=1.5;
00228
00229
00230 drawBox((float)volsiz[0]*fac,(float)volsiz[1]*fac,(float)volsiz[2]*fac);
00231 }
00232 else {
00233 cerr << "Warning: Could not draw preview. No Camera set." << endl;
00234 }
00235 }
00236
00237 void vu1512::drawBox(float sx, float sy, float sz)
00238 {
00239 static GLfloat n[6][3] = {
00240 {-1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0},
00241 {0.0, -1.0, 0.0}, {0.0, 0.0, -1.0}, {0.0, 0.0, 1.0} };
00242 static GLint faces[6][4] = {
00243 {0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4},
00244 {4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3} };
00245 static GLfloat v[8][3];
00246
00247 sx = sx/2;
00248 sy = sy/2;
00249 sz = sz/2;
00250
00251 vuVector center(getCenter());
00252 glTranslatef(center[0], center[1], center[2]);
00253
00254
00255 v[0][0] = v[1][0] = v[2][0] = v[3][0] = -sx;
00256 v[4][0] = v[5][0] = v[6][0] = v[7][0] = sx;
00257 v[0][1] = v[1][1] = v[4][1] = v[5][1] = -sy;
00258 v[2][1] = v[3][1] = v[6][1] = v[7][1] = sy;
00259 v[0][2] = v[3][2] = v[4][2] = v[7][2] = sz;
00260 v[1][2] = v[2][2] = v[5][2] = v[6][2] = -sz;
00261
00262 int i;
00263 for (i = 0; i < 6; i++) {
00264 glBegin(GL_LINE_LOOP);
00265 glNormal3fv(&n[i][0]);
00266 glColor3fv(v[faces[i][0]]);
00267 glVertex3fv(&v[faces[i][0]][0]);
00268 glColor3fv(v[faces[i][1]]);
00269 glVertex3fv(&v[faces[i][1]][0]);
00270 glColor3fv(v[faces[i][2]]);
00271 glVertex3fv(&v[faces[i][2]][0]);
00272 glColor3fv(v[faces[i][3]]);
00273 glVertex3fv(&v[faces[i][3]][0]);
00274 glEnd();
00275 }
00276 }