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

📄 mvolumerender.cpp

📁 virtual reality project. This algorithm for building large image to Volume rendering. Using directx
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				minDenDiv8[i][j][k] =  0xffff;
				maxDenDiv8[i][j][k] =  0;//0x00;//

//				maxDenDiv8[i][j][31] = 0;

			}
		}
	}

	//block size 
	for(z=0; z<VOLUMEARRAYSIZE; z++) 
	{
		//nOffsetZ = m_nVolSizeY*m_nVolSizeX*z;
		for(y=0; y<VOLUMEARRAYSIZE; y++) 
		{
			//nOffsetY = m_nVolSizeX*y;
			for(x=0; x<VOLUMEARRAYSIZE; x++) 
			{
				int xIndex = (int)(x/8), yIndex = (int)(y/8), zIndex = (int)(z/8);
				
				//maxDenDiv8[xIndex][yIndex][31] = 0;

	
				if((m_volumeData[z][y][x])<minDenDiv8[xIndex][yIndex][zIndex])
					minDenDiv8[xIndex][yIndex][zIndex] = (m_volumeData[z][y][x]);//[nOffsetZ+nOffsetY+x]
				if((m_volumeData[z][y][x])>maxDenDiv8[xIndex][yIndex][zIndex])
					maxDenDiv8[xIndex][yIndex][zIndex] = (m_volumeData[z][y][x]);
			}
		}
	}
}



