Merge branch 'master' into crash_in_ai_mesh_desctuctor
commit
3546403284
|
@ -334,7 +334,7 @@ void AMFImporter::PostprocessHelper_SplitFacesByTextureID(std::list<SComplexFace
|
||||||
{
|
{
|
||||||
auto it_old = it;
|
auto it_old = it;
|
||||||
|
|
||||||
it++;
|
++it;
|
||||||
face_list_cur.push_back(*it_old);
|
face_list_cur.push_back(*it_old);
|
||||||
pInputList.erase(it_old);
|
pInputList.erase(it_old);
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,83 +61,66 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
using namespace Assimp;
|
using namespace Assimp;
|
||||||
|
|
||||||
// maximum path length
|
#ifdef _WIN32
|
||||||
// XXX http://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
|
static std::wstring Utf8ToWide(const char* in)
|
||||||
#ifdef PATH_MAX
|
{
|
||||||
# define PATHLIMIT PATH_MAX
|
int size = MultiByteToWideChar(CP_UTF8, 0, in, -1, nullptr, 0);
|
||||||
#else
|
// size includes terminating null; std::wstring adds null automatically
|
||||||
# define PATHLIMIT 4096
|
std::wstring out(static_cast<size_t>(size) - 1, L'\0');
|
||||||
|
MultiByteToWideChar(CP_UTF8, 0, in, -1, &out[0], size);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string WideToUtf8(const wchar_t* in)
|
||||||
|
{
|
||||||
|
int size = WideCharToMultiByte(CP_UTF8, 0, in, -1, nullptr, 0, nullptr, nullptr);
|
||||||
|
// size includes terminating null; std::string adds null automatically
|
||||||
|
std::string out(static_cast<size_t>(size) - 1, '\0');
|
||||||
|
WideCharToMultiByte(CP_UTF8, 0, in, -1, &out[0], size, nullptr, nullptr);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Tests for the existence of a file at the given path.
|
// Tests for the existence of a file at the given path.
|
||||||
bool DefaultIOSystem::Exists( const char* pFile) const
|
bool DefaultIOSystem::Exists(const char* pFile) const
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
wchar_t fileName16[PATHLIMIT];
|
struct __stat64 filestat;
|
||||||
|
if (_wstat64(Utf8ToWide(pFile).c_str(), &filestat) != 0) {
|
||||||
#ifndef WindowsStore
|
return false;
|
||||||
bool isUnicode = IsTextUnicode(pFile, static_cast<int>(strlen(pFile)), NULL) != 0;
|
|
||||||
if (isUnicode) {
|
|
||||||
|
|
||||||
MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED, pFile, -1, fileName16, PATHLIMIT);
|
|
||||||
struct __stat64 filestat;
|
|
||||||
if (0 != _wstat64(fileName16, &filestat)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
#endif
|
|
||||||
FILE* file = ::fopen(pFile, "rb");
|
|
||||||
if (!file)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
::fclose(file);
|
|
||||||
#ifndef WindowsStore
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#else
|
#else
|
||||||
FILE* file = ::fopen( pFile, "rb");
|
FILE* file = ::fopen(pFile, "rb");
|
||||||
if( !file)
|
if (!file)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
::fclose( file);
|
::fclose(file);
|
||||||
#endif
|
#endif
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Open a new file with a given path.
|
// Open a new file with a given path.
|
||||||
IOStream* DefaultIOSystem::Open( const char* strFile, const char* strMode)
|
IOStream* DefaultIOSystem::Open(const char* strFile, const char* strMode)
|
||||||
{
|
{
|
||||||
ai_assert(NULL != strFile);
|
ai_assert(strFile != nullptr);
|
||||||
ai_assert(NULL != strMode);
|
ai_assert(strMode != nullptr);
|
||||||
FILE* file;
|
FILE* file;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
wchar_t fileName16[PATHLIMIT];
|
file = ::_wfopen(Utf8ToWide(strFile).c_str(), Utf8ToWide(strMode).c_str());
|
||||||
#ifndef WindowsStore
|
|
||||||
bool isUnicode = IsTextUnicode(strFile, static_cast<int>(strlen(strFile)), NULL) != 0;
|
|
||||||
if (isUnicode) {
|
|
||||||
MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED, strFile, -1, fileName16, PATHLIMIT);
|
|
||||||
std::string mode8(strMode);
|
|
||||||
file = ::_wfopen(fileName16, std::wstring(mode8.begin(), mode8.end()).c_str());
|
|
||||||
} else {
|
|
||||||
#endif
|
|
||||||
file = ::fopen(strFile, strMode);
|
|
||||||
#ifndef WindowsStore
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#else
|
#else
|
||||||
file = ::fopen(strFile, strMode);
|
file = ::fopen(strFile, strMode);
|
||||||
#endif
|
#endif
|
||||||
if (nullptr == file)
|
if (!file)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
return new DefaultIOStream(file, (std::string) strFile);
|
return new DefaultIOStream(file, strFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Closes the given file and releases all resources associated with it.
|
// Closes the given file and releases all resources associated with it.
|
||||||
void DefaultIOSystem::Close( IOStream* pFile)
|
void DefaultIOSystem::Close(IOStream* pFile)
|
||||||
{
|
{
|
||||||
delete pFile;
|
delete pFile;
|
||||||
}
|
}
|
||||||
|
@ -155,78 +138,56 @@ char DefaultIOSystem::getOsSeparator() const
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// IOSystem default implementation (ComparePaths isn't a pure virtual function)
|
// IOSystem default implementation (ComparePaths isn't a pure virtual function)
|
||||||
bool IOSystem::ComparePaths (const char* one, const char* second) const
|
bool IOSystem::ComparePaths(const char* one, const char* second) const
|
||||||
{
|
{
|
||||||
return !ASSIMP_stricmp(one,second);
|
return !ASSIMP_stricmp(one, second);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Convert a relative path into an absolute path
|
// Convert a relative path into an absolute path
|
||||||
inline static void MakeAbsolutePath (const char* in, char* _out)
|
inline static std::string MakeAbsolutePath(const char* in)
|
||||||
{
|
{
|
||||||
ai_assert(in && _out);
|
ai_assert(in);
|
||||||
#if defined( _MSC_VER ) || defined( __MINGW32__ )
|
std::string out;
|
||||||
#ifndef WindowsStore
|
#ifdef _WIN32
|
||||||
bool isUnicode = IsTextUnicode(in, static_cast<int>(strlen(in)), NULL) != 0;
|
wchar_t* ret = ::_wfullpath(nullptr, Utf8ToWide(in).c_str(), 0);
|
||||||
if (isUnicode) {
|
if (ret) {
|
||||||
wchar_t out16[PATHLIMIT];
|
out = WideToUtf8(ret);
|
||||||
wchar_t in16[PATHLIMIT];
|
free(ret);
|
||||||
MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED, in, -1, out16, PATHLIMIT);
|
}
|
||||||
wchar_t* ret = ::_wfullpath(out16, in16, PATHLIMIT);
|
#else
|
||||||
if (ret) {
|
char* ret = realpath(in, nullptr);
|
||||||
WideCharToMultiByte(CP_UTF8, MB_PRECOMPOSED, out16, -1, _out, PATHLIMIT, nullptr, nullptr);
|
if (ret) {
|
||||||
}
|
out = ret;
|
||||||
if (!ret) {
|
free(ret);
|
||||||
// preserve the input path, maybe someone else is able to fix
|
|
||||||
// the path before it is accessed (e.g. our file system filter)
|
|
||||||
ASSIMP_LOG_WARN_F("Invalid path: ", std::string(in));
|
|
||||||
strcpy(_out, in);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
#endif
|
|
||||||
char* ret = :: _fullpath(_out, in, PATHLIMIT);
|
|
||||||
if (!ret) {
|
|
||||||
// preserve the input path, maybe someone else is able to fix
|
|
||||||
// the path before it is accessed (e.g. our file system filter)
|
|
||||||
ASSIMP_LOG_WARN_F("Invalid path: ", std::string(in));
|
|
||||||
strcpy(_out, in);
|
|
||||||
}
|
|
||||||
#ifndef WindowsStore
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#else
|
if (!ret) {
|
||||||
// use realpath
|
|
||||||
char* ret = realpath(in, _out);
|
|
||||||
if(!ret) {
|
|
||||||
// preserve the input path, maybe someone else is able to fix
|
// preserve the input path, maybe someone else is able to fix
|
||||||
// the path before it is accessed (e.g. our file system filter)
|
// the path before it is accessed (e.g. our file system filter)
|
||||||
ASSIMP_LOG_WARN_F("Invalid path: ", std::string(in));
|
ASSIMP_LOG_WARN_F("Invalid path: ", std::string(in));
|
||||||
strcpy(_out,in);
|
out = in;
|
||||||
}
|
}
|
||||||
#endif
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// DefaultIOSystem's more specialized implementation
|
// DefaultIOSystem's more specialized implementation
|
||||||
bool DefaultIOSystem::ComparePaths (const char* one, const char* second) const
|
bool DefaultIOSystem::ComparePaths(const char* one, const char* second) const
|
||||||
{
|
{
|
||||||
// chances are quite good both paths are formatted identically,
|
// chances are quite good both paths are formatted identically,
|
||||||
// so we can hopefully return here already
|
// so we can hopefully return here already
|
||||||
if( !ASSIMP_stricmp(one,second) )
|
if (!ASSIMP_stricmp(one, second))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
char temp1[PATHLIMIT];
|
std::string temp1 = MakeAbsolutePath(one);
|
||||||
char temp2[PATHLIMIT];
|
std::string temp2 = MakeAbsolutePath(second);
|
||||||
|
|
||||||
MakeAbsolutePath (one, temp1);
|
return !ASSIMP_stricmp(temp1, temp2);
|
||||||
MakeAbsolutePath (second, temp2);
|
|
||||||
|
|
||||||
return !ASSIMP_stricmp(temp1,temp2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
std::string DefaultIOSystem::fileName( const std::string &path )
|
std::string DefaultIOSystem::fileName(const std::string& path)
|
||||||
{
|
{
|
||||||
std::string ret = path;
|
std::string ret = path;
|
||||||
std::size_t last = ret.find_last_of("\\/");
|
std::size_t last = ret.find_last_of("\\/");
|
||||||
|
@ -235,16 +196,16 @@ std::string DefaultIOSystem::fileName( const std::string &path )
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
std::string DefaultIOSystem::completeBaseName( const std::string &path )
|
std::string DefaultIOSystem::completeBaseName(const std::string& path)
|
||||||
{
|
{
|
||||||
std::string ret = fileName(path);
|
std::string ret = fileName(path);
|
||||||
std::size_t pos = ret.find_last_of('.');
|
std::size_t pos = ret.find_last_of('.');
|
||||||
if(pos != ret.npos) ret = ret.substr(0, pos);
|
if (pos != std::string::npos) ret = ret.substr(0, pos);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
std::string DefaultIOSystem::absolutePath( const std::string &path )
|
std::string DefaultIOSystem::absolutePath(const std::string& path)
|
||||||
{
|
{
|
||||||
std::string ret = path;
|
std::string ret = path;
|
||||||
std::size_t last = ret.find_last_of("\\/");
|
std::size_t last = ret.find_last_of("\\/");
|
||||||
|
@ -253,5 +214,3 @@ std::string DefaultIOSystem::absolutePath( const std::string &path )
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
#undef PATHLIMIT
|
|
||||||
|
|
|
@ -684,7 +684,7 @@ void X3DImporter::XML_ReadNode_GetAttrVal_AsArrVec2f(const int pAttrIdx, std::ve
|
||||||
|
|
||||||
XML_ReadNode_GetAttrVal_AsListVec2f(pAttrIdx, tlist);// read as list
|
XML_ReadNode_GetAttrVal_AsListVec2f(pAttrIdx, tlist);// read as list
|
||||||
// and copy to array
|
// and copy to array
|
||||||
if(tlist.size() > 0)
|
if(!tlist.empty())
|
||||||
{
|
{
|
||||||
pValue.reserve(tlist.size());
|
pValue.reserve(tlist.size());
|
||||||
for ( std::list<aiVector2D>::iterator it = tlist.begin(); it != tlist.end(); ++it )
|
for ( std::list<aiVector2D>::iterator it = tlist.begin(); it != tlist.end(); ++it )
|
||||||
|
@ -1241,7 +1241,7 @@ void X3DImporter::MeshGeometry_AddTexCoord(aiMesh& pMesh, const std::vector<int3
|
||||||
|
|
||||||
// copy list to array because we are need indexed access to normals.
|
// copy list to array because we are need indexed access to normals.
|
||||||
texcoord_arr_copy.reserve(pTexCoords.size());
|
texcoord_arr_copy.reserve(pTexCoords.size());
|
||||||
for(std::list<aiVector2D>::const_iterator it = pTexCoords.begin(); it != pTexCoords.end(); it++)
|
for(std::list<aiVector2D>::const_iterator it = pTexCoords.begin(); it != pTexCoords.end(); ++it)
|
||||||
{
|
{
|
||||||
texcoord_arr_copy.push_back(aiVector3D((*it).x, (*it).y, 0));
|
texcoord_arr_copy.push_back(aiVector3D((*it).x, (*it).y, 0));
|
||||||
}
|
}
|
||||||
|
|
|
@ -230,7 +230,7 @@ void X3DImporter::ParseNode_Geometry3D_Cylinder()
|
||||||
|
|
||||||
if(top)
|
if(top)
|
||||||
{
|
{
|
||||||
for(std::vector<aiVector3D>::iterator it = tcir.begin(); it != tcir.end(); it++)
|
for(std::vector<aiVector3D>::iterator it = tcir.begin(); it != tcir.end(); ++it)
|
||||||
{
|
{
|
||||||
(*it).y = height;// y - because circle made in oXZ.
|
(*it).y = height;// y - because circle made in oXZ.
|
||||||
vlist.push_back(*it);
|
vlist.push_back(*it);
|
||||||
|
|
|
@ -89,7 +89,7 @@ aiMatrix4x4 X3DImporter::PostprocessHelper_Matrix_GlobalToCurrent() const
|
||||||
void X3DImporter::PostprocessHelper_CollectMetadata(const CX3DImporter_NodeElement& pNodeElement, std::list<CX3DImporter_NodeElement*>& pList) const
|
void X3DImporter::PostprocessHelper_CollectMetadata(const CX3DImporter_NodeElement& pNodeElement, std::list<CX3DImporter_NodeElement*>& pList) const
|
||||||
{
|
{
|
||||||
// walk through childs and find for metadata.
|
// walk through childs and find for metadata.
|
||||||
for(std::list<CX3DImporter_NodeElement*>::const_iterator el_it = pNodeElement.Child.begin(); el_it != pNodeElement.Child.end(); el_it++)
|
for(std::list<CX3DImporter_NodeElement*>::const_iterator el_it = pNodeElement.Child.begin(); el_it != pNodeElement.Child.end(); ++el_it)
|
||||||
{
|
{
|
||||||
if(((*el_it)->Type == CX3DImporter_NodeElement::ENET_MetaBoolean) || ((*el_it)->Type == CX3DImporter_NodeElement::ENET_MetaDouble) ||
|
if(((*el_it)->Type == CX3DImporter_NodeElement::ENET_MetaBoolean) || ((*el_it)->Type == CX3DImporter_NodeElement::ENET_MetaDouble) ||
|
||||||
((*el_it)->Type == CX3DImporter_NodeElement::ENET_MetaFloat) || ((*el_it)->Type == CX3DImporter_NodeElement::ENET_MetaInteger) ||
|
((*el_it)->Type == CX3DImporter_NodeElement::ENET_MetaFloat) || ((*el_it)->Type == CX3DImporter_NodeElement::ENET_MetaInteger) ||
|
||||||
|
@ -255,7 +255,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle
|
||||||
std::vector<aiVector3D> tarr;
|
std::vector<aiVector3D> tarr;
|
||||||
|
|
||||||
tarr.reserve(tnemesh.Vertices.size());
|
tarr.reserve(tnemesh.Vertices.size());
|
||||||
for(std::list<aiVector3D>::iterator it = tnemesh.Vertices.begin(); it != tnemesh.Vertices.end(); it++) tarr.push_back(*it);
|
for(std::list<aiVector3D>::iterator it = tnemesh.Vertices.begin(); it != tnemesh.Vertices.end(); ++it) tarr.push_back(*it);
|
||||||
*pMesh = StandardShapes::MakeMesh(tarr, static_cast<unsigned int>(tnemesh.NumIndices));// create mesh from vertices using Assimp help.
|
*pMesh = StandardShapes::MakeMesh(tarr, static_cast<unsigned int>(tnemesh.NumIndices));// create mesh from vertices using Assimp help.
|
||||||
|
|
||||||
return;// mesh is build, nothing to do anymore.
|
return;// mesh is build, nothing to do anymore.
|
||||||
|
@ -438,7 +438,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle
|
||||||
|
|
||||||
vec_copy.reserve(((CX3DImporter_NodeElement_Coordinate*)*ch_it)->Value.size());
|
vec_copy.reserve(((CX3DImporter_NodeElement_Coordinate*)*ch_it)->Value.size());
|
||||||
for(std::list<aiVector3D>::const_iterator it = ((CX3DImporter_NodeElement_Coordinate*)*ch_it)->Value.begin();
|
for(std::list<aiVector3D>::const_iterator it = ((CX3DImporter_NodeElement_Coordinate*)*ch_it)->Value.begin();
|
||||||
it != ((CX3DImporter_NodeElement_Coordinate*)*ch_it)->Value.end(); it++)
|
it != ((CX3DImporter_NodeElement_Coordinate*)*ch_it)->Value.end(); ++it)
|
||||||
{
|
{
|
||||||
vec_copy.push_back(*it);
|
vec_copy.push_back(*it);
|
||||||
}
|
}
|
||||||
|
@ -580,7 +580,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle
|
||||||
CX3DImporter_NodeElement_Set& tnemesh = *((CX3DImporter_NodeElement_Set*)&pNodeElement);// create alias for convenience
|
CX3DImporter_NodeElement_Set& tnemesh = *((CX3DImporter_NodeElement_Set*)&pNodeElement);// create alias for convenience
|
||||||
|
|
||||||
// at first search for <Coordinate> node and create mesh.
|
// at first search for <Coordinate> node and create mesh.
|
||||||
for(std::list<CX3DImporter_NodeElement*>::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++)
|
for(std::list<CX3DImporter_NodeElement*>::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it)
|
||||||
{
|
{
|
||||||
if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Coordinate)
|
if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Coordinate)
|
||||||
{
|
{
|
||||||
|
|
|
@ -413,7 +413,7 @@ void X3DImporter::ParseNode_Rendering_IndexedTriangleSet()
|
||||||
ne_alias.CoordIndex.clear();
|
ne_alias.CoordIndex.clear();
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
int32_t idx[3];
|
int32_t idx[3];
|
||||||
for(std::vector<int32_t>::const_iterator idx_it = index.begin(); idx_it != index.end(); idx_it++)
|
for(std::vector<int32_t>::const_iterator idx_it = index.begin(); idx_it != index.end(); ++idx_it)
|
||||||
{
|
{
|
||||||
idx[counter++] = *idx_it;
|
idx[counter++] = *idx_it;
|
||||||
if (counter > 2)
|
if (counter > 2)
|
||||||
|
@ -765,7 +765,7 @@ void X3DImporter::ParseNode_Rendering_TriangleFanSet()
|
||||||
// assign indices for first triangle
|
// assign indices for first triangle
|
||||||
coord_num_first = 0;
|
coord_num_first = 0;
|
||||||
coord_num_prev = 1;
|
coord_num_prev = 1;
|
||||||
for(std::vector<int32_t>::const_iterator vc_it = ne_alias.VertexCount.begin(); vc_it != ne_alias.VertexCount.end(); vc_it++)
|
for(std::vector<int32_t>::const_iterator vc_it = ne_alias.VertexCount.begin(); vc_it != ne_alias.VertexCount.end(); ++vc_it)
|
||||||
{
|
{
|
||||||
if(*vc_it < 3) throw DeadlyImportError("TriangleFanSet. fanCount shall be greater than or equal to three.");
|
if(*vc_it < 3) throw DeadlyImportError("TriangleFanSet. fanCount shall be greater than or equal to three.");
|
||||||
|
|
||||||
|
|
|
@ -215,7 +215,7 @@ TEST(IteratorTest, ParamIteratorConformsToForwardIteratorConcept) {
|
||||||
// Verifies that prefix and postfix operator++() advance an iterator
|
// Verifies that prefix and postfix operator++() advance an iterator
|
||||||
// all the same.
|
// all the same.
|
||||||
it2 = it;
|
it2 = it;
|
||||||
it++;
|
++it;
|
||||||
++it2;
|
++it2;
|
||||||
EXPECT_TRUE(*it == *it2);
|
EXPECT_TRUE(*it == *it2);
|
||||||
}
|
}
|
||||||
|
|
|
@ -123,7 +123,7 @@ void SceneDiffer::showReport() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( std::vector<std::string>::iterator it = m_diffs.begin(); it != m_diffs.end(); it++ ) {
|
for ( std::vector<std::string>::iterator it = m_diffs.begin(); it != m_diffs.end(); ++it ) {
|
||||||
std::cout << *it << "\n";
|
std::cout << *it << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -203,7 +203,7 @@ void CGLView::Matrix_NodeToRoot(const aiNode* pNode, aiMatrix4x4& pOutMatrix)
|
||||||
}
|
}
|
||||||
|
|
||||||
// multiply all matrices in reverse order
|
// multiply all matrices in reverse order
|
||||||
for ( std::list<aiMatrix4x4>::reverse_iterator rit = mat_list.rbegin(); rit != mat_list.rend(); rit++)
|
for ( std::list<aiMatrix4x4>::reverse_iterator rit = mat_list.rbegin(); rit != mat_list.rend(); ++rit)
|
||||||
{
|
{
|
||||||
pOutMatrix = pOutMatrix * (*rit);
|
pOutMatrix = pOutMatrix * (*rit);
|
||||||
}
|
}
|
||||||
|
@ -729,7 +729,7 @@ void CGLView::FreeScene() {
|
||||||
GLuint* id_tex = new GLuint[id_tex_size];
|
GLuint* id_tex = new GLuint[id_tex_size];
|
||||||
QMap<QString, GLuint>::iterator it = mTexture_IDMap.begin();
|
QMap<QString, GLuint>::iterator it = mTexture_IDMap.begin();
|
||||||
|
|
||||||
for(int idx = 0; idx < id_tex_size; idx++, it++)
|
for(int idx = 0; idx < id_tex_size; idx++, ++it)
|
||||||
{
|
{
|
||||||
id_tex[idx] = it.value();
|
id_tex[idx] = it.value();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue