Esempio n. 1
0
            private static LoadedImage LoadImageUsingDirectX(BaseRenderer renderer, byte[] imageData)
            {
                if (imageData == null || imageData.Length == 0)
                {
                    return(null);
                }

                try {
                    Format format;
                    var    pngData = TextureReader.ToPng(renderer.DeviceContextHolder, imageData, true, out format);

                    var image = new BitmapImage();
                    using (var stream = new MemoryStream(pngData)
                    {
                        Position = 0
                    }) {
                        image.BeginInit();
                        image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
                        image.CacheOption   = BitmapCacheOption.OnLoad;
                        image.UriSource     = null;
                        image.StreamSource  = stream;
                        image.EndInit();
                    }
                    image.Freeze();

                    return(new LoadedImage {
                        Image = image,
                        FormatDescription = format.ToString()
                    });
                } catch (Exception e) {
                    Logging.Warning(e);
                    return(null);
                }
            }
        public bool OverrideTextureMaps(string textureName, double reflection, double gloss, double specular)
        {
            if (Kn5 == null)
            {
                return(false);
            }

            if (_mapsBase == null)
            {
                Format format;
                var    data = TextureReader.ToPng(DeviceContextHolder, Kn5.TexturesData[textureName], true, out format);

                _mapsBase = new MagickImage(data);
                if (_mapsBase.Width > 256 || _mapsBase.Height > 256)
                {
                    _mapsBase.Resize(256, 256);
                }

                _mapsBase.AutoLevel(Channels.Red);
                _mapsBase.AutoLevel(Channels.Green);
                _mapsBase.AutoLevel(Channels.Blue);
            }

            using (var image = _mapsBase.Clone()) {
                image.Evaluate(Channels.Red, EvaluateOperator.Multiply, specular);
                image.Evaluate(Channels.Green, EvaluateOperator.Multiply, gloss);
                image.Evaluate(Channels.Blue, EvaluateOperator.Multiply, reflection);
                return(OverrideTexture(textureName, image.ToByteArray(MagickFormat.Png)));
            }
        }
        public async Task SaveTextureMaps(string filename, string baseTextureName, double reflection, double gloss, double specular)
        {
            if (Kn5 == null)
            {
                return;
            }

            MagickImage image = null;
            await Task.Run(() => {
                Format format;
                var data = TextureReader.ToPng(DeviceContextHolder, Kn5.TexturesData[baseTextureName], true, out format);

                image = new MagickImage(data);
                image.AutoLevel(Channels.Red);
                image.AutoLevel(Channels.Green);
                image.AutoLevel(Channels.Blue);

                image.Evaluate(Channels.Red, EvaluateOperator.Multiply, specular);
                image.Evaluate(Channels.Green, EvaluateOperator.Multiply, gloss);
                image.Evaluate(Channels.Blue, EvaluateOperator.Multiply, reflection);
            });

            await SaveAndDispose(filename, image);
        }
Esempio n. 4
0
        private static byte[] RemoveTransparencyDds(byte[] ddsImageBytes, CompressFormat?namePreferredFormat)
        {
            var format  = namePreferredFormat ?? (_dxt1Mode ? CompressFormat.DXT1 : CompressFormat.RGB);
            var dxtMode = format == CompressFormat.DXT1 || format == CompressFormat.DXT5;

            if (_textureReader == null)
            {
                _textureReader = new TextureReader();
            }

            byte[] pngImageBytes;
            if (_preserveGradients)
            {
                pngImageBytes = RemoveTransparencyBitmap(_textureReader.ToPng(ddsImageBytes), out var containsGradients);
                if (containsGradients)
                {
                    switch (format)
                    {
                    case CompressFormat.RGB:
                        format = CompressFormat.RGBA;
                        break;

                    case CompressFormat.Luminance:
                        format = CompressFormat.LuminanceAlpha;
                        break;

                    case CompressFormat.RGB565:
                        format = CompressFormat.A4R4G4B4;
                        break;

                    case CompressFormat.DXT1:
                        format = CompressFormat.DXT5;
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }
            }
            else
            {
                pngImageBytes = _textureReader.ToPng(ddsImageBytes, true);
            }

            if (pngImageBytes == null)
            {
                return(null);
            }

            using (var pngImageStream = new MemoryStream(pngImageBytes))
                using (var pngImage = (Bitmap)Image.FromStream(pngImageStream))
                    using (var output = new MemoryStream()) {
                        new Compressor {
                            MipmapMaxLevel = _mipMaps ? -1 : 0,
                            RoundMode      = dxtMode ? CompressRoundMode.ToNearestMultipleOfFour : CompressRoundMode.None,
                            Quality        = _productionQuality ? CompressQuality.Production : CompressQuality.Normal,
                            ResizeFilter   = CompressResizeFilter.Mitchell,
                            Format         = format
                        }.Process(pngImage.Width, pngImage.Height, CopySafe(pngImage), output, null, null);
                        return(output.ToArray());
                    }
        }