Ignore:
Timestamp:
May 21, 2014 12:44:28 AM (10 years ago)
Author:
ldelgass
Message:

Add midpoint/sharpness to color/opacity control points

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/packages/vizservers/vtkvis/ColorMap.cpp

    r4073 r4358  
    143143{
    144144    _needsBuild = true;
    145     // Clamp value to [0,1]
     145    // Clamp value,midpoint,sharpness to [0,1]
    146146    if (cp.value < 0.0)
    147         cp.value = 0.0;
     147        cp.value = 0.0;
    148148    if (cp.value > 1.0)
    149         cp.value = 1.0;
     149        cp.value = 1.0;
     150    if (cp.midpoint < 0.0)
     151        cp.midpoint = 0.0;
     152    if (cp.midpoint > 1.0)
     153        cp.midpoint = 1.0;
     154    if (cp.sharpness < 0.0)
     155        cp.sharpness = 0.0;
     156    if (cp.sharpness > 1.0)
     157        cp.sharpness = 1.0;
    150158
    151159#ifdef DEBUG
    152     TRACE("New control point: %g = %g %g %g",
    153           cp.value, cp.color[0], cp.color[1], cp.color[2]);
     160    TRACE("New control point: %g = %g %g %g, %g %g",
     161          cp.value, cp.color[0], cp.color[1], cp.color[2],
     162          cp.midpoint, cp.sharpness);
    154163#endif
    155164    for (std::list<ControlPoint>::iterator itr = _controlPoints.begin();
    156         itr != _controlPoints.end(); ++itr) {
    157         if (itr->value == cp.value) {
    158             *itr = cp;
    159             return;
    160         } else if (itr->value > cp.value) {
    161             _controlPoints.insert(itr, cp);
    162             return;
    163         }
     165        itr != _controlPoints.end(); ++itr) {
     166        if (itr->value == cp.value) {
     167            *itr = cp;
     168            return;
     169        } else if (itr->value > cp.value) {
     170            _controlPoints.insert(itr, cp);
     171            return;
     172        }
    164173    }
    165174    // If we reach here, our control point goes at the end
    166175    _controlPoints.insert(_controlPoints.end(), cp);
    167     _colorTF->AddRGBPoint(cp.value, cp.color[0], cp.color[1], cp.color[2]);
     176    _colorTF->AddRGBPoint(cp.value, cp.color[0], cp.color[1], cp.color[2],
     177                          cp.midpoint, cp.sharpness);
    168178}
    169179
     
    174184{
    175185    _needsBuild = true;
    176     // Clamp value to [0,1]
     186    // Clamp value,midpoint,sharpness to [0,1]
    177187    if (cp.value < 0.0)
    178         cp.value = 0.0;
     188        cp.value = 0.0;
    179189    if (cp.value > 1.0)
    180         cp.value = 1.0;
     190        cp.value = 1.0;
     191    if (cp.midpoint < 0.0)
     192        cp.midpoint = 0.0;
     193    if (cp.midpoint > 1.0)
     194        cp.midpoint = 1.0;
     195    if (cp.sharpness < 0.0)
     196        cp.sharpness = 0.0;
     197    if (cp.sharpness > 1.0)
     198        cp.sharpness = 1.0;
    181199
    182200#ifdef DEBUG
    183     TRACE("New opacity control point: %g = %g",
    184           cp.value, cp.alpha);
     201    TRACE("New opacity control point: %g = %g, %g %g",
     202          cp.value, cp.alpha, cp.midpoint, cp.sharpness);
    185203#endif
    186204    for (std::list<OpacityControlPoint>::iterator itr = _opacityControlPoints.begin();
    187         itr != _opacityControlPoints.end(); ++itr) {
    188         if (itr->value == cp.value) {
    189             *itr = cp;
    190             return;
    191         } else if (itr->value > cp.value) {
    192             _opacityControlPoints.insert(itr, cp);
    193             return;
    194         }
     205        itr != _opacityControlPoints.end(); ++itr) {
     206        if (itr->value == cp.value) {
     207            *itr = cp;
     208            return;
     209        } else if (itr->value > cp.value) {
     210            _opacityControlPoints.insert(itr, cp);
     211            return;
     212        }
    195213    }
    196214    // If we reach here, our control point goes at the end
    197215    _opacityControlPoints.insert(_opacityControlPoints.end(), cp);
    198     _opacityTF->AddPoint(cp.value, cp.alpha);
     216    _opacityTF->AddPoint(cp.value, cp.alpha, cp.midpoint, cp.sharpness);
    199217}
    200218
     
    209227{
    210228    if (numEntries != _numTableEntries) {
    211         _needsBuild = true;
    212         _numTableEntries = numEntries;
    213         if (_lookupTable != NULL) {
    214             build();
    215         }
     229        _needsBuild = true;
     230        _numTableEntries = numEntries;
     231        if (_lookupTable != NULL) {
     232            build();
     233        }
    216234    }
    217235}
     
    228246    return _numTableEntries;
    229247}
    230 
     248#if 0
    231249/**
    232250 * \brief Build the lookup table from the control points in the transfer
     
    236254{
    237255    if (!_needsBuild)
    238         return;
     256        return;
    239257
    240258    TRACE("%s", _name.c_str());
    241259
    242260    if (_lookupTable == NULL) {
    243         _lookupTable = vtkSmartPointer<vtkLookupTable>::New();
     261        _lookupTable = vtkSmartPointer<vtkLookupTable>::New();
    244262    }
    245263
     
    252270    // constant range up to first specified cp
    253271    if (itr->value > 0.0) {
    254         ControlPoint cp = *itr;
    255         cp.value = 0.0;
    256         itr = _controlPoints.insert(itr, cp);
     272        ControlPoint cp = *itr;
     273        cp.value = 0.0;
     274        itr = _controlPoints.insert(itr, cp);
    257275    }
    258276    if (oitr->value > 0.0) {
    259         OpacityControlPoint ocp = *oitr;
    260         ocp.value = 0.0;
    261         oitr = _opacityControlPoints.insert(oitr, ocp);
     277        OpacityControlPoint ocp = *oitr;
     278        ocp.value = 0.0;
     279        oitr = _opacityControlPoints.insert(oitr, ocp);
    262280    }
    263281
     
    268286
    269287    for (int i = 0; i < _numTableEntries; i++) {
    270         double value = _numTableEntries < 2 ? 0.0 : ((double)i)/(_numTableEntries-1);
     288        double value = _numTableEntries < 2 ? 0.0 : ((double)i)/(_numTableEntries-1);
    271289        double color[4];
    272         while (itr2 != _controlPoints.end() && value > itr2->value) {
    273             itr = itr2;
    274             itr2++;
    275         }
    276         while (oitr2 != _opacityControlPoints.end() && value > oitr2->value) {
    277             oitr = oitr2;
    278             oitr2++;
    279         }
    280         if (itr2 == _controlPoints.end()) {
     290        while (itr2 != _controlPoints.end() && value > itr2->value) {
     291            itr = itr2;
     292            itr2++;
     293        }
     294        while (oitr2 != _opacityControlPoints.end() && value > oitr2->value) {
     295            oitr = oitr2;
     296            oitr2++;
     297        }
     298        if (itr2 == _controlPoints.end()) {
    281299#ifdef DEBUG
    282             TRACE("val: %g Range: %g - 1 Color: %g %g %g", value, itr->value,
    283                   itr->color[0], itr->color[1], itr->color[2]);
     300            TRACE("val: %g Range: %g - 1 Color: %g %g %g", value, itr->value,
     301                  itr->color[0], itr->color[1], itr->color[2]);
    284302#endif
    285303            memcpy(color, itr->color, sizeof(double)*3);
    286         } else {
    287             assert(itr->value < itr2->value);
    288             assert(value >= itr->value && value <= itr2->value);
    289             lerp(color, *itr, *itr2, value);
     304        } else {
     305            assert(itr->value < itr2->value);
     306            assert(value >= itr->value && value <= itr2->value);
     307            lerp(color, *itr, *itr2, value);
    290308#ifdef DEBUG
    291             TRACE("val: %g Range: %g - %g Color: %g %g %g", value, itr->value, itr2->value,
    292                   color[0], color[1], color[2]);
     309            TRACE("val: %g Range: %g - %g Color: %g %g %g", value, itr->value, itr2->value,
     310                  color[0], color[1], color[2]);
    293311#endif
    294         }
    295         if (oitr2 == _opacityControlPoints.end()) {
     312        }
     313        if (oitr2 == _opacityControlPoints.end()) {
    296314#ifdef DEBUG
    297             TRACE("val: %g Range: %g - 1 Alpha %g", value, oitr->value,
    298                   oitr->alpha);
     315            TRACE("val: %g Range: %g - 1 Alpha %g", value, oitr->value,
     316                  oitr->alpha);
    299317#endif
    300318            color[3] = oitr->alpha;
    301         } else {
    302             assert(oitr->value < oitr2->value);
    303             assert(value >= oitr->value && value <= oitr2->value);
    304             lerp(&color[3], *oitr, *oitr2, value);
     319        } else {
     320            assert(oitr->value < oitr2->value);
     321            assert(value >= oitr->value && value <= oitr2->value);
     322            lerp(&color[3], *oitr, *oitr2, value);
    305323#ifdef DEBUG
    306             TRACE("val: %g Range: %g - %g Alpha: %g", value, oitr->value, oitr2->value,
    307                   color[3]);
     324            TRACE("val: %g Range: %g - %g Alpha: %g", value, oitr->value, oitr2->value,
     325                  color[3]);
    308326#endif
    309         }
     327        }
    310328        _lookupTable->SetTableValue(i, color);
    311329    }
     
    313331    TRACE("Leave");
    314332}
    315 
     333#else
     334/**
     335 * \brief Build the lookup table from the control points in the transfer
     336 * function
     337 */
     338void ColorMap::build()
     339{
     340    if (!_needsBuild)
     341        return;
     342
     343    TRACE("%s", _name.c_str());
     344
     345    if (_lookupTable == NULL) {
     346        _lookupTable = vtkSmartPointer<vtkLookupTable>::New();
     347    }
     348
     349    _lookupTable->SetNumberOfTableValues(_numTableEntries);
     350
     351    double colorTable[_numTableEntries*3];
     352    _colorTF->GetTable(0., 1., _numTableEntries, colorTable);
     353    double opacityTable[_numTableEntries];
     354    _opacityTF->GetTable(0., 1., _numTableEntries, opacityTable, 1);
     355
     356    for (int i = 0; i < _numTableEntries; i++) {
     357        //double value = _numTableEntries < 2 ? 0.0 : ((double)i)/(_numTableEntries-1);
     358        double color[4];
     359        memcpy(color, colorTable+i*3, sizeof(double)*3);
     360        color[3] = opacityTable[i];
     361        _lookupTable->SetTableValue(i, color);
     362    }
     363    _needsBuild = false;
     364    TRACE("Leave");
     365}
     366#endif
    316367/**
    317368 * \brief Perform linear interpolation of two color control points
     
    324375    double factor = (value - cp1.value) / (cp2.value - cp1.value);
    325376    for (int i = 0; i < 3; i++) {
    326         result[i] = cp1.color[i] * (1.0 - factor) + cp2.color[i] * factor;
     377        result[i] = cp1.color[i] * (1.0 - factor) + cp2.color[i] * factor;
    327378    }
    328379}
     
    384435    cp[4].color[2] = 0.0;
    385436    for (int i = 0; i < 5; i++) {
    386         _default->addControlPoint(cp[i]);
     437        _default->addControlPoint(cp[i]);
    387438    }
    388439    OpacityControlPoint ocp[2];
     
    462513    cp[4].color[2] = 0.0;
    463514    for (int i = 0; i < 5; i++) {
    464         _volumeDefault->addControlPoint(cp[i]);
     515        _volumeDefault->addControlPoint(cp[i]);
    465516    }
    466517    OpacityControlPoint ocp[2];
Note: See TracChangeset for help on using the changeset viewer.