//-----------------------------------------------------------------------------
// Name: CAppForm::InitDeviceObjects()
// Desc: Paired with DeleteDeviceObjects()
//       The device has been created.  Resources that are not lost on
//       Reset() can be created here -- resources in D3DPOOL_MANAGED,
//       D3DPOOL_SCRATCH, or D3DPOOL_SYSTEMMEM.  Image surfaces created via
//       CreateImageSurface are never lost and can be created here.  Vertex
//       shaders and pixel shaders can also be created here as they are not
//       lost on Reset().
//-----------------------------------------------------------------------------
HRESULT CAppForm::InitDeviceObjects()
{
    // TODO: create device objects
    HRESULT hr;

    // Init the font
    m_pFont->InitDeviceObjects( m_pd3dDevice );

	//////////////////////// Fill Vertex Buffer  ///////////////////////////////
	if(FAILED(MFillVertexBuffer()))
		return E_FAIL;

	/////////////////////// make Textures ////////////////////////////////////////////
	//----------------------- Create a volume texture -------------------------------
    if(FAILED(D3DXCreateVolumeTexture( m_pd3dDevice, VOLUMEARRAYSIZE, VOLUMEARRAYSIZE, VOLUMEARRAYSIZE, 0, 0,
                                            D3DFMT_L16, D3DPOOL_MANAGED,
                                            &m_pVolumeTexture )))
			return E_FAIL;

    // Fill the volume texture
    {
        D3DLOCKED_BOX LockedBox;
        hr = m_pVolumeTexture->LockBox( 0, &LockedBox, 0, 0 );
        if( FAILED(hr) )
            return hr;

        for( UINT w=0; w<VOLUMEARRAYSIZE; w++ )
        {
            BYTE* pSliceStart = (BYTE*)LockedBox.pBits;

            for( UINT v=0; v<VOLUMEARRAYSIZE; v++ )
            {
                for( UINT u=0; u<VOLUMEARRAYSIZE; u++ )
                {
					((WORD*)LockedBox.pBits)[u] = (WORD)m_volumeData[w][v][u];  // 16 bit
				}
                LockedBox.pBits = (BYTE*)LockedBox.pBits + LockedBox.RowPitch;
            }
            LockedBox.pBits = pSliceStart + LockedBox.SlicePitch;
        }

        m_pVolumeTexture->UnlockBox( 0 );
    }
	//--------------- End Volume Texture --------------------------------------
	

	//----------------------- Create a gradient/mask texture -------------------------------
    if(FAILED(D3DXCreateVolumeTexture( m_pd3dDevice, VOLUMEARRAYSIZE, VOLUMEARRAYSIZE, VOLUMEARRAYSIZE, 0, 0,
                                            D3DFMT_A8R8G8B8, D3DPOOL_MANAGED,
                                            &m_pGradientTexture )))
			return E_FAIL;

    // Fill the Gradient texture
    {
        D3DLOCKED_BOX LockedBox;
        hr = m_pGradientTexture->LockBox( 0, &LockedBox, 0, 0 );
        if( FAILED(hr) )
            return hr;

        for( UINT w=0; w<256; w++ )
        {
            BYTE* pSliceStart = (BYTE*)LockedBox.pBits;

            for( UINT v=0; v<256; v++ )
            {
                for( UINT u=0; u<256; u++ )
                {
					DWORD a = 0;  // object mask
					
					DWORD r = (DWORD)m_gradient[w][v][u].x;
                    DWORD g = (DWORD)m_gradient[w][v][u].y;
                    DWORD b = (DWORD)m_gradient[w][v][u].z;
	
                    ((DWORD*)LockedBox.pBits)[u] = 0x00000000 + (a<<24) + (r<<16) + (g<<8) + (b);
                }
                LockedBox.pBits = (BYTE*)LockedBox.pBits + LockedBox.RowPitch;
            }
            LockedBox.pBits = pSliceStart + LockedBox.SlicePitch;
        }
        m_pGradientTexture->UnlockBox( 0 );
    }
	//--------------- End gradient/mask Texture --------------------------------------


	//------------ make Intermediate RenderTarget Texture 
	if(FAILED( D3DXCreateTexture( m_pd3dDevice, RENDERTARGETSIZE, RENDERTARGETSIZE, 0 , 
		D3DUSAGE_RENDERTARGET ,D3DFMT_A8R8G8B8 ,D3DPOOL_DEFAULT, &m_pIntermediateTexture )))
        return E_FAIL;
	
	// MPR_TEST
	//------------ make MPR RenderTarget Texture 
	if(FAILED( D3DXCreateTexture( m_pd3dDevice, MPR2DQUADWIDTH, MPR2DQUADWIDTH, 0 , 
		D3DUSAGE_RENDERTARGET ,D3DFMT_A32B32G32R32F ,D3DPOOL_DEFAULT, &m_pMPRRenderTarget )))
        return E_FAIL;

	//------------ make Pre-integrated texture !! --------------------------------------
	//---- Create a Pre-integrated 2D texture (OTFTEXTUREWIDTH x OTFTEXTUREWIDTH) ------------------------------
	if(FAILED(D3DXCreateTexture( m_pd3dDevice, OTFTEXTUREWIDTH, OTFTEXTUREWIDTH, 0, 0,
                                            D3DFMT_A8R8G8B8, D3DPOOL_MANAGED,
                                            &m_pPreIntegratedTexture )))
		return E_FAIL;

	if(FAILED(makePreIntegratedTexture()))
		return E_FAIL;

	
	//--------------- MIN MAX volume ----------------------------------
	CompressedVolume();
	//-----------------------2. Create a MIN MAX volume texture -------------------------------
	if(FAILED(D3DXCreateVolumeTexture( m_pd3dDevice, divX, divY, divZ,  0, 0,
                                            D3DFMT_L8, D3DPOOL_MANAGED,
                                            &m_pVolumeTexMM )))
		return E_FAIL;

	if(FAILED(makeMMVolumeTexture()))
		return E_FAIL;
	//---------------2. End minMax Texture --------------------------------------


	////////////////// make HLSL Effect shader() ///////////////////////////////////
	if(FAILED(MCreateShader()))
		return E_FAIL;

	//added by taeki------------------------------------------------------------------------------------------------------//
	//Open Data File
	FILE * fp;
//	fp = fopen("data256256256_16bit.den", "r");
//	fp = fopen("bighead.den", "r");
	fp = fopen(m_arFileName, "r");
//	fp = fopen("../angio16.den", "r");
//	fp = fopen("../512-512-1024.den", "r");
//	fp = fopen("../LargeData613.den", "r");
	
	if(fp == NULL)
		return DXTRACE_ERR( "Loading Error", E_FAIL );

	//盔杭俘 单捞磐甫 烙矫利栏肺 历厘窍绰 绢饭捞甫 父电促. 捞饶 捞巴篮 rapidia狼 盔杭俘 单捞磐肺 措眉茄促.


	m_intRedunDataX = m_intVolumeX+(int)(m_intVolumeX/m_intSubvolumeSizeX)-1;
	m_intRedunDataY = m_intVolumeY+(int)(m_intVolumeY/m_intSubvolumeSizeY)-1;
	m_intRedunDataZ = m_intVolumeZ+(int)(m_intVolumeZ/m_intSubvolumeSizeZ)-1;

	//吝汗沁阑锭狼 辑宏杭俘狼 肮荐甫 拌魂秦 初绰促. 
	m_intRealSubvolumeSlotX = (int)((float)m_intRedunDataX/(float)m_intSubvolumeSizeX+1.f);
	m_intRealSubvolumeSlotY = (int)((float)m_intRedunDataY/(float)m_intSubvolumeSizeY+1.f);
	m_intRealSubvolumeSlotZ = (int)((float)m_intRedunDataZ/(float)m_intSubvolumeSizeZ+1.f);
	
	//疵绢抄 辑宏杭俘狼 后傍埃阑 器窃茄 傈眉 杭俘狼 农扁
	int intRedunVolumeSizeX = m_intRealSubvolumeSlotX*m_intSubvolumeSizeX;
	int intRedunVolumeSizeY = m_intRealSubvolumeSlotY*m_intSubvolumeSizeY;
	int intRedunVolumeSizeZ = m_intRealSubvolumeSlotZ*m_intSubvolumeSizeZ;

//	m_pwordVolume = (WORD*)VirtualAlloc(NULL, sizeof(WORD)*intRedunVolumeSizeX*intRedunVolumeSizeY*intRedunVolumeSizeZ, MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE);

	//m_pboolIsSelectedSlot = new bool[m_intRealSubvolumeSlotX*m_intRealSubvolumeSlotY*m_intRealSubvolumeSlotZ];
	m_pboolIsSelectedSlot = (bool*)VirtualAlloc(NULL, sizeof(bool)*m_intRealSubvolumeSlotX*m_intRealSubvolumeSlotY*m_intRealSubvolumeSlotZ, MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE);
	ASSERT(m_pboolIsSelectedSlot);
	ZeroMemory(m_pboolIsSelectedSlot, sizeof(bool)*m_intRealSubvolumeSlotX*m_intRealSubvolumeSlotY*m_intRealSubvolumeSlotZ/sizeof(BYTE));

	//窍唱究 吝汗茄 农扁父怒狼 绢饭捞甫 父电促. 父老 辑宏杭俘捞 疵绢抄促搁 后傍埃鳖瘤 父甸绢霖促.
/*	m_pwordVolume = new WORD[intRedunVolumeSizeX*
							 intRedunVolumeSizeY*
							 intRedunVolumeSizeZ];*/
	
//	ZeroMemory(m_pwordVolume, 2*intRedunVolumeSizeX*intRedunVolumeSizeY*intRedunVolumeSizeZ);
	if(m_intDataType == 1)
	{
		fread(m_pbyteVolume, sizeof(BYTE), m_intVolumeX*m_intVolumeY*m_intVolumeZ, fp); //单捞磐 肺靛
	}
	if(m_intDataType == 2)
	{
		fread(m_pwordVolume, sizeof(WORD), m_intVolumeX*m_intVolumeY*m_intVolumeZ, fp); //单捞磐 肺靛
	}
	fclose(fp);


	//吝汗茄 肮荐父怒狼 辑宏杭俘俊 措茄 饭骇阑 檬扁拳茄促.
	m_pbyteSubvolumeLevel = (BYTE*)VirtualAlloc(NULL, sizeof(BYTE)*m_intRealSubvolumeSlotX*m_intRealSubvolumeSlotY*m_intRealSubvolumeSlotZ, MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE);
	ASSERT(m_pbyteSubvolumeLevel);
	ZeroMemory(m_pbyteSubvolumeLevel, m_intRealSubvolumeSlotX*m_intRealSubvolumeSlotY*m_intRealSubvolumeSlotZ);


	//目促鄂 窍唱狼 杭俘 咆胶苗甫 积己茄促. 捞饶 捞 咆胶苗 绰 啊惑 皋葛府肺 静牢促.
	if(FAILED(hr = m_pd3dDevice->CreateVolumeTexture(m_intVirtualMemorySlotX*m_intSubvolumeSizeX,
									  m_intVirtualMemorySlotY*m_intSubvolumeSizeY,
									  m_intVirtualMemorySlotZ*m_intSubvolumeSizeZ,
									  0, 0, D3DFMT_L16, D3DPOOL_MANAGED,
									  &m_pVoltexVirtual, NULL)))
									  return E_FAIL;
/*	D3DLOCKED_BOX pLockedBox;
	m_pVoltexVirtual->LockBox(0, &pLockedBox, 0, 0);
	ZeroMemory(pLockedBox.pBits, 2*m_intVirtualMemorySlotX*m_intSubvolumeSizeX*m_intVirtualMemorySlotY*m_intSubvolumeSizeY*m_intVirtualMemorySlotZ*m_intSubvolumeSizeZ);
*/	
	//滚抿倔 皋葛府狼 occupied咯何甫 唱鸥郴绰 浇吩沥焊甫 檬扁拳茄促.
	for(int level = 0; level < MAXLEVEL; level++)
	{
		m_pboolIsNotEmptySlot[level] = (bool*)VirtualAlloc(NULL, sizeof(bool)*m_intVirtualMemorySlotX*m_intVirtualMemorySlotY*m_intVirtualMemorySlotZ*MAXLEVEL, MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE);
		ZeroMemory(m_pboolIsNotEmptySlot[level], sizeof(bool)*MAXLEVEL*m_intVirtualMemorySlotX*m_intVirtualMemorySlotY*m_intVirtualMemorySlotZ/sizeof(BYTE));
	}

	m_psVirtualMemory = (VirtualMemory*)VirtualAlloc(NULL, sizeof(VirtualMemory)*m_intVirtualMemorySlotX*m_intVirtualMemorySlotY*m_intVirtualMemorySlotZ, MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE);
	ASSERT(m_psVirtualMemory);
//	ZeroMemory(m_psVirtualMemory, m_intVirtualMemorySlotX*m_intVirtualMemorySlotY*m_intVirtualMemorySlotZ*sizeof(VirtualMemory)/sizeof(BYTE));
	//概欺甫 胶纳领傅窍绰 绢饭捞甫 积己茄促. 2048俺甫 逞阑荐 乐栏唱 老窜 2048 捞窍肺 啊沥茄促. (逞绰版快绰芭狼绝促绊航)
	m_pdwordMapper = new DWORD[m_intRealSubvolumeSlotX*m_intRealSubvolumeSlotY*m_intRealSubvolumeSlotZ];
	ZeroMemory(m_pdwordMapper, (int)(sizeof(DWORD)/sizeof(BYTE))*m_intRealSubvolumeSlotX*m_intRealSubvolumeSlotY*m_intRealSubvolumeSlotZ);

	//概欺 咆胶苗甫 积己茄促. 盔贰绰 吝汗等 辑宏杭俘狼 肮荐客 鞍酒具 窍唱 2048俺甫 逞瘤臼绰促绰 啊沥窍俊 酒贰客 鞍篮 肮荐肺 父电促.
	if(FAILED(hr = m_pd3dDevice->CreateTexture(m_intVirtualMemorySlotX*m_intVirtualMemorySlotY*m_intVirtualMemorySlotZ,
									  1,
									  0, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_pTexMapper, NULL)))
									  return E_FAIL;
/*	D3DLOCKED_RECT pLockedRect;
	m_pTexMapper->LockRect(0, &pLockedRect, 0, 0);
	ZeroMemory(pLockedRect.pBits, 8*m_intVirtualMemorySlotX*m_intVirtualMemorySlotY*m_intVirtualMemorySlotZ);
	m_pTexMapper->UnlockRect(0);*/
	
/*	if(FAILED(hr = m_pd3dDevice->CreateTexture(512, 512, 0, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, 
		&m_pTexPosition, NULL))) return E_FAIL;*/
	//角氰
	UpdateSubvolumeSet();
	CreateMapper();
	FetchLevelSet(0);
	//----------------------------------------------------------------------------------------------------------------------//

	return S_OK;

}


