Exemplo n.º 1
0
        public static bool ConvertFromDdsAndSave(Stream ms, string outfilename, ESaveFileTypes filetype, bool vflip = false, bool hflip = false)
        {
            byte[] rentedBuffer = null;
            try
            {
                var offset = 0;

                var len = checked ((int)ms.Length);
                rentedBuffer = ArrayPool <byte> .Shared.Rent(len);

                int readBytes;
                while (offset < len &&
                       (readBytes = ms.Read(rentedBuffer, offset, len - offset)) > 0)
                {
                    offset += readBytes;
                }

                var outDir = new FileInfo(outfilename).Directory.FullName;
                Directory.CreateDirectory(outDir);
                var fileName  = Path.GetFileNameWithoutExtension(outfilename);
                var extension = filetype.ToString().ToLower();
                var newpath   = Path.Combine(outDir, $"{fileName}.{extension}");

                //TexconvNative.ConvertAndSaveDdsImage(rentedBuffer, newpath, filetype, vflip, hflip);
                if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
                {
                    var buffer = Array.Empty <byte>();
                    using (var blob = new ManagedBlob())
                    {
                        var l = TexconvNative.ConvertFromDds(rentedBuffer, blob.GetBlob(), filetype, vflip, hflip);
                        buffer = blob.GetBytes();
                    }
                    File.WriteAllBytes(newpath, buffer);
                }
                else
                {
                    throw new NotImplementedException();
                }
            }
            finally
            {
                if (rentedBuffer is object)
                {
                    ArrayPool <byte> .Shared.Return(rentedBuffer);
                }
            }

            return(true);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Converts texture stream with given extension stream to dds
        /// </summary>
        public static byte[] ConvertToDds(Stream stream, EUncookExtension inExtension, DXGI_FORMAT?outFormat = null, bool vflip = false, bool hflip = false)
        {
            if (inExtension == EUncookExtension.dds)
            {
                throw new NotSupportedException("texture to convert to dds must not be dds iteslf");
            }

            byte[] rentedBuffer = null;
            try
            {
                var offset = 0;

                var len = checked ((int)stream.Length);
                rentedBuffer = ArrayPool <byte> .Shared.Rent(len);

                int readBytes;
                while (offset < len &&
                       (readBytes = stream.Read(rentedBuffer, offset, len - offset)) > 0)
                {
                    offset += readBytes;
                }

                var format = outFormat ?? DXGI_FORMAT.DXGI_FORMAT_UNKNOWN;

                if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
                {
                    var buffer = Array.Empty <byte>();
                    using (var blob = new ManagedBlob())
                    {
                        var l = TexconvNative.ConvertToDds(rentedBuffer, blob.GetBlob(), ToSaveFormat(inExtension),
                                                           format, vflip, hflip);
                        buffer = blob.GetBytes();
                    }
                    return(buffer);
                }
                else
                {
                    throw new NotImplementedException();
                }
            }
            finally
            {
                if (rentedBuffer is object)
                {
                    ArrayPool <byte> .Shared.Return(rentedBuffer);
                }
            }
        }
Exemplo n.º 3
0
        private double ComputeScore(ref ManagedBlob newblob, ref ManagedBlob oldBlob, bool isEmptyOldBlob, bool considerInvertedCursor, ref Vector2 idealHandPosition)
        {
            /*
             * Le score dépend de:
             *
             * - Distance par rapport à la position idéale de la main
             * - Distance par rapport à la position de l'ancien blob associé
             * - Taille par rapport à l'ancienne taille
             * - Orientation par rapport à l'ancienne orientation
             * */

            if (considerInvertedCursor && isEmptyOldBlob)
                return 0;

            var oldCenter = considerInvertedCursor
                ? new Vector2(oldBlob.InvertedEstimatedCursorX / DataWidth, oldBlob.InvertedEstimatedCursorY / DataHeight)
                : new Vector2(oldBlob.EstimatedCursorX / DataWidth, oldBlob.EstimatedCursorY / DataHeight);
            var newCenter = considerInvertedCursor
                ? new Vector2(newblob.InvertedEstimatedCursorX / DataWidth, newblob.InvertedEstimatedCursorY / DataHeight)
                : new Vector2(newblob.EstimatedCursorX / DataWidth, newblob.EstimatedCursorY / DataHeight);

            var oldSize = (float)oldBlob.PixelCount / (DataWidth * DataHeight);
            var newSize = (float)newblob.PixelCount / (DataWidth * DataHeight);

            var idealPositionScore = Vector2.Distance(ref newCenter, ref idealHandPosition);
            var distanceScore = Math.Min(1, 0.1 / Math.Max(0.001, Vector2.Distance(ref oldCenter, ref newCenter)));
            var sizeScore = Math.Min(1, Math.Abs(newSize - oldSize) * 5);
            var orientationScore = (Math.Abs(oldBlob.AverageDirection - newblob.AverageDirection)) / Math.PI;

            //if (isEmptyOldBlob)
            //    return idealPositionScore * 0.1 + distanceScore * 0.75;
            //else
            {
                return
                    idealPositionScore * 10 +
                    distanceScore * 85 +
                    sizeScore * 1 +
                    orientationScore * 0.5;
            }
        }