Text archives Help
- 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.