📄 mvolumerender.h
字号:
//-----------------------------------------------------------------------------
// File: MVolumeRender.h
//
// Desc: Header file MVolumeRender sample app
//-----------------------------------------------------------------------------
#pragma once
#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file
#endif
#include "Vector3.h"
#include <vector>
//-----------------------------------------------------------------------------
// Defines, and constants
//-----------------------------------------------------------------------------
// TODO: change "DirectX AppWizard Apps" to your name or the company name
#define DXAPP_KEY TEXT("Software\\DirectX AppWizard Apps\\MVolumeRender")
// Custom D3D Volume vertex format
struct OBJECTORDERPROXY
{
FLOAT x, y, z;
FLOAT tu0, tv0, tw0;
};
// Custom D3D Volume vertex format
struct VOLUMEVERTEX
{
FLOAT x, y, z;
FLOAT tu0, tv0, tw0;
FLOAT tu1, tv1, tw1;
};
// Render target 2D Quad
struct RENDERTARGETQUAD
{
FLOAT x, y, z, rhw; // The transformed position for the vertex
FLOAT tu, tv;
};
// FF vertex pipeline 荤侩窍骨肺 FVF 肺 急攫.
#define D3DFVF_RENDERTARGETQUAD (D3DFVF_XYZRHW|D3DFVF_TEX1|D3DFVF_TEXCOORDSIZE2(0))
// MPR_TEST
// MPR 2D Quad
struct MPR2DQUAD
{
FLOAT x, y, z, rhw; // The transformed position for the vertex
FLOAT tu0, tv0, tw0;
};
// FF vertex pipeline 荤侩窍骨肺 FVF 肺 急攫.
#define D3DFVF_MPR2DQUAD (D3DFVF_XYZRHW|D3DFVF_TEX1|D3DFVF_TEXCOORDSIZE3(0))
// struct for 1D OTF texture
typedef struct {
BYTE den[4];
BYTE r[4], g[4], b[4];
float opacity;
} OTF;
//---------------- slice number-----------------------------------------
// for *MTEST*
#define VOLUMEARRAYSIZE 256
#define INPUTVOLUMEX 256
#define INPUTVOLUMEY 256
#define INPUTVOLUMEZ 240
#define RENDERTARGETSIZE 512
#define SLICENUMBER 384//430//384//256
#define OBJECTSLICENUM 32
#define OTFTEXTUREWIDTH 256//2048//256
#define OTFPARAM0 96
#define OTFPARAM1 103
#define OTFPARAM2 255
#define OTFPARAM3 255
#define OTFALPHAPARAM 255
//-->SetOtfPram( 30, 80, 200, 255); // skin
//-->SetOtfPram( 90, 100, 200, 255); // bone
// 1 : 3^(1/2) = x : 15
#define CLIPTOP 8.680254f // 8.660254f
#define CLIPBOTTOM 8.680254f // 8.660254f
#define VOLUMEWIDTH 17.360508f // 8.660 * 2 = 17.320508f
#define SLICEWIDTH 30.0f
#define SLICEHEIGHT 30.0f
#define TEXRANGE 1.732051f // 3^(1/2) = 1.732
//#define TEXHALFRANGE 0.866f // 3^(1/3) / 2 = 0.866
#define RENDERALLPASS 0
#define RENDERPASS1 1
#define RENDERSHOWDEPTH 2
#define MPRMAXPOINT 200
#define MPR2DQUADWIDTH 512
#define MAXLEVEL 1
// Struct to store the current input state
struct UserInput
{
// TODO: change as needed
BOOL bRotateUp;
BOOL bRotateDown;
BOOL bRotateLeft;
BOOL bRotateRight;
};
//added by taeki
struct VirtualMemory
{
int index;
BYTE level;
};
//-----------------------------------------------------------------------------
// Name: class CAppForm
// Desc: CFormView-based class which allows the UI to be created with a form
// (dialog) resource. This class manages all the controls on the form.
//-----------------------------------------------------------------------------
class CAppForm : public CFormView, public CD3DApplication
{
public:
BOOL m_bLoadingApp; // TRUE, if the app is loading
LPDIRECT3DVERTEXBUFFER9 m_pObjectOrderProxy; // proxy geo Vextex buffer for depth pass (pass 0)
LPDIRECT3DVERTEXBUFFER9 m_pVB; // proxy geo Vextex buffer
LPDIRECT3DVERTEXBUFFER9 m_pFinalQuadVB; // render target quad vextex buffer
// MPR_TEST
LPDIRECT3DVERTEXBUFFER9 m_pMPRGeometryVB; // MPR Geometry vertex buffer]
LPDIRECT3DVERTEXBUFFER9 m_pMPRQuadVB; // MPR 2d quad
LPDIRECT3DVERTEXBUFFER9 m_pMPRRenderTargetVB; // MPR render target vertex buffer
std::vector< CPoint > m_vMPRControlPoint; // MPR Control Point
int m_mprCtrlPntNum; // MPR Control Point number
int mpr_cnt; // MPR Points count
D3DXMATRIX matCustomMPR;
D3DXMATRIX matCustomMPRTex;
D3DXMATRIX matFinalMPRVertex;
D3DXMATRIX matFinalMPRTex;
LPDIRECT3DTEXTURE9 m_pMPRRenderTarget;
LPDIRECT3DTEXTURE9 m_pIntermediateTexture; //render target texture
LPDIRECT3DSURFACE9 m_pOldRenderTarget; //for save old render target
LPDIRECT3DVOLUMETEXTURE9 m_pVolumeTexture; // Volume texture
LPDIRECT3DVOLUMETEXTURE9 m_pGradientTexture; // gradient texture
LPDIRECT3DVOLUMETEXTURE9 m_pVolumeTexMM; // Min-Max Volume texture
LPDIRECT3DTEXTURE9 m_pPreIntegratedTexture; // PreIntegrated Texture
CD3DFont* m_pFont; // Font for drawing text
UserInput m_UserInput; // Struct for storing user input
FLOAT m_texCoordRotX; // Volume texture coordinate rotation state X-axis
FLOAT m_texCoordRotY; // Volume texture coordinate rotation state Y-axis
// FLOAT m_texCoordRotZ; // Volume texture coordinate rotation state Z-axis
// MPR_TEST
FLOAT m_initTexCoordRotX; // Volume texture coordinate rotation state X-axis
FLOAT m_initTexCoordRotY; // Volume texture coordinate rotation state Y-axis
FLOAT m_meshCoordRotX; // Mesh texture coordinate rotation state x-axis
FLOAT m_meshCoordRotY; // Mesh texture coordinate rotation state y-axis
FLOAT m_meshScaleFactor; // scaleFactor in Ortho Projection
//// mesh renderer
D3DXPLANE m_ClipPlaneCoeff[2];
D3DXPLANE m_MeshClipPlaneCoeff[SLICENUMBER * 2];
private:
void SetVSClipPlaneCoord(float p1, float p2);
CPoint m_ptBeginPoint;
FLOAT scaleFactor; // scaleFactor in Ortho Projection
OTF m_otfParam;
inline int Den(int x, int y, int z);
HWND m_hwndRenderWindow;
HWND m_hwndRenderFullScreen;
HWND m_hWndTopLevelParent;
virtual HRESULT ConfirmDevice( D3DCAPS9*,DWORD,D3DFORMAT );
virtual HRESULT OneTimeSceneInit();
virtual HRESULT InitDeviceObjects();
virtual HRESULT RestoreDeviceObjects();
virtual HRESULT FrameMove();
virtual HRESULT Render();
virtual HRESULT InvalidateDeviceObjects();
virtual HRESULT DeleteDeviceObjects();
virtual HRESULT FinalCleanup();
virtual HRESULT AdjustWindowForChange();
HRESULT RenderText();
void UpdateInput( UserInput* pUserInput );
VOID ReadSettings();
VOID WriteSettings();
VOID UpdateUIForDeviceCapabilites();
protected:
DECLARE_DYNCREATE(CAppForm)
CAppForm();
virtual ~CAppForm();
public:
BOOL IsReady() { return m_bActive; }
TCHAR* PstrFrameStats() { return m_strFrameStats; }
VOID RenderScene() { Render3DEnvironment(); }
HRESULT CheckForLostFullscreen();
//{{AFX_DATA(CAppForm)
enum { IDD = IDD_FORMVIEW };
CSliderCtrl m_ctrlOtfAlphaSlider;
CSliderCtrl m_ctrlClipTransSlider;
CSliderCtrl m_ctrlClipThickSlider;
CSliderCtrl m_ctrlOtfSlider0;
CSliderCtrl m_ctrlOtfSlider1;
int m_valOtfEdit0;
int m_valOtfEdit1;
int m_valOtfAlpha;
int m_renderingPass;
BOOL m_bRenderMesh;
BOOL m_bControlMesh;
BOOL m_bDrawCurve;
//}}AFX_DATA
//{{AFX_VIRTUAL(CAppForm)
virtual void OnInitialUpdate();
protected:
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
public:
void UpdateSubvolumeSet();
HRESULT MFillMPRBuffer();
HRESULT MFillVertexBuffer();
HRESULT makeMMVolumeTexture();
//---- for Min-Max Texture -----------
//bool CreateMinMaxTexture();
int divX;
int divY;
int divZ;
unsigned int minDenDiv8[OBJECTSLICENUM][OBJECTSLICENUM][OBJECTSLICENUM];
unsigned int maxDenDiv8[OBJECTSLICENUM][OBJECTSLICENUM][OBJECTSLICENUM];
void CompressedVolume();
//-------------------------------------
float m_otfMinValue;
int m_otfAlphaValue;
void MSetOrthoProjection();
HRESULT MCreateShader();
void SetTwoVSClipPlane(D3DXVECTOR3* g, D3DXVECTOR3* h);
D3DXMATRIX m_clipPlaneRotation;
HRESULT makePreIntegratedTexture();
void SetOtfPram(int otfA, int otfB, int otfC, int otfD);
HRESULT makeOtf();
void MakeGradientData();
BOOL OpenGradientData();
BOOL OpenVolumeData();
BYTE tmp8bitVolume[INPUTVOLUMEZ][INPUTVOLUMEY][INPUTVOLUMEX]; // tmp volume for 8-bit data read
unsigned int m_volumeData[VOLUMEARRAYSIZE][VOLUMEARRAYSIZE][VOLUMEARRAYSIZE]; // volumeData[z][y][x]
DWORD m_linearOtfArray[OTFTEXTUREWIDTH]; // save linear otf array
float summedTable[OTFTEXTUREWIDTH][2]; // 0 ~ index 鳖瘤 summed area table for RGBA
DWORD preIntegratedArray[OTFTEXTUREWIDTH][OTFTEXTUREWIDTH][2];
// for FF clip plane
D3DXVECTOR3 clipPoint[6]; // clip plane 捞 瘤唱绰 point 6俺
// object face normal
D3DXVECTOR3 objFaceNormalZ;
D3DXVECTOR3 objFaceNormalX;
D3DXVECTOR3 objFaceNormalY;
// object face normal (4D vector)
D3DXVECTOR4 objFaceNormal4DZ;
D3DXVECTOR4 objFaceNormal4DX;
D3DXVECTOR4 objFaceNormal4DY;
// is front face
float isFrontFaceZ;
float isFrontFaceX;
float isFrontFaceY;
float halfSliceRange;
float halfTexRange;
// vertex shader clip plane coord.
D3DXVECTOR3 vsClipplaneCoord0[3];
D3DXVECTOR3 vsClipplaneCoord1[3];
D3DXVECTOR3 light; // light vector
D3DXVECTOR3 view; // view vector
D3DXMATRIX matView;
D3DXMATRIX matOrtho;
D3DXMATRIX viewProjection; // viewProjection matrix by viewing and orthogonal projection
LPDIRECT3DVERTEXDECLARATION9 m_pObjOrderProxyVertexDecl;
LPDIRECT3DVERTEXDECLARATION9 m_pImagOrderProxyVertexDecl;
LPD3DXEFFECT m_pEffect; // D3DX effect interface
typedef struct byteVector { // byte vector
BYTE x;
BYTE y;
BYTE z;
}bVector;
bVector m_gradient[VOLUMEARRAYSIZE][VOLUMEARRAYSIZE][VOLUMEARRAYSIZE]; // gradient[z][y][x] byte vector
//added by taeki------------------------------------------------------------------------------------------------------//
void MakePlane();
D3DXVECTOR4 FindEmptySlot();
HRESULT FetchLevelSet(BYTE level);
HRESULT CreateMapper();
char m_arFileName[100];
BYTE * m_pbyteSubvolumeLevel; //阿 辑宏杭俘捞 啊瘤绰 饭骇阑 历厘秦 滴绰镑. 0捞搁 鞘夸绝绰 subvolume烙.
WORD * m_pwordVolume; //傈眉 杭俘 单捞磐 况靛
BYTE * m_pbyteVolume; //傈眉 杭俘 单捞磐 官捞飘
DWORD * m_pdwordMapper; //概欺甫 烙矫肺 历厘窍绰 器牢磐
bool* m_pboolIsNotEmptySlot[MAXLEVEL]; //滚抿倔 皋葛府 浇吩 肮荐客 鞍篮 秦惑档肺 父电促. 阿 浇吩捞 厚菌绰瘤 酒囱瘤甫 舅妨林绰 蔼阑 持绰促.
VirtualMemory* m_psVirtualMemory; //滚抿倔 皋葛府 浇吩 肮荐客 鞍篮 秦惑档肺 父电促.
bool* m_pboolIsSelectedSlot; //府倔 浇吩狼 肮荐俊 嘎眠绢 父电促. 吝汗等 捞饶狼 箭磊肺 父甸绢具 窃.
LPDIRECT3DVOLUMETEXTURE9 m_pVoltexVirtual; //virtual volume texture
LPDIRECT3DTEXTURE9 m_pTexMapper; //琶胶苗肺 父甸绢柳 概欺. rgb俊绰 transform 沥焊啊, a俊绰 饭骇捞 乐促.
// LPDIRECT3DTEXTURE9 m_pTexPosition; //吝埃 窜拌客 弥辆 窜拌困 谅钎甫 啊瘤绰 咆胶苗.
int m_intVirtualMemorySlotX, m_intVirtualMemorySlotY, m_intVirtualMemorySlotZ; //slot numbers
int m_intRealSubvolumeSlotX, m_intRealSubvolumeSlotY, m_intRealSubvolumeSlotZ;
int m_intRedunDataX; //吝汗茄 捞饶狼 傈眉 单捞磐 秦惑档.
int m_intRedunDataY;
int m_intRedunDataZ;
int m_intVolumeX, m_intVolumeY, m_intVolumeZ; //盔杭俘 单捞磐狼 秦惑档
int m_intSubvolumeSizeX, m_intSubvolumeSizeY, m_intSubvolumeSizeZ; //辑宏杭俘狼 轿捞令
int m_intDataType; //烙矫肺 单捞磐 鸥涝阑 沥秦初绰促. 1捞搁 8厚飘, 2捞搁 12厚飘
int m_intSwapedSubvolume;
std::vector< int > m_selectedSub; // 急琶等 冠胶 牢郸胶甸 府胶飘
//1瞒盔 array狼 index 拌魂 辑侥 : [x][y][z] = z*X*Y + y*X + x //
//----------------------------------------------------------------------------------------------------------------------//
//{{AFX_MSG(CAppForm)
afx_msg void OnToggleFullScreen();
afx_msg void OnChangeDevice();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
afx_msg void OnAllpass();
afx_msg void OnRendermeshcheck();
afx_msg void OnDrawMprCurve();
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMprcurveok();
afx_msg void OnMprcurveclear();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//-----------------------------------------------------------------------------
// Name: class CAppDoc
// Desc: Overridden CDocument class needed for the CFormView
//-----------------------------------------------------------------------------
class CAppDoc : public CDocument
{
protected:
DECLARE_DYNCREATE(CAppDoc)
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAppDoc)
public:
//}}AFX_VIRTUAL
// Implementation
//{{AFX_MSG(CAppDoc)
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//-----------------------------------------------------------------------------
// Name: class CAppFrameWnd
// Desc: CFrameWnd-based class needed to override the CFormView's window style
//-----------------------------------------------------------------------------
class CAppFrameWnd : public CFrameWnd
{
protected:
DECLARE_DYNCREATE(CAppFrameWnd)
public:
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAppFrameWnd)
public:
virtual BOOL PreCreateWindow( CREATESTRUCT& cs );
virtual BOOL LoadFrame(UINT nIDResource, DWORD dwDefaultStyle = WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, CWnd* pParentWnd = NULL, CCreateContext* pContext = NULL);
//}}AFX_VIRTUAL
protected:
//{{AFX_MSG(CAppFrameWnd)
afx_msg void OnChangeDevice();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//-----------------------------------------------------------------------------
// Name: class CApp
// Desc: Main MFC application class derived from CWinApp.
//-----------------------------------------------------------------------------
class CApp : public CWinApp
{
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CApp)
public:
virtual BOOL InitInstance();
virtual BOOL OnIdle( LONG );
//}}AFX_VIRTUAL
// Implementation
//{{AFX_MSG(CApp)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -