Esempio n. 1
0
        /// <summary>
        /// Creates a texture on the GPU with the chosen parameters
        /// </summary>
        /// <param name="bitmapBlock"></param>
        /// <param name="textureMagFilter"></param>
        /// <param name="textureMinFilter"></param>
        public void Load(BitmapDataBlock bitmapBlock,
                         TextureMagFilter textureMagFilter = TextureMagFilter.Linear,
                         TextureMinFilter textureMinFilter = TextureMinFilter.Linear)
        {
            var buffer = bitmapBlock.GetResourceData( );

            if (buffer == null)
            {
                return;
            }
            var width  = bitmapBlock.Width;
            var height = bitmapBlock.Height;

            var bytesPerPixel = GetBitSize(bitmapBlock.Format) / 8.0f;

            if (bitmapBlock.BitmapDataFlags.HasFlag(BitmapDataBlock.Flags.Palettized))
            {
                LoadPalettedTexture(bitmapBlock, P8ColourBytes, textureMagFilter, textureMinFilter);
                return;
            }

            if (bitmapBlock.BitmapDataFlags.HasFlag(BitmapDataBlock.Flags.Swizzled))
            {
                buffer = Swizzler.Swizzle(buffer, ( int )bytesPerPixel, width, height);
            }

            var pixelInternalFormat = GetPixelInternalFormat(bitmapBlock.Format);

            switch (bitmapBlock.Type)
            {
            case BitmapDataBlock.TypeEnum.Texture2D:
            {
                LoadTexture2D(textureMagFilter, textureMinFilter, bytesPerPixel, width, height, buffer,
                              bitmapBlock, pixelInternalFormat);
            }

            break;

            case BitmapDataBlock.TypeEnum.Cubemap:
            {
                LoadCubemap(textureMagFilter, textureMinFilter, bytesPerPixel, width, height, buffer, bitmapBlock,
                            pixelInternalFormat);
            }

            break;

            case BitmapDataBlock.TypeEnum.Texture3D:
            {
                LoadTexture2D(textureMagFilter, textureMinFilter, bytesPerPixel, width, height, buffer,
                              bitmapBlock, pixelInternalFormat);
            }
            break;

            default:
            {
                GL.DeleteTexture(_handle);
            }
            break;
            }
        }
Esempio n. 2
0
 public void Add(BitmapDataBlock block)
 {
     InnerList.Add(block);
     if (linkedBlock.Count < InnerList.Count)
     {
         linkedBlock.Count = InnerList.Count;
     }
 }
Esempio n. 3
0
        private void LoadCubemap(TextureMagFilter textureMagFilter, TextureMinFilter textureMinFilter,
                                 float bytesPerPixel,
                                 short width, short height, byte[] buffer, BitmapDataBlock workingBitmap,
                                 PixelInternalFormat pixelInternalFormat)
        {
            _textureTarget = TextureTarget.TextureCubeMap;
            GL.BindTexture(TextureTarget.TextureCubeMap, _handle);
            GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureMagFilter,
                            ( int )textureMagFilter);
            GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureMinFilter,
                            ( int )textureMinFilter);
            GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapS,
                            ( int )TextureWrapMode.ClampToEdge);
            GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapT,
                            ( int )TextureWrapMode.ClampToEdge);
            GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapR,
                            ( int )TextureWrapMode.ClampToEdge);

            TextureTarget[] cube =
            {
                TextureTarget.TextureCubeMapPositiveX,
                TextureTarget.TextureCubeMapNegativeX,
                TextureTarget.TextureCubeMapPositiveY,
                TextureTarget.TextureCubeMapNegativeY,
                TextureTarget.TextureCubeMapPositiveZ,
                TextureTarget.TextureCubeMapNegativeZ
            };

            for (var i = 0; i < 6; ++i)
            {
                var surfaceData = new byte[( int )(bytesPerPixel * width * height)];
                var stride      = buffer.Length / 6;
                Array.Copy(buffer, stride * i, surfaceData, 0, surfaceData.Length);


                if (workingBitmap.BitmapDataFlags.HasFlag(BitmapDataBlock.Flags.Compressed))
                {
                    GL.CompressedTexImage2D(
                        cube[i], 0, pixelInternalFormat, width, height, 0,
                        ( int )(bytesPerPixel * width * height), surfaceData);
                }
                else
                {
                    var pixelFormat = GetPixelFormat(workingBitmap.Format);
                    var pixelType   = GetPixelType(workingBitmap.Format);
                    GL.TexImage2D(cube[i], 0, pixelInternalFormat, width, height, 0, pixelFormat, pixelType,
                                  surfaceData);
                }
            }
            GL.BindTexture(TextureTarget.Texture2D, 0);
        }
