2
0
Эх сурвалжийг харах

Merge https://github.com/assimp/assimp

Marco Di Benedetto 6 жил өмнө
parent
commit
555c54d917

+ 0 - 5
.travis.yml

@@ -33,10 +33,6 @@ env:
 
 matrix:
   include:
-    # disabled until clang 5.0 analyzer issues are fixed
-    # - os: linux
-    #   compiler: clang
-    #   env: ANALYZE=ON
     - os: linux
       compiler: clang
       env: ASAN=ON
@@ -51,7 +47,6 @@ matrix:
       env: ANALYZE=ON
     - os: linux
       compiler: gcc
-#      env: DISABLE_EXPORTERS=YES ENABLE_COVERALLS=ON
       env: ENABLE_COVERALLS=ON
     - os: linux
       compiler: gcc

+ 2 - 0
Readme.md

@@ -10,6 +10,8 @@ A library to import and export various 3d-model-formats including scene-post-pro
 </a>
 [![Coverage Status](https://coveralls.io/repos/github/assimp/assimp/badge.svg?branch=master)](https://coveralls.io/github/assimp/assimp?branch=master)
 [![Join the chat at https://gitter.im/assimp/assimp](https://badges.gitter.im/assimp/assimp.svg)](https://gitter.im/assimp/assimp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/assimp/assimp.svg)](http://isitmaintained.com/project/assimp/assimp "Average time to resolve an issue")
+[![Codacy Badge](https://api.codacy.com/project/badge/Grade/5be56faac64f46fc941ac890fb4febef)](https://www.codacy.com/app/kimkulling/assimp?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=assimp/assimp&amp;utm_campaign=Badge_Grade)
 <br>
 
 APIs are provided for C and C++. There are various bindings to other languages (C#, Java, Python, Delphi, D). Assimp also runs on Android and iOS.

+ 6 - 9
port/PyAssimp/pyassimp/core.py

@@ -29,7 +29,6 @@ from . import structs
 from . import helper
 from . import postprocess
 from .errors import AssimpError
-from .formats import available_formats
 
 class AssimpLib(object):
     """
@@ -300,14 +299,12 @@ def load(filename,
     '''
 
     if hasattr(filename, 'read'):
-        '''
-        This is the case where a file object has been passed to load.
-        It is calling the following function:
-        const aiScene* aiImportFileFromMemory(const char* pBuffer,
-                                              unsigned int pLength,
-                                              unsigned int pFlags,
-                                              const char* pHint)
-        '''
+        # This is the case where a file object has been passed to load.
+        # It is calling the following function:
+        # const aiScene* aiImportFileFromMemory(const char* pBuffer,
+        #                                      unsigned int pLength,
+        #                                      unsigned int pFlags,
+        #                                      const char* pHint)
         if file_type == None:
             raise AssimpError('File type must be specified when passing file objects!')
         data  = filename.read()

+ 16 - 20
port/PyAssimp/scripts/3d_viewer_py3.py

@@ -1177,6 +1177,22 @@ class PyAssimp3DViewer:
         return True
 
     def controls_3d(self, dx, dy, zooming_one_shot=False):
+        """ Orbiting the camera is implemented the following way:
+
+        - the rotation is split into a rotation around the *world* Z axis
+          (controlled by the horizontal mouse motion along X) and a
+          rotation around the *X* axis of the camera (pitch) *shifted to
+          the focal origin* (the world origin for now). This is controlled
+          by the vertical motion of the mouse (Y axis).
+        - as a result, the resulting transformation of the camera in the
+          world frame C' is:
+            C' = (T · Rx · T⁻¹ · (Rz · C)⁻¹)⁻¹
+          where:
+          - C is the original camera transformation in the world frame,
+          - Rz is the rotation along the Z axis (in the world frame)
+          - T is the translation camera -> world (ie, the inverse of the
+            translation part of C
+          - Rx is the rotation around X in the (translated) camera frame """
 
         CAMERA_TRANSLATION_FACTOR = 0.01
         CAMERA_ROTATION_FACTOR = 0.01
@@ -1188,26 +1204,6 @@ class PyAssimp3DViewer:
         distance = numpy.linalg.norm(self.focal_point - current_pos)
 
         if self.is_rotating:
-            """ Orbiting the camera is implemented the following way:
-
-            - the rotation is split into a rotation around the *world* Z axis
-              (controlled by the horizontal mouse motion along X) and a
-              rotation around the *X* axis of the camera (pitch) *shifted to
-              the focal origin* (the world origin for now). This is controlled
-              by the vertical motion of the mouse (Y axis).
-
-            - as a result, the resulting transformation of the camera in the
-              world frame C' is:
-                C' = (T · Rx · T⁻¹ · (Rz · C)⁻¹)⁻¹
-
-              where:
-                - C is the original camera transformation in the world frame,
-                - Rz is the rotation along the Z axis (in the world frame)
-                - T is the translation camera -> world (ie, the inverse of the
-                  translation part of C
-                - Rx is the rotation around X in the (translated) camera frame
-            """
-
             rotation_camera_x = dy * CAMERA_ROTATION_FACTOR
             rotation_world_z = dx * CAMERA_ROTATION_FACTOR
             world_z_rotation = transformations.euler_matrix(0, 0, rotation_world_z)

+ 21 - 25
port/jassimp/jassimp/src/jassimp/AiAnimation.java

@@ -54,6 +54,26 @@ import java.util.List;
  * {@link AiMesh} for a description and comparison of these APIs.
  */
 public final class AiAnimation {
+    /**
+     * Name.
+     */
+    private final String m_name;
+    
+    /**
+     * Duration.
+     */
+    private final double m_duration;
+    
+    /**
+     * Ticks per second.
+     */
+    private final double m_ticksPerSecond;
+        
+    /**
+     * Bone animation channels.
+     */
+    private final List<AiNodeAnim> m_nodeAnims = new ArrayList<AiNodeAnim>();
+
     /**
      * Constructor.
      * 
@@ -151,29 +171,5 @@ public final class AiAnimation {
      */
     public List<AiMeshAnim> getMeshChannels() {
         throw new UnsupportedOperationException("not implemented yet");
-    }
-    
-    
-    /**
-     * Name.
-     */
-    private final String m_name;
-    
-    
-    /**
-     * Duration.
-     */
-    private final double m_duration;
-    
-    
-    /**
-     * Ticks per second.
-     */
-    private final double m_ticksPerSecond;
-    
-    
-    /**
-     * Bone animation channels.
-     */
-    private final List<AiNodeAnim> m_nodeAnims = new ArrayList<AiNodeAnim>();
+    }    
 }

+ 19 - 20
port/jassimp/jassimp/src/jassimp/AiBone.java

@@ -55,6 +55,24 @@ import java.util.List;
  * writable and may be modified.
  */
 public final class AiBone {
+    /**
+     * Name of the bone.
+     */
+    private String m_name;
+    
+    
+    /**
+     * Bone weights.
+     */
+    private final List<AiBoneWeight> m_boneWeights = 
+            new ArrayList<AiBoneWeight>();
+    
+    
+    /**
+     * Offset matrix.
+     */
+    private Object m_offsetMatrix; 
+
     /**
      * Constructor.
      */
@@ -114,24 +132,5 @@ public final class AiBone {
             AiWrapperProvider<V3, M4, C, N, Q>  wrapperProvider) {
         
         return (M4) m_offsetMatrix;
-    }
-    
-    
-    /**
-     * Name of the bone.
-     */
-    private String m_name;
-    
-    
-    /**
-     * Bone weights.
-     */
-    private final List<AiBoneWeight> m_boneWeights = 
-            new ArrayList<AiBoneWeight>();
-    
-    
-    /**
-     * Offset matrix.
-     */
-    private Object m_offsetMatrix; 
+    }    
 }

+ 2 - 4
port/jassimp/jassimp/src/jassimp/AiClassLoaderIOSystem.java

@@ -139,10 +139,8 @@ public class AiClassLoaderIOSystem implements AiIOSystem<AiInputStreamIOStream>
       {
          return false;
       }
-      else
-      {
-         return true;
-      }
+
+	  return true;
       
    }
 

+ 10 - 12
port/jassimp/jassimp/src/jassimp/AiColor.java

@@ -50,6 +50,16 @@ import java.nio.ByteBuffer;
  * modify the underlying mesh.
  */
 public final class AiColor {
+    /**
+     * Wrapped buffer.
+     */
+    private final ByteBuffer m_buffer;
+        
+    /**
+     * Offset into m_buffer. 
+     */
+    private final int m_offset;
+
     /**
      * Constructor.
      * 
@@ -147,16 +157,4 @@ public final class AiColor {
         return "[" + getRed() + ", " + getGreen() + ", " + getBlue() + ", " + 
                 getAlpha() + "]";
     }
-
-
-    /**
-     * Wrapped buffer.
-     */
-    private final ByteBuffer m_buffer;
-    
-    
-    /**
-     * Offset into m_buffer. 
-     */
-    private final int m_offset;
 }

+ 42 - 45
port/jassimp/jassimp/src/jassimp/AiMaterial.java

@@ -70,6 +70,17 @@ import java.util.Set;
  * properties (i.e., properties starting with <code>TEX_</code>).
  */
 public final class AiMaterial {
+    /**
+     * List of properties.
+     */
+    private final List<Property> m_properties = new ArrayList<Property>();
+       
+    /**
+     * Number of textures for each type.
+     */
+    private final Map<AiTextureType, Integer> m_numTextures = 
+            new EnumMap<AiTextureType, Integer>(AiTextureType.class);
+	
     /**
      * Enumerates all supported material properties.
      */
@@ -317,7 +328,36 @@ public final class AiMaterial {
      * properties easily. 
      */
     public static final class Property {
+		/**
+         * Key.
+         */
+        private final String m_key;
+        
+        
+        /**
+         * Semantic.
+         */
+        private final int m_semantic;
+        
+        
         /**
+         * Index.
+         */
+        private final int m_index;
+        
+        
+        /**
+         * Type.
+         */
+        private final PropertyType m_type;
+        
+        
+        /**
+         * Data.
+         */
+        private final Object m_data;
+
+		/**
          * Constructor.
          * 
          * @param key
@@ -417,39 +457,9 @@ public final class AiMaterial {
          * 
          * @return the data
          */
-        Object getData() {
+        private Object getData() {
             return m_data;
         }
-        
-        
-        /**
-         * Key.
-         */
-        private final String m_key;
-        
-        
-        /**
-         * Semantic.
-         */
-        private final int m_semantic;
-        
-        
-        /**
-         * Index.
-         */
-        private final int m_index;
-        
-        
-        /**
-         * Type.
-         */
-        private final PropertyType m_type;
-        
-        
-        /**
-         * Data.
-         */
-        private final Object m_data;
     }
     
     
@@ -1185,18 +1195,5 @@ public final class AiMaterial {
     @SuppressWarnings("unused")
     private void setTextureNumber(int type, int number) {
         m_numTextures.put(AiTextureType.fromRawValue(type), number);
-    }
-    
-    
-    /**
-     * List of properties.
-     */
-    private final List<Property> m_properties = new ArrayList<Property>();
-    
-    
-    /**
-     * Number of textures for each type.
-     */
-    private final Map<AiTextureType, Integer> m_numTextures = 
-            new EnumMap<AiTextureType, Integer>(AiTextureType.class);
+    }    
 }

+ 83 - 95
port/jassimp/jassimp/src/jassimp/AiMesh.java

@@ -153,6 +153,89 @@ public final class AiMesh {
     private final int SIZEOF_V3D = Jassimp.NATIVE_AIVEKTOR3D_SIZE;
     
     
+	    /**
+     * The primitive types used by this mesh.
+     */
+    private final Set<AiPrimitiveType> m_primitiveTypes = 
+            EnumSet.noneOf(AiPrimitiveType.class);
+    
+    
+    /**
+     * Number of vertices in this mesh.
+     */
+    private int m_numVertices = 0;
+    
+    
+    /**
+     * Number of faces in this mesh.
+     */
+    private int m_numFaces = 0;
+    
+    /**
+     * Material used by this mesh.
+     */
+    private int m_materialIndex = -1;
+    
+    /**
+     * The name of the mesh.
+     */
+    private String m_name = "";
+    
+    /**
+     * Buffer for vertex position data.
+     */
+    private ByteBuffer m_vertices = null;
+        
+    /**
+     * Buffer for faces/ indices.
+     */
+    private ByteBuffer m_faces = null;
+    
+
+    /**
+     * Index structure for m_faces.<p>
+     * 
+     * Only used by meshes that are not pure triangular
+     */
+    private ByteBuffer m_faceOffsets = null;
+    
+    /**
+     * Buffer for normals.
+     */
+    private ByteBuffer m_normals = null;
+    
+    /**
+     * Buffer for tangents.
+     */
+    private ByteBuffer m_tangents = null;
+    
+    /**
+     * Buffer for bitangents.
+     */
+    private ByteBuffer m_bitangents = null;
+    
+    /**
+     * Vertex colors.
+     */
+    private ByteBuffer[] m_colorsets = 
+            new ByteBuffer[JassimpConfig.MAX_NUMBER_COLORSETS];
+      
+    /**
+     * Number of UV components for each texture coordinate set.
+     */
+    private int[] m_numUVComponents = new int[JassimpConfig.MAX_NUMBER_TEXCOORDS];
+    
+    /**
+     * Texture coordinates.
+     */
+    private ByteBuffer[] m_texcoords = 
+            new ByteBuffer[JassimpConfig.MAX_NUMBER_TEXCOORDS];
+        
+    /**
+     * Bones.
+     */
+    private final List<AiBone> m_bones = new ArrayList<AiBone>();
+
     /**
      * This class is instantiated via JNI, no accessible constructor.
      */
@@ -1335,99 +1418,4 @@ public final class AiMesh {
         }
     }
     // }}
-    
-    
-    /**
-     * The primitive types used by this mesh.
-     */
-    private final Set<AiPrimitiveType> m_primitiveTypes = 
-            EnumSet.noneOf(AiPrimitiveType.class);
-    
-    
-    /**
-     * Number of vertices in this mesh.
-     */
-    private int m_numVertices = 0;
-    
-    
-    /**
-     * Number of faces in this mesh.
-     */
-    private int m_numFaces = 0;
-    
-    
-    /**
-     * Material used by this mesh.
-     */
-    private int m_materialIndex = -1;
-    
-    
-    /**
-     * The name of the mesh.
-     */
-    private String m_name = "";
-    
-    
-    /**
-     * Buffer for vertex position data.
-     */
-    private ByteBuffer m_vertices = null;
-    
-    
-    /**
-     * Buffer for faces/ indices.
-     */
-    private ByteBuffer m_faces = null;
-    
-    
-    /**
-     * Index structure for m_faces.<p>
-     * 
-     * Only used by meshes that are not pure triangular
-     */
-    private ByteBuffer m_faceOffsets = null;
-    
-    
-    /**
-     * Buffer for normals.
-     */
-    private ByteBuffer m_normals = null;
-    
-    
-    /**
-     * Buffer for tangents.
-     */
-    private ByteBuffer m_tangents = null;
-    
-    
-    /**
-     * Buffer for bitangents.
-     */
-    private ByteBuffer m_bitangents = null;
-    
-    
-    /**
-     * Vertex colors.
-     */
-    private ByteBuffer[] m_colorsets = 
-            new ByteBuffer[JassimpConfig.MAX_NUMBER_COLORSETS];
-    
-    
-    /**
-     * Number of UV components for each texture coordinate set.
-     */
-    private int[] m_numUVComponents = new int[JassimpConfig.MAX_NUMBER_TEXCOORDS];
-    
-    
-    /**
-     * Texture coordinates.
-     */
-    private ByteBuffer[] m_texcoords = 
-            new ByteBuffer[JassimpConfig.MAX_NUMBER_TEXCOORDS];
-    
-    
-    /**
-     * Bones.
-     */
-    private final List<AiBone> m_bones = new ArrayList<AiBone>();
 }

+ 29 - 30
port/jassimp/jassimp/src/jassimp/AiNode.java

@@ -55,6 +55,34 @@ import java.util.Map;
  * the imported scene consists of only a single root node without children.
  */
 public final class AiNode {
+    /**
+     * Parent node.
+     */
+    private final AiNode m_parent;
+    
+    
+    /**
+     * Mesh references.
+     */
+    private final int[] m_meshReferences;
+    
+    
+    /**
+     * List of children.
+     */
+    private final List<AiNode> m_children = new ArrayList<AiNode>();
+
+    /**
+     * List of metadata entries.
+     */
+     private final Map<String, AiMetadataEntry> m_metaData = new HashMap<String, AiMetadataEntry>();
+    
+    
+    /**
+     * Buffer for transformation matrix.
+     */
+    private final Object m_transformationMatrix;
+
     /**
      * Constructor.
      * 
@@ -214,34 +242,5 @@ public final class AiNode {
     /**
      * Name.
      */
-    private final String m_name;
-    
-    
-    /**
-     * Parent node.
-     */
-    private final AiNode m_parent;
-    
-    
-    /**
-     * Mesh references.
-     */
-    private final int[] m_meshReferences;
-    
-    
-    /**
-     * List of children.
-     */
-    private final List<AiNode> m_children = new ArrayList<AiNode>();
-
-    /**
-     * List of metadata entries.
-     */
-     private final Map<String, AiMetadataEntry> m_metaData = new HashMap<String, AiMetadataEntry>();
-    
-    
-    /**
-     * Buffer for transformation matrix.
-     */
-    private final Object m_transformationMatrix;
+    private final String m_name;    
 }

+ 12 - 13
port/jassimp/jassimp/src/jassimp/AiQuaternion.java

@@ -50,6 +50,17 @@ import java.nio.ByteBuffer;
  * modify the underlying mesh/animation.
  */
 public final class AiQuaternion {
+    /**
+     * Wrapped buffer.
+     */
+    private final ByteBuffer m_buffer;
+    
+    
+    /**
+     * Offset into m_buffer.
+     */
+    private final int m_offset;
+
     /**
      * Constructor.
      * 
@@ -150,17 +161,5 @@ public final class AiQuaternion {
     public String toString() {
         return "[" + getX() + ", " + getY() + ", " + getZ() + ", " + 
                 getW() + "]";
-    }
-    
-    
-    /**
-     * Wrapped buffer.
-     */
-    private final ByteBuffer m_buffer;
-    
-    
-    /**
-     * Offset into m_buffer.
-     */
-    private final int m_offset;
+    }    
 }

+ 6 - 7
port/jassimp/jassimp/src/jassimp/AiSceneFlag.java

@@ -47,6 +47,11 @@ import java.util.Set;
  * Status flags for {@link AiScene}s.
  */
 public enum AiSceneFlag {
+    /**
+     * The mapped c/c++ integer enum value.
+     */
+    private final int m_rawValue;
+
     /**
      * Specifies that the scene data structure that was imported is not 
      * complete.<p>
@@ -143,11 +148,5 @@ public enum AiSceneFlag {
      */
     private AiSceneFlag(int rawValue) {
         m_rawValue = rawValue;
-    }
-    
-    
-    /**
-     * The mapped c/c++ integer enum value.
-     */
-    private final int m_rawValue;
+    }    
 }

+ 39 - 41
port/jassimp/jassimp/src/jassimp/Jassimp.java

@@ -60,6 +60,44 @@ import java.util.Set;
  */
 public final class Jassimp {
 
+    /**
+     * The native interface.
+     * 
+     * @param filename the file to load
+     * @param postProcessing post processing flags
+     * @return the loaded scene, or null if an error occurred
+     * @throws IOException if an error occurs
+     */
+    private static native AiScene aiImportFile(String filename, 
+            long postProcessing, AiIOSystem<?> ioSystem) throws IOException;
+    
+    
+    /**
+     * The active wrapper provider.
+     */
+    private static AiWrapperProvider<?, ?, ?, ?, ?> s_wrapperProvider = 
+            new AiBuiltInWrapperProvider();
+    
+    
+    /**
+     * The library loader to load the native library.
+     */
+    private static JassimpLibraryLoader s_libraryLoader = 
+            new JassimpLibraryLoader();
+   
+    /**
+     * Status flag if the library is loaded.
+     * 
+     * Volatile to avoid problems with double checked locking.
+     * 
+     */
+    private static volatile boolean s_libraryLoaded = false;
+    
+    /**
+     * Lock for library loading.
+     */
+    private static final Object s_libraryLoadingLock = new Object();
+
     /**
      * The default wrapper provider using built in types.
      */
@@ -327,48 +365,9 @@ public final class Jassimp {
                 s_libraryLoaded = true;
              }
           }
-          
        }
     }
-    
-    /**
-     * The native interface.
-     * 
-     * @param filename the file to load
-     * @param postProcessing post processing flags
-     * @return the loaded scene, or null if an error occurred
-     * @throws IOException if an error occurs
-     */
-    private static native AiScene aiImportFile(String filename, 
-            long postProcessing, AiIOSystem<?> ioSystem) throws IOException;
-    
-    
-    /**
-     * The active wrapper provider.
-     */
-    private static AiWrapperProvider<?, ?, ?, ?, ?> s_wrapperProvider = 
-            new AiBuiltInWrapperProvider();
-    
-    
-    /**
-     * The library loader to load the native library.
-     */
-    private static JassimpLibraryLoader s_libraryLoader = 
-            new JassimpLibraryLoader();
-   
-    /**
-     * Status flag if the library is loaded.
-     * 
-     * Volatile to avoid problems with double checked locking.
-     * 
-     */
-    private static volatile boolean s_libraryLoaded = false;
-    
-    /**
-     * Lock for library loading.
-     */
-    private static final Object s_libraryLoadingLock = new Object();
-    
+        
     /**
      * Pure static class, no accessible constructor.
      */
@@ -384,5 +383,4 @@ public final class Jassimp {
     public static int NATIVE_UINT_SIZE; 
     public static int NATIVE_DOUBLE_SIZE; 
     public static int NATIVE_LONG_SIZE; 
-
 }

+ 2 - 0
test/CMakeLists.txt

@@ -124,6 +124,8 @@ SET( IMPORTERS
   unit/ImportExport/utOgreImportExport.cpp
   unit/ImportExport/utQ3BSPFileImportExport.cpp
   unit/ImportExport/utOFFImportExport.cpp
+  unit/ImportExport/utNFFImportExport.cpp
+  unit/ImportExport/utXGLImportExport.cpp
 )
 
 SET( MATERIAL

+ 63 - 0
test/unit/ImportExport/utNFFImportExport.cpp

@@ -0,0 +1,63 @@
+/*
+---------------------------------------------------------------------------
+Open Asset Import Library (assimp)
+---------------------------------------------------------------------------
+
+Copyright (c) 2006-2018, assimp team
+
+
+
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+#include "AbstractImportExportBase.h"
+#include <assimp/Importer.hpp>
+#include <assimp/postprocess.h>
+
+using namespace Assimp;
+
+class utNFFImportExport : public AbstractImportExportBase {
+public:
+    virtual bool importerTest() {
+        Assimp::Importer importer;
+        const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/NFF/NFF/ManyEarthsNotJustOne.nff", 0);
+        return true;
+        return nullptr != scene;
+    }
+};
+
+TEST_F(utNFFImportExport, importNFFFromFileTest) {
+    EXPECT_TRUE(importerTest());
+}

+ 63 - 0
test/unit/ImportExport/utXGLImportExport.cpp

@@ -0,0 +1,63 @@
+/*
+---------------------------------------------------------------------------
+Open Asset Import Library (assimp)
+---------------------------------------------------------------------------
+
+Copyright (c) 2006-2018, assimp team
+
+
+
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+#include "AbstractImportExportBase.h"
+#include <assimp/Importer.hpp>
+#include <assimp/postprocess.h>
+
+using namespace Assimp;
+
+class utXGLImportExport : public AbstractImportExportBase {
+public:
+    virtual bool importerTest() {
+        Assimp::Importer importer;
+        const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/XGL/sample_official.xgl", 0);
+        return true;
+        return nullptr != scene;
+    }
+};
+
+TEST_F(utXGLImportExport, importXGLFromFileTest) {
+    EXPECT_TRUE(importerTest());
+}