Ignore:
Timestamp:
May 5, 2008 3:05:29 PM (16 years ago)
Author:
vrinside
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/vizservers/nanovis/dxReader.cpp

    r974 r1000  
    213213load_volume_stream2(int index, std::iostream& fin)
    214214{
     215    printf("load_volume_stream2\n");
    215216    Rappture::Outcome result;
    216217
     
    384385            int ngen = 0;
    385386            double v;
    386             printf("test2\n");
    387             fflush(stdout);
    388387            if (dv == 0.0) {
    389388                dv = 1.0;
     
    393392                v = data[ngen];
    394393                // scale all values [0-1], -1 => out of bounds
     394                //
     395                // INSOO
    395396                v = (isnan(v)) ? -1.0 : (v - vmin)/dv;
    396397                data[ngen] = v;
     
    511512                    for (int ix=0; ix < nx; ix++) {
    512513                        // gradient in x-direction
     514                        //double valm1 = (ix == 0) ? 0.0 : data[ngen-4];
     515                        //double valp1 = (ix == nx-1) ? 0.0 : data[ngen+4];
    513516                        double valm1 = (ix == 0) ? 0.0 : data[ngen-4];
    514517                        double valp1 = (ix == nx-1) ? 0.0 : data[ngen+4];
     
    516519                            data[ngen+1] = 0.0;
    517520                        } else {
    518                             //data[ngen+1] = valp1-valm1; // assume dx=1
    519                             data[ngen+1] = ((valp1-valm1) + 1.0) * 0.5; // assume dz=1
     521                            data[ngen+1] = valp1-valm1; // assume dx=1
     522                            //data[ngen+1] = ((valp1-valm1) + 1.0) * 0.5; // assume dz=1
    520523                        }
    521524
     
    526529                            data[ngen+2] = 0.0;
    527530                        } else {
    528                             //data[ngen+2] = valp1-valm1; // assume dy=1
    529                             data[ngen+2] = ((valp1-valm1) + 1.0) * 0.5; // assume dz=1
     531                            data[ngen+2] = valp1-valm1; // assume dy=1
     532                            //data[ngen+2] = ((valp1-valm1) + 1.0) * 0.5; // assume dz=1
    530533                        }
    531534
     
    536539                            data[ngen+3] = 0.0;
    537540                        } else {
    538                             //data[ngen+3] = valp1-valm1; // assume dz=1
    539                             data[ngen+3] = ((valp1-valm1) + 1.0) * 0.5; // assume dz=1
     541                            data[ngen+3] = valp1-valm1; // assume dz=1
     542                            //data[ngen+3] = ((valp1-valm1) + 1.0) * 0.5; // assume dz=1
    540543                        }
    541544
     
    576579load_volume_stream(int index, std::iostream& fin)
    577580{
     581    printf("load_volume_stream\n");
    578582    Rappture::Outcome result;
    579583
     
    747751#endif
    748752
    749             float *cdata = new float[nx*ny*nz];
     753//#define _SOBEL
     754#ifdef _SOBEL_
     755            const int step = 1;
     756            float *cdata = new float[nx*ny*nz * step];
    750757            int ngen = 0;
    751758            double nzero_min = 0.0;
     
    766773
    767774                        cdata[ngen] = v;
    768                         ++ngen;
     775                        ngen += step;
    769776                    }
    770777                }
     
    773780            float* data = computeGradient(cdata, nx, ny, nz, field.valueMin(),
    774781                                          field.valueMax());
     782#else
     783            double vmin = field.valueMin();
     784            double vmax = field.valueMax();
     785            double nzero_min = 0;
     786            float *data = new float[nx*ny*nz * 4];
     787            double dv = vmax - vmin;
     788            double v;
     789            int ngen = 0;
     790            if (dv == 0.0)  dv = 1.0;
     791
     792            for (int iz=0; iz < nz; iz++) {
     793                double zval = z0 + iz*dmin;
     794                for (int iy=0; iy < ny; iy++) {
     795                    double yval = y0 + iy*dmin;
     796                    for (int ix=0; ix < nx; ix++) {
     797                        double xval = x0 + ix*dmin;
     798                        double v = field.value(xval,yval,zval);
     799
     800                        // scale all values [0-1], -1 => out of bounds
     801                        v = (isnan(v)) ? -1.0 : (v - vmin)/dv;
     802
     803                        data[ngen] = v;
     804                        ngen += 4;
     805                    }
     806                }
     807            }
     808
     809            computeSimpleGradient(data, nx, ny, nz);
     810#endif
    775811
    776812            for (int i=0; i<nx*ny*nz; i++) {
     
    904940                            data[ngen+1] = 0.0;
    905941                        } else {
    906                             //data[ngen+1] = valp1-valm1; // assume dx=1
    907                             data[ngen+1] = ((valp1-valm1) + 1) *  0.5; // assume dx=1
     942                            data[ngen+1] = valp1-valm1; // assume dx=1
     943                            //data[ngen+1] = ((valp1-valm1) + 1) *  0.5; // assume dx=1 (ISO)
    908944                        }
    909945
     
    914950                            data[ngen+2] = 0.0;
    915951                        } else {
    916                             //data[ngen+2] = valp1-valm1; // assume dy=1
    917                             data[ngen+2] = ((valp1-valm1) + 1) *  0.5; // assume dy=1
     952                            data[ngen+2] = valp1-valm1; // assume dy=1
     953                            //data[ngen+2] = ((valp1-valm1) + 1) *  0.5; // assume dy=1 (ISO)
    918954                        }
    919955
     
    924960                            data[ngen+3] = 0.0;
    925961                        } else {
    926                             //data[ngen+3] = valp1-valm1; // assume dz=1
    927                             data[ngen+3] = ((valp1-valm1) + 1) *  0.5; // assume dz=1
     962                            data[ngen+3] = valp1-valm1; // assume dz=1
     963                            //data[ngen+3] = ((valp1-valm1) + 1) *  0.5; // assume dz=1 (ISO)
    928964                        }
    929965
     
    9721008}
    9731009
     1010Rappture::Outcome
     1011load_volume_stream_insoo(int index, std::iostream& fin)
     1012{
     1013    printf("load_volume_stream\n");
     1014    Rappture::Outcome result;
     1015
     1016    Rappture::MeshTri2D xymesh;
     1017    int dummy, nx, ny, nz, nxy, npts;
     1018    double x0, y0, z0, dx, dy, dz, ddx, ddy, ddz;
     1019    char line[128], type[128], *start;
     1020
     1021    int isrect = 1;
     1022
     1023    dx = dy = dz = 0.0;         // Suppress compiler warning.
     1024    x0 = y0 = z0 = 0.0;         // May not have an origin line.
     1025    while (!fin.eof()) {
     1026        fin.getline(line, sizeof(line) - 1);
     1027        if (fin.fail()) {
     1028            return result.error("error in data stream");
     1029        }
     1030        for (start=line; *start == ' ' || *start == '\t'; start++)
     1031            ;  // skip leading blanks
     1032
     1033        if (*start != '#') {  // skip comment lines
     1034            if (sscanf(start, "object %d class gridpositions counts %d %d %d", &dummy, &nx, &ny, &nz) == 4) {
     1035                // found grid size
     1036                isrect = 1;
     1037            } else if (sscanf(start, "object %d class array type float rank 1 shape 3 items %d data follows", &dummy, &nxy) == 2) {
     1038                isrect = 0;
     1039
     1040                double xx, yy, zz;
     1041                for (int i=0; i < nxy; i++) {
     1042                    fin.getline(line,sizeof(line)-1);
     1043                    if (sscanf(line, "%lg %lg %lg", &xx, &yy, &zz) == 3) {
     1044                        xymesh.addNode( Rappture::Node2D(xx,yy) );
     1045                    }
     1046                }
     1047
     1048                char fpts[128];
     1049                sprintf(fpts, "/tmp/tmppts%d", getpid());
     1050                char fcells[128];
     1051                sprintf(fcells, "/tmp/tmpcells%d", getpid());
     1052
     1053                std::ofstream ftmp(fpts);
     1054                // save corners of bounding box first, to work around meshing
     1055                // problems in voronoi utility
     1056                ftmp << xymesh.rangeMin(Rappture::xaxis) << " "
     1057                     << xymesh.rangeMin(Rappture::yaxis) << std::endl;
     1058                ftmp << xymesh.rangeMax(Rappture::xaxis) << " "
     1059                     << xymesh.rangeMin(Rappture::yaxis) << std::endl;
     1060                ftmp << xymesh.rangeMax(Rappture::xaxis) << " "
     1061                     << xymesh.rangeMax(Rappture::yaxis) << std::endl;
     1062                ftmp << xymesh.rangeMin(Rappture::xaxis) << " "
     1063                     << xymesh.rangeMax(Rappture::yaxis) << std::endl;
     1064                for (int i=0; i < nxy; i++) {
     1065                    ftmp << xymesh.atNode(i).x() << " " << xymesh.atNode(i).y() << std::endl;
     1066
     1067                }
     1068                ftmp.close();
     1069
     1070                char cmdstr[512];
     1071                sprintf(cmdstr, "voronoi -t < %s > %s", fpts, fcells);
     1072                if (system(cmdstr) == 0) {
     1073                    int cx, cy, cz;
     1074                    std::ifstream ftri(fcells);
     1075                    while (!ftri.eof()) {
     1076                        ftri.getline(line,sizeof(line)-1);
     1077                        if (sscanf(line, "%d %d %d", &cx, &cy, &cz) == 3) {
     1078                            if (cx >= 4 && cy >= 4 && cz >= 4) {
     1079                                // skip first 4 boundary points
     1080                                xymesh.addCell(cx-4, cy-4, cz-4);
     1081                            }
     1082                        }
     1083                    }
     1084                    ftri.close();
     1085                } else {
     1086                    return result.error("triangularization failed");
     1087                }
     1088
     1089                sprintf(cmdstr, "rm -f %s %s", fpts, fcells);
     1090                system(cmdstr);
     1091            } else if (sscanf(start, "object %d class regulararray count %d", &dummy, &nz) == 2) {
     1092                // found z-grid
     1093            } else if (sscanf(start, "origin %lg %lg %lg", &x0, &y0, &z0) == 3) {
     1094                // found origin
     1095            } else if (sscanf(start, "delta %lg %lg %lg", &ddx, &ddy, &ddz) == 3) {
     1096                // found one of the delta lines
     1097                if (ddx != 0.0) { dx = ddx; }
     1098                else if (ddy != 0.0) { dy = ddy; }
     1099                else if (ddz != 0.0) { dz = ddz; }
     1100            } else if (sscanf(start, "object %d class array type %s rank 0 items %d data follows", &dummy, type, &npts) == 3) {
     1101                if (isrect && (npts != nx*ny*nz)) {
     1102                    char mesg[256];
     1103                    sprintf(mesg,"inconsistent data: expected %d points but found %d points", nx*ny*nz, npts);
     1104                    return result.error(mesg);
     1105                } else if (!isrect && (npts != nxy*nz)) {
     1106                    char mesg[256];
     1107                    sprintf(mesg,"inconsistent data: expected %d points but found %d points", nxy*nz, npts);
     1108                    return result.error(mesg);
     1109                }
     1110                break;
     1111            } else if (sscanf(start, "object %d class array type %s rank 0 times %d data follows", &dummy, type, &npts) == 3) {
     1112                if (npts != nx*ny*nz) {
     1113                    char mesg[256];
     1114                    sprintf(mesg,"inconsistent data: expected %d points but found %d points", nx*ny*nz, npts);
     1115                    return result.error(mesg);
     1116                }
     1117                break;
     1118            }
     1119        }
     1120    }
     1121
     1122    // read data points
     1123    if (!fin.eof()) {
     1124        if (isrect) {
     1125            Rappture::Mesh1D xgrid(x0, x0+nx*dx, nx);
     1126            Rappture::Mesh1D ygrid(y0, y0+ny*dy, ny);
     1127            Rappture::Mesh1D zgrid(z0, z0+nz*dz, nz);
     1128            Rappture::FieldRect3D field(xgrid, ygrid, zgrid);
     1129
     1130            double dval[6];
     1131            int nread = 0;
     1132            int ix = 0;
     1133            int iy = 0;
     1134            int iz = 0;
     1135            while (!fin.eof() && nread < npts) {
     1136                fin.getline(line,sizeof(line)-1);
     1137                if (fin.fail()) {
     1138                    return result.error("error reading data points");
     1139                }
     1140                int n = sscanf(line, "%lg %lg %lg %lg %lg %lg", &dval[0], &dval[1], &dval[2], &dval[3], &dval[4], &dval[5]);
     1141
     1142                for (int p=0; p < n; p++) {
     1143                    int nindex = iz*nx*ny + iy*nx + ix;
     1144                    field.define(nindex, dval[p]);
     1145                    fprintf(stderr,"nindex = %i\tdval[%i] = %lg\n", nindex, p,
     1146                        dval[p]);
     1147                    fflush(stderr);
     1148                    nread++;
     1149                    if (++iz >= nz) {
     1150                        iz = 0;
     1151                        if (++iy >= ny) {
     1152                            iy = 0;
     1153                            ++ix;
     1154                        }
     1155                    }
     1156                }
     1157            }
     1158
     1159            // make sure that we read all of the expected points
     1160            if (nread != nx*ny*nz) {
     1161                char mesg[256];
     1162                sprintf(mesg,"inconsistent data: expected %d points but found %d points", nx*ny*nz, nread);
     1163                result.error(mesg);
     1164                return result;
     1165            }
     1166
     1167            // figure out a good mesh spacing
     1168            int nsample = 30;
     1169            dx = field.rangeMax(Rappture::xaxis) - field.rangeMin(Rappture::xaxis);
     1170            dy = field.rangeMax(Rappture::yaxis) - field.rangeMin(Rappture::yaxis);
     1171            dz = field.rangeMax(Rappture::zaxis) - field.rangeMin(Rappture::zaxis);
     1172            double dmin = pow((dx*dy*dz)/(nsample*nsample*nsample), 0.333);
     1173
     1174            nx = (int)ceil(dx/dmin);
     1175            ny = (int)ceil(dy/dmin);
     1176            nz = (int)ceil(dz/dmin);
     1177
     1178#ifndef NV40
     1179            // must be an even power of 2 for older cards
     1180            nx = (int)pow(2.0, ceil(log10((double)nx)/log10(2.0)));
     1181            ny = (int)pow(2.0, ceil(log10((double)ny)/log10(2.0)));
     1182            nz = (int)pow(2.0, ceil(log10((double)nz)/log10(2.0)));
     1183#endif
     1184
     1185            float *data = new float[4*nx*ny*nz];
     1186
     1187            double vmin = field.valueMin();
     1188            double dv = field.valueMax() - field.valueMin();
     1189            if (dv == 0.0) { dv = 1.0; }
     1190
     1191            int ngen = 0;
     1192            double nzero_min = 0.0;
     1193            for (iz=0; iz < nz; iz++) {
     1194                double zval = z0 + iz*dmin;
     1195                for (int iy=0; iy < ny; iy++) {
     1196                    double yval = y0 + iy*dmin;
     1197                    for (int ix=0; ix < nx; ix++) {
     1198                        double xval = x0 + ix*dmin;
     1199                        double v = field.value(xval,yval,zval);
     1200
     1201                        if (v != 0.0f && v < nzero_min)
     1202                            {
     1203                                nzero_min = v;
     1204                            }
     1205                        // scale all values [0-1], -1 => out of bounds
     1206                        v = (isnan(v)) ? -1.0 : (v - vmin)/dv;
     1207                        data[ngen] = v;
     1208
     1209                        ngen += 4;
     1210                    }
     1211                }
     1212            }
     1213
     1214            // Compute the gradient of this data.  BE CAREFUL: center
     1215            // calculation on each node to avoid skew in either direction.
     1216            ngen = 0;
     1217            for (int iz=0; iz < nz; iz++) {
     1218                for (int iy=0; iy < ny; iy++) {
     1219                    for (int ix=0; ix < nx; ix++) {
     1220                        // gradient in x-direction
     1221                        double valm1 = (ix == 0) ? 0.0 : data[ngen-1];
     1222                        double valp1 = (ix == nx-1) ? 0.0 : data[ngen+1];
     1223                        if (valm1 < 0 || valp1 < 0) {
     1224                            data[ngen+1] = 0.0;
     1225                        } else {
     1226                            data[ngen+1] = valp1-valm1; // assume dx=1
     1227                            //data[ngen+1] = ((valp1-valm1) + 1) *  0.5; // assume dx=1 (ISO)
     1228                        }
     1229
     1230                        // gradient in y-direction
     1231                        valm1 = (iy == 0) ? 0.0 : data[ngen-4*nx];
     1232                        valp1 = (iy == ny-1) ? 0.0 : data[ngen+4*nx];
     1233                        if (valm1 < 0 || valp1 < 0) {
     1234                            data[ngen+2] = 0.0;
     1235                        } else {
     1236                            data[ngen+2] = valp1-valm1; // assume dy=1
     1237                            //data[ngen+2] = ((valp1-valm1) + 1) *  0.5; // assume dy=1 (ISO)
     1238                        }
     1239
     1240                        // gradient in z-direction
     1241                        valm1 = (iz == 0) ? 0.0 : data[ngen-4*nx*ny];
     1242                        valp1 = (iz == nz-1) ? 0.0 : data[ngen+4*nx*ny];
     1243                        if (valm1 < 0 || valp1 < 0) {
     1244                            data[ngen+3] = 0.0;
     1245                        } else {
     1246                            data[ngen+3] = valp1-valm1; // assume dz=1
     1247                            //data[ngen+3] = ((valp1-valm1) + 1) *  0.5; // assume dz=1 (ISO)
     1248                        }
     1249
     1250                        ngen += 4;
     1251                    }
     1252                }
     1253            }
     1254
     1255/*
     1256            float *cdata = new float[nx*ny*nz];
     1257            int ngen = 0;
     1258            double nzero_min = 0.0;
     1259            for (int iz=0; iz < nz; iz++) {
     1260                double zval = z0 + iz*dmin;
     1261                for (int iy=0; iy < ny; iy++) {
     1262                    double yval = y0 + iy*dmin;
     1263                    for (int ix=0; ix < nx; ix++) {
     1264                        double xval = x0 + ix*dmin;
     1265                        double v = field.value(xval,yval,zval);
     1266
     1267                        if (v != 0.0f && v < nzero_min) {
     1268                            nzero_min = v;
     1269                        }
     1270
     1271                        // scale all values [0-1], -1 => out of bounds
     1272                        v = (isnan(v)) ? -1.0 : v;
     1273
     1274                        cdata[ngen] = v;
     1275                        ++ngen;
     1276                    }
     1277                }
     1278            }
     1279
     1280            float* data = computeGradient(cdata, nx, ny, nz, field.valueMin(),
     1281                                          field.valueMax());
     1282
     1283            for (int i=0; i<nx*ny*nz; i++) {
     1284                fprintf(stderr,"enddata[%i] = %lg\n",i,data[i]);
     1285                fflush(stderr);
     1286            }
     1287
     1288            fprintf(stdout,"End Data Stats index = %i\n",index);
     1289            fprintf(stdout,"nx = %i ny = %i nz = %i\n",nx,ny,nz);
     1290            fprintf(stdout,"dx = %lg dy = %lg dz = %lg\n",dx,dy,dz);
     1291            fprintf(stdout,"dataMin = %lg\tdataMax = %lg\tnzero_min = %lg\n", field.valueMin(),field.valueMax(),nzero_min);
     1292            fflush(stdout);
     1293            */
     1294
     1295            Volume *volPtr;
     1296            volPtr = NanoVis::load_volume(index, nx, ny, nz, 4, data,
     1297            field.valueMin(), field.valueMax(), nzero_min);
     1298            volPtr->xAxis.SetRange(field.rangeMin(Rappture::xaxis),
     1299                   field.rangeMax(Rappture::xaxis));
     1300            volPtr->yAxis.SetRange(field.rangeMin(Rappture::yaxis),
     1301                   field.rangeMax(Rappture::yaxis));
     1302            volPtr->zAxis.SetRange(field.rangeMin(Rappture::zaxis),
     1303                   field.rangeMax(Rappture::zaxis));
     1304            volPtr->wAxis.SetRange(field.valueMin(), field.valueMax());
     1305            volPtr->update_pending = true;
     1306            // TBD..
     1307            // POINTSET
     1308            /*
     1309              PointSet* pset = new PointSet();
     1310              pset->initialize(volume[index], (float*) data);
     1311              pset->setVisible(true);
     1312              NanoVis::pointSet.push_back(pset);
     1313              updateColor(pset);
     1314              NanoVis::volume[index]->pointsetIndex = NanoVis::pointSet.size() - 1;
     1315            */
     1316
     1317            delete [] data;
     1318
     1319        } else {
     1320            Rappture::Mesh1D zgrid(z0, z0+nz*dz, nz);
     1321            Rappture::FieldPrism3D field(xymesh, zgrid);
     1322
     1323            double dval;
     1324            int nread = 0;
     1325            int ixy = 0;
     1326            int iz = 0;
     1327            while (!fin.eof() && nread < npts) {
     1328                fin >> dval;
     1329                if (fin.fail()) {
     1330                    char mesg[256];
     1331                    sprintf(mesg,"after %d of %d points: can't read number",
     1332                            nread, npts);
     1333                    return result.error(mesg);
     1334                } else {
     1335                    int nid = nxy*iz + ixy;
     1336                    field.define(nid, dval);
     1337
     1338                    nread++;
     1339                    if (++iz >= nz) {
     1340                        iz = 0;
     1341                        ixy++;
     1342                    }
     1343                }
     1344            }
     1345
     1346            // make sure that we read all of the expected points
     1347            if (nread != nxy*nz) {
     1348                char mesg[256];
     1349                sprintf(mesg,"inconsistent data: expected %d points but found %d points", nxy*nz, nread);
     1350                return result.error(mesg);
     1351            }
     1352
     1353            // figure out a good mesh spacing
     1354            int nsample = 30;
     1355            x0 = field.rangeMin(Rappture::xaxis);
     1356            dx = field.rangeMax(Rappture::xaxis) - field.rangeMin(Rappture::xaxis);
     1357            y0 = field.rangeMin(Rappture::yaxis);
     1358            dy = field.rangeMax(Rappture::yaxis) - field.rangeMin(Rappture::yaxis);
     1359            z0 = field.rangeMin(Rappture::zaxis);
     1360            dz = field.rangeMax(Rappture::zaxis) - field.rangeMin(Rappture::zaxis);
     1361            double dmin = pow((dx*dy*dz)/(nsample*nsample*nsample), 0.333);
     1362
     1363            nx = (int)ceil(dx/dmin);
     1364            ny = (int)ceil(dy/dmin);
     1365            nz = (int)ceil(dz/dmin);
     1366#ifndef NV40
     1367            // must be an even power of 2 for older cards
     1368            nx = (int)pow(2.0, ceil(log10((double)nx)/log10(2.0)));
     1369            ny = (int)pow(2.0, ceil(log10((double)ny)/log10(2.0)));
     1370            nz = (int)pow(2.0, ceil(log10((double)nz)/log10(2.0)));
     1371#endif
     1372            float *data = new float[4*nx*ny*nz];
     1373
     1374            double vmin = field.valueMin();
     1375            double dv = field.valueMax() - field.valueMin();
     1376            if (dv == 0.0) { dv = 1.0; }
     1377
     1378            // generate the uniformly sampled data that we need for a volume
     1379            int ngen = 0;
     1380            double nzero_min = 0.0;
     1381            for (iz=0; iz < nz; iz++) {
     1382                double zval = z0 + iz*dmin;
     1383                for (int iy=0; iy < ny; iy++) {
     1384                    double yval = y0 + iy*dmin;
     1385                    for (int ix=0; ix < nx; ix++) {
     1386                        double xval = x0 + ix*dmin;
     1387                        double v = field.value(xval,yval,zval);
     1388
     1389                        if (v != 0.0f && v < nzero_min)
     1390                            {
     1391                                nzero_min = v;
     1392                            }
     1393                        // scale all values [0-1], -1 => out of bounds
     1394                        v = (isnan(v)) ? -1.0 : (v - vmin)/dv;
     1395                        data[ngen] = v;
     1396
     1397                        ngen += 4;
     1398                    }
     1399                }
     1400            }
     1401
     1402            // Compute the gradient of this data.  BE CAREFUL: center
     1403            // calculation on each node to avoid skew in either direction.
     1404            ngen = 0;
     1405            for (int iz=0; iz < nz; iz++) {
     1406                for (int iy=0; iy < ny; iy++) {
     1407                    for (int ix=0; ix < nx; ix++) {
     1408                        // gradient in x-direction
     1409                        double valm1 = (ix == 0) ? 0.0 : data[ngen-1];
     1410                        double valp1 = (ix == nx-1) ? 0.0 : data[ngen+1];
     1411                        if (valm1 < 0 || valp1 < 0) {
     1412                            data[ngen+1] = 0.0;
     1413                        } else {
     1414                            data[ngen+1] = valp1-valm1; // assume dx=1
     1415                            //data[ngen+1] = ((valp1-valm1) + 1) *  0.5; // assume dx=1 (ISO)
     1416                        }
     1417
     1418                        // gradient in y-direction
     1419                        valm1 = (iy == 0) ? 0.0 : data[ngen-4*nx];
     1420                        valp1 = (iy == ny-1) ? 0.0 : data[ngen+4*nx];
     1421                        if (valm1 < 0 || valp1 < 0) {
     1422                            data[ngen+2] = 0.0;
     1423                        } else {
     1424                            data[ngen+2] = valp1-valm1; // assume dy=1
     1425                            //data[ngen+2] = ((valp1-valm1) + 1) *  0.5; // assume dy=1 (ISO)
     1426                        }
     1427
     1428                        // gradient in z-direction
     1429                        valm1 = (iz == 0) ? 0.0 : data[ngen-4*nx*ny];
     1430                        valp1 = (iz == nz-1) ? 0.0 : data[ngen+4*nx*ny];
     1431                        if (valm1 < 0 || valp1 < 0) {
     1432                            data[ngen+3] = 0.0;
     1433                        } else {
     1434                            data[ngen+3] = valp1-valm1; // assume dz=1
     1435                            //data[ngen+3] = ((valp1-valm1) + 1) *  0.5; // assume dz=1 (ISO)
     1436                        }
     1437
     1438                        ngen += 4;
     1439                    }
     1440                }
     1441            }
     1442
     1443            Volume *volPtr;
     1444            volPtr = NanoVis::load_volume(index, nx, ny, nz, 4, data,
     1445            field.valueMin(), field.valueMax(), nzero_min);
     1446            volPtr->xAxis.SetRange(field.rangeMin(Rappture::xaxis),
     1447                   field.rangeMax(Rappture::xaxis));
     1448            volPtr->yAxis.SetRange(field.rangeMin(Rappture::yaxis),
     1449                   field.rangeMax(Rappture::yaxis));
     1450            volPtr->zAxis.SetRange(field.rangeMin(Rappture::zaxis),
     1451                   field.rangeMax(Rappture::zaxis));
     1452            volPtr->wAxis.SetRange(field.valueMin(), field.valueMax());
     1453            volPtr->update_pending = true;
     1454            // TBD..
     1455            // POINTSET
     1456            /*
     1457              PointSet* pset = new PointSet();
     1458              pset->initialize(volume[index], (float*) data);
     1459              pset->setVisible(true);
     1460              NanoVis::pointSet.push_back(pset);
     1461              updateColor(pset);
     1462              NanoVis::volume[index]->pointsetIndex = NanoVis::pointSet.size() - 1;
     1463            */
     1464
     1465
     1466            delete [] data;
     1467        }
     1468    } else {
     1469        return result.error("data not found in stream");
     1470    }
     1471
     1472    //
     1473    // Center this new volume on the origin.
     1474    //
     1475    float dx0 = -0.5;
     1476    float dy0 = -0.5*dy/dx;
     1477    float dz0 = -0.5*dz/dx;
     1478    NanoVis::volume[index]->move(Vector3(dx0, dy0, dz0));
     1479    return result;
     1480}
Note: See TracChangeset for help on using the changeset viewer.