00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef __UT_LUT_H__
00030 #define __UT_LUT_H__
00031
00032 #include "UT_API.h"
00033 #include <SYS/SYS_Types.h>
00034 #include "UT_Assert.h"
00035
00036 class UT_API UT_LUT {
00037 public:
00038 UT_LUT(fpreal val, int size, float (*eval)(float val, float t) = 0);
00039 explicit UT_LUT(int size, float (*eval)(float t) = 0);
00040 ~UT_LUT();
00041
00042
00043
00044
00045 void buildConformalWarp(const UT_LUT &src);
00046
00047 void buildLUT(float (*eval)(float val, float t));
00048 void buildLUT(float (*eval)(float t));
00049
00050 void setValue(fpreal v) { myVal = v; }
00051 fpreal getValue() const { return myVal; }
00052 int getSize() const { return mySize; }
00053 fpreal getFSize() const { return myFSize; }
00054 fpreal operator()(int i) const
00055 {
00056 UT_ASSERT_P(i >= 0 && i <= mySize);
00057 return myLut[i];
00058 }
00059
00060
00061
00062
00063
00064
00065
00066 fpreal fastValue(fpreal t) const { return myLut[(int)(t*myFSize+0.5F)]; }
00067 fpreal safeValue(fpreal t) const
00068 {
00069 fpreal rval;
00070
00071 if (t < 0) rval = myLut[0];
00072 else if (t >= 1) rval = myLut[mySize];
00073 else rval = myLut[(int)(t*myFSize+0.5F)];
00074 return rval;
00075 }
00076
00077
00078
00079
00080 fpreal lerpFast(fpreal t) const
00081 {
00082 int i1;
00083 t *= myFSize;
00084 i1 = (int)t;
00085 t -= (fpreal)i1;
00086 return (1.0F - t)*myLut[i1] + t*myLut[i1+1];
00087 }
00088 fpreal lerpSafe(fpreal t) const
00089 {
00090 fpreal rval;
00091 int i1;
00092
00093 if (t < 0.0F) rval = myLut[0];
00094 else if (t >= 1.0F) rval = myLut[mySize];
00095 else
00096 {
00097 t *= myFSize;
00098 i1 = (int)t;
00099 t -= (fpreal)i1;
00100 rval = (1.0F - t)*myLut[i1] + t*myLut[i1+1];
00101 }
00102 return rval;
00103 }
00104
00105 int getLUTSize() const { return mySize; }
00106 fpreal *getRawLUT() { return myLut; }
00107
00108 void bumpRefCount(void) { myRefCount++; }
00109 int downRefCount(void) { return --myRefCount; }
00110 protected:
00111 private:
00112 fpreal *myLut;
00113 fpreal myVal;
00114 int mySize;
00115 fpreal myFSize;
00116 int myRefCount;
00117 };
00118 #endif