📄 mvolumerender.cpp
字号:
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 + -