00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef __mitkFbFbpUsingGpu_h
00012 #define __mitkFbFbpUsingGpu_h
00013
00014 #include <GL/glew.h>
00015 #include <GL/glut.h>
00016 #include <Cg/cgGL.h>
00017 #include "mitkProjectDataToVolumeFilter.h"
00018 #include "mitkFanBeamProjectData.h"
00019 #include "mitkReconstructionCGIncludes.h"
00020
00021
00022 #define BLOCKNUM 7
00023 #define FANWINDOWSIZE 7
00024
00025
00026
00027
00028
00029
00036 class MITK_RECONSTRUCTION_CG_API mitkFbFbpSpeedUsingGpu: public mitkProjectDataToVolumeFilter
00037 {
00038 public:
00039 template<class Ty> friend int t_ExecuteFbFbpUsingGpu(mitkFanBeamProjectData *input,mitkVolume *outdata,mitkFbFbpSpeedUsingGpu *self, Ty *a);
00040
00041 MITK_TYPE(mitkFbFbpSpeedUsingGpu, mitkProjectDataToVolumeFilter)
00042
00043 virtual void PrintSelf(ostream& os);
00044
00045 mitkFbFbpSpeedUsingGpu();
00046
00047 void SetFov(float m[4]);
00048
00049 protected:
00050
00051 virtual ~mitkFbFbpSpeedUsingGpu();
00052
00053 virtual bool Execute();
00054
00055 private:
00056 void initWindow();
00057
00058 void initFBO();
00059
00060 void initCG();
00061
00062 void CheckForCgError(const char *situation);
00063
00064 bool CreateTexture();
00065
00066 void AttachFBO();
00067
00068 void InputPrjectData(float *data);
00069
00070 void ReadData(int slice, float *out);
00071
00072 void SetTexMatrix(float angle);
00073
00074 void EnableFshader();
00075
00076 void EnableVshader();
00077
00078 void DrawQuad(int h);
00079
00080 void SetDtheta(float m) {dthetaDegree = m;}
00081
00082 void SetFrustum(float zn,float zf,float zc, float detectorLength);
00083
00084 void DestroyAll();
00085
00086 void SetXrayNum(int m){xrayNum = m;}
00087 void SetAngleNum(int m){angleNum = m;}
00088
00089 void SetWidth(int m){width = m;}
00090 void SetHeight(int m){height = m;}
00091 void SetImgslice(int m){imgslice = m;}
00092
00093 private:
00094 int xrayNum;
00095 int angleNum;
00096
00097 int width;
00098 int height;
00099 int imgslice;
00100
00101
00102 struct TexParam
00103 {
00104 const char *name;
00105 int unit;
00106 int target;
00107 int tex;
00108 };
00109 std::vector<TexParam> m_texParams;
00110
00111 float v[4];
00112 float dthetaDegree;
00113
00114 float zNear;
00115 float zFar;
00116 float zCenter;
00117 float nearDetectorLengthX;
00118 GLfloat frustum[16];
00119
00120 GLuint windowHandle;
00121 CGcontext cgContext;
00122 CGprofile fProfile ,vProfile;
00123 CGprogram fProgram ,vProgram;
00124 CGparameter mvpMatrixParam,preResultTexParam,
00125 texMatrixParam[BLOCKNUM];
00126
00127 GLuint *projectDataID, fbotex, *ResultID;
00128 GLuint fb;
00129 GLint m_preFboId;
00130
00131 void _bindCurrentFBO();
00132 void _unBind();
00133 void _scanTexParams(CGprogram m_prog);
00134 void _setTexture(char *name, GLuint tex);
00135 void _bindTextures();
00136
00137
00138 mitkFbFbpSpeedUsingGpu(const mitkFbFbpSpeedUsingGpu&);
00139 void operator = (const mitkFbFbpSpeedUsingGpu&);
00140
00141 };
00142
00143
00144
00145 #endif
00146