
// rainbow lookup
// maps 1-0 to roygbiv

#include "WaterfallLookup.h"

using namespace std;

WaterfallLookup::WaterfallLookup(){


  white[0] = 1.0;
  white[1] = 1.0;
  white[2] = 1.0;

  deepskyblue[0] = 0.0;
  deepskyblue[1] = 0.74;
  deepskyblue[2] = 1.0; 

  aqua[0] = 0.0;
  aqua[1] = 1.0;
  aqua[2] = 1.0;

  mediumblue[0] = 0.0;
  mediumblue[1] = 0.0;
  mediumblue[2] = 0.80;

  //  printTestValues();

}

void WaterfallLookup::printTestValues(){  
  
  float* value;
  
  cout << "WaterfallLookup::init" << endl;  
  for ( float i = 0; i < 1; i+=.01){
    value = getValue(i);
    cout << i << value[0] << " " << value[1] << " " << value[2] << endl;
  }
  cout << "WaterfallLookup::end Waterfall Lookup" << endl;
  
}

float* WaterfallLookup::getValue(float invalue){
  
  float r,g,b;
  float interpval;     //t
  float neginterpval;  //1-t
  float num_colors = 4;
  float scaled_value = invalue * (num_colors-1);

  if (scaled_value > 2) {

    interpval = scaled_value - 2;
    neginterpval = 1-interpval;
    r = white[0]*interpval + deepskyblue[0]*neginterpval;
    g = white[1]*interpval + deepskyblue[1]*neginterpval;
    b = white[2]*interpval + deepskyblue[2]*neginterpval;

  } else if ((scaled_value > 1) && (scaled_value <= 2)){

    interpval = scaled_value - 1;
    neginterpval = 1-interpval;
    r = deepskyblue[0]*interpval + aqua[0]*neginterpval;
    g = deepskyblue[1]*interpval + aqua[1]*neginterpval;
    b = deepskyblue[2]*interpval + aqua[2]*neginterpval;

  } else if (scaled_value <= 1){

    interpval = scaled_value;
    neginterpval = 1-interpval;
    r = aqua[0]*interpval + mediumblue[0]*neginterpval;
    g = aqua[1]*interpval + mediumblue[1]*neginterpval;
    b = aqua[2]*interpval + mediumblue[2]*neginterpval;
  }

  value[0] = r;
  value[1] = g;
  value[2] = b;
  
  return value;
  
}
    

