⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mvolumerender.h

📁 virtual reality project. This algorithm for building large image to Volume rendering. Using directx
💻 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 + -