Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[Manta] r2057 - in trunk: Core Core/Color/Colormaps Interface Model/Textures scenes


Chronological Thread 
  • From: roni@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [Manta] r2057 - in trunk: Core Core/Color/Colormaps Interface Model/Textures scenes
  • Date: Tue, 12 Feb 2008 22:30:38 -0700 (MST)

Author: roni
Date: Tue Feb 12 22:30:38 2008
New Revision: 2057

Added:
   trunk/Core/Color/Colormaps/
   trunk/Core/Color/Colormaps/LinearColormap.h
   trunk/Interface/Colormap.h
Modified:
   trunk/Core/CMakeLists.txt
   trunk/Model/Textures/ValueColormap.h
   trunk/scenes/valuecolormaptest.cc
Log:
Added Colormap interface, and a LinearColormap implementation.  This
does everything the RegularColorMap does, but I found the
RegularColorMap's implementation confusing, and it doesn't look like
it actually smoothly interpolates colors the way I believe it should.

M    scenes/valuecolormaptest.cc
  Modified to use Colormap/LinearColormap.

M    Core/CMakeLists.txt
  Make sure everything compiles in.

A    Core/Color/Colormaps
A    Core/Color/Colormaps/LinearColormap.h
  Implementation of multi-color linear colormap, including several
  named colormaps (the same ones SCIRun uses, I think; I copied the
  color values from RegularColorMap).

M    Model/Textures/ValueColormap.h
  Modified to take a Colormap at construction, or a named colormap
  specifier.

A    Interface/Colormap.h
  Colormap interface.


Modified: trunk/Core/CMakeLists.txt
==============================================================================
--- trunk/Core/CMakeLists.txt   (original)
+++ trunk/Core/CMakeLists.txt   Tue Feb 12 22:30:38 2008
@@ -19,6 +19,8 @@
      Color/RegularColorMap.h
      Color/RegularColorMap.cc)
 SET (CORE_SOURCES ${CORE_SOURCES}
+     Color/Colormaps/LinearColormap.h)
+SET (CORE_SOURCES ${CORE_SOURCES}
      Exceptions/BadPrimitive.cc
      Exceptions/BadPrimitive.h
      Exceptions/ErrnoException.cc

Added: trunk/Core/Color/Colormaps/LinearColormap.h
==============================================================================
--- (empty file)
+++ trunk/Core/Color/Colormaps/LinearColormap.h Tue Feb 12 22:30:38 2008
@@ -0,0 +1,193 @@
+#ifndef Manta_Core_Color_Colormaps_LinearColormap_h
+#define Manta_Core_Color_Colormaps_LinearColormap_h
+
+#include <Core/Color/Color.h>
+#include <Interface/Colormap.h>
+
+namespace Manta{
+  enum ColormapName {
+    InvRainbowIso=0,
+    InvRainbow,
+    RainbowIso,
+    Rainbow,
+    InvGreyScale,
+    InvBlackBody,
+    BlackBody,
+    GreyScale,
+    Default
+  };
+
+  template<typename T>
+  class LinearColormap : public Colormap<Color, T> {
+  public:
+    LinearColormap(float _min, float _max){
+      setRange(_min, _max);
+    }
+
+    void setRange(float newmin, float newmax){
+      min = newmin;
+      max = newmax;
+      update();
+    }
+
+    void setMin(float newmin){
+      setRange(newmin, max);
+    }
+
+    void setMax(float newmax){
+      setRange(min, newmax);
+    }
+
+    void addColor(const Color& color){
+      colors.push_back(color);
+      update();
+    }
+
+    Color color(const T& val) const {
+      // norm is a value in the range [0, N], where N is one less than the
+      // number of colors.
+      float norm = (val - min)*inv_range;
+      if(norm > colors.size() - 1)
+        norm = colors.size() - 1;
+      else if(norm < 0.0)
+        norm = 0.0;
+
+      unsigned idx = static_cast<int>(norm);
+      float excess = norm - idx;
+
+      // Correct color is <excess> amount between colors[idx] and 
colors[idx].
+
+      // Special case for clamped-to-top of range value.
+      if(idx == colors.size() - 2)
+        return colors[idx];
+
+      return colors[idx]*(1-excess) + colors[idx+1]*excess;
+    }
+
+  public:
+    static LinearColormap *createColormap(ColormapName kind, float min, 
float max){
+      LinearColormap *cmap = new LinearColormap(min, max);
+
+      switch(kind){
+      case InvRainbowIso:
+        cmap->addColor(Color(RGB(0.528, 0.528, 1.0)));
+        cmap->addColor(Color(RGB(0.304, 0.5824, 1.0)));
+        cmap->addColor(Color(RGB(0.0, 0.6656, 0.832)));
+        cmap->addColor(Color(RGB(0.0, 0.712, 0.5696)));
+        cmap->addColor(Color(RGB(0.0, 0.744, 0.2976)));
+        cmap->addColor(Color(RGB(0.0, 0.76, 0.0)));
+        cmap->addColor(Color(RGB(0.304, 0.76, 0.0)));
+        cmap->addColor(Color(RGB(0.5504, 0.688, 0.0)));
+        cmap->addColor(Color(RGB(0.68, 0.624, 0.0)));
+        cmap->addColor(Color(RGB(0.752, 0.6016, 0.0)));
+        cmap->addColor(Color(RGB(1.0, 0.5008, 0.168)));
+        cmap->addColor(Color(RGB(1.0, 0.424, 0.424)));
+        break;
+
+      case InvRainbow:
+        cmap->addColor(Color(RGB(0, 0, 1)));
+        cmap->addColor(Color(RGB(0, 0.40000001, 1)));
+        cmap->addColor(Color(RGB(0, 0.80000001, 1)));
+        cmap->addColor(Color(RGB(0, 1, 0.80000001)));
+        cmap->addColor(Color(RGB(0, 1, 0.40000001)));
+        cmap->addColor(Color(RGB(0, 1, 0)));
+        cmap->addColor(Color(RGB(0.40000001, 1, 0)));
+        cmap->addColor(Color(RGB(0.80000001, 1, 0)));
+        cmap->addColor(Color(RGB(1, 0.91764706, 0)));
+        cmap->addColor(Color(RGB(1, 0.80000001, 0)));
+        cmap->addColor(Color(RGB(1, 0.40000001, 0)));
+        cmap->addColor(Color(RGB(1, 0, 0)));
+        break;
+
+      case RainbowIso:
+        cmap->addColor(Color(RGB(1.0, 0.424, 0.424)));
+        cmap->addColor(Color(RGB(1.0, 0.5008, 0.168)));
+        cmap->addColor(Color(RGB(0.752, 0.6016, 0.0)));
+        cmap->addColor(Color(RGB(0.68, 0.624, 0.0)));
+        cmap->addColor(Color(RGB(0.5504, 0.688, 0.0)));
+        cmap->addColor(Color(RGB(0.304, 0.76, 0.0)));
+        cmap->addColor(Color(RGB(0.0, 0.76, 0.0)));
+        cmap->addColor(Color(RGB(0.0, 0.744, 0.2976)));
+        cmap->addColor(Color(RGB(0.0, 0.712, 0.5696)));
+        cmap->addColor(Color(RGB(0.0, 0.6656, 0.832)));
+        cmap->addColor(Color(RGB(0.304, 0.5824, 1.0)));
+        cmap->addColor(Color(RGB(0.528, 0.528, 1.0)));
+        break;
+
+      case Rainbow:
+        cmap->addColor(Color(RGB(1, 0, 0)));
+        cmap->addColor(Color(RGB(1, 0.40000001, 0)));
+        cmap->addColor(Color(RGB(1, 0.80000001, 0)));
+        cmap->addColor(Color(RGB(1, 0.91764706, 0)));
+        cmap->addColor(Color(RGB(0.80000001, 1, 0)));
+        cmap->addColor(Color(RGB(0.40000001, 1, 0)));
+        cmap->addColor(Color(RGB(0, 1, 0)));
+        cmap->addColor(Color(RGB(0, 1, 0.40000001)));
+        cmap->addColor(Color(RGB(0, 1, 0.80000001)));
+        cmap->addColor(Color(RGB(0, 0.80000001, 1)));
+        cmap->addColor(Color(RGB(0, 0.40000001, 1)));
+        cmap->addColor(Color(RGB(0, 0, 1)));
+        break;
+
+      case InvGreyScale:
+        cmap->addColor(Color(RGB(1,1,1)));
+        cmap->addColor(Color(RGB(0,0,0)));
+        break;
+
+      case InvBlackBody:
+        cmap->addColor(Color(RGB(1, 1, 1)));
+        cmap->addColor(Color(RGB(1, 1, 0.70588237)));
+        cmap->addColor(Color(RGB(1, 0.96862745, 0.47058824)));
+        cmap->addColor(Color(RGB(1, 0.89411765, 0.3137255)));
+        cmap->addColor(Color(RGB(1, 0.80000001, 0.21568628)));
+        cmap->addColor(Color(RGB(1, 0.63921571, 0.078431375)));
+        cmap->addColor(Color(RGB(1, 0.47058824, 0)));
+        cmap->addColor(Color(RGB(0.90196079, 0.27843139, 0)));
+        cmap->addColor(Color(RGB(0.78431374, 0.16078432, 0)));
+        cmap->addColor(Color(RGB(0.60000002, 0.070588239, 0)));
+        cmap->addColor(Color(RGB(0.40000001, 0.0078431377, 0)));
+        cmap->addColor(Color(RGB(0.20392157, 0, 0)));
+        cmap->addColor(Color(RGB(0, 0, 0)));
+        break;
+
+      case BlackBody:
+        cmap->addColor(Color(RGB(0, 0, 0)));
+        cmap->addColor(Color(RGB(0.20392157, 0, 0)));
+        cmap->addColor(Color(RGB(0.40000001, 0.0078431377, 0)));
+        cmap->addColor(Color(RGB(0.60000002, 0.070588239, 0)));
+        cmap->addColor(Color(RGB(0.78431374, 0.16078432, 0)));
+        cmap->addColor(Color(RGB(0.90196079, 0.27843139, 0)));
+        cmap->addColor(Color(RGB(1, 0.47058824, 0)));
+        cmap->addColor(Color(RGB(1, 0.63921571, 0.078431375)));
+        cmap->addColor(Color(RGB(1, 0.80000001, 0.21568628)));
+        cmap->addColor(Color(RGB(1, 0.89411765, 0.3137255)));
+        cmap->addColor(Color(RGB(1, 0.96862745, 0.47058824)));
+        cmap->addColor(Color(RGB(1, 1, 0.70588237)));
+        cmap->addColor(Color(RGB(1, 1, 1)));
+        break;
+
+      case GreyScale:
+        cmap->addColor(Color(RGB(0,0,0)));
+        cmap->addColor(Color(RGB(1,1,1)));
+        break;
+
+      case Default:
+        cmap->addColor(Color(RGB(1,0,0)));
+        cmap->addColor(Color(RGB(0,0,1)));
+        break;
+      }
+
+      return cmap;
+    }
+
+  private:
+    void update(){
+      inv_range = (colors.size()-1) / (max - min);
+    }
+
+    float min, max, inv_range;
+    std::vector<Color> colors;
+  };
+}
+
+#endif

Added: trunk/Interface/Colormap.h
==============================================================================
--- (empty file)
+++ trunk/Interface/Colormap.h  Tue Feb 12 22:30:38 2008
@@ -0,0 +1,18 @@
+#ifndef Manta_Interface_Colormap_h
+#define Manta_Interface_Colormap_h
+
+namespace Manta{
+  template<typename C, typename T>
+  class Colormap {
+  public:
+    typedef C ColorType;
+    typedef T ValueType;
+
+  public:
+    virtual ~Colormap() {}
+
+    virtual C color(const T& value) const = 0;
+  };
+}
+
+#endif

Modified: trunk/Model/Textures/ValueColormap.h
==============================================================================
--- trunk/Model/Textures/ValueColormap.h        (original)
+++ trunk/Model/Textures/ValueColormap.h        Tue Feb 12 22:30:38 2008
@@ -1,6 +1,8 @@
 #ifndef Manta_Model_Textures_ValueColormap_h
 #define Manta_Model_Textures_ValueColormap_h
 
+#include <Core/Color/Colormaps/LinearColormap.h>
+#include <Interface/Colormap.h>
 #include <Interface/Texture.h>
 #include <Model/Primitives/ValuePrimitive.h>
 
@@ -8,14 +10,14 @@
   template<typename T, bool DO_SAFE_TYPECASTING=true>
   class ValueColormap : public Texture<Color> {
   public:
-    ValueColormap(T min, T max){
-      setRange(min, max);
-    }
+    ValueColormap(Colormap<Color, T> *cmap) : cmap(cmap), own_cmap(false) {}
+
+    ValueColormap(float min, float max, ColormapName kind=Default) :
+      cmap(LinearColormap<T>::createColormap(kind, min, max)), 
own_cmap(true) {}
 
-    void setRange(T newmin, T newmax){
-      min = newmin;
-      max = newmax;
-      inv_range = 1.0 / (max - min);
+    ~ValueColormap(){
+      if(own_cmap)
+        delete cmap;
     }
 
     void mapValues(Packet<Color>& results,
@@ -35,16 +37,13 @@
         }
 
         const T value = prim->getValue();
-        const T factor = (value - min)*inv_range;
-
-        // Red-to-blue for testing.
-        results.set(i, Color(RGB(1.0 - factor, 0.0, factor)));
+        results.set(i, cmap->color(value));
       }
     }
 
   private:
-    T min, max;
-    T inv_range;
+    Colormap<Color, T> *cmap;
+    bool own_cmap;
   };
 }
 

