HRESULT CDxtexDoc::LoadSurfaceFromVolumeSlice(LPDIRECT3DVOLUME9 pVolume, UINT iSlice, LPDIRECT3DSURFACE9 psurf) { HRESULT hr; D3DVOLUME_DESC vd; D3DLOCKED_BOX lb; D3DBOX box; RECT rc; pVolume->GetDesc(&vd); box.Left = 0; box.Right = vd.Width; box.Top = 0; box.Bottom = vd.Height; box.Front = iSlice; box.Back = iSlice + 1; rc.left = 0; rc.right = vd.Width; rc.top = 0; rc.bottom = vd.Height; hr = pVolume->LockBox(&lb, &box, 0); if (FAILED(hr)) return hr; hr = D3DXLoadSurfaceFromMemory(psurf, NULL, NULL, lb.pBits, vd.Format, lb.RowPitch, NULL, &rc, D3DX_DEFAULT, 0); pVolume->UnlockBox(); return hr; }
HRESULT CDxtexDoc::LoadVolumeSliceFromSurface(LPDIRECT3DVOLUME9 pVolume, UINT iSlice, LPDIRECT3DSURFACE9 psurf) { HRESULT hr; D3DSURFACE_DESC sd; D3DVOLUME_DESC vd; D3DLOCKED_RECT lr; D3DBOX boxSrc; D3DBOX boxDest; psurf->GetDesc(&sd); pVolume->GetDesc(&vd); boxSrc.Left = 0; boxSrc.Right = sd.Width; boxSrc.Top = 0; boxSrc.Bottom = sd.Height; boxSrc.Front = 0; boxSrc.Back = 1; boxDest.Left = 0; boxDest.Right = vd.Width; boxDest.Top = 0; boxDest.Bottom = vd.Height; boxDest.Front = iSlice; boxDest.Back = iSlice + 1; hr = psurf->LockRect(&lr, NULL, 0); if (FAILED(hr)) return hr; hr = D3DXLoadVolumeFromMemory(pVolume, NULL, &boxDest, lr.pBits, sd.Format, lr.Pitch, 0, NULL, &boxSrc, D3DX_DEFAULT, 0); psurf->UnlockRect(); return hr; }
//----------------------------------------------------------------------------- // loadTexture - raw //----------------------------------------------------------------------------- bool GFXD3D9TextureManager::_loadTexture( GFXTextureObject *inTex, void *raw ) { PROFILE_SCOPE(GFXD3D9TextureManager_loadTextureRaw); GFXD3D9TextureObject *texture = (GFXD3D9TextureObject *) inTex; // currently only for volume textures... if( texture->getDepth() < 1 ) return false; U32 bytesPerPix = 1; switch( texture->mFormat ) { case GFXFormatR8G8B8: bytesPerPix = 3; break; case GFXFormatR8G8B8A8: case GFXFormatR8G8B8X8: bytesPerPix = 4; break; } U32 rowPitch = texture->getWidth() * bytesPerPix; U32 slicePitch = texture->getWidth() * texture->getHeight() * bytesPerPix; D3DBOX box; box.Left = 0; box.Right = texture->getWidth(); box.Front = 0; box.Back = texture->getDepth(); box.Top = 0; box.Bottom = texture->getHeight(); LPDIRECT3DVOLUME9 volume = NULL; D3D9Assert( texture->get3DTex()->GetVolumeLevel( 0, &volume ), "Failed to load volume" ); #ifdef TORQUE_OS_XENON D3DLOCKED_BOX lockedBox; volume->LockBox( &lockedBox, &box, 0 ); dMemcpy( lockedBox.pBits, raw, slicePitch * texture->getDepth() ); volume->UnlockBox(); #else D3D9Assert( GFXD3DX.D3DXLoadVolumeFromMemory( volume, NULL, NULL, raw, GFXD3D9TextureFormat[texture->mFormat], rowPitch, slicePitch, NULL, &box, #ifdef TORQUE_OS_XENON false, 0, 0, 0, // Unique to Xenon -pw #endif D3DX_FILTER_NONE, 0 ), "Failed to load volume texture" ); #endif volume->Release(); return true; }