public void Rebind(XnaHardwarePixelBuffer buffer) { pixelBuffer = buffer; width = pixelBuffer.Width; height = pixelBuffer.Height; colorDepth = PixelUtil.GetNumElemBits(buffer.Format); }
public void Rebind( XnaHardwarePixelBuffer buffer ) { pixelBuffer = buffer; Width = pixelBuffer.Width; Height = pixelBuffer.Height; ColorDepth = PixelUtil.GetNumElemBits( buffer.Format ); }
private void CreateSurfaceList() { //Debug.Assert( this._texture != null, "texture must be intialized." ); Texture2D texture = null; // Make sure number of mips is right if (Usage != TextureUsage.RenderTarget) { mipmapCount = _texture.LevelCount - 1; } //#if SILVERLIGHT if (mipmapCount < 0) { mipmapCount = 0; } //#endif // Need to know static / dynamic BufferUsage bufusage; if (((Usage & TextureUsage.Dynamic) != 0) && _dynamicTextures) { bufusage = BufferUsage.Dynamic; } else { bufusage = BufferUsage.Static; } if ((Usage & TextureUsage.RenderTarget) != 0) { bufusage = (BufferUsage)((int)bufusage | (int)TextureUsage.RenderTarget); } // If we already have the right number of surfaces, just update the old list var updateOldList = (_surfaceList.Count == (FaceCount * (MipmapCount + 1))); if (!updateOldList) { // Create new list of surfaces ClearSurfaceList(); for (var face = 0; face < FaceCount; ++face) { for (var mip = 0; mip <= MipmapCount; ++mip) { var buffer = new XnaHardwarePixelBuffer(bufusage); _surfaceList.Add(buffer); } } } switch (TextureType) { case TextureType.OneD: case TextureType.TwoD: Debug.Assert(_normTexture != null, "texture must be intialized."); // instead of passing a new texture2d to the hardware pixel buffer that wont have any reference to this normalTexture, // we pass the normTexture and bind each mip level // not sure but seems to work, each hardwarePixelBuffer will have the same reference to this same texture, // but with different mips level, that will be updated with SetData(miplevel,ect...) // This is required because .GetData<byte>( level ... ) copies the data from the buffer whereas in DX GetSurfaceLevel // creates a new Surface object that references the same data. // - borrillis if (Usage == TextureUsage.RenderTarget) { GetSurfaceAtLevel(0, 0).Bind(_device, renderTarget, updateOldList); } else // For all mipmaps, store surfaces as HardwarePixelBuffer { for (ushort mip = 0; mip <= MipmapCount; ++mip) { GetSurfaceAtLevel(0, mip).Bind(_device, _normTexture, mip, updateOldList); } } break; case TextureType.CubeMap: Debug.Assert(_cubeTexture != null, "texture must be initialized."); // For all faces and mipmaps, store surfaces as HardwarePixelBuffer for (ushort face = 0; face < 6; ++face) { for (ushort mip = 0; mip <= MipmapCount; ++mip) { GetSurfaceAtLevel(face, mip).Bind(_device, _cubeTexture, face, mip, updateOldList); } } break; case TextureType.ThreeD: #if !SILVERLIGHT Debug.Assert(_volumeTexture != null, "texture must be intialized."); // For all mipmaps, store surfaces as HardwarePixelBuffer // TODO - Load Volume Textures for (var mip = 0; mip <= MipmapCount; ++mip) { GetSurfaceAtLevel(0, mip).Bind(_device, _volumeTexture, updateOldList); } #else throw new NotSupportedException("TextureType.ThreeD is not supported in Silverlight 5."); #endif break; } // Set autogeneration of mipmaps for each face of the texture, if it is enabled if ((requestedMipmapCount != 0) && ((Usage & TextureUsage.AutoMipMap) != 0)) { for (var face = 0; face < FaceCount; ++face) { GetSurfaceAtLevel(face, 0).SetMipmapping(true, MipmapsHardwareGenerated, _texture); } } }
private void CreateSurfaceList() { //Debug.Assert( this._texture != null, "texture must be intialized." ); Texture2D texture = null; // Make sure number of mips is right if ( Usage != TextureUsage.RenderTarget ) { mipmapCount = _texture.LevelCount - 1; } //#if SILVERLIGHT if (mipmapCount < 0) mipmapCount = 0; //#endif // Need to know static / dynamic BufferUsage bufusage; if ( ( ( Usage & TextureUsage.Dynamic ) != 0 ) && _dynamicTextures ) { bufusage = BufferUsage.Dynamic; } else { bufusage = BufferUsage.Static; } if ( ( Usage & TextureUsage.RenderTarget ) != 0 ) { bufusage = (BufferUsage)( (int)bufusage | (int)TextureUsage.RenderTarget ); } // If we already have the right number of surfaces, just update the old list var updateOldList = ( _surfaceList.Count == ( FaceCount * ( MipmapCount + 1 ) ) ); if ( !updateOldList ) { // Create new list of surfaces ClearSurfaceList(); for ( var face = 0; face < FaceCount; ++face ) { for ( var mip = 0; mip <= MipmapCount; ++mip ) { var buffer = new XnaHardwarePixelBuffer( bufusage ); _surfaceList.Add( buffer ); } } } switch ( TextureType ) { case TextureType.OneD: case TextureType.TwoD: Debug.Assert( _normTexture != null, "texture must be intialized." ); // instead of passing a new texture2d to the hardware pixel buffer that wont have any reference to this normalTexture, // we pass the normTexture and bind each mip level // not sure but seems to work, each hardwarePixelBuffer will have the same reference to this same texture, // but with different mips level, that will be updated with SetData(miplevel,ect...) // This is required because .GetData<byte>( level ... ) copies the data from the buffer whereas in DX GetSurfaceLevel // creates a new Surface object that references the same data. // - borrillis if ( Usage == TextureUsage.RenderTarget ) { GetSurfaceAtLevel( 0, 0 ).Bind( _device, renderTarget, updateOldList ); } else // For all mipmaps, store surfaces as HardwarePixelBuffer { for ( ushort mip = 0; mip <= MipmapCount; ++mip ) { GetSurfaceAtLevel( 0, mip ).Bind( _device, _normTexture, mip, updateOldList ); } } break; case TextureType.CubeMap: Debug.Assert( _cubeTexture != null, "texture must be initialized." ); // For all faces and mipmaps, store surfaces as HardwarePixelBuffer for ( ushort face = 0; face < 6; ++face ) { for ( ushort mip = 0; mip <= MipmapCount; ++mip ) { GetSurfaceAtLevel( face, mip ).Bind( _device, _cubeTexture, face, mip, updateOldList ); } } break; case TextureType.ThreeD: #if !SILVERLIGHT Debug.Assert( _volumeTexture != null, "texture must be intialized." ); // For all mipmaps, store surfaces as HardwarePixelBuffer // TODO - Load Volume Textures for ( var mip = 0; mip <= MipmapCount; ++mip ) { GetSurfaceAtLevel( 0, mip ).Bind( _device, _volumeTexture, updateOldList ); } #else throw new NotSupportedException("TextureType.ThreeD is not supported in Silverlight 5."); #endif break; } // Set autogeneration of mipmaps for each face of the texture, if it is enabled if ( ( requestedMipmapCount != 0 ) && ( ( Usage & TextureUsage.AutoMipMap ) != 0 ) ) { for ( var face = 0; face < FaceCount; ++face ) { GetSurfaceAtLevel( face, 0 ).SetMipmapping( true, MipmapsHardwareGenerated, _texture ); } } }