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); }