private Helix.TextureModel ReadTexture(IGeometryMaterial mat)
        {
            var sub = mat?.Submaterials.FirstOrDefault(s => s.Usage == MaterialUsage.Diffuse);

            if (string.IsNullOrEmpty(sub?.Bitmap?.Name))
            {
                return(null);
            }

            var key = mat.Flags.HasFlag(MaterialFlags.Transparent) ? -sub.Bitmap.Id : sub.Bitmap.Id;

            Helix.TextureModel tex;
            textureCache.TryGetValue(key, out tex);
            if (tex == null)
            {
                try
                {
                    var args   = new DdsOutputArgs(mat.Flags.HasFlag(MaterialFlags.Transparent) ? DecompressOptions.Default : DecompressOptions.Bgr24);
                    var stream = new System.IO.MemoryStream();
                    sub.Bitmap.ToDds(0).WriteToStream(stream, System.Drawing.Imaging.ImageFormat.Png, args);
                    tex = new Helix.TextureModel(stream);
                    if (!textureCache.TryAdd(key, tex))
                    {
                        stream.Dispose(); //another thread beat us to it
                    }
                }
                catch
                {
                    return(null);
                }
            }

            return(tex);
        }
        public Helix.Material CreateMaterial(IGeometryMaterial mat, out bool isTransparent)
        {
            var diffuseTexture = ReadTexture(mat);

            if (diffuseTexture == null)
            {
                isTransparent = false;
                return(ErrorMaterial);
            }

            var material = new Helix.DiffuseMaterial
            {
                DiffuseMap = diffuseTexture
            };

            material.Freeze();
            isTransparent = mat.Flags.HasFlag(MaterialFlags.Transparent);
            return(material);
        }