00001 #include "Transfer.h"
00002
00012 Transfer::Transfer (int num)
00013 {
00014 numP = num;
00015 newColors.resize(numP);
00016 colorf = new float[numP*3];
00017 changed = true;
00018 }
00019
00026 void Transfer::addPoint(ColorPoint* p)
00027 {
00028 points.push_back(p);
00029 sortPoints();
00030 changed = true;
00031 colorInterpolation();
00032 }
00033
00040 void Transfer::removePoint(int pos)
00041 {
00042 points.erase(points.begin()+pos,points.end()-(points.size()-pos-1));
00043 sortPoints();
00044 colorInterpolation();
00045 changed = true;
00046 }
00047
00053 void Transfer::removePoints()
00054 {
00055 points.erase(points.begin(),points.end());
00056 }
00057
00064 void Transfer::sortPoints()
00065 {
00066 ColorPoint* p;
00067
00068 unsigned int i = 0;
00069 while(!points.empty() && i < points.size()-1)
00070 {
00071 if(points[i]->getX()>points[i+1]->getX())
00072 {
00073 p = points[i];
00074 points[i] = points[i+1];
00075 points[i+1] = p;
00076 i=0;
00077 }
00078 else
00079 i++;
00080 }
00081 }
00082
00092 float* Transfer::colorInterpolation() {
00093
00094 Color* c;
00095 if (changed)
00096 changed = false;
00097
00098
00099 if(points.empty() || points[0]->getX()!= 0)
00100 {
00101 c = new Color(0.0f,0.0f,0.0f);
00102 ColorPoint* first = new ColorPoint(0,c);
00103 std::vector<ColorPoint*> copy(points.size());
00104
00105 copy = points;
00106 points.resize(points.size()+1);
00107 points[0] = first;
00108
00109 for (int i = 0; i < (int)copy.size(); i++)
00110 {
00111 points[i+1] = copy[i];
00112 }
00113 }
00114 else
00115 c = points[0]->getColor();
00116
00117 newColors[0] = c;
00118
00119
00120 if(points[points.size()-1]->getX()!=numP)
00121 {
00122 c = new Color(1.f,1.f,1.f);
00123 ColorPoint* last = new ColorPoint(numP,c);
00124 points.resize(points.size()+1);
00125 points[points.size()-1] = last;
00126 }
00127 else
00128 c = points[points.size()-1]->getColor();
00129
00130 newColors[newColors.size()-1] = c;
00131
00132 ColorPoint* prevPoint;
00133 Color* prevColor;
00134 ColorPoint* currentPoint;
00135 Color* currentColor;
00136 float rd; float gd; float bd;
00137 float rPart; float gPart; float bPart;
00138 float R; float G; float B;
00139 int nPrev; int nCurr;
00140
00141
00142 for (int i = 0; i < (int)points.size()-1; i++)
00143 {
00144 rd = 0; gd = 0; bd = 0;
00145 rPart = 0; gPart = 0; bPart = 0;
00146 R = 0; G = 0; B = 0;
00147
00148
00149 prevPoint = points[i];
00150 prevColor = prevPoint->getColor();
00151
00152
00153 currentPoint = points[i+1];
00154 currentColor = currentPoint->getColor();
00155
00156
00157 float d = currentPoint->getX() - prevPoint->getX();
00158
00159 if (d != 0)
00160 {
00161 nPrev = (int)prevPoint->getX();
00162 nCurr = (int)currentPoint->getX()-1;
00163
00164
00165 newColors[nPrev] = prevColor;
00166 newColors[nCurr] = currentColor;
00167
00168
00169 rd = currentColor->GetNormalizedRed() - prevColor->GetNormalizedRed();
00170 gd = currentColor->GetNormalizedGreen() - prevColor->GetNormalizedGreen();
00171 bd = currentColor->GetNormalizedBlue() - prevColor->GetNormalizedBlue();
00172
00173 rPart = rd/d;
00174 gPart = gd/d;
00175 bPart = bd/d;
00176
00177 R = prevColor->GetNormalizedRed();
00178 G = prevColor->GetNormalizedGreen();
00179 B = prevColor->GetNormalizedBlue();
00180
00181
00182 for (int j = nPrev+1; j < nCurr; j++)
00183 {
00184
00185 R = R + rPart;
00186 G = G + gPart;
00187 B = B + bPart;
00188
00189 c = new Color(R,G,B);
00190 newColors[j] = c;
00191 }
00192 }
00193 }
00194
00195 colorf = getColorf();
00196 return colorf;
00197 }
00198
00205 float* Transfer::getColorf()
00206 {
00207 int j = 0;
00208 for (int i = 0; i < newColors.size(); i++)
00209 {
00210 colorf[j] = newColors[i]->GetNormalizedRed(); j++;
00211 colorf[j] = newColors[i]->GetNormalizedGreen(); j++;
00212 colorf[j] = newColors[i]->GetNormalizedBlue(); j++;
00213 }
00214
00215 return colorf;
00216 }
00217
00224 float* Transfer::clearData()
00225 {
00226 newColors.clear();
00227 points.clear();
00228 for(int i = 0; i < numP*3; i++)
00229 colorf[i]=0.0f;
00230
00231 return colorf;
00232 }