irrlicht锁纹理和渲染目标

 

// ! lock function
void *  CD3D9Texture:: lock ( bool  readOnly, u32 mipmapLevel)
{
    
if  ( ! Texture)
        
return   0 ;

    MipLevelLocked
= mipmapLevel;
    HRESULT hr;
    D3DLOCKED_RECT rect;
    
if ( ! IsRenderTarget)
    {
        hr 
=  Texture -> LockRect(mipmapLevel,  & rect,  0 , readOnly ? D3DLOCK_READONLY: 0 );
        
if  (FAILED(hr))
        {
            os::Printer::log(
" Could not lock DIRECT3D9 Texture. " , ELL_ERROR);
            
return   0 ;
        }
    }
    
else
    {
        
if  ( ! RTTSurface)
        {
            
//  Make RTT surface large enough for all miplevels (including 0)
            D3DSURFACE_DESC desc;
            Texture
-> GetLevelDesc( 0 & desc);
            hr 
=  Device -> CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format, D3DPOOL_SYSTEMMEM,  & RTTSurface,  0 );
            
if  (FAILED(hr))
            {
                os::Printer::log(
" Could not lock DIRECT3D9 Texture " " Offscreen surface creation failed. " , ELL_ERROR);
                
return   0 ;
            }
        }

        IDirect3DSurface9 
* surface  =   0 ;
        hr 
=  Texture -> GetSurfaceLevel(mipmapLevel,  & surface);
        
if  (FAILED(hr))
        {
            os::Printer::log(
" Could not lock DIRECT3D9 Texture " " Could not get surface. " , ELL_ERROR);
            
return   0 ;
        }
        hr 
=  Device -> GetRenderTargetData(surface, RTTSurface);
        surface
-> Release();
        
if (FAILED(hr))
        {
            os::Printer::log(
" Could not lock DIRECT3D9 Texture " " Data copy failed. " , ELL_ERROR);
            
return   0 ;
        }
        hr 
=  RTTSurface -> LockRect( & rect,  0 , readOnly ? D3DLOCK_READONLY: 0 );
        
if (FAILED(hr))
        {
            os::Printer::log(
" Could not lock DIRECT3D9 Texture " " LockRect failed. " , ELL_ERROR);
            
return   0 ;
        }
    }
    
return  rect.pBits;
}

 

你可能感兴趣的:(目标)