00001 #pragma once
00002
00003 #ifndef __v_transfer_function2d_h
00004 #define __v_transfer_function2d_h
00005
00006 #include <map>
00007 #include <vector>
00008
00009 #include "VVector.h"
00010 #include "VFramebufferObject.h"
00011
00012
00013 class QVolRendCanvas;
00014
00018 struct vTransferFunction2DPoint
00019 {
00023 vTransferFunction2DPoint() : m_Color(), m_Alpha(1.0f), m_gmag(1.0f), m_density(0)
00024 {
00025
00026 }
00027
00028 VVector m_Color;
00029 float m_Alpha;
00030 float m_gmag;
00031 float m_density;
00032 };
00033
00034
00038 struct vNormal2DPoint
00039 {
00043 vNormal2DPoint() :x(0.0f), y(0.0f), rgb(), alpha(0.0f)
00044 {
00045
00046 }
00047
00048
00049 float x;
00050 float y;
00051 VVector rgb;
00052 float alpha;
00053 };
00054
00058 struct vTransferFunctionWannabeTriangle
00059 {
00063 vTransferFunctionWannabeTriangle( ) :a_offsetw(0.0f),a_offseth(0.0f),a_skew(0.0f)
00064 {
00065
00066 }
00067
00068
00076 vTransferFunctionWannabeTriangle( vNormal2DPoint p1,
00077 vNormal2DPoint p2,
00078 vNormal2DPoint p3,
00079 vNormal2DPoint p4) : point1(p1), point2(p2), point3(p3), point4(p4),
00080 a_offsetw(0.0f),a_offseth(0.0f),a_skew(0.0f)
00081 {
00082
00083 }
00084
00085
00086 vNormal2DPoint point1;
00087 vNormal2DPoint point2;
00088 vNormal2DPoint point3;
00089 vNormal2DPoint point4;
00091 float a_offsetw;
00092 float a_offseth;
00093 float a_skew;
00094 };
00095
00100 class VTransferFunction2D
00101 {
00102 public:
00103
00107 VTransferFunction2D() :
00108 m_VolumeHistogram2D(0),
00109 m_VolumeHistogramDisplayList2D(0),
00110 m_hasChanged(true),
00111 m_TransferFunction2DHandle(0),
00112 m_Histogram2DTextureHandle(0),
00113 m_FramebufferObject(NULL)
00114 {
00115
00116 }
00117
00121 ~VTransferFunction2D();
00122
00126 void reinit();
00127
00131 void draw2d();
00132
00137 void setHistogram2D(unsigned char * volumeHistogram2d);
00138
00145 vTransferFunction2DPoint getTransferFunctionPoint(float density, float gmag);
00146
00153 vTransferFunctionWannabeTriangle getTransferFunction2dTriangle(float density, float gmag);
00154
00162 VVector transferFunctionPointInRange(float selectedDensity, float gmag, float range);
00163
00168 void addTransferFunctionPoint(vTransferFunction2DPoint newPoint);
00169
00175 void addTransferFunctionPoint(vTransferFunctionWannabeTriangle t, vTransferFunction2DPoint newPoint);
00176
00183 void removeTransferFunctionPoint(float density, float gmag, float tres);
00184
00191 int findIndexTransferFunctionPoint(float density, float gmag, float tres);
00192
00199 void changeTriangleSize( int index, float offsetw, float offseth );
00200
00206 void changeTriangleSkew( int index, float skew );
00207
00216 void changePointColor(float density, float gmag, VVector color, float a, float tres);
00217
00224 void changePointPosition(int index, float newx, float newy);
00225
00230 std::vector<vTransferFunctionWannabeTriangle> getFullTransferFunction()
00231 {
00232 if(m_hasChanged)
00233 {
00234 this->interpolateTransferTriangles();
00235 }
00236 return m_FuncControlTriangles;
00237 }
00238
00243 unsigned int getGLHandle()
00244 {
00245 if(m_hasChanged)
00246 {
00247 this->interpolateTransferTriangles();
00248 }
00249 return m_FramebufferObject->getTextureHandle();
00250
00251 }
00252
00257 void setMainCanvas(QVolRendCanvas * maincanvas)
00258 {
00259 m_MainCanvas = maincanvas;
00260 }
00261
00266 bool load(std::string filename);
00267
00272 bool save(std::string filename);
00273
00277 void clear()
00278 {
00279 m_FuncControlTriangles.clear();
00280 m_FuncControlPoints.clear();
00281 m_TransferFunction2DHandle = 0;
00282 m_hasChanged = true;
00283 }
00284
00288 void renderTest()
00289 {
00290 m_FramebufferObject->renderToLowerRightQuad();
00291 }
00292
00293 private:
00294
00298 void generateDisplayList2D();
00299
00303 void interpolateTransferTriangles();
00304
00311 double round(double Zahl, int Stellen)
00312 {
00313 double v[] = { 1, 10, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8 };
00314 return floor(Zahl * v[Stellen] + 0.5) / v[Stellen];
00315 }
00316
00317 std::vector<vTransferFunction2DPoint> m_FuncControlPoints;
00318 std::vector<vTransferFunctionWannabeTriangle> m_FuncControlTriangles;
00320 unsigned char *m_VolumeHistogram2D;
00322 unsigned int m_VolumeHistogramDisplayList2D;
00323 unsigned int m_TransferFunction2DHandle;
00324 unsigned int m_Histogram2DTextureHandle;
00325 bool m_hasChanged;
00326 QVolRendCanvas * m_MainCanvas;
00328 VFramebufferObject * m_FramebufferObject;
00330 };
00331
00332 #endif //__v_transfer_function_h