Merge branch 'master' into moffsetmatrix_documentation
commit
7c2f7c02ab
|
@ -205,7 +205,7 @@ enum ErrorPolicy {
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------
|
||||||
/** Represents a data structure in a BLEND file. A Structure defines n fields
|
/** Represents a data structure in a BLEND file. A Structure defines n fields
|
||||||
* and their locatios and encodings the input stream. Usually, every
|
* and their locations and encodings the input stream. Usually, every
|
||||||
* Structure instance pertains to one equally-named data structure in the
|
* Structure instance pertains to one equally-named data structure in the
|
||||||
* BlenderScene.h header. This class defines various utilities to map a
|
* BlenderScene.h header. This class defines various utilities to map a
|
||||||
* binary `blob` read from the file to such a structure instance with
|
* binary `blob` read from the file to such a structure instance with
|
||||||
|
|
|
@ -502,7 +502,7 @@ const FileBlockHead* Structure :: LocateFileBlockForAddress(const Pointer & ptrv
|
||||||
{
|
{
|
||||||
// the file blocks appear in list sorted by
|
// the file blocks appear in list sorted by
|
||||||
// with ascending base addresses so we can run a
|
// with ascending base addresses so we can run a
|
||||||
// binary search to locate the pointee quickly.
|
// binary search to locate the pointer quickly.
|
||||||
|
|
||||||
// NOTE: Blender seems to distinguish between side-by-side
|
// NOTE: Blender seems to distinguish between side-by-side
|
||||||
// data (stored in the same data block) and far pointers,
|
// data (stored in the same data block) and far pointers,
|
||||||
|
|
|
@ -116,7 +116,7 @@ template <> void Structure :: Convert<MTex> (
|
||||||
ReadField<ErrorPolicy_Igno>(temp,"projy",db);
|
ReadField<ErrorPolicy_Igno>(temp,"projy",db);
|
||||||
dest.projy = static_cast<Assimp::Blender::MTex::Projection>(temp);
|
dest.projy = static_cast<Assimp::Blender::MTex::Projection>(temp);
|
||||||
ReadField<ErrorPolicy_Igno>(temp,"projz",db);
|
ReadField<ErrorPolicy_Igno>(temp,"projz",db);
|
||||||
dest.projx = static_cast<Assimp::Blender::MTex::Projection>(temp);
|
dest.projz = static_cast<Assimp::Blender::MTex::Projection>(temp);
|
||||||
ReadField<ErrorPolicy_Igno>(dest.mapping,"mapping",db);
|
ReadField<ErrorPolicy_Igno>(dest.mapping,"mapping",db);
|
||||||
ReadFieldArray<ErrorPolicy_Igno>(dest.ofs,"ofs",db);
|
ReadFieldArray<ErrorPolicy_Igno>(dest.ofs,"ofs",db);
|
||||||
ReadFieldArray<ErrorPolicy_Igno>(dest.size,"size",db);
|
ReadFieldArray<ErrorPolicy_Igno>(dest.size,"size",db);
|
||||||
|
|
|
@ -428,16 +428,19 @@ void ResolveVertexDataArray(std::vector<T>& data_out, const Scope& source,
|
||||||
const std::vector<unsigned int>& mapping_offsets,
|
const std::vector<unsigned int>& mapping_offsets,
|
||||||
const std::vector<unsigned int>& mappings)
|
const std::vector<unsigned int>& mappings)
|
||||||
{
|
{
|
||||||
|
bool isDirect = ReferenceInformationType == "Direct";
|
||||||
|
bool isIndexToDirect = ReferenceInformationType == "IndexToDirect";
|
||||||
|
|
||||||
|
// fallback to direct data if there is no index data element
|
||||||
|
if ( isIndexToDirect && !HasElement( source, indexDataElementName ) ) {
|
||||||
|
isDirect = true;
|
||||||
|
isIndexToDirect = false;
|
||||||
|
}
|
||||||
|
|
||||||
// handle permutations of Mapping and Reference type - it would be nice to
|
// handle permutations of Mapping and Reference type - it would be nice to
|
||||||
// deal with this more elegantly and with less redundancy, but right
|
// deal with this more elegantly and with less redundancy, but right
|
||||||
// now it seems unavoidable.
|
// now it seems unavoidable.
|
||||||
if (MappingInformationType == "ByVertice" && ReferenceInformationType == "Direct") {
|
if (MappingInformationType == "ByVertice" && isDirect) {
|
||||||
if ( !HasElement( source, indexDataElementName ) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<T> tempData;
|
std::vector<T> tempData;
|
||||||
ParseVectorDataArray(tempData, GetRequiredElement(source, dataElementName));
|
ParseVectorDataArray(tempData, GetRequiredElement(source, dataElementName));
|
||||||
|
|
||||||
|
@ -450,14 +453,11 @@ void ResolveVertexDataArray(std::vector<T>& data_out, const Scope& source,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (MappingInformationType == "ByVertice" && ReferenceInformationType == "IndexToDirect") {
|
else if (MappingInformationType == "ByVertice" && isIndexToDirect) {
|
||||||
std::vector<T> tempData;
|
std::vector<T> tempData;
|
||||||
ParseVectorDataArray(tempData, GetRequiredElement(source, dataElementName));
|
ParseVectorDataArray(tempData, GetRequiredElement(source, dataElementName));
|
||||||
|
|
||||||
data_out.resize(vertex_count);
|
data_out.resize(vertex_count);
|
||||||
if ( !HasElement( source, indexDataElementName ) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<int> uvIndices;
|
std::vector<int> uvIndices;
|
||||||
ParseVectorDataArray(uvIndices,GetRequiredElement(source,indexDataElementName));
|
ParseVectorDataArray(uvIndices,GetRequiredElement(source,indexDataElementName));
|
||||||
|
@ -472,7 +472,7 @@ void ResolveVertexDataArray(std::vector<T>& data_out, const Scope& source,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (MappingInformationType == "ByPolygonVertex" && ReferenceInformationType == "Direct") {
|
else if (MappingInformationType == "ByPolygonVertex" && isDirect) {
|
||||||
std::vector<T> tempData;
|
std::vector<T> tempData;
|
||||||
ParseVectorDataArray(tempData, GetRequiredElement(source, dataElementName));
|
ParseVectorDataArray(tempData, GetRequiredElement(source, dataElementName));
|
||||||
|
|
||||||
|
@ -485,7 +485,7 @@ void ResolveVertexDataArray(std::vector<T>& data_out, const Scope& source,
|
||||||
|
|
||||||
data_out.swap(tempData);
|
data_out.swap(tempData);
|
||||||
}
|
}
|
||||||
else if (MappingInformationType == "ByPolygonVertex" && ReferenceInformationType == "IndexToDirect") {
|
else if (MappingInformationType == "ByPolygonVertex" && isIndexToDirect) {
|
||||||
std::vector<T> tempData;
|
std::vector<T> tempData;
|
||||||
ParseVectorDataArray(tempData, GetRequiredElement(source, dataElementName));
|
ParseVectorDataArray(tempData, GetRequiredElement(source, dataElementName));
|
||||||
|
|
||||||
|
|
|
@ -168,6 +168,55 @@ public:
|
||||||
return wrapped->ComparePaths (one,second);
|
return wrapped->ComparePaths (one,second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
/** Pushes a new directory onto the directory stack. */
|
||||||
|
bool PushDirectory(const std::string &path)
|
||||||
|
{
|
||||||
|
return wrapped->PushDirectory(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
/** Returns the top directory from the stack. */
|
||||||
|
const std::string &CurrentDirectory() const
|
||||||
|
{
|
||||||
|
return wrapped->CurrentDirectory();
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
/** Returns the number of directories stored on the stack. */
|
||||||
|
size_t StackSize() const
|
||||||
|
{
|
||||||
|
return wrapped->StackSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
/** Pops the top directory from the stack. */
|
||||||
|
bool PopDirectory()
|
||||||
|
{
|
||||||
|
return wrapped->PopDirectory();
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
/** Creates an new directory at the given path. */
|
||||||
|
bool CreateDirectory(const std::string &path)
|
||||||
|
{
|
||||||
|
return wrapped->CreateDirectory(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
/** Will change the current directory to the given path. */
|
||||||
|
bool ChangeDirectory(const std::string &path)
|
||||||
|
{
|
||||||
|
return wrapped->ChangeDirectory(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
/** Delete file. */
|
||||||
|
bool DeleteFile(const std::string &file)
|
||||||
|
{
|
||||||
|
return wrapped->DeleteFile(file);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,17 +1103,15 @@ 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(), 3 ) ) {
|
} else if ( 0 == ASSIMP_strincmp( "near", prop->m_value->getString(), 4 ) ) {
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------
|
||||||
void OpenGEXImporter::handleAttenNode( ODDLParser::DDLNode *node, aiScene * /*pScene*/ ) {
|
void OpenGEXImporter::handleAttenNode( ODDLParser::DDLNode *node, aiScene * /*pScene*/ ) {
|
||||||
|
|
|
@ -125,6 +125,9 @@ corresponding preprocessor flag to selectively disable steps.
|
||||||
#ifndef ASSIMP_BUILD_NO_DEBONE_PROCESS
|
#ifndef ASSIMP_BUILD_NO_DEBONE_PROCESS
|
||||||
# include "DeboneProcess.h"
|
# include "DeboneProcess.h"
|
||||||
#endif
|
#endif
|
||||||
|
#if (!defined ASSIMP_BUILD_NO_GLOBALSCALE_PROCESS)
|
||||||
|
# include "ScaleProcess.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Assimp {
|
namespace Assimp {
|
||||||
|
|
||||||
|
@ -136,7 +139,7 @@ void GetPostProcessingStepInstanceList(std::vector< BaseProcess* >& out)
|
||||||
// of sequence it is executed. Steps that are added here are not
|
// of sequence it is executed. Steps that are added here are not
|
||||||
// validated - as RegisterPPStep() does - all dependencies must be given.
|
// validated - as RegisterPPStep() does - all dependencies must be given.
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
out.reserve(30);
|
out.reserve(31);
|
||||||
#if (!defined ASSIMP_BUILD_NO_MAKELEFTHANDED_PROCESS)
|
#if (!defined ASSIMP_BUILD_NO_MAKELEFTHANDED_PROCESS)
|
||||||
out.push_back( new MakeLeftHandedProcess());
|
out.push_back( new MakeLeftHandedProcess());
|
||||||
#endif
|
#endif
|
||||||
|
@ -197,7 +200,9 @@ void GetPostProcessingStepInstanceList(std::vector< BaseProcess* >& out)
|
||||||
#if (!defined ASSIMP_BUILD_NO_GENFACENORMALS_PROCESS)
|
#if (!defined ASSIMP_BUILD_NO_GENFACENORMALS_PROCESS)
|
||||||
out.push_back( new GenFaceNormalsProcess());
|
out.push_back( new GenFaceNormalsProcess());
|
||||||
#endif
|
#endif
|
||||||
|
#if (!defined ASSIMP_BUILD_NO_GLOBALSCALE_PROCESS)
|
||||||
|
out.push_back( new ScaleProcess());
|
||||||
|
#endif
|
||||||
// .........................................................................
|
// .........................................................................
|
||||||
// DON'T change the order of these five ..
|
// DON'T change the order of these five ..
|
||||||
// XXX this is actually a design weakness that dates back to the time
|
// XXX this is actually a design weakness that dates back to the time
|
||||||
|
|
|
@ -39,6 +39,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
#ifndef ASSIMP_BUILD_NO_GLOBALSCALE_PROCESS
|
||||||
|
|
||||||
#include "ScaleProcess.h"
|
#include "ScaleProcess.h"
|
||||||
|
|
||||||
#include <assimp/scene.h>
|
#include <assimp/scene.h>
|
||||||
|
@ -104,3 +106,5 @@ void ScaleProcess::applyScaling( aiNode *currentNode ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
} // Namespace Assimp
|
} // Namespace Assimp
|
||||||
|
|
||||||
|
#endif // !! ASSIMP_BUILD_NO_GLOBALSCALE_PROCESS
|
||||||
|
|
|
@ -1279,6 +1279,7 @@ void SceneCombiner::Copy(aiMetadata** _dest, const aiMetadata* src) {
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ai_assert(false);
|
ai_assert(false);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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]]++;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue