Ignore:
Timestamp:
Mar 24, 2013, 10:23:25 PM (12 years ago)
Author:
ldelgass
Message:

Refactor and cleanups in nanovis, mainly to switch to using STL hash tables
(TR1 required) instead of Tcl hash tables, split out Flow particles and boxes
to separate implementation files. The goal is to achieve better separation of
Tcl command parsing and the core graphics rendering objects and code.

File:
1 edited

Legend:

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

    r3562 r3567  
    266266        }
    267267    }
    268     HeightMap* hmPtr;
    269     hmPtr = new HeightMap();
    270     hmPtr->setHeight(xMin, yMin, xMax, yMax, xNum, yNum, heights);
    271     hmPtr->transferFunction(NanoVis::getTransfunc("default"));
    272     hmPtr->setVisible(true);
    273     hmPtr->setLineContourVisible(true);
     268    HeightMap *heightMap = new HeightMap();
     269    heightMap->setHeight(xMin, yMin, xMax, yMax, xNum, yNum, heights);
     270    heightMap->transferFunction(NanoVis::getTransferFunction("default"));
     271    heightMap->setVisible(true);
     272    heightMap->setLineContourVisible(true);
    274273    delete [] heights;
    275     return hmPtr;
     274    return heightMap;
    276275}
    277276
     
    279278GetHeightMapFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr, HeightMap **hmPtrPtr)
    280279{
    281     const char *string;
    282     string = Tcl_GetString(objPtr);
    283 
    284     Tcl_HashEntry *hPtr;
    285     hPtr = Tcl_FindHashEntry(&NanoVis::heightmapTable, string);
    286     if (hPtr == NULL) {
    287         if (interp != NULL) {
    288             Tcl_AppendResult(interp, "can't find a heightmap named \"",
     280    const char *string = Tcl_GetString(objPtr);
     281
     282    NanoVis::HeightMapHashmap::iterator itr = NanoVis::heightMapTable.find(string);
     283    if (itr == NanoVis::heightMapTable.end()) {
     284        if (interp != NULL) {
     285            Tcl_AppendResult(interp, "can't find a heightmap named \"",
    289286                         string, "\"", (char*)NULL);
    290         }
    291         return TCL_ERROR;
    292     }
    293     *hmPtrPtr = (HeightMap *)Tcl_GetHashValue(hPtr);
     287        }
     288        return TCL_ERROR;
     289    }
     290    *hmPtrPtr = itr->second;
    294291    return TCL_OK;
    295292}
     
    308305GetVolumeFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr, Volume **volPtrPtr)
    309306{
    310     const char *string;
    311     string = Tcl_GetString(objPtr);
    312 
    313     Tcl_HashEntry *hPtr;
    314     hPtr = Tcl_FindHashEntry(&NanoVis::volumeTable, string);
    315     if (hPtr == NULL) {
    316         if (interp != NULL) {
    317             Tcl_AppendResult(interp, "can't find a volume named \"",
     307    const char *string = Tcl_GetString(objPtr);
     308
     309    NanoVis::VolumeHashmap::iterator itr = NanoVis::volumeTable.find(string);
     310    if (itr == NanoVis::volumeTable.end()) {
     311        if (interp != NULL) {
     312            Tcl_AppendResult(interp, "can't find a volume named \"",
    318313                         string, "\"", (char*)NULL);
    319         }
    320         return TCL_ERROR;
    321     }
    322     *volPtrPtr = (Volume *)Tcl_GetHashValue(hPtr);
     314        }
     315        return TCL_ERROR;
     316    }
     317    *volPtrPtr = itr->second;
    323318    return TCL_OK;
    324319}
     
    338333{
    339334    if (objc == 0) {
    340         // No arguments. Get all volumes.
    341         Tcl_HashSearch iter;
    342         Tcl_HashEntry *hPtr;
    343         for (hPtr = Tcl_FirstHashEntry(&NanoVis::volumeTable, &iter);
    344              hPtr != NULL; hPtr = Tcl_NextHashEntry(&iter)) {
    345             Volume *volPtr;
    346             volPtr = (Volume *)Tcl_GetHashValue(hPtr);
    347             vectorPtr->push_back(volPtr);
    348         }
     335        // No arguments. Get all volumes.
     336        NanoVis::VolumeHashmap::iterator itr;
     337        for (itr = NanoVis::volumeTable.begin();
     338             itr != NanoVis::volumeTable.end(); ++itr) {
     339            vectorPtr->push_back(itr->second);
     340        }
    349341    } else {
    350         // Get the volumes associated with the given index arguments.
     342        // Get the volumes associated with the given index arguments.
    351343        for (int n = 0; n < objc; n++) {
    352             Volume *volPtr;
    353 
    354             if (GetVolumeFromObj(interp, objv[n], &volPtr) != TCL_OK) {
     344            Volume *volume;
     345            if (GetVolumeFromObj(interp, objv[n], &volume) != TCL_OK) {
    355346                return TCL_ERROR;
    356347            }
    357             vectorPtr->push_back(volPtr);
     348            vectorPtr->push_back(volume);
    358349        }
    359350    }
     
    375366{
    376367    if (objc == 0) {
    377         // No arguments. Get all heightmaps.
    378         Tcl_HashSearch iter;
    379         Tcl_HashEntry *hPtr;
    380         for (hPtr = Tcl_FirstHashEntry(&NanoVis::heightmapTable, &iter);
    381              hPtr != NULL; hPtr = Tcl_NextHashEntry(&iter)) {
    382             HeightMap *hmPtr;
    383             hmPtr = (HeightMap *)Tcl_GetHashValue(hPtr);
    384             vectorPtr->push_back(hmPtr);
    385         }
     368        // No arguments. Get all heightmaps.
     369        NanoVis::HeightMapHashmap::iterator itr;
     370        for (itr = NanoVis::heightMapTable.begin();
     371             itr != NanoVis::heightMapTable.end(); ++itr) {
     372            vectorPtr->push_back(itr->second);
     373        }
    386374    } else {
    387375        for (int n = 0; n < objc; n++) {
    388             HeightMap *hmPtr;
    389 
    390             if (GetHeightMapFromObj(interp, objv[n], &hmPtr) != TCL_OK) {
     376            HeightMap *heightMap;
     377            if (GetHeightMapFromObj(interp, objv[n], &heightMap) != TCL_OK) {
    391378                return TCL_ERROR;
    392379            }
    393             vectorPtr->push_back(hmPtr);
     380            vectorPtr->push_back(heightMap);
    394381        }
    395382    }
     
    517504    }
    518505    if (NanoVis::recfile != NULL) {
    519         ssize_t nWritten;
     506        ssize_t nWritten;
    520507
    521508        nWritten = fwrite(buf.bytes(), sizeof(char), buf.size(),
    522                           NanoVis::recfile);
    523         assert(nWritten == (ssize_t)buf.size());
     509                          NanoVis::recfile);
     510        assert(nWritten == (ssize_t)buf.size());
    524511        fflush(NanoVis::recfile);
    525512    }
     
    527514    TRACE("Checking header[%.13s]", buf.bytes());
    528515    if (strncmp (buf.bytes(), "@@RP-ENC:", 9) == 0) {
    529         /* There's a header on the buffer, use it to decode the data. */
    530         if (!Rappture::encoding::decode(err, buf, RPENC_HDR)) {
    531             Tcl_AppendResult(interp, err.remark(), (char*)NULL);
    532             return TCL_ERROR;
    533         }
     516        /* There's a header on the buffer, use it to decode the data. */
     517        if (!Rappture::encoding::decode(err, buf, RPENC_HDR)) {
     518            Tcl_AppendResult(interp, err.remark(), (char*)NULL);
     519            return TCL_ERROR;
     520        }
    534521    } else if (Rappture::encoding::isBase64(buf.bytes(), buf.size())) {
    535         /* No header, but it's base64 encoded.  It's likely that it's both
    536         * base64 encoded and compressed. */
    537         if (!Rappture::encoding::decode(err, buf, RPENC_B64 | RPENC_Z)) {
    538             Tcl_AppendResult(interp, err.remark(), (char*)NULL);
    539             return TCL_ERROR;
    540         }
     522        /* No header, but it's base64 encoded.  It's likely that it's both
     523        * base64 encoded and compressed. */
     524        if (!Rappture::encoding::decode(err, buf, RPENC_B64 | RPENC_Z)) {
     525            Tcl_AppendResult(interp, err.remark(), (char*)NULL);
     526            return TCL_ERROR;
     527        }
    541528    }
    542529    return TCL_OK;
     
    644631static int
    645632CameraCmd(ClientData clientData, Tcl_Interp *interp, int objc,
    646           Tcl_Obj *const *objv)
     633          Tcl_Obj *const *objv)
    647634{
    648635    Tcl_ObjCmdProc *proc;
     
    658645static int
    659646SnapshotCmd(ClientData clientData, Tcl_Interp *interp, int objc,
    660             Tcl_Obj *const *objv)
     647            Tcl_Obj *const *objv)
    661648{
    662649    int w, h;
     
    787774 *      "render_start" is written into the stats file.  Afterwards, it
    788775 *      is "render_info".
    789  *     
     776 *       
    790777 *         clientinfo list
    791778 */
     
    803790
    804791    if (objc != 2) {
    805         Tcl_AppendResult(interp, "wrong # of arguments: should be \"",
     792        Tcl_AppendResult(interp, "wrong # of arguments: should be \"",
    806793                Tcl_GetString(objv[0]), " list\"", (char *)NULL);
    807         return TCL_ERROR;
     794        return TCL_ERROR;
    808795    }
    809796#ifdef KEEPSTATS
     
    814801    f = NanoVis::getStatsFile(objv[1]);
    815802    if (f < 0) {
    816         Tcl_AppendResult(interp, "can't open stats file: ",
     803        Tcl_AppendResult(interp, "can't open stats file: ",
    817804                         Tcl_PosixError(interp), (char *)NULL);
    818         return TCL_ERROR;
     805        return TCL_ERROR;
    819806    }
    820807#endif
     
    858845    /* Client arguments. */
    859846    if (Tcl_ListObjGetElements(interp, objv[1], &numItems, &items) != TCL_OK) {
    860         return TCL_ERROR;
     847        return TCL_ERROR;
    861848    }
    862849    for (i = 0; i < numItems; i++) {
     
    891878static int
    892879LegendCmd(ClientData clientData, Tcl_Interp *interp, int objc,
    893           Tcl_Obj *const *objv)
     880          Tcl_Obj *const *objv)
    894881{
    895882    if (objc != 4) {
     
    901888    const char *name;
    902889    name = Tcl_GetString(objv[1]);
    903     TransferFunction *tf;
    904     tf = NanoVis::getTransfunc(name);
     890    TransferFunction *tf = NanoVis::getTransferFunction(name);
    905891    if (tf == NULL) {
    906892        Tcl_AppendResult(interp, "unknown transfer function \"", name, "\"",
     
    11821168    }
    11831169    TRACE("parsing volume data identifier");
    1184     Tcl_HashSearch iter;
    1185     Tcl_HashEntry *hPtr;
    1186     for (hPtr = Tcl_FirstHashEntry(&NanoVis::volumeTable, &iter); hPtr != NULL;
    1187          hPtr = Tcl_NextHashEntry(&iter)) {
    1188         Volume *volPtr;
    1189         volPtr = (Volume *)Tcl_GetHashValue(hPtr);
    1190         NanoVis::volRenderer->addAnimatedVolume(volPtr);
     1170    NanoVis::VolumeHashmap::iterator itr;
     1171    for (itr = NanoVis::volumeTable.begin();
     1172         itr != NanoVis::volumeTable.end(); ++itr) {
     1173        NanoVis::volRenderer->addAnimatedVolume(itr->second);
    11911174    }
    11921175    return TCL_OK;
     
    12101193
    12111194    proc = Rappture::GetOpFromObj(interp, nVolumeAnimationOps,
    1212                 volumeAnimationOps, Rappture::CMDSPEC_ARG2, objc, objv, 0);
     1195                volumeAnimationOps, Rappture::CMDSPEC_ARG2, objc, objv, 0);
    12131196    if (proc == NULL) {
    12141197        return TCL_ERROR;
     
    12271210        return TCL_ERROR;
    12281211    }
    1229     const char *tag;
    1230     tag = Tcl_GetString(objv[4]);
     1212    const char *tag = Tcl_GetString(objv[4]);
    12311213    Rappture::Buffer buf;
    12321214    if (GetDataStream(interp, buf, nbytes) != TCL_OK) {
     
    12411223    TRACE("Checking header[%.20s]", bytes);
    12421224
    1243     Volume *volPtr = NULL;
     1225    Volume *volume = NULL;
    12441226
    12451227    if ((nBytes > 5) && (strncmp(bytes, "<HDR>", 5) == 0)) {
     
    12491231        //vol = NvZincBlendeReconstructor::getInstance()->loadFromStream(fdata);
    12501232
    1251         volPtr = NvZincBlendeReconstructor::getInstance()->loadFromMemory((void*) buf.bytes());
    1252         if (volPtr == NULL) {
     1233        volume = NvZincBlendeReconstructor::getInstance()->loadFromMemory((void*) buf.bytes());
     1234        if (volume == NULL) {
    12531235            Tcl_AppendResult(interp, "can't get volume instance", (char *)NULL);
    12541236            return TCL_ERROR;
     
    12561238        TRACE("finish loading");
    12571239
    1258         Vector3f scale = volPtr->getPhysicalScaling();
     1240        Vector3f scale = volume->getPhysicalScaling();
    12591241        Vector3f loc(scale);
    12601242        loc *= -0.5;
    1261         volPtr->location(loc);
    1262 
    1263         int isNew;
    1264         Tcl_HashEntry *hPtr;
    1265         hPtr = Tcl_CreateHashEntry(&NanoVis::volumeTable, tag, &isNew);
    1266         if (!isNew) {
     1243        volume->location(loc);
     1244
     1245        NanoVis::VolumeHashmap::iterator itr = NanoVis::volumeTable.find(tag);
     1246        if (itr != NanoVis::volumeTable.end()) {
    12671247            Tcl_AppendResult(interp, "volume \"", tag, "\" already exists.",
    1268                              (char *)NULL);
     1248                             (char *)NULL);
    12691249            return TCL_ERROR;
    1270         }
    1271         Tcl_SetHashValue(hPtr, volPtr);
    1272         volPtr->name(Tcl_GetHashKey(&NanoVis::volumeTable, hPtr));
     1250        }
     1251        NanoVis::volumeTable[tag] = volume;
     1252        volume->name(tag);
    12731253    } else if ((nBytes > 14) && (strncmp(bytes, "# vtk DataFile", 14) == 0)) {
    12741254        TRACE("VTK loading...");
     
    12761256        fdata.write(bytes, nBytes);
    12771257        if (nBytes <= 0) {
    1278             ERROR("data buffer is empty");
    1279             abort();
     1258            ERROR("data buffer is empty");
     1259            abort();
    12801260        }
    12811261        Rappture::Outcome context;
    1282         volPtr = load_vtk_volume_stream(context, tag, fdata);
    1283         if (volPtr == NULL) {
     1262        volume = load_vtk_volume_stream(context, tag, fdata);
     1263        if (volume == NULL) {
    12841264            Tcl_AppendResult(interp, context.remark(), (char*)NULL);
    12851265            return TCL_ERROR;
     
    12991279        }
    13001280        Rappture::Outcome context;
    1301         volPtr = load_dx_volume_stream(context, tag, fdata);
    1302         if (volPtr == NULL) {
     1281        volume = load_dx_volume_stream(context, tag, fdata);
     1282        if (volume == NULL) {
    13031283            Tcl_AppendResult(interp, context.remark(), (char*)NULL);
    13041284            return TCL_ERROR;
     
    13061286    }
    13071287
    1308     if (volPtr != NULL) {
    1309         volPtr->disableCutplane(0);
    1310         volPtr->disableCutplane(1);
    1311         volPtr->disableCutplane(2);
    1312         volPtr->transferFunction(NanoVis::getTransfunc("default"));
    1313         volPtr->visible(true);
     1288    if (volume != NULL) {
     1289        volume->disableCutplane(0);
     1290        volume->disableCutplane(1);
     1291        volume->disableCutplane(2);
     1292        volume->transferFunction(NanoVis::getTransferFunction("default"));
     1293        volume->visible(true);
    13141294
    13151295        char info[1024];
    1316         ssize_t nWritten;
     1296        ssize_t nWritten;
    13171297
    13181298        if (Volume::updatePending) {
     
    13221302        // FIXME: strlen(info) is the return value of sprintf
    13231303        sprintf(info, "nv>data tag %s min %g max %g vmin %g vmax %g\n", tag,
    1324                 volPtr->wAxis.min(), volPtr->wAxis.max(),
     1304                volume->wAxis.min(), volume->wAxis.max(),
    13251305                Volume::valueMin, Volume::valueMax);
    13261306        nWritten  = write(1, info, strlen(info));
    1327         assert(nWritten == (ssize_t)strlen(info));
     1307        assert(nWritten == (ssize_t)strlen(info));
    13281308    }
    13291309    return TCL_OK;
     
    13441324    std::vector<Volume *>::iterator iter;
    13451325    for (iter = ivol.begin(); iter != ivol.end(); iter++) {
    1346         (*iter)->dataEnabled(state);
     1326        (*iter)->dataEnabled(state);
    13471327    }
    13481328    return TCL_OK;
     
    13711351static int
    13721352VolumeDeleteOp(ClientData clientData, Tcl_Interp *interp, int objc,
    1373                Tcl_Obj *const *objv)
    1374 {
    1375     int i;
    1376 
    1377     for (i = 2; i < objc; i++) {
    1378         Volume *volPtr;
    1379 
    1380         if (GetVolumeFromObj(interp, objv[i], &volPtr) != TCL_OK) {
    1381             return TCL_ERROR;
    1382         }
    1383         NanoVis::removeVolume(volPtr);
     1353               Tcl_Obj *const *objv)
     1354{
     1355    for (int i = 2; i < objc; i++) {
     1356        Volume *volume;
     1357        if (GetVolumeFromObj(interp, objv[i], &volume) != TCL_OK) {
     1358            return TCL_ERROR;
     1359        }
     1360        NanoVis::removeVolume(volume);
    13841361    }
    13851362    NanoVis::eventuallyRedraw();
     
    13891366static int
    13901367VolumeExistsOp(ClientData clientData, Tcl_Interp *interp, int objc,
    1391                Tcl_Obj *const *objv)
     1368               Tcl_Obj *const *objv)
    13921369{
    13931370    bool value;
    1394     Volume *volPtr;
     1371    Volume *volume;
    13951372
    13961373    value = false;
    1397     if (GetVolumeFromObj(NULL, objv[2], &volPtr) == TCL_OK) {
    1398         value = true;
     1374    if (GetVolumeFromObj(NULL, objv[2], &volume) == TCL_OK) {
     1375        value = true;
    13991376    }
    14001377    Tcl_SetBooleanObj(Tcl_GetObjResult(interp), (int)value);
     
    14041381static int
    14051382VolumeNamesOp(ClientData clientData, Tcl_Interp *interp, int objc,
    1406               Tcl_Obj *const *objv)
     1383              Tcl_Obj *const *objv)
    14071384{
    14081385    Tcl_Obj *listObjPtr;
    14091386    listObjPtr = Tcl_NewListObj(0, (Tcl_Obj **) NULL);
    1410     Tcl_HashEntry *hPtr;
    1411     Tcl_HashSearch iter;
    1412     for (hPtr = Tcl_FirstHashEntry(&NanoVis::volumeTable, &iter); hPtr != NULL;
    1413          hPtr = Tcl_NextHashEntry(&iter)) {
    1414         Volume *volPtr;
    1415         volPtr = (Volume *)Tcl_GetHashValue(hPtr);
    1416         Tcl_Obj *objPtr;
    1417         objPtr = Tcl_NewStringObj(volPtr->name(), -1);
    1418         Tcl_ListObjAppendElement(interp, listObjPtr, objPtr);
     1387    NanoVis::VolumeHashmap::iterator itr;
     1388    for (itr = NanoVis::volumeTable.begin();
     1389         itr != NanoVis::volumeTable.end(); ++itr) {
     1390        Tcl_Obj *objPtr = Tcl_NewStringObj(itr->second->name(), -1);
     1391        Tcl_ListObjAppendElement(interp, listObjPtr, objPtr);
    14191392    }
    14201393    Tcl_SetObjResult(interp, listObjPtr);
     
    14551428    std::vector<Volume *>::iterator iter;
    14561429    for (iter = ivol.begin(); iter != ivol.end(); iter++) {
    1457         (*iter)->outline(state);
     1430        (*iter)->outline(state);
    14581431    }
    14591432    return TCL_OK;
     
    16331606                         Tcl_Obj *const *objv)
    16341607{
    1635     TransferFunction *tfPtr;
    16361608    const char *name = Tcl_GetString(objv[3]);
    1637     tfPtr = NanoVis::getTransfunc(name);
    1638     if (tfPtr == NULL) {
     1609    TransferFunction *tf = NanoVis::getTransferFunction(name);
     1610    if (tf == NULL) {
    16391611        Tcl_AppendResult(interp, "transfer function \"", name,
    16401612                         "\" is not defined", (char*)NULL);
     
    16471619    std::vector<Volume *>::iterator iter;
    16481620    for (iter = ivol.begin(); iter != ivol.end(); iter++) {
    1649         TRACE("setting %s with transfer function %s", (*iter)->name(),
    1650                tfPtr->name());
    1651         (*iter)->transferFunction(tfPtr);
     1621        TRACE("setting %s with transfer function %s", (*iter)->name(),
     1622               tf->name());
     1623        (*iter)->transferFunction(tf);
    16521624#ifdef USE_POINTSET_RENDERER
    16531625        // TBD..
    16541626        if ((*iter)->pointsetIndex != -1) {
    1655             NanoVis::pointSet[(*iter)->pointsetIndex]->updateColor(tfPtr->getData(), 256);
     1627            NanoVis::pointSet[(*iter)->pointsetIndex]->updateColor(tf->getData(), 256);
    16561628        }
    16571629#endif
     
    17001672    std::vector<Volume *>::iterator iter;
    17011673    for (iter = ivol.begin(); iter != ivol.end(); iter++) {
    1702         (*iter)->visible(state);
    1703     }
    1704     return TCL_OK;
    1705 }
    1706 
    1707 static int
    1708 VolumeTestOp(ClientData clientData, Tcl_Interp *interp, int objc,
    1709              Tcl_Obj *const *objv)
    1710 {
    1711     // Find the first volume in the vector.
    1712     Tcl_HashEntry *hPtr;
    1713     Tcl_HashSearch iter;
    1714     hPtr = Tcl_FirstHashEntry(&NanoVis::volumeTable, &iter);
    1715     if (hPtr != NULL) {
    1716         Volume *volPtr;
    1717         volPtr = (Volume *)Tcl_GetHashValue(hPtr);
    1718         volPtr->dataEnabled(false);
    1719         volPtr->visible(false);
     1674        (*iter)->visible(state);
    17201675    }
    17211676    return TCL_OK;
     
    17311686    {"shading",   2, VolumeShadingOp,     3, 0, "oper ?args?",},
    17321687    {"state",     2, VolumeStateOp,       3, 0, "bool ?indices?",},
    1733     {"test2",     1, VolumeTestOp,        2, 2, "",},
    17341688};
    17351689static int nVolumeOps = NumCmdSpecs(volumeOps);
     
    17521706static int
    17531707VolumeCmd(ClientData clientData, Tcl_Interp *interp, int objc,
    1754           Tcl_Obj *const *objv)
     1708          Tcl_Obj *const *objv)
    17551709{
    17561710    Tcl_ObjCmdProc *proc;
     
    17721726        return TCL_ERROR;
    17731727    }
    1774     const char *tag;
    1775     tag = Tcl_GetString(objv[4]);
    1776     int isNew;
    1777     Tcl_HashEntry *hPtr;
     1728    const char *tag = Tcl_GetString(objv[4]);
    17781729
    17791730    Rappture::Buffer buf;
     
    17831734    Rappture::Unirect2d data(1);
    17841735    if (data.parseBuffer(interp, buf) != TCL_OK) {
    1785         return TCL_ERROR;
     1736        return TCL_ERROR;
    17861737    }
    17871738    if (data.nValues() == 0) {
    1788         Tcl_AppendResult(interp, "no data found in stream", (char *)NULL);
    1789         return TCL_ERROR;
     1739        Tcl_AppendResult(interp, "no data found in stream", (char *)NULL);
     1740        return TCL_ERROR;
    17901741    }
    17911742    if (!data.isInitialized()) {
    1792         return TCL_ERROR;
    1793     }
    1794     HeightMap* hmPtr;
    1795     hPtr = Tcl_CreateHashEntry(&NanoVis::heightmapTable, tag, &isNew);
    1796     if (isNew) {
    1797         hmPtr = new HeightMap();
    1798         Tcl_SetHashValue(hPtr, hmPtr);
     1743        return TCL_ERROR;
     1744    }
     1745    HeightMap *heightMap;
     1746    NanoVis::HeightMapHashmap::iterator itr = NanoVis::heightMapTable.find(tag);
     1747    if (itr != NanoVis::heightMapTable.end()) {
     1748        heightMap = itr->second;
    17991749    } else {
    1800         hmPtr = (HeightMap *)Tcl_GetHashValue(hPtr);
    1801     }
    1802     TRACE("Number of heightmaps=%d", NanoVis::heightmapTable.numEntries);
     1750        heightMap = new HeightMap();
     1751        NanoVis::heightMapTable[tag] = heightMap;
     1752    }
     1753    TRACE("Number of heightmaps=%d", NanoVis::heightMapTable.size());
    18031754    // Must set units before the heights.
    1804     hmPtr->xAxis.units(data.xUnits());
    1805     hmPtr->yAxis.units(data.yUnits());
    1806     hmPtr->zAxis.units(data.vUnits());
    1807     hmPtr->wAxis.units(data.yUnits());
    1808     hmPtr->setHeight(data.xMin(), data.yMin(), data.xMax(), data.yMax(),
    1809                      data.xNum(), data.yNum(), data.transferValues());
    1810     hmPtr->transferFunction(NanoVis::getTransfunc("default"));
    1811     hmPtr->setVisible(true);
    1812     hmPtr->setLineContourVisible(true);
     1755    heightMap->xAxis.units(data.xUnits());
     1756    heightMap->yAxis.units(data.yUnits());
     1757    heightMap->zAxis.units(data.vUnits());
     1758    heightMap->wAxis.units(data.yUnits());
     1759    heightMap->setHeight(data.xMin(), data.yMin(), data.xMax(), data.yMax(),
     1760                         data.xNum(), data.yNum(), data.transferValues());
     1761    heightMap->transferFunction(NanoVis::getTransferFunction("default"));
     1762    heightMap->setVisible(true);
     1763    heightMap->setLineContourVisible(true);
    18131764    NanoVis::eventuallyRedraw();
    18141765    return TCL_OK;
     
    18781829static int
    18791830HeightMapLineContourVisibleOp(ClientData clientData, Tcl_Interp *interp,
    1880                               int objc, Tcl_Obj *const *objv)
     1831                              int objc, Tcl_Obj *const *objv)
    18811832{
    18821833    bool visible;
     
    19331884                  Tcl_Obj *const *objv)
    19341885{
    1935     const char *tag;
    1936     tag = Tcl_GetString(objv[2]);
    1937     Tcl_HashEntry *hPtr;
    1938     int isNew;
    1939     hPtr = Tcl_CreateHashEntry(&NanoVis::heightmapTable, tag, &isNew);
    1940     if (!isNew) {
    1941         Tcl_AppendResult(interp, "heightmap \"", tag, "\" already exists.",
    1942                          (char *)NULL);
    1943         return TCL_ERROR;
    1944     }
    1945     HeightMap *hmPtr;
     1886    const char *tag = Tcl_GetString(objv[2]);
     1887    NanoVis::HeightMapHashmap::iterator itr = NanoVis::heightMapTable.find(tag);
     1888    if (itr != NanoVis::heightMapTable.end()) {
     1889        Tcl_AppendResult(interp, "heightmap \"", tag, "\" already exists.",
     1890                         (char *)NULL);
     1891        return TCL_ERROR;
     1892    }
    19461893    /* heightmap create xmin ymin xmax ymax xnum ynum values */
    1947     hmPtr = CreateHeightMap(clientData, interp, objc - 3, objv + 3);
    1948     if (hmPtr == NULL) {
    1949         return TCL_ERROR;
    1950     }
    1951     Tcl_SetHashValue(hPtr, hmPtr);
    1952     Tcl_SetStringObj(Tcl_GetObjResult(interp), tag, -1);;
     1894    HeightMap *heightMap = CreateHeightMap(clientData, interp, objc - 3, objv + 3);
     1895    if (heightMap == NULL) {
     1896        return TCL_ERROR;
     1897    }
     1898    NanoVis::heightMapTable[tag] = heightMap;
    19531899    NanoVis::eventuallyRedraw();
    1954     TRACE("Number of heightmaps=%d", NanoVis::heightmapTable.numEntries);
     1900    TRACE("Number of heightmaps=%d", NanoVis::heightMapTable.size());
    19551901    return TCL_OK;
    19561902}
     
    19701916    if (tfPtr == NULL) {
    19711917        Tcl_AppendResult(interp, "no transfer function defined for heightmap"
    1972                         " \"", tag, "\"", (char*)NULL);
     1918                        " \"", tag, "\"", (char*)NULL);
    19731919        return TCL_ERROR;
    19741920    }
     
    20181964    const char *name;
    20191965    name = Tcl_GetString(objv[2]);
    2020     TransferFunction *tfPtr;
    2021     tfPtr = NanoVis::getTransfunc(name);
    2022     if (tfPtr == NULL) {
     1966    TransferFunction *tf = NanoVis::getTransferFunction(name);
     1967    if (tf == NULL) {
    20231968        Tcl_AppendResult(interp, "transfer function \"", name,
    20241969                         "\" is not defined", (char*)NULL);
     
    20311976    std::vector<HeightMap *>::iterator iter;
    20321977    for (iter = imap.begin(); iter != imap.end(); iter++) {
    2033         (*iter)->transferFunction(tfPtr);
     1978        (*iter)->transferFunction(tf);
    20341979    }
    20351980    NanoVis::eventuallyRedraw();
     
    20441989    float opacity;
    20451990    if (GetFloatFromObj(interp, objv[2], &opacity) != TCL_OK) {
    2046         return TCL_ERROR;
     1991        return TCL_ERROR;
    20471992    }
    20481993    std::vector<HeightMap *> heightmaps;
     
    20732018static int
    20742019HeightMapCmd(ClientData clientData, Tcl_Interp *interp, int objc,
    2075              Tcl_Obj *const *objv)
     2020             Tcl_Obj *const *objv)
    20762021{
    20772022    Tcl_ObjCmdProc *proc;
     
    21502095static int
    21512096GridVisibleOp(ClientData clientData, Tcl_Interp *interp, int objc,
    2152               Tcl_Obj *const *objv)
     2097              Tcl_Obj *const *objv)
    21532098{
    21542099    bool visible;
     
    21702115static int
    21712116GridCmd(ClientData clientData, Tcl_Interp *interp, int objc,
    2172         Tcl_Obj *const *objv)
     2117        Tcl_Obj *const *objv)
    21732118{
    21742119    Tcl_ObjCmdProc *proc;
     
    21842129static int
    21852130AxisCmd(ClientData clientData, Tcl_Interp *interp, int objc,
    2186         Tcl_Obj *const *objv)
     2131        Tcl_Obj *const *objv)
    21872132{
    21882133    if (objc < 2) {
     
    22112156static int
    22122157PlaneAddOp(ClientData clientData, Tcl_Interp *interp, int objc,
    2213            Tcl_Obj *const *objv)
     2158           Tcl_Obj *const *objv)
    22142159{
    22152160    TRACE("load plane for 2D visualization command");
     
    23162261static int
    23172262PlaneCmd(ClientData clientData, Tcl_Interp *interp, int objc,
    2318         Tcl_Obj *const *objv)
     2263        Tcl_Obj *const *objv)
    23192264{
    23202265    Tcl_ObjCmdProc *proc;
     
    23642309static int
    23652310Unirect3dCmd(ClientData clientData, Tcl_Interp *interp, int objc,
    2366              Tcl_Obj *const *objv)
     2311             Tcl_Obj *const *objv)
    23672312{
    23682313    Rappture::Unirect3d *dataPtr = (Rappture::Unirect3d *)clientData;
     
    23912336    Tcl_CreateObjCommand(interp, "cutplane",    CutplaneCmd,    NULL, NULL);
    23922337    if (FlowCmdInitProc(interp) != TCL_OK) {
    2393         return NULL;
     2338        return NULL;
    23942339    }
    23952340    Tcl_CreateObjCommand(interp, "grid",        GridCmd,        NULL, NULL);
     
    24072352    Tcl_CreateObjCommand(interp, "volume",      VolumeCmd,      NULL, NULL);
    24082353
    2409     Tcl_InitHashTable(&NanoVis::volumeTable, TCL_STRING_KEYS);
    2410     Tcl_InitHashTable(&NanoVis::heightmapTable, TCL_STRING_KEYS);
    24112354    // create a default transfer function
    24122355    if (Tcl_Eval(interp, def_transfunc) != TCL_OK) {
    24132356        WARN("bad default transfer function:\n%s",
    2414              Tcl_GetStringResult(interp));
     2357             Tcl_GetStringResult(interp));
    24152358    }
    24162359    return interp;
Note: See TracChangeset for help on using the changeset viewer.