Merge branch 'master' into issue_1773

pull/1790/head
Kim Kulling 2018-02-19 15:54:46 +01:00 committed by GitHub
commit f78f273916
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 125 additions and 77 deletions

View File

@ -60,9 +60,9 @@ namespace Assimp {
* @param in Input mesh * @param in Input mesh
* @return Hash. * @return Hash.
*/ */
inline uint64_t GetMeshHash(aiMesh* in) inline
{ uint64_t GetMeshHash(aiMesh* in) {
ai_assert(NULL != in); ai_assert(nullptr != in);
// ... get an unique value representing the vertex format of the mesh // ... get an unique value representing the vertex format of the mesh
const unsigned int fhash = GetMeshVFormatUnique(in); const unsigned int fhash = GetMeshVFormatUnique(in);
@ -78,14 +78,14 @@ inline uint64_t GetMeshHash(aiMesh* in)
/** @brief Perform a component-wise comparison of two arrays /** @brief Perform a component-wise comparison of two arrays
* *
* @param first First array * @param first First array
* @param second Second aray * @param second Second array
* @param size Size of both arrays * @param size Size of both arrays
* @param e Epsilon * @param e Epsilon
* @return true if the arrays are identical * @return true if the arrays are identical
*/ */
inline bool CompareArrays(const aiVector3D* first, const aiVector3D* second, inline
unsigned int size, float e) bool CompareArrays(const aiVector3D* first, const aiVector3D* second,
{ unsigned int size, float e) {
for (const aiVector3D* end = first+size; first != end; ++first,++second) { for (const aiVector3D* end = first+size; first != end; ++first,++second) {
if ( (*first - *second).SquareLength() >= e) if ( (*first - *second).SquareLength() >= e)
return false; return false;

View File

@ -731,17 +731,22 @@ enum MeshAttribute {
TexCoord TexCoord
}; };
static const std::string PosToken = "position";
static const std::string ColToken = "color";
static const std::string NormalToken = "normal";
static const std::string TexCoordToken = "texcoord";
//------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------
static MeshAttribute getAttributeByName( const char *attribName ) { static MeshAttribute getAttributeByName( const char *attribName ) {
ai_assert( nullptr != attribName ); ai_assert( nullptr != attribName );
if ( 0 == strncmp( "position", attribName, strlen( "position" ) ) ) { if ( 0 == strncmp( PosToken.c_str(), attribName, PosToken.size() ) ) {
return Position; return Position;
} else if ( 0 == strncmp( "color", attribName, strlen( "color" ) ) ) { } else if ( 0 == strncmp( ColToken.c_str(), attribName, ColToken.size() ) ) {
return Color; return Color;
} else if( 0 == strncmp( "normal", attribName, strlen( "normal" ) ) ) { } else if( 0 == strncmp( NormalToken.c_str(), attribName, NormalToken.size() ) ) {
return Normal; return Normal;
} else if( 0 == strncmp( "texcoord", attribName, strlen( "texcoord" ) ) ) { } else if( 0 == strncmp( TexCoordToken.c_str(), attribName, TexCoordToken.size() ) ) {
return TexCoord; return TexCoord;
} }
@ -1098,14 +1103,12 @@ void OpenGEXImporter::handleParamNode( ODDLParser::DDLNode *node, aiScene * /*pS
return; return;
} }
const float floatVal( val->getFloat() ); const float floatVal( val->getFloat() );
if ( prop->m_value != nullptr ) { if ( 0 == ASSIMP_strincmp( "fov", prop->m_value->getString(), 3 ) ) {
if ( 0 == ASSIMP_strincmp( "fov", prop->m_value->getString(), 3 ) ) { m_currentCamera->mHorizontalFOV = floatVal;
m_currentCamera->mHorizontalFOV = floatVal; } else if ( 0 == ASSIMP_strincmp( "near", prop->m_value->getString(), 4 ) ) {
} else if ( 0 == ASSIMP_strincmp( "near", prop->m_value->getString(), 3 ) ) { m_currentCamera->mClipPlaneNear = floatVal;
m_currentCamera->mClipPlaneNear = floatVal; } else if ( 0 == ASSIMP_strincmp( "far", prop->m_value->getString(), 3 ) ) {
} else if ( 0 == ASSIMP_strincmp( "far", prop->m_value->getString(), 3 ) ) { m_currentCamera->mClipPlaneFar = floatVal;
m_currentCamera->mClipPlaneFar = floatVal;
}
} }
} }
} }

View File

@ -1256,29 +1256,30 @@ void SceneCombiner::Copy(aiMetadata** _dest, const aiMetadata* src) {
aiMetadataEntry& out = dest->mValues[i]; aiMetadataEntry& out = dest->mValues[i];
out.mType = in.mType; out.mType = in.mType;
switch (dest->mValues[i].mType) { switch (dest->mValues[i].mType) {
case AI_BOOL: case AI_BOOL:
out.mData = new bool(*static_cast<bool*>(in.mData)); out.mData = new bool(*static_cast<bool*>(in.mData));
break; break;
case AI_INT32: case AI_INT32:
out.mData = new int32_t(*static_cast<int32_t*>(in.mData)); out.mData = new int32_t(*static_cast<int32_t*>(in.mData));
break; break;
case AI_UINT64: case AI_UINT64:
out.mData = new uint64_t(*static_cast<uint64_t*>(in.mData)); out.mData = new uint64_t(*static_cast<uint64_t*>(in.mData));
break; break;
case AI_FLOAT: case AI_FLOAT:
out.mData = new float(*static_cast<float*>(in.mData)); out.mData = new float(*static_cast<float*>(in.mData));
break; break;
case AI_DOUBLE: case AI_DOUBLE:
out.mData = new double(*static_cast<double*>(in.mData)); out.mData = new double(*static_cast<double*>(in.mData));
break; break;
case AI_AISTRING: case AI_AISTRING:
out.mData = new aiString(*static_cast<aiString*>(in.mData)); out.mData = new aiString(*static_cast<aiString*>(in.mData));
break; break;
case AI_AIVECTOR3D: case AI_AIVECTOR3D:
out.mData = new aiVector3D(*static_cast<aiVector3D*>(in.mData)); out.mData = new aiVector3D(*static_cast<aiVector3D*>(in.mData));
break; break;
default: default:
ai_assert(false); ai_assert(false);
break;
} }
} }
} }

View File

@ -294,7 +294,7 @@ void SpatialSort::FindIdenticalPositions( const aiVector3D& pPosition,
index++; index++;
// Now start iterating from there until the first position lays outside of the distance range. // Now start iterating from there until the first position lays outside of the distance range.
// Add all positions inside the distance range within the tolerance to the result aray // Add all positions inside the distance range within the tolerance to the result array
std::vector<Entry>::const_iterator it = mPositions.begin() + index; std::vector<Entry>::const_iterator it = mPositions.begin() + index;
while( ToBinary(it->mDistance) < maxDistBinary) while( ToBinary(it->mDistance) < maxDistBinary)
{ {

View File

@ -48,7 +48,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "VertexTriangleAdjacency.h" #include "VertexTriangleAdjacency.h"
#include <assimp/mesh.h> #include <assimp/mesh.h>
using namespace Assimp; using namespace Assimp;
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
@ -60,8 +59,8 @@ VertexTriangleAdjacency::VertexTriangleAdjacency(aiFace *pcFaces,
// compute the number of referenced vertices if it wasn't specified by the caller // compute the number of referenced vertices if it wasn't specified by the caller
const aiFace* const pcFaceEnd = pcFaces + iNumFaces; const aiFace* const pcFaceEnd = pcFaces + iNumFaces;
if (!iNumVertices) { if (!iNumVertices) {
for (aiFace* pcFace = pcFaces; pcFace != pcFaceEnd; ++pcFace) { for (aiFace* pcFace = pcFaces; pcFace != pcFaceEnd; ++pcFace) {
ai_assert( nullptr != pcFace );
ai_assert(3 == pcFace->mNumIndices); ai_assert(3 == pcFace->mNumIndices);
iNumVertices = std::max(iNumVertices,pcFace->mIndices[0]); iNumVertices = std::max(iNumVertices,pcFace->mIndices[0]);
iNumVertices = std::max(iNumVertices,pcFace->mIndices[1]); iNumVertices = std::max(iNumVertices,pcFace->mIndices[1]);
@ -69,19 +68,18 @@ VertexTriangleAdjacency::VertexTriangleAdjacency(aiFace *pcFaces,
} }
} }
this->iNumVertices = iNumVertices; mNumVertices = iNumVertices;
unsigned int* pi; unsigned int* pi;
// allocate storage // allocate storage
if (bComputeNumTriangles) { if (bComputeNumTriangles) {
pi = mLiveTriangles = new unsigned int[iNumVertices+1]; pi = mLiveTriangles = new unsigned int[iNumVertices+1];
memset(mLiveTriangles,0,sizeof(unsigned int)*(iNumVertices+1)); ::memset(mLiveTriangles,0,sizeof(unsigned int)*(iNumVertices+1));
mOffsetTable = new unsigned int[iNumVertices+2]+1; mOffsetTable = new unsigned int[iNumVertices+2]+1;
} } else {
else {
pi = mOffsetTable = new unsigned int[iNumVertices+2]+1; pi = mOffsetTable = new unsigned int[iNumVertices+2]+1;
memset(mOffsetTable,0,sizeof(unsigned int)*(iNumVertices+1)); ::memset(mOffsetTable,0,sizeof(unsigned int)*(iNumVertices+1));
mLiveTriangles = NULL; // important, otherwise the d'tor would crash mLiveTriangles = NULL; // important, otherwise the d'tor would crash
} }
@ -90,8 +88,7 @@ VertexTriangleAdjacency::VertexTriangleAdjacency(aiFace *pcFaces,
*piEnd++ = 0u; *piEnd++ = 0u;
// first pass: compute the number of faces referencing each vertex // first pass: compute the number of faces referencing each vertex
for (aiFace* pcFace = pcFaces; pcFace != pcFaceEnd; ++pcFace) for (aiFace* pcFace = pcFaces; pcFace != pcFaceEnd; ++pcFace) {
{
pi[pcFace->mIndices[0]]++; pi[pcFace->mIndices[0]]++;
pi[pcFace->mIndices[1]]++; pi[pcFace->mIndices[1]]++;
pi[pcFace->mIndices[2]]++; pi[pcFace->mIndices[2]]++;

View File

@ -60,10 +60,8 @@ namespace Assimp {
* @note Although it is called #VertexTriangleAdjacency, the current version does also * @note Although it is called #VertexTriangleAdjacency, the current version does also
* support arbitrary polygons. */ * support arbitrary polygons. */
// -------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------
class ASSIMP_API VertexTriangleAdjacency class ASSIMP_API VertexTriangleAdjacency {
{
public: public:
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
/** @brief Construction from an existing index buffer /** @brief Construction from an existing index buffer
* @param pcFaces Index buffer * @param pcFaces Index buffer
@ -77,39 +75,30 @@ public:
unsigned int iNumVertices = 0, unsigned int iNumVertices = 0,
bool bComputeNumTriangles = true); bool bComputeNumTriangles = true);
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
/** @brief Destructor */ /** @brief Destructor */
~VertexTriangleAdjacency(); ~VertexTriangleAdjacency();
public:
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
/** @brief Get all triangles adjacent to a vertex /** @brief Get all triangles adjacent to a vertex
* @param iVertIndex Index of the vertex * @param iVertIndex Index of the vertex
* @return A pointer to the adjacency list. */ * @return A pointer to the adjacency list. */
unsigned int* GetAdjacentTriangles(unsigned int iVertIndex) const unsigned int* GetAdjacentTriangles(unsigned int iVertIndex) const {
{ ai_assert(iVertIndex < mNumVertices);
ai_assert(iVertIndex < iNumVertices);
return &mAdjacencyTable[ mOffsetTable[iVertIndex]]; return &mAdjacencyTable[ mOffsetTable[iVertIndex]];
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
/** @brief Get the number of triangles that are referenced by /** @brief Get the number of triangles that are referenced by
* a vertex. This function returns a reference that can be modified * a vertex. This function returns a reference that can be modified
* @param iVertIndex Index of the vertex * @param iVertIndex Index of the vertex
* @return Number of referenced triangles */ * @return Number of referenced triangles */
unsigned int& GetNumTrianglesPtr(unsigned int iVertIndex) unsigned int& GetNumTrianglesPtr(unsigned int iVertIndex) {
{ ai_assert( iVertIndex < mNumVertices );
ai_assert(iVertIndex < iNumVertices && NULL != mLiveTriangles); ai_assert( nullptr != mLiveTriangles );
return mLiveTriangles[iVertIndex]; return mLiveTriangles[iVertIndex];
} }
public:
//! Offset table //! Offset table
unsigned int* mOffsetTable; unsigned int* mOffsetTable;
@ -120,9 +109,9 @@ public:
unsigned int* mLiveTriangles; unsigned int* mLiveTriangles;
//! Debug: Number of referenced vertices //! Debug: Number of referenced vertices
unsigned int iNumVertices; unsigned int mNumVertices;
}; };
}
} //! ns Assimp
#endif // !! AI_VTADJACENCY_H_INC #endif // !! AI_VTADJACENCY_H_INC

View File

@ -248,9 +248,9 @@ bool IOStreamBuffer<T>::getNextDataLine( std::vector<T> &buffer, T continuationT
} }
} }
bool continuationFound( false ), endOfDataLine( false ); bool continuationFound( false );
size_t i = 0; size_t i = 0;
while ( !endOfDataLine ) { for( ;; ) {
if ( continuationToken == m_cache[ m_cachePos ] ) { if ( continuationToken == m_cache[ m_cachePos ] ) {
continuationFound = true; continuationFound = true;
++m_cachePos; ++m_cachePos;

View File

@ -123,7 +123,7 @@ protected:
Entry() { /** intentionally not initialized.*/ } Entry() { /** intentionally not initialized.*/ }
Entry( unsigned int pIndex, const aiVector3D& pPosition, float pDistance,uint32_t pSG) Entry( unsigned int pIndex, const aiVector3D& pPosition, float pDistance,uint32_t pSG)
: :
mIndex( pIndex), mIndex( pIndex),
mPosition( pPosition), mPosition( pPosition),
mSmoothGroups (pSG), mSmoothGroups (pSG),

View File

@ -58,7 +58,7 @@ namespace Assimp {
// -------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------
/** Wrapper class around IOStream to allow for consistent writing of binary data in both /** Wrapper class around IOStream to allow for consistent writing of binary data in both
* little and big endian format. Don't attempt to instance the template directly. Use * little and big endian format. Don't attempt to instance the template directly. Use
* StreamWriterLE to read from a little-endian stream and StreamWriterBE to read from a * StreamWriterLE to write to a little-endian stream and StreamWriterBE to write to a
* BE stream. Alternatively, there is StreamWriterAny if the endianness of the output * BE stream. Alternatively, there is StreamWriterAny if the endianness of the output
* stream is to be determined at runtime. * stream is to be determined at runtime.
*/ */
@ -108,6 +108,38 @@ public:
stream->Flush(); stream->Flush();
} }
public:
// ---------------------------------------------------------------------
/** Flush the contents of the internal buffer, and the output IOStream */
void Flush()
{
stream->Write(&buffer[0], 1, buffer.size());
stream->Flush();
buffer.clear();
cursor = 0;
}
// ---------------------------------------------------------------------
/** Seek to the given offset / origin in the output IOStream.
*
* Flushes the internal buffer and the output IOStream prior to seeking. */
aiReturn Seek(size_t pOffset, aiOrigin pOrigin=aiOrigin_SET)
{
Flush();
return stream->Seek(pOffset, pOrigin);
}
// ---------------------------------------------------------------------
/** Tell the current position in the output IOStream.
*
* First flushes the internal buffer and the output IOStream. */
size_t Tell()
{
Flush();
return stream->Tell();
}
public: public:
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
@ -171,6 +203,32 @@ public:
Put(n); Put(n);
} }
// ---------------------------------------------------------------------
/** Write an aiString to the stream */
void PutString(const aiString& s)
{
// as Put(T f) below
if (cursor + s.length >= buffer.size()) {
buffer.resize(cursor + s.length);
}
void* dest = &buffer[cursor];
::memcpy(dest, s.C_Str(), s.length);
cursor += s.length;
}
// ---------------------------------------------------------------------
/** Write a std::string to the stream */
void PutString(const std::string& s)
{
// as Put(T f) below
if (cursor + s.size() >= buffer.size()) {
buffer.resize(cursor + s.size());
}
void* dest = &buffer[cursor];
::memcpy(dest, s.c_str(), s.size());
cursor += s.size();
}
public: public:
// --------------------------------------------------------------------- // ---------------------------------------------------------------------

View File

@ -65,7 +65,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define _AI_MATKEY_GLTF_SCALE_BASE "$tex.scale" #define _AI_MATKEY_GLTF_SCALE_BASE "$tex.scale"
#define _AI_MATKEY_GLTF_STRENGTH_BASE "$tex.strength" #define _AI_MATKEY_GLTF_STRENGTH_BASE "$tex.strength"
#define AI_MATKEY_GLTF_TEXTURE_TEXCOORD _AI_MATKEY_GLTF_TEXTURE_TEXCOORD_BASE, type, N #define AI_MATKEY_GLTF_TEXTURE_TEXCOORD(type, N) _AI_MATKEY_GLTF_TEXTURE_TEXCOORD_BASE, type, N
#define AI_MATKEY_GLTF_MAPPINGNAME(type, N) _AI_MATKEY_GLTF_MAPPINGNAME_BASE, type, N #define AI_MATKEY_GLTF_MAPPINGNAME(type, N) _AI_MATKEY_GLTF_MAPPINGNAME_BASE, type, N
#define AI_MATKEY_GLTF_MAPPINGID(type, N) _AI_MATKEY_GLTF_MAPPINGID_BASE, type, N #define AI_MATKEY_GLTF_MAPPINGID(type, N) _AI_MATKEY_GLTF_MAPPINGID_BASE, type, N
#define AI_MATKEY_GLTF_MAPPINGFILTER_MAG(type, N) _AI_MATKEY_GLTF_MAPPINGFILTER_MAG_BASE, type, N #define AI_MATKEY_GLTF_MAPPINGFILTER_MAG(type, N) _AI_MATKEY_GLTF_MAPPINGFILTER_MAG_BASE, type, N