private void CreateVolumeTexture() { Debug.Assert( Width > 0 && Height > 0 && Depth > 0 ); if ( ( Usage & TextureUsage.RenderTarget ) != 0 ) { throw new Exception( "SDX Volume texture can not be declared as render target!!, SDXTexture.CreateVolumeTexture" ); } D3D.Format sdPF = ChooseD3DFormat(); D3D.Usage usage = 0; int numMips = ( RequestedMipmapCount == 0x7FFFFFFF ) ? -1 : RequestedMipmapCount + 1; if ( ( Usage & TextureUsage.Dynamic ) != 0 ) { if ( CanUseDynamicTextures( usage, D3D.ResourceType.VolumeTexture, sdPF ) ) { usage |= D3D.Usage.Dynamic; _dynamicTextures = true; } else { _dynamicTextures = false; } } // check if mip map volume textures are supported MipmapsHardwareGenerated = false; if ( ( _devCaps.TextureCaps & D3D.TextureCaps.MipVolumeMap ) != 0 ) { if ( ( Usage & TextureUsage.AutoMipMap ) != 0 && RequestedMipmapCount != 0 ) { MipmapsHardwareGenerated = CanAutoGenMipMaps( usage, D3D.ResourceType.VolumeTexture, sdPF ); if ( MipmapsHardwareGenerated ) { Usage |= TextureUsage.AutoMipMap; numMips = 0; } } } else { // no mip map support for this kind of textures :( MipmapCount = 0; numMips = 1; } // derive the pool to use DeterminePool(); // create the texture _volumeTexture = new D3D.VolumeTexture( _device, Width, Height, Depth, numMips, usage, sdPF, _d3dPool ); // store base reference to the texture _texture = _volumeTexture; // set the final texture attributes D3D.VolumeDescription desc = _volumeTexture.GetLevelDescription( 0 ); SetFinalAttributes( desc.Width, desc.Height, desc.Depth, D3DHelper.ConvertEnum( desc.Format ) ); if ( this.MipmapsHardwareGenerated ) _texture.AutoMipGenerationFilter = GetBestFilterMethod(); }
private void LoadVolumeTexture() { Debug.Assert( this.TextureType == TextureType.ThreeD ); if ( Name.EndsWith( ".dds" ) ) { Stream stream = ResourceGroupManager.Instance.OpenResource( Name, Group, true, this ); int numMips = this.RequestedMipmapCount + 1; // check if mip map volume textures are supported if ( ( _devCaps.TextureCaps & D3D.TextureCaps.MipVolumeMap ) != D3D.TextureCaps.MipVolumeMap ) { // no mip map support for this kind of textures :( this.MipmapCount = 0; numMips = 1; } _d3dPool = ( Usage & TextureUsage.Dynamic ) != 0 ? D3D.Pool.Default : D3D.Pool.Managed; try { // load the cube texture from the image data stream directly _volumeTexture = D3D.VolumeTexture.FromStream( _device, stream, (int)stream.Length, -1, -1, -1, numMips, D3D.Usage.None, D3D.Format.Unknown, _d3dPool, D3D.Filter.None, D3D.Filter.None, 0 ); } catch ( Exception ex ) { FreeInternalResources(); throw new Exception( "Can't create volume texture.", ex ); } // store off a base reference _texture = _volumeTexture; // set src and dest attributes to the same, we can't know D3D.VolumeDescription desc = _volumeTexture.GetLevelDescription( 0 ); _d3dPool = desc.Pool; SetSrcAttributes( desc.Width, desc.Height, desc.Depth, D3DHelper.ConvertEnum( desc.Format ) ); SetFinalAttributes( desc.Width, desc.Height, desc.Depth, D3DHelper.ConvertEnum( desc.Format ) ); internalResourcesCreated = true; stream.Close(); } else { // find & load resource data intro stream to allow resource group changes if required Stream strm = ResourceGroupManager.Instance.OpenResource( Name, Group, true, this ); int pos = Name.LastIndexOf( "." ); String ext = Name.Substring( pos + 1 ); // Call internal LoadImages, not LoadImage since that's external and // will determine load status etc again var image = Image.FromStream( strm, ext ); LoadImages( new Image[] { image } ); image.Dispose(); strm.Close(); } }