diff --git a/QuickLook.Plugin/QuickLook.Plugin.HelixViewer/HelixPanel.xaml.cs b/QuickLook.Plugin/QuickLook.Plugin.HelixViewer/HelixPanel.xaml.cs index d22a050..28001a0 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.HelixViewer/HelixPanel.xaml.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.HelixViewer/HelixPanel.xaml.cs @@ -15,7 +15,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using Assimp; using HelixToolkit.Wpf; +using System; using System.Linq; using System.Windows.Controls; using System.Windows.Media; @@ -25,7 +27,7 @@ namespace QuickLook.Plugin.HelixViewer; public partial class HelixPanel : UserControl { - private string _path; + private readonly string _path; public HelixPanel(string path) : this() { @@ -40,16 +42,40 @@ public partial class HelixPanel : UserControl private void Load() { - var modelImporter = new ModelImporter(); - var model3DGroup = modelImporter.Load(_path); - var diffuseMaterial = new DiffuseMaterial(new SolidColorBrush(Color.FromRgb(0xA0, 0xA0, 0xA0))); - - foreach (GeometryModel3D child in model3DGroup.Children.Cast()) + if (_path.EndsWith(".fbx", StringComparison.OrdinalIgnoreCase)) { - child.Material = diffuseMaterial; - child.BackMaterial = diffuseMaterial; - } + var context = new AssimpContext(); + var scene = context.ImportFile(_path, PostProcessSteps.Triangulate); - modelVisual.Content = model3DGroup; + foreach (var mesh in scene.Meshes) + { + var geometry = new MeshGeometry3D() + { + Positions = [.. mesh.Vertices.Select(v => new Point3D(v.X, v.Y, v.Z))], + TriangleIndices = [.. mesh.GetIndices()], + }; + var model = new GeometryModel3D() + { + Geometry = geometry, + Material = Materials.Gray, + }; + + modelVisual.Content = model; + } + } + else + { + var modelImporter = new ModelImporter(); + var model3DGroup = modelImporter.Load(_path); + var diffuseMaterial = new DiffuseMaterial(new SolidColorBrush(Color.FromRgb(0xA0, 0xA0, 0xA0))); + + foreach (GeometryModel3D child in model3DGroup.Children.Cast()) + { + child.Material = diffuseMaterial; + child.BackMaterial = diffuseMaterial; + } + + modelVisual.Content = model3DGroup; + } } } diff --git a/QuickLook.Plugin/QuickLook.Plugin.HelixViewer/Plugin.cs b/QuickLook.Plugin/QuickLook.Plugin.HelixViewer/Plugin.cs index 27f45df..029a937 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.HelixViewer/Plugin.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.HelixViewer/Plugin.cs @@ -28,6 +28,7 @@ public class Plugin : IViewer private static readonly HashSet WellKnownExtensions = new( [ ".stl", ".obj", ".3ds", ".lwo", ".ply", + ".fbx", ]); private HelixPanel _hp; diff --git a/QuickLook.Plugin/QuickLook.Plugin.HelixViewer/QuickLook.Plugin.HelixViewer.csproj b/QuickLook.Plugin/QuickLook.Plugin.HelixViewer/QuickLook.Plugin.HelixViewer.csproj index e2bcaea..ba81ac7 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.HelixViewer/QuickLook.Plugin.HelixViewer.csproj +++ b/QuickLook.Plugin/QuickLook.Plugin.HelixViewer/QuickLook.Plugin.HelixViewer.csproj @@ -54,6 +54,7 @@ +