//////////////////////// Fill Vertex Buffer  ///////////////////////////////
//-----   called in InitDeviceObjects()  --------------------------------------
HRESULT CAppForm::MFillVertexBuffer()
{
	HRESULT hr;
	/////////////// make Vertex Buffer //////////////////////////////////////////////
    //--------------- Create a vertex buffer for pass0  ------------------------------------
	float tmp0 = 1.0f / OBJECTSLICENUM;
	float tmpZ0 = VOLUMEWIDTH / OBJECTSLICENUM;
	float halfSliceRangeOff0 = tmpZ0 / 2.0f;         // 0.270632939
	float halfTexRangeOff0 =  tmp0 / 2.0f;
	float halfSliceRange0 = CLIPTOP;

		if( FAILED( hr = m_pd3dDevice->CreateVertexBuffer( 3 * OBJECTSLICENUM*4*sizeof(OBJECTORDERPROXY),
                                           D3DUSAGE_WRITEONLY,
                                           0,
                                           D3DPOOL_DEFAULT, &m_pObjectOrderProxy, NULL ) ) )
            return hr;

        OBJECTORDERPROXY* pVertices0;
        m_pObjectOrderProxy->Lock( 0, 0, (void**)&pVertices0, 0 );

		//----------- for z axies -------------------------------
		for(int slice=0; slice < OBJECTSLICENUM; slice++)
		{
			// 1,0 // 0,0 // 1,1 // 0,1
			int s = 4*slice;
			pVertices0[s].x = halfSliceRange0;
			pVertices0[s].y = halfSliceRange0;
			pVertices0[s].z = -halfSliceRange0 +halfSliceRangeOff0 + tmpZ0 * slice;
			pVertices0[s].tu0 = 1.0f;
			pVertices0[s].tv0 = 0.0;
			pVertices0[s].tw0 = halfTexRangeOff0 + tmp0 * slice;

			pVertices0[s+1].x = -halfSliceRange0;
			pVertices0[s+1].y = halfSliceRange0;
			pVertices0[s+1].z = -halfSliceRange0 +halfSliceRangeOff0 + tmpZ0 * slice;
			pVertices0[s+1].tu0 = 0.0f;
			pVertices0[s+1].tv0 = 0.0f;
			pVertices0[s+1].tw0 = halfTexRangeOff0 + tmp0 * slice;

			pVertices0[s+2].x = halfSliceRange0;
			pVertices0[s+2].y = -halfSliceRange0;
			pVertices0[s+2].z = -halfSliceRange0 +halfSliceRangeOff0 + tmpZ0 * slice;
			pVertices0[s+2].tu0 = 1.0f;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -