Changeset 5105


Ignore:
Timestamp:
Mar 9, 2015, 12:02:47 AM (9 years ago)
Author:
ldelgass
Message:

geovis updates for NSF demo

Location:
geovis/trunk
Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • geovis/trunk/Makefile.in

    r4635 r5105  
    121121SERVER_SRCS     = \
    122122                CmdProc.cpp \
     123                ColorMap.cpp \
    123124                FileUtil.cpp \
    124125                PPMWriter.cpp \
     
    188189
    189190CmdProc.o: CmdProc.h
     191ColorMap.o: ColorMap.h
    190192CommandQueue.o: CommandQueue.h Trace.h
    191193md5.o: md5.h
  • geovis/trunk/RenderServer.h

    r4957 r5105  
    2121class Stats;
    2222
    23 #define GEOVIS_VERSION_STRING "0.6.1"
     23#define GEOVIS_VERSION_STRING "0.7.0"
    2424
    2525#define MSECS_ELAPSED(t1, t2) \
  • geovis/trunk/Renderer.cpp

    r5026 r5105  
    8080
    8181#include "Renderer.h"
     82#include "ColorMap.h"
    8283#if 0
    8384#include "SingleWindow.h"
     
    179180    if (!_colorMaps.empty())
    180181        return;
    181 
     182#if 0
    182183    osg::TransferFunction1D *defaultColorMap = new osg::TransferFunction1D;
    183184    defaultColorMap->allocate(256);
     
    195196    defaultGrayColorMap->updateImage();
    196197    addColorMap("grayDefault", defaultGrayColorMap);
     198#endif
     199}
     200
     201void Renderer::saveCLRFile(const std::string& path, osg::TransferFunction1D *xfer)
     202{
     203    std::ofstream out(path.c_str());
     204    float value;
     205    unsigned int r, g, b, a;
     206    for (osg::TransferFunction1D::ColorMap::const_iterator itr = xfer->getColorMap().begin();
     207         itr != xfer->getColorMap().end(); ++itr) {
     208        value = itr->first;
     209        r = (unsigned int)(255.0 * itr->second.r());
     210        g = (unsigned int)(255.0 * itr->second.g());
     211        b = (unsigned int)(255.0 * itr->second.b());
     212        a = (unsigned int)(255.0 * itr->second.a());
     213        out << value << " " << r << " " << g << " " << b << " " << a << std::endl;
     214    }
     215}
     216
     217void Renderer::getColorMapRange(const ColorMapId& id, float *min, float *max) const
     218{
     219    ColorMapHashmap::const_iterator itr = _colorMaps.find(id);
     220    if (itr == _colorMaps.end()) {
     221        ERROR("Unknown ColorMap %s", id.c_str());
     222        return;
     223    }
     224
     225    *min = itr->second->getMinimum();
     226    *max = itr->second->getMaximum();
     227}
     228
     229std::string Renderer::getColorMapFilePath(const ColorMapId& id) const
     230{
     231    std::ostringstream path;
     232    path << "/tmp/" << id << "_" << getpid() << ".clr";
     233    return path.str();
    197234}
    198235
     
    200237{
    201238    _colorMaps[id] = xfer;
     239    saveCLRFile(getColorMapFilePath(id), xfer);
    202240}
    203241
     
    253291    do {
    254292        itr->second->allocate(numEntries);
    255         itr->second->updateImage();
    256293    } while (doAll && ++itr != _colorMaps.end());
     294}
     295
     296bool
     297Renderer::renderColorMap(const ColorMapId& id, int width, int height,
     298                         osg::Image *imgData,
     299                         bool opaque, float bgColor[3],
     300                         bool bgr, int bytesPerPixel) const
     301{
     302    ColorMapHashmap::const_iterator itr = _colorMaps.find(id);
     303    if (itr == _colorMaps.end()) {
     304        ERROR("Unknown ColorMap %s", id.c_str());
     305        return false;
     306    }
     307
     308    ColorMap::renderColorMap(itr->second, width, height, imgData, opaque, bgColor, bgr, bytesPerPixel);
     309    return true;
    257310}
    258311
     
    671724
    672725void Renderer::resetMap(osgEarth::MapOptions::CoordinateSystemType type,
     726                        const osg::Vec4f& bgColor,
    673727                        const char *profile,
    674728                        double bounds[4])
     
    724778#endif
    725779    // Set background layer color
    726     mpOpt.color() = osg::Vec4(1, 1, 1, 1);
     780    mpOpt.color() = bgColor;
    727781    //mpOpt.minLOD() = 1;
    728782    // Sets shader uniform for terrain renderer (config var defaults to false)
     
    843897}
    844898
     899void Renderer::setTerrainColor(const osg::Vec4f& color)
     900{
     901   
     902    _needsRedraw = true;
     903}
     904
    845905void Renderer::setTerrainLighting(bool state)
    846906{
     
    11531213                             bool enableCache,
    11541214                             bool makeShared,
    1155                              bool visible)
     1215                             bool visible,
     1216                             int minLOD, int maxLOD)
    11561217{
    11571218    if (!_map.valid()) {
     
    11771238        layerOpts.visible() = false;
    11781239    }
     1240    layerOpts.minLevel() = minLOD;
     1241    layerOpts.maxLevel() = maxLOD;
    11791242    osg::ref_ptr<osgEarth::ImageLayer> layer = new osgEarth::ImageLayer(layerOpts);
    11801243    _map->addImageLayer(layer.get());
     
    12731336}
    12741337
     1338void Renderer::setImageLayerVisibleRange(const char *name, float min, float max)
     1339{
     1340    if (!_map.valid()) {
     1341        ERROR("No map");
     1342        return;
     1343    }
     1344    osgEarth::ImageLayer *layer = _map->getImageLayerByName(name);
     1345    if (layer != NULL) {
     1346        layer->setMinVisibleRange(min);
     1347        layer->setMaxVisibleRange(max);
     1348        _needsRedraw = true;
     1349    } else {
     1350        TRACE("Image layer not found: %s", name);
     1351    }
     1352}
     1353
    12751354void Renderer::setImageLayerVisibility(const char *name, bool state)
    12761355{
     
    12911370                                 osgEarth::TileSourceOptions& opts,
    12921371                                 bool enableCache,
    1293                                  bool visible)
     1372                                 bool visible,
     1373                                 int minLOD, int maxLOD)
    12941374{
    12951375    if (!_map.valid()) {
     
    12991379    TRACE("layer: %s", name);
    13001380    if (!opts.tileSize().isSet()) {
    1301         opts.tileSize() = 15;
     1381        opts.tileSize() = 17;
    13021382    }
    13031383    osgEarth::ElevationLayerOptions layerOpts(name, opts);
     
    13081388        layerOpts.visible() = false;
    13091389    }
     1390    layerOpts.minLevel() = minLOD;
     1391    layerOpts.maxLevel() = maxLOD;
    13101392    // XXX: GDAL does not report vertical datum, it should be specified here
    13111393    // Common options: geodetic (default), egm96, egm84, egm2008
     
    16021684{
    16031685    if (!_placeNodes.valid()) {
    1604         ERROR("No place nodes");
     1686        TRACE("No place nodes");
    16051687        return;
    16061688    }
     
    16491731{
    16501732    if (!_placeNodes.valid()) {
    1651         ERROR("No place nodes");
     1733        TRACE("No place nodes");
    16521734        return;
    16531735    }
     
    17461828#endif
    17471829}
    1748 
     1830#if 0
     1831void Renderer::setModelLayerVisibleRange(const char *name, float min, float max)
     1832{
     1833    if (!_map.valid()) {
     1834        ERROR("No map");
     1835        return;
     1836    }
     1837    osgEarth::ModelLayer *layer = _map->getModelLayerByName(name);
     1838    if (layer != NULL) {
     1839        layer->minVisibleRange(min);
     1840        layer->maxVisibleRange(max);
     1841        _needsRedraw = true;
     1842    } else {
     1843        TRACE("Model layer not found: %s", name);
     1844    }
     1845}
     1846#endif
    17491847void Renderer::setModelLayerVisibility(const char *name, bool state)
    17501848{
     
    21362234    _lastFrameTime = osg::Timer::instance()->delta_s(_startFrameTime, endFrameTick);
    21372235    if (_lastFrameTime > _minFrameTime) {
    2138         ERROR("BROKE FRAME by %.2f msec", (_lastFrameTime - _minFrameTime)*1000.0f);
     2236        TRACE("BROKE FRAME by %.2f msec", (_lastFrameTime - _minFrameTime)*1000.0f);
    21392237    } else {
    21402238        TRACE("Frame time: %.2f msec", _lastFrameTime*1000.0f);
  • geovis/trunk/Renderer.h

    r5026 r5105  
    168168    void setColorMapNumberOfTableEntries(const ColorMapId& id, int numEntries);
    169169
     170    bool renderColorMap(const ColorMapId& id, int width, int height,
     171                        osg::Image *imgData,
     172                        bool opaque, float bgColor[3],
     173                        bool bgr = false,
     174                        int bytesPerPixel = 3) const;
     175
     176    void getColorMapRange(const ColorMapId& id, float *min, float *max) const;
     177
     178    std::string getColorMapFilePath(const ColorMapId& id) const;
     179
     180    void saveCLRFile(const std::string& path, osg::TransferFunction1D *xfer);
     181
    170182    // Scene
    171183
     
    173185
    174186    void resetMap(osgEarth::MapOptions::CoordinateSystemType type,
     187                  const osg::Vec4f& bgColor = osg::Vec4f(1,1,1,1),
    175188                  const char *profile = NULL,
    176189                  double bounds[4] = NULL);
     
    197210
    198211    void setLighting(bool state);
     212
     213    void setTerrainColor(const osg::Vec4f& color);
     214
     215    void setTerrainEdges(bool state) {}
     216
     217    void setTerrainLineColor(const osg::Vec4f& color) {}
     218
     219    void setTerrainLineWidth(float width) {}
    199220
    200221    void setTerrainLighting(bool state);
     
    230251    bool addImageLayer(const char *name, osgEarth::TileSourceOptions& opts,
    231252                       bool enableCache = true, bool makeShared = false,
    232                        bool visible = true);
     253                       bool visible = true,
     254                       int minLOD = 0, int maxLOD = 23);
    233255
    234256    void removeImageLayer(const char *name);
    235257
    236258    void moveImageLayer(const char *name, unsigned int pos);
     259
     260    void setImageLayerVisibleRange(const char *name, float min, float max);
     261
     262    void setImageLayerLODRange(const char *name, int min, int max);
    237263
    238264    void setImageLayerOpacity(const char *name, double opacity);
     
    265291
    266292    void addElevationLayer(const char *name, osgEarth::TileSourceOptions& opts,
    267                            bool enableCache = true, bool visible = true);
     293                           bool enableCache = true, bool visible = true,
     294                           int minLOD = 0, int maxLOD = 23);
    268295
    269296    void removeElevationLayer(const char *name);
    270297
    271298    void moveElevationLayer(const char *name, unsigned int pos);
     299
     300    void setElevationLayerVisibleRange(const char *name, float min, float max);
    272301
    273302    void setElevationLayerVisibility(const char *name, bool state);
     
    298327
    299328    void moveModelLayer(const char *name, unsigned int pos);
     329
     330    //void setModelLayerVisibleRange(const char *name, float min, float max);
    300331
    301332    void setModelLayerOpacity(const char *name, double opacity);
  • geovis/trunk/RendererCmd.cpp

    r5026 r5105  
    2323#include <osgDB/FileNameUtils>
    2424
     25#include <osgEarth/Version>
    2526#include <osgEarth/Registry>
    2627#include <osgEarthFeatures/FeatureModelSource>
     
    3233#include <osgEarthSymbology/RenderSymbol>
    3334
     35#if OSGEARTH_MIN_VERSION_REQUIRED(2, 5, 1)
     36#include <osgEarthDrivers/osg/ColorRampOptions>
     37#endif
    3438#include <osgEarthDrivers/debug/DebugOptions>
    3539#include <osgEarthDrivers/gdal/GDALOptions>
     
    528532{
    529533    const char *name = Tcl_GetString(objv[2]);
    530     int cmapc, omapc;
     534    int cmapc;
    531535    Tcl_Obj **cmapv = NULL;
    532     Tcl_Obj **omapv = NULL;
    533536
    534537    if (Tcl_ListObjGetElements(interp, objv[3], &cmapc, &cmapv) != TCL_OK) {
    535538        return TCL_ERROR;
    536539    }
    537     if ((cmapc % 4) != 0) {
     540    if ((cmapc % 5) != 0) {
    538541        Tcl_AppendResult(interp, "wrong # elements in colormap: should be ",
    539                          "{ value r g b ... }", (char*)NULL);
     542                         "{ value r g b a... }", (char*)NULL);
    540543        return TCL_ERROR;
    541544    }
     
    544547    colorMap->allocate(256);
    545548
    546     for (int i = 0; i < cmapc; i += 4) {
    547         double val[4];
    548         for (int j = 0; j < 4; j++) {
     549    for (int i = 0; i < cmapc; i += 5) {
     550        double val[5];
     551        for (int j = 0; j < 5; j++) {
    549552            if (Tcl_GetDoubleFromObj(interp, cmapv[i+j], &val[j]) != TCL_OK) {
    550553                delete colorMap;
    551554                return TCL_ERROR;
    552555            }
    553             if ((val[j] < 0.0) || (val[j] > 1.0)) {
     556            // Need to permit un-normalized values
     557            if (j > 0 && (val[j] < 0.0 || val[j] > 1.0)) {
    554558                Tcl_AppendResult(interp, "bad colormap value \"",
    555559                                 Tcl_GetString(cmapv[i+j]),
     
    559563            }
    560564        }
    561         colorMap->setColor(val[0], osg::Vec4f(val[1], val[2], val[3], 1.0), false);
     565        colorMap->setColor(val[0], osg::Vec4f(val[1], val[2], val[3], val[4]), false);
    562566    }
    563567
    564568    colorMap->updateImage();
    565569
    566     if (Tcl_ListObjGetElements(interp, objv[4], &omapc, &omapv) != TCL_OK) {
    567         delete colorMap;
    568         return TCL_ERROR;
    569     }
    570     if ((omapc % 2) != 0) {
    571         Tcl_AppendResult(interp, "wrong # elements in opacitymap: should be ",
    572                          "{ value alpha ... }", (char*)NULL);
    573         delete colorMap;
    574         return TCL_ERROR;
    575     }
    576     for (int i = 0; i < omapc; i += 2) {
    577         double val[2];
    578         for (int j = 0; j < 2; j++) {
    579             if (Tcl_GetDoubleFromObj(interp, omapv[i+j], &val[j]) != TCL_OK) {
    580                 delete colorMap;
    581                 return TCL_ERROR;
    582             }
    583             if ((val[j] < 0.0) || (val[j] > 1.0)) {
    584                 Tcl_AppendResult(interp, "bad opacitymap value \"",
    585                                  Tcl_GetString(omapv[i+j]),
    586                                  "\": should be in the range [0,1]", (char*)NULL);
    587                 delete colorMap;
    588                 return TCL_ERROR;
    589             }
    590         }
    591 #if 0
    592         ColorMap::OpacityControlPoint ocp;
    593         ocp.value = val[0];
    594         ocp.alpha = val[1];
    595         colorMap->addOpacityControlPoint(ocp);
    596 #endif
    597     }
    598 
    599     //colorMap->build();
    600570    g_renderer->addColorMap(name, colorMap);
    601571    return TCL_OK;
     
    646616
    647617static CmdSpec colorMapOps[] = {
    648     {"add",    1, ColorMapAddOp,             5, 5, "colorMapName colormap alphamap"},
    649     {"define", 3, ColorMapAddOp,             5, 5, "colorMapName colormap alphamap"},
     618    {"add",    1, ColorMapAddOp,             4, 4, "colorMapName colormap"},
     619    {"define", 3, ColorMapAddOp,             4, 4, "colorMapName colormap"},
    650620    {"delete", 3, ColorMapDeleteOp,          2, 3, "?colorMapName?"},
    651621    {"res",    1, ColorMapNumTableEntriesOp, 3, 4, "numTableEntries ?colorMapName?"}
     
    767737    }
    768738    return (*proc) (clientData, interp, objc, objv);
     739}
     740
     741static int
     742LegendCmd(ClientData clientData, Tcl_Interp *interp, int objc,
     743          Tcl_Obj *const *objv)
     744{
     745    if (objc != 4) {
     746        Tcl_AppendResult(interp, "wrong # args: should be \"",
     747                Tcl_GetString(objv[0]), " colormapName width height\"", (char*)NULL);
     748        return TCL_ERROR;
     749    }
     750    const char *colorMapName = Tcl_GetString(objv[1]);
     751
     752    int width, height;
     753    if (Tcl_GetIntFromObj(interp, objv[2], &width) != TCL_OK ||
     754        Tcl_GetIntFromObj(interp, objv[3], &height) != TCL_OK) {
     755        return TCL_ERROR;
     756    }
     757
     758    bool opaque = true;
     759    float bgColor[3];
     760    memset(bgColor, 0, sizeof(float)*3);
     761    osg::ref_ptr<osg::Image> imgData = new osg::Image();
     762
     763#if defined(RENDER_TARGA) || defined(DEBUG)
     764    if (!g_renderer->renderColorMap(colorMapName, width, height, imgData, opaque,
     765                                    bgColor, true)) {
     766        Tcl_AppendResult(interp, "Color map \"",
     767                         colorMapName, "\" was not found", (char*)NULL);
     768        return TCL_ERROR;
     769    }
     770#else
     771    if (!g_renderer->renderColorMap(colorMapName, width, height, imgData, opaque,
     772                                    bgColor)) {
     773        Tcl_AppendResult(interp, "Color map \"",
     774                         colorMapName, "\" was not found", (char*)NULL);
     775        return TCL_ERROR;
     776    }
     777#endif
     778
     779#ifdef DEBUG
     780# ifdef RENDER_TARGA
     781    writeTGAFile("/tmp/legend.tga", imgData->data(), width, height,
     782                 TARGA_BYTES_PER_PIXEL);
     783# else
     784    writeTGAFile("/tmp/legend.tga", imgData->data(), width, height,
     785                 TARGA_BYTES_PER_PIXEL, true);
     786# endif
     787#else
     788    char cmd[256];
     789    float min, max;
     790    g_renderer->getColorMapRange(colorMapName, &min, &max);
     791    snprintf(cmd, sizeof(cmd), "nv>legend {%s} %g %g", colorMapName, min, max);
     792
     793# ifdef USE_THREADS
     794#  ifdef RENDER_TARGA
     795    queueTGA(g_outQueue, cmd, imgData->data(), width, height,
     796             TARGA_BYTES_PER_PIXEL);
     797#  else
     798    queuePPM(g_outQueue, cmd, imgData->data(), width, height);
     799#  endif
     800# else
     801#  ifdef RENDER_TARGA
     802    writeTGA(g_fdOut, cmd, imgData->data(), width, height,
     803             TARGA_BYTES_PER_PIXEL);
     804#  else
     805    writePPM(g_fdOut, cmd, imgData->data(), width, height);
     806#  endif
     807# endif // USE_THREADS
     808#endif // DEBUG
     809
     810    return TCL_OK;
    769811}
    770812
     
    947989              Tcl_Obj *const *objv)
    948990{
    949     char *type = Tcl_GetString(objv[3]);
     991    char *name = Tcl_GetString(objv[3]);
     992    char *type = Tcl_GetString(objv[4]);
    950993    if (type[0] == 'i' && strcmp(type, "image") == 0) {
    951994        bool ret;
    952         char *name;
    953         char *driver = Tcl_GetString(objv[4]);
     995        char *driver = Tcl_GetString(objv[5]);
    954996        std::string url;
    955997        if (objc > 6) {
    956             char *urlIn = Tcl_GetString(objv[5]);
     998            char *urlIn = Tcl_GetString(objv[6]);
    957999            url = g_renderer->getCanonicalPath(std::string(urlIn));
    9581000            if (url.empty()) {
     
    9641006        bool cache = true;
    9651007        if (objc > 7) {
    966             if (GetBooleanFromObj(interp, objv[6], &cache) != TCL_OK) {
     1008            if (GetBooleanFromObj(interp, objv[7], &cache) != TCL_OK) {
    9671009                return TCL_ERROR;
    9681010            }
    9691011        }
    970         if (driver[0] == 'd' && strcmp(driver, "debug") == 0) {
     1012        bool shared = false;
     1013        bool visible = true;
     1014        int minLOD = 0;
     1015        int maxLOD = 23;
     1016        float minRange = 0.f;
     1017        float maxRange = FLT_MAX;
     1018#if OSGEARTH_MIN_VERSION_REQUIRED(2, 5, 1)
     1019        if (driver[0] == 'c' && strcmp(driver, "colorramp") == 0) {
     1020            osgEarth::Drivers::ColorRampOptions colorRampOpts;
     1021            osgEarth::Drivers::GDALOptions opts;
     1022            opts.url() = url;
     1023            char *profile = Tcl_GetString(objv[8]);
     1024            char *colormap = Tcl_GetString(objv[9]);
     1025            osgEarth::ElevationLayerOptions elevOpts(name, opts);
     1026            if (!cache) {
     1027                elevOpts.cachePolicy() = osgEarth::CachePolicy(osgEarth::CachePolicy::USAGE_NO_CACHE);
     1028            }
     1029            if (profile != NULL) {
     1030                //elevOpts.driver()->profile()->srsString() = "epsg:4326";
     1031                elevOpts.driver()->profile() = osgEarth::ProfileOptions(profile);
     1032            }
     1033            colorRampOpts.elevationLayer() = elevOpts;
     1034            colorRampOpts.ramp() = g_renderer->getColorMapFilePath(colormap);
     1035            ret = g_renderer->addImageLayer(name, colorRampOpts, cache, shared, visible, minLOD, maxLOD);
     1036        } else
     1037#endif
     1038            if (driver[0] == 'd' && strcmp(driver, "debug") == 0) {
    9711039            osgEarth::Drivers::DebugOptions opts;
    972             name = Tcl_GetString(objv[5]);
    973             ret = g_renderer->addImageLayer(name, opts, cache);
     1040            ret = g_renderer->addImageLayer(name, opts, cache, shared, visible, minLOD, maxLOD);
    9741041        } else if (driver[0] == 'g' && strcmp(driver, "gdal") == 0) {
    9751042            osgEarth::Drivers::GDALOptions opts;
    9761043            opts.url() = url;
    977             name = Tcl_GetString(objv[7]);
    978             ret = g_renderer->addImageLayer(name, opts, cache);
     1044            ret = g_renderer->addImageLayer(name, opts, cache, shared, visible, minLOD, maxLOD);
     1045            g_renderer->setImageLayerVisibleRange(name, minRange, maxRange);
    9791046        } else if (driver[0] == 't' && strcmp(driver, "tms") == 0) {
    9801047            osgEarth::Drivers::TMSOptions opts;
    981             //char *tmsType = Tcl_GetString(objv[5]);
    982             //char *format = Tcl_GetString(objv[6]);
     1048            //char *tmsType = Tcl_GetString(objv[8]);
     1049            //char *format = Tcl_GetString(objv[9]);
    9831050            opts.url() = url;
    9841051            //opts.tmsType() = tmsType;
    9851052            //opts.format() = format;
    986             name = Tcl_GetString(objv[7]);
    987             ret = g_renderer->addImageLayer(name, opts, cache);
     1053            ret = g_renderer->addImageLayer(name, opts, cache, shared, visible, minLOD, maxLOD);
     1054            g_renderer->setImageLayerVisibleRange(name, minRange, maxRange);
    9881055        } else if (driver[0] == 'w' && strcmp(driver, "wms") == 0) {
    9891056            osgEarth::Drivers::WMSOptions opts;
    990             char *wmsLayers = Tcl_GetString(objv[7]);
    991             char *format = Tcl_GetString(objv[8]);
     1057            char *wmsLayers = Tcl_GetString(objv[8]);
     1058            char *format = Tcl_GetString(objv[9]);
    9921059            bool transparent;
    993             if (GetBooleanFromObj(interp, objv[9], &transparent) != TCL_OK) {
     1060            if (GetBooleanFromObj(interp, objv[10], &transparent) != TCL_OK) {
    9941061                return TCL_ERROR;
    9951062            }
     
    9991066            opts.transparent() = transparent;
    10001067
    1001             name = Tcl_GetString(objv[10]);
    1002             ret = g_renderer->addImageLayer(name, opts, cache);
     1068            ret = g_renderer->addImageLayer(name, opts, cache, shared, visible, minLOD, maxLOD);
     1069            g_renderer->setImageLayerVisibleRange(name, minRange, maxRange);
    10031070        } else if (driver[0] == 'x' && strcmp(driver, "xyz") == 0) {
    10041071            osgEarth::Drivers::XYZOptions opts;
     
    10071074            //bool invertY = false;
    10081075            //opts.invertY() = invertY;
    1009             //opts.format() = Tcl_GetString(objv[6]);
    1010             name = Tcl_GetString(objv[7]);
    1011             ret = g_renderer->addImageLayer(name, opts, cache);
     1076            //opts.format() = Tcl_GetString(objv[8]);
     1077            ret = g_renderer->addImageLayer(name, opts, cache, shared, visible, minLOD, maxLOD);
     1078            g_renderer->setImageLayerVisibleRange(name, minRange, maxRange);
    10121079        } else {
    10131080            Tcl_AppendResult(interp, "unknown image driver \"", driver,
     
    10201087        }
    10211088    } else if (type[0] == 'e' && strcmp(type, "elevation") == 0) {
    1022         char *driver = Tcl_GetString(objv[4]);
     1089        char *driver = Tcl_GetString(objv[5]);
     1090        char *urlIn = Tcl_GetString(objv[6]);
     1091        std::string url = g_renderer->getCanonicalPath(std::string(urlIn));
     1092        if (url.empty()) {
     1093            Tcl_AppendResult(interp, "file not found: \"",
     1094                             urlIn, "\"", (char*)NULL);
     1095            return TCL_ERROR;
     1096        }
     1097        bool cache = true;
     1098        bool visible = true;
     1099        int minLOD = 0;
     1100        int maxLOD = 23;
     1101        if (driver[0] == 'g' && strcmp(driver, "gdal") == 0) {
     1102            osgEarth::Drivers::GDALOptions opts;
     1103            opts.url() = url;
     1104            g_renderer->addElevationLayer(name, opts, cache, visible, minLOD, maxLOD);
     1105        } else if (driver[0] == 't' && strcmp(driver, "tms") == 0) {
     1106            osgEarth::Drivers::TMSOptions opts;
     1107            //char *tmsType = Tcl_GetString(objv[7]);
     1108            //char *format = Tcl_GetString(objv[8]);
     1109            opts.url() = url;
     1110            //opts.tmsType() = tmsType;
     1111            //opts.format() = format;
     1112            g_renderer->addElevationLayer(name, opts, cache, visible, minLOD, maxLOD);
     1113        } else {
     1114            Tcl_AppendResult(interp, "unknown elevation driver \"", driver,
     1115                             "\": should be 'gdal' or 'tms'", (char*)NULL);
     1116            return TCL_ERROR;
     1117        }
     1118    } else if (type[0] == 'p' && strcmp(type, "point") == 0) {
     1119        osgEarth::Drivers::OGRFeatureOptions opts;
    10231120        char *urlIn = Tcl_GetString(objv[5]);
    10241121        std::string url = g_renderer->getCanonicalPath(std::string(urlIn));
     
    10281125            return TCL_ERROR;
    10291126        }
    1030 
    1031         if (driver[0] == 'g' && strcmp(driver, "gdal") == 0) {
    1032             osgEarth::Drivers::GDALOptions opts;
    1033             opts.url() = url;
    1034             char *name = Tcl_GetString(objv[6]);
    1035             g_renderer->addElevationLayer(name, opts);
    1036         } else if (driver[0] == 't' && strcmp(driver, "tms") == 0) {
    1037             osgEarth::Drivers::TMSOptions opts;
    1038             //char *tmsType = Tcl_GetString(objv[6]);
    1039             //char *format = Tcl_GetString(objv[7]);
    1040             opts.url() = url;
    1041             //opts.tmsType() = tmsType;
    1042             //opts.format() = format;
    1043             char *name = Tcl_GetString(objv[6]);
    1044             g_renderer->addElevationLayer(name, opts);
    1045         } else {
    1046             Tcl_AppendResult(interp, "unknown elevation driver \"", driver,
    1047                              "\": should be 'gdal' or 'tms'", (char*)NULL);
    1048             return TCL_ERROR;
    1049         }
    1050     } else if (type[0] == 'p' && strcmp(type, "point") == 0) {
    1051         osgEarth::Drivers::OGRFeatureOptions opts;
    1052         char *urlIn = Tcl_GetString(objv[4]);
    1053         std::string url = g_renderer->getCanonicalPath(std::string(urlIn));
    1054         if (url.empty()) {
    1055             Tcl_AppendResult(interp, "file not found: \"",
    1056                              urlIn, "\"", (char*)NULL);
    1057             return TCL_ERROR;
    1058         }
    1059         char *name = Tcl_GetString(objv[5]);
    1060 
     1127        float r, g, b;
     1128        if (GetFloatFromObj(interp, objv[6], &r) != TCL_OK ||
     1129            GetFloatFromObj(interp, objv[7], &g) != TCL_OK ||
     1130            GetFloatFromObj(interp, objv[8], &b) != TCL_OK) {
     1131            return TCL_ERROR;
     1132        }
     1133        float ptSize;
     1134        if (GetFloatFromObj(interp, objv[9], &ptSize) != TCL_OK) {
     1135            return TCL_ERROR;
     1136        }
    10611137        opts.url() = url;
    10621138
    10631139        osgEarth::Symbology::Style style;
    1064         osgEarth::Symbology::PointSymbol *ls = style.getOrCreateSymbol<osgEarth::Symbology::PointSymbol>();
    1065         ls->fill()->color() = osgEarth::Symbology::Color::Black;
    1066         ls->size() = 2.0f;
     1140        osgEarth::Symbology::PointSymbol *ps = style.getOrCreateSymbol<osgEarth::Symbology::PointSymbol>();
     1141        ps->fill()->color() = osgEarth::Symbology::Color(r, g, b);
     1142        ps->size() = ptSize;
    10671143
    10681144        osgEarth::Symbology::RenderSymbol* rs = style.getOrCreateSymbol<osgEarth::Symbology::RenderSymbol>();
     
    10751151        geomOpts.styles()->addStyle(style);
    10761152        geomOpts.enableLighting() = false;
     1153        geomOpts.minRange() = 0.f;
     1154        geomOpts.maxRange() = FLT_MAX;
     1155        //geomOpts.renderOrder = int;
     1156        //geomOpts.depthTestEnabled = bool;
    10771157        g_renderer->addModelLayer(name, geomOpts);
    10781158    } else if (type[0] == 'p' && strcmp(type, "polygon") == 0) {
    10791159        osgEarth::Drivers::OGRFeatureOptions opts;
    1080         char *urlIn = Tcl_GetString(objv[4]);
     1160        char *urlIn = Tcl_GetString(objv[5]);
    10811161        std::string url = g_renderer->getCanonicalPath(std::string(urlIn));
    10821162        if (url.empty()) {
     
    10851165            return TCL_ERROR;
    10861166        }
    1087         char *name = Tcl_GetString(objv[5]);
     1167        float r, g, b;
     1168        if (GetFloatFromObj(interp, objv[6], &r) != TCL_OK ||
     1169            GetFloatFromObj(interp, objv[7], &g) != TCL_OK ||
     1170            GetFloatFromObj(interp, objv[8], &b) != TCL_OK) {
     1171            return TCL_ERROR;
     1172        }
    10881173        opts.url() = url;
    10891174
    10901175        osgEarth::Symbology::Style style;
    1091         osgEarth::Symbology::PolygonSymbol *ls = style.getOrCreateSymbol<osgEarth::Symbology::PolygonSymbol>();
    1092         ls->fill()->color() = osgEarth::Symbology::Color::White;
     1176        osgEarth::Symbology::PolygonSymbol *ps = style.getOrCreateSymbol<osgEarth::Symbology::PolygonSymbol>();
     1177        ps->fill()->color() = osgEarth::Symbology::Color(r, g, b);
    10931178#if 1
    10941179        osgEarth::Symbology::AltitudeSymbol *alt = style.getOrCreateSymbol<osgEarth::Symbology::AltitudeSymbol>();
     
    11061191        geomOpts.styles()->addStyle(style);
    11071192        geomOpts.enableLighting() = false;
     1193        geomOpts.minRange() = 0.f;
     1194        geomOpts.maxRange() = FLT_MAX;
    11081195        g_renderer->addModelLayer(name, geomOpts);
    11091196    } else if (type[0] == 'l' && strcmp(type, "line") == 0) {
    11101197        osgEarth::Drivers::OGRFeatureOptions opts;
    1111         char *urlIn = Tcl_GetString(objv[4]);
     1198        char *urlIn = Tcl_GetString(objv[5]);
    11121199        std::string url = g_renderer->getCanonicalPath(std::string(urlIn));
    11131200        if (url.empty()) {
     
    11161203            return TCL_ERROR;
    11171204        }
    1118         char *name = Tcl_GetString(objv[5]);
     1205        float r, g, b;
     1206        if (GetFloatFromObj(interp, objv[6], &r) != TCL_OK ||
     1207            GetFloatFromObj(interp, objv[7], &g) != TCL_OK ||
     1208            GetFloatFromObj(interp, objv[8], &b) != TCL_OK) {
     1209            return TCL_ERROR;
     1210        }
     1211        float lineWidth;
     1212        if (GetFloatFromObj(interp, objv[9], &lineWidth) != TCL_OK) {
     1213            return TCL_ERROR;
     1214        }
    11191215        opts.url() = url;
    11201216
    11211217        osgEarth::Symbology::Style style;
    11221218        osgEarth::Symbology::LineSymbol *ls = style.getOrCreateSymbol<osgEarth::Symbology::LineSymbol>();
    1123         ls->stroke()->color() = osgEarth::Symbology::Color::Black;
    1124         ls->stroke()->width() = 2.0f;
     1219        ls->stroke()->color() = osgEarth::Symbology::Color(r, g, b);
     1220        ls->stroke()->width() = lineWidth;
    11251221#if 1
    11261222        osgEarth::Symbology::AltitudeSymbol *alt = style.getOrCreateSymbol<osgEarth::Symbology::AltitudeSymbol>();
     
    11391235        geomOpts.styles()->addStyle(style);
    11401236        geomOpts.enableLighting() = false;
     1237        geomOpts.minRange() = 0.f;
     1238        geomOpts.maxRange() = FLT_MAX;
     1239        if (objc > 10) {
     1240            float min, max;
     1241            if (GetFloatFromObj(interp, objv[10], &min) != TCL_OK ||
     1242                GetFloatFromObj(interp, objv[11], &max) != TCL_OK) {
     1243                return TCL_ERROR;
     1244            }
     1245            geomOpts.minRange() = min;
     1246            geomOpts.maxRange() = max;
     1247        }
    11411248        g_renderer->addModelLayer(name, geomOpts);
    11421249   } else if (type[0] == 't' && strcmp(type, "text") == 0) {
    11431250        osgEarth::Drivers::OGRFeatureOptions opts;
    1144         char *urlIn = Tcl_GetString(objv[4]);
     1251        char *urlIn = Tcl_GetString(objv[5]);
    11451252        std::string url = g_renderer->getCanonicalPath(std::string(urlIn));
    11461253        if (url.empty()) {
     
    11491256            return TCL_ERROR;
    11501257        }
    1151         char *content = Tcl_GetString(objv[5]);
    1152         char *priority = Tcl_GetString(objv[6]);
    1153         char *name = Tcl_GetString(objv[7]);
    1154 
    1155 #if 0
    1156         double fgR = 1.0, fgG = 1.0, fgB = 1.0;
    1157         double bgR = 0.0, bgG = 0.0, bgB = 0.0;
    1158         if (objc > 8) {
    1159             if (Tcl_GetDoubleFromObj(interp, objv[8], &fgR) != TCL_OK ||
    1160                 Tcl_GetDoubleFromObj(interp, objv[9], &fgG) != TCL_OK ||
    1161                 Tcl_GetDoubleFromObj(interp, objv[10], &fgB) != TCL_OK ||
    1162                 Tcl_GetDoubleFromObj(interp, objv[11], &bgR) != TCL_OK ||
    1163                 Tcl_GetDoubleFromObj(interp, objv[12], &bgG) != TCL_OK ||
    1164                 Tcl_GetDoubleFromObj(interp, objv[13], &bgB) != TCL_OK) {
    1165                 return TCL_ERROR;
    1166             }
    1167         }
    1168 #endif
     1258        char *content = Tcl_GetString(objv[6]);
     1259        char *priority = Tcl_GetString(objv[7]);
     1260        float fgR, fgG, fgB;
     1261        float bgR, bgG, bgB;
     1262        float haloWidth, ftSize;
     1263        if (GetFloatFromObj(interp, objv[8], &fgR) != TCL_OK ||
     1264            GetFloatFromObj(interp, objv[9], &fgG) != TCL_OK ||
     1265            GetFloatFromObj(interp, objv[10], &fgB) != TCL_OK ||
     1266            GetFloatFromObj(interp, objv[11], &bgR) != TCL_OK ||
     1267            GetFloatFromObj(interp, objv[12], &bgG) != TCL_OK ||
     1268            GetFloatFromObj(interp, objv[13], &bgB) != TCL_OK ||
     1269            GetFloatFromObj(interp, objv[14], &haloWidth) != TCL_OK ||
     1270            GetFloatFromObj(interp, objv[15], &ftSize) != TCL_OK) {
     1271            return TCL_ERROR;
     1272        }
     1273        bool removeDupes, declutter;
     1274        if (GetBooleanFromObj(interp, objv[16], &removeDupes) != TCL_OK ||
     1275            GetBooleanFromObj(interp, objv[17], &declutter) != TCL_OK) {
     1276            return TCL_ERROR;
     1277        }
    11691278        opts.url() = url;
    11701279
    11711280        osgEarth::Symbology::Style style;
    11721281        osgEarth::Symbology::TextSymbol *ts = style.getOrCreateSymbol<osgEarth::Symbology::TextSymbol>();
    1173         ts->halo()->color() = osgEarth::Symbology::Color::Black; //::Color(bgR, bgG, bgB);
    1174         ts->halo()->width() = 2.0f;
    1175         ts->fill()->color() = osgEarth::Symbology::Color::White; //::Color(fgR, fgG, fgB);
     1282        ts->halo()->color() = osgEarth::Symbology::Color(bgR, bgG, bgB);
     1283        ts->halo()->width() = haloWidth;
     1284        ts->fill()->color() = osgEarth::Symbology::Color(fgR, fgG, fgB);
    11761285        ts->content() = osgEarth::Symbology::StringExpression(content);
    11771286        ts->priority() = osgEarth::Symbology::NumericExpression(priority);
    1178         ts->removeDuplicateLabels() = true;
    1179         ts->size() = 16.0f;
     1287        ts->removeDuplicateLabels() = removeDupes;
     1288        //ts->font() = "Arial";
     1289        ts->size() = ftSize;
    11801290        ts->alignment() = osgEarth::Symbology::TextSymbol::ALIGN_CENTER_CENTER;
    1181         ts->declutter() = true;
     1291        ts->declutter() = declutter;
     1292        ts->encoding() = osgEarth::Symbology::TextSymbol::ENCODING_UTF8;
    11821293
    11831294        osgEarth::Symbology::RenderSymbol* rs = style.getOrCreateSymbol<osgEarth::Symbology::RenderSymbol>();
     
    11901301        geomOpts.styles()->addStyle(style);
    11911302        geomOpts.enableLighting() = false;
     1303        geomOpts.minRange() = 0.f;
     1304        geomOpts.maxRange() = FLT_MAX;
     1305        if (objc > 10) {
     1306            float min, max;
     1307            if (GetFloatFromObj(interp, objv[18], &min) != TCL_OK ||
     1308                GetFloatFromObj(interp, objv[19], &max) != TCL_OK) {
     1309                return TCL_ERROR;
     1310            }
     1311            geomOpts.minRange() = min;
     1312            geomOpts.maxRange() = max;
     1313        }
    11921314        g_renderer->addModelLayer(name, geomOpts);
    11931315    } else {
     
    13231445
    13241446static CmdSpec mapLayerOps[] = {
    1325     {"add",     1, MapLayerAddOp,       6, 0, "type driver ?url? ?args? name"},
     1447    {"add",     1, MapLayerAddOp,       6, 0, "name type driver ?url? ?args?"},
    13261448    {"delete",  1, MapLayerDeleteOp,    3, 4, "?name?"},
    13271449    {"move",    1, MapLayerMoveOp,      5, 5, "pos name"},
     
    15191641        return TCL_ERROR;
    15201642    }
    1521 
     1643    float color[3];
     1644    if (GetFloatFromObj(interp, objv[3], &color[0]) != TCL_OK ||
     1645        GetFloatFromObj(interp, objv[4], &color[1]) != TCL_OK ||
     1646        GetFloatFromObj(interp, objv[5], &color[2]) != TCL_OK) {
     1647        return TCL_ERROR;
     1648    }
     1649
     1650    osg::Vec4f bgColor(color[0],color[1],color[2],1);
    15221651    if (type == osgEarth::MapOptions::CSTYPE_PROJECTED) {
    1523         if (objc < 4) {
     1652        if (objc < 7) {
    15241653            Tcl_AppendResult(interp, "wrong # arguments: profile required for projected maps", (char*)NULL);
    15251654            return TCL_ERROR;
    15261655        }
    1527         char *profile = Tcl_GetString(objv[3]);
    1528         if (objc > 4) {
    1529             if (objc < 8) {
     1656        char *profile = Tcl_GetString(objv[6]);
     1657        if (objc > 7) {
     1658            if (objc < 11) {
    15301659                Tcl_AppendResult(interp, "wrong # arguments: 4 bounds arguments required", (char*)NULL);
    15311660                return TCL_ERROR;
     
    15331662            double bounds[4];
    15341663            for (int i = 0; i < 4; i++) {
    1535                 if (Tcl_GetDoubleFromObj(interp, objv[4+i], &bounds[i]) != TCL_OK) {
     1664                if (Tcl_GetDoubleFromObj(interp, objv[7+i], &bounds[i]) != TCL_OK) {
    15361665                    return TCL_ERROR;
    15371666                }
    15381667            }
     1668#if 1
    15391669            // Check if min > max
    15401670            if (bounds[0] > bounds[2] ||
     
    15791709                }
    15801710            }
    1581             g_renderer->resetMap(type, profile, bounds);
     1711#endif
     1712            g_renderer->resetMap(type, bgColor, profile, bounds);
    15821713        } else {
    15831714            if (osgEarth::Registry::instance()->getNamedProfile(profile) == NULL) {
     
    15861717                return TCL_ERROR;
    15871718            }
    1588             g_renderer->resetMap(type, profile);
     1719            g_renderer->resetMap(type, bgColor, profile);
    15891720        }
    15901721    } else {
    15911722        // No profile required for geocentric (3D) maps
    1592         g_renderer->resetMap(type);
     1723        g_renderer->resetMap(type, bgColor);
    15931724    }
    15941725
     
    16441775
    16451776static int
    1646 MapTerrainEdgesOp(ClientData clientData, Tcl_Interp *interp, int objc,
     1777MapTerrainColorOp(ClientData clientData, Tcl_Interp *interp, int objc,
    16471778                  Tcl_Obj *const *objv)
    1648 {
    1649     bool state;
    1650     if (GetBooleanFromObj(interp, objv[3], &state) != TCL_OK) {
    1651         return TCL_ERROR;
    1652     }
    1653     TRACE("Not implemented");
    1654     //g_renderer->setTerrainEdges(state);
    1655     return TCL_OK;
    1656 }
    1657 
    1658 static int
    1659 MapTerrainLightingOp(ClientData clientData, Tcl_Interp *interp, int objc,
    1660                      Tcl_Obj *const *objv)
    1661 {
    1662     bool state;
    1663     if (GetBooleanFromObj(interp, objv[3], &state) != TCL_OK) {
    1664         return TCL_ERROR;
    1665     }
    1666 
    1667     g_renderer->setTerrainLighting(state);
    1668     return TCL_OK;
    1669 }
    1670 
    1671 static int
    1672 MapTerrainLineColorOp(ClientData clientData, Tcl_Interp *interp, int objc,
    1673                       Tcl_Obj *const *objv)
    16741779{
    16751780    float color[3];
     
    16791784        return TCL_ERROR;
    16801785    }
    1681     TRACE("Not implemented");
    1682     //g_renderer->setTerrainLineColor(color);
     1786    g_renderer->setTerrainColor(osg::Vec4f(color[0],color[1],color[2],1));
     1787    return TCL_OK;
     1788}
     1789
     1790static int
     1791MapTerrainEdgesOp(ClientData clientData, Tcl_Interp *interp, int objc,
     1792                  Tcl_Obj *const *objv)
     1793{
     1794    bool state;
     1795    if (GetBooleanFromObj(interp, objv[3], &state) != TCL_OK) {
     1796        return TCL_ERROR;
     1797    }
     1798    g_renderer->setTerrainEdges(state);
     1799    return TCL_OK;
     1800}
     1801
     1802static int
     1803MapTerrainLightingOp(ClientData clientData, Tcl_Interp *interp, int objc,
     1804                     Tcl_Obj *const *objv)
     1805{
     1806    bool state;
     1807    if (GetBooleanFromObj(interp, objv[3], &state) != TCL_OK) {
     1808        return TCL_ERROR;
     1809    }
     1810
     1811    g_renderer->setTerrainLighting(state);
     1812    return TCL_OK;
     1813}
     1814
     1815static int
     1816MapTerrainLineColorOp(ClientData clientData, Tcl_Interp *interp, int objc,
     1817                      Tcl_Obj *const *objv)
     1818{
     1819    float color[3];
     1820    if (GetFloatFromObj(interp, objv[3], &color[0]) != TCL_OK ||
     1821        GetFloatFromObj(interp, objv[4], &color[1]) != TCL_OK ||
     1822        GetFloatFromObj(interp, objv[5], &color[2]) != TCL_OK) {
     1823        return TCL_ERROR;
     1824    }
     1825    g_renderer->setTerrainLineColor(osg::Vec4f(color[0], color[1], color[2],1));
     1826    return TCL_OK;
     1827}
     1828
     1829static int
     1830MapTerrainLineWidthOp(ClientData clientData, Tcl_Interp *interp, int objc,
     1831                      Tcl_Obj *const *objv)
     1832{
     1833    float width;
     1834    if (GetFloatFromObj(interp, objv[3], &width) != TCL_OK) {
     1835        return TCL_ERROR;
     1836    }
     1837    g_renderer->setTerrainLineWidth(width);
    16831838    return TCL_OK;
    16841839}
     
    17111866
    17121867static CmdSpec mapTerrainOps[] = {
     1868    {"color",     1, MapTerrainColorOp,     6, 6, "r g b"},
    17131869    {"edges",     1, MapTerrainEdgesOp,     4, 4, "bool"},
    17141870    {"lighting",  2, MapTerrainLightingOp,  4, 4, "bool"},
    1715     {"linecolor", 2, MapTerrainLineColorOp, 6, 6, "r g b"},
     1871    {"linecolor", 5, MapTerrainLineColorOp, 6, 6, "r g b"},
     1872    {"linewidth", 5, MapTerrainLineWidthOp, 4, 4, "val"},
    17161873    {"vertscale", 1, MapTerrainVertScaleOp, 4, 4, "val"},
    17171874    {"wireframe", 1, MapTerrainWireframeOp, 4, 4, "bool"},
     
    17781935    {"pin",      2, MapPinOp,             3, 0, "op ?params...?"},
    17791936    {"posdisp",  2, MapPositionDisplayOp, 3, 5, "bool ?format? ?precision?"},
    1780     {"reset",    1, MapResetOp,           3, 8, "type ?profile xmin ymin xmax ymax?"},
     1937    {"reset",    1, MapResetOp,           6, 11, "type r g b ?profile xmin ymin xmax ymax?"},
    17811938    {"scalebar", 1, MapScaleBarOp,        3, 4, "bool ?units?"},
    17821939    {"setpos",   1, MapSetPositionOp,     2, 4, "x y"},
     
    22932450    Tcl_CreateObjCommand(interp, "imgflush",       ImageFlushCmd,     clientData, NULL);
    22942451    Tcl_CreateObjCommand(interp, "key",            KeyCmd,            clientData, NULL);
     2452    Tcl_CreateObjCommand(interp, "legend",         LegendCmd,         clientData, NULL);
    22952453    Tcl_CreateObjCommand(interp, "map",            MapCmd,            clientData, NULL);
    22962454    Tcl_CreateObjCommand(interp, "mouse",          MouseCmd,          clientData, NULL);
     
    23102468    Tcl_DeleteCommand(interp, "imgflush");
    23112469    Tcl_DeleteCommand(interp, "key");
     2470    Tcl_DeleteCommand(interp, "legend");
    23122471    Tcl_DeleteCommand(interp, "map");
    23132472    Tcl_DeleteCommand(interp, "mouse");
  • geovis/trunk/geovis_protocol.txt

    r5026 r5105  
    7474clientinfo <list>
    7575
    76 colormap add <colorMapName> <colorMap> <opacityMap>
     76colormap add <colorMapName> <colorMap>
    7777         (Re-)define a colormap.  If colorMapName doesn't exist, it is created,
    7878         otherwise the colormap is redefined and all users will be updated.
    79          colorMap = Tcl list of {value r g b} control points
    80          opacityMap = Tcl list of {value alpha} control points
    81 colormap define <colorMapName> <colorMap> <opacityMap>
     79         colorMap = Tcl list of {value r g b a} control points
     80colormap define <colorMapName> <colorMap>
    8281         (Re-)define a colormap (same as 'add')
    8382colormap delete <?colorMapName?>
     
    159158
    160159Feature/model layers:
    161 map layer add point <url> <layerName>
     160map layer add point <url> <r> <g> <b> <size> <layerName>
    162161    Add a point feature layer from a file or URL
    163 map layer add polygon <url> <layerName>
     162map layer add polygon <url> <r> <g> <b> <width> <layerName>
    164163    Add a polygon feature layer from a file or URL
    165 map layer add line <url> <layerName>
     164map layer add line <url> <r> <g> <b> <width> <layerName>
    166165    Add a line feature layer from a file or URL
    167166map layer add text <url> <layerName>
     
    218217nv>image -type image -bytes <nbytes>
    219218  <binary RGB data>
     219nv>legend <colormapName> <rmin> <rmax> <nbytes>
     220  <binary RGB data>
    220221nv>map coords <token> <mapCoordList> <?srs?> <?verticalDatum?>
    221222   Reply to query of map coordinates from screen coordinates.  The mapCoordList
Note: See TracChangeset for help on using the changeset viewer.