Changeset 364 for trunk/gui/vizservers
- Timestamp:
- Mar 14, 2006, 10:39:24 PM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gui/vizservers/nanovis/nanovis.cpp
r274 r364 13 13 * ====================================================================== 14 14 */ 15 #include <stdio.h> 16 #include <math.h> 17 #include <fstream> 18 #include <iostream> 19 #include <string> 15 20 16 21 #include "nanovis.h" 22 #include "RpFieldRect3D.h" 17 23 18 24 ParticleSystem* psys; … … 161 167 } 162 168 169 /* Load a 3D volume from a dx-format file 170 */ 171 void 172 load_volume_file(int index, char *fname) { 173 int dummy, nx, ny, nz, npts; 174 double x0, y0, z0, dx, dy, dz, ddx, ddy, ddz; 175 char line[128], *start; 176 std::ifstream fin(fname); 177 178 do { 179 fin.getline(line,sizeof(line)-1); 180 for (start=&line[0]; *start == ' ' || *start == '\t'; start++) 181 ; // skip leading blanks 182 183 if (*start != '#') { // skip comment lines 184 if (sscanf(start, "object %d class gridpositions counts %d %d %d", &dummy, &nx, &ny, &nz) == 4) { 185 // found grid size 186 } 187 else if (sscanf(start, "origin %lg %lg %lg", &x0, &y0, &z0) == 3) { 188 // found origin 189 } 190 else if (sscanf(start, "delta %lg %lg %lg", &ddx, &ddy, &ddz) == 3) { 191 // found one of the delta lines 192 if (ddx != 0.0) { dx = ddx; } 193 else if (ddy != 0.0) { dy = ddy; } 194 else if (ddz != 0.0) { dz = ddz; } 195 } 196 else if (sscanf(start, "object %d class array type double rank 0 items %d data follows", &dummy, &npts) == 2) { 197 if (npts != nx*ny*nz) { 198 std::cerr << "inconsistent data: expected " << nx*ny*nz << " points but found " << npts << " points" << std::endl; 199 return; 200 } 201 break; 202 } 203 else if (sscanf(start, "object %d class gridconnections", &dummy) == 1) { 204 // ignore this 205 } 206 } 207 } while (!fin.eof()); 208 209 // read data points 210 if (!fin.eof()) { 211 Rappture::Mesh1D xgrid(x0, x0+nx*dx, nx); 212 Rappture::Mesh1D ygrid(y0, y0+ny*dy, ny); 213 Rappture::Mesh1D zgrid(z0, z0+nz*dz, nz); 214 Rappture::FieldRect3D field(xgrid, ygrid, zgrid); 215 216 double dval; 217 int nread = 0; 218 while (!fin.eof()) { 219 if (!(fin >> dval).fail()) { 220 field.define(nread++, dval); 221 } 222 } 223 224 // make sure that we read all of the expected points 225 if (nread != nx*ny*nz) { 226 std::cerr << "inconsistent data: expected " << nx*ny*nz << " points but found " << nread << " points" << std::endl; 227 return; 228 } 229 230 // figure out a good mesh spacing 231 int nsample = 100; 232 dx = field.rangeMax(Rappture::xaxis) - field.rangeMin(Rappture::xaxis); 233 dy = field.rangeMax(Rappture::yaxis) - field.rangeMin(Rappture::yaxis); 234 dz = field.rangeMax(Rappture::zaxis) - field.rangeMin(Rappture::zaxis); 235 double dmin = pow((dx*dy*dz)/(nsample*nsample*nsample), 0.333); 236 237 nx = (int)ceil(dx/dmin); 238 ny = (int)ceil(dy/dmin); 239 nz = (int)ceil(dz/dmin); 240 float *data = new float[nx*ny*nz]; 241 std::cout << "generating " << nx << "x" << ny << "x" << nz << " = " << nx*ny*nz << " points" << std::endl; 242 243 // generate the uniformly sampled data that we need for a volume 244 int ngen = 0; 245 for (int iz=0; iz < nz; iz++) { 246 double zval = z0 + iz*dmin; 247 for (int iy=0; iy < ny; iy++) { 248 double yval = y0 + iy*dmin; 249 for (int ix=0; ix < nx; ix++) { 250 double xval = x0 + ix*dmin; 251 data[ngen++] = field.value(xval,yval,zval); 252 } 253 } 254 } 255 load_volume(index, nx, ny, nz, 1, data); 256 delete [] data; 257 } else { 258 std::cerr << "WARNING: data not found in file " << fname << std::endl; 259 } 260 } 163 261 164 262 /* Load a 3D volume … … 416 514 } 417 515 418 init_vector_field(); //3d vector field516 load_volume_file(0, "./data/A-apbs-2-out-potential-PE0.dx"); 419 517 init_fbo(); //frame buffer objects 420 518 init_cg(); //init cg shaders 421 519 422 psys = new ParticleSystem(NMESH, NMESH, g_context, volume[0]->id); 423 init_particles(); //fill initial particles 424 425 get_slice_vectors(); 520 //init_vector_field(); //3d vector field 521 //psys = new ParticleSystem(NMESH, NMESH, g_context, volume[0]->id); 522 //init_particles(); //fill initial particles 523 524 //get_slice_vectors(); 426 525 } 427 526
Note: See TracChangeset
for help on using the changeset viewer.