Marco Di Benedetto 2018-12-29 20:17:04 +01:00
commit 555c54d917
17 changed files with 415 additions and 326 deletions

View File

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

View File

@ -10,6 +10,8 @@ A library to import and export various 3d-model-formats including scene-post-pro
</a> </a>
[![Coverage Status](https://coveralls.io/repos/github/assimp/assimp/badge.svg?branch=master)](https://coveralls.io/github/assimp/assimp?branch=master) [![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) [![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> <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. 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.

View File

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

View File

@ -1177,6 +1177,22 @@ class PyAssimp3DViewer:
return True return True
def controls_3d(self, dx, dy, zooming_one_shot=False): 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_TRANSLATION_FACTOR = 0.01
CAMERA_ROTATION_FACTOR = 0.01 CAMERA_ROTATION_FACTOR = 0.01
@ -1188,26 +1204,6 @@ class PyAssimp3DViewer:
distance = numpy.linalg.norm(self.focal_point - current_pos) distance = numpy.linalg.norm(self.focal_point - current_pos)
if self.is_rotating: 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_camera_x = dy * CAMERA_ROTATION_FACTOR
rotation_world_z = dx * CAMERA_ROTATION_FACTOR rotation_world_z = dx * CAMERA_ROTATION_FACTOR
world_z_rotation = transformations.euler_matrix(0, 0, rotation_world_z) world_z_rotation = transformations.euler_matrix(0, 0, rotation_world_z)

View File

@ -54,6 +54,26 @@ import java.util.List;
* {@link AiMesh} for a description and comparison of these APIs. * {@link AiMesh} for a description and comparison of these APIs.
*/ */
public final class AiAnimation { 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. * Constructor.
* *
@ -152,28 +172,4 @@ public final class AiAnimation {
public List<AiMeshAnim> getMeshChannels() { public List<AiMeshAnim> getMeshChannels() {
throw new UnsupportedOperationException("not implemented yet"); 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>();
} }

View File

@ -55,6 +55,24 @@ import java.util.List;
* writable and may be modified. * writable and may be modified.
*/ */
public final class AiBone { 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. * Constructor.
*/ */
@ -115,23 +133,4 @@ public final class AiBone {
return (M4) m_offsetMatrix; 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;
} }

View File

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

View File

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

View File

@ -70,6 +70,17 @@ import java.util.Set;
* properties (i.e., properties starting with <code>TEX_</code>). * properties (i.e., properties starting with <code>TEX_</code>).
*/ */
public final class AiMaterial { 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. * Enumerates all supported material properties.
*/ */
@ -317,7 +328,36 @@ public final class AiMaterial {
* properties easily. * properties easily.
*/ */
public static final class Property { 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. * Constructor.
* *
* @param key * @param key
@ -417,39 +457,9 @@ public final class AiMaterial {
* *
* @return the data * @return the data
*/ */
Object getData() { private Object getData() {
return m_data; 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;
} }
@ -1186,17 +1196,4 @@ public final class AiMaterial {
private void setTextureNumber(int type, int number) { private void setTextureNumber(int type, int number) {
m_numTextures.put(AiTextureType.fromRawValue(type), 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);
} }

View File

@ -153,6 +153,89 @@ public final class AiMesh {
private final int SIZEOF_V3D = Jassimp.NATIVE_AIVEKTOR3D_SIZE; 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. * 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>();
} }

View File

@ -55,6 +55,34 @@ import java.util.Map;
* the imported scene consists of only a single root node without children. * the imported scene consists of only a single root node without children.
*/ */
public final class AiNode { 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. * Constructor.
* *
@ -215,33 +243,4 @@ public final class AiNode {
* Name. * Name.
*/ */
private final String m_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;
} }

View File

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

View File

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

View File

@ -60,6 +60,44 @@ import java.util.Set;
*/ */
public final class Jassimp { 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. * The default wrapper provider using built in types.
*/ */
@ -327,48 +365,9 @@ public final class Jassimp {
s_libraryLoaded = true; 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. * Pure static class, no accessible constructor.
*/ */
@ -384,5 +383,4 @@ public final class Jassimp {
public static int NATIVE_UINT_SIZE; public static int NATIVE_UINT_SIZE;
public static int NATIVE_DOUBLE_SIZE; public static int NATIVE_DOUBLE_SIZE;
public static int NATIVE_LONG_SIZE; public static int NATIVE_LONG_SIZE;
} }

View File

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

View File

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

View File

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