public void LoadMDLFile(MDL.MDLFile mdlfile)
 {
     CurrentMatrix = Matrix3D.Identity;
     _mdlFile = mdlfile;
     ClearViewport();
     SetCamera();
     myModel = ConvertMDL(_mdlFile);
     this.mainViewport.Children.Add(myModel);
     DefaultRotate();
 }
        private ModelVisual3D ConvertMDL(MDL.MDLFile _mdlFile)
        {
            ModelVisual3D newmodel = new ModelVisual3D();
            Model3DGroup model = new Model3DGroup();

            List<MDL.MDLObject> meshes = new List<MDL.MDLObject>();

            if (_mdlFile.RootObject.Count(x => x.type == MDL.MDLType.mdl_group) > 0)
            {
                meshes = _mdlFile.RootObject.Where(x => x.type == MDL.MDLType.mdl_group).First().childrens.Where(x => x.type == MDL.MDLType.mdl_mesh).ToList();
            }
            else
            {
                meshes = _mdlFile.RootObject.Where(x => x.type == MDL.MDLType.mdl_mesh).ToList();
            }

            IOrderedEnumerable<MDL.MDLObject> orderedMeshes = meshes.OrderBy(x => -x.mesh.nfaces);
            for (int itemindex = 0; itemindex < orderedMeshes.Count(); itemindex++)
            {
                MDL.MDLObject item = meshes[itemindex];
                 if (item.lodval < 1 || orderedMeshes.Count() == 1 )
                {
                    MeshGeometry3D mesh = new MeshGeometry3D();
                    for (int i = 0; i < item.mesh.vertices.Count(); i++)
                    {
                        mesh.Positions.Add(new Point3D(item.mesh.vertices[i].x, item.mesh.vertices[i].y, item.mesh.vertices[i].z));
                        mesh.TextureCoordinates.Add(new Point(item.mesh.vertices[i].mx, item.mesh.vertices[i].my));
                        Vector3D normal = new Vector3D(item.mesh.vertices[i].nx, item.mesh.vertices[i].ny, item.mesh.vertices[i].nz);
                        mesh.Normals.Add(normal);
                    }
                    _bounds = mesh.Bounds;
                    for (int i = item.mesh.faces.Count() - 1; i > -1; i--)
                    {
                        mesh.TriangleIndices.Add(item.mesh.faces[i]);
                    }

                    if (_textures.Count > 0)  0 && item.textidx > -1)
                    {
                        ImageBrush ib = new ImageBrush();
                        int textureIndex = item.textidx;
                        if (textureIndex < 0)
                            textureIndex = 0;
                        ib.ImageSource = loadBitmap(_textures[textureIndex]);
                        Material diffuse1 = new DiffuseMaterial(ib);
                        Material spec1 = new SpecularMaterial(ib, 40);
                        MaterialGroup matGroup = new MaterialGroup();
                        matGroup.Children.Add(diffuse1);
                        matGroup.Children.Add(spec1);
                        GeometryModel3D gmodel = new GeometryModel3D(mesh, matGroup);

                        model.Children.Add(gmodel);
                    }
                    else
                    {
                        Material material = new DiffuseMaterial(new SolidColorBrush(Colors.Gray));
                        GeometryModel3D gmodel = new GeometryModel3D(mesh, material);

                        model.Children.Add(gmodel);
                    }
                }
            }
 public void LoadMDLFile(MDL.MDLFile currentBinaryMDL, List<System.Drawing.Bitmap> referencedImages)
 {
     _textures = referencedImages;
     LoadMDLFile(currentBinaryMDL);
 }