Changeset 1431 for trunk/packages


Ignore:
Timestamp:
May 12, 2009, 5:07:29 PM (15 years ago)
Author:
gah
Message:

fixup new flow visualization command structure

Location:
trunk/packages/vizservers/nanovis
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/packages/vizservers/nanovis/Command.cpp

    r1429 r1431  
    689689    Rappture::Outcome err;
    690690    unsigned int flags;
    691     flags = RPENC_Z|RPENC_B64|RPENC_HDR;
     691    flags = RPENC_HDR;
    692692    if (!Rappture::encoding::decode(err, buf, flags)) {
    693693        printf("ERROR -- DECODING\n");
     
    701701
    702702static int
    703 CameraAimOp(ClientData cdata, Tcl_Interp *interp, int objc,
     703CameraAimOp(ClientData clientData, Tcl_Interp *interp, int objc,
    704704            Tcl_Obj *const *objv)
    705705{
     
    717717
    718718static int
    719 CameraAngleOp(ClientData cdata, Tcl_Interp *interp, int objc,
     719CameraAngleOp(ClientData clientData, Tcl_Interp *interp, int objc,
    720720              Tcl_Obj *const *objv)
    721721{
     
    732732
    733733static int
    734 CameraPanOp(ClientData cdata, Tcl_Interp *interp, int objc,
     734CameraPanOp(ClientData clientData, Tcl_Interp *interp, int objc,
    735735             Tcl_Obj *const *objv)
    736736{
     
    745745
    746746static int
    747 CameraZoomOp(ClientData cdata, Tcl_Interp *interp, int objc,
     747CameraZoomOp(ClientData clientData, Tcl_Interp *interp, int objc,
    748748             Tcl_Obj *const *objv)
    749749{
     
    778778 */
    779779static int
    780 CameraCmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv)
     780CameraCmd(ClientData clientData, Tcl_Interp *interp, int objc,
     781          Tcl_Obj *const *objv)
    781782{
    782783    Tcl_ObjCmdProc *proc;
     
    787788        return TCL_ERROR;
    788789    }
    789     return (*proc) (cdata, interp, objc, objv);
     790    return (*proc) (clientData, interp, objc, objv);
    790791}
    791792
    792793/*ARGSUSED*/
    793794static int
    794 SnapshotCmd(ClientData cdata, Tcl_Interp *interp, int objc,
    795               Tcl_Obj *const *objv)
     795SnapshotCmd(ClientData clientData, Tcl_Interp *interp, int objc,
     796            Tcl_Obj *const *objv)
    796797{
    797798    int w, h;
     
    815816
    816817static int
    817 CutplanePositionOp(ClientData cdata, Tcl_Interp *interp, int objc,
     818CutplanePositionOp(ClientData clientData, Tcl_Interp *interp, int objc,
    818819                   Tcl_Obj *const *objv)
    819820{
     
    847848
    848849static int
    849 CutplaneStateOp(ClientData cdata, Tcl_Interp *interp, int objc,
     850CutplaneStateOp(ClientData clientData, Tcl_Interp *interp, int objc,
    850851                Tcl_Obj *const *objv)
    851852{
     
    900901 */
    901902static int
    902 CutplaneCmd(ClientData cdata, Tcl_Interp *interp, int objc,
     903CutplaneCmd(ClientData clientData, Tcl_Interp *interp, int objc,
    903904            Tcl_Obj *const *objv)
    904905{
     
    910911        return TCL_ERROR;
    911912    }
    912     return (*proc) (cdata, interp, objc, objv);
     913    return (*proc) (clientData, interp, objc, objv);
    913914}
    914915
     
    925926 */
    926927static int
    927 LegendCmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv)
     928LegendCmd(ClientData clientData, Tcl_Interp *interp, int objc,
     929          Tcl_Obj *const *objv)
    928930{
    929931    if (objc != 4) {
     
    966968 */
    967969static int
    968 ScreenCmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv)
     970ScreenCmd(ClientData clientData, Tcl_Interp *interp, int objc,
     971          Tcl_Obj *const *objv)
    969972{
    970973    if (objc != 3) {
     
    994997 */
    995998static int
    996 TransfuncCmd(ClientData cdata, Tcl_Interp *interp, int objc,
     999TransfuncCmd(ClientData clientData, Tcl_Interp *interp, int objc,
    9971000             Tcl_Obj *const *objv)
    9981001{
     
    11021105 */
    11031106static int
    1104 UpCmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv)
     1107UpCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv)
    11051108{
    11061109    if (objc != 2) {
     
    11211124
    11221125static int
    1123 VolumeAnimationCaptureOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1126VolumeAnimationCaptureOp(ClientData clientData, Tcl_Interp *interp, int objc,
    11241127                         Tcl_Obj *const *objv)
    11251128{
     
    11551158
    11561159static int
    1157 VolumeAnimationClearOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1160VolumeAnimationClearOp(ClientData clientData, Tcl_Interp *interp, int objc,
    11581161                       Tcl_Obj *const *objv)
    11591162{
     
    11631166
    11641167static int
    1165 VolumeAnimationStartOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1168VolumeAnimationStartOp(ClientData clientData, Tcl_Interp *interp, int objc,
    11661169                       Tcl_Obj *const *objv)
    11671170{
     
    11711174
    11721175static int
    1173 VolumeAnimationStopOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1176VolumeAnimationStopOp(ClientData clientData, Tcl_Interp *interp, int objc,
    11741177                      Tcl_Obj *const *objv)
    11751178{
     
    11791182
    11801183static int
    1181 VolumeAnimationVolumesOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1184VolumeAnimationVolumesOp(ClientData clientData, Tcl_Interp *interp, int objc,
    11821185                         Tcl_Obj *const *objv)
    11831186{
     
    12061209
    12071210static int
    1208 VolumeAnimationOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1211VolumeAnimationOp(ClientData clientData, Tcl_Interp *interp, int objc,
    12091212                  Tcl_Obj *const *objv)
    12101213{
    12111214    Tcl_ObjCmdProc *proc;
    12121215
    1213     proc = Rappture::GetOpFromObj(interp, nVolumeAnimationOps, volumeAnimationOps,
    1214                                   Rappture::CMDSPEC_ARG2, objc, objv, 0);
     1216    proc = Rappture::GetOpFromObj(interp, nVolumeAnimationOps,
     1217                volumeAnimationOps, Rappture::CMDSPEC_ARG2, objc, objv, 0);
    12151218    if (proc == NULL) {
    12161219        return TCL_ERROR;
    12171220    }
    1218     return (*proc) (cdata, interp, objc, objv);
    1219 }
    1220 
    1221 
    1222 static int
    1223 VolumeDataFollowsOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1221    return (*proc) (clientData, interp, objc, objv);
     1222}
     1223
     1224
     1225static int
     1226VolumeDataFollowsOp(ClientData clientData, Tcl_Interp *interp, int objc,
    12241227                    Tcl_Obj *const *objv)
    12251228{
     
    13741377
    13751378static int
    1376 VolumeDataStateOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1379VolumeDataStateOp(ClientData clientData, Tcl_Interp *interp, int objc,
    13771380                  Tcl_Obj *const *objv)
    13781381{
     
    14061409
    14071410static int
    1408 VolumeDataOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1411VolumeDataOp(ClientData clientData, Tcl_Interp *interp, int objc,
    14091412             Tcl_Obj *const *objv)
    14101413{
     
    14161419        return TCL_ERROR;
    14171420    }
    1418     return (*proc) (cdata, interp, objc, objv);
    1419 }
    1420 
    1421 static int
    1422 VolumeOutlineColorOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1421    return (*proc) (clientData, interp, objc, objv);
     1422}
     1423
     1424static int
     1425VolumeOutlineColorOp(ClientData clientData, Tcl_Interp *interp, int objc,
    14231426                     Tcl_Obj *const *objv)
    14241427{
     
    14391442
    14401443static int
    1441 VolumeOutlineStateOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1444VolumeOutlineStateOp(ClientData clientData, Tcl_Interp *interp, int objc,
    14421445                     Tcl_Obj *const *objv)
    14431446{
     
    14731476
    14741477static int
    1475 VolumeOutlineOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1478VolumeOutlineOp(ClientData clientData, Tcl_Interp *interp, int objc,
    14761479                Tcl_Obj *const *objv)
    14771480{
     
    14831486        return TCL_ERROR;
    14841487    }
    1485     return (*proc) (cdata, interp, objc, objv);
    1486 }
    1487 
    1488 static int
    1489 VolumeShadingDiffuseOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1488    return (*proc) (clientData, interp, objc, objv);
     1489}
     1490
     1491static int
     1492VolumeShadingDiffuseOp(ClientData clientData, Tcl_Interp *interp, int objc,
    14901493                       Tcl_Obj *const *objv)
    14911494{
     
    15071510
    15081511static int
    1509 VolumeShadingIsosurfaceOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1512VolumeShadingIsosurfaceOp(ClientData clientData, Tcl_Interp *interp, int objc,
    15101513                          Tcl_Obj *const *objv)
    15111514{
     
    15261529
    15271530static int
    1528 VolumeShadingOpacityOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1531VolumeShadingOpacityOp(ClientData clientData, Tcl_Interp *interp, int objc,
    15291532                       Tcl_Obj *const *objv)
    15301533{
     
    15471550
    15481551static int
    1549 VolumeShadingSpecularOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1552VolumeShadingSpecularOp(ClientData clientData, Tcl_Interp *interp, int objc,
    15501553                        Tcl_Obj *const *objv)
    15511554{
     
    15661569
    15671570static int
    1568 VolumeShadingTransFuncOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1571VolumeShadingTransFuncOp(ClientData clientData, Tcl_Interp *interp, int objc,
    15691572                         Tcl_Obj *const *objv)
    15701573{
     
    16051608
    16061609static int
    1607 VolumeShadingOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1610VolumeShadingOp(ClientData clientData, Tcl_Interp *interp, int objc,
    16081611                Tcl_Obj *const *objv)
    16091612{
     
    16151618        return TCL_ERROR;
    16161619    }
    1617     return (*proc) (cdata, interp, objc, objv);
    1618 }
    1619 
    1620 static int
    1621 VolumeAxisOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1620    return (*proc) (clientData, interp, objc, objv);
     1621}
     1622
     1623static int
     1624VolumeAxisOp(ClientData clientData, Tcl_Interp *interp, int objc,
    16221625             Tcl_Obj *const *objv)
    16231626{
     
    16491652
    16501653static int
    1651 VolumeStateOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1654VolumeStateOp(ClientData clientData, Tcl_Interp *interp, int objc,
    16521655              Tcl_Obj *const *objv)
    16531656{
     
    16751678
    16761679static int
    1677 VolumeTestOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1680VolumeTestOp(ClientData clientData, Tcl_Interp *interp, int objc,
    16781681             Tcl_Obj *const *objv)
    16791682{
     
    17111714 */
    17121715static int
    1713 VolumeCmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv)
     1716VolumeCmd(ClientData clientData, Tcl_Interp *interp, int objc,
     1717          Tcl_Obj *const *objv)
    17141718{
    17151719    Tcl_ObjCmdProc *proc;
     
    17201724        return TCL_ERROR;
    17211725    }
    1722     return (*proc) (cdata, interp, objc, objv);
     1726    return (*proc) (clientData, interp, objc, objv);
    17231727}
    17241728
     
    17291733
    17301734static int
    1731 FlowDataFollowsOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1735FlowDataFollowsOp(ClientData clientData, Tcl_Interp *interp, int objc,
    17321736                    Tcl_Obj *const *objv)
    17331737{
     
    18131817
    18141818static int
    1815 FlowDataOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1819FlowDataOp(ClientData clientData, Tcl_Interp *interp, int objc,
    18161820             Tcl_Obj *const *objv)
    18171821{
     
    18231827        return TCL_ERROR;
    18241828    }
    1825     return (*proc) (cdata, interp, objc, objv);
     1829    return (*proc) (clientData, interp, objc, objv);
    18261830}
    18271831
     
    18331837
    18341838static int
    1835 FlowVideoOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1839FlowVideoOp(ClientData clientData, Tcl_Interp *interp, int objc,
    18361840            Tcl_Obj *const *objv)
    18371841{
     
    19511955
    19521956static int
    1953 FlowLicOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1957FlowLicOp(ClientData clientData, Tcl_Interp *interp, int objc,
    19541958             Tcl_Obj *const *objv)
    19551959{
     
    19631967
    19641968static int
    1965 FlowSliceVisibleOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1969FlowSliceVisibleOp(ClientData clientData, Tcl_Interp *interp, int objc,
    19661970             Tcl_Obj *const *objv)
    19671971{
     
    19911995
    19921996static int
    1993 FlowSlicePositionOp(ClientData cdata, Tcl_Interp *interp, int objc,
     1997FlowSlicePositionOp(ClientData clientData, Tcl_Interp *interp, int objc,
    19941998                    Tcl_Obj *const *objv)
    19951999{
     
    20342038
    20352039static int
    2036 FlowSliceOp(ClientData cdata, Tcl_Interp *interp, int objc,
     2040FlowSliceOp(ClientData clientData, Tcl_Interp *interp, int objc,
    20372041             Tcl_Obj *const *objv)
    20382042{
    2039                                                                                                                                                                                         Tcl_ObjCmdProc *proc;
     2043    Tcl_ObjCmdProc *proc;
    20402044
    20412045    proc = Rappture::GetOpFromObj(interp, nFlowSliceOps, flowSliceOps,
     
    20442048        return TCL_ERROR;
    20452049    }
    2046     return (*proc) (cdata, interp, objc, objv);
    2047 }
    2048 
    2049 static int
    2050 FlowParticlesVisibleOp(ClientData cdata, Tcl_Interp *interp, int objc,
    2051              Tcl_Obj *const *objv)
     2050    return (*proc) (clientData, interp, objc, objv);
     2051}
     2052
     2053static int
     2054FlowParticlesVisibleOp(ClientData clientData, Tcl_Interp *interp, int objc,
     2055                       Tcl_Obj *const *objv)
    20522056{
    20532057    bool state;
     
    20662070
    20672071static int
    2068 FlowParticlesOp(ClientData cdata, Tcl_Interp *interp, int objc,
    2069              Tcl_Obj *const *objv)
     2072FlowParticlesOp(ClientData clientData, Tcl_Interp *interp, int objc,
     2073                Tcl_Obj *const *objv)
    20702074{
    20712075    Tcl_ObjCmdProc *proc;
     
    20762080        return TCL_ERROR;
    20772081    }
    2078     return (*proc) (cdata, interp, objc, objv);
    2079 }
    2080 
    2081 static int
    2082 FlowNextOp(ClientData cdata, Tcl_Interp *interp, int objc,
    2083              Tcl_Obj *const *objv)
     2082    return (*proc) (clientData, interp, objc, objv);
     2083}
     2084
     2085static int
     2086FlowNextOp(ClientData clientData, Tcl_Interp *interp, int objc,
     2087           Tcl_Obj *const *objv)
    20842088{
    20852089    if (!NanoVis::licRenderer->isActivated()) {
     
    21092113
    21102114static int
    2111 FlowResetOp(ClientData cdata, Tcl_Interp *interp, int objc,
    2112              Tcl_Obj *const *objv)
     2115FlowResetOp(ClientData clientData, Tcl_Interp *interp, int objc,
     2116            Tcl_Obj *const *objv)
    21132117{
    21142118    NanoVis::initParticle();
     
    21172121
    21182122static int
    2119 FlowVectorIdOp(ClientData cdata, Tcl_Interp *interp, int objc,
    2120              Tcl_Obj *const *objv)
     2123FlowVectorIdOp(ClientData clientData, Tcl_Interp *interp, int objc,
     2124               Tcl_Obj *const *objv)
    21212125{
    21222126    Volume *volPtr;
     
    21892193 */
    21902194static int
    2191 FlowCmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv)
     2195FlowCmd(ClientData clientData, Tcl_Interp *interp, int objc,
     2196        Tcl_Obj *const *objv)
    21922197{
    21932198    Tcl_ObjCmdProc *proc;
     
    21982203        return TCL_ERROR;
    21992204    }
    2200     return (*proc) (cdata, interp, objc, objv);
     2205    return (*proc) (clientData, interp, objc, objv);
    22012206}
    22022207
     
    22052210
    22062211static int
    2207 HeightMapDataFollowsOp(ClientData cdata, Tcl_Interp *interp, int objc,
     2212HeightMapDataFollowsOp(ClientData clientData, Tcl_Interp *interp, int objc,
    22082213                       Tcl_Obj *const *objv)
    22092214{
     
    22582263
    22592264static int
    2260 HeightMapDataVisibleOp(ClientData cdata, Tcl_Interp *interp, int objc,
     2265HeightMapDataVisibleOp(ClientData clientData, Tcl_Interp *interp, int objc,
    22612266                       Tcl_Obj *const *objv)
    22622267{
     
    22832288
    22842289static int
    2285 HeightMapDataOp(ClientData cdata, Tcl_Interp *interp, int objc,
     2290HeightMapDataOp(ClientData clientData, Tcl_Interp *interp, int objc,
    22862291                Tcl_Obj *const *objv)
    22872292{
     
    22932298        return TCL_ERROR;
    22942299    }
    2295     return (*proc) (cdata, interp, objc, objv);
    2296 }
    2297 
    2298 
    2299 static int
    2300 HeightMapLineContourColorOp(ClientData cdata, Tcl_Interp *interp, int objc,
     2300    return (*proc) (clientData, interp, objc, objv);
     2301}
     2302
     2303
     2304static int
     2305HeightMapLineContourColorOp(ClientData clientData, Tcl_Interp *interp, int objc,
    23012306                            Tcl_Obj *const *objv)
    23022307{
     
    23172322
    23182323static int
    2319 HeightMapLineContourVisibleOp(ClientData cdata, Tcl_Interp *interp, int objc,
    2320                               Tcl_Obj *const *objv)
     2324HeightMapLineContourVisibleOp(ClientData clientData, Tcl_Interp *interp,
     2325                              int objc, Tcl_Obj *const *objv)
    23212326{
    23222327    bool visible;
     
    23422347
    23432348static int
    2344 HeightMapLineContourOp(ClientData cdata, Tcl_Interp *interp, int objc,
     2349HeightMapLineContourOp(ClientData clientData, Tcl_Interp *interp, int objc,
    23452350                       Tcl_Obj *const *objv)
    23462351{
     
    23522357        return TCL_ERROR;
    23532358    }
    2354     return (*proc) (cdata, interp, objc, objv);
    2355 }
    2356 
    2357 static int
    2358 HeightMapCullOp(ClientData cdata, Tcl_Interp *interp, int objc,
     2359    return (*proc) (clientData, interp, objc, objv);
     2360}
     2361
     2362static int
     2363HeightMapCullOp(ClientData clientData, Tcl_Interp *interp, int objc,
    23592364                Tcl_Obj *const *objv)
    23602365{
     
    23682373
    23692374static int
    2370 HeightMapCreateOp(ClientData cdata, Tcl_Interp *interp, int objc,
     2375HeightMapCreateOp(ClientData clientData, Tcl_Interp *interp, int objc,
    23712376                  Tcl_Obj *const *objv)
    23722377{
     
    23742379
    23752380    /* heightmap create xmin ymin xmax ymax xnum ynum values */
    2376     hmPtr = CreateHeightMap(cdata, interp, objc - 2, objv + 2);
     2381    hmPtr = CreateHeightMap(clientData, interp, objc - 2, objv + 2);
    23772382    if (hmPtr == NULL) {
    23782383        return TCL_ERROR;
     
    23842389
    23852390static int
    2386 HeightMapLegendOp(ClientData cdata, Tcl_Interp *interp, int objc,
     2391HeightMapLegendOp(ClientData clientData, Tcl_Interp *interp, int objc,
    23872392                  Tcl_Obj *const *objv)
    23882393{
     
    24122417
    24132418static int
    2414 HeightMapPolygonOp(ClientData cdata, Tcl_Interp *interp, int objc,
     2419HeightMapPolygonOp(ClientData clientData, Tcl_Interp *interp, int objc,
    24152420                   Tcl_Obj *const *objv)
    24162421{
     
    24242429
    24252430static int
    2426 HeightMapShadingOp(ClientData cdata, Tcl_Interp *interp, int objc,
     2431HeightMapShadingOp(ClientData clientData, Tcl_Interp *interp, int objc,
    24272432                 Tcl_Obj *const *objv)
    24282433{
     
    24552460
    24562461static int
    2457 HeightMapTestOp(ClientData cdata, Tcl_Interp *interp, int objc,
     2462HeightMapTestOp(ClientData clientData, Tcl_Interp *interp, int objc,
    24582463                Tcl_Obj *const *objv)
    24592464{
     
    24952500
    24962501static int
    2497 HeightMapTransFuncOp(ClientData cdata, Tcl_Interp *interp, int objc,
     2502HeightMapTransFuncOp(ClientData clientData, Tcl_Interp *interp, int objc,
    24982503                     Tcl_Obj *const *objv)
    24992504{
     
    25372542
    25382543static int
    2539 HeightMapCmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv)
     2544HeightMapCmd(ClientData clientData, Tcl_Interp *interp, int objc,
     2545             Tcl_Obj *const *objv)
    25402546{
    25412547    Tcl_ObjCmdProc *proc;
     
    25462552        return TCL_ERROR;
    25472553    }
    2548     return (*proc) (cdata, interp, objc, objv);
    2549 }
    2550 
    2551 static int
    2552 GridAxisColorOp(ClientData cdata, Tcl_Interp *interp, int objc,
     2554    return (*proc) (clientData, interp, objc, objv);
     2555}
     2556
     2557static int
     2558GridAxisColorOp(ClientData clientData, Tcl_Interp *interp, int objc,
    25532559                Tcl_Obj *const *objv)
    25542560{
     
    25702576
    25712577static int
    2572 GridAxisNameOp(ClientData cdata, Tcl_Interp *interp, int objc,
     2578GridAxisNameOp(ClientData clientData, Tcl_Interp *interp, int objc,
    25732579               Tcl_Obj *const *objv)
    25742580{
     
    25932599
    25942600static int
    2595 GridLineColorOp(ClientData cdata, Tcl_Interp *interp, int objc,
     2601GridLineColorOp(ClientData clientData, Tcl_Interp *interp, int objc,
    25962602                Tcl_Obj *const *objv)
    25972603{
     
    26132619
    26142620static int
    2615 GridVisibleOp(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv)
     2621GridVisibleOp(ClientData clientData, Tcl_Interp *interp, int objc,
     2622              Tcl_Obj *const *objv)
    26162623{
    26172624    bool visible;
     
    26322639
    26332640static int
    2634 GridCmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv)
     2641GridCmd(ClientData clientData, Tcl_Interp *interp, int objc,
     2642        Tcl_Obj *const *objv)
    26352643{
    26362644    Tcl_ObjCmdProc *proc;
     
    26412649        return TCL_ERROR;
    26422650    }
    2643     return (*proc) (cdata, interp, objc, objv);
    2644 }
    2645 
    2646 static int
    2647 AxisCmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv)
     2651    return (*proc) (clientData, interp, objc, objv);
     2652}
     2653
     2654static int
     2655AxisCmd(ClientData clientData, Tcl_Interp *interp, int objc,
     2656        Tcl_Obj *const *objv)
    26482657{
    26492658    if (objc < 2) {
     
    26712680#if PLANE_CMD
    26722681static int
    2673 PlaneNewOp(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv)
     2682PlaneNewOp(ClientData clientData, Tcl_Interp *interp, int objc,
     2683           Tcl_Obj *const *objv)
    26742684{
    26752685    fprintf(stderr, "load plane for 2D visualization command\n");
     
    27102720
    27112721static int
    2712 PlaneLinkOp(ClientData cdata, Tcl_Interp *interp, int objc,
     2722PlaneLinkOp(ClientData clientData, Tcl_Interp *interp, int objc,
    27132723            Tcl_Obj *const *objv)
    27142724{
     
    27352745//The plane_index is the index mantained in the 2D plane renderer
    27362746static int
    2737 PlaneEnableOp(ClientData cdata, Tcl_Interp *interp, int objc,
     2747PlaneEnableOp(ClientData clientData, Tcl_Interp *interp, int objc,
    27382748              Tcl_Obj *const *objv)
    27392749{
     
    27682778
    27692779static int
    2770 PlaneCmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv)
     2780PlaneCmd(ClientData clientData, Tcl_Interp *interp, int objc,
     2781         Tcl_Obj *const *objv)
    27712782{
    27722783    Tcl_ObjCmdProc *proc;
     
    27772788        return TCL_ERROR;
    27782789    }
    2779     return (*proc) (cdata, interp, objc, objv);
     2790    return (*proc) (clientData, interp, objc, objv);
    27802791}
    27812792
  • trunk/packages/vizservers/nanovis/FlowCmd.cpp

    r1429 r1431  
    2626#define RELPOS 0
    2727#define ABSPOS 1
    28 
    29 unsigned int FlowCmd::flags = 0;
    30 Tcl_HashTable FlowCmd::_flowTable;
    31 float FlowCmd::_magMin, FlowCmd::_magMax;
    32 float FlowCmd::_xMin,   FlowCmd::_xMax;
    33 float FlowCmd::_yMin,   FlowCmd::_yMax;
    34 float FlowCmd::_zMin,   FlowCmd::_zMax;
    35 float FlowCmd::_wMin,   FlowCmd::_wMax;
    36 float FlowCmd::_xOrigin, FlowCmd::_yOrigin, FlowCmd::_zOrigin;
    3728
    3829static Rappture::SwitchParseProc AxisSwitchProc;
     
    127118FlowParticles::Render(void)
    128119{
    129     fprintf(stderr, "rendering particles, position=%g\n",
    130             FlowCmd::GetPosition(&_sv.position));
    131     _rendererPtr->setPos(FlowCmd::GetPosition(&_sv.position));
     120    Trace("rendering particles %s\n", _name);
     121    _rendererPtr->setPos(FlowCmd::GetRelativePosition(&_sv.position));
    132122    _rendererPtr->setAxis(_sv.position.axis);
    133     assert(_rendererPtr->isActivated());
     123    assert(_rendererPtr->active());
    134124    _rendererPtr->render();
    135125}
     
    138128FlowParticles::Configure(void)
    139129{
    140     _rendererPtr->setPos(_sv.position.value);
     130    _rendererPtr->setPos(FlowCmd::GetRelativePosition(&_sv.position));
    141131    _rendererPtr->setColor(Vector4(_sv.color.r, _sv.color.g, _sv.color.b,
    142132                _sv.color.a));
    143133    _rendererPtr->setAxis(_sv.position.axis);
    144     if ((_sv.isHidden) && (_rendererPtr->isActivated())) {
    145         _rendererPtr->deactivate();
    146     } else if ((!_sv.isHidden) && (!_rendererPtr->isActivated())) {
    147         _rendererPtr->activate();
    148     }
     134    _rendererPtr->active(!_sv.isHidden);
    149135}
    150136
     
    168154FlowBox::Render(Volume *volPtr)
    169155{
     156    Trace("rendering boxes %s\n", _name);
    170157    if ((_sv.corner1.x == _sv.corner2.x) ||
    171158        (_sv.corner1.y == _sv.corner2.y) ||
     
    173160        return;                         
    174161    }
     162    Trace("rendering boxes %s\n", _name);
    175163    glColor4d(_sv.color.r, _sv.color.g, _sv.color.b, _sv.color.a);
    176164
     
    204192    z1 = (_sv.corner2.z - min.z) / (max.z - min.z);
    205193   
     194    Trace("rendering box %g,%g %g,%g %g,%g\n", x0, x1, y0, y1, z0, z1);
     195
    206196    glLineWidth(_sv.lineWidth);
    207197    glBegin(GL_LINE_LOOP);
     
    259249    _volIndex = -1;                     /* Indicates that no volume slot has
    260250                                         * been allocated for this vector. */
     251    _sv.sliceVisible = 1;
    261252    _volPtr = NULL;
    262253    _cmdToken = Tcl_CreateObjCommand(interp, (char *)_name,
     
    319310    NvVectorField *fieldPtr;
    320311    fieldPtr = VectorField();
    321     if (!fieldPtr->isActivated()) {
    322         fieldPtr->activate();
    323     }
     312    fieldPtr->active(true);
    324313    FlowParticlesIterator iter;
    325314    FlowParticles *particlesPtr;
     
    335324FlowCmd::Render(void)
    336325{
    337     if (!_fieldPtr->isActivated()) {
    338         _fieldPtr->activate();
    339     }
     326    _fieldPtr->active(true);
    340327    _fieldPtr->render();
    341328    FlowParticlesIterator iter;
     
    347334        }
    348335    }
     336    Trace("in Render before boxes %s\n", _name);
    349337    RenderBoxes();
    350338}
    351339
    352 void
    353 FlowCmd::Init(void)
    354 {
    355     Tcl_InitHashTable(&_flowTable, TCL_STRING_KEYS);
    356 }
    357 
    358 FlowCmd *
    359 FlowCmd::FirstFlow(FlowIterator *iterPtr)
    360 {
    361     iterPtr->hashPtr = Tcl_FirstHashEntry(&_flowTable, &iterPtr->hashSearch);
     340
     341#ifdef notdef
     342int
     343NanoVis::InitVectorField(Tcl_Interp *interp)
     344{
     345    if (flowVisRenderer == NULL) {
     346        Tcl_AppendResult(interp, "flowvis renderer is NULL", (char *)NULL);
     347        return TCL_ERROR;
     348    }
     349    if (licRenderer == NULL) {
     350        Tcl_AppendResult(interp, "LIC renderer is NULL", (char *)NULL);
     351        return TCL_ERROR;
     352    }
     353    _fieldPtr->setVectorField(_volPtr->id, *(_volPtr->get_location()),
     354        1.0f, _volPtr->height / (float)_volPtr->width,
     355        _volPtr->depth  / (float)_volPtr->width,
     356        _volPtr->wAxis.max());
     357
     358    licRenderer->make_patterns();
     359    licRenderer->setVectorField(
     360        _volPtr->id,                    /* Texture ID */
     361        *(_volPtr->get_location()),     /* Origin */
     362        1.0f / volPtr->aspect_ratio_width, /* X-axis scale. */
     363        1.0f / volPtr->aspect_ratio_height, /* Y-axis scale. */
     364        1.0f / volPtr->aspect_ratio_depth, /* Z-axis scale. */
     365        volPtr->wAxis.max());           /* Maximum ???? */
     366
     367    licRenderer->set_offset(lic_slice_z);
     368    return TCL_OK;
     369}
     370#endif
     371
     372int
     373FlowCmd::CreateParticles(Tcl_Interp *interp, Tcl_Obj *objPtr)
     374{
     375    Tcl_HashEntry *hPtr;
     376    int isNew;
     377    const char *particlesName = Tcl_GetString(objPtr);
     378    hPtr = Tcl_CreateHashEntry(&_particlesTable, particlesName, &isNew);
     379    if (!isNew) {
     380        Tcl_AppendResult(interp, "particle injection plane \"",
     381                         particlesName, "\" already exists.", (char *)NULL);
     382        return TCL_ERROR;
     383    }
     384    particlesName = Tcl_GetHashKey(&_particlesTable, hPtr);
     385    FlowParticles *particlesPtr;
     386    particlesPtr = new FlowParticles(particlesName, hPtr);
     387    if (particlesPtr == NULL) {
     388        Tcl_AppendResult(interp, "can't allocate particle injection plane",
     389                (char *)NULL);
     390        Tcl_DeleteHashEntry(hPtr);
     391        return TCL_ERROR;
     392    }
     393    Tcl_SetHashValue(hPtr, particlesPtr);
     394    return TCL_OK;
     395}
     396
     397int
     398FlowCmd::GetParticles(Tcl_Interp *interp, Tcl_Obj *objPtr,
     399                      FlowParticles **particlesPtrPtr)
     400{
     401    Tcl_HashEntry *hPtr;
     402    hPtr = Tcl_FindHashEntry(&_particlesTable, Tcl_GetString(objPtr));
     403    if (hPtr == NULL) {
     404        if (interp != NULL) {
     405            Tcl_AppendResult(interp, "can't find a particle injection plane \"",
     406                         Tcl_GetString(objPtr), "\"", (char *)NULL);
     407        }
     408        return TCL_ERROR;
     409    }
     410    *particlesPtrPtr = (FlowParticles *)Tcl_GetHashValue(hPtr);
     411    return TCL_OK;
     412}
     413
     414FlowParticles *
     415FlowCmd::FirstParticles(FlowParticlesIterator *iterPtr)
     416{
     417    iterPtr->hashPtr = Tcl_FirstHashEntry(&_particlesTable,
     418        &iterPtr->hashSearch);
    362419    if (iterPtr->hashPtr == NULL) {
    363420        return NULL;
    364421    }
    365     return (FlowCmd *)Tcl_GetHashValue(iterPtr->hashPtr);
    366 }
    367 
    368 FlowCmd *
    369 FlowCmd::NextFlow(FlowIterator *iterPtr)
     422    return (FlowParticles *)Tcl_GetHashValue(iterPtr->hashPtr);
     423}
     424
     425FlowParticles *
     426FlowCmd::NextParticles(FlowParticlesIterator *iterPtr)
    370427{
    371428    if (iterPtr->hashPtr == NULL) {
     
    376433        return NULL;
    377434    }
     435    return (FlowParticles *)Tcl_GetHashValue(iterPtr->hashPtr);
     436}
     437
     438int
     439FlowCmd::CreateBox(Tcl_Interp *interp, Tcl_Obj *objPtr)
     440{
     441    Tcl_HashEntry *hPtr;
     442    int isNew;
     443    hPtr = Tcl_CreateHashEntry(&_boxTable, Tcl_GetString(objPtr), &isNew);
     444    if (!isNew) {
     445        Tcl_AppendResult(interp, "box \"", Tcl_GetString(objPtr),
     446                "\" already exists in flow \"", name(), "\"", (char *)NULL);
     447        return TCL_ERROR;
     448    }
     449    const char *boxName;
     450    boxName = Tcl_GetHashKey(&_boxTable, hPtr);
     451    FlowBox *boxPtr;
     452    boxPtr = new FlowBox(boxName, hPtr);
     453    if (boxPtr == NULL) {
     454        Tcl_AppendResult(interp, "can't allocate box \"", boxName, "\"",
     455                         (char *)NULL);
     456        Tcl_DeleteHashEntry(hPtr);
     457        return TCL_ERROR;
     458    }
     459    Tcl_SetHashValue(hPtr, boxPtr);
     460    return TCL_OK;
     461}
     462
     463int
     464FlowCmd::GetBox(Tcl_Interp *interp, Tcl_Obj *objPtr, FlowBox **boxPtrPtr)
     465{
     466    Tcl_HashEntry *hPtr;
     467    hPtr = Tcl_FindHashEntry(&_boxTable, Tcl_GetString(objPtr));
     468    if (hPtr == NULL) {
     469        if (interp != NULL) {
     470            Tcl_AppendResult(interp, "can't find a box \"",
     471                Tcl_GetString(objPtr), "\" in flow \"", name(), "\"",
     472                (char *)NULL);
     473        }
     474        return TCL_ERROR;
     475    }
     476    *boxPtrPtr = (FlowBox *)Tcl_GetHashValue(hPtr);
     477    return TCL_OK;
     478}
     479
     480FlowBox *
     481FlowCmd::FirstBox(FlowBoxIterator *iterPtr)
     482{
     483    iterPtr->hashPtr = Tcl_FirstHashEntry(&_boxTable, &iterPtr->hashSearch);
     484    if (iterPtr->hashPtr == NULL) {
     485        return NULL;
     486    }
     487    return (FlowBox *)Tcl_GetHashValue(iterPtr->hashPtr);
     488}
     489
     490FlowBox *
     491FlowCmd::NextBox(FlowBoxIterator *iterPtr)
     492{
     493    if (iterPtr->hashPtr == NULL) {
     494        return NULL;
     495    }
     496    iterPtr->hashPtr = Tcl_NextHashEntry(&iterPtr->hashSearch);
     497    if (iterPtr->hashPtr == NULL) {
     498        return NULL;
     499    }
     500    return (FlowBox *)Tcl_GetHashValue(iterPtr->hashPtr);
     501}
     502
     503void
     504FlowCmd::GetMagRange(double &min_mag, double &max_mag)
     505{
     506    const float *values = _dataPtr->values();
     507    size_t nValues = _dataPtr->nValues();
     508    max_mag = -1e21, min_mag = 1e21;
     509    for (size_t i = 0; i < nValues; i += 3) {
     510        double vx, vy, vz, vm;
     511
     512        vx = values[i];
     513        vy = values[i+1];
     514        vz = values[i+2];
     515                   
     516        vm = sqrt(vx*vx + vy*vy + vz*vz);
     517        if (vm > max_mag) {
     518            max_mag = vm;
     519        }
     520        if (vm < min_mag) {
     521            min_mag = vm;
     522        }
     523    }
     524}
     525
     526
     527void
     528FlowCmd::InitVectorField(void)
     529{
     530    if (_volPtr != NULL) {
     531        delete _volPtr;
     532        _volPtr = NULL;
     533        NanoVis::volume[_volIndex] = NULL;
     534        NanoVis::vol_renderer->remove_volume(_volIndex);
     535    }
     536    // Remove the associated vector field.
     537    if (_fieldPtr != NULL) {
     538        delete _fieldPtr;
     539        _fieldPtr = NULL;
     540    }
     541   
     542}
     543
     544void
     545FlowCmd::InitializeParticles(void)
     546{
     547    FlowParticles *particlesPtr;
     548    FlowParticlesIterator iter;
     549    for (particlesPtr = FirstParticles(&iter); particlesPtr != NULL;
     550         particlesPtr = NextParticles(&iter)) {
     551        particlesPtr->Initialize();
     552    }   
     553}
     554
     555bool
     556FlowCmd::ScaleVectorField()
     557{
     558    if (_volPtr != NULL) {
     559        delete _volPtr;
     560        _volPtr = NULL;
     561        NanoVis::volume[_volIndex] = NULL;
     562        NanoVis::vol_renderer->remove_volume(_volIndex);
     563    }
     564    float *vdata;
     565    vdata = GetScaledVector();
     566    if (vdata == NULL) {
     567        return false;
     568    }
     569    Volume *volPtr;
     570    volPtr = MakeVolume(vdata);
     571    delete [] vdata;
     572    if (volPtr == NULL) {
     573        return false;
     574    }
     575    _volPtr = volPtr;
     576
     577    _fieldPtr = new NvVectorField();
     578    if (_fieldPtr == NULL) {
     579        return false;
     580    }
     581
     582    double width, height, depth;
     583    width  = NanoVis::xMax - NanoVis::xMin;
     584    height = NanoVis::yMax - NanoVis::yMin;
     585    depth  = NanoVis::zMax - NanoVis::zMin;
     586
     587    Vector3 *locationPtr = _volPtr->get_location();
     588    /*This is wrong. Need to compute origin. */
     589    NanoVis::xOrigin = locationPtr->x;
     590    NanoVis::yOrigin = locationPtr->y;
     591    NanoVis::zOrigin = locationPtr->z;
     592
     593    _fieldPtr->setVectorField(_volPtr, *locationPtr,
     594        1.0f, height / width, depth  / width, NanoVis::magMax);
     595
     596    if (NanoVis::licRenderer != NULL) {
     597        NanoVis::licRenderer->setVectorField(_volPtr->id,
     598                *locationPtr,
     599                1.0f / _volPtr->aspect_ratio_width,
     600                1.0f / _volPtr->aspect_ratio_height,
     601                1.0f / _volPtr->aspect_ratio_depth,
     602                _volPtr->wAxis.max());
     603        SetCurrentPosition();
     604        SetAxis();
     605        SetActive();
     606    }
     607    FlowParticles *particlesPtr;
     608    FlowParticlesIterator partIter;
     609    for (particlesPtr = FirstParticles(&partIter); particlesPtr != NULL;
     610         particlesPtr = NextParticles(&partIter)) {
     611        particlesPtr->SetVectorField(_volPtr);
     612    }   
     613    return true;
     614}
     615
     616void
     617FlowCmd::RenderBoxes(void)
     618{
     619    FlowBoxIterator iter;
     620    FlowBox *boxPtr;
     621    for (boxPtr = FirstBox(&iter); boxPtr != NULL; boxPtr = NextBox(&iter)) {
     622        if (boxPtr->visible()) {
     623            boxPtr->Render(_volPtr);
     624        }
     625    }
     626}
     627
     628float *
     629FlowCmd::GetScaledVector(void)
     630{
     631    assert(_dataPtr->nComponents() == 3);
     632    size_t n = _dataPtr->nValues() / _dataPtr->nComponents() * 4;
     633    float *data = new float[n];
     634    if (data == NULL) {
     635        return NULL;
     636    }
     637    memset(data, 0, sizeof(float) * n);
     638    float *destPtr = data;
     639    const float *values = _dataPtr->values();
     640    for (size_t iz=0; iz < _dataPtr->zNum(); iz++) {
     641        for (size_t iy=0; iy < _dataPtr->yNum(); iy++) {
     642            for (size_t ix=0; ix < _dataPtr->xNum(); ix++) {
     643                double vx, vy, vz, vm;
     644                vx = values[0];
     645                vy = values[1];
     646                vz = values[2];
     647                vm = sqrt(vx*vx + vy*vy + vz*vz);
     648                destPtr[0] = vm / NanoVis::magMax;
     649                destPtr[1] = vx /(2.0*NanoVis::magMax) + 0.5;
     650                destPtr[2] = vy /(2.0*NanoVis::magMax) + 0.5;
     651                destPtr[3] = vz /(2.0*NanoVis::magMax) + 0.5;
     652                values += 3;
     653                destPtr += 4;
     654            }
     655        }
     656    }
     657    return data;
     658}
     659
     660Volume *
     661FlowCmd::MakeVolume(float *data)
     662{
     663    if (_volIndex < 0) {
     664        _volIndex = NanoVis::n_volumes;
     665    }
     666    Volume *volPtr;
     667    volPtr = NanoVis::load_volume(_volIndex, _dataPtr->xNum(),
     668        _dataPtr->yNum(), _dataPtr->zNum(), 4, data,
     669        NanoVis::magMin, NanoVis::magMax, 0);
     670    volPtr->xAxis.SetRange(_dataPtr->xMin(), _dataPtr->xMax());
     671    volPtr->yAxis.SetRange(_dataPtr->yMin(), _dataPtr->yMax());
     672    volPtr->zAxis.SetRange(_dataPtr->zMin(), _dataPtr->zMax());
     673    volPtr->wAxis.SetRange(NanoVis::magMin, NanoVis::magMax);
     674
     675    /*volPtr->update_pending = false;*/
     676    Vector3 physicalMin(NanoVis::xMin, NanoVis::yMin, NanoVis::zMin);
     677    Vector3 physicalMax(NanoVis::xMax, NanoVis::yMax, NanoVis::zMax);
     678    volPtr->setPhysicalBBox(physicalMin, physicalMax);
     679
     680    volPtr->set_n_slice(256 - _volIndex);
     681    // volPtr->set_n_slice(512- _volIndex);
     682    volPtr->disable_cutplane(0);
     683    volPtr->disable_cutplane(1);
     684    volPtr->disable_cutplane(2);
     685
     686    TransferFunction *tfPtr;
     687    tfPtr = _sv.tfPtr;
     688    if (tfPtr == NULL) {
     689        tfPtr = NanoVis::get_transfunc("default");
     690    }
     691    NanoVis::vol_renderer->add_volume(volPtr, tfPtr);
     692    if (_sv.showVolume) {
     693        volPtr->enable_data();
     694    } else {
     695        volPtr->disable_data();
     696    }
     697    if (_sv.showOutline) {
     698        volPtr->enable_outline();
     699    } else {
     700        volPtr->disable_outline();
     701    }
     702    float dx0 = -0.5;
     703    float dy0 = -0.5*volPtr->height/volPtr->width;
     704    float dz0 = -0.5*volPtr->depth/volPtr->width;
     705    volPtr->move(Vector3(dx0, dy0, dz0));
     706    return volPtr;
     707}
     708
     709static int
     710FlowDataFileOp(ClientData clientData, Tcl_Interp *interp, int objc,
     711               Tcl_Obj *const *objv)
     712{
     713    Rappture::Outcome result;
     714
     715    const char *fileName;
     716    fileName = Tcl_GetString(objv[3]);
     717    Trace("Flow loading data from file %s\n", fileName);
     718
     719    int extents;
     720    if (Tcl_GetIntFromObj(interp, objv[4], &extents) != TCL_OK) {
     721        return TCL_ERROR;
     722    }
     723    if ((extents < 1) || (extents > 4)) {
     724        Tcl_AppendResult(interp, "bad extents value \"", Tcl_GetString(objv[4]),
     725                         "\"", (char *)NULL);
     726        return TCL_ERROR;
     727    }
     728    Rappture::Buffer buf;
     729    if (!buf.load(result, fileName)) {
     730        Tcl_AppendResult(interp, "can't load data from \"", fileName, "\": ",
     731                         result.remark(), (char *)NULL);
     732        return TCL_ERROR;
     733    }
     734
     735    FlowCmd *flowPtr = (FlowCmd *)clientData;
     736    if (strncmp(buf.bytes(), "<DX>", 4) == 0) {
     737        Rappture::Unirect3d *dataPtr;
     738
     739        dataPtr = new Rappture::Unirect3d(extents);
     740        if (!dataPtr->ReadVectorDataFromDx(result, buf.size(),
     741                (char *)buf.bytes())) {
     742            Tcl_AppendResult(interp, result.remark(), (char *)NULL);
     743            delete dataPtr;
     744            return TCL_ERROR;
     745        }
     746        flowPtr->SetData(dataPtr);
     747    } else if (strncmp(buf.bytes(), "<unirect3d>", 4) == 0) {
     748        Rappture::Unirect3d *dataPtr;
     749        Tcl_CmdInfo cmdInfo;
     750
     751        /* Set the clientdata field of the unirect3d command to contain
     752         * the local data structure. */
     753        if (!Tcl_GetCommandInfo(interp, "unirect3d", &cmdInfo)) {
     754            return TCL_ERROR;
     755        }
     756        dataPtr = new Rappture::Unirect3d(extents);
     757        cmdInfo.objClientData = (ClientData)dataPtr;   
     758        Tcl_SetCommandInfo(interp, "unirect3d", &cmdInfo);
     759        if (Tcl_Eval(interp, (const char *)buf.bytes()) != TCL_OK) {
     760            delete dataPtr;
     761            return TCL_ERROR;
     762        }
     763        if (!dataPtr->isInitialized()) {
     764            delete dataPtr;
     765            return TCL_ERROR;
     766        }
     767        flowPtr->SetData(dataPtr);
     768    } else {
     769        Rappture::Unirect3d *dataPtr;
     770
     771        dataPtr = new Rappture::Unirect3d(extents);
     772        if (!dataPtr->ReadVectorDataFromDx(result, buf.size(),
     773                                           (char *)buf.bytes())) {
     774            Tcl_AppendResult(interp, result.remark(), (char *)NULL);
     775            delete dataPtr;
     776            return TCL_ERROR;
     777        }
     778        flowPtr->SetData(dataPtr);
     779    }
     780    NanoVis::EventuallyRedraw(NanoVis::MAP_FLOWS);
     781    return TCL_OK;
     782}
     783
     784/*
     785 * $flow data follows nbytes extents
     786 */
     787static int
     788FlowDataFollowsOp(ClientData clientData, Tcl_Interp *interp, int objc,
     789                    Tcl_Obj *const *objv)
     790{
     791    Rappture::Outcome result;
     792
     793    Trace("Flow Data Loading\n");
     794
     795    int nBytes;
     796    if (Tcl_GetIntFromObj(interp, objv[3], &nBytes) != TCL_OK) {
     797        Trace("Bad nBytes \"%s\"\n", Tcl_GetString(objv[3]));
     798        return TCL_ERROR;
     799    }
     800    if (nBytes <= 0) {
     801        Tcl_AppendResult(interp, "bad # bytes request \"",
     802                Tcl_GetString(objv[3]), "\" for \"data follows\"", (char *)NULL);
     803        Trace("Bad nbytes %d\n", nBytes);
     804        return TCL_ERROR;
     805    }
     806    int extents;
     807    if (Tcl_GetIntFromObj(interp, objv[4], &extents) != TCL_OK) {
     808        Trace("Bad extents \"%s\"\n", Tcl_GetString(objv[4]));
     809        return TCL_ERROR;
     810    }
     811    if (extents <= 0) {
     812        Tcl_AppendResult(interp, "bad extents request \"",
     813                Tcl_GetString(objv[4]), "\" for \"data follows\"", (char *)NULL);
     814        Trace("Bad extents %d\n", extents);
     815        return TCL_ERROR;
     816    }
     817    Rappture::Buffer buf;
     818    Trace("Flow Data Loading %d %d\n", nBytes, extents);
     819    if (GetDataStream(interp, buf, nBytes) != TCL_OK) {
     820        return TCL_ERROR;
     821    }
     822    FlowCmd *flowPtr = (FlowCmd *)clientData;
     823    if ((buf.size() > 4) && (strncmp(buf.bytes(), "<DX>", 4) == 0)) {
     824        Rappture::Unirect3d *dataPtr;
     825
     826        dataPtr = new Rappture::Unirect3d(extents);
     827        if (!dataPtr->ReadVectorDataFromDx(result, buf.size(),
     828                (char *)buf.bytes())) {
     829            Tcl_AppendResult(interp, result.remark(), (char *)NULL);
     830            delete dataPtr;
     831            return TCL_ERROR;
     832        }
     833        flowPtr->SetData(dataPtr);
     834    } else if ((buf.size() > 4) &&
     835               (strncmp(buf.bytes(), "<unirect3d>", 4) == 0)) {
     836        Rappture::Unirect3d *dataPtr;
     837        Tcl_CmdInfo cmdInfo;
     838
     839        /* Set the clientdata field of the unirect3d command to contain
     840         * the local data structure. */
     841        dataPtr = new Rappture::Unirect3d(extents);
     842        if (!Tcl_GetCommandInfo(interp, "unirect3d", &cmdInfo)) {
     843            return TCL_ERROR;
     844        }
     845        cmdInfo.objClientData = (ClientData)dataPtr;   
     846        Tcl_SetCommandInfo(interp, "unirect3d", &cmdInfo);
     847        if (Tcl_Eval(interp, (const char *)buf.bytes()) != TCL_OK) {
     848            delete dataPtr;
     849            return TCL_ERROR;
     850        }
     851        if (!dataPtr->isInitialized()) {
     852            delete dataPtr;
     853            return TCL_ERROR;
     854        }
     855        flowPtr->SetData(dataPtr);
     856    } else {
     857        Tcl_AppendResult(interp, "unknown data header \"", /*buf.bytes(), "\"",*/
     858                         (char *)NULL);
     859        Rappture::Unirect3d *dataPtr;
     860
     861        dataPtr = new Rappture::Unirect3d(extents);
     862        if (!dataPtr->ReadVectorDataFromDx(result, buf.size(),
     863                                           (char *)buf.bytes())) {
     864            Tcl_AppendResult(interp, result.remark(), (char *)NULL);
     865            delete dataPtr;
     866            return TCL_ERROR;
     867        }
     868        flowPtr->SetData(dataPtr);
     869    }
     870    {
     871        char info[1024];
     872        ssize_t nWritten;
     873        size_t length;
     874
     875        length = sprintf(info, "nv>data id 0 name %s min 0 max 1 vmin 0 vmax 1\n",
     876                flowPtr->name());
     877        nWritten  = write(0, info, length);
     878        assert(nWritten == (ssize_t)strlen(info));
     879    }
     880    NanoVis::EventuallyRedraw(NanoVis::MAP_FLOWS);
     881    return TCL_OK;
     882}
     883
     884static Rappture::CmdSpec flowDataOps[] = {
     885    {"file",    2, FlowDataFileOp,    5, 5, "fileName extents",},
     886    {"follows", 2, FlowDataFollowsOp, 5, 5, "size extents",},
     887};
     888static int nFlowDataOps = NumCmdSpecs(flowDataOps);
     889
     890static int
     891FlowDataOp(ClientData clientData, Tcl_Interp *interp, int objc,
     892           Tcl_Obj *const *objv)
     893{
     894    Tcl_ObjCmdProc *proc;
     895
     896    proc = Rappture::GetOpFromObj(interp, nFlowDataOps, flowDataOps,
     897                                  Rappture::CMDSPEC_ARG2, objc, objv, 0);
     898    if (proc == NULL) {
     899        return TCL_ERROR;
     900    }
     901    return (*proc) (clientData, interp, objc, objv);
     902}
     903
     904float
     905FlowCmd::GetRelativePosition(FlowPosition *posPtr)
     906{
     907    if (posPtr->flags == RELPOS) {
     908        return posPtr->value;
     909    }
     910    switch (posPtr->axis) {
     911    case AXIS_X: 
     912        return (posPtr->value - NanoVis::xMin) /
     913            (NanoVis::xMax - NanoVis::xMin);
     914    case AXIS_Y: 
     915        return (posPtr->value - NanoVis::yMin) /
     916            (NanoVis::yMax - NanoVis::yMin);
     917    case AXIS_Z: 
     918        return (posPtr->value - NanoVis::zMin) /
     919            (NanoVis::zMax - NanoVis::zMin);
     920    }
     921    return 0.0;
     922}
     923
     924float
     925FlowCmd::GetRelativePosition(void)
     926{
     927    return FlowCmd::GetRelativePosition(&_sv.slicePos);
     928}
     929
     930/* Static NanoVis class commands. */
     931
     932void
     933NanoVis::InitFlows(void)
     934{
     935    Tcl_InitHashTable(&flowTable, TCL_STRING_KEYS);
     936}
     937
     938FlowCmd *
     939NanoVis::FirstFlow(FlowIterator *iterPtr)
     940{
     941    iterPtr->hashPtr = Tcl_FirstHashEntry(&flowTable, &iterPtr->hashSearch);
     942    if (iterPtr->hashPtr == NULL) {
     943        return NULL;
     944    }
    378945    return (FlowCmd *)Tcl_GetHashValue(iterPtr->hashPtr);
    379946}
    380947
     948FlowCmd *
     949NanoVis::NextFlow(FlowIterator *iterPtr)
     950{
     951    if (iterPtr->hashPtr == NULL) {
     952        return NULL;
     953    }
     954    iterPtr->hashPtr = Tcl_NextHashEntry(&iterPtr->hashSearch);
     955    if (iterPtr->hashPtr == NULL) {
     956        return NULL;
     957    }
     958    return (FlowCmd *)Tcl_GetHashValue(iterPtr->hashPtr);
     959}
    381960
    382961int
    383 FlowCmd::GetFlow(Tcl_Interp *interp, Tcl_Obj *objPtr, FlowCmd **flowPtrPtr)
     962NanoVis::GetFlow(Tcl_Interp *interp, Tcl_Obj *objPtr, FlowCmd **flowPtrPtr)
    384963{
    385964    Tcl_HashEntry *hPtr;
    386     hPtr = Tcl_FindHashEntry(&_flowTable, Tcl_GetString(objPtr));
     965    hPtr = Tcl_FindHashEntry(&flowTable, Tcl_GetString(objPtr));
    387966    if (hPtr == NULL) {
    388967        if (interp != NULL) {
     
    397976
    398977int
    399 FlowCmd::CreateFlow(Tcl_Interp *interp, Tcl_Obj *objPtr)
     978NanoVis::CreateFlow(Tcl_Interp *interp, Tcl_Obj *objPtr)
    400979{
    401980    Tcl_HashEntry *hPtr;
     
    403982    const char *name;
    404983    name = Tcl_GetString(objPtr);
    405     hPtr = Tcl_CreateHashEntry(&_flowTable, name, &isNew);
     984    hPtr = Tcl_CreateHashEntry(&flowTable, name, &isNew);
    406985    if (!isNew) {
    407986        Tcl_AppendResult(interp, "flow \"", name, "\" already exists.",
     
    416995    }   
    417996    FlowCmd *flowPtr;
    418     name = Tcl_GetHashKey(&_flowTable, hPtr);
     997    name = Tcl_GetHashKey(&flowTable, hPtr);
    419998    flowPtr = new FlowCmd(interp, name, hPtr);
    420999    if (flowPtr == NULL) {
     
    4241003    }
    4251004    Tcl_SetHashValue(hPtr, flowPtr);
    426     EventuallyRedraw(MAP_PENDING);
     1005    EventuallyRedraw(MAP_FLOWS);
    4271006    return TCL_OK;
    4281007}
    4291008
    4301009void
    431 FlowCmd::DeleteFlows(Tcl_Interp *interp)
     1010NanoVis::DeleteFlows(Tcl_Interp *interp)
    4321011{
    4331012    FlowCmd *flowPtr;
     
    4381017        Tcl_DeleteCommand(interp, flowPtr->name());
    4391018    }
    440     Tcl_DeleteHashTable(&_flowTable);
     1019    Tcl_DeleteHashTable(&flowTable);
    4411020}
    4421021
    4431022bool
    444 FlowCmd::MapFlows(void)
    445 {
    446     flags &= ~FlowCmd::MAP_PENDING;
    447 
    448     _xMin = _yMin = _zMin = _wMin = _magMin = FLT_MAX;
    449     _xMax = _yMax = _zMax = _wMax = _magMax = -FLT_MAX;
     1023NanoVis::MapFlows(void)
     1024{
     1025    flags &= ~MAP_FLOWS;
     1026
    4501027
    4511028    /*
     
    4621039        }
    4631040        flowPtr->GetMagRange(minMag, maxMag);
    464         if (minMag < _magMin) {
    465             _magMin = minMag;
     1041        if (minMag < NanoVis::magMin) {
     1042            NanoVis::magMin = minMag;
    4661043        }
    467         if (maxMag > _magMax) {
    468             _magMax = maxMag;
     1044        if (maxMag > NanoVis::magMax) {
     1045            NanoVis::magMax = maxMag;
    4691046        }
    4701047        Rappture::Unirect3d *dataPtr;
    4711048        dataPtr = flowPtr->GetData();
    472         if (dataPtr->xMin() < _xMin) {
    473             _xMin = dataPtr->xMin();
    474         }
    475         if (dataPtr->yMin() < _yMin) {
    476             _yMin = dataPtr->yMin();
    477         }
    478         if (dataPtr->zMin() < _zMin) {
    479             _zMin = dataPtr->zMin();
    480         }
    481         if (dataPtr->xMax() > _xMax) {
    482             _xMax = dataPtr->xMax();
    483         }
    484         if (dataPtr->yMax() > _yMax) {
    485             _yMax = dataPtr->yMax();
    486         }
    487         if (dataPtr->zMax() > _zMax) {
    488             _zMax = dataPtr->zMax();
     1049        if (dataPtr->xMin() < NanoVis::xMin) {
     1050            NanoVis::xMin = dataPtr->xMin();
     1051        }
     1052        if (dataPtr->yMin() < NanoVis::yMin) {
     1053            NanoVis::yMin = dataPtr->yMin();
     1054        }
     1055        if (dataPtr->zMin() < NanoVis::zMin) {
     1056            NanoVis::zMin = dataPtr->zMin();
     1057        }
     1058        if (dataPtr->xMax() > NanoVis::xMax) {
     1059            NanoVis::xMax = dataPtr->xMax();
     1060        }
     1061        if (dataPtr->yMax() > NanoVis::yMax) {
     1062            NanoVis::yMax = dataPtr->yMax();
     1063        }
     1064        if (dataPtr->zMax() > NanoVis::zMax) {
     1065            NanoVis::zMax = dataPtr->zMax();
    4891066        }
    4901067    }
     
    5031080            continue;
    5041081        }
     1082        flowPtr->InitializeParticles();
    5051083        if (!flowPtr->ScaleVectorField()) {
    5061084            return false;
    5071085        }
    508         flowPtr->InitializeParticles();
    509         NanoVis::licRenderer->set_offset(flowPtr->GetPosition());
     1086        NanoVis::licRenderer->set_offset(flowPtr->GetRelativePosition());
    5101087    }
    5111088    return true;
     
    5131090
    5141091void
    515 FlowCmd::RenderFlows(void)
    516 {
    517     if (!NanoVis::licRenderer->isActivated()) {
    518         NanoVis::licRenderer->activate();
    519     }
     1092NanoVis::RenderFlows(void)
     1093{
     1094#ifdef notdef
     1095    if (!licRenderer->active()) {
     1096        licRenderer->active(true);
     1097    }
     1098#endif
    5201099    FlowCmd *flowPtr;
    5211100    FlowIterator iter;
     
    5261105        }
    5271106    }
    528     flags &= ~FlowCmd::REDRAW_PENDING;
     1107    flags &= ~REDRAW_PENDING;
    5291108}
    5301109
    5311110void
    532 FlowCmd::ResetFlows(void)
    533 {
    534     if (!NanoVis::licRenderer->isActivated()) {
    535         NanoVis::licRenderer->activate();
    536     }
    537     /*NanoVis::licRenderer->convolve();*/
    538 
     1111NanoVis::ResetFlows(void)
     1112{
     1113#ifdef notdef
     1114    if (!licRenderer->active()) {
     1115        licRenderer->active(true);
     1116    }
     1117#endif
    5391118    FlowCmd *flowPtr;
    5401119    FlowIterator iter;
     
    5481127
    5491128void
    550 FlowCmd::AdvectFlows(void)
    551 {
    552     if (!NanoVis::licRenderer->isActivated()) {
    553         NanoVis::licRenderer->activate();
    554     }
    555     /*NanoVis::licRenderer->convolve();*/
    556 
     1129NanoVis::AdvectFlows(void)
     1130{
     1131#ifdef notdef
     1132    if (!licRenderer->active()) {
     1133        licRenderer->active(true);
     1134    }
     1135#endif
    5571136    FlowCmd *flowPtr;
    5581137    FlowIterator iter;
     
    5641143    }
    5651144}   
    566 
    567 
    568 #ifdef notdef
    569 int
    570 FlowCmd::InitVectorField(Tcl_Interp *interp)
    571 {
    572     if (NanoVis::flowVisRenderer == NULL) {
    573         Tcl_AppendResult(interp, "flowvis renderer is NULL", (char *)NULL);
    574         return TCL_ERROR;
    575     }
    576     if (NanoVis::licRenderer == NULL) {
    577         Tcl_AppendResult(interp, "LIC renderer is NULL", (char *)NULL);
    578         return TCL_ERROR;
    579     }
    580     _fieldPtr->setVectorField(_volPtr->id, *(_volPtr->get_location()),
    581         1.0f, _volPtr->height / (float)_volPtr->width,
    582         _volPtr->depth  / (float)_volPtr->width,
    583         _volPtr->wAxis.max());
    584 
    585     NanoVis::initParticle();
    586     NanoVis::licRenderer->setVectorField(
    587         _volPtr->id,                    /* Texture ID */
    588         *(_volPtr->get_location()),     /* Origin */
    589         1.0f / volPtr->aspect_ratio_width, /* X-axis scale. */
    590         1.0f / volPtr->aspect_ratio_height, /* Y-axis scale. */
    591         1.0f / volPtr->aspect_ratio_depth, /* Z-axis scale. */
    592         volPtr->wAxis.max());           /* Maximum ???? */
    593 
    594     NanoVis::licRenderer->set_offset(NanoVis::lic_slice_z);
    595     return TCL_OK;
    596 }
    597 #endif
    598 
    599 int
    600 FlowCmd::CreateParticles(Tcl_Interp *interp, Tcl_Obj *objPtr)
    601 {
    602     Tcl_HashEntry *hPtr;
    603     int isNew;
    604     const char *particlesName = Tcl_GetString(objPtr);
    605     hPtr = Tcl_CreateHashEntry(&_particlesTable, particlesName, &isNew);
    606     if (!isNew) {
    607         Tcl_AppendResult(interp, "particle injection plane \"",
    608                          particlesName, "\" already exists.", (char *)NULL);
    609         return TCL_ERROR;
    610     }
    611     particlesName = Tcl_GetHashKey(&_particlesTable, hPtr);
    612     FlowParticles *particlesPtr;
    613     particlesPtr = new FlowParticles(particlesName, hPtr);
    614     if (particlesPtr == NULL) {
    615         Tcl_AppendResult(interp, "can't allocate particle injection plane",
    616                 (char *)NULL);
    617         Tcl_DeleteHashEntry(hPtr);
    618         return TCL_ERROR;
    619     }
    620     Tcl_SetHashValue(hPtr, particlesPtr);
    621     return TCL_OK;
    622 }
    623 
    624 int
    625 FlowCmd::GetParticles(Tcl_Interp *interp, Tcl_Obj *objPtr,
    626                       FlowParticles **particlesPtrPtr)
    627 {
    628     Tcl_HashEntry *hPtr;
    629     hPtr = Tcl_FindHashEntry(&_particlesTable, Tcl_GetString(objPtr));
    630     if (hPtr == NULL) {
    631         if (interp != NULL) {
    632             Tcl_AppendResult(interp, "can't find a particle injection plane \"",
    633                          Tcl_GetString(objPtr), "\"", (char *)NULL);
    634         }
    635         return TCL_ERROR;
    636     }
    637     *particlesPtrPtr = (FlowParticles *)Tcl_GetHashValue(hPtr);
    638     return TCL_OK;
    639 }
    640 
    641 FlowParticles *
    642 FlowCmd::FirstParticles(FlowParticlesIterator *iterPtr)
    643 {
    644     iterPtr->hashPtr = Tcl_FirstHashEntry(&_particlesTable,
    645         &iterPtr->hashSearch);
    646     if (iterPtr->hashPtr == NULL) {
    647         return NULL;
    648     }
    649     return (FlowParticles *)Tcl_GetHashValue(iterPtr->hashPtr);
    650 }
    651 
    652 FlowParticles *
    653 FlowCmd::NextParticles(FlowParticlesIterator *iterPtr)
    654 {
    655     if (iterPtr->hashPtr == NULL) {
    656         return NULL;
    657     }
    658     iterPtr->hashPtr = Tcl_NextHashEntry(&iterPtr->hashSearch);
    659     if (iterPtr->hashPtr == NULL) {
    660         return NULL;
    661     }
    662     return (FlowParticles *)Tcl_GetHashValue(iterPtr->hashPtr);
    663 }
    664 
    665 int
    666 FlowCmd::CreateBox(Tcl_Interp *interp, Tcl_Obj *objPtr)
    667 {
    668     Tcl_HashEntry *hPtr;
    669     int isNew;
    670     hPtr = Tcl_CreateHashEntry(&_boxTable, Tcl_GetString(objPtr), &isNew);
    671     if (!isNew) {
    672         Tcl_AppendResult(interp, "box \"", Tcl_GetString(objPtr),
    673                 "\" already exists in flow \"", name(), "\"", (char *)NULL);
    674         return TCL_ERROR;
    675     }
    676     const char *boxName;
    677     boxName = Tcl_GetHashKey(&_boxTable, hPtr);
    678     FlowBox *boxPtr;
    679     boxPtr = new FlowBox(boxName, hPtr);
    680     if (boxPtr == NULL) {
    681         Tcl_AppendResult(interp, "can't allocate box \"", boxName, "\"",
    682                          (char *)NULL);
    683         Tcl_DeleteHashEntry(hPtr);
    684         return TCL_ERROR;
    685     }
    686     Tcl_SetHashValue(hPtr, boxPtr);
    687     return TCL_OK;
    688 }
    689 
    690 int
    691 FlowCmd::GetBox(Tcl_Interp *interp, Tcl_Obj *objPtr, FlowBox **boxPtrPtr)
    692 {
    693     Tcl_HashEntry *hPtr;
    694     hPtr = Tcl_FindHashEntry(&_boxTable, Tcl_GetString(objPtr));
    695     if (hPtr == NULL) {
    696         if (interp != NULL) {
    697             Tcl_AppendResult(interp, "can't find a box \"",
    698                 Tcl_GetString(objPtr), "\" in flow \"", name(), "\"",
    699                 (char *)NULL);
    700         }
    701         return TCL_ERROR;
    702     }
    703     *boxPtrPtr = (FlowBox *)Tcl_GetHashValue(hPtr);
    704     return TCL_OK;
    705 }
    706 
    707 FlowBox *
    708 FlowCmd::FirstBox(FlowBoxIterator *iterPtr)
    709 {
    710     iterPtr->hashPtr = Tcl_FirstHashEntry(&_boxTable, &iterPtr->hashSearch);
    711     if (iterPtr->hashPtr == NULL) {
    712         return NULL;
    713     }
    714     return (FlowBox *)Tcl_GetHashValue(iterPtr->hashPtr);
    715 }
    716 
    717 FlowBox *
    718 FlowCmd::NextBox(FlowBoxIterator *iterPtr)
    719 {
    720     if (iterPtr->hashPtr == NULL) {
    721         return NULL;
    722     }
    723     iterPtr->hashPtr = Tcl_NextHashEntry(&iterPtr->hashSearch);
    724     if (iterPtr->hashPtr == NULL) {
    725         return NULL;
    726     }
    727     return (FlowBox *)Tcl_GetHashValue(iterPtr->hashPtr);
    728 }
    729 
    730 void
    731 FlowCmd::GetMagRange(double &min_mag, double &max_mag)
    732 {
    733     const float *values = _dataPtr->values();
    734     size_t nValues = _dataPtr->nValues();
    735     max_mag = -1e21, min_mag = 1e21;
    736     for (size_t i = 0; i < nValues; i += 3) {
    737         double vx, vy, vz, vm;
    738 
    739         vx = values[i];
    740         vy = values[i+1];
    741         vz = values[i+2];
    742                    
    743         vm = sqrt(vx*vx + vy*vy + vz*vz);
    744         if (vm > max_mag) {
    745             max_mag = vm;
    746         }
    747         if (vm < min_mag) {
    748             min_mag = vm;
    749         }
    750     }
    751 }
    752 
    753 
    754 void
    755 FlowCmd::InitVectorField(void)
    756 {
    757     if (_volPtr != NULL) {
    758         delete _volPtr;
    759         _volPtr = NULL;
    760         NanoVis::volume[_volIndex] = NULL;
    761         NanoVis::vol_renderer->remove_volume(_volIndex);
    762     }
    763     // Remove the associated vector field.
    764     if (_fieldPtr != NULL) {
    765         delete _fieldPtr;
    766         _fieldPtr = NULL;
    767     }
    768    
    769 }
    770 
    771 void
    772 FlowCmd::InitializeParticles(void)
    773 {
    774     FlowParticles *particlesPtr;
    775     FlowParticlesIterator iter;
    776     for (particlesPtr = FirstParticles(&iter); particlesPtr != NULL;
    777          particlesPtr = NextParticles(&iter)) {
    778         particlesPtr->Initialize();
    779     }   
    780 }
    781 
    782 bool
    783 FlowCmd::ScaleVectorField()
    784 {
    785     if (_volPtr != NULL) {
    786         delete _volPtr;
    787         _volPtr = NULL;
    788         NanoVis::volume[_volIndex] = NULL;
    789         NanoVis::vol_renderer->remove_volume(_volIndex);
    790     }
    791     float *vdata;
    792     vdata = GetScaledVector();
    793     if (vdata == NULL) {
    794         return false;
    795     }
    796     Volume *volPtr;
    797     volPtr = MakeVolume(vdata);
    798     delete [] vdata;
    799     if (volPtr == NULL) {
    800         return false;
    801     }
    802     _volPtr = volPtr;
    803 
    804     _fieldPtr = new NvVectorField();
    805     if (_fieldPtr == NULL) {
    806         return false;
    807     }
    808 
    809     double width, height, depth;
    810     width  = _xMax - _xMin;
    811     height = _yMax - _yMin;
    812     depth  = _zMax - _zMin;
    813 
    814     Vector3 *locationPtr = _volPtr->get_location();
    815     /*This is wrong. Need to compute origin. */
    816     _xOrigin = locationPtr->x;
    817     _yOrigin = locationPtr->y;
    818     _zOrigin = locationPtr->z;
    819 
    820     _fieldPtr->setVectorField(_volPtr, *locationPtr,
    821         1.0f, height / width, depth  / width, _magMax);
    822 
    823     if (NanoVis::licRenderer != NULL) {
    824         NanoVis::licRenderer->setVectorField(_volPtr->id,
    825                 *locationPtr,
    826                 1.0f / _volPtr->aspect_ratio_width,
    827                 1.0f / _volPtr->aspect_ratio_height,
    828                 1.0f / _volPtr->aspect_ratio_depth,
    829                 _volPtr->wAxis.max());
    830         SetCurrentPosition();
    831         SetAxis();
    832     }
    833     FlowParticles *particlesPtr;
    834     FlowParticlesIterator partIter;
    835     for (particlesPtr = FirstParticles(&partIter); particlesPtr != NULL;
    836          particlesPtr = NextParticles(&partIter)) {
    837         particlesPtr->SetVectorField(_volPtr);
    838     }   
    839     return true;
    840 }
    841 
    842 void
    843 FlowCmd::RenderBoxes(void)
    844 {
    845     FlowBoxIterator iter;
    846     FlowBox *boxPtr;
    847     for (boxPtr = FirstBox(&iter); boxPtr != NULL; boxPtr = NextBox(&iter)) {
    848         if (boxPtr->visible()) {
    849             boxPtr->Render(_volPtr);
    850         }
    851     }
    852 }
    853 
    854 float *
    855 FlowCmd::GetScaledVector(void)
    856 {
    857     assert(_dataPtr->nComponents() == 3);
    858     size_t n = _dataPtr->nValues() / _dataPtr->nComponents() * 4;
    859     float *data = new float[n];
    860     if (data == NULL) {
    861         return NULL;
    862     }
    863     memset(data, 0, sizeof(float) * n);
    864     float *destPtr = data;
    865     const float *values = _dataPtr->values();
    866     for (size_t iz=0; iz < _dataPtr->zNum(); iz++) {
    867         for (size_t iy=0; iy < _dataPtr->yNum(); iy++) {
    868             for (size_t ix=0; ix < _dataPtr->xNum(); ix++) {
    869                 double vx, vy, vz, vm;
    870                 vx = values[0];
    871                 vy = values[1];
    872                 vz = values[2];
    873                 vm = sqrt(vx*vx + vy*vy + vz*vz);
    874                 destPtr[0] = vm / _magMax;
    875                 destPtr[1] = vx /(2.0*_magMax) + 0.5;
    876                 destPtr[2] = vy /(2.0*_magMax) + 0.5;
    877                 destPtr[3] = vz /(2.0*_magMax) + 0.5;
    878                 values += 3;
    879                 destPtr += 4;
    880             }
    881         }
    882     }
    883     return data;
    884 }
    885 
    886 Volume *
    887 FlowCmd::MakeVolume(float *data)
    888 {
    889     if (_volIndex < 0) {
    890         _volIndex = NanoVis::n_volumes;
    891     }
    892     Volume *volPtr;
    893     volPtr = NanoVis::load_volume(_volIndex, _dataPtr->xNum(),
    894         _dataPtr->yNum(), _dataPtr->zNum(), 4, data, _magMin, _magMax, 0);
    895     volPtr->xAxis.SetRange(_dataPtr->xMin(), _dataPtr->xMax());
    896     volPtr->yAxis.SetRange(_dataPtr->yMin(), _dataPtr->yMax());
    897     volPtr->zAxis.SetRange(_dataPtr->zMin(), _dataPtr->zMax());
    898     volPtr->wAxis.SetRange(_magMin, _magMax);
    899 
    900     /*volPtr->update_pending = false;*/
    901     Vector3 physicalMin(_xMin, _yMin, _zMin);
    902     Vector3 physicalMax(_xMax, _yMax, _zMax);
    903     volPtr->setPhysicalBBox(physicalMin, physicalMax);
    904 
    905     volPtr->set_n_slice(256 - _volIndex);
    906     // volPtr->set_n_slice(512- _volIndex);
    907     volPtr->disable_cutplane(0);
    908     volPtr->disable_cutplane(1);
    909     volPtr->disable_cutplane(2);
    910 
    911     TransferFunction *tfPtr;
    912     tfPtr = _sv.tfPtr;
    913     if (tfPtr == NULL) {
    914         tfPtr = NanoVis::get_transfunc("default");
    915     }
    916     NanoVis::vol_renderer->add_volume(volPtr, tfPtr);
    917     if (_sv.showVolume) {
    918         volPtr->enable_data();
    919     } else {
    920         volPtr->disable_data();
    921     }
    922     if (_sv.showOutline) {
    923         volPtr->enable_outline();
    924     } else {
    925         volPtr->disable_outline();
    926     }
    927     float dx0 = -0.5;
    928     float dy0 = -0.5*volPtr->height/volPtr->width;
    929     float dz0 = -0.5*volPtr->depth/volPtr->width;
    930     volPtr->move(Vector3(dx0, dy0, dz0));
    931     return volPtr;
    932 }
    933 
    934 static int
    935 FlowDataFileOp(ClientData clientData, Tcl_Interp *interp, int objc,
    936                Tcl_Obj *const *objv)
    937 {
    938     Rappture::Outcome result;
    939 
    940     const char *fileName;
    941     fileName = Tcl_GetString(objv[3]);
    942     Trace("Flow loading data from file %s\n", fileName);
    943 
    944     int extents;
    945     if (Tcl_GetIntFromObj(interp, objv[4], &extents) != TCL_OK) {
    946         return TCL_ERROR;
    947     }
    948     if ((extents < 1) || (extents > 4)) {
    949         Tcl_AppendResult(interp, "bad extents value \"", Tcl_GetString(objv[4]),
    950                          "\"", (char *)NULL);
    951         return TCL_ERROR;
    952     }
    953     Rappture::Buffer buf;
    954     if (!buf.load(result, fileName)) {
    955         Tcl_AppendResult(interp, "can't load data from \"", fileName, "\": ",
    956                          result.remark(), (char *)NULL);
    957         return TCL_ERROR;
    958     }
    959 
    960     FlowCmd *flowPtr = (FlowCmd *)clientData;
    961     if (strncmp(buf.bytes(), "<DX>", 4) == 0) {
    962         Rappture::Unirect3d *dataPtr;
    963 
    964         dataPtr = new Rappture::Unirect3d(extents);
    965         if (!dataPtr->ReadVectorDataFromDx(result, buf.size(),
    966                 (char *)buf.bytes())) {
    967             Tcl_AppendResult(interp, result.remark(), (char *)NULL);
    968             delete dataPtr;
    969             return TCL_ERROR;
    970         }
    971         flowPtr->SetData(dataPtr);
    972     } else if (strncmp(buf.bytes(), "<unirect3d>", 4) == 0) {
    973         Rappture::Unirect3d *dataPtr;
    974         Tcl_CmdInfo cmdInfo;
    975 
    976         /* Set the clientdata field of the unirect3d command to contain
    977          * the local data structure. */
    978         if (!Tcl_GetCommandInfo(interp, "unirect3d", &cmdInfo)) {
    979             return TCL_ERROR;
    980         }
    981         dataPtr = new Rappture::Unirect3d(extents);
    982         cmdInfo.objClientData = (ClientData)dataPtr;   
    983         Tcl_SetCommandInfo(interp, "unirect3d", &cmdInfo);
    984         if (Tcl_Eval(interp, (const char *)buf.bytes()) != TCL_OK) {
    985             delete dataPtr;
    986             return TCL_ERROR;
    987         }
    988         if (!dataPtr->isInitialized()) {
    989             delete dataPtr;
    990             return TCL_ERROR;
    991         }
    992         flowPtr->SetData(dataPtr);
    993     } else {
    994         Rappture::Unirect3d *dataPtr;
    995 
    996         dataPtr = new Rappture::Unirect3d(extents);
    997         if (!dataPtr->ReadVectorDataFromDx(result, buf.size(),
    998                                            (char *)buf.bytes())) {
    999             Tcl_AppendResult(interp, result.remark(), (char *)NULL);
    1000             delete dataPtr;
    1001             return TCL_ERROR;
    1002         }
    1003         flowPtr->SetData(dataPtr);
    1004     }
    1005     FlowCmd::EventuallyRedraw(FlowCmd::MAP_PENDING);
    1006     return TCL_OK;
    1007 }
    1008 
    1009 static int
    1010 FlowDataFollowsOp(ClientData clientData, Tcl_Interp *interp, int objc,
    1011                     Tcl_Obj *const *objv)
    1012 {
    1013     Rappture::Outcome result;
    1014 
    1015     Trace("Flow Data Loading\n");
    1016 
    1017     int nBytes;
    1018     if (Tcl_GetIntFromObj(interp, objv[3], &nBytes) != TCL_OK) {
    1019         return TCL_ERROR;
    1020     }
    1021     if (nBytes <= 0) {
    1022         Tcl_AppendResult(interp, "bad # bytes request \"",
    1023                 Tcl_GetString(objv[3]), "\" for \"data follows\"", (char *)NULL);
    1024         return TCL_ERROR;
    1025     }
    1026     int extents;
    1027     if (Tcl_GetIntFromObj(interp, objv[4], &extents) != TCL_OK) {
    1028         return TCL_ERROR;
    1029     }
    1030     Rappture::Buffer buf;
    1031     if (GetDataStream(interp, buf, nBytes) != TCL_OK) {
    1032         return TCL_ERROR;
    1033     }
    1034     FlowCmd *flowPtr = (FlowCmd *)clientData;
    1035     if ((buf.size() > 4) && (strncmp(buf.bytes(), "<DX>", 4) == 0)) {
    1036         Rappture::Unirect3d *dataPtr;
    1037 
    1038         dataPtr = new Rappture::Unirect3d(extents);
    1039         if (!dataPtr->ReadVectorDataFromDx(result, buf.size(),
    1040                 (char *)buf.bytes())) {
    1041             Tcl_AppendResult(interp, result.remark(), (char *)NULL);
    1042             delete dataPtr;
    1043             return TCL_ERROR;
    1044         }
    1045         flowPtr->SetData(dataPtr);
    1046     } else if ((buf.size() > 4) &&
    1047                (strncmp(buf.bytes(), "<unirect3d>", 4) == 0)) {
    1048         Rappture::Unirect3d *dataPtr;
    1049         Tcl_CmdInfo cmdInfo;
    1050 
    1051         /* Set the clientdata field of the unirect3d command to contain
    1052          * the local data structure. */
    1053         dataPtr = new Rappture::Unirect3d(extents);
    1054         if (!Tcl_GetCommandInfo(interp, "unirect3d", &cmdInfo)) {
    1055             return TCL_ERROR;
    1056         }
    1057         cmdInfo.objClientData = (ClientData)dataPtr;   
    1058         Tcl_SetCommandInfo(interp, "unirect3d", &cmdInfo);
    1059         if (Tcl_Eval(interp, (const char *)buf.bytes()) != TCL_OK) {
    1060             delete dataPtr;
    1061             return TCL_ERROR;
    1062         }
    1063         if (!dataPtr->isInitialized()) {
    1064             delete dataPtr;
    1065             return TCL_ERROR;
    1066         }
    1067         flowPtr->SetData(dataPtr);
    1068     } else {
    1069         Tcl_AppendResult(interp, "unknown data header \"", /*buf.bytes(), "\"",*/
    1070                          (char *)NULL);
    1071         Rappture::Unirect3d *dataPtr;
    1072 
    1073         dataPtr = new Rappture::Unirect3d(extents);
    1074         if (!dataPtr->ReadVectorDataFromDx(result, buf.size(),
    1075                                            (char *)buf.bytes())) {
    1076             Tcl_AppendResult(interp, result.remark(), (char *)NULL);
    1077             delete dataPtr;
    1078             return TCL_ERROR;
    1079         }
    1080         flowPtr->SetData(dataPtr);
    1081     }
    1082     FlowCmd::EventuallyRedraw(FlowCmd::MAP_PENDING);
    1083     return TCL_OK;
    1084 }
    1085 
    1086 static Rappture::CmdSpec flowDataOps[] = {
    1087     {"file",    2, FlowDataFileOp,    5, 5, "fileName extents",},
    1088     {"follows", 2, FlowDataFollowsOp, 5, 5, "size extents",},
    1089 };
    1090 static int nFlowDataOps = NumCmdSpecs(flowDataOps);
    1091 
    1092 static int
    1093 FlowDataOp(ClientData clientData, Tcl_Interp *interp, int objc,
    1094            Tcl_Obj *const *objv)
    1095 {
    1096     Tcl_ObjCmdProc *proc;
    1097 
    1098     proc = Rappture::GetOpFromObj(interp, nFlowDataOps, flowDataOps,
    1099                                   Rappture::CMDSPEC_ARG2, objc, objv, 0);
    1100     if (proc == NULL) {
    1101         return TCL_ERROR;
    1102     }
    1103     return (*proc) (clientData, interp, objc, objv);
    1104 }
    1105 
    1106 
    1107 static int
    1108 FlowVectorIdOp(ClientData clientData, Tcl_Interp *interp, int objc,
    1109              Tcl_Obj *const *objv)
    1110 {
    1111 #ifdef notdef
    1112     Volume *volPtr;
    1113     if (GetVolumeFromObj(interp, objv[2], &volPtr) != TCL_OK) {
    1114         return TCL_ERROR;
    1115     }
    1116     if (NanoVis::flowVisRenderer != NULL) {
    1117         NanoVis::flowVisRenderer->setVectorField(volPtr->id,
    1118             *(volPtr->get_location()),
    1119             1.0f,
    1120             volPtr->height / (float)volPtr->width,
    1121             volPtr->depth  / (float)volPtr->width,
    1122             volPtr->wAxis.max());
    1123         NanoVis::initParticle();
    1124     }
    1125     if (NanoVis::licRenderer != NULL) {
    1126         NanoVis::licRenderer->setVectorField(volPtr->id,
    1127             *(volPtr->get_location()),
    1128             1.0f / volPtr->aspect_ratio_width,
    1129             1.0f / volPtr->aspect_ratio_height,
    1130             1.0f / volPtr->aspect_ratio_depth,
    1131             volPtr->wAxis.max());
    1132         NanoVis::licRenderer->set_offset(NanoVis::lic_slice_z);
    1133     }
    1134 #endif
    1135     return TCL_OK;
    1136 }
    11371145
    11381146/*
     
    13351343        }
    13361344        posPtr->value = value;
    1337         fprintf(stderr, "got absolute value %s\n", string);
    13381345        posPtr->flags = ABSPOS;
    13391346    } else {
     
    13971404        return TCL_ERROR;
    13981405    }
    1399     FlowCmd::EventuallyRedraw();
     1406    NanoVis::EventuallyRedraw(NanoVis::MAP_FLOWS);
    14001407    return TCL_OK;
    14011408}
     
    14191426    }
    14201427    particlesPtr->Configure();
    1421     FlowCmd::EventuallyRedraw(FlowCmd::MAP_PENDING);
     1428    NanoVis::EventuallyRedraw(NanoVis::MAP_FLOWS);
    14221429    Tcl_SetObjResult(interp, objv[3]);
    14231430    return TCL_OK;
     
    14381445    }
    14391446    particlesPtr->Configure();
    1440     FlowCmd::EventuallyRedraw();
     1447    NanoVis::EventuallyRedraw();
    14411448    return TCL_OK;
    14421449}
     
    14551462        }
    14561463    }
    1457     FlowCmd::EventuallyRedraw(FlowCmd::MAP_PENDING);
     1464    NanoVis::EventuallyRedraw(NanoVis::MAP_FLOWS);
    14581465    return TCL_OK;
    14591466}
     
    15401547        return TCL_ERROR;
    15411548    }
    1542     FlowCmd::EventuallyRedraw();
     1549    NanoVis::EventuallyRedraw(NanoVis::MAP_FLOWS);
    15431550    Tcl_SetObjResult(interp, objv[3]);
    15441551    return TCL_OK;
     
    15581565        }
    15591566    }
    1560     FlowCmd::EventuallyRedraw();
     1567    NanoVis::EventuallyRedraw();
    15611568    return TCL_OK;
    15621569}
     
    15951602        return TCL_ERROR;
    15961603    }
    1597     FlowCmd::EventuallyRedraw();
     1604    NanoVis::EventuallyRedraw();
    15981605    return TCL_OK;
    15991606}
     
    17171724          Tcl_Obj *const *objv)
    17181725{
    1719     if (FlowCmd::CreateFlow(interp, objv[2]) != TCL_OK) {
     1726    if (NanoVis::CreateFlow(interp, objv[2]) != TCL_OK) {
    17201727        return TCL_ERROR;
    17211728    }
    17221729    FlowCmd *flowPtr;
    1723     if (FlowCmd::GetFlow(interp, objv[2], &flowPtr) != TCL_OK) {
     1730    if (NanoVis::GetFlow(interp, objv[2], &flowPtr) != TCL_OK) {
    17241731        return TCL_ERROR;
    17251732    }
     
    17291736    }
    17301737    Tcl_SetObjResult(interp, objv[2]);
    1731     FlowCmd::EventuallyRedraw();
     1738    NanoVis::EventuallyRedraw(NanoVis::MAP_FLOWS);
    17321739    return TCL_OK;
    17331740}
     
    17501757        FlowCmd *flowPtr;
    17511758
    1752         if (FlowCmd::GetFlow(interp, objv[i], &flowPtr) != TCL_OK) {
     1759        if (NanoVis::GetFlow(interp, objv[i], &flowPtr) != TCL_OK) {
    17531760            return TCL_ERROR;
    17541761        }
    17551762        Tcl_DeleteCommand(interp, flowPtr->name());
    17561763    }
    1757     FlowCmd::EventuallyRedraw(FlowCmd::MAP_PENDING);
     1764    NanoVis::EventuallyRedraw(NanoVis::MAP_FLOWS);
     1765    return TCL_OK;
     1766}
     1767
     1768/*
     1769 *---------------------------------------------------------------------------
     1770 *
     1771 * FlowExistsOp --
     1772 *
     1773 *---------------------------------------------------------------------------
     1774 */
     1775/*ARGSUSED*/
     1776static int
     1777FlowExistsOp(ClientData clientData, Tcl_Interp *interp, int objc,
     1778             Tcl_Obj *const *objv)
     1779{
     1780    bool value;
     1781    FlowCmd *flowPtr;
     1782
     1783    value = false;
     1784    if (NanoVis::GetFlow(NULL, objv[2], &flowPtr) == TCL_OK) {
     1785        value = true;
     1786    }
     1787    Tcl_SetBooleanObj(Tcl_GetObjResult(interp), (int)value);
    17581788    return TCL_OK;
    17591789}
     
    17751805    FlowCmd *flowPtr;
    17761806    FlowIterator iter;
    1777     for (flowPtr = FlowCmd::FirstFlow(&iter); flowPtr != NULL;
    1778          flowPtr = FlowCmd::NextFlow(&iter)) {
     1807    for (flowPtr = NanoVis::FirstFlow(&iter); flowPtr != NULL;
     1808         flowPtr = NanoVis::NextFlow(&iter)) {
    17791809        Tcl_Obj *objPtr;
    17801810
     
    17911821{
    17921822    assert(NanoVis::licRenderer != NULL);
    1793     if (!NanoVis::licRenderer->isActivated()) {
    1794         NanoVis::licRenderer->activate();
    1795     }
    1796     Trace("sending flow playback frame\n");
    1797     // Generate the latest frame and send it back to the client
    1798     if (FlowCmd::flags & FlowCmd::MAP_PENDING) {
    1799         FlowCmd::MapFlows();
    1800     }
    1801     FlowCmd::EventuallyRedraw();
     1823#ifdef notdef
     1824    if (!NanoVis::licRenderer->active()) {
     1825        NanoVis::licRenderer->active(true);
     1826    }
     1827#endif
     1828    if (NanoVis::flags & NanoVis::MAP_FLOWS) {
     1829        NanoVis::MapFlows();
     1830    }
     1831    NanoVis::EventuallyRedraw();
    18021832    NanoVis::licRenderer->convolve();
    1803     FlowCmd::AdvectFlows();
    1804     NanoVis::offscreen_buffer_capture();  //enable offscreen render
    1805     NanoVis::display();
    1806     NanoVis::read_screen();
    1807     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
    1808     static int frame_count = 0;
    1809     NanoVis::bmp_write_to_file(++frame_count, ".");
    1810     Trace("FLOW end\n");
     1833    NanoVis::AdvectFlows();
    18111834    return TCL_OK;
    18121835}
     
    18161839             Tcl_Obj *const *objv)
    18171840{
    1818     FlowCmd::ResetFlows();
     1841    NanoVis::ResetFlows();
    18191842    NanoVis::licRenderer->reset();
    18201843    return TCL_OK;
     
    18591882        return TCL_ERROR;
    18601883    }
    1861     NanoVis::licRenderer->activate();
    1862     NanoVis::flowVisRenderer->activate();
    1863 
     1884#ifdef notdef
     1885    NanoVis::licRenderer->active(true);
     1886#endif
    18641887    // Save the old dimensions of the offscreen buffer.
    18651888    int oldWidth, oldHeight;
     
    18901913        // Generate the latest frame and send it back to the client
    18911914        NanoVis::licRenderer->convolve();
    1892         FlowCmd::AdvectFlows();
    1893         FlowCmd::RenderFlows();
     1915        NanoVis::AdvectFlows();
     1916        NanoVis::RenderFlows();
    18941917        NanoVis::offscreen_buffer_capture();  //enable offscreen render
    18951918        NanoVis::display();
     
    19071930    Trace("FLOW end\n");
    19081931
     1932#ifdef notdef
    19091933    if (NanoVis::licRenderer) {
    1910         NanoVis::licRenderer->deactivate();
    1911     }
    1912     if (NanoVis::flowVisRenderer) {
    1913         NanoVis::flowVisRenderer->deactivate();
    1914     }
    1915     NanoVis::initParticle();
     1934        NanoVis::licRenderer->active(false);
     1935    }
     1936#endif
     1937    NanoVis::licRenderer->make_patterns();
    19161938
    19171939    // FIXME: find a way to get the data from the movie object as a void*
     
    19461968    {"add",      1, FlowAddOp,     3, 0, "name ?option value...?",},
    19471969    {"delete",   1, FlowDeleteOp,  2, 0, "name...",},
     1970    {"exists",   1, FlowExistsOp,  3, 3, "name",},
    19481971    {"names",    1, FlowNamesOp,   2, 3, "?pattern?",},
    19491972    {"next",     2, FlowNextOp,    2, 2, "",},
     
    19892012{
    19902013    Tcl_CreateObjCommand(interp, "flow", FlowCmdProc, NULL, NULL);
    1991     FlowCmd::Init();
    1992     return TCL_OK;
    1993 }
    1994 
    1995 
    1996 float
    1997 FlowCmd::GetPosition(FlowPosition *posPtr)
    1998 {
    1999     if (posPtr->flags == RELPOS) {
    2000         return posPtr->value;
    2001     }
    2002     switch (posPtr->axis) {
    2003     case AXIS_X: 
    2004         return (posPtr->value - _xMin) / (_xMax - _xMin);
    2005     case AXIS_Y: 
    2006         return (posPtr->value - _yMin) / (_yMax - _yMin);
    2007     case AXIS_Z: 
    2008         return (posPtr->value - _zMin) / (_zMax - _zMin);
    2009     }
    2010     return 0.0;
    2011 }
    2012 
    2013 float
    2014 FlowCmd::GetPosition(void)
    2015 {
    2016     return FlowCmd::GetPosition(&_sv.slicePos);
    2017 }
     2014    NanoVis::InitFlows();
     2015    return TCL_OK;
     2016}
     2017
  • trunk/packages/vizservers/nanovis/FlowCmd.h

    r1429 r1431  
    6969    }
    7070    void Advect(void) {
    71         assert(_rendererPtr->isActivated());
     71        assert(_rendererPtr->active());
    7272        _rendererPtr->advect();
    7373    }
     
    194194    void Configure(void);
    195195
    196     /* Overall ranges over all flow vectors. */
    197     static float _xMin, _xMax, _yMin, _yMax, _zMin, _zMax, _wMin, _wMax;
    198     static float _magMin, _magMax;
    199     static float _xOrigin, _yOrigin, _zOrigin;
    200 
    201196    static Rappture::SwitchSpec _switches[];
    202197    FlowValues _sv;
    203198
    204     /* Class-generic data */
    205     static Tcl_HashTable _flowTable;
    206     static int _initialized;
    207 
    208199    void RenderBoxes(void);
    209200public:
    210     static unsigned int flags;
    211201    enum SliceAxis { AXIS_X, AXIS_Y, AXIS_Z };
    212     enum FlowCmdFlags { REDRAW_PENDING=(1<<0), MAP_PENDING=(1<<1) };
    213202    FlowCmd(Tcl_Interp *interp, const char *name, Tcl_HashEntry *hPtr);
    214203    ~FlowCmd(void);
     
    230219    FlowBox *NextBox(FlowBoxIterator *iterPtr);
    231220
    232     static FlowCmd *FirstFlow(FlowIterator *iterPtr);
    233     static FlowCmd *NextFlow(FlowIterator *iterPtr);
    234     static void Init(void);
    235     static int GetFlow(Tcl_Interp *interp, Tcl_Obj *objPtr,
    236                        FlowCmd **flowPtrPtr);
    237     static int CreateFlow(Tcl_Interp *interp, Tcl_Obj *objPtr);
    238     static void DeleteFlows(Tcl_Interp *interp);
    239     static bool MapFlows(void);
    240     static void RenderFlows(void);
    241     static void ResetFlows(void);
    242     static bool UpdateFlows(void);
    243     static void AdvectFlows(void);
    244 
    245221    float *GetScaledVector(void);
    246222    Volume *MakeVolume(float *data);
     
    279255        NanoVis::licRenderer->set_axis(_sv.slicePos.axis);
    280256        NanoVis::licRenderer->set_offset(_sv.slicePos.value);
    281         NanoVis::licRenderer->activate();
     257        NanoVis::licRenderer->active(true);
    282258    }
    283259    void DeactivateSlice(void) {
    284         NanoVis::licRenderer->deactivate();
     260        NanoVis::licRenderer->active(false);
    285261    }
    286262    SliceAxis GetAxis(void) {
    287263        return (SliceAxis)_sv.slicePos.axis;
    288264    }
    289     float GetPosition(void);
     265    float GetRelativePosition(void);
    290266    void SetAxis(void) {
    291267        NanoVis::licRenderer->set_axis(_sv.slicePos.axis);
     
    301277    void SetCurrentPosition(void) {
    302278        NanoVis::licRenderer->set_offset(_sv.slicePos.value);
     279    }
     280    void SetActive(bool state) {
     281        _sv.sliceVisible = state;
     282        NanoVis::licRenderer->active(state);
     283    }
     284    void SetActive(void) {
     285        NanoVis::licRenderer->active(_sv.sliceVisible);
    303286    }
    304287    void GetMagRange(double &min_mag, double &max_mag);
     
    321304        return TCL_OK;
    322305    }
    323     static void EventuallyRedraw(unsigned int flag = 0) {
    324         if (flag) {
    325             flags |= flag;
    326         }
    327         if ((flags & FlowCmd::REDRAW_PENDING) == 0) {
    328             glutPostRedisplay();
    329             flags |= FlowCmd::REDRAW_PENDING;
    330         }
    331     }
    332     static float GetPosition(FlowPosition *posPtr);
     306    static float GetRelativePosition(FlowPosition *posPtr);
    333307};
    334308
    335309extern int GetDataStream(Tcl_Interp *interp, Rappture::Buffer &buf, int nBytes);
    336 #ifdef notdef
    337 extern bool SetVectorFieldData(Rappture::Outcome &context,
    338         float xMin, float xMax, size_t xNum,
    339         float yMin, float yMax, size_t yNum,
    340         float zMin, float zMax, size_t zNum,
    341         size_t nValues, float *values,
    342         FlowCmd *flowPtr);
    343 
    344 extern bool SetResampledVectorFieldData(Rappture::Outcome &context,
    345         float xMin, float xMax, size_t xNum,
    346         float yMin, float yMax, size_t yNum,
    347         float zMin, float zMax, size_t zNum,
    348         size_t nValues, float *values,
    349         FlowCmd *flowPtr);
    350 
    351 extern bool SetVectorFieldDataFromUnirect3d(Rappture::Outcome &context,
    352         Rappture::Unirect3d &data, FlowCmd *flowPtr);
    353 #endif
    354310
    355311extern int GetBooleanFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr,
  • trunk/packages/vizservers/nanovis/Lic.cpp

    r1111 r1431  
    100100  get_slice();
    101101  make_patterns();
    102 
    103   fprintf(stderr, "initialize lic ...\n");
    104102}
    105103
  • trunk/packages/vizservers/nanovis/NvCamera.cpp

    r1215 r1431  
    3636
    3737void
    38 NvCamera::activate()
     38NvCamera::initialize()
    3939{
    4040    //fprintf(stderr, "camera: %d, %d\n", width, height);
  • trunk/packages/vizservers/nanovis/NvCamera.h

    r1239 r1431  
    9494        startX_ = sx, startY_ = sy;
    9595    }
    96     void activate(void); //make the camera setting active, this has to be
     96    void initialize(void); //make the camera setting active, this has to be
    9797                         //called before drawing things.
    9898};
  • trunk/packages/vizservers/nanovis/NvFlowVisRenderer.cpp

    r1380 r1431  
    3131    _activated(true)
    3232{
    33         _psys_width = w;
    34         _psys_height = h;
    35 
    36 /*
    37         licRenderer[0] = new NvLIC(NMESH, NPIX, NPIX, 0,
    38                                 Vector3(0, 0, 0), g_context);
    39         licRenderer[1] = new NvLIC(NMESH, NPIX, NPIX, 1,
    40                                 Vector3(0, 0, 0), g_context);
    41         licRenderer[2] = new NvLIC(NMESH, NPIX, NPIX, 2,
    42                                 Vector3(0, 0, 0), g_context);
    43 */
     33    _psys_width = w;
     34    _psys_height = h;
     35
     36    /*
     37      licRenderer[0] = new NvLIC(NMESH, NPIX, NPIX, 0,
     38      Vector3(0, 0, 0), g_context);
     39      licRenderer[1] = new NvLIC(NMESH, NPIX, NPIX, 1,
     40      Vector3(0, 0, 0), g_context);
     41      licRenderer[2] = new NvLIC(NMESH, NPIX, NPIX, 2,
     42      Vector3(0, 0, 0), g_context);
     43    */
    4444}
    4545
    4646NvFlowVisRenderer::~NvFlowVisRenderer()
    4747{
    48         std::map<std::string, NvVectorField*>::iterator iter;
    49         for (iter = _vectorFieldMap.begin(); iter != _vectorFieldMap.end(); ++iter)
    50         {
    51                 delete (*iter).second;
    52         }
    53 
    54 /*
    55         for (int i = 0; i < 3; ++i)
    56         {
    57                 delete licRenderer[i];
    58         }
    59 */
     48    std::map<std::string, NvVectorField*>::iterator iter;
     49    for (iter = _vectorFieldMap.begin(); iter != _vectorFieldMap.end(); ++iter)
     50        {
     51            delete (*iter).second;
     52        }
     53
     54    /*
     55      for (int i = 0; i < 3; ++i)
     56      {
     57      delete licRenderer[i];
     58      }
     59    */
    6060}
    6161
     
    6363NvFlowVisRenderer::initialize()
    6464{
    65         std::map<std::string, NvVectorField*>::iterator iter;
    66         for (iter = _vectorFieldMap.begin(); iter != _vectorFieldMap.end(); ++iter)
    67         {
    68                 (*iter).second->initialize();
     65    std::map<std::string, NvVectorField*>::iterator iter;
     66    for (iter = _vectorFieldMap.begin(); iter != _vectorFieldMap.end(); ++iter)
     67        {
     68            (*iter).second->initialize();
    6969        }
    7070}
     
    7373NvFlowVisRenderer::reset()
    7474{
    75         std::map<std::string, NvVectorField*>::iterator iter;
    76         for (iter = _vectorFieldMap.begin(); iter != _vectorFieldMap.end(); ++iter)
    77         {
    78                 (*iter).second->reset();
     75    std::map<std::string, NvVectorField*>::iterator iter;
     76    for (iter = _vectorFieldMap.begin(); iter != _vectorFieldMap.end(); ++iter)
     77        {
     78            (*iter).second->reset();
    7979        }
    8080}
     
    8383NvFlowVisRenderer::initialize(const std::string& vfName)
    8484{
    85         std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
    86         if (iter != _vectorFieldMap.end())
    87         {
    88                 if ((*iter).second)
     85    std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
     86    if (iter != _vectorFieldMap.end())
     87        {
     88            if ((*iter).second)
    8989                {
    90                         (*iter).second->initialize();
     90                    (*iter).second->initialize();
    9191                }
    9292        }
     
    9696NvFlowVisRenderer::advect()
    9797{
    98         std::map<std::string, NvVectorField*>::iterator iter;
    99         for (iter = _vectorFieldMap.begin(); iter != _vectorFieldMap.end(); ++iter)
    100         {
    101                 if((*iter).second && (*iter).second->isActivated()) (*iter).second->advect();
     98    std::map<std::string, NvVectorField*>::iterator iter;
     99    for (iter = _vectorFieldMap.begin(); iter != _vectorFieldMap.end(); ++iter)
     100        {
     101            if((*iter).second && (*iter).second->active()) (*iter).second->advect();
    102102        }
    103103}
     
    106106NvFlowVisRenderer::render()
    107107{
    108         std::map<std::string, NvVectorField*>::iterator iter;
    109         for (iter = _vectorFieldMap.begin(); iter != _vectorFieldMap.end(); ++iter)
    110         {
    111                 if((*iter).second && (*iter).second->isActivated()) (*iter).second->render();
     108    std::map<std::string, NvVectorField*>::iterator iter;
     109    for (iter = _vectorFieldMap.begin(); iter != _vectorFieldMap.end(); ++iter)
     110        {
     111            if((*iter).second && (*iter).second->active()) (*iter).second->render();
    112112        }
    113113}
     
    135135NvFlowVisRenderer::activateVectorField(const std::string& vfName)
    136136{
    137         std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
    138         if (iter != _vectorFieldMap.end())
    139                 if ((*iter).second) (*iter).second->activate();
     137    std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
     138    if (iter != _vectorFieldMap.end())
     139        if ((*iter).second) (*iter).second->active(true);
    140140}
    141141
     
    143143NvFlowVisRenderer::deactivateVectorField(const std::string& vfName)
    144144{
    145         std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
    146         if (iter != _vectorFieldMap.end())
    147                 if ((*iter).second) (*iter).second->deactivate();
     145    std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
     146    if (iter != _vectorFieldMap.end())
     147        if ((*iter).second) (*iter).second->active(false);
    148148}
    149149
     
    151151NvFlowVisRenderer::activatePlane(const std::string& vfName, const std::string& name)
    152152{
    153         std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
    154         if (iter != _vectorFieldMap.end())
    155         {
    156                 if ((*iter).second) (*iter).second->activatePlane(name);
     153    std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
     154    if (iter != _vectorFieldMap.end())
     155        {
     156            if ((*iter).second) (*iter).second->activatePlane(name);
    157157        }
    158158}
     
    161161NvFlowVisRenderer::deactivatePlane(const std::string& vfName, const std::string& name)
    162162{
    163         std::map<std::string, NvVectorField*>::iterator iter;
    164 
    165         iter = _vectorFieldMap.find(vfName);
    166         if (iter != _vectorFieldMap.end())
    167         {
    168                 if ((*iter).second) (*iter).second->deactivatePlane(name);
     163    std::map<std::string, NvVectorField*>::iterator iter;
     164
     165    iter = _vectorFieldMap.find(vfName);
     166    if (iter != _vectorFieldMap.end())
     167        {
     168            if ((*iter).second) (*iter).second->deactivatePlane(name);
    169169        }
    170170}
     
    173173NvFlowVisRenderer::setPlaneAxis(const std::string& vfName, const std::string& planeName, int axis)
    174174{
    175         std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
    176         if (iter != _vectorFieldMap.end())
    177                 if((*iter).second) (*iter).second->setPlaneAxis(planeName, axis);
     175    std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
     176    if (iter != _vectorFieldMap.end())
     177        if((*iter).second) (*iter).second->setPlaneAxis(planeName, axis);
    178178}
    179179
     
    181181NvFlowVisRenderer::setPlanePos(const std::string& vfName, const std::string& name, float pos)
    182182{
    183         std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
    184         if (iter != _vectorFieldMap.end())
    185                 if((*iter).second) (*iter).second->setPlanePos(name, pos);
     183    std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
     184    if (iter != _vectorFieldMap.end())
     185        if((*iter).second) (*iter).second->setPlanePos(name, pos);
    186186}
    187187
     
    189189NvFlowVisRenderer::setParticleColor(const std::string& vfName, const std::string& name, const Vector4& color)
    190190{
    191         std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
    192         if (iter != _vectorFieldMap.end())
    193                 if((*iter).second) (*iter).second->setParticleColor(name, color);
     191    std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
     192    if (iter != _vectorFieldMap.end())
     193        if((*iter).second) (*iter).second->setParticleColor(name, color);
    194194}
    195195
     
    197197NvFlowVisRenderer::removeVectorField(const std::string& vfName)
    198198{
    199         std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
    200         if (iter != _vectorFieldMap.end())
    201         {
    202                 delete (*iter).second;
    203                 _vectorFieldMap.erase(iter);
    204         }
     199    std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
     200    if (iter != _vectorFieldMap.end()) {
     201        delete (*iter).second;
     202        _vectorFieldMap.erase(iter);
     203    }
    205204}
    206205
     
    208207NvFlowVisRenderer::addPlane(const std::string& vfName, const std::string& name)
    209208{
    210         std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
    211         if (iter != _vectorFieldMap.end())
    212         {
    213                 if ((*iter).second) (*iter).second->addPlane(name);
    214         }
     209    std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
     210    if (iter != _vectorFieldMap.end()) {
     211        if ((*iter).second) (*iter).second->addPlane(name);
     212    }
    215213}
    216214
     
    218216NvFlowVisRenderer::removePlane(const std::string& vfName, const std::string& name)
    219217{
    220         std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
    221         if (iter != _vectorFieldMap.end())
    222         {
    223                 if ((*iter).second) (*iter).second->removePlane(name);
    224         }
     218    std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
     219    if (iter != _vectorFieldMap.end()) {
     220        if ((*iter).second) (*iter).second->removePlane(name);
     221    }
    225222}
    226223
     
    228225NvFlowVisRenderer::activateDeviceShape(const std::string& vfName, const std::string& name)
    229226{
    230         std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
    231         if (iter != _vectorFieldMap.end())
    232         {
    233                 if ((*iter).second) (*iter).second->activateDeviceShape(name);
    234         }
     227    std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
     228    if (iter != _vectorFieldMap.end()) {
     229        if ((*iter).second) (*iter).second->activateDeviceShape(name);
     230    }
    235231}
    236232
     
    238234NvFlowVisRenderer::deactivateDeviceShape(const std::string& vfName, const std::string& name)
    239235{
    240         std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
    241         if (iter != _vectorFieldMap.end())
    242         {
    243                 if ((*iter).second) (*iter).second->deactivateDeviceShape(name);
    244         }
     236    std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
     237    if (iter != _vectorFieldMap.end()) {
     238        if ((*iter).second) (*iter).second->deactivateDeviceShape(name);
     239    }
    245240}
    246241
     
    248243NvFlowVisRenderer::activateDeviceShape(const std::string& vfName)
    249244{
    250         std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
    251         if (iter != _vectorFieldMap.end())
    252         {
    253                 if ((*iter).second) (*iter).second->activateDeviceShape();
    254         }
     245    std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
     246    if (iter != _vectorFieldMap.end()) {
     247        if ((*iter).second) (*iter).second->activateDeviceShape();
     248    }
    255249}
    256250
     
    258252NvFlowVisRenderer::deactivateDeviceShape(const std::string& vfName)
    259253{
    260         std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
    261         if (iter != _vectorFieldMap.end())
    262         {
    263                 if ((*iter).second) (*iter).second->deactivateDeviceShape();
    264         }
     254    std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
     255    if (iter != _vectorFieldMap.end()) {
     256        if ((*iter).second) (*iter).second->deactivateDeviceShape();
     257    }
    265258}
    266259
     
    268261NvFlowVisRenderer::addDeviceShape(const std::string& vfName, const std::string& name, const NvDeviceShape& shape)
    269262{
    270         std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
    271         if (iter != _vectorFieldMap.end())
    272         {
    273                 if ((*iter).second) (*iter).second->addDeviceShape(name, shape);
    274         }
     263    std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
     264    if (iter != _vectorFieldMap.end()) {
     265        if ((*iter).second) (*iter).second->addDeviceShape(name, shape);
     266    }
    275267}
    276268
     
    278270NvFlowVisRenderer::removeDeviceShape(const std::string& vfName, const std::string& name)
    279271{
    280         std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
    281         if (iter != _vectorFieldMap.end())
    282         {
    283                 if ((*iter).second) (*iter).second->removeDeviceShape(name);
    284         }
    285 }
     272    std::map<std::string, NvVectorField*>::iterator iter = _vectorFieldMap.find(vfName);
     273    if (iter != _vectorFieldMap.end()) {
     274        if ((*iter).second) (*iter).second->removeDeviceShape(name);
     275    }
     276}
  • trunk/packages/vizservers/nanovis/NvFlowVisRenderer.h

    r1429 r1431  
     1
     2#ifndef _NVFLOWVISRENDERER_H
     3#define  _NVFLOWVISRENDERER_H
    14#pragma once
    25
     
    2225
    2326class NvFlowVisRenderer {
    24         enum {
    25                 MAX_PARTICLE_RENDERER = 4,
    26         };
     27    enum {
     28        MAX_PARTICLE_RENDERER = 4,
     29    };
    2730
    28         int _psys_width;
    29         int _psys_height;
    30         CGcontext context;
     31    int _psys_width;
     32    int _psys_height;
     33    CGcontext context;
    3134
    32         std::map<std::string, NvVectorField*> _vectorFieldMap;
     35    std::map<std::string, NvVectorField*> _vectorFieldMap;
    3336
    34         bool _activated;
     37    bool _activated;
    3538
    36         //NvLIC* licRenderer[3];
     39    //NvLIC* licRenderer[3];
    3740public:
    38         NvFlowVisRenderer(int w, int h, CGcontext context);
    39         ~NvFlowVisRenderer();
     41    NvFlowVisRenderer(int w, int h, CGcontext context);
     42    ~NvFlowVisRenderer();
    4043
    41         void initialize();
    42         void initialize(const std::string& vfName);
    43         void advect();
    44         void reset();
    45         void render();
     44    void initialize();
     45    void initialize(const std::string& vfName);
     46    void advect();
     47    void reset();
     48    void render();
    4649
    47         void addVectorField(Volume* volPtr, const Vector3& ori, float scaleX,
    48                 float scaleY, float scaleZ, float max);
     50    void addVectorField(Volume* volPtr, const Vector3& ori, float scaleX,
     51                        float scaleY, float scaleZ, float max);
    4952
    50         void addVectorField(const std::string& vfName, Volume* volPtr, const Vector3& ori, float scaleX, float scaleY, float scaleZ, float max);
    51         void removeVectorField(const std::string& vfName);
     53    void addVectorField(const std::string& vfName, Volume* volPtr, const Vector3& ori, float scaleX, float scaleY, float scaleZ, float max);
     54    void removeVectorField(const std::string& vfName);
    5255
    53         void addPlane(const std::string& vfName, const std::string& name);
    54         void removePlane(const std::string& vfName, const std::string& name);
     56    void addPlane(const std::string& vfName, const std::string& name);
     57    void removePlane(const std::string& vfName, const std::string& name);
    5558
    56         /**
    57          * @brief Specify the axis of the index plane
    58          * @param index the index of the array of injection planes
    59         */
    60         void setPlaneAxis(const std::string& vfName, const std::string& name, int axis);
     59    /**
     60     * @brief Specify the axis of the index plane
     61     * @param index the index of the array of injection planes
     62    */
     63    void setPlaneAxis(const std::string& vfName, const std::string& name, int axis);
    6164
    62         /**
    63          * @param pos : Specify the position of slice
    64          */
    65         void setPlanePos(const std::string& vfName, const std::string& name, float pos);
    66         void setParticleColor(const std::string& vfName, const std::string& name, const Vector4& color);
    67         void activatePlane(const std::string& vfName, const std::string& name);
    68         void deactivatePlane(const std::string& vfName, const std::string& name);
     65    /**
     66     * @param pos : Specify the position of slice
     67     */
     68    void setPlanePos(const std::string& vfName, const std::string& name, float pos);
     69    void setParticleColor(const std::string& vfName, const std::string& name, const Vector4& color);
     70    void activatePlane(const std::string& vfName, const std::string& name);
     71    void deactivatePlane(const std::string& vfName, const std::string& name);
    6972
    70         void activateVectorField(const std::string& vfName);
    71         void deactivateVectorField(const std::string& vfName);
     73    void activateVectorField(const std::string& vfName);
     74    void deactivateVectorField(const std::string& vfName);
    7275
    73         ////////////////////
    74         // DEVICE SHAPE
    75         void addDeviceShape(const std::string& vfName, const std::string& name, const NvDeviceShape& shape);
    76         void removeDeviceShape(const std::string& vfName, const std::string& name);
    77         void activateDeviceShape(const std::string& vfName);
    78         void deactivateDeviceShape(const std::string& vfName);
    79         void activateDeviceShape(const std::string& vfName, const std::string& name);
    80         void deactivateDeviceShape(const std::string& vfName, const std::string& name);
    81 
    82         void activate();
    83         void deactivate();
    84         bool isActivated() const;
     76    ////////////////////
     77    // DEVICE SHAPE
     78    void addDeviceShape(const std::string& vfName, const std::string& name, const NvDeviceShape& shape);
     79    void removeDeviceShape(const std::string& vfName, const std::string& name);
     80    void activateDeviceShape(const std::string& vfName);
     81    void deactivateDeviceShape(const std::string& vfName);
     82    void activateDeviceShape(const std::string& vfName, const std::string& name);
     83    void deactivateDeviceShape(const std::string& vfName, const std::string& name);
     84    bool active(void) {
     85        return _activated;
     86    }
     87    void active(bool state) {
     88        _activated = state;
     89    }
    8590};
    8691
    87 inline void NvFlowVisRenderer::activate()
    88 {
    89     _activated = true;
    90 }
    9192
    92 inline void NvFlowVisRenderer::deactivate()
    93 {
    94     _activated = false;
    95 }
    96 
    97 inline bool NvFlowVisRenderer::isActivated() const
    98 {
    99     return _activated;
    100 }
    101 
     93#endif /* _NVFLOWVISRENDERER_H */
  • trunk/packages/vizservers/nanovis/NvLIC.cpp

    r1429 r1431  
    2525#include "global.h"
    2626
    27 NvLIC::NvLIC(int _size, int _width, int _height, int _axis, const Vector3& _offset,
    28             CGcontext _context) :
     27NvLIC::NvLIC(int _size, int _width, int _height, int _axis,
     28             const Vector3& _offset, CGcontext _context) :
    2929    Renderable(Vector3(0.0f,0.0f,0.0f)),
    3030    disListID(0),
     
    5454    glGenTextures(1, &pattern_tex);
    5555    glBindTexture(GL_TEXTURE_2D, pattern_tex);
    56     glTexParameteri(GL_TEXTURE_2D,
    57                   GL_TEXTURE_WRAP_S, GL_REPEAT);
    58     glTexParameteri(GL_TEXTURE_2D,
    59                   GL_TEXTURE_WRAP_T, GL_REPEAT);
    60     glTexParameteri(GL_TEXTURE_2D,
    61                   GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    62     glTexParameteri(GL_TEXTURE_2D,
    63                   GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     56    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
     57    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
     58    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     59    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    6460    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
    6561
     
    7672
    7773    // ADD INSOO
    78     glTexParameteri(GL_TEXTURE_RECTANGLE_NV,
    79                   GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    80     glTexParameteri(GL_TEXTURE_RECTANGLE_NV,
    81                   GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    82 
    83     glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0,
    84         GL_FLOAT_RGBA32_NV, size, size, 0, GL_RGBA, GL_FLOAT, NULL);
     74    glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S,
     75                    GL_CLAMP_TO_EDGE);
     76    glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T,
     77                    GL_CLAMP_TO_EDGE);
     78
     79    glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_RGBA32_NV, size, size,
     80                0, GL_RGBA, GL_FLOAT, NULL);
    8581
    8682    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
     
    212208        }
    213209    }
    214 
    215210    glGenTextures(1, &mag_tex);
    216211    glBindTexture(GL_TEXTURE_2D, mag_tex);
     
    252247    glBegin(GL_QUADS);
    253248    {
    254         switch (axis)
    255         {
     249        switch (axis) {
    256250        case 0 :
    257251            // TBD..
     
    303297NvLIC::convolve()
    304298{
    305     if (vectorFieldID == 0) return;
     299    if (vectorFieldID == 0) {
     300        return;
     301    }
    306302
    307303    int   i, j;
     
    410406NvLIC::display()
    411407{
    412     if (vectorFieldID == 0) return;
     408    if (vectorFieldID == 0) {
     409        return;
     410    }
    413411
    414412    glBindTexture(GL_TEXTURE_2D, color_tex);
  • trunk/packages/vizservers/nanovis/NvLIC.h

    r1370 r1431  
    4040    unsigned int disListID;
    4141
    42   int width, height;
    43   int size;             //the lic is a square of size, it can be stretched
    44   float* slice_vector;  //storage for the per slice vectors driving the follow
    45   Vector3 scale;        //scaling factor stretching the lic plane to fit the actual dimensions
    46   Vector3 origin;
    47   Vector3 offset;               //[0,1] offset could be x, y, or z direction
    48   int axis;
     42    int width, height;
     43    int size;                           // The lic is a square of size, it can
     44                                        // be stretched
     45    float* slice_vector;                // Storage for the per slice vectors
     46                                        // driving the follow.
     47    Vector3 scale;                      // Scaling factor stretching the lic
     48                                        // plane to fit the actual dimensions
     49    Vector3 origin;
     50    Vector3 offset;                     // [0,1] offset could be x, y, or z
     51                                        // direction
     52    int axis;
    4953
    50   //some convolve variables. They can pretty much stay fixed
    51   int iframe;
    52   int Npat;
    53   int alpha;
    54   float sa;
    55   float tmax;
    56   float dmax;
     54    //some convolve variables. They can pretty much stay fixed
     55    int iframe;
     56    int Npat;
     57    int alpha;
     58    float sa;
     59    float tmax;
     60    float dmax;
    5761    float max;
     62   
     63    //CG shader parameters
     64    CGcontext m_g_context;
     65    CGparameter m_vel_tex_param;
     66    CGparameter m_vel_tex_param_render_vel, m_plane_normal_param_render_vel;
     67    CGprogram m_render_vel_fprog;
     68    CGparameter m_max_param;
     69   
     70    NVISid color_tex, pattern_tex, mag_tex;
     71    NVISid fbo, vel_fbo, slice_vector_tex;  // For projecting 3d vector to 2d
     72                                            // vector on a plane.
     73    NVISid vectorFieldID;
    5874
    59   //CG shader parameters
    60   CGcontext m_g_context;
    61   CGparameter m_vel_tex_param;
    62   CGparameter m_vel_tex_param_render_vel, m_plane_normal_param_render_vel;
    63   CGprogram m_render_vel_fprog;
    64   CGparameter m_max_param;
    65 
    66   NVISid color_tex, pattern_tex, mag_tex;
    67   NVISid fbo, vel_fbo, slice_vector_tex;  //for projecting 3d vector to 2d vector on a plane
    68   NVISid vectorFieldID;
    69 
    70   Volume* vector_field;
     75    Volume* vector_field;
    7176
    7277    /**
     
    7479     */
    7580    bool _activate;
     81    bool _isHidden;                     // Indicates if LIC plane is displayed.
    7682public:
    77   Vector3 normal; //the normal vector of the NvLIC plane,
    78                   //the inherited Vector3 location is its center
    79   NvLIC(int _size, int _width, int _height, int axis, const Vector3& _offset, CGcontext _context);
    80   ~NvLIC();
     83    Vector3 normal; //the normal vector of the NvLIC plane,
     84    //the inherited Vector3 location is its center
     85    NvLIC(int _size, int _width, int _height, int axis, const Vector3& _offset, CGcontext _context);
     86    ~NvLIC();
    8187
    8288    /**
     
    8591    void convolve();
    8692
    87   void display();       //display the convolution result
    88   void render();
    89   void make_patterns();
    90   void make_magnitudes();
    91   void get_velocity(float x, float y, float* px, float* py);
    92   void get_slice();
    93   void set_offset(float v);
     93    void display(void);                 // Display the convolution result
     94    void render(void);
     95    void make_patterns();
     96    void make_magnitudes();
     97    void get_velocity(float x, float y, float* px, float* py);
     98    void get_slice();
     99    void set_offset(float v);
    94100    /**
    95101     * @brief Specify the perdicular axis
     
    100106    void set_axis(int axis);
    101107
    102     void activate();
    103     void deactivate();
    104     bool isActivated() const;
    105 
    106108    void setVectorField(unsigned int texID, const Vector3& ori, float scaleX, float scaleY, float scaleZ, float max);
    107109
    108    void reset();
     110    void reset(void);
     111    void visible(bool state) {
     112        _isHidden = !state;
     113    }
     114    bool visible(void) {
     115        return (!_isHidden);
     116    }
     117    void active(bool state) {
     118        _activate = state;
     119    }
     120    bool active(void) {
     121        return _activate;
     122    }
    109123};
    110124
    111 inline void NvLIC::activate()
    112 {
    113     _activate = true;
    114 }
    115 
    116 inline void NvLIC::deactivate()
    117 {
    118     _activate = false;
    119 }
    120 
    121 inline bool NvLIC::isActivated() const
    122 {
    123     return _activate;
    124 }
    125125
    126126#endif
  • trunk/packages/vizservers/nanovis/NvParticleRenderer.h

    r1370 r1431  
    103103    Vector4 _color;
    104104
    105 
    106105public:
    107106    int psys_width;     //the storage of particles is implemented as a 2D array.
     
    118117    void render();
    119118
    120     void activate();
    121     void deactivate();
    122     bool isActivated() const;
    123 
     119    bool active(void) {
     120        return _activate;
     121    }
     122    void active(bool state) {
     123        _activate = state;
     124    }
     125    void setColor(const Vector4& color) {
     126        _color = color;
     127    }
    124128    void setAxis(int axis);
    125     void setColor(const Vector4& color);
    126129    void setPos(float pos);
    127 
    128     void draw_bounding_box(float x0, float y0, float z0, float x1, float y1, float z1, float r, float g, float b, float line_width);
     130    void draw_bounding_box(float x0, float y0, float z0,
     131                           float x1, float y1, float z1,
     132                           float r, float g, float b, float line_width);
    129133    void initializeDataArray();
    130134};
    131135
    132 inline void NvParticleRenderer::activate()
    133 {
    134     _activate = true;
    135 }
    136 
    137 inline void NvParticleRenderer::deactivate()
    138 {
    139     _activate = false;
    140 }
    141 
    142 inline bool NvParticleRenderer::isActivated() const
    143 {
    144     return _activate;
    145 }
    146 
    147 inline void NvParticleRenderer::setColor(const Vector4& color)
    148 {
    149         _color = color;
    150 }
    151136#endif
  • trunk/packages/vizservers/nanovis/NvVectorField.cpp

    r1370 r1431  
    33#include "nanovis.h"
    44
    5 NvVectorField::NvVectorField()
    6 :_vectorFieldID(0), _activated(true), _scaleX(1), _scaleY(1), _scaleZ(1), _max(1)
    7 {
    8         _deviceVisible = false;
    9         _volPtr = 0;
    10         _physicalSize.set(1.0f, 1.0f, 1.0f);
     5NvVectorField::NvVectorField() :
     6    _vectorFieldID(0),
     7    _activated(true),
     8    _scaleX(1),
     9    _scaleY(1),
     10    _scaleZ(1),
     11    _max(1)
     12{
     13    _deviceVisible = false;
     14    _volPtr = 0;
     15    _physicalSize.set(1.0f, 1.0f, 1.0f);
    1116}
    1217
    1318NvVectorField::~NvVectorField()
    1419{
    15         std::map<std::string, NvParticleRenderer*>::iterator iter;
    16         for (iter = _particleRendererMap.begin(); iter != _particleRendererMap.end(); iter++)
    17         {
    18                 delete (*iter).second;
    19         }
    20 }
    21 
    22 void NvVectorField::setVectorField(Volume* volPtr, const Vector3& ori, float scaleX, float scaleY, float scaleZ, float max)
    23 {
    24         _volPtr = volPtr;
    25         _origin = ori;
    26         _scaleX = scaleX;
    27         _scaleY = scaleY;
    28         _scaleZ = scaleZ;
    29         _max = max;
    30         _vectorFieldID = volPtr->id;
    31         _physicalMin = volPtr->getPhysicalBBoxMin();
    32         printf("_pysicalMin %f %f %f\n", _physicalMin.x, _physicalMin.y, _physicalMin.z);
    33         _physicalSize = volPtr->getPhysicalBBoxMax() - _physicalMin;
    34         printf("_pysicalSize %f %f %f\n",
    35                 _physicalSize.x, _physicalSize.y, _physicalSize.z);
    36 }
    37 
    38 void NvVectorField::addDeviceShape(const std::string& name, const NvDeviceShape& shape)
    39 {
    40         _shapeMap[name] = shape;
     20    std::map<std::string, NvParticleRenderer*>::iterator iter;
     21    for (iter = _particleRendererMap.begin();
     22         iter != _particleRendererMap.end(); iter++) {
     23        delete (*iter).second;
     24    }
     25}
     26
     27void
     28NvVectorField::setVectorField(Volume* volPtr, const Vector3& ori,
     29                              float scaleX, float scaleY, float scaleZ,
     30                              float max)
     31{
     32    _volPtr = volPtr;
     33    _origin = ori;
     34    _scaleX = scaleX;
     35    _scaleY = scaleY;
     36    _scaleZ = scaleZ;
     37    _max = max;
     38    _vectorFieldID = volPtr->id;
     39    _physicalMin = volPtr->getPhysicalBBoxMin();
     40    printf("_pysicalMin %f %f %f\n", _physicalMin.x, _physicalMin.y, _physicalMin.z);
     41    _physicalSize = volPtr->getPhysicalBBoxMax() - _physicalMin;
     42    printf("_pysicalSize %f %f %f\n",
     43           _physicalSize.x, _physicalSize.y, _physicalSize.z);
     44}
     45
     46void
     47NvVectorField::addDeviceShape(const std::string& name,
     48                              const NvDeviceShape& shape)
     49{
     50    _shapeMap[name] = shape;
    4151}
    4252
    4353void NvVectorField::removeDeviceShape(const std::string& name)
    4454{
    45         std::map<std::string, NvDeviceShape>::iterator iter = _shapeMap.find(name);
    46         if (iter != _shapeMap.end()) _shapeMap.erase(iter);
     55    std::map<std::string, NvDeviceShape>::iterator iter = _shapeMap.find(name);
     56    if (iter != _shapeMap.end()) _shapeMap.erase(iter);
    4757}
    4858
    4959void NvVectorField::initialize()
    5060{
    51         std::map<std::string, NvParticleRenderer*>::iterator iter;
    52         for (iter = _particleRendererMap.begin(); iter != _particleRendererMap.end(); iter++)
    53         {
    54                 if ((*iter).second) (*iter).second->initialize();
    55         }
     61    std::map<std::string, NvParticleRenderer*>::iterator iter;
     62    for (iter = _particleRendererMap.begin();
     63         iter != _particleRendererMap.end(); iter++) {
     64        if ((*iter).second) (*iter).second->initialize();
     65    }
    5666}
    5767
    5868void NvVectorField::reset()
    5969{
    60         std::map<std::string, NvParticleRenderer*>::iterator iter;
    61         for (iter = _particleRendererMap.begin(); iter != _particleRendererMap.end(); iter++)
    62         {
    63                 if ((*iter).second) (*iter).second->reset();
    64         }
     70    std::map<std::string, NvParticleRenderer*>::iterator iter;
     71    for (iter = _particleRendererMap.begin();
     72         iter != _particleRendererMap.end(); iter++) {
     73        if ((*iter).second) (*iter).second->reset();
     74    }
    6575}
    6676
    6777void NvVectorField::setPlaneAxis(const std::string& name, int axis)
    6878{
    69         std::map<std::string, NvParticleRenderer*>::iterator iter = _particleRendererMap.find(name);
    70         if (iter != _particleRendererMap.end())
    71         {
    72                 (*iter).second->setAxis(axis);
    73         }
    74 
     79    std::map<std::string, NvParticleRenderer*>::iterator iter = _particleRendererMap.find(name);
     80    if (iter != _particleRendererMap.end()) {
     81        (*iter).second->setAxis(axis);
     82    }
     83   
    7584}
    7685
    7786void NvVectorField::setPlanePos(const std::string& name, float pos)
    7887{
    79         std::map<std::string, NvParticleRenderer*>::iterator iter = _particleRendererMap.find(name);
    80         if (iter != _particleRendererMap.end())
    81         {
    82                 (*iter).second->setPos(pos);
    83         }
     88    std::map<std::string, NvParticleRenderer*>::iterator iter = _particleRendererMap.find(name);
     89    if (iter != _particleRendererMap.end()) {
     90        (*iter).second->setPos(pos);
     91    }
    8492}
    8593
    8694void NvVectorField::addPlane(const std::string& name)
    8795{
    88         std::map<std::string, NvParticleRenderer*>::iterator iter = _particleRendererMap.find(name);
    89         NvParticleRenderer* renderer = 0;
    90         if (iter != _particleRendererMap.end())
    91         {
    92                 if ((*iter).second != 0)
    93                 {
    94                         renderer = (*iter).second;
    95                 }
    96                 else
    97                 {
    98                         renderer = (*iter).second = new NvParticleRenderer(NMESH, NMESH, g_context);
    99                 }
    100         }
    101         else
    102         {
    103                 renderer = new NvParticleRenderer(NMESH, NMESH, g_context);
    104                 _particleRendererMap[name] = renderer;
    105         }
    106        
    107         renderer->setVectorField(_vectorFieldID, _origin, _scaleX, _scaleY, _scaleZ, _max);
    108         if (renderer)
    109         {
    110                 renderer->initialize();
    111         }
     96    std::map<std::string, NvParticleRenderer*>::iterator iter = _particleRendererMap.find(name);
     97    NvParticleRenderer* renderer = 0;
     98    if (iter != _particleRendererMap.end()) {
     99        if ((*iter).second != 0) {
     100            renderer = (*iter).second;
     101        } else {
     102            renderer = (*iter).second = new NvParticleRenderer(NMESH, NMESH, g_context);
     103        }
     104    } else {
     105        renderer = new NvParticleRenderer(NMESH, NMESH, g_context);
     106        _particleRendererMap[name] = renderer;
     107    }
     108       
     109    renderer->setVectorField(_vectorFieldID, _origin, _scaleX, _scaleY, _scaleZ, _max);
     110    if (renderer) {
     111        renderer->initialize();
     112    }
    112113}
    113114
    114115void NvVectorField::removePlane(const std::string& name)
    115116{
    116         std::map<std::string, NvParticleRenderer*>::iterator iter = _particleRendererMap.find(name);
    117         if (iter != _particleRendererMap.end())
    118         {
    119                 delete (*iter).second;
    120                 _particleRendererMap.erase(iter);
    121         }
     117    std::map<std::string, NvParticleRenderer*>::iterator iter = _particleRendererMap.find(name);
     118    if (iter != _particleRendererMap.end()) {
     119        delete (*iter).second;
     120        _particleRendererMap.erase(iter);
     121    }
    122122}
    123123
    124124void NvVectorField::activatePlane(const std::string& name)
    125125{
    126         std::map<std::string, NvParticleRenderer*>::iterator iter = _particleRendererMap.find(name);
    127         if (iter != _particleRendererMap.end())
    128         {
    129                 (*iter).second->activate();
    130         }
     126    std::map<std::string, NvParticleRenderer*>::iterator iter = _particleRendererMap.find(name);
     127    if (iter != _particleRendererMap.end()) {
     128        (*iter).second->active(true);
     129    }
    131130}
    132131
    133132void NvVectorField::deactivatePlane(const std::string& name)
    134133{
    135         std::map<std::string, NvParticleRenderer*>::iterator iter = _particleRendererMap.find(name);
    136         if (iter != _particleRendererMap.end())
    137         {
    138                 (*iter).second->deactivate();
    139         }
     134    std::map<std::string, NvParticleRenderer*>::iterator iter = _particleRendererMap.find(name);
     135    if (iter != _particleRendererMap.end()) {
     136        (*iter).second->active(false);
     137    }
    140138}
    141139
    142140void NvVectorField::setParticleColor(const std::string& name, const Vector4& color)
    143141{
    144         std::map<std::string, NvParticleRenderer*>::iterator iter = _particleRendererMap.find(name);
    145         if (iter != _particleRendererMap.end())
    146         {
    147                 (*iter).second->setColor(color);
    148         }
     142    std::map<std::string, NvParticleRenderer*>::iterator iter = _particleRendererMap.find(name);
     143    if (iter != _particleRendererMap.end()) {
     144        (*iter).second->setColor(color);
     145    }
    149146}
    150147
    151148void NvVectorField::setParticleColor(const std::string& name, float r, float g, float b, float a)
    152149{
    153         std::map<std::string, NvParticleRenderer*>::iterator iter = _particleRendererMap.find(name);
    154         if (iter != _particleRendererMap.end())
    155         {
    156                 if ((*iter).second) (*iter).second->setColor(Vector4(r,g,b,a));
    157         }
     150    std::map<std::string, NvParticleRenderer*>::iterator iter = _particleRendererMap.find(name);
     151    if (iter != _particleRendererMap.end()) {
     152        if ((*iter).second) (*iter).second->setColor(Vector4(r,g,b,a));
     153    }
    158154}
    159155
    160156void NvVectorField::advect()
    161157{
    162         std::map<std::string, NvParticleRenderer*>::iterator iter;
    163         for (iter = _particleRendererMap.begin(); iter != _particleRendererMap.end(); ++iter)
    164         {
    165                 if ((*iter).second && (*iter).second->isActivated()) (*iter).second->advect();
    166         }
     158    std::map<std::string, NvParticleRenderer*>::iterator iter;
     159    for (iter = _particleRendererMap.begin();
     160         iter != _particleRendererMap.end(); ++iter) {
     161        if ((*iter).second && (*iter).second->active())
     162            (*iter).second->advect();
     163    }
    167164}
    168165
    169166void NvVectorField::render()
    170167{
    171         std::map<std::string, NvParticleRenderer*>::iterator iter;
    172         for (iter = _particleRendererMap.begin(); iter != _particleRendererMap.end(); ++iter)
    173         {
    174                 if ((*iter).second && (*iter).second->isActivated())
    175                 {
    176                         (*iter).second->render();
    177                 }
    178         }
    179 
    180 
    181         if (_deviceVisible) drawDeviceShape();
     168    std::map<std::string, NvParticleRenderer*>::iterator iter;
     169    for (iter = _particleRendererMap.begin();
     170         iter != _particleRendererMap.end(); ++iter) {
     171        if ((*iter).second && (*iter).second->active()) {
     172            (*iter).second->render();
     173        }
     174    }
     175    if (_deviceVisible) {
     176        drawDeviceShape();
     177    }
    182178}
    183179
     
    185181NvVectorField::drawDeviceShape()
    186182{
    187         glPushMatrix();
    188         glEnable(GL_DEPTH_TEST);
    189         glDisable(GL_TEXTURE_2D);
    190         glEnable(GL_BLEND);
    191 
    192         float x0, y0, z0, x1, y1, z1;
    193         std::map<std::string, NvDeviceShape>::iterator iterShape;
     183    glPushMatrix();
     184    glEnable(GL_DEPTH_TEST);
     185    glDisable(GL_TEXTURE_2D);
     186    glEnable(GL_BLEND);
     187
     188    float x0, y0, z0, x1, y1, z1;
     189    std::map<std::string, NvDeviceShape>::iterator iterShape;
    194190   
    195         glPushMatrix();
    196         glTranslatef(_origin.x, _origin.y, _origin.z);
    197         glScaled(_scaleX, _scaleY, _scaleZ);
    198         for (iterShape = _shapeMap.begin(); iterShape != _shapeMap.end(); ++iterShape)
    199         {
    200                 NvDeviceShape& shape = (*iterShape).second;
    201 
    202                 if (!shape.visible) continue;
    203                
    204                
    205                 glColor4d(shape.color.x, shape.color.y, shape.color.z, shape.color.w);
     191    glPushMatrix();
     192    glTranslatef(_origin.x, _origin.y, _origin.z);
     193    glScaled(_scaleX, _scaleY, _scaleZ);
     194    for (iterShape = _shapeMap.begin(); iterShape != _shapeMap.end();
     195         ++iterShape) {
     196        NvDeviceShape& shape = (*iterShape).second;
     197       
     198        if (!shape.visible) continue;
     199       
     200       
     201        glColor4d(shape.color.x, shape.color.y, shape.color.z, shape.color.w);
    206202#if 0
    207                 x0 = _physicalMin.x + (shape.min.x - _physicalMin.x) / _physicalSize.x;
    208                 y0 = _physicalMin.y + (shape.min.y - _physicalMin.y) / _physicalSize.y;
    209                 z0 = _physicalMin.z + (shape.min.z - _physicalMin.z) / _physicalSize.z;
    210                 x1 = _physicalMin.x + (shape.max.x - _physicalMin.x) / _physicalSize.x;
    211                 y1 = _physicalMin.y + (shape.max.y - _physicalMin.y) / _physicalSize.y;
    212                 z1 = _physicalMin.z + (shape.max.z - _physicalMin.z) / _physicalSize.z;
     203        x0 = _physicalMin.x + (shape.min.x - _physicalMin.x) / _physicalSize.x;
     204        y0 = _physicalMin.y + (shape.min.y - _physicalMin.y) / _physicalSize.y;
     205        z0 = _physicalMin.z + (shape.min.z - _physicalMin.z) / _physicalSize.z;
     206        x1 = _physicalMin.x + (shape.max.x - _physicalMin.x) / _physicalSize.x;
     207        y1 = _physicalMin.y + (shape.max.y - _physicalMin.y) / _physicalSize.y;
     208        z1 = _physicalMin.z + (shape.max.z - _physicalMin.z) / _physicalSize.z;
    213209#endif
    214                 x0 = (shape.min.x - _physicalMin.x) / _physicalSize.x;
    215                 y0 = (shape.min.y - _physicalMin.y) / _physicalSize.y;
    216                 z0 = (shape.min.z - _physicalMin.z) / _physicalSize.z;
    217                 x1 = (shape.max.x - _physicalMin.x) / _physicalSize.x;
    218                 y1 = (shape.max.y - _physicalMin.y) / _physicalSize.y;
    219                 z1 = (shape.max.z - _physicalMin.z) / _physicalSize.z;
    220 
    221                 glLineWidth(1.2);
    222                 glBegin(GL_LINE_LOOP);
    223                 {
    224                         glVertex3d(x0, y0, z0);
    225                         glVertex3d(x1, y0, z0);
    226                         glVertex3d(x1, y1, z0);
    227                         glVertex3d(x0, y1, z0);
    228                 }
    229                 glEnd();
    230                 glBegin(GL_LINE_LOOP);
    231                 {
    232                         glVertex3d(x0, y0, z1);
    233                         glVertex3d(x1, y0, z1);
    234                         glVertex3d(x1, y1, z1);
    235                         glVertex3d(x0, y1, z1);
    236                 }
    237                 glEnd();
     210        x0 = (shape.min.x - _physicalMin.x) / _physicalSize.x;
     211        y0 = (shape.min.y - _physicalMin.y) / _physicalSize.y;
     212        z0 = (shape.min.z - _physicalMin.z) / _physicalSize.z;
     213        x1 = (shape.max.x - _physicalMin.x) / _physicalSize.x;
     214        y1 = (shape.max.y - _physicalMin.y) / _physicalSize.y;
     215        z1 = (shape.max.z - _physicalMin.z) / _physicalSize.z;
     216       
     217        glLineWidth(1.2);
     218        glBegin(GL_LINE_LOOP);
     219        {
     220            glVertex3d(x0, y0, z0);
     221            glVertex3d(x1, y0, z0);
     222            glVertex3d(x1, y1, z0);
     223            glVertex3d(x0, y1, z0);
     224        }
     225        glEnd();
     226        glBegin(GL_LINE_LOOP);
     227        {
     228            glVertex3d(x0, y0, z1);
     229            glVertex3d(x1, y0, z1);
     230            glVertex3d(x1, y1, z1);
     231            glVertex3d(x0, y1, z1);
     232        }
     233        glEnd();
     234       
     235        glBegin(GL_LINE_LOOP);
     236        {
     237            glVertex3d(x0, y0, z0);
     238            glVertex3d(x0, y0, z1);
     239            glVertex3d(x0, y1, z1);
     240            glVertex3d(x0, y1, z0);
     241        }
     242        glEnd();
     243       
     244        glBegin(GL_LINE_LOOP);
     245        {
     246            glVertex3d(x1, y0, z0);
     247            glVertex3d(x1, y0, z1);
     248            glVertex3d(x1, y1, z1);
     249            glVertex3d(x1, y1, z0);
     250        }
     251        glEnd();
     252    }
     253    glPopMatrix();
    238254   
    239                 glBegin(GL_LINE_LOOP);
    240                 {
    241                         glVertex3d(x0, y0, z0);
    242                         glVertex3d(x0, y0, z1);
    243                         glVertex3d(x0, y1, z1);
    244                         glVertex3d(x0, y1, z0);
    245                 }
    246                 glEnd();
    247    
    248                 glBegin(GL_LINE_LOOP);
    249                 {
    250                         glVertex3d(x1, y0, z0);
    251                         glVertex3d(x1, y0, z1);
    252                         glVertex3d(x1, y1, z1);
    253                         glVertex3d(x1, y1, z0);
    254                 }
    255                 glEnd();
    256         }
    257         glPopMatrix();
    258 
    259         glPopMatrix();
    260         glDisable(GL_DEPTH_TEST);
    261         glDisable(GL_BLEND);
    262         glEnable(GL_TEXTURE_2D);
     255    glPopMatrix();
     256    glDisable(GL_DEPTH_TEST);
     257    glDisable(GL_BLEND);
     258    glEnable(GL_TEXTURE_2D);
    263259}
    264260
     
    266262NvVectorField::activateDeviceShape(const std::string& name)
    267263{
    268         std::map<std::string, NvDeviceShape>::iterator iter = _shapeMap.find(name);
    269         if (iter != _shapeMap.end())
    270         {
    271                 (*iter).second.visible = true;
    272         }
     264    std::map<std::string, NvDeviceShape>::iterator iter = _shapeMap.find(name);
     265    if (iter != _shapeMap.end()) {
     266        (*iter).second.visible = true;
     267    }
    273268}
    274269
     
    276271NvVectorField::deactivateDeviceShape(const std::string& name)
    277272{
    278         std::map<std::string, NvDeviceShape>::iterator iter = _shapeMap.find(name);
    279         if (iter != _shapeMap.end())
    280         {
    281                 (*iter).second.visible = false;
    282         }
    283 }
    284 
     273    std::map<std::string, NvDeviceShape>::iterator iter = _shapeMap.find(name);
     274    if (iter != _shapeMap.end()) {
     275        (*iter).second.visible = false;
     276    }
     277}
     278
     279
  • trunk/packages/vizservers/nanovis/NvVectorField.h

    r1370 r1431  
    1010class NvDeviceShape {
    1111public :
    12         Vector3 min;
    13         Vector3 max;
    14         Vector4 color;
    15         bool visible;
     12    Vector3 min;
     13    Vector3 max;
     14    Vector4 color;
     15    bool visible;
    1616public :
    17         NvDeviceShape()
     17    NvDeviceShape()
    1818        : visible(true)
    19         {
    20         }
     19    {
     20    }
    2121};
    2222
    2323class NvVectorField {
    24         unsigned int _vectorFieldID;
    25         Volume* _volPtr;
    26         std::map<std::string, NvParticleRenderer*> _particleRendererMap;
     24    unsigned int _vectorFieldID;
     25    Volume* _volPtr;
     26    std::map<std::string, NvParticleRenderer*> _particleRendererMap;
     27   
     28    std::map<std::string, NvDeviceShape> _shapeMap;
     29   
     30    /**
     31     * @brief Specify the visibility
     32     */
     33    bool _activated;
     34   
     35    Vector3 _origin;
     36    Vector3 _physicalMin;
     37    Vector3 _physicalSize;
     38    float _scaleX;
     39    float _scaleY;
     40    float _scaleZ;
     41    float _max;
     42   
     43    bool _deviceVisible;
     44public :
     45    NvVectorField();
     46    ~NvVectorField();
     47   
     48    void setVectorField(Volume* vol, const Vector3& ori, float scaleX, float scaleY, float scaleZ, float max);
     49   
     50    bool active(void) {
     51        return _activated;
     52    }
     53    void active(bool state) {
     54        _activated = state;
     55    }
     56    void activateDeviceShape(void) {
     57        _deviceVisible = true;
     58    }
     59    void deactivateDeviceShape(void) {
     60        _deviceVisible = false;
     61    }
    2762
    28         std::map<std::string, NvDeviceShape> _shapeMap;
    29 
    30         /**
    31          * @brief Specify the visibility
    32          */
    33         bool _activated;
    34 
    35         Vector3 _origin;
    36         Vector3 _physicalMin;
    37         Vector3 _physicalSize;
    38         float _scaleX;
    39         float _scaleY;
    40         float _scaleZ;
    41         float _max;
    42        
    43         bool _deviceVisible;
    44 public :
    45         NvVectorField();
    46         ~NvVectorField();
    47 
    48         void setVectorField(Volume* vol, const Vector3& ori, float scaleX, float scaleY, float scaleZ, float max);
    49 
    50         void activate();
    51         void deactivate();
    52         bool isActivated() const;
    53 
    54         /////////////////////////////
    55         // DEVICE
    56         void addDeviceShape(const std::string& name, const NvDeviceShape& shape);
    57         void removeDeviceShape(const std::string& name);
    58         void activateDeviceShape();
    59         void deactivateDeviceShape();
    60         void activateDeviceShape(const std::string& name);
    61         void deactivateDeviceShape(const std::string& name);
    62 
    63         void initialize();
    64         void reset();
    65 
    66         void addPlane(const std::string& name);
    67         void removePlane(const std::string& name);
    68 
    69         void advect();
    70         void render();
    71 
    72         void drawDeviceShape();
    73         void activatePlane(const std::string& name);
    74         void deactivatePlane(const std::string& name);
    75         void setPlaneAxis(const std::string& name, int axis);
    76         void setPlanePos(const std::string& name, float pos);
    77         void setParticleColor(const std::string& name, float r, float g, float b, float a);
    78         void setParticleColor(const std::string& name, const Vector4& color);
     63    /////////////////////////////
     64    // DEVICE
     65    void addDeviceShape(const std::string& name, const NvDeviceShape& shape);
     66    void removeDeviceShape(const std::string& name);
     67    void activateDeviceShape(const std::string& name);
     68    void deactivateDeviceShape(const std::string& name);
     69   
     70    void initialize();
     71    void reset();
     72   
     73    void addPlane(const std::string& name);
     74    void removePlane(const std::string& name);
     75   
     76    void advect();
     77    void render();
     78   
     79    void drawDeviceShape();
     80    void activatePlane(const std::string& name);
     81    void deactivatePlane(const std::string& name);
     82    void setPlaneAxis(const std::string& name, int axis);
     83    void setPlanePos(const std::string& name, float pos);
     84    void setParticleColor(const std::string& name, float r, float g, float b, float a);
     85    void setParticleColor(const std::string& name, const Vector4& color);
    7986};
    8087
    81 inline void NvVectorField::activate()
    82 {
    83         _activated = true;
    84 }
    85 
    86 inline void NvVectorField::deactivate()
    87 {
    88         _activated = false;
    89 }
    90 
    91 inline bool NvVectorField::isActivated() const
    92 {
    93         return _activated;
    94 }
    95 
    96 inline void NvVectorField::activateDeviceShape()
    97 {
    98         _deviceVisible = true;
    99 }
    100 
    101 inline void NvVectorField::deactivateDeviceShape()
    102 {
    103         _deviceVisible = false;
    104 }
    105 
  • trunk/packages/vizservers/nanovis/Unirect.cpp

    r1429 r1431  
    520520                        _zValueMax = vz;
    521521                    }
    522                     if (nindex >= (npts*3)) {
    523                         fprintf(stderr, "nindex=%d, npts=%d, z=%d, y=%d, x=%d\n",
    524                                 nindex, npts, iz, iy, ix);
    525                     }
    526522                    _values[nindex] = vx;
    527523                    _values[nindex+1] = vy;
  • trunk/packages/vizservers/nanovis/VolumeRenderer.cpp

    r1429 r1431  
    7777
    7878
    79 int VolumeRenderer::add_volume(Volume* _vol, TransferFunction* _tf){
    80 
    81   int ret = n_volumes;
    82 
     79int
     80VolumeRenderer::add_volume(Volume* _vol, TransferFunction* _tf)
     81{
    8382  volume.push_back(_vol);
    8483  tf.push_back(_tf);
    8584
     85  int ret = n_volumes;
    8686  n_volumes++;
    87 
    8887  return ret;
    8988}
  • trunk/packages/vizservers/nanovis/config.h

    r1429 r1431  
    1717#define __CONFIG_H__
    1818
    19 #define NV40      //Uncomment if using 6 series card. By default we assume older card the 5xxx series
    20 #define XINETD  //enable render server
    21 //#define EVENTLOG  //enable event logging
    22 //#define DO_RLE  //do run length compression
     19#define NV40                            /* Uncomment if using 6 series
     20                                         * card. By default we assume older
     21                                         * card the 5xxx series */
     22#define XINETD                          /* Enable render server. */
     23//#define EVENTLOG                      /* Enable event logging. */
     24//#define DO_RLE                        /* Do run length compression. */
    2325
    2426/*
  • trunk/packages/vizservers/nanovis/nanovis.cpp

    r1429 r1431  
    114114PlaneRenderer* NanoVis::plane_render = 0;
    115115Texture2D* NanoVis::plane[10];
    116 NvColorTableRenderer* NanoVis::color_table_renderer = 0;
     116NvColorTableRenderer* NanoVis::color_table_renderer = NULL;
    117117
    118118#ifndef NEW_FLOW_ENGINE
    119 NvParticleRenderer* NanoVis::flowVisRenderer = 0;
     119NvParticleRenderer* NanoVis::flowVisRenderer = NULL;
    120120#else
    121 NvFlowVisRenderer* NanoVis::flowVisRenderer = 0;
    122 #endif
    123 
    124 graphics::RenderContext* NanoVis::renderContext = 0;
    125 NvLIC* NanoVis::licRenderer = 0;
     121NvFlowVisRenderer* NanoVis::flowVisRenderer = NULL;
     122#endif
     123
     124graphics::RenderContext* NanoVis::renderContext = NULL;
     125NvLIC* NanoVis::licRenderer = NULL;
    126126R2Fonts* NanoVis::fonts;
    127127
     
    146146
    147147unsigned char* NanoVis::screen_buffer = NULL;
     148
     149unsigned int NanoVis::flags = 0;
     150Tcl_HashTable NanoVis::flowTable;
     151float NanoVis::magMin;
     152float NanoVis::magMax;
     153float NanoVis::xMin;
     154float NanoVis::xMax;
     155float NanoVis::yMin;
     156float NanoVis::yMax;
     157float NanoVis::zMin;
     158float NanoVis::zMax;
     159float NanoVis::wMin;
     160float NanoVis::wMax;
     161float NanoVis::xOrigin;
     162float NanoVis::yOrigin;
     163float NanoVis::zOrigin;
    148164
    149165/* FIXME: This variable is always true. */
     
    256272}
    257273
     274
     275void
     276NanoVis::EventuallyRedraw(unsigned int flag)
     277{
     278    if (flag) {
     279        flags |= flag;
     280    }
     281    if ((flags & REDRAW_PENDING) == 0) {
     282        glutPostRedisplay();
     283        flags |= REDRAW_PENDING;
     284    }
     285}
    258286
    259287#if KEEPSTATS
     
    425453    int result;
    426454
    427 #ifdef notdef
     455#ifndef notdef
    428456    if (NanoVis::debug_flag) {
    429457        fprintf(stderr, "in ExecuteCommand(%s)\n", Tcl_DStringValue(dsPtr));
     
    433461    start = CVT2SECS(tv);
    434462
    435 #ifdef notdef
     463    Trace("in ExecuteCommand(%s)\n", Tcl_DStringValue(dsPtr));
     464#ifndef notdef
    436465    if (NanoVis::logfile != NULL) {
    437466        fprintf(NanoVis::logfile, "%s", Tcl_DStringValue(dsPtr));
     
    451480    stats.cmdTime += finish - start;
    452481    stats.nCommands++;
    453 #ifdef notdef
     482#ifndef notdef
    454483    if (NanoVis::debug_flag) {
    455484        fprintf(stderr, "leaving ExecuteCommand status=%d\n", result);
     
    651680NanoVis::resize_offscreen_buffer(int w, int h)
    652681{
     682    Trace("in resize_offscreen_buffer(%d, %d)\n", w, h);
    653683    if ((w == win_width) && (h == win_height)) {
    654684        return;
     
    665695    }
    666696    //fprintf(stderr, "screen_buffer size: %d\n", sizeof(screen_buffer));
    667     if (debug_flag) {
    668         fprintf(stderr, "screen_buffer size: %d %d\n", w, h);
    669     }
     697    Trace("screen_buffer size: %d %d\n", w, h);
    670698   
    671699    if (screen_buffer != NULL) {
     
    16401668        fprintf(stderr, "in display\n");
    16411669    }
    1642 
    1643     if (FlowCmd::flags & FlowCmd::MAP_PENDING) {
    1644         FlowCmd::MapFlows();
     1670    if (flags & MAP_FLOWS) {
     1671        xMin = yMin = zMin = wMin = magMin = FLT_MAX;
     1672        xMax = yMax = zMax = wMax = magMax = -FLT_MAX;
     1673    }
     1674    if (flags & MAP_FLOWS) {
     1675        MapFlows();
    16451676    }
    16461677    //assert(glGetError()==0);
     
    16671698
    16681699        //camera setting activated
    1669         cam->activate();
     1700        cam->initialize();
    16701701
    16711702        //set up the orientation of items in the scene.
     
    17101741            grid->render();
    17111742        }
    1712         if ((licRenderer != NULL) && (licRenderer->isActivated())) {
     1743        if ((licRenderer != NULL) && (licRenderer->active())) {
    17131744            licRenderer->render();
    1714             /*FlowCmd::SetupFlows();*/
    17151745        }
    17161746#ifdef notdef
    1717         if ((flowVisRenderer != NULL) && (flowVisRenderer->isActivated())) {
     1747        if ((flowVisRenderer != NULL) && (flowVisRenderer->active())) {
    17181748            flowVisRenderer->render();
    17191749        }
    17201750#endif
    1721         if (FlowCmd::flags & FlowCmd::REDRAW_PENDING) {
    1722             FlowCmd::RenderFlows();
     1751        if (flowTable.numEntries > 0) {
     1752            RenderFlows();
    17231753        }
    17241754
     
    19011931                {
    19021932                        printf("flowvis active\n");
    1903                         NanoVis::flowVisRenderer->activate();
    1904                         NanoVis::licRenderer->activate();
     1933                        NanoVis::flowVisRenderer->active(true);
     1934                        NanoVis::licRenderer->active(true);
    19051935                }
    19061936                break;
     
    19081938                {
    19091939                        printf("flowvis deactived\n");
    1910                         NanoVis::flowVisRenderer->deactivate();
    1911                         NanoVis::licRenderer->deactivate();
     1940                        NanoVis::flowVisRenderer->active(false);
     1941                        NanoVis::licRenderer->active(false);
    19121942                }
    19131943                break;
     
    20482078
    20492079    if ((NanoVis::licRenderer != NULL) &&
    2050         (NanoVis::licRenderer->isActivated())) {
     2080        (NanoVis::licRenderer->active())) {
    20512081        NanoVis::licRenderer->convolve();
    20522082    }
    20532083
    20542084    if ((NanoVis::flowVisRenderer != NULL) &&
    2055         (NanoVis::flowVisRenderer->isActivated())) {
     2085        (NanoVis::flowVisRenderer->active())) {
    20562086        NanoVis::flowVisRenderer->advect();
    20572087    }
     
    21342164
    21352165        string = Tcl_GetVar(interp, "errorInfo", TCL_GLOBAL_ONLY);
     2166        Trace("errorInfo=(%s)\n", string);
    21362167        nBytes = strlen(string);
    21372168        struct iovec iov[3];
     
    21772208        bmp_write_to_file(1, "/tmp");
    21782209    } else {
    2179         NanoVis::ppm_write("nv>image -type image -bytes");
     2210        NanoVis::ppm_write("\nnv>image -type image -bytes");
    21802211    }
    21812212#endif
     
    24062437    }
    24072438
    2408     //cam->activate();
     2439    //cam->initialize();
    24092440
    24102441    heightmap->render_topview(renderContext, width, height);
  • trunk/packages/vizservers/nanovis/nanovis.h

    r1429 r1431  
    102102
    103103class NvLIC;
     104class FlowCmd;
     105class FlowIterator;
    104106
    105107class NanoVis {
     
    200202        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, final_fbo);
    201203    }
     204
     205    static unsigned int flags;
     206    static Tcl_HashTable flowTable;
     207    static float magMin, magMax;
     208    static float xMin, xMax, yMin, yMax, zMin, zMax, wMin, wMax;
     209    static float xOrigin, yOrigin, zOrigin;
     210
     211    static FlowCmd *FirstFlow(FlowIterator *iterPtr);
     212    static FlowCmd *NextFlow(FlowIterator *iterPtr);
     213    static void InitFlows(void);
     214    static int GetFlow(Tcl_Interp *interp, Tcl_Obj *objPtr,
     215                       FlowCmd **flowPtrPtr);
     216    static int CreateFlow(Tcl_Interp *interp, Tcl_Obj *objPtr);
     217    static void DeleteFlows(Tcl_Interp *interp);
     218    static bool MapFlows(void);
     219    static void RenderFlows(void);
     220    static void ResetFlows(void);
     221    static bool UpdateFlows(void);
     222    static void AdvectFlows(void);
     223    enum NanoVisFlags {
     224        REDRAW_PENDING=(1<<0),
     225        MAP_FLOWS=(1<<1),
     226        MAP_VOLUMES=(1<<2),
     227        MAP_HEIGHTMAPS=(1<<3),
     228    };
     229    static void EventuallyRedraw(unsigned int flag = 0);
    202230};
    203231
Note: See TracChangeset for help on using the changeset viewer.