Modified: trunk/scenes/valuecolormaptest.cc
==============================================================================
--- trunk/scenes/valuecolormaptest.cc   (original)
+++ trunk/scenes/valuecolormaptest.cc   Tue Feb 12 22:30:38 2008
@@ -1,4 +1,5 @@
 #include <Core/Color/ColorDB.h>
+#include <Core/Color/Colormaps/LinearColormap.h>
 #include <Core/Util/Preprocessor.h>
 #include <Interface/LightSet.h>
 #include <Interface/Scene.h>
@@ -16,13 +17,15 @@
 MANTA_PLUGINEXPORT
 Scene *make_scene(const ReadContext&, const vector<string>& args)
 {
-  ValueColormap<float> *cmap = new ValueColormap<float>(0.0, 5.0);
+  ValueColormap<float> *cmap = new ValueColormap<float>(0.0, 5.0, Rainbow);
   Lambertian *matl = new Lambertian(cmap);
 
   Group *group = new Group;
-  for(int i=0; i<5; i++){
+  const int numSpheres = 20;
+  const float inc = 5.0 / (numSpheres-1);
+  for(int i=0; i<numSpheres; i++){
     Primitive *prim = new ValuePrimitive<float>(new Sphere(matl, 
Vector(2.0*i, 0.0, 0.0), 0.6),
-                                                i*1.25);
+                                                i*inc);
     group->add(prim);
   }
 




  • [Manta] r2057 - in trunk: Core Core/Color/Colormaps Interface Model/Textures scenes, roni, 02/13/2008

Archive powered by MHonArc 2.6.16.

Top of page