Browse Source

Add colormap option to set_data + update jet implementation. (#1372)

* Add cmap option to set_data + fix jet colormap.

* Switch from jet to turbo.

* Add explicit turbo colormap.

* Add option for number of intervals in colormap.

* Switch to Viridis as default.
Jérémie Dumas 6 years ago
parent
commit
77ed6247cb

+ 267 - 5
include/igl/colormap.cpp

@@ -6,7 +6,6 @@
 // v. 2.0. If a copy of the MPL was not distributed with this file, You can
 // obtain one at http://mozilla.org/MPL/2.0/.
 #include "colormap.h"
-#include "jet.h"
 #include <algorithm>
 
 // One of the new matplotlib colormaps by Nathaniel J.Smith, Stefan van der Walt, and (in the case of viridis) Eric Firing.
@@ -14,6 +13,266 @@
 
 namespace igl
 {
+
+static double turbo_cm[256][3] = {
+  {0.18995,0.07176,0.23217},
+  {0.19483,0.08339,0.26149},
+  {0.19956,0.09498,0.29024},
+  {0.20415,0.10652,0.31844},
+  {0.20860,0.11802,0.34607},
+  {0.21291,0.12947,0.37314},
+  {0.21708,0.14087,0.39964},
+  {0.22111,0.15223,0.42558},
+  {0.22500,0.16354,0.45096},
+  {0.22875,0.17481,0.47578},
+  {0.23236,0.18603,0.50004},
+  {0.23582,0.19720,0.52373},
+  {0.23915,0.20833,0.54686},
+  {0.24234,0.21941,0.56942},
+  {0.24539,0.23044,0.59142},
+  {0.24830,0.24143,0.61286},
+  {0.25107,0.25237,0.63374},
+  {0.25369,0.26327,0.65406},
+  {0.25618,0.27412,0.67381},
+  {0.25853,0.28492,0.69300},
+  {0.26074,0.29568,0.71162},
+  {0.26280,0.30639,0.72968},
+  {0.26473,0.31706,0.74718},
+  {0.26652,0.32768,0.76412},
+  {0.26816,0.33825,0.78050},
+  {0.26967,0.34878,0.79631},
+  {0.27103,0.35926,0.81156},
+  {0.27226,0.36970,0.82624},
+  {0.27334,0.38008,0.84037},
+  {0.27429,0.39043,0.85393},
+  {0.27509,0.40072,0.86692},
+  {0.27576,0.41097,0.87936},
+  {0.27628,0.42118,0.89123},
+  {0.27667,0.43134,0.90254},
+  {0.27691,0.44145,0.91328},
+  {0.27701,0.45152,0.92347},
+  {0.27698,0.46153,0.93309},
+  {0.27680,0.47151,0.94214},
+  {0.27648,0.48144,0.95064},
+  {0.27603,0.49132,0.95857},
+  {0.27543,0.50115,0.96594},
+  {0.27469,0.51094,0.97275},
+  {0.27381,0.52069,0.97899},
+  {0.27273,0.53040,0.98461},
+  {0.27106,0.54015,0.98930},
+  {0.26878,0.54995,0.99303},
+  {0.26592,0.55979,0.99583},
+  {0.26252,0.56967,0.99773},
+  {0.25862,0.57958,0.99876},
+  {0.25425,0.58950,0.99896},
+  {0.24946,0.59943,0.99835},
+  {0.24427,0.60937,0.99697},
+  {0.23874,0.61931,0.99485},
+  {0.23288,0.62923,0.99202},
+  {0.22676,0.63913,0.98851},
+  {0.22039,0.64901,0.98436},
+  {0.21382,0.65886,0.97959},
+  {0.20708,0.66866,0.97423},
+  {0.20021,0.67842,0.96833},
+  {0.19326,0.68812,0.96190},
+  {0.18625,0.69775,0.95498},
+  {0.17923,0.70732,0.94761},
+  {0.17223,0.71680,0.93981},
+  {0.16529,0.72620,0.93161},
+  {0.15844,0.73551,0.92305},
+  {0.15173,0.74472,0.91416},
+  {0.14519,0.75381,0.90496},
+  {0.13886,0.76279,0.89550},
+  {0.13278,0.77165,0.88580},
+  {0.12698,0.78037,0.87590},
+  {0.12151,0.78896,0.86581},
+  {0.11639,0.79740,0.85559},
+  {0.11167,0.80569,0.84525},
+  {0.10738,0.81381,0.83484},
+  {0.10357,0.82177,0.82437},
+  {0.10026,0.82955,0.81389},
+  {0.09750,0.83714,0.80342},
+  {0.09532,0.84455,0.79299},
+  {0.09377,0.85175,0.78264},
+  {0.09287,0.85875,0.77240},
+  {0.09267,0.86554,0.76230},
+  {0.09320,0.87211,0.75237},
+  {0.09451,0.87844,0.74265},
+  {0.09662,0.88454,0.73316},
+  {0.09958,0.89040,0.72393},
+  {0.10342,0.89600,0.71500},
+  {0.10815,0.90142,0.70599},
+  {0.11374,0.90673,0.69651},
+  {0.12014,0.91193,0.68660},
+  {0.12733,0.91701,0.67627},
+  {0.13526,0.92197,0.66556},
+  {0.14391,0.92680,0.65448},
+  {0.15323,0.93151,0.64308},
+  {0.16319,0.93609,0.63137},
+  {0.17377,0.94053,0.61938},
+  {0.18491,0.94484,0.60713},
+  {0.19659,0.94901,0.59466},
+  {0.20877,0.95304,0.58199},
+  {0.22142,0.95692,0.56914},
+  {0.23449,0.96065,0.55614},
+  {0.24797,0.96423,0.54303},
+  {0.26180,0.96765,0.52981},
+  {0.27597,0.97092,0.51653},
+  {0.29042,0.97403,0.50321},
+  {0.30513,0.97697,0.48987},
+  {0.32006,0.97974,0.47654},
+  {0.33517,0.98234,0.46325},
+  {0.35043,0.98477,0.45002},
+  {0.36581,0.98702,0.43688},
+  {0.38127,0.98909,0.42386},
+  {0.39678,0.99098,0.41098},
+  {0.41229,0.99268,0.39826},
+  {0.42778,0.99419,0.38575},
+  {0.44321,0.99551,0.37345},
+  {0.45854,0.99663,0.36140},
+  {0.47375,0.99755,0.34963},
+  {0.48879,0.99828,0.33816},
+  {0.50362,0.99879,0.32701},
+  {0.51822,0.99910,0.31622},
+  {0.53255,0.99919,0.30581},
+  {0.54658,0.99907,0.29581},
+  {0.56026,0.99873,0.28623},
+  {0.57357,0.99817,0.27712},
+  {0.58646,0.99739,0.26849},
+  {0.59891,0.99638,0.26038},
+  {0.61088,0.99514,0.25280},
+  {0.62233,0.99366,0.24579},
+  {0.63323,0.99195,0.23937},
+  {0.64362,0.98999,0.23356},
+  {0.65394,0.98775,0.22835},
+  {0.66428,0.98524,0.22370},
+  {0.67462,0.98246,0.21960},
+  {0.68494,0.97941,0.21602},
+  {0.69525,0.97610,0.21294},
+  {0.70553,0.97255,0.21032},
+  {0.71577,0.96875,0.20815},
+  {0.72596,0.96470,0.20640},
+  {0.73610,0.96043,0.20504},
+  {0.74617,0.95593,0.20406},
+  {0.75617,0.95121,0.20343},
+  {0.76608,0.94627,0.20311},
+  {0.77591,0.94113,0.20310},
+  {0.78563,0.93579,0.20336},
+  {0.79524,0.93025,0.20386},
+  {0.80473,0.92452,0.20459},
+  {0.81410,0.91861,0.20552},
+  {0.82333,0.91253,0.20663},
+  {0.83241,0.90627,0.20788},
+  {0.84133,0.89986,0.20926},
+  {0.85010,0.89328,0.21074},
+  {0.85868,0.88655,0.21230},
+  {0.86709,0.87968,0.21391},
+  {0.87530,0.87267,0.21555},
+  {0.88331,0.86553,0.21719},
+  {0.89112,0.85826,0.21880},
+  {0.89870,0.85087,0.22038},
+  {0.90605,0.84337,0.22188},
+  {0.91317,0.83576,0.22328},
+  {0.92004,0.82806,0.22456},
+  {0.92666,0.82025,0.22570},
+  {0.93301,0.81236,0.22667},
+  {0.93909,0.80439,0.22744},
+  {0.94489,0.79634,0.22800},
+  {0.95039,0.78823,0.22831},
+  {0.95560,0.78005,0.22836},
+  {0.96049,0.77181,0.22811},
+  {0.96507,0.76352,0.22754},
+  {0.96931,0.75519,0.22663},
+  {0.97323,0.74682,0.22536},
+  {0.97679,0.73842,0.22369},
+  {0.98000,0.73000,0.22161},
+  {0.98289,0.72140,0.21918},
+  {0.98549,0.71250,0.21650},
+  {0.98781,0.70330,0.21358},
+  {0.98986,0.69382,0.21043},
+  {0.99163,0.68408,0.20706},
+  {0.99314,0.67408,0.20348},
+  {0.99438,0.66386,0.19971},
+  {0.99535,0.65341,0.19577},
+  {0.99607,0.64277,0.19165},
+  {0.99654,0.63193,0.18738},
+  {0.99675,0.62093,0.18297},
+  {0.99672,0.60977,0.17842},
+  {0.99644,0.59846,0.17376},
+  {0.99593,0.58703,0.16899},
+  {0.99517,0.57549,0.16412},
+  {0.99419,0.56386,0.15918},
+  {0.99297,0.55214,0.15417},
+  {0.99153,0.54036,0.14910},
+  {0.98987,0.52854,0.14398},
+  {0.98799,0.51667,0.13883},
+  {0.98590,0.50479,0.13367},
+  {0.98360,0.49291,0.12849},
+  {0.98108,0.48104,0.12332},
+  {0.97837,0.46920,0.11817},
+  {0.97545,0.45740,0.11305},
+  {0.97234,0.44565,0.10797},
+  {0.96904,0.43399,0.10294},
+  {0.96555,0.42241,0.09798},
+  {0.96187,0.41093,0.09310},
+  {0.95801,0.39958,0.08831},
+  {0.95398,0.38836,0.08362},
+  {0.94977,0.37729,0.07905},
+  {0.94538,0.36638,0.07461},
+  {0.94084,0.35566,0.07031},
+  {0.93612,0.34513,0.06616},
+  {0.93125,0.33482,0.06218},
+  {0.92623,0.32473,0.05837},
+  {0.92105,0.31489,0.05475},
+  {0.91572,0.30530,0.05134},
+  {0.91024,0.29599,0.04814},
+  {0.90463,0.28696,0.04516},
+  {0.89888,0.27824,0.04243},
+  {0.89298,0.26981,0.03993},
+  {0.88691,0.26152,0.03753},
+  {0.88066,0.25334,0.03521},
+  {0.87422,0.24526,0.03297},
+  {0.86760,0.23730,0.03082},
+  {0.86079,0.22945,0.02875},
+  {0.85380,0.22170,0.02677},
+  {0.84662,0.21407,0.02487},
+  {0.83926,0.20654,0.02305},
+  {0.83172,0.19912,0.02131},
+  {0.82399,0.19182,0.01966},
+  {0.81608,0.18462,0.01809},
+  {0.80799,0.17753,0.01660},
+  {0.79971,0.17055,0.01520},
+  {0.79125,0.16368,0.01387},
+  {0.78260,0.15693,0.01264},
+  {0.77377,0.15028,0.01148},
+  {0.76476,0.14374,0.01041},
+  {0.75556,0.13731,0.00942},
+  {0.74617,0.13098,0.00851},
+  {0.73661,0.12477,0.00769},
+  {0.72686,0.11867,0.00695},
+  {0.71692,0.11268,0.00629},
+  {0.70680,0.10680,0.00571},
+  {0.69650,0.10102,0.00522},
+  {0.68602,0.09536,0.00481},
+  {0.67535,0.08980,0.00449},
+  {0.66449,0.08436,0.00424},
+  {0.65345,0.07902,0.00408},
+  {0.64223,0.07380,0.00401},
+  {0.63082,0.06868,0.00401},
+  {0.61923,0.06367,0.00410},
+  {0.60746,0.05878,0.00427},
+  {0.59550,0.05399,0.00453},
+  {0.58336,0.04931,0.00486},
+  {0.57103,0.04474,0.00529},
+  {0.55852,0.04028,0.00579},
+  {0.54583,0.03593,0.00638},
+  {0.53295,0.03169,0.00705},
+  {0.51989,0.02756,0.00780},
+  {0.50664,0.02354,0.00863},
+  {0.49321,0.01963,0.00955},
+  {0.47960,0.01583,0.01055}
+};
+
 static double inferno_cm[256][3] = {
   { 0.001462, 0.000466, 0.013866 },
   { 0.002267, 0.001270, 0.018570 },
@@ -1320,13 +1579,16 @@ template <typename T>
 IGL_INLINE void igl::colormap(
   const ColorMapType cm, const T x_in, T & r, T & g, T & b)
 {
-  switch (cm) 
+  switch (cm)
   {
     case COLOR_MAP_TYPE_INFERNO:
       colormap(inferno_cm, x_in, r, g, b);
       break;
     case COLOR_MAP_TYPE_JET:
-      jet(x_in, r, g, b);
+      // jet is bad so we use turbo instead
+      // https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html
+    case COLOR_MAP_TYPE_TURBO:
+      colormap(turbo_cm, x_in, r, g, b);
       break;
     case COLOR_MAP_TYPE_MAGMA:
       colormap(magma_cm, x_in, r, g, b);
@@ -1340,7 +1602,7 @@ IGL_INLINE void igl::colormap(
     case COLOR_MAP_TYPE_VIRIDIS:
       colormap(viridis_cm, x_in, r, g, b);
       break;
-    default: 
+    default:
       throw std::invalid_argument("igl::colormap(): Selected colormap is unsupported!");
       break;
   }
@@ -1431,5 +1693,5 @@ template void igl::colormap<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matri
 template void igl::colormap<Eigen::Array<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(igl::ColorMapType, Eigen::MatrixBase<Eigen::Array<int, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
 
 template void igl::colormap<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(igl::ColorMapType, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);
-template void igl::colormap<Eigen::CwiseUnaryOp<Eigen::internal::scalar_opposite_op<double>, Eigen::Matrix<double, -1, 1, 0, -1, 1> const>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(igl::ColorMapType, Eigen::MatrixBase<Eigen::CwiseUnaryOp<Eigen::internal::scalar_opposite_op<double>, Eigen::Matrix<double, -1, 1, 0, -1, 1> const> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::colormap<float>(igl::ColorMapType, float, float&, float&, float&);
 #endif

+ 6 - 5
include/igl/colormap.h

@@ -1,9 +1,9 @@
 // This file is part of libigl, a simple c++ geometry processing library.
-// 
+//
 // Copyright (C) 2017 Joe Graus <[email protected]>, Alec Jacobson <[email protected]>
-// 
-// This Source Code Form is subject to the terms of the Mozilla Public License 
-// v. 2.0. If a copy of the MPL was not distributed with this file, You can 
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
 // obtain one at http://mozilla.org/MPL/2.0/.
 
 #ifndef IGL_COLORMAP_H
@@ -22,7 +22,8 @@ namespace igl {
     COLOR_MAP_TYPE_PARULA = 3,
     COLOR_MAP_TYPE_PLASMA = 4,
     COLOR_MAP_TYPE_VIRIDIS = 5,
-    NUM_COLOR_MAP_TYPES = 6
+    COLOR_MAP_TYPE_TURBO = 6,
+    NUM_COLOR_MAP_TYPES = 7
   };
   // Comput [r,g,b] values of the selected colormap for
   // a given factor f between 0 and 1

+ 3 - 38
include/igl/jet.cpp

@@ -11,48 +11,13 @@
 template <typename T>
 IGL_INLINE void igl::jet(const T x, T * rgb)
 {
-  igl::colormap(igl::COLOR_MAP_TYPE_JET, x, rgb);
+  igl::colormap(igl::COLOR_MAP_TYPE_JET,x, rgb);
 }
 
 template <typename T>
-IGL_INLINE void igl::jet(const T x_in, T & r, T & g, T & b)
+IGL_INLINE void igl::jet(const T f, T & r, T & g, T & b)
 {
-  // Only important if the number of colors is small. In which case the rest is
-  // still wrong anyway
-  // x = linspace(0,1,jj)' * (1-1/jj) + 1/jj;
-  //
-  const double rone = 0.8;
-  const double gone = 1.0;
-  const double bone = 1.0;
-  T x = x_in;
-  x = (x_in<0 ? 0 : (x>1 ? 1 : x));
-
-  if (x<1. / 8.)
-  {
-    r = 0;
-    g = 0;
-    b = bone*(0.5 + (x) / (1. / 8.)*0.5);
-  } else if (x<3. / 8.)
-  {
-    r = 0;
-    g = gone*(x - 1. / 8.) / (3. / 8. - 1. / 8.);
-    b = bone;
-  } else if (x<5. / 8.)
-  {
-    r = rone*(x - 3. / 8.) / (5. / 8. - 3. / 8.);
-    g = gone;
-    b = (bone - (x - 3. / 8.) / (5. / 8. - 3. / 8.));
-  } else if (x<7. / 8.)
-  {
-    r = T(rone);
-    g = (gone - (x - 5. / 8.) / (7. / 8. - 5. / 8.));
-    b = 0;
-  } else
-  {
-    r = (rone - (x - 7. / 8.) / (1. - 7. / 8.)*0.5);
-    g = 0;
-    b = 0;
-  }
+  igl::colormap(igl::COLOR_MAP_TYPE_JET, f, r, g, b);
 }
 
 template <typename DerivedZ, typename DerivedC>

+ 9 - 6
include/igl/jet.h

@@ -1,9 +1,9 @@
 // This file is part of libigl, a simple c++ geometry processing library.
-// 
+//
 // Copyright (C) 2013 Alec Jacobson <[email protected]>
-// 
-// This Source Code Form is subject to the terms of the Mozilla Public License 
-// v. 2.0. If a copy of the MPL was not distributed with this file, You can 
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
 // obtain one at http://mozilla.org/MPL/2.0/.
 #ifndef IGL_JET_H
 #define IGL_JET_H
@@ -13,10 +13,13 @@
 //#endif
 namespace igl
 {
-  // JET like MATLAB's jet
+  // JET like MATLAB's jet.
+  //
+  // Note that we actually use the Turbo colormap instead, since jet is a bad colormap:
+  // https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html
   //
   // Inputs:
-  //   m  number of colors 
+  //   m  number of colors
   // Outputs:
   //   J  m by list of RGB colors between 0 and 1
   //

+ 15 - 15
include/igl/opengl/ViewerData.cpp

@@ -11,7 +11,6 @@
 
 #include "../per_face_normals.h"
 #include "../material_colors.h"
-#include "../parula.h"
 #include "../per_vertex_normals.h"
 
 // Really? Just for GL_NEAREST?
@@ -22,12 +21,11 @@
 
 IGL_INLINE igl::opengl::ViewerData::ViewerData()
 : dirty(MeshGL::DIRTY_ALL),
-  // UINT_MAX sets all bits to 1 so these defaults get applied to all view cores
-  show_faces        (UINT_MAX),
-  show_lines        (UINT_MAX),
+  show_faces        (~unsigned(0)),
+  show_lines        (~unsigned(0)),
   invert_normals    (false),
-  show_overlay      (UINT_MAX),
-  show_overlay_depth(UINT_MAX),
+  show_overlay      (~unsigned(0)),
+  show_overlay_depth(~unsigned(0)),
   show_vertid       (false),
   show_faceid       (false),
   show_labels       (false),
@@ -38,7 +36,7 @@ IGL_INLINE igl::opengl::ViewerData::ViewerData()
   label_color(0,0,0.04,1),
   shininess(35.0f),
   id(-1),
-  is_visible        (UINT_MAX)
+  is_visible        (~unsigned(0))
 {
   clear();
 };
@@ -265,24 +263,26 @@ IGL_INLINE void igl::opengl::ViewerData::set_texture(
 }
 
 IGL_INLINE void igl::opengl::ViewerData::set_data(
-  const double caxis_min,
-  const double caxis_max,
-  const Eigen::VectorXd & D)
+  const Eigen::VectorXd & D,
+  double caxis_min,
+  double caxis_max,
+  igl::ColorMapType cmap,
+  int num_steps)
 {
   if(!show_texture)
   {
     Eigen::MatrixXd CM;
-    igl::parula(Eigen::VectorXd::LinSpaced(21,0,1).eval(),false,CM);
+    igl::colormap(cmap,Eigen::VectorXd::LinSpaced(num_steps,0,1).eval(),0,1,CM);
     set_colormap(CM);
-  } 
+  }
   set_uv(((D.array()-caxis_min)/(caxis_max-caxis_min)).replicate(1,2));
 }
 
-IGL_INLINE void igl::opengl::ViewerData::set_data( const Eigen::VectorXd & D)
+IGL_INLINE void igl::opengl::ViewerData::set_data(const Eigen::VectorXd & D, igl::ColorMapType cmap, int num_steps)
 {
   const double caxis_min = D.minCoeff();
   const double caxis_max = D.maxCoeff();
-  return set_data(caxis_min,caxis_max,D);
+  return set_data(D,caxis_min,caxis_max,cmap,num_steps);
 }
 
 IGL_INLINE void igl::opengl::ViewerData::set_colormap(const Eigen::MatrixXd & CM)
@@ -293,7 +293,7 @@ IGL_INLINE void igl::opengl::ViewerData::set_colormap(const Eigen::MatrixXd & CM
     (CM.col(0)*255.0).cast<unsigned char>();
   const Eigen::Matrix<unsigned char,Eigen::Dynamic, Eigen::Dynamic> G =
     (CM.col(1)*255.0).cast<unsigned char>();
-  const Eigen::Matrix<unsigned char,Eigen::Dynamic, Eigen::Dynamic> B = 
+  const Eigen::Matrix<unsigned char,Eigen::Dynamic, Eigen::Dynamic> B =
     (CM.col(2)*255.0).cast<unsigned char>();
   set_colors(Eigen::RowVector3d(1,1,1));
   set_texture(R,G,B);

+ 20 - 6
include/igl/opengl/ViewerData.h

@@ -8,8 +8,9 @@
 #ifndef IGL_VIEWERDATA_H
 #define IGL_VIEWERDATA_H
 
-#include "../igl_inline.h"
 #include "MeshGL.h"
+#include <igl/igl_inline.h>
+#include <igl/colormap.h>
 #include <cassert>
 #include <cstdint>
 #include <Eigen/Core>
@@ -60,17 +61,20 @@ public:
   // Inputs:
   //   C  #V|#F|1 by 3 list of colors
   IGL_INLINE void set_colors(const Eigen::MatrixXd &C);
+
   // Set per-vertex UV coordinates
   //
   // Inputs:
   //   UV  #V by 2 list of UV coordinates (indexed by F)
   IGL_INLINE void set_uv(const Eigen::MatrixXd& UV);
+
   // Set per-corner UV coordinates
   //
   // Inputs:
   //   UV_V  #UV by 2 list of UV coordinates
   //   UV_F  #F by 3 list of UV indices into UV_V
   IGL_INLINE void set_uv(const Eigen::MatrixXd& UV_V, const Eigen::MatrixXi& UV_F);
+
   // Set the texture associated with the mesh.
   //
   // Inputs:
@@ -82,6 +86,7 @@ public:
     const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& R,
     const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& G,
     const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& B);
+
   // Set the texture associated with the mesh.
   //
   // Inputs:
@@ -95,20 +100,29 @@ public:
     const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& G,
     const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& B,
     const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& A);
+
   // Set pseudo-colorable scalar data associated with the mesh.
   //
   // Inputs:
   //   caxis_min  caxis minimum bound
   //   caxis_max  caxis maximum bound
-  //   D  #V by 3 list of colors
+  //   D  #V by 1 list of scalar values
+  //   cmap colormap type
+  //   num_steps number of intervals to discretize the colormap
   //
   // To-do: support #F by 1 per-face data
   IGL_INLINE void set_data(
-    const double caxis_min, 
-    const double caxis_max, 
-    const Eigen::VectorXd & D);
+    const Eigen::VectorXd & D,
+    double caxis_min,
+    double caxis_max,
+    igl::ColorMapType cmap = igl::COLOR_MAP_TYPE_VIRIDIS,
+    int num_steps = 21);
+
   // Use min(D) and max(D) to set caxis.
-  IGL_INLINE void set_data(const Eigen::VectorXd & D);
+  IGL_INLINE void set_data(const Eigen::VectorXd & D,
+    igl::ColorMapType cmap = igl::COLOR_MAP_TYPE_VIRIDIS,
+    int num_steps = 21);
+
   // Not to be confused with set_colors, this creates a _texture_ that will be
   // referenced to pseudocolor according to the scalar field passed to set_data.
   //

+ 0 - 1
include/igl/parula.cpp

@@ -20,7 +20,6 @@ IGL_INLINE void igl::parula(const T f, T & r, T & g, T & b)
   igl::colormap(igl::COLOR_MAP_TYPE_PARULA, f, r, g, b);
 }
 
-
 template <typename DerivedZ, typename DerivedC>
 IGL_INLINE void igl::parula(
   const Eigen::MatrixBase<DerivedZ> & Z,

+ 3 - 4
tutorial/304_LinearEqualityConstraints/main.cpp

@@ -60,7 +60,6 @@ int main(int argc, char *argv[])
     igl::min_quad_with_fixed_solve(mqwf,B,bc,Beq,Z_const);
   }
 
-
   // Use same color axes
   const double min_z = std::min(Z.minCoeff(),Z_const.minCoeff());
   const double max_z = std::max(Z.maxCoeff(),Z_const.maxCoeff());
@@ -69,15 +68,15 @@ int main(int argc, char *argv[])
   igl::opengl::glfw::Viewer viewer;
   viewer.data().set_mesh(V, F);
   viewer.data().show_lines = false;
-  viewer.data().set_data(min_z,max_z,Z);
+  viewer.data().set_data(Z,min_z,max_z);
 
-  viewer.callback_key_down = 
+  viewer.callback_key_down =
     [&Z,&Z_const,&min_z,&max_z](igl::opengl::glfw::Viewer& viewer,unsigned char key,int mod)->bool
     {
       if(key == ' ')
       {
         static bool toggle = true;
-        viewer.data().set_data(min_z,max_z,toggle?Z_const:Z);
+        viewer.data().set_data(toggle?Z_const:Z,min_z,max_z);
         toggle = !toggle;
         return true;
       }else