Esempio n. 4
0
        private void LoadPalettedTexture(BitmapDataBlock bitmapBlock, byte[] paletteData, TextureMagFilter textureMagFilter, TextureMinFilter textureMinFilter)
        {
            if (bitmapBlock.Format != BitmapDataBlock.FormatEnum.P8 &&
                bitmapBlock.Format != BitmapDataBlock.FormatEnum.P8bump)
            {
                return;
            }
            _textureTarget = TextureTarget.Texture2D;

            GL.BindTexture(TextureTarget.Texture2D, _handle);
            GL.TexParameter(_textureTarget, TextureParameterName.TextureMagFilter,
                            ( int )textureMagFilter);
            GL.TexParameter(_textureTarget, TextureParameterName.TextureMinFilter,
                            ( int )textureMinFilter);
            GL.TexParameter(_textureTarget, TextureParameterName.TextureWrapS,
                            ( int )TextureWrapMode.Repeat);
            GL.TexParameter(_textureTarget, TextureParameterName.TextureWrapT,
                            ( int )TextureWrapMode.Repeat);

            GL.TexStorage2D(( TextureTarget2d )_textureTarget, 1, SizedInternalFormat.Rgba8, bitmapBlock.Width,
                            bitmapBlock.Height);

            var indexData = bitmapBlock.GetResourceData(0);
            var texelData = new byte[indexData.Length * 4];

            for (var i = 0; i < indexData.Length; ++i)
            {
                var paletteIndex = indexData[i] * 4;
                var texelIndex   = i * 4;
                texelData[texelIndex + 0] = paletteData[paletteIndex + 0];
                texelData[texelIndex + 1] = paletteData[paletteIndex + 1];
                texelData[texelIndex + 2] = paletteData[paletteIndex + 2];
                texelData[texelIndex + 3] = paletteData[paletteIndex + 3];
            }
            if (bitmapBlock.BitmapDataFlags.HasFlag(BitmapDataBlock.Flags.Swizzled))
            {
                texelData = Swizzler.Swizzle(texelData, 4,
                                             bitmapBlock.Width, bitmapBlock.Height);
            }

            GL.TexSubImage2D(_textureTarget, 0, 0, 0, bitmapBlock.Width, bitmapBlock.Height, PixelFormat.Bgra,
                             PixelType.UnsignedByte, texelData);

            GL.GenerateMipmap(GenerateMipmapTarget.Texture2D);
            GL.BindTexture(TextureTarget.Texture2D, 0);
        }
Esempio n. 5
0
        private void LoadTexture2D(TextureMagFilter textureMagFilter, TextureMinFilter textureMinFilter,
                                   float bytesPerPixel,
                                   short width, short height, byte[] buffer, BitmapDataBlock workingBitmap,
                                   PixelInternalFormat pixelInternalFormat)
        {
            _textureTarget = TextureTarget.Texture2D;
            GL.BindTexture(TextureTarget.Texture2D, _handle);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter,
                            ( int )textureMagFilter);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter,
                            ( int )textureMinFilter);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS,
                            ( int )TextureWrapMode.Repeat);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT,
                            ( int )TextureWrapMode.Repeat);

            var surfaceData = new byte[( int )(bytesPerPixel * width * height)];

            Array.Copy(buffer, 0, surfaceData, 0, surfaceData.Length);

            if (workingBitmap.BitmapDataFlags.HasFlag(BitmapDataBlock.Flags.Compressed))
            {
                GL.CompressedTexImage2D(
                    TextureTarget.Texture2D, 0, pixelInternalFormat, width, height, 0,
                    ( int )(bytesPerPixel * width * height), surfaceData);
                GL.GenerateMipmap(GenerateMipmapTarget.Texture2D);
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter,
                                ( int )TextureMagFilter.Linear);
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter,
                                ( int )TextureMinFilter.LinearMipmapLinear);
            }
            else
            {
                var pixelFormat = GetPixelFormat(workingBitmap.Format);
                var pixelType   = GetPixelType(workingBitmap.Format);
                GL.TexImage2D(TextureTarget.Texture2D, 0, pixelInternalFormat, width, height, 0, pixelFormat,
                              pixelType, surfaceData);
                GL.GenerateMipmap(GenerateMipmapTarget.Texture2D);
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter,
                                (int)TextureMagFilter.Linear);
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter,
                                (int)TextureMinFilter.LinearMipmapLinear);
            }
            GL.BindTexture(TextureTarget.Texture2D, 0);
        }
Esempio n. 6
0
        public void LoadPalettedTextureGroup(int bitmapIndex, int paletteIndex, BitmapDataBlock bitmapDataBlock,
                                             StructureLightmapPaletteColorBlock colourPaletteData, TextureMagFilter textureMagFilter,
                                             TextureMinFilter textureMinFilter)
        {
            var texture     = new TextureHandle( );
            var paletteData = colourPaletteData.GetColourPaletteData( );

            //texture.LoadPalettedTexture( bitmapDataBlock, paletteData, textureMagFilter, textureMinFilter );
            OpenGL.GetError( );

            var key = new Tuple <int, int>(bitmapIndex, paletteIndex);

            if (LightmapTextures.ContainsKey(key))
            {
                LightmapTextures[key].Dispose( );
                LightmapTextures[key] = texture;
            }
            else
            {
                LightmapTextures[key] = texture;
            }
        }