00001 #include "3d.h"
00002 #include <fstream.h>
00003 #include <stdio.h>
00004 #include <GL/gl.h>
00005
00006
00007
00008
00009
00010 vu1112::vu1112()
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 vu1112::vu1112(const vu1112& inst) : vu111(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 vu1112& vu1112::operator=(const vu1112& 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 vu111::operator=(rhs);
00058 }
00059 return *this;
00060 }
00061
00062
00063
00064
00065
00066 dword vu1112::getDim1Size(void) const
00067 {
00068 return m_Dim1Size;
00069 }
00070
00071 dword vu1112::getDim2Size(void) const
00072 {
00073 return m_Dim2Size;
00074 }
00075
00076 dword vu1112::getDim3Size(void) const
00077 {
00078 return m_Dim3Size;
00079 }
00080
00081 dword vu1112::getSpacing(void) const
00082 {
00083 return m_Spacing;
00084 }
00085
00086 int vu1112::getDim1Origin(void) const
00087 {
00088 return m_Dim1Origin;
00089 }
00090
00091 int vu1112::getDim2Origin(void) const
00092 {
00093 return m_Dim2Origin;
00094 }
00095
00096 int vu1112::getDim3Origin(void) const
00097 {
00098 return m_Dim3Origin;
00099 }
00100
00101
00102
00103
00104
00105 bool vu1112::read(FILE *file)
00106 {
00107 int ret = 0;
00108
00109 bool success = vu111::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 int do4=0;
00119 ret = fscanf(file,"ORIGIN %i %i %i %i ",&m_Dim1Origin,&m_Dim2Origin,
00120 &m_Dim3Origin,&do4);
00121 if (ret != 4) return setInvalidFormatError();
00122
00123 dword ds1,ds2,ds3,ds4;
00124 ret = fscanf(file,"SPACING %lu %lu %lu %lu ",&ds1,&ds2,&ds3,&ds4);
00125 if (ret != 4) return setInvalidFormatError();
00126 m_Spacing = ds1;
00127
00128 ret = fscanf(file,"POINT_DATA %lu ",&m_DataSize);
00129 if (ret != 1) return setInvalidFormatError();
00130
00131 if ( (m_Dim1Size<=1) || (m_Dim2Size<=1) || (m_Dim3Size<=1) || (d4!=1) )
00132 return setInvalidFormatError();
00133 else if ( (ds1 != ds2) || (ds2 != ds3))
00134 return setInvalidFormatError();
00135
00136
00137
00138
00139 return true;
00140 }
00141
00142
00143
00144
00145
00146 bool vu1112::write(FILE *file)
00147 {
00148 int ret = 0;
00149
00150 bool success = vu111::write(file);
00151 if (!success) return false;
00152
00153
00154 ret = fprintf(file,"DIMENSIONS %lu %lu %lu %lu\n",m_Dim1Size,m_Dim2Size,
00155 m_Dim3Size,(dword)1);
00156
00157
00158 ret = fprintf(file,"ORIGIN %i %i %i %i\n",m_Dim1Origin,m_Dim2Origin,
00159 m_Dim3Origin,0);
00160
00161
00162 ret = fprintf(file,"SPACING %lu %lu %lu %lu\n",m_Spacing,m_Spacing,
00163 m_Spacing,(dword)0);
00164
00165
00166 ret = fprintf(file,"POINT_DATA %lu\n",m_DataSize);
00167
00168 if (ret > 0)
00169 return true;
00170 else
00171 return setWriteError();
00172 }
00173
00174 void vu1112::preview(int hint)
00175 {
00176 vuCamera *camera = getCameraPtr();
00177
00178 if (camera != NULL) {
00179 glEnable(GL_DEPTH_TEST);
00180 glDepthFunc(GL_LESS);
00181 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
00182
00183
00184 camera->glViewport();
00185
00186
00187 glMatrixMode(GL_PROJECTION);
00188 glLoadIdentity();
00189
00190 camera->glInit();
00191 glMatrixMode(GL_MODELVIEW);
00192 glLoadIdentity();
00193 camera->gluLookAt();
00194
00195
00196 int minImg = camera->getWidth();
00197 dword maxVol = (m_Dim1Size > m_Dim2Size) ? m_Dim1Size : m_Dim2Size;
00198
00199 minImg = (minImg < camera->getHeight()) ? minImg : camera->getHeight();
00200 maxVol = (maxVol > m_Dim3Size) ? maxVol : m_Dim3Size;
00201
00202 float fac = (float)maxVol/(float)minImg;
00203 fac*=1.5;
00204
00205
00206 drawBox((float)m_Dim1Size*fac,(float)m_Dim2Size*fac,(float)m_Dim3Size*fac);
00207 }
00208 else {
00209 cerr << "Warning: Could not draw preview. No Camera set." << endl;
00210 }
00211 }
00212
00213 void vu1112::drawBox(float sx, float sy, float sz)
00214 {
00215 static GLfloat n[6][3] = {
00216 {-1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0},
00217 {0.0, -1.0, 0.0}, {0.0, 0.0, -1.0}, {0.0, 0.0, 1.0} };
00218 static GLint faces[6][4] = {
00219 {0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4},
00220 {4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3} };
00221 static GLfloat v[8][3];
00222
00223 sx = sx/2;
00224 sy = sy/2;
00225 sz = sz/2;
00226
00227 glTranslatef(m_Dim1Size/2,m_Dim2Size/2,m_Dim3Size/2);
00228
00229
00230 v[0][0] = v[1][0] = v[2][0] = v[3][0] = -sx;
00231 v[4][0] = v[5][0] = v[6][0] = v[7][0] = sx;
00232 v[0][1] = v[1][1] = v[4][1] = v[5][1] = -sy;
00233 v[2][1] = v[3][1] = v[6][1] = v[7][1] = sy;
00234 v[0][2] = v[3][2] = v[4][2] = v[7][2] = sz;
00235 v[1][2] = v[2][2] = v[5][2] = v[6][2] = -sz;
00236
00237 int i;
00238 for (i = 0; i < 6; i++) {
00239 glBegin(GL_LINE_LOOP);
00240 glNormal3fv(&n[i][0]);
00241 glColor3fv(v[faces[i][0]]);
00242 glVertex3fv(&v[faces[i][0]][0]);
00243 glColor3fv(v[faces[i][1]]);
00244 glVertex3fv(&v[faces[i][1]][0]);
00245 glColor3fv(v[faces[i][2]]);
00246 glVertex3fv(&v[faces[i][2]][0]);
00247 glColor3fv(v[faces[i][3]]);
00248 glVertex3fv(&v[faces[i][3]][0]);
00249 glEnd();
00250 }
00251 }