Changeset 927
- Timestamp:
- Mar 6, 2008 4:01:20 PM (16 years ago)
- Location:
- trunk/vizservers/nanovis
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/vizservers/nanovis/Command.cpp
r923 r927 1 1 2 2 /* 3 3 * ---------------------------------------------------------------------- … … 40 40 */ 41 41 42 #define ISO_TEST 143 #define PLANE_CMD 044 #define __TEST_CODE__ 045 // FOR testing new functions46 #define _LOCAL_ZINC_TEST_ 047 48 42 #include <tcl.h> 49 43 #include "Trace.h" … … 79 73 #include <NvLIC.h> 80 74 75 #define ISO_TEST 1 76 #define PLANE_CMD 0 77 #define __TEST_CODE__ 0 78 // FOR testing new functions 79 #define _LOCAL_ZINC_TEST_ 0 80 81 81 #if _LOCAL_ZINC_TEST_ 82 82 #include "Test.h" … … 96 96 extern Rappture::Outcome load_volume_stream(int index, std::iostream& fin); 97 97 extern Rappture::Outcome load_volume_stream_odx(int index, const char *buf, 98 98 int nBytes); 99 99 extern Rappture::Outcome load_volume_stream2(int index, std::iostream& fin); 100 100 extern void load_volume(int index, int width, int height, int depth, 101 102 101 int n_component, float* data, double vmin, double vmax, 102 double nzero_min); 103 103 extern void load_vector_stream(int index, std::istream& fin); 104 104 … … 151 151 static Tcl_ObjCmdProc VolumeCmd; 152 152 153 static bool 154 GetBooleanFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr, bool *boolPtr) 155 { 156 int value; 157 158 if (Tcl_GetBooleanFromObj(interp, objPtr, &value) != TCL_OK) { 159 return TCL_ERROR; 160 } 161 *boolPtr = (bool)value; 162 return TCL_OK; 163 } 164 153 165 static int 154 166 GetFloatFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr, float *valuePtr) … … 165 177 static int 166 178 GetCullMode(Tcl_Interp *interp, Tcl_Obj *objPtr, 167 179 graphics::RenderContext::CullMode *modePtr) 168 180 { 169 181 char *string = Tcl_GetString(objPtr); … … 176 188 } else { 177 189 Tcl_AppendResult(interp, "invalid cull mode \"", string, 178 190 "\": should be front, back, or none\"", (char *)NULL); 179 191 return TCL_ERROR; 180 192 } … … 210 222 } else { 211 223 Tcl_AppendResult(interp, "invalid polygon mode \"", string, 212 224 "\": should be wireframe or fill\"", (char *)NULL); 213 225 return TCL_ERROR; 214 226 } … … 279 291 if (objc != 7) { 280 292 Tcl_AppendResult(interp, 281 282 293 "wrong # of values: should be xMin yMin xMax yMax xNum yNum heights", 294 (char *)NULL); 283 295 return NULL; 284 296 } … … 309 321 if (heights == NULL) { 310 322 Tcl_AppendResult(interp, "can't allocate array of heights", 311 323 (char *)NULL); 312 324 return NULL; 313 325 } … … 353 365 (NanoVis::heightMap[mapIndex] == NULL)) { 354 366 Tcl_AppendResult(interp, "invalid heightmap index \"", 355 367 Tcl_GetString(objPtr), "\"", (char *)NULL); 356 368 return TCL_ERROR; 357 369 } … … 382 394 if (index < 0) { 383 395 Tcl_AppendResult(interp, "can't have negative index \"", 384 396 Tcl_GetString(objPtr), "\"", (char*)NULL); 385 397 return TCL_ERROR; 386 398 } … … 418 430 if (vol == NULL) { 419 431 Tcl_AppendResult(interp, "no volume defined for index \"", 420 432 Tcl_GetString(objPtr), "\"", (char*)NULL); 421 433 return TCL_ERROR; 422 434 } … … 440 452 static int 441 453 GetVolumeIndices(Tcl_Interp *interp, int objc, Tcl_Obj *CONST *objv, 442 454 vector<unsigned int>* vectorPtr) 443 455 { 444 456 if (objc == 0) { … … 465 477 static int 466 478 GetIndices(Tcl_Interp *interp, int objc, Tcl_Obj *CONST *objv, 467 479 vector<unsigned int>* vectorPtr) 468 480 { 469 481 for (int n = 0; n < objc; n++) { … … 475 487 if (index < 0) { 476 488 Tcl_AppendResult(interp, "can't have negative index \"", 477 489 Tcl_GetString(objv[n]), "\"", (char *)NULL); 478 490 return TCL_ERROR; 479 491 } … … 499 511 static int 500 512 GetVolumes(Tcl_Interp *interp, int objc, Tcl_Obj *CONST *objv, 501 513 vector<Volume *>* vectorPtr) 502 514 { 503 515 if (objc == 0) { … … 508 520 } 509 521 } else { 510 for ( int n = 0; n < objc; n++) {522 for (unsigned int n = 0; n < objc; n++) { 511 523 Volume *volPtr; 512 524 … … 553 565 } 554 566 Tcl_AppendResult(interp, "bad axis \"", string, 555 567 "\": should be x, y, or z", (char*)NULL); 556 568 return TCL_ERROR; 557 569 } … … 617 629 if (objc < 3) { 618 630 Tcl_AppendResult(interp, "missing color values\": ", 619 631 "should list of R G B values 0.0 - 1.0", (char*)NULL); 620 632 return TCL_ERROR; 621 633 } … … 654 666 if (ferror(stdin)) { 655 667 Tcl_AppendResult(interp, "while reading data stream: ", 656 668 Tcl_PosixError(interp), (char*)NULL); 657 669 return TCL_ERROR; 658 670 } 659 671 if (feof(stdin)) { 660 672 Tcl_AppendResult(interp, "premature EOF while reading data stream", 661 673 (char*)NULL); 662 674 return TCL_ERROR; 663 675 } … … 717 729 718 730 static Rappture::CmdSpec cameraOps[] = 719 {720 721 722 723 };731 { 732 {"aim", 2, CameraAimOp, 5, 5, "x y z",}, 733 {"angle", 2, CameraAngleOp, 5, 5, "xAngle yAngle zAngle",}, 734 {"zoom", 1, CameraZoomOp, 3, 3, "factor",}, 735 }; 724 736 static int nCameraOps = NumCmdSpecs(cameraOps); 725 737 … … 743 755 744 756 proc = Rappture::GetOpFromObj(interp, nCameraOps, cameraOps, 745 757 Rappture::CMDSPEC_ARG1, objc, objv, 0); 746 758 if (proc == NULL) { 747 759 return TCL_ERROR; … … 763 775 // TBD 764 776 /* 765 Volume* vol = NanoVis::volume[0];766 TransferFunction* tf;767 tf = NanoVis::vol_renderer->get_volume_shading(vol);768 if (tf != NULL)769 {770 771 772 773 774 775 776 777 778 777 Volume* vol = NanoVis::volume[0]; 778 TransferFunction* tf; 779 tf = NanoVis::vol_renderer->get_volume_shading(vol); 780 if (tf != NULL) 781 { 782 float data[512]; 783 784 for (int i=0; i < 256; i++) { 785 data[i] = data[i+256] = (float)(i/255.0); 786 } 787 Texture2D* plane = new Texture2D(256, 2, GL_FLOAT, GL_LINEAR, 1, data); 788 NanoVis::color_table_renderer->render(1024, 1024, plane, tf, vol->range_min(), 789 vol->range_max()); 790 delete plane; 779 791 780 }792 } 781 793 */ 782 794 #endif … … 821 833 Tcl_Obj *CONST *objv) 822 834 { 823 intstate;824 if ( Tcl_GetBooleanFromObj(interp, objv[2], &state) != TCL_OK) {835 bool state; 836 if (GetBooleanFromObj(interp, objv[2], &state) != TCL_OK) { 825 837 return TCL_ERROR; 826 838 } … … 850 862 851 863 static Rappture::CmdSpec cutplaneOps[] = 852 {853 854 855 };864 { 865 {"position", 1, CutplanePositionOp, 4, 0, "bool axis ?indices?",}, 866 {"state", 1, CutplaneStateOp, 4, 0, "relval axis ?indices?",}, 867 }; 856 868 static int nCutplaneOps = NumCmdSpecs(cutplaneOps); 857 869 … … 877 889 878 890 proc = Rappture::GetOpFromObj(interp, nCutplaneOps, cutplaneOps, 879 891 Rappture::CMDSPEC_ARG1, objc, objv, 0); 880 892 if (proc == NULL) { 881 893 return TCL_ERROR; … … 900 912 if (objc != 4) { 901 913 Tcl_AppendResult(interp, "wrong # args: should be \"", 902 914 Tcl_GetString(objv[0]), " volIndex width height\"", (char*)NULL); 903 915 return TCL_ERROR; 904 916 } … … 912 924 if (tf == NULL) { 913 925 Tcl_AppendResult(interp, "no transfer function defined for volume \"", 914 926 Tcl_GetString(objv[1]), "\"", (char*)NULL); 915 927 return TCL_ERROR; 916 928 } … … 945 957 if (objc != 3) { 946 958 Tcl_AppendResult(interp, "wrong # args: should be \"", 947 959 Tcl_GetString(objv[0]), " width height\"", (char*)NULL); 948 960 return TCL_ERROR; 949 961 } … … 973 985 if (objc < 2) { 974 986 Tcl_AppendResult(interp, "wrong # args: should be \"", 975 987 Tcl_GetString(objv[0]), " option arg arg...\"", (char*)NULL); 976 988 return TCL_ERROR; 977 989 } … … 982 994 if (objc != 5) { 983 995 Tcl_AppendResult(interp, "wrong # args: should be \"", 984 985 996 Tcl_GetString(objv[0]), " define name colormap alphamap\"", 997 (char*)NULL); 986 998 return TCL_ERROR; 987 999 } … … 999 1011 if ((cmapc % 4) != 0) { 1000 1012 Tcl_AppendResult(interp, "bad colormap in transfunc: should be ", 1001 1013 "{ v r g b ... }", (char*)NULL); 1002 1014 return TCL_ERROR; 1003 1015 } … … 1007 1019 if ((wmapc % 2) != 0) { 1008 1020 Tcl_AppendResult(interp, "wrong # elements in alphamap: should be ", 1009 1021 " { v w ... }", (char*)NULL); 1010 1022 return TCL_ERROR; 1011 1023 } … … 1020 1032 if ((vals[j] < 0.0) || (vals[j] > 1.0)) { 1021 1033 Tcl_AppendResult(interp, "bad value \"", cmapv[i+j], 1022 1034 "\": should be in the range 0-1", (char*)NULL); 1023 1035 return TCL_ERROR; 1024 1036 } … … 1038 1050 if ((vals[j] < 0.0) || (vals[j] > 1.0)) { 1039 1051 Tcl_AppendResult(interp, "bad value \"", wmapv[i+j], 1040 1052 "\": should be in the range 0-1", (char*)NULL); 1041 1053 return TCL_ERROR; 1042 1054 } … … 1065 1077 } else { 1066 1078 Tcl_AppendResult(interp, "bad option \"", string, 1067 1079 "\": should be define", (char*)NULL); 1068 1080 return TCL_ERROR; 1069 1081 } … … 1085 1097 if (objc != 2) { 1086 1098 Tcl_AppendResult(interp, "wrong # args: should be \"", 1087 1099 Tcl_GetString(objv[0]), " x|y|z|-x|-y|-z\"", (char*)NULL); 1088 1100 return TCL_ERROR; 1089 1101 } … … 1098 1110 } 1099 1111 1100 #ifdef notdef 1112 #ifndef notdef 1113 1114 static int 1115 VolumeAnimationCaptureOp(ClientData cdata, Tcl_Interp *interp, int objc, 1116 Tcl_Obj *CONST *objv) 1117 { 1118 int total; 1119 if (Tcl_GetIntFromObj(interp, objv[3], &total) != TCL_OK) { 1120 return TCL_ERROR; 1121 } 1122 VolumeInterpolator* interpolator; 1123 interpolator = NanoVis::vol_renderer->getVolumeInterpolator(); 1124 interpolator->start(); 1125 if (interpolator->is_started()) { 1126 char *fileName = (objc < 5) ? NULL : Tcl_GetString(objv[4]); 1127 for (int frame_num = 0; frame_num < total; ++frame_num) { 1128 float fraction; 1129 1130 fraction = ((float)frame_num) / (total - 1); 1131 Trace("fraction : %f\n", fraction); 1132 //interpolator->update(((float)frame_num) / (total - 1)); 1133 interpolator->update(fraction); 1134 1135 NanoVis::offscreen_buffer_capture(); //enable offscreen render 1136 1137 NanoVis::display(); 1138 NanoVis::read_screen(); 1139 1140 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 1141 1142 NanoVis::bmp_write_to_file(frame_num, fileName); 1143 } 1144 } 1145 return TCL_OK; 1146 } 1147 1148 static int 1149 VolumeAnimationClearOp(ClientData cdata, Tcl_Interp *interp, int objc, 1150 Tcl_Obj *CONST *objv) 1151 { 1152 NanoVis::vol_renderer->clearAnimatedVolumeInfo(); 1153 return TCL_OK; 1154 } 1155 1156 static int 1157 VolumeAnimationStartOp(ClientData cdata, Tcl_Interp *interp, int objc, 1158 Tcl_Obj *CONST *objv) 1159 { 1160 NanoVis::vol_renderer->startVolumeAnimation(); 1161 return TCL_OK; 1162 } 1163 1164 static int 1165 VolumeAnimationStopOp(ClientData cdata, Tcl_Interp *interp, int objc, 1166 Tcl_Obj *CONST *objv) 1167 { 1168 NanoVis::vol_renderer->stopVolumeAnimation(); 1169 return TCL_OK; 1170 } 1171 1172 static int 1173 VolumeAnimationVolumesOp(ClientData cdata, Tcl_Interp *interp, int objc, 1174 Tcl_Obj *CONST *objv) 1175 { 1176 vector<unsigned int> ivol; 1177 if (GetVolumeIndices(interp, objc - 3, objv + 3, &ivol) != TCL_OK) { 1178 return TCL_ERROR; 1179 } 1180 Trace("parsing volume index\n"); 1181 vector<unsigned int>::iterator iter; 1182 for (iter = ivol.begin(); iter != ivol.end(); iter++) { 1183 Trace("index: %d\n", *iter); 1184 NanoVis::vol_renderer->addAnimatedVolume(NanoVis::volume[*iter], *iter); 1185 } 1186 return TCL_OK; 1187 } 1188 1101 1189 static Rappture::CmdSpec volumeAnimationOps[] = 1102 { 1103 {"capture", 2, VolumeAnimationCaptureOp, 4, 0, "value ?indices?",}, 1104 {"clear", 2, VolumeAnimationClearOp, 4, 0, "value ?indices?",}, 1105 {"start", 3, VolumeAnimationStartOp, 4, 0, "value ?indices?",}, 1106 {"stop", 3, VolumeAnimationStopOp, 4, 0, "bool ?indices?",}, 1107 {"volumes", 1, VolumeAnimationVolumesOp, 4, 0, "funcName ?indices?",}, 1108 }; 1190 { 1191 {"capture", 2, VolumeAnimationCaptureOp, 4, 5, "numframes ?filename?",}, 1192 {"clear", 2, VolumeAnimationClearOp, 3, 3, "",}, 1193 {"start", 3, VolumeAnimationStartOp, 3, 3, "",}, 1194 {"stop", 3, VolumeAnimationStopOp, 3, 3, "",}, 1195 {"volumes", 1, VolumeAnimationVolumesOp, 3, 0, "?indices?",}, 1196 }; 1197 1109 1198 static int nVolumeAnimationOps = NumCmdSpecs(volumeAnimationOps); 1199 1200 static int 1201 VolumeAnimationOp(ClientData cdata, Tcl_Interp *interp, int objc, 1202 Tcl_Obj *CONST *objv) 1203 { 1204 Tcl_ObjCmdProc *proc; 1205 1206 proc = Rappture::GetOpFromObj(interp, nVolumeAnimationOps, volumeAnimationOps, 1207 Rappture::CMDSPEC_ARG2, objc, objv, 0); 1208 if (proc == NULL) { 1209 return TCL_ERROR; 1210 } 1211 return (*proc) (cdata, interp, objc, objv); 1212 } 1213 1110 1214 1111 1215 static int … … 1260 1364 Tcl_Obj *CONST *objv) 1261 1365 { 1262 intstate;1263 if ( Tcl_GetBooleanFromObj(interp, objv[3], &state) != TCL_OK) {1366 bool state; 1367 if (GetBooleanFromObj(interp, objv[3], &state) != TCL_OK) { 1264 1368 return TCL_ERROR; 1265 1369 } … … 1283 1387 1284 1388 static Rappture::CmdSpec volumeDataOps[] = 1285 {1286 1287 1288 };1389 { 1390 {"follows", 1, VolumeDataFollowsOp, 4, 4, "size",}, 1391 {"state", 1, VolumeDataStateOp, 4, 0, "bool ?indices?",}, 1392 }; 1289 1393 static int nVolumeDataOps = NumCmdSpecs(volumeDataOps); 1290 1394 1291 1395 static int 1396 VolumeDataOp(ClientData cdata, Tcl_Interp *interp, int objc, 1397 Tcl_Obj *CONST *objv) 1398 { 1399 Tcl_ObjCmdProc *proc; 1400 1401 proc = Rappture::GetOpFromObj(interp, nVolumeDataOps, volumeDataOps, 1402 Rappture::CMDSPEC_ARG2, objc, objv, 0); 1403 if (proc == NULL) { 1404 return TCL_ERROR; 1405 } 1406 return (*proc) (cdata, interp, objc, objv); 1407 } 1408 1409 static int 1410 VolumeOutlineColorOp(ClientData cdata, Tcl_Interp *interp, int objc, 1411 Tcl_Obj *CONST *objv) 1412 { 1413 float rgb[3]; 1414 if (GetColor(interp, objc - 3, objv + 3, rgb) != TCL_OK) { 1415 return TCL_ERROR; 1416 } 1417 vector<Volume *> ivol; 1418 if (GetVolumes(interp, objc - 6, objv + 6, &ivol) != TCL_OK) { 1419 return TCL_ERROR; 1420 } 1421 vector<Volume *>::iterator iter; 1422 for (iter = ivol.begin(); iter != ivol.end(); iter++) { 1423 (*iter)->set_outline_color(rgb); 1424 } 1425 return TCL_OK; 1426 } 1427 1428 static int 1292 1429 VolumeOutlineStateOp(ClientData cdata, Tcl_Interp *interp, int objc, 1293 Tcl_Obj *CONST *objv) 1294 { 1295 return TCL_OK; 1296 } 1430 Tcl_Obj *CONST *objv) 1431 { 1432 bool state; 1433 if (GetBooleanFromObj(interp, objv[3], &state) != TCL_OK) { 1434 return TCL_ERROR; 1435 } 1436 vector<Volume *> ivol; 1437 if (GetVolumes(interp, objc - 4, objv + 4, &ivol) != TCL_OK) { 1438 return TCL_ERROR; 1439 } 1440 if (state) { 1441 vector<Volume *>::iterator iter; 1442 for (iter = ivol.begin(); iter != ivol.end(); iter++) { 1443 (*iter)->enable_outline(); 1444 } 1445 } else { 1446 vector<Volume *>::iterator iter; 1447 for (iter = ivol.begin(); iter != ivol.end(); iter++) { 1448 (*iter)->disable_outline(); 1449 } 1450 } 1451 return TCL_OK; 1452 } 1453 1454 static int 1455 VolumeOutlineVisibleOp(ClientData cdata, Tcl_Interp *interp, int objc, 1456 Tcl_Obj *CONST *objv) 1457 { 1458 bool visible; 1459 if (GetBooleanFromObj(interp, objv[3], &visible) != TCL_OK) { 1460 return TCL_ERROR; 1461 } 1462 if (!visible) { 1463 for (int i = 0; i < NanoVis::n_volumes; ++i) { 1464 if (NanoVis::volume[i]) { 1465 NanoVis::volume[i]->disable_outline(); 1466 } 1467 } 1468 } else { 1469 for (int i = 0; i < NanoVis::n_volumes; ++i) { 1470 if (NanoVis::volume[i]) { 1471 NanoVis::volume[i]->enable_outline(); 1472 } 1473 } 1474 } 1475 return TCL_OK; 1476 } 1477 1297 1478 static Rappture::CmdSpec volumeOutlineOps[] = 1298 {1299 1300 1301 1302 };1479 { 1480 {"color", 1, VolumeOutlineColorOp, 6, 0, "r g b ?indices?",}, 1481 {"state", 1, VolumeOutlineStateOp, 4, 0, "bool ?indices?",}, 1482 {"visible", 1, VolumeOutlineVisibleOp, 4, 0, "bool ?indices?",}, 1483 }; 1303 1484 static int nVolumeOutlineOps = NumCmdSpecs(volumeOutlineOps); 1304 1485 1486 static int 1487 VolumeOutlineOp(ClientData cdata, Tcl_Interp *interp, int objc, 1488 Tcl_Obj *CONST *objv) 1489 { 1490 Tcl_ObjCmdProc *proc; 1491 1492 proc = Rappture::GetOpFromObj(interp, nVolumeOutlineOps, volumeOutlineOps, 1493 Rappture::CMDSPEC_ARG2, objc, objv, 0); 1494 if (proc == NULL) { 1495 return TCL_ERROR; 1496 } 1497 return (*proc) (cdata, interp, objc, objv); 1498 } 1499 1500 static int 1501 VolumeShadingDiffuseOp(ClientData cdata, Tcl_Interp *interp, int objc, 1502 Tcl_Obj *CONST *objv) 1503 { 1504 float diffuse; 1505 if (GetFloatFromObj(interp, objv[3], &diffuse) != TCL_OK) { 1506 return TCL_ERROR; 1507 } 1508 vector<Volume *> ivol; 1509 if (GetVolumes(interp, objc - 4, objv + 4, &ivol) != TCL_OK) { 1510 return TCL_ERROR; 1511 } 1512 vector<Volume *>::iterator iter; 1513 for (iter = ivol.begin(); iter != ivol.end(); iter++) { 1514 (*iter)->set_diffuse(diffuse); 1515 } 1516 return TCL_OK; 1517 } 1518 1519 static int 1520 VolumeShadingIsosurfaceOp(ClientData cdata, Tcl_Interp *interp, int objc, 1521 Tcl_Obj *CONST *objv) 1522 { 1523 bool iso_surface; 1524 if (GetBooleanFromObj(interp, objv[3], &iso_surface) != TCL_OK) { 1525 return TCL_ERROR; 1526 } 1527 vector<Volume *> ivol; 1528 if (GetVolumes(interp, objc - 4, objv + 4, &ivol) != TCL_OK) { 1529 return TCL_ERROR; 1530 } 1531 vector<Volume *>::iterator iter; 1532 for (iter = ivol.begin(); iter != ivol.end(); iter++) { 1533 (*iter)->set_isosurface(iso_surface); 1534 } 1535 return TCL_OK; 1536 } 1537 1538 static int 1539 VolumeShadingOpacityOp(ClientData cdata, Tcl_Interp *interp, int objc, 1540 Tcl_Obj *CONST *objv) 1541 { 1542 float opacity; 1543 if (GetFloatFromObj(interp, objv[3], &opacity) != TCL_OK) { 1544 return TCL_ERROR; 1545 } 1546 vector<Volume *> ivol; 1547 if (GetVolumes(interp, objc - 4, objv + 4, &ivol) != TCL_OK) { 1548 return TCL_ERROR; 1549 } 1550 vector<Volume *>::iterator iter; 1551 for (iter = ivol.begin(); iter != ivol.end(); iter++) { 1552 (*iter)->set_opacity_scale(opacity); 1553 } 1554 return TCL_OK; 1555 } 1556 1557 static int 1558 VolumeShadingSpecularOp(ClientData cdata, Tcl_Interp *interp, int objc, 1559 Tcl_Obj *CONST *objv) 1560 { 1561 float specular; 1562 if (GetFloatFromObj(interp, objv[3], &specular) != TCL_OK) { 1563 return TCL_ERROR; 1564 } 1565 vector<Volume *> ivol; 1566 if (GetVolumes(interp, objc - 4, objv + 4, &ivol) != TCL_OK) { 1567 return TCL_ERROR; 1568 } 1569 vector<Volume *>::iterator iter; 1570 for (iter = ivol.begin(); iter != ivol.end(); iter++) { 1571 (*iter)->set_specular(specular); 1572 } 1573 return TCL_OK; 1574 } 1575 1576 static int 1577 VolumeShadingTransFuncOp(ClientData cdata, Tcl_Interp *interp, int objc, 1578 Tcl_Obj *CONST *objv) 1579 { 1580 TransferFunction *tf; 1581 char *name = Tcl_GetString(objv[3]); 1582 tf = NanoVis::get_transfunc(name); 1583 if (tf == NULL) { 1584 Tcl_AppendResult(interp, "transfer function \"", name, 1585 "\" is not defined", (char*)NULL); 1586 return TCL_ERROR; 1587 } 1588 vector<Volume *> ivol; 1589 if (GetVolumes(interp, objc - 4, objv + 4, &ivol) != TCL_OK) { 1590 return TCL_ERROR; 1591 } 1592 vector<Volume *>::iterator iter; 1593 for (iter = ivol.begin(); iter != ivol.end(); iter++) { 1594 NanoVis::vol_renderer->shade_volume(*iter, tf); 1595 #ifdef POINTSET 1596 // TBD.. 1597 // POINTSET 1598 if ((*iter)->pointsetIndex != -1) { 1599 g_pointSet[(*iter)->pointsetIndex]->updateColor(tf->getData(), 256); 1600 } 1601 #endif /*POINTSET*/ 1602 } 1603 return TCL_OK; 1604 } 1605 1305 1606 static Rappture::CmdSpec volumeShadingOps[] = 1306 {1307 1308 1309 1310 1311 1312 };1607 { 1608 {"diffuse", 1, VolumeShadingDiffuseOp, 4, 0, "value ?indices?",}, 1609 {"isosurface", 1, VolumeShadingIsosurfaceOp, 4, 0, "bool ?indices?",}, 1610 {"opacity", 1, VolumeShadingOpacityOp, 4, 0, "value ?indices?",}, 1611 {"specular", 1, VolumeShadingSpecularOp, 4, 0, "value ?indices?",}, 1612 {"transfunc", 1, VolumeShadingTransFuncOp, 4, 0, "funcName ?indices?",}, 1613 }; 1313 1614 static int nVolumeShadingOps = NumCmdSpecs(volumeShadingOps); 1314 1615 1616 static int 1617 VolumeShadingOp(ClientData cdata, Tcl_Interp *interp, int objc, 1618 Tcl_Obj *CONST *objv) 1619 { 1620 Tcl_ObjCmdProc *proc; 1621 1622 proc = Rappture::GetOpFromObj(interp, nVolumeShadingOps, volumeShadingOps, 1623 Rappture::CMDSPEC_ARG2, objc, objv, 0); 1624 if (proc == NULL) { 1625 return TCL_ERROR; 1626 } 1627 return (*proc) (cdata, interp, objc, objv); 1628 } 1629 1630 static int 1631 VolumeAxisOp(ClientData cdata, Tcl_Interp *interp, int objc, 1632 Tcl_Obj *CONST *objv) 1633 { 1634 char *string = Tcl_GetString(objv[2]); 1635 char c; 1636 c = string[0]; 1637 if ((c == 'l') && (strcmp(string, "label") == 0)) { 1638 int axis; 1639 if (GetAxisFromObj(interp, objv[3], &axis) != TCL_OK) { 1640 return TCL_ERROR; 1641 } 1642 vector<Volume *> ivol; 1643 if (GetVolumes(interp, objc - 5, objv + 5, &ivol) != TCL_OK) { 1644 return TCL_ERROR; 1645 } 1646 vector<Volume *>::iterator iter; 1647 char *label; 1648 label = Tcl_GetString(objv[4]); 1649 for (iter = ivol.begin(); iter != ivol.end(); iter++) { 1650 (*iter)->set_label(axis, label); 1651 } 1652 } else { 1653 Tcl_AppendResult(interp, "bad option \"", string, 1654 "\": should be label", (char*)NULL); 1655 return TCL_ERROR; 1656 } 1657 return TCL_OK; 1658 } 1659 1660 static int 1661 VolumeStateOp(ClientData cdata, Tcl_Interp *interp, int objc, 1662 Tcl_Obj *CONST *objv) 1663 { 1664 bool state; 1665 if (GetBooleanFromObj(interp, objv[2], &state) != TCL_OK) { 1666 return TCL_ERROR; 1667 } 1668 vector<Volume *> ivol; 1669 if (GetVolumes(interp, objc - 3, objv + 3, &ivol) != TCL_OK) { 1670 return TCL_ERROR; 1671 } 1672 if (state) { 1673 vector<Volume *>::iterator iter; 1674 for (iter = ivol.begin(); iter != ivol.end(); iter++) { 1675 (*iter)->enable(); 1676 } 1677 } else { 1678 vector<Volume *>::iterator iter; 1679 for (iter = ivol.begin(); iter != ivol.end(); iter++) { 1680 (*iter)->disable(); 1681 } 1682 } 1683 return TCL_OK; 1684 } 1685 1686 static int 1687 VolumeTestOp(ClientData cdata, Tcl_Interp *interp, int objc, 1688 Tcl_Obj *CONST *objv) 1689 { 1690 NanoVis::volume[1]->disable_data(); 1691 NanoVis::volume[1]->disable(); 1692 return TCL_OK; 1693 } 1694 1315 1695 static Rappture::CmdSpec volumeOps[] = 1316 {1317 1318 1319 1320 1321 1322 1323 1324 };1696 { 1697 {"animation", 2, VolumeAnimationOp, 3, 3, "oper ?args?",}, 1698 {"axis", 2, VolumeAxisOp, 3, 3, "label axis value ?indices?",}, 1699 {"data", 1, VolumeDataOp, 3, 3, "oper ?args?",}, 1700 {"outline", 1, VolumeOutlineOp, 3, 0, "oper ?args?",}, 1701 {"shading", 2, VolumeShadingOp, 3, 0, "oper ?args?",}, 1702 {"state", 2, VolumeStateOp, 3, 0, "bool ?indices?",}, 1703 {"test2", 1, VolumeTestOp, 2, 2, "",}, 1704 }; 1325 1705 static int nVolumeOps = NumCmdSpecs(volumeOps); 1326 #endif1327 1706 1328 1707 /* … … 1345 1724 VolumeCmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST *objv) 1346 1725 { 1726 Tcl_ObjCmdProc *proc; 1727 1728 proc = Rappture::GetOpFromObj(interp, nVolumeOps, volumeOps, 1729 Rappture::CMDSPEC_ARG1, objc, objv, 0); 1730 if (proc == NULL) { 1731 return TCL_ERROR; 1732 } 1733 return (*proc) (cdata, interp, objc, objv); 1734 } 1735 1736 #else 1737 1738 static int 1739 VolumeCmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST *objv) 1740 { 1347 1741 if (objc < 2) { 1348 1742 Tcl_AppendResult(interp, "wrong # args: should be \"", 1349 1743 Tcl_GetString(objv[0]), " option arg arg...\"", (char*)NULL); 1350 1744 return TCL_ERROR; 1351 1745 } … … 1356 1750 if (objc < 3) { 1357 1751 Tcl_AppendResult(interp, "wrong # args: should be \"", 1358 1359 1752 Tcl_GetString(objv[0]), " axis option ?arg arg...?\"", 1753 (char*)NULL); 1360 1754 return TCL_ERROR; 1361 1755 } … … 1365 1759 if (objc < 5) { 1366 1760 Tcl_AppendResult(interp, "wrong # args: should be \"", 1367 1368 1761 Tcl_GetString(objv[0]), 1762 " axis label x|y|z string ?volume ...?\"", (char*)NULL); 1369 1763 return TCL_ERROR; 1370 1764 } … … 1385 1779 } else { 1386 1780 Tcl_AppendResult(interp, "bad option \"", string, 1387 1781 "\": should be label", (char*)NULL); 1388 1782 return TCL_ERROR; 1389 1783 } … … 1391 1785 if (objc < 3) { 1392 1786 Tcl_AppendResult(interp, "wrong # args: should be \"", 1393 1394 1787 Tcl_GetString(objv[0]), " data option ?arg arg...?\"", 1788 (char*)NULL); 1395 1789 return TCL_ERROR; 1396 1790 } … … 1400 1794 if (objc < 4) { 1401 1795 Tcl_AppendResult(interp, "wrong # args: should be \"", 1402 1403 1404 return TCL_ERROR; 1405 } 1406 intstate;1407 if ( Tcl_GetBooleanFromObj(interp, objv[3], &state) != TCL_OK) {1796 Tcl_GetString(objv[0])," data state on|off ?volume...?\"", 1797 (char*)NULL); 1798 return TCL_ERROR; 1799 } 1800 bool state; 1801 if (GetBooleanFromObj(interp, objv[3], &state) != TCL_OK) { 1408 1802 return TCL_ERROR; 1409 1803 } … … 1426 1820 if (objc < 4) { 1427 1821 Tcl_AppendResult(interp, "wrong # args: should be \"", 1428 1822 Tcl_GetString(objv[0]), " data follows size", (char*)NULL); 1429 1823 return TCL_ERROR; 1430 1824 } … … 1572 1966 } else { 1573 1967 Tcl_AppendResult(interp, "bad data option \"", string, 1574 1968 "\": should be follows or state", (char*)NULL); 1575 1969 return TCL_ERROR; 1576 1970 } … … 1578 1972 if (objc < 3) { 1579 1973 Tcl_AppendResult(interp, "wrong # args: should be \"", 1580 1581 1974 Tcl_GetString(objv[0]), " outline option ?arg arg...?\"", 1975 (char*)NULL); 1582 1976 return TCL_ERROR; 1583 1977 } … … 1587 1981 if (objc < 3) { 1588 1982 Tcl_AppendResult(interp, "wrong # args: should be \"", 1589 1590 1591 return TCL_ERROR; 1592 } 1593 1594 intstate;1595 if ( Tcl_GetBooleanFromObj(interp, objv[3], &state) != TCL_OK) {1983 Tcl_GetString(objv[0]), 1984 " outline state on|off ?volume ...? \"", (char*)NULL); 1985 return TCL_ERROR; 1986 } 1987 1988 bool state; 1989 if (GetBooleanFromObj(interp, objv[3], &state) != TCL_OK) { 1596 1990 return TCL_ERROR; 1597 1991 } … … 1612 2006 } 1613 2007 } else if ((c == 'v') && (strcmp(string, "visible") == 0)) { 1614 int ivisible;1615 1616 if ( Tcl_GetBooleanFromObj(interp, objv[3], &ivisible) != TCL_OK) {2008 bool visible; 2009 2010 if (GetBooleanFromObj(interp, objv[3], &visible) != TCL_OK) { 1617 2011 return TCL_ERROR; 1618 2012 } 1619 if (! ivisible) {2013 if (!visible) { 1620 2014 for (int i = 0; i < NanoVis::n_volumes; ++i) { 1621 2015 if (NanoVis::volume[i]) { … … 1633 2027 if (objc < 6) { 1634 2028 Tcl_AppendResult(interp, "wrong # args: should be \"", 1635 1636 2029 Tcl_GetString(objv[0]), 2030 " outline color R G B ?volume ...? \"", (char*)NULL); 1637 2031 return TCL_ERROR; 1638 2032 } … … 1652 2046 else { 1653 2047 Tcl_AppendResult(interp, "bad outline option \"", string, 1654 2048 "\": should be color, visible, or state", (char*)NULL); 1655 2049 return TCL_ERROR; 1656 2050 } … … 1658 2052 if (objc < 3) { 1659 2053 Tcl_AppendResult(interp, "wrong # args: should be \"", 1660 1661 2054 Tcl_GetString(objv[0]), " shading option ?arg arg...?\"", 2055 (char*)NULL); 1662 2056 return TCL_ERROR; 1663 2057 } … … 1667 2061 if (objc < 4) { 1668 2062 Tcl_AppendResult(interp, "wrong # args: should be \"", 1669 1670 2063 Tcl_GetString(objv[0]), 2064 " shading transfunc name ?volume ...?\"", (char*)NULL); 1671 2065 return TCL_ERROR; 1672 2066 } … … 1676 2070 if (tf == NULL) { 1677 2071 Tcl_AppendResult(interp, "transfer function \"", name, 1678 2072 "\" is not defined", (char*)NULL); 1679 2073 return TCL_ERROR; 1680 2074 } … … 1690 2084 // POINTSET 1691 2085 /* 1692 1693 1694 2086 if ((*iter)->pointsetIndex != -1) { 2087 g_pointSet[(*iter)->pointsetIndex]->updateColor(tf->getData(), 256); 2088 } 1695 2089 */ 1696 2090 } … … 1698 2092 if (objc < 4) { 1699 2093 Tcl_AppendResult(interp, "wrong # args: should be \"", 1700 1701 2094 Tcl_GetString(objv[0]), 2095 " shading diffuse value ?volume ...?\"", (char*)NULL); 1702 2096 return TCL_ERROR; 1703 2097 } … … 1718 2112 if (objc < 4) { 1719 2113 Tcl_AppendResult(interp, "wrong # args: should be \"", 1720 1721 2114 Tcl_GetString(objv[0]), 2115 " shading opacity value ?volume ...?\"", (char*)NULL); 1722 2116 return TCL_ERROR; 1723 2117 } … … 1737 2131 if (objc < 4) { 1738 2132 Tcl_AppendResult(interp, "wrong # args: should be \"", 1739 1740 2133 Tcl_GetString(objv[0]), 2134 " shading specular value ?volume ...?\"", (char*)NULL); 1741 2135 return TCL_ERROR; 1742 2136 } … … 1756 2150 if (objc < 4) { 1757 2151 Tcl_AppendResult(interp, "wrong # args: should be \"", 1758 1759 1760 return TCL_ERROR; 1761 } 1762 intiso_surface;1763 if ( Tcl_GetBooleanFromObj(interp, objv[3], &iso_surface) != TCL_OK) {2152 Tcl_GetString(objv[0]), 2153 " shading isosurface on|off ?volume ...?\"", (char*)NULL); 2154 return TCL_ERROR; 2155 } 2156 bool iso_surface; 2157 if (GetBooleanFromObj(interp, objv[3], &iso_surface) != TCL_OK) { 1764 2158 return TCL_ERROR; 1765 2159 } … … 1774 2168 } else { 1775 2169 Tcl_AppendResult(interp, "bad shading option \"", string, 1776 1777 2170 "\": should be diffuse, opacity, specular, transfunc, or ", 2171 "isosurface", (char*)NULL); 1778 2172 return TCL_ERROR; 1779 2173 } … … 1781 2175 if (objc < 3) { 1782 2176 Tcl_AppendResult(interp, "wrong # args: should be \"", 1783 1784 1785 return TCL_ERROR; 1786 } 1787 intstate;1788 if ( Tcl_GetBooleanFromObj(interp, objv[2], &state) != TCL_OK) {2177 Tcl_GetString(objv[0]), " state on|off ?volume...?\"", 2178 (char*)NULL); 2179 return TCL_ERROR; 2180 } 2181 bool state; 2182 if (GetBooleanFromObj(interp, objv[2], &state) != TCL_OK) { 1789 2183 return TCL_ERROR; 1790 2184 } … … 1807 2201 if (objc < 3) { 1808 2202 Tcl_AppendResult(interp, "wrong # args: should be \"", 1809 1810 2203 Tcl_GetString(objv[0]), " animation option ?args...?\"", 2204 (char*)NULL); 1811 2205 return TCL_ERROR; 1812 2206 } … … 1823 2217 Trace("index: %d\n", *iter); 1824 2218 NanoVis::vol_renderer->addAnimatedVolume(NanoVis::volume[*iter], 1825 2219 *iter); 1826 2220 } 1827 2221 } else if ((c == 'c') && (strcmp(string,"capture") == 0)) { … … 1862 2256 } else { 1863 2257 Tcl_AppendResult(interp, "bad animation option \"", string, 1864 2258 "\": should be volumes, start, stop, or clear", (char*)NULL); 1865 2259 return TCL_ERROR; 1866 2260 } … … 1870 2264 } else { 1871 2265 Tcl_AppendResult(interp, "bad option \"", string, "\": should be ", 1872 "data, outline, shading, or state", (char*)NULL); 1873 return TCL_ERROR; 1874 } 1875 return TCL_OK; 1876 } 2266 "data, outline, shading, or state", (char*)NULL); 2267 return TCL_ERROR; 2268 } 2269 return TCL_OK; 2270 } 2271 #endif 1877 2272 1878 2273 static int … … 1883 2278 if (objc < 2) { 1884 2279 Tcl_AppendResult(interp, "wrong # args: should be \"", 1885 2280 Tcl_GetString(objv[0]), " option ?arg arg?", (char *)NULL); 1886 2281 return TCL_ERROR; 1887 2282 } … … 1891 2286 if (objc != 3) { 1892 2287 Tcl_AppendResult(interp, "wrong # args: should be \"", 1893 2288 Tcl_GetString(objv[0]), " vectorid volume", (char *)NULL); 1894 2289 return TCL_ERROR; 1895 2290 } … … 1901 2296 if (NanoVis::particleRenderer != NULL) { 1902 2297 NanoVis::particleRenderer->setVectorField(volPtr->id, 1.0f, 1903 1904 1905 2298 volPtr->height / (float)volPtr->width, 2299 volPtr->depth / (float)volPtr->width, 2300 volPtr->range_max()); 1906 2301 NanoVis::initParticle(); 1907 2302 } 1908 2303 if (NanoVis::licRenderer != NULL) { 1909 2304 NanoVis::licRenderer->setVectorField(volPtr->id, 1910 1911 1912 1913 2305 1.0f / volPtr->aspect_ratio_width, 2306 1.0f / volPtr->aspect_ratio_height, 2307 1.0f / volPtr->aspect_ratio_depth, 2308 volPtr->range_max()); 1914 2309 NanoVis::licRenderer->set_offset(NanoVis::lic_slice_z); 1915 2310 } … … 1917 2312 if (objc != 3) { 1918 2313 Tcl_AppendResult(interp, "wrong # args: should be \"", 1919 1920 return TCL_ERROR; 1921 } 1922 int ibool;1923 if ( Tcl_GetBooleanFromObj(interp, objv[2], &ibool) != TCL_OK) {1924 return TCL_ERROR; 1925 } 1926 NanoVis::lic_on = (bool)ibool;2314 Tcl_GetString(objv[0]), " lic on|off\"", (char*)NULL); 2315 return TCL_ERROR; 2316 } 2317 bool state; 2318 if (GetBooleanFromObj(interp, objv[2], &state) != TCL_OK) { 2319 return TCL_ERROR; 2320 } 2321 NanoVis::lic_on = state; 1927 2322 } else if ((c == 'p') && (strcmp(string, "particle") == 0)) { 1928 2323 if (objc < 3) { 1929 2324 Tcl_AppendResult(interp, "wrong # args: should be \"", 1930 1931 2325 Tcl_GetString(objv[0]), " particle visible|slice|slicepos arg \"", 2326 (char*)NULL); 1932 2327 return TCL_ERROR; 1933 2328 } … … 1937 2332 if (objc != 4) { 1938 2333 Tcl_AppendResult(interp, "wrong # args: should be \"", 1939 1940 1941 return TCL_ERROR; 1942 } 1943 intstate;1944 if ( Tcl_GetBooleanFromObj(interp, objv[3], &state) != TCL_OK) {2334 Tcl_GetString(objv[0]), " particle visible on|off\"", 2335 (char*)NULL); 2336 return TCL_ERROR; 2337 } 2338 bool state; 2339 if (GetBooleanFromObj(interp, objv[3], &state) != TCL_OK) { 1945 2340 return TCL_ERROR; 1946 2341 } … … 1949 2344 if (objc != 4) { 1950 2345 Tcl_AppendResult(interp, "wrong # args: should be \"", 1951 1952 2346 Tcl_GetString(objv[0]), 2347 " particle slice volume\"", (char*)NULL); 1953 2348 return TCL_ERROR; 1954 2349 } … … 1961 2356 if (objc != 4) { 1962 2357 Tcl_AppendResult(interp, "wrong # args: should be \"", 1963 1964 2358 Tcl_GetString(objv[0]), " particle slicepos value\"", 2359 (char*)NULL); 1965 2360 return TCL_ERROR; 1966 2361 } … … 1987 2382 } else { 1988 2383 Tcl_AppendResult(interp, "unknown option \"",string,"\": should be \"", 1989 1990 2384 Tcl_GetString(objv[0]), " visible, slice, or slicepos\"", 2385 (char *)NULL); 1991 2386 return TCL_ERROR; 1992 2387 } … … 1996 2391 if (objc > 4 || objc < 3) { 1997 2392 Tcl_AppendResult(interp, "wrong # args: should be \"", 1998 1999 2393 Tcl_GetString(objv[0]), " capture numframes [directory]\"", 2394 (char*)NULL); 2000 2395 return TCL_ERROR; 2001 2396 } … … 2050 2445 if (objc < 3) { 2051 2446 Tcl_AppendResult(interp, "wrong # args: should be \"", 2052 2447 Tcl_GetString(objv[0]), " data follows ?args?", (char *)NULL); 2053 2448 return TCL_ERROR; 2054 2449 } … … 2058 2453 if (objc != 4) { 2059 2454 Tcl_AppendResult(interp, "wrong # args: should be \"", 2060 2061 2455 Tcl_GetString(objv[0]), " data follows length", 2456 (char *)NULL); 2062 2457 return TCL_ERROR; 2063 2458 } … … 2091 2486 2092 2487 NanoVis::vol_renderer->add_volume(volPtr, 2093 2488 NanoVis::get_transfunc("default")); 2094 2489 } 2095 2490 } … … 2129 2524 Tcl_Obj *CONST *objv) 2130 2525 { 2131 int ivisible;2132 if ( Tcl_GetBooleanFromObj(interp, objv[3], &ivisible) != TCL_OK) {2526 bool visible; 2527 if (GetBooleanFromObj(interp, objv[3], &visible) != TCL_OK) { 2133 2528 return TCL_ERROR; 2134 2529 } … … 2137 2532 return TCL_ERROR; 2138 2533 } 2139 bool visible;2140 visible = (bool)ivisible;2141 2534 for (unsigned int i = 0; i < indices.size(); ++i) { 2142 2535 if ((indices[i] < NanoVis::heightMap.size()) && … … 2149 2542 2150 2543 static Rappture::CmdSpec heightMapDataOps[] = 2151 {2152 2153 2154 };2544 { 2545 {"follows", 1, HeightMapDataFollowsOp, 4, 4, "length",}, 2546 {"visible", 1, HeightMapDataVisibleOp, 4, 0, "bool ?indices?",}, 2547 }; 2155 2548 static int nHeightMapDataOps = NumCmdSpecs(heightMapDataOps); 2156 2549 2157 2550 static int 2158 2551 HeightMapDataOp(ClientData cdata, Tcl_Interp *interp, int objc, 2159 2552 Tcl_Obj *CONST *objv) 2160 2553 { 2161 2554 Tcl_ObjCmdProc *proc; 2162 2555 2163 2556 proc = Rappture::GetOpFromObj(interp, nHeightMapDataOps, heightMapDataOps, 2164 2557 Rappture::CMDSPEC_ARG2, objc, objv, 0); 2165 2558 if (proc == NULL) { 2166 2559 return TCL_ERROR; … … 2172 2565 static int 2173 2566 HeightMapLineContourColorOp(ClientData cdata, Tcl_Interp *interp, int objc, 2174 2567 Tcl_Obj *CONST *objv) 2175 2568 { 2176 2569 float rgb[3]; … … 2195 2588 Tcl_Obj *CONST *objv) 2196 2589 { 2197 int ivisible;2198 2590 bool visible; 2199 if (Tcl_GetBooleanFromObj(interp, objv[3], &ivisible) != TCL_OK) { 2200 return TCL_ERROR; 2201 } 2202 visible = (bool)ivisible; 2591 if (GetBooleanFromObj(interp, objv[3], &visible) != TCL_OK) { 2592 return TCL_ERROR; 2593 } 2203 2594 vector<unsigned int> indices; 2204 2595 if (GetIndices(interp, objc-4, objv+4, &indices) != TCL_OK) { … … 2215 2606 2216 2607 static Rappture::CmdSpec heightMapLineContourOps[] = 2217 {2218 2219 2220 };2608 { 2609 {"color", 1, HeightMapLineContourColorOp, 4, 4, "length",}, 2610 {"visible", 1, HeightMapLineContourVisibleOp, 4, 0, "bool ?indices?",}, 2611 }; 2221 2612 static int nHeightMapLineContourOps = NumCmdSpecs(heightMapLineContourOps); 2222 2613 2223 2614 static int 2224 2615 HeightMapLineContourOp(ClientData cdata, Tcl_Interp *interp, int objc, 2225 2616 Tcl_Obj *CONST *objv) 2226 2617 { 2227 2618 Tcl_ObjCmdProc *proc; 2228 2619 2229 2620 proc = Rappture::GetOpFromObj(interp, nHeightMapLineContourOps, 2230 2621 heightMapLineContourOps, Rappture::CMDSPEC_ARG2, objc, objv, 0); 2231 2622 if (proc == NULL) { 2232 2623 return TCL_ERROR; … … 2237 2628 static int 2238 2629 HeightMapCullOp(ClientData cdata, Tcl_Interp *interp, int objc, 2239 2630 Tcl_Obj *CONST *objv) 2240 2631 { 2241 2632 graphics::RenderContext::CullMode mode; … … 2275 2666 if (tf == NULL) { 2276 2667 Tcl_AppendResult(interp, "no transfer function defined for heightmap \"", 2277 2668 Tcl_GetString(objv[2]), "\"", (char*)NULL); 2278 2669 return TCL_ERROR; 2279 2670 } … … 2302 2693 static int 2303 2694 HeightMapShadeOp(ClientData cdata, Tcl_Interp *interp, int objc, 2304 2695 Tcl_Obj *CONST *objv) 2305 2696 { 2306 2697 graphics::RenderContext::ShadingModel model; … … 2314 2705 static int 2315 2706 HeightMapTestOp(ClientData cdata, Tcl_Interp *interp, int objc, 2316 2707 Tcl_Obj *CONST *objv) 2317 2708 { 2318 2709 srand((unsigned)time(NULL)); … … 2378 2769 2379 2770 static Rappture::CmdSpec heightMapOps[] = 2380 {2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 };2771 { 2772 {"create", 2, HeightMapCreateOp, 9, 9, 2773 "xmin ymin xmax ymax xnum ynum values",}, 2774 {"cull", 2, HeightMapCullOp, 3, 3, "mode",}, 2775 {"data", 1, HeightMapDataOp, 3, 0, "oper ?args?",}, 2776 {"legend", 2, HeightMapLegendOp, 5, 5, "index width height",}, 2777 {"linecontour", 2, HeightMapLineContourOp, 2, 0, "oper ?args?",}, 2778 {"polygon", 1, HeightMapPolygonOp, 3, 3, "mode",}, 2779 {"shade", 1, HeightMapShadeOp, 3, 3, "model",}, 2780 {"test", 2, HeightMapTestOp, 2, 2, "",}, 2781 {"transfunc", 2, HeightMapTransFuncOp, 3, 0, "name ?indices?",}, 2782 }; 2392 2783 static int nHeightMapOps = NumCmdSpecs(heightMapOps); 2393 2784 … … 2398 2789 2399 2790 proc = Rappture::GetOpFromObj(interp, nHeightMapOps, heightMapOps, 2400 2791 Rappture::CMDSPEC_ARG1, objc, objv, 0); 2401 2792 if (proc == NULL) { 2402 2793 return TCL_ERROR; … … 2427 2818 static int 2428 2819 GridAxisNameOp(ClientData cdata, Tcl_Interp *interp, int objc, 2429 2820 Tcl_Obj *CONST *objv) 2430 2821 { 2431 2822 int axisId; … … 2477 2868 2478 2869 static int 2479 GridMinMaxOp(ClientData cdata, Tcl_Interp *interp, int objc, 2480 Tcl_Obj *CONST *objv) 2870 GridMinMaxOp(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST *objv) 2481 2871 { 2482 2872 double x1, y1, z1, x2, y2, z2; … … 2496 2886 2497 2887 static int 2498 GridVisibleOp(ClientData cdata, Tcl_Interp *interp, int objc, 2499 Tcl_Obj *CONST *objv) 2500 { 2501 int ivisible; 2502 2503 if (Tcl_GetBooleanFromObj(interp, objv[2], &ivisible) != TCL_OK) { 2504 return TCL_ERROR; 2505 } 2506 NanoVis::grid->setVisible((bool)ivisible); 2888 GridVisibleOp(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST *objv) 2889 { 2890 bool visible; 2891 if (GetBooleanFromObj(interp, objv[2], &visible) != TCL_OK) { 2892 return TCL_ERROR; 2893 } 2894 NanoVis::grid->setVisible(visible); 2507 2895 return TCL_OK; 2508 2896 } 2509 2897 2510 2898 static Rappture::CmdSpec gridOps[] = 2511 {2512 2513 2514 2515 2516 2517 2518 };2899 { 2900 {"axiscolor", 5, GridAxisColorOp, 5, 6, "r g b ?a?",}, 2901 {"axisname", 5, GridAxisNameOp, 5, 5, "index width height",}, 2902 {"linecolor", 7, GridLineColorOp, 5, 6, "r g b ?a?",}, 2903 {"linecount", 7, GridLineCountOp, 5, 5, "xCount yCount zCount",}, 2904 {"minmax", 1, GridMinMaxOp, 8, 8, "xMin yMin zMin xMax yMax zMax",}, 2905 {"visible", 1, GridVisibleOp, 3, 3, "bool",}, 2906 }; 2519 2907 static int nGridOps = NumCmdSpecs(gridOps); 2520 2908 … … 2525 2913 2526 2914 proc = Rappture::GetOpFromObj(interp, nGridOps, gridOps, 2527 2915 Rappture::CMDSPEC_ARG1, objc, objv, 0); 2528 2916 if (proc == NULL) { 2529 2917 return TCL_ERROR; … … 2537 2925 if (objc < 2) { 2538 2926 Tcl_AppendResult(interp, "wrong # args: should be \"", 2539 2927 Tcl_GetString(objv[0]), " option arg arg...\"", (char*)NULL); 2540 2928 return TCL_ERROR; 2541 2929 } … … 2543 2931 char c = string[0]; 2544 2932 if ((c == 'v') && (strcmp(string, "visible") == 0)) { 2545 int ivisible;2546 2547 if ( Tcl_GetBooleanFromObj(interp, objv[2], &ivisible) != TCL_OK) {2548 return TCL_ERROR; 2549 } 2550 NanoVis::axis_on = (bool)ivisible;2933 bool visible; 2934 2935 if (GetBooleanFromObj(interp, objv[2], &visible) != TCL_OK) { 2936 return TCL_ERROR; 2937 } 2938 NanoVis::axis_on = visible; 2551 2939 } else { 2552 2940 Tcl_AppendResult(interp, "bad axis option \"", string, … … 2559 2947 #if PLANE_CMD 2560 2948 static int 2561 PlaneNewOp(ClientData cdata, Tcl_Interp *interp, int objc, 2562 Tcl_Obj *CONST *objv) 2949 PlaneNewOp(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST *objv) 2563 2950 { 2564 2951 fprintf(stderr, "load plane for 2D visualization command\n"); … … 2566 2953 if (objc != 4) { 2567 2954 Tcl_AppendResult(interp, "wrong # args: should be \"", 2568 2955 Tcl_GetString(objv[0]), " plane_index w h \"", (char*)NULL); 2569 2956 return TCL_ERROR; 2570 2957 } … … 2599 2986 static int 2600 2987 PlaneLinkOp(ClientData cdata, Tcl_Interp *interp, int objc, 2601 2988 Tcl_Obj *CONST *objv) 2602 2989 { 2603 2990 fprintf(stderr, "link the plane to the 2D renderer command\n"); … … 2607 2994 if (objc != 3) { 2608 2995 Tcl_AppendResult(interp, "wrong # args: should be \"", 2609 2996 Tcl_GetString(objv[0]), " plane_index tf_index \"", (char*)NULL); 2610 2997 return TCL_ERROR; 2611 2998 } … … 2624 3011 static int 2625 3012 PlaneEnableOp(ClientData cdata, Tcl_Interp *interp, int objc, 2626 3013 Tcl_Obj *CONST *objv) 2627 3014 { 2628 3015 fprintf(stderr,"enable a plane so the 2D renderer can render it command\n"); … … 2630 3017 if (objc != 3) { 2631 3018 Tcl_AppendResult(interp, "wrong # args: should be \"", 2632 3019 Tcl_GetString(objv[0]), " plane_index mode \"", (char*)NULL); 2633 3020 return TCL_ERROR; 2634 3021 } … … 2649 3036 2650 3037 static Rappture::CmdSpec planeOps[] = 2651 {2652 2653 2654 2655 };3038 { 3039 {"enable", 1, PlaneEnableOp, 4, 4, "planeIdx mode",}, 3040 {"link", 1, PlaneLinkOp, 4, 4, "planeIdx transfuncIdx",}, 3041 {"new", 1, PlaneNewOp, 5, 5, "planeIdx width height",}, 3042 }; 2656 3043 static int nPlaneOps = NumCmdSpecs(planeOps); 2657 3044 … … 2662 3049 2663 3050 proc = Rappture::GetOpFromObj(interp, nPlaneOps, planeOps, 2664 3051 Rappture::CMDSPEC_ARG1, objc, objv, 0); 2665 3052 if (proc == NULL) { 2666 3053 return TCL_ERROR; … … 2691 3078 if ((objc & 0x01) == 0) { 2692 3079 Tcl_AppendResult(interp, Tcl_GetString(objv[0]), ": ", 2693 2694 3080 "wrong number of arguments: should be key-value pairs", 3081 (char *)NULL); 2695 3082 return TCL_ERROR; 2696 3083 } … … 2752 3139 } else { 2753 3140 Tcl_AppendResult(interp, "unknown key \"", string, 2754 2755 3141 "\": should be xmin, xmax, xnum, ymin, ymax, ynum, or zvalues", 3142 (char *)NULL); 2756 3143 return TCL_ERROR; 2757 3144 } … … 2763 3150 if (zNum != (xNum * yNum)) { 2764 3151 Tcl_AppendResult(interp, "wrong number of z values must be xnum*ynum", 2765 3152 (char *)NULL); 2766 3153 return TCL_ERROR; 2767 3154 } … … 2884 3271 // 2885 3272 /* 2886 if (NanoVis::licRenderer && NanoVis::licRenderer->isActivated())2887 {2888 2889 }2890 2891 if (NanoVis::particleRenderer && NanoVis::particleRenderer->isActivated())2892 {2893 2894 }3273 if (NanoVis::licRenderer && NanoVis::licRenderer->isActivated()) 3274 { 3275 NanoVis::licRenderer->convolve(); 3276 } 3277 3278 if (NanoVis::particleRenderer && NanoVis::particleRenderer->isActivated()) 3279 { 3280 NanoVis::particleRenderer->advect(); 3281 } 2895 3282 */ 2896 3283 … … 2903 3290 // INSOO 2904 3291 #ifdef XINETD 2905 NanoVis::read_screen();2906 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);3292 NanoVis::read_screen(); 3293 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 2907 3294 #else 2908 NanoVis::display_offscreen_buffer(); //display the final rendering on screen2909 NanoVis::read_screen();2910 glutSwapBuffers();3295 NanoVis::display_offscreen_buffer(); //display the final rendering on screen 3296 NanoVis::read_screen(); 3297 glutSwapBuffers(); 2911 3298 #endif 2912 3299 -
trunk/vizservers/nanovis/HeightMap.cpp
r862 r927 1 1 2 #include <GL/glew.h> 2 3 #include <GL/gl.h> … … 16 17 17 18 HeightMap::HeightMap() : 19 _vertexBufferObjectID(0), 20 _textureBufferObjectID(0), 21 _vertexCount(0), 18 22 _contour(0), 19 23 _colorMap(0), 20 24 _indexBuffer(0), 21 25 _indexCount(0), 22 _vertexBufferObjectID(0), 23 _vertexCount(0), 24 _textureBufferObjectID(0), 26 _contourColor(1.0f, 0.0f, 0.0f), 25 27 _contourVisible(true), 28 _visible(false), 26 29 _scale(1.0f, 1.0f, 1.0f), 27 _contourColor(1.0f, 0.0f, 0.0f), 28 _visible(false), 30 _centerPoint(0.0f, 0.0f, 0.0f), 29 31 _vmin(0.0f), 30 _vmax(0.0f), 31 _centerPoint(0.0f, 0.0f, 0.0f) 32 _vmax(0.0f) 32 33 { 33 34 _shader = new NvShader(); … … 35 36 R2string path = R2FilePath::getInstance()->getPath("heightcolor.cg"); 36 37 if (path.getLength() == 0) { 37 38 printf("ERROR : file not found %s\n", "heightcolor.cg"); 38 39 } 39 40 _shader->loadFragmentProgram(path, "main"); … … 46 47 47 48 if (_shader) { 48 49 delete _shader; 49 50 } 50 51 … … 74 75 75 76 if (_contour) { 76 77 } 78 77 glDepthRange (0.001, 1.0); 78 } 79 79 80 glEnable(GL_DEPTH_TEST); 80 81 81 82 if (_vertexBufferObjectID) { 82 83 84 85 86 87 88 89 90 83 glColor3f(1.0f, 1.0f, 1.0f); 84 glShadeModel(GL_SMOOTH); 85 glEnable(GL_BLEND); 86 glEnableClientState(GL_VERTEX_ARRAY); 87 glDisableClientState(GL_COLOR_ARRAY); 88 glDisableClientState(GL_INDEX_ARRAY); 89 glDisableClientState(GL_NORMAL_ARRAY); 90 91 if (_colorMap) { 91 92 cgGLBindProgram(_shader->getFP()); 92 93 cgGLEnableProfile(CG_PROFILE_FP30); 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 94 95 cgGLSetTextureParameter(_tf, _colorMap->id); 96 cgGLEnableTextureParameter(_tf); 97 98 glEnable(GL_TEXTURE_1D); 99 _colorMap->getTexture()->activate(); 100 101 glEnableClientState(GL_TEXTURE_COORD_ARRAY); 102 } 103 104 glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferObjectID); 105 glVertexPointer(3, GL_FLOAT, 12, 0); 106 107 glBindBuffer(GL_ARRAY_BUFFER, _textureBufferObjectID); 108 ::glTexCoordPointer(3, GL_FLOAT, 12, 0); 109 110 glDrawElements(GL_TRIANGLES, _indexCount, GL_UNSIGNED_INT, 111 _indexBuffer); 112 glBindBuffer(GL_ARRAY_BUFFER, 0); 113 114 glDisableClientState(GL_VERTEX_ARRAY); 115 if (_colorMap) { 116 _colorMap->getTexture()->deactivate(); 117 glDisableClientState(GL_TEXTURE_COORD_ARRAY); 118 118 119 cgGLDisableProfile(CG_PROFILE_FP30); 119 120 } 120 121 } 121 122 … … 124 125 125 126 if (_contour && _contourVisible) { 126 127 128 129 130 131 127 glDisable(GL_BLEND); 128 glDisable(GL_TEXTURE_2D); 129 glColor4f(_contourColor.x, _contourColor.y, _contourColor.z, 1.0f); 130 glDepthRange (0.0, 0.999); 131 _contour->render(); 132 glDepthRange (0.0, 1.0); 132 133 } 133 134 glPopMatrix(); … … 181 182 *ptr = (i + 1) * xCount + j; ++ptr; 182 183 *ptr = (i + 1) * xCount + j + 1; ++ptr; 183 184 184 *ptr = i * xCount + j; ++ptr; 185 *ptr = (i + 1) * xCount + j + 1; ++ptr; 185 186 *ptr = i * xCount + j + 1; ++ptr; 186 187 } … … 192 193 { 193 194 if (_vertexBufferObjectID) { 194 195 glDeleteBuffers(1, &_vertexBufferObjectID); 195 196 } 196 197 197 198 if (_vertexBufferObjectID) { 198 199 glDeleteBuffers(1, &_vertexBufferObjectID); 199 200 } 200 201 201 202 //if (_contour) _contour->unrefDelete(); 202 203 if (_contour) { 203 204 delete _contour; 204 205 } 205 206 if (_indexBuffer) { 206 207 free(_indexBuffer); 207 208 } 208 209 } … … 216 217 int count = xCount * yCount; 217 218 for (int i = 0; i < count; ++i) { 218 219 220 219 if (_vmin > heights[i].y) { 220 _vmin = heights[i].y; 221 } 221 222 if (_vmax < heights[i].y) { 222 223 223 _vmax = heights[i].y; 224 } 224 225 } 225 226 … … 227 228 _scale.z = _vmax - _vmin; 228 229 _scale.y = 1.0f; 230 set_limits(0, 0.0, 1.0); 231 set_limits(1, 0.0, 1.0); 232 set_limits(2, _vmin, _vmax); 229 233 230 234 _centerPoint.set(_scale.x * 0.5, _scale.z * 0.5 + _vmin, _scale.y * 0.5); 231 235 232 Vector3* texcoord = (Vector3*) malloc(count * sizeof(Vector3));236 Vector3* texcoord = new Vector3[count]; 233 237 for (int i = 0; i < count; ++i) { 234 238 texcoord[i].set(0, 0, heights[i].y); 235 239 } 236 240 237 241 glGenBuffers(1, &_vertexBufferObjectID); 238 242 glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferObjectID); 239 glBufferData(GL_ARRAY_BUFFER, 240 _vertexCount * sizeof( Vector3 ), 241 heights, 242 GL_STATIC_DRAW); 243 glBufferData(GL_ARRAY_BUFFER, _vertexCount * sizeof( Vector3 ), heights, 244 GL_STATIC_DRAW); 243 245 glGenBuffers(1, &_textureBufferObjectID); 244 246 glBindBuffer(GL_ARRAY_BUFFER, _textureBufferObjectID); 245 glBufferData(GL_ARRAY_BUFFER, 246 _vertexCount * sizeof(float) * 3, 247 texcoord, 248 GL_STATIC_DRAW); 247 glBufferData(GL_ARRAY_BUFFER, _vertexCount * sizeof(float) * 3, texcoord, 248 GL_STATIC_DRAW); 249 249 glBindBuffer(GL_ARRAY_BUFFER, 0); 250 250 251 free(texcoord);251 delete [] texcoord; 252 252 253 253 … … 257 257 //if (heightMap) 258 258 //{ 259 // 259 // VertexBuffer* vertexBuffer = new VertexBuffer(VertexBuffer::POSITION3, xCount * yCount, sizeof(Vector3) * xCount * yCount, heightMap, false); 260 260 if (_indexBuffer) { 261 261 free(_indexBuffer); 262 262 } 263 263 … … 271 271 272 272 void 273 HeightMap::setHeight( 274 float startX, float startY, 275 float endX, float endY, 276 int xCount, int yCount, 277 float* heights) 273 HeightMap::setHeight(float startX, float startY, float endX, float endY, 274 int xCount, int yCount, float* heights) 278 275 { 279 276 _vertexCount = xCount * yCount; 280 277 281 278 reset(); 282 279 283 280 _vmin = heights[0], _vmax = heights[0]; 284 281 int count = xCount * yCount; 285 282 for (int i = 0; i < count; ++i) { 286 287 288 289 290 283 if (_vmin > heights[i]) { 284 _vmin = heights[i]; 285 } else if (_vmax < heights[i]) { 286 _vmax = heights[i]; 287 } 291 288 } 292 289 _scale.x = endX - startX; 293 290 _scale.y = _vmax - _vmin; 294 291 _scale.z = endY - startY; 292 set_limits(0, startX, endX); 293 set_limits(1, startY, endY); 294 set_limits(2, _vmin, _vmax); 295 295 296 296 _centerPoint.set(_scale.x * 0.5 + startX, _scale.y * 0.5 + _vmin, _scale.z * 0.5 + startY); 297 297 298 Vector3* texcoord = (Vector3*) malloc(count * sizeof(Vector3));298 Vector3* texcoord = new Vector3[count]; 299 299 for (int i = 0; i < count; ++i) { 300 300 texcoord[i].set(0, 0, heights[i]); 301 301 } 302 302 … … 305 305 glGenBuffers(1, &_vertexBufferObjectID); 306 306 glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferObjectID); 307 glBufferData(GL_ARRAY_BUFFER, 308 _vertexCount * sizeof( Vector3 ), 309 heightMap, 310 GL_STATIC_DRAW); 307 glBufferData(GL_ARRAY_BUFFER, _vertexCount * sizeof( Vector3 ), heightMap, 308 GL_STATIC_DRAW); 311 309 glGenBuffers(1, &_textureBufferObjectID); 312 310 glBindBuffer(GL_ARRAY_BUFFER, _textureBufferObjectID); 313 glBufferData(GL_ARRAY_BUFFER, 314 _vertexCount * sizeof(float) * 3, 315 texcoord, 316 GL_STATIC_DRAW); 311 glBufferData(GL_ARRAY_BUFFER, _vertexCount * sizeof(float) * 3, texcoord, 312 GL_STATIC_DRAW); 317 313 glBindBuffer(GL_ARRAY_BUFFER, 0); 318 314 319 free(texcoord);315 delete [] texcoord; 320 316 321 317 … … 326 322 //if (heightMap) 327 323 //{ 328 // 329 // 324 // VertexBuffer* vertexBuffer = new VertexBuffer(VertexBuffer::POSITION3, xCount * yCount, 325 // sizeof(Vector3) * xCount * yCount, heightMap, false); 330 326 if (_indexBuffer) { 331 327 free(_indexBuffer); 332 328 } 333 329 this->createIndexBuffer(xCount, yCount, _indexBuffer, _indexCount, heights); … … 347 343 348 344 for (int y = 0; y < yCount; ++y) { 349 350 351 352 353 354 355 356 357 358 359 360 345 float yCoord; 346 347 yCoord = startY + ((endY - startY) * y) / (yCount - 1); 348 for (int x = 0; x < xCount; ++x) { 349 float xCoord; 350 351 xCoord = startX + ((endX - startX) * x) / (xCount - 1); 352 dstDataPtr->set(xCoord, *srcDataPtr, yCoord); 353 354 ++dstDataPtr; 355 ++srcDataPtr; 356 } 361 357 } 362 358 return vertices; -
trunk/vizservers/nanovis/HeightMap.h
r913 r927 37 37 Vector3 _centerPoint; 38 38 39 double _vmin; // minimum (unscaled) value in data 40 double _vmax; // maximum (unscaled) value in data 41 42 39 double _limits[3][2]; 40 double _vmin, _vmax; 43 41 public : 44 42 /** … … 108 106 double range_min(void); 109 107 double range_max(void); 108 void set_limits(int axis, double min, double max); 109 void get_limits(int axis, double *minPtr, double *maxPtr); 110 110 }; 111 111 … … 138 138 } 139 139 140 inline void 141 HeightMap::set_limits(int axis, double min, double max) 142 { 143 _limits[axis][0] = min; 144 _limits[axis][1] = max; 145 } 146 147 inline void 148 HeightMap::get_limits(int axis, double *minPtr, double *maxPtr) 149 { 150 *minPtr = _limits[axis][0]; 151 *maxPtr = _limits[axis][1]; 152 } 153 140 154 inline double 141 155 HeightMap::range_min() -
trunk/vizservers/nanovis/Volume.h
r884 r927 57 57 int n_components; 58 58 59 double _limits[3][2]; // min/max for each axis 60 59 61 double vmin; // minimum (unscaled) value in data 60 62 double vmax; // maximum (unscaled) value in data … … 113 115 Vector3* get_location(); 114 116 115 116 117 void set_isosurface(int iso); 118 int get_isosurface() const; 117 119 118 120 double range_min() { return vmin; } … … 153 155 void get_outline_color(float* rgb); 154 156 155 157 void set_limits(int axis, double min, double max); 158 void get_limits(int axis, double *minPtr, double *maxPtr); 156 159 void set_label(int axis, const char* txt); // change the label displayed 157 160 // on an axis … … 180 183 } 181 184 182 inline void Volume::enable_cutplane(int index){ 185 inline void 186 Volume::enable_cutplane(int index) 187 { 183 188 //assert(index < plane.size()); 184 189 plane[index].enabled = true; 185 190 } 186 inline 187 void Volume::disable_cutplane(int index){ 191 inline void 192 Volume::disable_cutplane(int index) 193 { 188 194 //assert(index < plane.size()); 189 195 plane[index].enabled = false; 190 196 } 191 197 192 inline void Volume::move_cutplane(int index, float location){ 198 inline void 199 Volume::move_cutplane(int index, float location) 200 { 193 201 //assert(index < plane.size()); 194 202 plane[index].offset = location; 195 203 } 196 204 197 inline CutPlane* Volume::get_cutplane(int index){ 205 inline CutPlane* 206 Volume::get_cutplane(int index) 207 { 198 208 //assert(index < plane.size()); 199 209 return &plane[index]; 200 210 } 201 211 202 inline int Volume::get_cutplane_count(){ 212 inline int 213 Volume::get_cutplane_count() 214 { 203 215 return plane.size(); 204 216 } 205 217 206 inline bool Volume::cutplane_is_enabled(int index){ 218 inline bool 219 Volume::cutplane_is_enabled(int index) 220 { 207 221 //assert(index < plane.size()); 208 222 return plane[index].enabled; 209 223 } 210 224 211 inline void Volume::set_n_slice(int n) { 225 inline void 226 Volume::set_n_slice(int n) 227 { 212 228 n_slice = n; 213 229 } 214 inline int Volume::get_n_slice() { 230 231 inline int 232 Volume::get_n_slice() 233 { 215 234 return n_slice; 216 235 } 217 236 218 inline void Volume::set_size(float s) { 237 inline void 238 Volume::set_size(float s) 239 { 219 240 size = s; 220 241 aspect_ratio_width = s*tex->aspect_ratio_width; … … 223 244 } 224 245 225 inline float Volume::get_specular() { 246 inline float 247 Volume::get_specular() 248 { 226 249 return specular; 227 250 } 228 251 229 inline float Volume::get_diffuse() { 252 inline float 253 Volume::get_diffuse() 254 { 230 255 return diffuse; 231 256 } 232 257 233 inline float Volume::get_opacity_scale() { 258 inline float 259 Volume::get_opacity_scale() 260 { 234 261 return opacity_scale; 235 262 } 236 263 237 inline void Volume::set_specular(float s) { 264 inline void 265 Volume::set_specular(float s) 266 { 238 267 specular = s; 239 268 } 240 269 241 inline void Volume::set_diffuse(float d) { 270 inline void 271 Volume::set_diffuse(float d) 272 { 242 273 diffuse = d; 243 274 } 244 275 245 inline void Volume::set_opacity_scale(float s) { 276 inline void 277 Volume::set_opacity_scale(float s) 278 { 246 279 opacity_scale = s; 247 280 } 248 281 249 inline void Volume::enable_data() { 282 inline void 283 Volume::enable_data() 284 { 250 285 data_enabled = true; 251 286 } 252 287 253 inline void Volume::disable_data() { 288 inline void 289 Volume::disable_data() 290 { 254 291 data_enabled = false; 255 292 } 256 293 257 inline bool Volume::data_is_enabled() { 294 inline bool 295 Volume::data_is_enabled() 296 { 258 297 return data_enabled; 259 298 } 260 299 261 inline void Volume::enable_outline() { 300 inline void 301 Volume::enable_outline() 302 { 262 303 outline_enabled = true; 263 304 } 264 305 265 inline void Volume::disable_outline() { 306 inline void 307 Volume::disable_outline() 308 { 266 309 outline_enabled = false; 267 310 } 268 311 269 inline bool Volume::outline_is_enabled() { 312 inline bool 313 Volume::outline_is_enabled() 314 { 270 315 return outline_enabled; 271 316 } 272 317 273 inline void Volume::set_outline_color(float *rgb) { 318 inline void 319 Volume::set_outline_color(float *rgb) 320 { 274 321 outline_color = Color(rgb[0],rgb[1],rgb[2]); 275 322 } 276 323 277 inline void Volume::get_outline_color(float *rgb) { 324 inline void 325 Volume::get_outline_color(float *rgb) 326 { 278 327 outline_color.GetRGB(rgb); 279 328 } 280 329 281 inline void Volume::set_label(int axis, const char* txt){ 330 inline void 331 Volume::set_label(int axis, const char* txt) 332 { 282 333 label[axis] = txt; 283 334 } 284 335 285 inline int Volume::get_isosurface() const 286 { 287 return iso_surface; 288 } 289 290 inline void Volume::set_isosurface(int iso) 336 inline void 337 Volume::set_limits(int axis, double min, double max) 338 { 339 _limits[axis][0] = min; 340 _limits[axis][1] = max; 341 } 342 343 inline void 344 Volume::get_limits(int axis, double *minPtr, double *maxPtr) 345 { 346 *minPtr = _limits[axis][0]; 347 *maxPtr = _limits[axis][1]; 348 } 349 350 inline int 351 Volume::get_isosurface() const 352 { 353 return iso_surface; 354 } 355 356 inline void 357 Volume::set_isosurface(int iso) 291 358 { 292 359 iso_surface = iso; -
trunk/vizservers/nanovis/VolumeInterpolator.cpp
r900 r927 1 1 2 #include "VolumeInterpolator.h" 2 3 #include "Volume.h" … … 10 11 #include "Trace.h" 11 12 12 VolumeInterpolator::VolumeInterpolator() 13 : _started(false), _volume(0), _numBytes(0), _interval(8.0), _dataCount(0), _n_components(0), _referenceOfVolume(0) 13 VolumeInterpolator::VolumeInterpolator() : 14 _volume(0), 15 _interval(8.0), 16 _started(false), 17 _numBytes(0), 18 _dataCount(0), 19 _n_components(0), 20 _referenceOfVolume(0) 14 21 { 22 /*empty*/ 15 23 } 16 24 17 25 void VolumeInterpolator::start() 18 26 { 19 if (_volumes.size() != 0) 20 { 27 if (_volumes.size() != 0) { 21 28 Trace("\tVolume Interpolation Started\n"); 22 _started = true; 23 } 24 else 25 { 29 _started = true; 30 } else { 26 31 Trace("\tVolume Interpolation did not get started\n"); 27 32 _started = false; … … 37 42 void VolumeInterpolator::stop() 38 43 { 39 44 _started = false; 40 45 } 41 46 … … 47 52 computeKeys(fraction, _volumes.size(), &interp, &key1, &key2); 48 53 49 if (interp == 0.0f) 50 { 54 if (interp == 0.0f) { 51 55 memcpy(_volume->_data, _volumes[key1]->_data, _numBytes); 52 56 _volume->tex->update(_volume->_data); 53 } 54 else 55 { 57 } else { 56 58 float* data1 = _volumes[key1]->_data; 57 59 float* data2 = _volumes[key2]->_data; … … 59 61 60 62 Vector3 normal1, normal2, normal; 61 for (int i = 0; i < _dataCount; ++i) 62 { 63 for (unsigned int i = 0; i < _dataCount; ++i) { 63 64 *result = interp * (*data2 - *data1) + *data1; 64 65 normal1 = (*(Vector3*)(data1 + 1) - 0.5) * 2; … … 80 81 } 81 82 82 void VolumeInterpolator::computeKeys(float fraction, int count, float* interp, int* key1, int* key2) 83 void 84 VolumeInterpolator::computeKeys(float fraction, int count, float* interp, 85 int* key1, int* key2) 83 86 { 84 int limit = (int) count - 1; 85 if (fraction <= 0) 86 { 87 *key1 = *key2 = 0; 87 int limit = (int) count - 1; 88 if (fraction <= 0) { 89 *key1 = *key2 = 0; 88 90 *interp = 0.0f; 89 } 90 else if (fraction >= 1.0f) 91 { 92 *key1 = *key2 = limit; 91 } else if (fraction >= 1.0f) { 92 *key1 = *key2 = limit; 93 93 *interp = 0.0f; 94 } 95 else 96 { 94 } else { 97 95 int n; 98 96 for (n = 0;n < limit; n++){ 99 if (fraction >= (n / (count - 1.0f)) && fraction < ((n+1)/(count-1.0f))) break; 97 if (fraction >= (n / (count - 1.0f)) && 98 fraction < ((n+1)/(count-1.0f))) { 99 break; 100 } 100 101 } 101 102 102 103 Trace("n = %d count = %d\n", n, count); 103 104 if (n >= limit){ 104 105 *key1 = *key2 = limit; 105 106 *interp = 0.0f; 106 107 } 108 else { 109 *key1 = n; 107 108 } else { 109 *key1 = n; 110 110 *key2 = n+1; 111 111 *interp = (fraction - (n / (count -1.0f))) / ((n + 1) / (count - 1.0f) - n / (count - 1.0f)); 112 112 //*ret = inter * (keyValue[n + 1] - keyValue[n]) + keyValue[n]; 113 113 } … … 115 115 } 116 116 117 void VolumeInterpolator::clearAll() 117 void 118 VolumeInterpolator::clearAll() 118 119 { 119 120 _volumes.clear(); 120 121 121 122 if (_volume) delete _volume; 122 123 } 123 124 124 void VolumeInterpolator::addVolume(Volume* volume, unsigned int volumeId) 125 void 126 VolumeInterpolator::addVolume(Volume* volume, unsigned int volumeId) 125 127 { 126 if (_volumes.size() != 0) 127 {128 if (_volumes[0]->width != volume->width ||_volumes[0]->height != volume->height ||129 _volumes[0]->depth != volume->depth || _volumes[0]->n_components != volume->n_components)130 {128 if (_volumes.size() != 0) { 129 if (_volumes[0]->width != volume->width || 130 _volumes[0]->height != volume->height || 131 _volumes[0]->depth != volume->depth || 132 _volumes[0]->n_components != volume->n_components) { 131 133 printf("The volume should be the same width, height, number of components\n"); 132 134 return; 133 135 } 134 135 } 136 else 137 { 136 137 } else { 138 138 _dataCount = volume->width * volume->height * volume->depth; 139 139 _n_components = volume->n_components; 140 140 _numBytes = _dataCount * _n_components * sizeof(float); 141 _volume = new Volume(volume->location.x, volume->location.y, volume->location.z, 142 volume->width, volume->height, volume->depth, 143 volume->size, 144 volume->n_components, 145 volume->_data, 146 volume->vmin, 147 volume->vmax, volume->nonzero_min); 141 _volume = new Volume(volume->location.x, 142 volume->location.y, 143 volume->location.z, 144 volume->width, volume->height, volume->depth, 145 volume->size, 146 volume->n_components, 147 volume->_data, 148 volume->vmin, 149 volume->vmax, volume->nonzero_min); 148 150 _referenceOfVolume = volumeId; 149 151 _volume->set_n_slice(256-1); … … 157 159 _volume->set_opacity_scale(volume->get_opacity_scale()); 158 160 _volume->set_isosurface(0); 159 160 Trace("VOL : location %f %f %f\n\tid : %d\n", _volume->location.x, _volume->location.y, _volume->location.z,161 161 162 Trace("VOL : location %f %f %f\n\tid : %d\n", _volume->location.x, 163 _volume->location.y, _volume->location.z, volumeId); 162 164 } 163 165 164 _volumes.push_back(volume); 165 166 _volumes.push_back(volume); 166 167 Trace("a Volume[%d] is added to VolumeInterpolator\n", volumeId); 167 168 } -
trunk/vizservers/nanovis/VolumeInterpolator.h
r900 r927 9 9 Volume* _volume; 10 10 11 11 std::vector<Volume*> _volumes; 12 12 13 13 double _interval; 14 14 bool _started; 15 15 unsigned int _numBytes; 16 16 unsigned int _dataCount; … … 20 20 21 21 public : 22 23 24 25 26 27 28 22 VolumeInterpolator(); 23 void addVolume(Volume* vol, unsigned int volumeId); 24 void clearAll(); 25 26 void start(); 27 Volume* update(float fraction); 28 void stop(); 29 29 void computeKeys(float fraction, int count, float* interp, int* key1, int* key2); 30 30 bool is_started() const; -
trunk/vizservers/nanovis/VolumeRenderer.cpp
r923 r927 84 84 VolumeRenderer::shade_volume(Volume* _vol, TransferFunction* _tf) 85 85 { 86 for (int i=0; i < volume.size(); i++) {87 88 89 90 }86 for (unsigned int i=0; i < volume.size(); i++) { 87 if (volume[i] == _vol) { 88 tf[i] = _tf; 89 } 90 } 91 91 } 92 92 … … 94 94 VolumeRenderer::get_volume_shading(Volume* _vol) 95 95 { 96 for (int i=0; i < volume.size(); i++) {97 if (volume[i] == _vol) {98 return tf[i];99 }100 }101 return NULL;96 for (unsigned int i=0; i < volume.size(); i++) { 97 if (volume[i] == _vol) { 98 return tf[i]; 99 } 100 } 101 return NULL; 102 102 } 103 103 -
trunk/vizservers/nanovis/dxReader.cpp
r911 r927 1 1 2 2 /* 3 3 * ---------------------------------------------------------------------- … … 5 5 * 6 6 * dxReader.cpp 7 * 7 * This module contains openDX readers for 2D and 3D volumes. 8 8 * 9 9 * ====================================================================== … … 51 51 int ngen = 0, sindex = 0; 52 52 for (sindex = 0; sindex <size; ++sindex) { 53 54 55 56 53 data[ngen++] = scalar[sindex]; 54 data[ngen++] = g[sindex].x; 55 data[ngen++] = g[sindex].y; 56 data[ngen++] = g[sindex].z; 57 57 } 58 58 return data; … … 66 66 for (int i = 0; i < count; ++i) { 67 67 fdata[i] = fdata[i] / v; 68 68 } 69 69 } 70 70 } … … 72 72 static float* 73 73 computeGradient(float* fdata, int width, int height, int depth, 74 74 float min, float max) 75 75 { 76 76 float* gradients = (float *)malloc(width * height * depth * 3 * 77 77 sizeof(float)); 78 78 float* tempGradients = (float *)malloc(width * height * depth * 3 * 79 79 sizeof(float)); 80 80 int sizes[3] = { width, height, depth }; 81 81 computeGradients(tempGradients, fdata, sizes, DATRAW_FLOAT); … … 97 97 char line[128], type[128], *start; 98 98 99 dx = dy = dz = 0.0; 99 dx = dy = dz = 0.0; // Suppress compiler warning. 100 100 while (!fin.eof()) { 101 101 fin.getline(line, sizeof(line) - 1); 102 103 104 105 102 if (fin.fail()) { 103 //return result.error("error in data stream"); 104 return; 105 } 106 106 for (start=&line[0]; *start == ' ' || *start == '\t'; start++) 107 107 ; // skip leading blanks … … 115 115 // found one of the delta lines 116 116 if (ddx != 0.0) { 117 118 119 120 121 122 117 dx = ddx; 118 } else if (ddy != 0.0) { 119 dy = ddy; 120 } else if (ddz != 0.0) { 121 dz = ddz; 122 } 123 123 } else if (sscanf(start, "object %d class array type %s shape 3 rank 1 items %d data follows", &dummy, type, &npts) == 3) { 124 124 if (npts != nx*ny*nz) { … … 185 185 #ifndef NV40 186 186 // must be an even power of 2 for older cards 187 188 189 187 nx = (int)pow(2.0, ceil(log10((double)nx)/log10(2.0))); 188 ny = (int)pow(2.0, ceil(log10((double)ny)/log10(2.0))); 189 nz = (int)pow(2.0, ceil(log10((double)nz)/log10(2.0))); 190 190 #endif 191 191 … … 211 211 vz = zfield.value(xval,yval,zval); 212 212 213 double vm = sqrt(vx*vx + vy*vy + vz*vz); 214 215 if (vm < vmin) { vmin = vm; } 216 if (vm > vmax) { vmax = vm; } 217 if (vm != 0.0f && vm < nzero_min) 218 { 213 double vm; 214 vm = sqrt(vx*vx + vy*vy + vz*vz); 215 if (vm < vmin) { 216 vmin = vm; 217 } else if (vm > vmax) { 218 vmax = vm; 219 } 220 if ((vm != 0.0f) && (vm < nzero_min)) { 219 221 nzero_min = vm; 220 222 } 221 222 223 data[ngen++] = vx; 223 224 data[ngen++] = vy; … … 233 234 data[ngen] = (data[ngen]/(2.0*vmax) + 0.5); 234 235 } 235 NanoVis::load_volume(index, nx, ny, nz, 3, data, vmin, vmax, nzero_min); 236 Volume *volPtr; 237 volPtr = NanoVis::load_volume(index, nx, ny, nz, 3, data, vmin, vmax, 238 nzero_min); 239 volPtr->set_limits(0, x0, x0 + (nx * ddx)); 240 volPtr->set_limits(1, y0, y0 + (ny * ddy)); 241 volPtr->set_limits(2, z0, z0 + (nz * ddz)); 236 242 delete [] data; 237 243 } else { … … 254 260 255 261 int isrect = 1; 256 dx = dy = dz = 0.0; 262 dx = dy = dz = 0.0; // Suppress compiler warning. 257 263 do { 258 264 fin.getline(line,sizeof(line)-1); … … 265 271 // found grid size 266 272 isrect = 1; 267 } 268 else if (sscanf(start, "object %d class array type float rank 1 shape 3 items %d data follows", &dummy, &nxy) == 2) { 273 } else if (sscanf(start, "object %d class array type float rank 1 shape 3 items %d data follows", &dummy, &nxy) == 2) { 269 274 isrect = 0; 270 275 double xx, yy, zz; … … 280 285 result.error(mesg); 281 286 return result; 287 288 char fpts[128]; 289 sprintf(fpts, "/tmp/tmppts%d", getpid()); 290 char fcells[128]; 291 sprintf(fcells, "/tmp/tmpcells%d", getpid()); 292 293 std::ofstream ftmp(fpts); 294 // save corners of bounding box first, to work around meshing 295 // problems in voronoi utility 296 ftmp << xymesh.rangeMin(Rappture::xaxis) << " " 297 << xymesh.rangeMin(Rappture::yaxis) << std::endl; 298 ftmp << xymesh.rangeMax(Rappture::xaxis) << " " 299 << xymesh.rangeMin(Rappture::yaxis) << std::endl; 300 ftmp << xymesh.rangeMax(Rappture::xaxis) << " " 301 << xymesh.rangeMax(Rappture::yaxis) << std::endl; 302 ftmp << xymesh.rangeMin(Rappture::xaxis) << " " 303 << xymesh.rangeMax(Rappture::yaxis) << std::endl; 304 for (int i=0; i < nxy; i++) { 305 ftmp << xymesh.atNode(i).x() << " " << xymesh.atNode(i).y() << std::endl; 306 307 } 308 ftmp.close(); 309 310 char cmdstr[512]; 311 sprintf(cmdstr, "voronoi -t < %s > %s", fpts, fcells); 312 if (system(cmdstr) == 0) { 313 int cx, cy, cz; 314 std::ifstream ftri(fcells); 315 while (!ftri.eof()) { 316 ftri.getline(line,sizeof(line)-1); 317 if (sscanf(line, "%d %d %d", &cx, &cy, &cz) == 3) { 318 if (cx >= 4 && cy >= 4 && cz >= 4) { 319 // skip first 4 boundary points 320 xymesh.addCell(cx-4, cy-4, cz-4); 321 } 322 } 323 } 324 ftri.close(); 325 } else { 326 return result.error("triangularization failed"); 327 } 328 329 sprintf(cmdstr, "rm -f %s %s", fpts, fcells); 330 system(cmdstr); 331 } else if (sscanf(start, "object %d class regulararray count %d", &dummy, &nz) == 2) { 332 // found z-grid 333 } else if (sscanf(start, "origin %lg %lg %lg", &x0, &y0, &z0) == 3) { 334 // found origin 335 } else if (sscanf(start, "delta %lg %lg %lg", &ddx, &ddy, &ddz) == 3) { 336 int count = 0; 337 // found one of the delta lines 338 if (ddx != 0.0) { 339 dx = ddx; 340 count++; 341 } 342 if (ddy != 0.0) { 343 dy = ddy; 344 count++; 345 } 346 if (ddz != 0.0) { 347 dz = ddz; 348 count++; 349 } 350 if (count > 1) { 351 return result.error( 352 "don't know how to handle multiple non-zero delta values"); 353 } 354 } else if (sscanf(start, "object %d class array type %s rank 0 items %d data follows", &dummy, type, &npts) == 3) { 355 if (isrect && (npts != nx*ny*nz)) { 356 char mesg[256]; 357 sprintf(mesg,"inconsistent data: expected %d points but found %d points", nx*ny*nz, npts); 358 return result.error(mesg); 359 } else if (!isrect && (npts != nxy*nz)) { 360 char mesg[256]; 361 sprintf(mesg,"inconsistent data: expected %d points but found %d points", nxy*nz, npts); 362 return result.error(mesg); 363 } 364 break; 365 } else if (sscanf(start, "object %d class array type %s rank 0 times %d data follows", &dummy, type, &npts) == 3) { 366 if (npts != nx*ny*nz) { 367 char mesg[256]; 368 sprintf(mesg,"inconsistent data: expected %d points but found %d points", nx*ny*nz, npts); 369 return result.error(mesg); 370 } 371 break; 372 } 373 } 374 } while (!fin.eof()); 375 376 // read data points 377 if (!fin.eof()) { 378 if (isrect) { 379 double dval[6]; 380 int nread = 0; 381 int ix = 0; 382 int iy = 0; 383 int iz = 0; 384 float* data = new float[nx * ny * nz * 4]; 385 memset(data, 0, nx*ny*nz*4); 386 double vmin = 1e21; 387 double nzero_min = 1e21; 388 double vmax = -1e21; 389 390 391 while (!fin.eof() && nread < npts) { 392 fin.getline(line,sizeof(line)-1); 393 int n = sscanf(line, "%lg %lg %lg %lg %lg %lg", &dval[0], &dval[1], &dval[2], &dval[3], &dval[4], &dval[5]); 394 395 for (int p=0; p < n; p++) { 396 int nindex = (iz*nx*ny + iy*nx + ix) * 4; 397 data[nindex] = dval[p]; 398 399 if (dval[p] < vmin) { 400 vmin = dval[p]; 401 } else if (dval[p] > vmax) { 402 vmax = dval[p]; 403 } 404 if (dval[p] != 0.0f && dval[p] < nzero_min) { 405 nzero_min = dval[p]; 406 } 407 408 nread++; 409 if (++iz >= nz) { 410 iz = 0; 411 if (++iy >= ny) { 412 iy = 0; 413 ++ix; 414 } 415 } 416 } 417 } 418 419 // make sure that we read all of the expected points 420 if (nread != nx*ny*nz) { 421 char mesg[256]; 422 sprintf(mesg,"inconsistent data: expected %d points but found %d points", nx*ny*nz, nread); 423 result.error(mesg); 424 return result; 425 } 426 427 double dv = vmax - vmin; 428 int count = nx*ny*nz; 429 int ngen = 0; 430 double v; 431 printf("test2\n"); 432 fflush(stdout); 433 if (dv == 0.0) { 434 dv = 1.0; 435 } 436 for (int i = 0; i < count; ++i) { 437 v = data[ngen]; 438 // scale all values [0-1], -1 => out of bounds 439 v = (isnan(v)) ? -1.0 : (v - vmin)/dv; 440 data[ngen] = v; 441 ngen += 4; 442 } 443 // Compute the gradient of this data. BE CAREFUL: center 444 // calculation on each node to avoid skew in either direction. 445 ngen = 0; 446 for (int iz=0; iz < nz; iz++) { 447 for (int iy=0; iy < ny; iy++) { 448 for (int ix=0; ix < nx; ix++) { 449 // gradient in x-direction 450 double valm1 = (ix == 0) ? 0.0 : data[ngen - 4]; 451 double valp1 = (ix == nx-1) ? 0.0 : data[ngen + 4]; 452 if (valm1 < 0 || valp1 < 0) { 453 data[ngen+1] = 0.0; 454 } else { 455 data[ngen+1] = valp1-valm1; // assume dx=1 456 //data[ngen+1] = ((valp1-valm1) + 1) * 0.5; // assume dx=1 457 } 458 459 // gradient in y-direction 460 valm1 = (iy == 0) ? 0.0 : data[ngen-4*nx]; 461 valp1 = (iy == ny-1) ? 0.0 : data[ngen+4*nx]; 462 if (valm1 < 0 || valp1 < 0) { 463 data[ngen+2] = 0.0; 464 } else { 465 data[ngen+2] = valp1-valm1; // assume dx=1 466 //data[ngen+2] = ((valp1-valm1) + 1) * 0.5; // assume dy=1 467 } 468 469 // gradient in z-direction 470 valm1 = (iz == 0) ? 0.0 : data[ngen-4*nx*ny]; 471 valp1 = (iz == nz-1) ? 0.0 : data[ngen+4*nx*ny]; 472 if (valm1 < 0 || valp1 < 0) { 473 data[ngen+3] = 0.0; 474 } else { 475 data[ngen+3] = valp1-valm1; // assume dx=1 476 //data[ngen+3] = ((valp1-valm1) + 1.0) * 0.5; // assume dz=1 477 } 478 479 ngen += 4; 480 } 481 } 482 } 483 484 dx = nx; 485 dy = ny; 486 dz = nz; 487 Volume *volPtr; 488 volPtr = NanoVis::load_volume(index, nx, ny, nz, 4, data, 489 vmin, vmax, nzero_min); 490 volPtr->set_limits(NanoVis::X, x0, x0 + (nx * ddx)); 491 volPtr->set_limits(NanoVis::Y, y0, y0 + (ny * ddy)); 492 volPtr->set_limits(NanoVis::Z, z0, z0 + (nz * ddz)); 493 delete [] data; 494 495 } else { 496 Rappture::Mesh1D zgrid(z0, z0+nz*dz, nz); 497 Rappture::FieldPrism3D field(xymesh, zgrid); 498 499 double dval; 500 int nread = 0; 501 int ixy = 0; 502 int iz = 0; 503 while (!fin.eof() && nread < npts) { 504 fin >> dval; 505 if (fin.fail()) { 506 char mesg[256]; 507 sprintf(mesg,"after %d of %d points: can't read number", 508 nread, npts); 509 return result.error(mesg); 510 } else { 511 int nid = nxy*iz + ixy; 512 field.define(nid, dval); 513 514 nread++; 515 if (++iz >= nz) { 516 iz = 0; 517 ixy++; 518 } 519 } 520 } 521 522 // make sure that we read all of the expected points 523 if (nread != nxy*nz) { 524 char mesg[256]; 525 sprintf(mesg,"inconsistent data: expected %d points but found %d points", nxy*nz, nread); 526 return result.error(mesg); 527 } 528 529 // figure out a good mesh spacing 530 int nsample = 30; 531 x0 = field.rangeMin(Rappture::xaxis); 532 dx = field.rangeMax(Rappture::xaxis) - field.rangeMin(Rappture::xaxis); 533 y0 = field.rangeMin(Rappture::yaxis); 534 dy = field.rangeMax(Rappture::yaxis) - field.rangeMin(Rappture::yaxis); 535 z0 = field.rangeMin(Rappture::zaxis); 536 dz = field.rangeMax(Rappture::zaxis) - field.rangeMin(Rappture::zaxis); 537 double dmin = pow((dx*dy*dz)/(nsample*nsample*nsample), 0.333); 538 539 nx = (int)ceil(dx/dmin); 540 ny = (int)ceil(dy/dmin); 541 nz = (int)ceil(dz/dmin); 542 #ifndef NV40 543 // must be an even power of 2 for older cards 544 nx = (int)pow(2.0, ceil(log10((double)nx)/log10(2.0))); 545 ny = (int)pow(2.0, ceil(log10((double)ny)/log10(2.0))); 546 nz = (int)pow(2.0, ceil(log10((double)nz)/log10(2.0))); 547 #endif 548 float *data = new float[4*nx*ny*nz]; 549 550 double vmin = field.valueMin(); 551 double dv = field.valueMax() - field.valueMin(); 552 if (dv == 0.0) { 553 dv = 1.0; 554 } 555 // generate the uniformly sampled data that we need for a volume 556 int ngen = 0; 557 double nzero_min = 0.0; 558 for (iz=0; iz < nz; iz++) { 559 double zval = z0 + iz*dmin; 560 for (int iy=0; iy < ny; iy++) { 561 double yval = y0 + iy*dmin; 562 for (int ix=0; ix < nx; ix++) { 563 double xval = x0 + ix*dmin; 564 double v = field.value(xval,yval,zval); 565 566 if (v != 0.0f && v < nzero_min) 567 { 568 nzero_min = v; 569 } 570 // scale all values [0-1], -1 => out of bounds 571 v = (isnan(v)) ? -1.0 : (v - vmin)/dv; 572 data[ngen] = v; 573 574 ngen += 4; 575 } 576 } 577 } 578 579 // Compute the gradient of this data. BE CAREFUL: center 580 // calculation on each node to avoid skew in either direction. 581 ngen = 0; 582 for (int iz=0; iz < nz; iz++) { 583 for (int iy=0; iy < ny; iy++) { 584 for (int ix=0; ix < nx; ix++) { 585 // gradient in x-direction 586 double valm1 = (ix == 0) ? 0.0 : data[ngen-4]; 587 double valp1 = (ix == nx-1) ? 0.0 : data[ngen+4]; 588 if (valm1 < 0 || valp1 < 0) { 589 data[ngen+1] = 0.0; 590 } else { 591 //data[ngen+1] = valp1-valm1; // assume dx=1 592 data[ngen+1] = ((valp1-valm1) + 1.0) * 0.5; // assume dz=1 593 } 594 595 // gradient in y-direction 596 valm1 = (iy == 0) ? 0.0 : data[ngen-4*nx]; 597 valp1 = (iy == ny-1) ? 0.0 : data[ngen+4*nx]; 598 if (valm1 < 0 || valp1 < 0) { 599 data[ngen+2] = 0.0; 600 } else { 601 //data[ngen+2] = valp1-valm1; // assume dy=1 602 data[ngen+2] = ((valp1-valm1) + 1.0) * 0.5; // assume dz=1 603 } 604 605 // gradient in z-direction 606 valm1 = (iz == 0) ? 0.0 : data[ngen-4*nx*ny]; 607 valp1 = (iz == nz-1) ? 0.0 : data[ngen+4*nx*ny]; 608 if (valm1 < 0 || valp1 < 0) { 609 data[ngen+3] = 0.0; 610 } else { 611 //data[ngen+3] = valp1-valm1; // assume dz=1 612 data[ngen+3] = ((valp1-valm1) + 1.0) * 0.5; // assume dz=1 613 } 614 615 ngen += 4; 616 } 617 } 618 } 619 620 Volume *volPtr; 621 volPtr = NanoVis::load_volume(index, nx, ny, nz, 4, data, 622 field.valueMin(), field.valueMax(), nzero_min); 623 volPtr->set_limits(0, field.rangeMin(Rappture::xaxis), 624 field.rangeMax(Rappture::xaxis)); 625 volPtr->set_limits(1, field.rangeMin(Rappture::yaxis), 626 field.rangeMax(Rappture::yaxis)); 627 volPtr->set_limits(2, field.rangeMin(Rappture::zaxis), 628 field.rangeMax(Rappture::zaxis)); 629 delete [] data; 630 } 631 } else { 632 return result.error("data not found in stream"); 633 } 634 635 // 636 // Center this new volume on the origin. 637 // 638 float dx0 = -0.5; 639 float dy0 = -0.5*dy/dx; 640 float dz0 = -0.5*dz/dx; 641 NanoVis::volume[index]->move(Vector3(dx0, dy0, dz0)); 642 643 return result; 644 } 645 646 Rappture::Outcome 647 load_volume_stream(int index, std::iostream& fin) 648 { 649 Rappture::Outcome result; 650 651 Rappture::MeshTri2D xymesh; 652 int dummy, nx, ny, nz, nxy, npts; 653 double x0, y0, z0, dx, dy, dz, ddx, ddy, ddz; 654 char line[128], type[128], *start; 655 656 int isrect = 1; 657 658 dx = dy = dz = 0.0; // Suppress compiler warning. 659 while (!fin.eof()) { 660 fin.getline(line, sizeof(line) - 1); 661 if (fin.fail()) { 662 return result.error("error in data stream"); 663 } 664 for (start=line; *start == ' ' || *start == '\t'; start++) 665 ; // skip leading blanks 666 667 if (*start != '#') { // skip comment lines 668 if (sscanf(start, "object %d class gridpositions counts %d %d %d", &dummy, &nx, &ny, &nz) == 4) { 669 // found grid size 670 isrect = 1; 671 } else if (sscanf(start, "object %d class array type float rank 1 shape 3 items %d data follows", &dummy, &nxy) == 2) { 672 isrect = 0; 673 674 double xx, yy, zz; 675 for (int i=0; i < nxy; i++) { 676 fin.getline(line,sizeof(line)-1); 677 if (sscanf(line, "%lg %lg %lg", &xx, &yy, &zz) == 3) { 678 xymesh.addNode( Rappture::Node2D(xx,yy) ); 679 } 680 } 282 681 283 682 char fpts[128]; … … 353 752 } 354 753 } 355 } while (!fin.eof());754 } 356 755 357 756 // read data points 358 757 if (!fin.eof()) { 359 758 if (isrect) { 759 Rappture::Mesh1D xgrid(x0, x0+nx*dx, nx); 760 Rappture::Mesh1D ygrid(y0, y0+ny*dy, ny); 761 Rappture::Mesh1D zgrid(z0, z0+nz*dz, nz); 762 Rappture::FieldRect3D field(xgrid, ygrid, zgrid); 763 360 764 double dval[6]; 361 765 int nread = 0; … … 363 767 int iy = 0; 364 768 int iz = 0; 365 float* data = new float[nx * ny * nz * 4];366 memset(data, 0, nx*ny*nz*4);367 double vmin = 1e21;368 double nzero_min = 1e21;369 double vmax = -1e21;370 371 372 769 while (!fin.eof() && nread < npts) { 373 770 fin.getline(line,sizeof(line)-1); 771 if (fin.fail()) { 772 return result.error("error reading data points"); 773 } 374 774 int n = sscanf(line, "%lg %lg %lg %lg %lg %lg", &dval[0], &dval[1], &dval[2], &dval[3], &dval[4], &dval[5]); 375 775 376 776 for (int p=0; p < n; p++) { 377 int nindex = (iz*nx*ny + iy*nx + ix) * 4; 378 data[nindex] = dval[p]; 379 380 if (dval[p] < vmin) vmin = dval[p]; 381 if (dval[p] > vmax) vmax = dval[p]; 382 if (dval[p] != 0.0f && dval[p] < nzero_min) { 383 nzero_min = dval[p]; 384 } 385 777 int nindex = iz*nx*ny + iy*nx + ix; 778 field.define(nindex, dval[p]); 386 779 nread++; 387 780 if (++iz >= nz) { … … 403 796 } 404 797 405 double dv = vmax - vmin; 406 int count = nx*ny*nz; 798 // figure out a good mesh spacing 799 int nsample = 30; 800 dx = field.rangeMax(Rappture::xaxis) - field.rangeMin(Rappture::xaxis); 801 dy = field.rangeMax(Rappture::yaxis) - field.rangeMin(Rappture::yaxis); 802 dz = field.rangeMax(Rappture::zaxis) - field.rangeMin(Rappture::zaxis); 803 double dmin = pow((dx*dy*dz)/(nsample*nsample*nsample), 0.333); 804 805 nx = (int)ceil(dx/dmin); 806 ny = (int)ceil(dy/dmin); 807 nz = (int)ceil(dz/dmin); 808 809 #ifndef NV40 810 // must be an even power of 2 for older cards 811 nx = (int)pow(2.0, ceil(log10((double)nx)/log10(2.0))); 812 ny = (int)pow(2.0, ceil(log10((double)ny)/log10(2.0))); 813 nz = (int)pow(2.0, ceil(log10((double)nz)/log10(2.0))); 814 #endif 815 816 float *cdata = new float[nx*ny*nz]; 407 817 int ngen = 0; 408 double v; 409 printf("test2\n"); 410 fflush(stdout); 411 if (dv == 0.0) { dv = 1.0; } 412 for (int i = 0; i < count; ++i) 413 { 414 v = data[ngen]; 415 // scale all values [0-1], -1 => out of bounds 416 v = (isnan(v)) ? -1.0 : (v - vmin)/dv; 417 data[ngen] = v; 418 ngen += 4; 419 } 818 double nzero_min = 0.0; 819 for (int iz=0; iz < nz; iz++) { 820 double zval = z0 + iz*dmin; 821 for (int iy=0; iy < ny; iy++) { 822 double yval = y0 + iy*dmin; 823 for (int ix=0; ix < nx; ix++) { 824 double xval = x0 + ix*dmin; 825 double v = field.value(xval,yval,zval); 826 827 if (v != 0.0f && v < nzero_min) { 828 nzero_min = v; 829 } 830 831 // scale all values [0-1], -1 => out of bounds 832 v = (isnan(v)) ? -1.0 : v; 833 834 cdata[ngen] = v; 835 ++ngen; 836 } 837 } 838 } 839 840 float* data = computeGradient(cdata, nx, ny, nz, field.valueMin(), 841 field.valueMax()); 420 842 421 843 // Compute the gradient of this data. BE CAREFUL: center 422 // calculation on each node to avoid skew in either direction. 423 ngen = 0; 424 for (int iz=0; iz < nz; iz++) { 425 for (int iy=0; iy < ny; iy++) { 426 for (int ix=0; ix < nx; ix++) { 427 // gradient in x-direction 428 double valm1 = (ix == 0) ? 0.0 : data[ngen - 4]; 429 double valp1 = (ix == nx-1) ? 0.0 : data[ngen + 4]; 430 if (valm1 < 0 || valp1 < 0) { 431 data[ngen+1] = 0.0; 432 } else { 433 data[ngen+1] = valp1-valm1; // assume dx=1 434 //data[ngen+1] = ((valp1-valm1) + 1) * 0.5; // assume dx=1 435 } 436 437 // gradient in y-direction 438 valm1 = (iy == 0) ? 0.0 : data[ngen-4*nx]; 439 valp1 = (iy == ny-1) ? 0.0 : data[ngen+4*nx]; 440 if (valm1 < 0 || valp1 < 0) { 441 data[ngen+2] = 0.0; 442 } else { 443 data[ngen+2] = valp1-valm1; // assume dx=1 444 //data[ngen+2] = ((valp1-valm1) + 1) * 0.5; // assume dy=1 445 } 446 447 // gradient in z-direction 448 valm1 = (iz == 0) ? 0.0 : data[ngen-4*nx*ny]; 449 valp1 = (iz == nz-1) ? 0.0 : data[ngen+4*nx*ny]; 450 if (valm1 < 0 || valp1 < 0) { 451 data[ngen+3] = 0.0; 452 } else { 453 data[ngen+3] = valp1-valm1; // assume dx=1 454 //data[ngen+3] = ((valp1-valm1) + 1.0) * 0.5; // assume dz=1 455 } 456 457 ngen += 4; 458 } 459 } 460 } 461 462 dx = nx; 463 dy = ny; 464 dz = nz; 465 NanoVis::load_volume(index, nx, ny, nz, 4, data, 466 vmin, vmax, nzero_min); 467 844 /* 845 float *data = new float[4*nx*ny*nz]; 846 847 double vmin = field.valueMin(); 848 double dv = field.valueMax() - field.valueMin(); 849 if (dv == 0.0) { dv = 1.0; } 850 851 // generate the uniformly sampled data that we need for a volume 852 int ngen = 0; 853 double nzero_min = 0.0; 854 for (int iz=0; iz < nz; iz++) { 855 double zval = z0 + iz*dmin; 856 for (int iy=0; iy < ny; iy++) { 857 double yval = y0 + iy*dmin; 858 for (int ix=0; ix < nx; ix++) { 859 double xval = x0 + ix*dmin; 860 double v = field.value(xval,yval,zval); 861 862 if (v != 0.0f && v < nzero_min) 863 { 864 nzero_min = v; 865 } 866 867 // scale all values [0-1], -1 => out of bounds 868 v = (isnan(v)) ? -1.0 : (v - vmin)/dv; 869 870 data[ngen] = v; 871 ngen += 4; 872 } 873 } 874 } 875 // Compute the gradient of this data. BE CAREFUL: center 876 // calculation on each node to avoid skew in either direction. 877 ngen = 0; 878 for (int iz=0; iz < nz; iz++) { 879 for (int iy=0; iy < ny; iy++) { 880 for (int ix=0; ix < nx; ix++) { 881 // gradient in x-direction 882 double valm1 = (ix == 0) ? 0.0 : data[ngen-4]; 883 double valp1 = (ix == nx-1) ? 0.0 : data[ngen+4]; 884 if (valm1 < 0 || valp1 < 0) { 885 data[ngen+1] = 0.0; 886 } else { 887 data[ngen+1] = ((valp1-valm1) + 1) * 0.5; // assume dx=1 888 } 889 890 // gradient in y-direction 891 valm1 = (iy == 0) ? 0.0 : data[ngen-4*nx]; 892 valp1 = (iy == ny-1) ? 0.0 : data[ngen+4*nx]; 893 if (valm1 < 0 || valp1 < 0) { 894 data[ngen+2] = 0.0; 895 } else { 896 //data[ngen+2] = valp1-valm1; // assume dy=1 897 data[ngen+2] = ((valp1-valm1) + 1) * 0.5; // assume dx=1 898 } 899 900 // gradient in z-direction 901 valm1 = (iz == 0) ? 0.0 : data[ngen-4*nx*ny]; 902 valp1 = (iz == nz-1) ? 0.0 : data[ngen+4*nx*ny]; 903 if (valm1 < 0 || valp1 < 0) { 904 data[ngen+3] = 0.0; 905 } else { 906 //data[ngen+3] = valp1-valm1; // assume dz=1 907 data[ngen+3] = ((valp1-valm1) + 1) * 0.5; // assume dz=1 908 } 909 910 ngen += 4; 911 } 912 } 913 } 914 */ 915 916 Volume *volPtr; 917 volPtr = NanoVis::load_volume(index, nx, ny, nz, 4, data, 918 field.valueMin(), field.valueMax(), nzero_min); 919 volPtr->set_limits(0, field.rangeMin(Rappture::xaxis), 920 field.rangeMax(Rappture::xaxis)); 921 volPtr->set_limits(1, field.rangeMin(Rappture::yaxis), 922 field.rangeMax(Rappture::yaxis)); 923 volPtr->set_limits(2, field.rangeMin(Rappture::zaxis), 924 field.rangeMax(Rappture::zaxis)); 925 // TBD.. 926 // POINTSET 927 /* 928 PointSet* pset = new PointSet(); 929 pset->initialize(volume[index], (float*) data); 930 pset->setVisible(true); 931 NanoVis::pointSet.push_back(pset); 932 updateColor(pset); 933 NanoVis::volume[index]->pointsetIndex = NanoVis::pointSet.size() - 1; 934 */ 935 468 936 delete [] data; 469 937 … … 477 945 int iz = 0; 478 946 while (!fin.eof() && nread < npts) { 479 947 fin >> dval; 480 948 if (fin.fail()) { 481 482 483 484 485 949 char mesg[256]; 950 sprintf(mesg,"after %d of %d points: can't read number", 951 nread, npts); 952 return result.error(mesg); 953 } else { 486 954 int nid = nxy*iz + ixy; 487 955 field.define(nid, dval); … … 517 985 #ifndef NV40 518 986 // must be an even power of 2 for older cards 519 520 521 987 nx = (int)pow(2.0, ceil(log10((double)nx)/log10(2.0))); 988 ny = (int)pow(2.0, ceil(log10((double)ny)/log10(2.0))); 989 nz = (int)pow(2.0, ceil(log10((double)nz)/log10(2.0))); 522 990 #endif 523 991 float *data = new float[4*nx*ny*nz]; … … 539 1007 540 1008 if (v != 0.0f && v < nzero_min) 541 { 542 nzero_min = v; 543 } 544 // scale all values [0-1], -1 => out of bounds 545 v = (isnan(v)) ? -1.0 : (v - vmin)/dv; 546 data[ngen] = v; 547 548 ngen += 4; 549 } 550 } 551 } 552 553 // Compute the gradient of this data. BE CAREFUL: center 554 // calculation on each node to avoid skew in either direction. 555 ngen = 0; 556 for (int iz=0; iz < nz; iz++) { 557 for (int iy=0; iy < ny; iy++) { 558 for (int ix=0; ix < nx; ix++) { 559 // gradient in x-direction 560 double valm1 = (ix == 0) ? 0.0 : data[ngen-4]; 561 double valp1 = (ix == nx-1) ? 0.0 : data[ngen+4]; 562 if (valm1 < 0 || valp1 < 0) { 563 data[ngen+1] = 0.0; 564 } else { 565 //data[ngen+1] = valp1-valm1; // assume dx=1 566 data[ngen+1] = ((valp1-valm1) + 1.0) * 0.5; // assume dz=1 567 } 568 569 // gradient in y-direction 570 valm1 = (iy == 0) ? 0.0 : data[ngen-4*nx]; 571 valp1 = (iy == ny-1) ? 0.0 : data[ngen+4*nx]; 572 if (valm1 < 0 || valp1 < 0) { 573 data[ngen+2] = 0.0; 574 } else { 575 //data[ngen+2] = valp1-valm1; // assume dy=1 576 data[ngen+2] = ((valp1-valm1) + 1.0) * 0.5; // assume dz=1 577 } 578 579 // gradient in z-direction 580 valm1 = (iz == 0) ? 0.0 : data[ngen-4*nx*ny]; 581 valp1 = (iz == nz-1) ? 0.0 : data[ngen+4*nx*ny]; 582 if (valm1 < 0 || valp1 < 0) { 583 data[ngen+3] = 0.0; 584 } else { 585 //data[ngen+3] = valp1-valm1; // assume dz=1 586 data[ngen+3] = ((valp1-valm1) + 1.0) * 0.5; // assume dz=1 587 } 588 589 ngen += 4; 590 } 591 } 592 } 593 594 NanoVis::load_volume(index, nx, ny, nz, 4, data, 595 field.valueMin(), field.valueMax(), nzero_min); 596 597 delete [] data; 598 } 599 } else { 600 return result.error("data not found in stream"); 601 } 602 603 // 604 // Center this new volume on the origin. 605 // 606 float dx0 = -0.5; 607 float dy0 = -0.5*dy/dx; 608 float dz0 = -0.5*dz/dx; 609 NanoVis::volume[index]->move(Vector3(dx0, dy0, dz0)); 610 611 return result; 612 } 613 614 Rappture::Outcome 615 load_volume_stream(int index, std::iostream& fin) 616 { 617 Rappture::Outcome result; 618 619 Rappture::MeshTri2D xymesh; 620 int dummy, nx, ny, nz, nxy, npts; 621 double x0, y0, z0, dx, dy, dz, ddx, ddy, ddz; 622 char line[128], type[128], *start; 623 624 int isrect = 1; 625 626 dx = dy = dz = 0.0; // Suppress compiler warning. 627 while (!fin.eof()) { 628 fin.getline(line, sizeof(line) - 1); 629 if (fin.fail()) { 630 return result.error("error in data stream"); 631 } 632 for (start=line; *start == ' ' || *start == '\t'; start++) 633 ; // skip leading blanks 634 635 if (*start != '#') { // skip comment lines 636 if (sscanf(start, "object %d class gridpositions counts %d %d %d", &dummy, &nx, &ny, &nz) == 4) { 637 // found grid size 638 isrect = 1; 639 } else if (sscanf(start, "object %d class array type float rank 1 shape 3 items %d data follows", &dummy, &nxy) == 2) { 640 isrect = 0; 641 642 double xx, yy, zz; 643 for (int i=0; i < nxy; i++) { 644 fin.getline(line,sizeof(line)-1); 645 if (sscanf(line, "%lg %lg %lg", &xx, &yy, &zz) == 3) { 646 xymesh.addNode( Rappture::Node2D(xx,yy) ); 647 } 648 } 649 650 char fpts[128]; 651 sprintf(fpts, "/tmp/tmppts%d", getpid()); 652 char fcells[128]; 653 sprintf(fcells, "/tmp/tmpcells%d", getpid()); 654 655 std::ofstream ftmp(fpts); 656 // save corners of bounding box first, to work around meshing 657 // problems in voronoi utility 658 ftmp << xymesh.rangeMin(Rappture::xaxis) << " " 659 << xymesh.rangeMin(Rappture::yaxis) << std::endl; 660 ftmp << xymesh.rangeMax(Rappture::xaxis) << " " 661 << xymesh.rangeMin(Rappture::yaxis) << std::endl; 662 ftmp << xymesh.rangeMax(Rappture::xaxis) << " " 663 << xymesh.rangeMax(Rappture::yaxis) << std::endl; 664 ftmp << xymesh.rangeMin(Rappture::xaxis) << " " 665 << xymesh.rangeMax(Rappture::yaxis) << std::endl; 666 for (int i=0; i < nxy; i++) { 667 ftmp << xymesh.atNode(i).x() << " " << xymesh.atNode(i).y() << std::endl; 668 669 } 670 ftmp.close(); 671 672 char cmdstr[512]; 673 sprintf(cmdstr, "voronoi -t < %s > %s", fpts, fcells); 674 if (system(cmdstr) == 0) { 675 int cx, cy, cz; 676 std::ifstream ftri(fcells); 677 while (!ftri.eof()) { 678 ftri.getline(line,sizeof(line)-1); 679 if (sscanf(line, "%d %d %d", &cx, &cy, &cz) == 3) { 680 if (cx >= 4 && cy >= 4 && cz >= 4) { 681 // skip first 4 boundary points 682 xymesh.addCell(cx-4, cy-4, cz-4); 1009 { 1010 nzero_min = v; 683 1011 } 684 }685 }686 ftri.close();687 } else {688 return result.error("triangularization failed");689 }690 691 sprintf(cmdstr, "rm -f %s %s", fpts, fcells);692 system(cmdstr);693 } else if (sscanf(start, "object %d class regulararray count %d", &dummy, &nz) == 2) {694 // found z-grid695 } else if (sscanf(start, "origin %lg %lg %lg", &x0, &y0, &z0) == 3) {696 // found origin697 } else if (sscanf(start, "delta %lg %lg %lg", &ddx, &ddy, &ddz) == 3) {698 // found one of the delta lines699 if (ddx != 0.0) { dx = ddx; }700 else if (ddy != 0.0) { dy = ddy; }701 else if (ddz != 0.0) { dz = ddz; }702 } else if (sscanf(start, "object %d class array type %s rank 0 items %d data follows", &dummy, type, &npts) == 3) {703 if (isrect && (npts != nx*ny*nz)) {704 char mesg[256];705 sprintf(mesg,"inconsistent data: expected %d points but found %d points", nx*ny*nz, npts);706 return result.error(mesg);707 } else if (!isrect && (npts != nxy*nz)) {708 char mesg[256];709 sprintf(mesg,"inconsistent data: expected %d points but found %d points", nxy*nz, npts);710 return result.error(mesg);711 }712 break;713 } else if (sscanf(start, "object %d class array type %s rank 0 times %d data follows", &dummy, type, &npts) == 3) {714 if (npts != nx*ny*nz) {715 char mesg[256];716 sprintf(mesg,"inconsistent data: expected %d points but found %d points", nx*ny*nz, npts);717 return result.error(mesg);718 }719 break;720 }721 }722 }723 724 // read data points725 if (!fin.eof()) {726 if (isrect) {727 Rappture::Mesh1D xgrid(x0, x0+nx*dx, nx);728 Rappture::Mesh1D ygrid(y0, y0+ny*dy, ny);729 Rappture::Mesh1D zgrid(z0, z0+nz*dz, nz);730 Rappture::FieldRect3D field(xgrid, ygrid, zgrid);731 732 double dval[6];733 int nread = 0;734 int ix = 0;735 int iy = 0;736 int iz = 0;737 while (!fin.eof() && nread < npts) {738 fin.getline(line,sizeof(line)-1);739 if (fin.fail()) {740 return result.error("error reading data points");741 }742 int n = sscanf(line, "%lg %lg %lg %lg %lg %lg", &dval[0], &dval[1], &dval[2], &dval[3], &dval[4], &dval[5]);743 744 for (int p=0; p < n; p++) {745 int nindex = iz*nx*ny + iy*nx + ix;746 field.define(nindex, dval[p]);747 nread++;748 if (++iz >= nz) {749 iz = 0;750 if (++iy >= ny) {751 iy = 0;752 ++ix;753 }754 }755 }756 }757 758 // make sure that we read all of the expected points759 if (nread != nx*ny*nz) {760 char mesg[256];761 sprintf(mesg,"inconsistent data: expected %d points but found %d points", nx*ny*nz, nread);762 result.error(mesg);763 return result;764 }765 766 // figure out a good mesh spacing767 int nsample = 30;768 dx = field.rangeMax(Rappture::xaxis) - field.rangeMin(Rappture::xaxis);769 dy = field.rangeMax(Rappture::yaxis) - field.rangeMin(Rappture::yaxis);770 dz = field.rangeMax(Rappture::zaxis) - field.rangeMin(Rappture::zaxis);771 double dmin = pow((dx*dy*dz)/(nsample*nsample*nsample), 0.333);772 773 nx = (int)ceil(dx/dmin);774 ny = (int)ceil(dy/dmin);775 nz = (int)ceil(dz/dmin);776 777 #ifndef NV40778 // must be an even power of 2 for older cards779 nx = (int)pow(2.0, ceil(log10((double)nx)/log10(2.0)));780 ny = (int)pow(2.0, ceil(log10((double)ny)/log10(2.0)));781 nz = (int)pow(2.0, ceil(log10((double)nz)/log10(2.0)));782 #endif783 784 float *cdata = new float[nx*ny*nz];785 int ngen = 0;786 double nzero_min = 0.0;787 for (int iz=0; iz < nz; iz++) {788 double zval = z0 + iz*dmin;789 for (int iy=0; iy < ny; iy++) {790 double yval = y0 + iy*dmin;791 for (int ix=0; ix < nx; ix++) {792 double xval = x0 + ix*dmin;793 double v = field.value(xval,yval,zval);794 795 if (v != 0.0f && v < nzero_min) {796 nzero_min = v;797 }798 799 // scale all values [0-1], -1 => out of bounds800 v = (isnan(v)) ? -1.0 : v;801 802 cdata[ngen] = v;803 ++ngen;804 }805 }806 }807 808 float* data = computeGradient(cdata, nx, ny, nz, field.valueMin(),809 field.valueMax());810 811 // Compute the gradient of this data. BE CAREFUL: center812 /*813 float *data = new float[4*nx*ny*nz];814 815 double vmin = field.valueMin();816 double dv = field.valueMax() - field.valueMin();817 if (dv == 0.0) { dv = 1.0; }818 819 // generate the uniformly sampled data that we need for a volume820 int ngen = 0;821 double nzero_min = 0.0;822 for (int iz=0; iz < nz; iz++) {823 double zval = z0 + iz*dmin;824 for (int iy=0; iy < ny; iy++) {825 double yval = y0 + iy*dmin;826 for (int ix=0; ix < nx; ix++) {827 double xval = x0 + ix*dmin;828 double v = field.value(xval,yval,zval);829 830 if (v != 0.0f && v < nzero_min)831 {832 nzero_min = v;833 }834 835 // scale all values [0-1], -1 => out of bounds836 v = (isnan(v)) ? -1.0 : (v - vmin)/dv;837 838 data[ngen] = v;839 ngen += 4;840 }841 }842 }843 // Compute the gradient of this data. BE CAREFUL: center844 // calculation on each node to avoid skew in either direction.845 ngen = 0;846 for (int iz=0; iz < nz; iz++) {847 for (int iy=0; iy < ny; iy++) {848 for (int ix=0; ix < nx; ix++) {849 // gradient in x-direction850 double valm1 = (ix == 0) ? 0.0 : data[ngen-4];851 double valp1 = (ix == nx-1) ? 0.0 : data[ngen+4];852 if (valm1 < 0 || valp1 < 0) {853 data[ngen+1] = 0.0;854 } else {855 data[ngen+1] = ((valp1-valm1) + 1) * 0.5; // assume dx=1856 }857 858 // gradient in y-direction859 valm1 = (iy == 0) ? 0.0 : data[ngen-4*nx];860 valp1 = (iy == ny-1) ? 0.0 : data[ngen+4*nx];861 if (valm1 < 0 || valp1 < 0) {862 data[ngen+2] = 0.0;863 } else {864 //data[ngen+2] = valp1-valm1; // assume dy=1865 data[ngen+2] = ((valp1-valm1) + 1) * 0.5; // assume dx=1866 }867 868 // gradient in z-direction869 valm1 = (iz == 0) ? 0.0 : data[ngen-4*nx*ny];870 valp1 = (iz == nz-1) ? 0.0 : data[ngen+4*nx*ny];871 if (valm1 < 0 || valp1 < 0) {872 data[ngen+3] = 0.0;873 } else {874 //data[ngen+3] = valp1-valm1; // assume dz=1875 data[ngen+3] = ((valp1-valm1) + 1) * 0.5; // assume dz=1876 }877 878 ngen += 4;879 }880 }881 }882 */883 884 NanoVis::load_volume(index, nx, ny, nz, 4, data,885 field.valueMin(), field.valueMax(), nzero_min);886 887 // TBD..888 // POINTSET889 /*890 PointSet* pset = new PointSet();891 pset->initialize(volume[index], (float*) data);892 pset->setVisible(true);893 NanoVis::pointSet.push_back(pset);894 updateColor(pset);895 NanoVis::volume[index]->pointsetIndex = NanoVis::pointSet.size() - 1;896 */897 898 delete [] data;899 900 } else {901 Rappture::Mesh1D zgrid(z0, z0+nz*dz, nz);902 Rappture::FieldPrism3D field(xymesh, zgrid);903 904 double dval;905 int nread = 0;906 int ixy = 0;907 int iz = 0;908 while (!fin.eof() && nread < npts) {909 fin >> dval;910 if (fin.fail()) {911 char mesg[256];912 sprintf(mesg,"after %d of %d points: can't read number",913 nread, npts);914 return result.error(mesg);915 } else {916 int nid = nxy*iz + ixy;917 field.define(nid, dval);918 919 nread++;920 if (++iz >= nz) {921 iz = 0;922 ixy++;923 }924 }925 }926 927 // make sure that we read all of the expected points928 if (nread != nxy*nz) {929 char mesg[256];930 sprintf(mesg,"inconsistent data: expected %d points but found %d points", nxy*nz, nread);931 return result.error(mesg);932 }933 934 // figure out a good mesh spacing935 int nsample = 30;936 x0 = field.rangeMin(Rappture::xaxis);937 dx = field.rangeMax(Rappture::xaxis) - field.rangeMin(Rappture::xaxis);938 y0 = field.rangeMin(Rappture::yaxis);939 dy = field.rangeMax(Rappture::yaxis) - field.rangeMin(Rappture::yaxis);940 z0 = field.rangeMin(Rappture::zaxis);941 dz = field.rangeMax(Rappture::zaxis) - field.rangeMin(Rappture::zaxis);942 double dmin = pow((dx*dy*dz)/(nsample*nsample*nsample), 0.333);943 944 nx = (int)ceil(dx/dmin);945 ny = (int)ceil(dy/dmin);946 nz = (int)ceil(dz/dmin);947 #ifndef NV40948 // must be an even power of 2 for older cards949 nx = (int)pow(2.0, ceil(log10((double)nx)/log10(2.0)));950 ny = (int)pow(2.0, ceil(log10((double)ny)/log10(2.0)));951 nz = (int)pow(2.0, ceil(log10((double)nz)/log10(2.0)));952 #endif953 float *data = new float[4*nx*ny*nz];954 955 double vmin = field.valueMin();956 double dv = field.valueMax() - field.valueMin();957 if (dv == 0.0) { dv = 1.0; }958 959 // generate the uniformly sampled data that we need for a volume960 int ngen = 0;961 double nzero_min = 0.0;962 for (iz=0; iz < nz; iz++) {963 double zval = z0 + iz*dmin;964 for (int iy=0; iy < ny; iy++) {965 double yval = y0 + iy*dmin;966 for (int ix=0; ix < nx; ix++) {967 double xval = x0 + ix*dmin;968 double v = field.value(xval,yval,zval);969 970 if (v != 0.0f && v < nzero_min)971 {972 nzero_min = v;973 }974 1012 // scale all values [0-1], -1 => out of bounds 975 1013 v = (isnan(v)) ? -1.0 : (v - vmin)/dv; … … 1022 1060 } 1023 1061 1024 NanoVis::load_volume(index, nx, ny, nz, 4, data, 1025 field.valueMin(), field.valueMax(), nzero_min); 1062 Volume *volPtr; 1063 volPtr = NanoVis::load_volume(index, nx, ny, nz, 4, data, 1064 field.valueMin(), field.valueMax(), nzero_min); 1065 volPtr->set_limits(0, field.rangeMin(Rappture::xaxis), 1066 field.rangeMax(Rappture::xaxis)); 1067 volPtr->set_limits(1, field.rangeMin(Rappture::yaxis), 1068 field.rangeMax(Rappture::yaxis)); 1069 volPtr->set_limits(2, field.rangeMin(Rappture::zaxis), 1070 field.rangeMax(Rappture::zaxis)); 1026 1071 1027 1072 // TBD.. 1028 1073 // POINTSET 1029 1074 /* 1030 PointSet* pset = new PointSet();1031 pset->initialize(volume[index], (float*) data);1032 pset->setVisible(true);1033 NanoVis::pointSet.push_back(pset);1034 updateColor(pset);1035 NanoVis::volume[index]->pointsetIndex = NanoVis::pointSet.size() - 1;1075 PointSet* pset = new PointSet(); 1076 pset->initialize(volume[index], (float*) data); 1077 pset->setVisible(true); 1078 NanoVis::pointSet.push_back(pset); 1079 updateColor(pset); 1080 NanoVis::volume[index]->pointsetIndex = NanoVis::pointSet.size() - 1; 1036 1081 */ 1037 1082 -
trunk/vizservers/nanovis/nanovis.cpp
r923 r927 273 273 * width, height and depth: number of points in each dimension 274 274 */ 275 void 275 Volume * 276 276 NanoVis::load_volume(int index, int width, int height, int depth, 277 277 int n_component, float* data, double vmin, … … 287 287 volume[index] = NULL; 288 288 289 if (vol->pointsetIndex != -1) 290 { 291 if (((unsigned int) vol->pointsetIndex) < pointSet.size() && pointSet[vol->pointsetIndex] != NULL) 292 { 289 if (vol->pointsetIndex != -1) { 290 if (((unsigned int) vol->pointsetIndex) < pointSet.size() && 291 pointSet[vol->pointsetIndex] != NULL) { 293 292 delete pointSet[vol->pointsetIndex]; 294 293 pointSet[vol->pointsetIndex] = 0; 295 294 } 296 295 } 297 298 296 delete vol; 299 297 } 300 301 298 volume[index] = new Volume(0.f, 0.f, 0.f, width, height, depth, 1., 302 303 assert(volume[index]!=0);299 n_component, data, vmin, vmax, nzero_min); 300 return volume[index]; 304 301 } 305 302 -
trunk/vizservers/nanovis/nanovis.h
r902 r927 102 102 class NanoVis { 103 103 public: 104 enum Axis { X, Y, Z }; 104 105 static VolumeRenderer* vol_renderer; 105 106 static PointSetRenderer* pointset_renderer; … … 158 159 static int render_legend(TransferFunction *tf, double min, double max, 159 160 int width, int height, const char* volArg); 160 static voidload_volume(int index, int width, int height, int depth,161 static Volume *load_volume(int index, int width, int height, int depth, 161 162 int n, float* data, double vmin, double vmax, double nzero_min); 162 163 #ifndef XINETD
Note: See TracChangeset
for help on using the changeset viewer.