public D3DHardwarePixelBuffer( BufferUsage usage ) : base( 0, 0, 0, Axiom.Media.PixelFormat.Unknown, usage, false, false ) { device = null; surface = null; volume = null; tempSurface = null; tempVolume = null; doMipmapGen = false; HWMipmaps = false; mipTex = null; sliceTRT = new List<RenderTexture>(); }
///<summary> /// Function to set mipmap generation ///</summary> public void SetMipmapping( bool doMipmapGen, bool HWMipmaps, D3D.BaseTexture mipTex ) { this.doMipmapGen = doMipmapGen; this.HWMipmaps = HWMipmaps; this.mipTex = mipTex; }
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(); }
public override void Unload() { base.Unload(); if ( IsLoaded ) { if ( this._texture != null ) { this._texture.Dispose(); this._texture = null; } if ( this._normTexture != null ) { LogManager.Instance.Write( "Disposed normal texture {0}", this.Name ); this._normTexture.Dispose(); this._normTexture = null; } if ( this._cubeTexture != null ) { this._cubeTexture.Dispose(); this._cubeTexture = null; } if ( this._volumeTexture != null ) { this._volumeTexture.Dispose(); this._volumeTexture = null; } } }
private void CreateNormalTexture() { Debug.Assert( SrcWidth > 0 && SrcHeight > 0 ); // determine which D3D9 pixel format we'll use D3D.Format d3dPixelFormat = ChooseD3DFormat(); // set the appropriate usage based on the usage of this texture D3D.Usage d3dUsage = ( ( Usage & TextureUsage.RenderTarget ) == TextureUsage.RenderTarget ) ? D3D.Usage.RenderTarget : D3D.Usage.None; // how many mips to use? int numMips = RequestedMipmapCount + 1; D3D.TextureRequirements texRequire = new D3D.TextureRequirements(); texRequire.Width = SrcWidth; texRequire.Height = SrcHeight; // check texture requirements texRequire.MipLevelCount = numMips; texRequire.Format = d3dPixelFormat; //// NOTE: Although texRequire is an out parameter, it actually does //// use the data passed in with that object. texRequire = D3D.Texture.CheckRequirements( _device, SrcWidth, SrcHeight, numMips, d3dUsage, d3dPixelFormat, D3D.Pool.Default ); // Save updated texture requirements numMips = texRequire.MipLevelCount; d3dPixelFormat = texRequire.Format; if ( ( Usage & TextureUsage.Dynamic ) == TextureUsage.Dynamic ) { if ( CanUseDynamicTextures( d3dUsage, D3D.ResourceType.Texture, d3dPixelFormat ) ) { d3dUsage |= D3D.Usage.Dynamic; _dynamicTextures = true; } else { _dynamicTextures = false; } } // check if mip maps are supported on hardware MipmapsHardwareGenerated = false; if ( ( _devCaps.TextureCaps & D3D.TextureCaps.MipMap ) == D3D.TextureCaps.MipMap ) { if ( ( ( Usage & TextureUsage.AutoMipMap ) == TextureUsage.AutoMipMap ) && RequestedMipmapCount > 0 ) { MipmapsHardwareGenerated = this.CanAutoGenMipMaps( d3dUsage, D3D.ResourceType.Texture, d3dPixelFormat ); if ( MipmapsHardwareGenerated ) { d3dUsage |= D3D.Usage.AutoGenerateMipMap; numMips = 0; } } } else { // no mip map support for this kind of texture MipmapCount = 0; numMips = 1; } // create the texture _normTexture = new D3D.Texture( _device, SrcWidth, SrcHeight, numMips, d3dUsage, d3dPixelFormat, _d3dPool ); // store base reference to the texture _texture = _normTexture; // set the final texture attributes D3D.SurfaceDescription desc = _normTexture.GetLevelDescription( 0 ); SetFinalAttributes( desc.Width, desc.Height, 1, D3DHelper.ConvertEnum( desc.Format ) ); if ( MipmapsHardwareGenerated ) { _texture.AutoMipGenerationFilter = GetBestFilterMethod(); } }
private void CreateCubeTexture() { Debug.Assert( SrcWidth > 0 && SrcHeight > 0 ); // use current back buffer format for render textures, else use the one // defined by this texture format D3D.Format d3dPixelFormat = ( Usage == TextureUsage.RenderTarget ) ? _bbPixelFormat : ChooseD3DFormat(); // set the appropriate usage based on the usage of this texture D3D.Usage d3dUsage = ( Usage == TextureUsage.RenderTarget ) ? D3D.Usage.RenderTarget : 0; // how many mips to use? make sure its at least one int numMips = ( MipmapCount > 0 ) ? MipmapCount : 1; if ( ( _devCaps.TextureCaps & D3D.TextureCaps.MipCubeMap ) != D3D.TextureCaps.MipCubeMap ) { if ( this.CanAutoGenMipMaps( d3dUsage, D3D.ResourceType.CubeTexture, d3dPixelFormat ) ) { d3dUsage |= D3D.Usage.AutoGenerateMipMap; numMips = 0; } } else { // no mip map support for this kind of texture MipmapCount = 0; numMips = 1; } // create the cube texture _cubeTexture = new D3D.CubeTexture( _device, SrcWidth, numMips, d3dUsage, d3dPixelFormat, ( Usage == TextureUsage.RenderTarget ) ? D3D.Pool.Default : D3D.Pool.Managed ); // store base reference to the texture _texture = _cubeTexture; // set the final texture attributes D3D.SurfaceDescription desc = _cubeTexture.GetLevelDescription( 0 ); SetFinalAttributes( desc.Width, desc.Height, 1, D3DHelper.ConvertEnum( desc.Format ) ); // store base reference to the texture _texture = _cubeTexture; 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(); } }
private void LoadCubeTexture() { Debug.Assert( this.TextureType == TextureType.CubeMap, "this.TextureType == TextureType.CubeMap" ); 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.MipCubeMap ) != D3D.TextureCaps.MipCubeMap ) { // 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 _cubeTexture = D3D.CubeTexture.FromStream( _device, stream, (int)stream.Length, 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 cube texture.", ex ); } // store off a base reference _texture = _cubeTexture; // set src and dest attributes to the same, we can't know D3D.SurfaceDescription desc = _cubeTexture.GetLevelDescription( 0 ); _d3dPool = desc.Pool; SetSrcAttributes( desc.Width, desc.Height, 1, D3DHelper.ConvertEnum( desc.Format ) ); SetFinalAttributes( desc.Width, desc.Height, 1, D3DHelper.ConvertEnum( desc.Format ) ); internalResourcesCreated = true; stream.Close(); } else { // Load from 6 separate files // Use Axiom codecs string[] postfixes = { "_rt", "_lf", "_up", "_dn", "_fr", "_bk" }; List<Image> images = new List<Image>(); int pos = Name.LastIndexOf( "." ); string baseName = Name.Substring( 0, pos ); string ext = Name.Substring( pos + 1 ); for ( int i = 0; i < 6; i++ ) { string fullName = baseName + postfixes[ i ] + "." + ext; Stream strm = ResourceGroupManager.Instance.OpenResource( fullName, Group, true, this ); var image = Image.FromStream( strm, ext ); images.Add( image ); strm.Close(); } LoadImages( images.ToArray() ); } }
protected override void freeInternalResources() { if ( this._texture != null && !_texture.Disposed ) { this._texture.Dispose(); this._texture = null; } if ( this._normTexture != null && !_normTexture.Disposed ) { this._normTexture.Dispose(); this._normTexture = null; } if ( this._cubeTexture != null && !_cubeTexture.Disposed ) { this._cubeTexture.Dispose(); this._cubeTexture = null; } if ( this._volumeTexture != null && !_volumeTexture.Disposed ) { this._volumeTexture.Dispose(); this._volumeTexture = null; } }