Merge branch 'master' of github.com:assimp/assimp
commit
c7785014e4
|
@ -51,3 +51,6 @@ test/gtest/src/gtest-stamp/Debug/gtest-build
|
||||||
*.lib
|
*.lib
|
||||||
test/gtest/src/gtest-stamp/Debug/
|
test/gtest/src/gtest-stamp/Debug/
|
||||||
tools/assimp_view/assimp_viewer.vcxproj.user
|
tools/assimp_view/assimp_viewer.vcxproj.user
|
||||||
|
|
||||||
|
# Unix editor backups
|
||||||
|
*~
|
||||||
|
|
|
@ -175,6 +175,10 @@ void Discreet3DSImporter::InternReadFile( const std::string& pFile,
|
||||||
// file.
|
// file.
|
||||||
for (std::vector<D3DS::Mesh>::iterator i = mScene->mMeshes.begin(),
|
for (std::vector<D3DS::Mesh>::iterator i = mScene->mMeshes.begin(),
|
||||||
end = mScene->mMeshes.end(); i != end;++i) {
|
end = mScene->mMeshes.end(); i != end;++i) {
|
||||||
|
if ((*i).mFaces.size() > 0 && (*i).mPositions.size() == 0) {
|
||||||
|
delete mScene;
|
||||||
|
throw DeadlyImportError("3DS file contains faces but no vertices: " + pFile);
|
||||||
|
}
|
||||||
CheckIndices(*i);
|
CheckIndices(*i);
|
||||||
MakeUnique (*i);
|
MakeUnique (*i);
|
||||||
ComputeNormalsWithSmoothingsGroups<D3DS::Face>(*i);
|
ComputeNormalsWithSmoothingsGroups<D3DS::Face>(*i);
|
||||||
|
@ -944,6 +948,9 @@ void Discreet3DSImporter::ParseFaceChunk()
|
||||||
// This is the list of smoothing groups - a bitfield for every face.
|
// This is the list of smoothing groups - a bitfield for every face.
|
||||||
// Up to 32 smoothing groups assigned to a single face.
|
// Up to 32 smoothing groups assigned to a single face.
|
||||||
unsigned int num = chunkSize/4, m = 0;
|
unsigned int num = chunkSize/4, m = 0;
|
||||||
|
if (num > mMesh.mFaces.size()) {
|
||||||
|
throw DeadlyImportError("3DS: More smoothing groups than faces");
|
||||||
|
}
|
||||||
for (std::vector<D3DS::Face>::iterator i = mMesh.mFaces.begin(); m != num;++i, ++m) {
|
for (std::vector<D3DS::Face>::iterator i = mMesh.mFaces.begin(); m != num;++i, ++m) {
|
||||||
// nth bit is set for nth smoothing group
|
// nth bit is set for nth smoothing group
|
||||||
(*i).iSmoothGroup = stream->GetI4();
|
(*i).iSmoothGroup = stream->GetI4();
|
||||||
|
|
|
@ -139,7 +139,15 @@ void LWOImporter::CountVertsAndFacesLWOB(unsigned int& verts, unsigned int& face
|
||||||
while (cursor < end && max--)
|
while (cursor < end && max--)
|
||||||
{
|
{
|
||||||
uint16_t numIndices;
|
uint16_t numIndices;
|
||||||
|
// must have 2 shorts left for numIndices and surface
|
||||||
|
if (end - cursor < 2) {
|
||||||
|
throw DeadlyImportError("LWOB: Unexpected end of file");
|
||||||
|
}
|
||||||
::memcpy(&numIndices, cursor++, 2);
|
::memcpy(&numIndices, cursor++, 2);
|
||||||
|
// must have enough left for indices and surface
|
||||||
|
if (end - cursor < (1 + numIndices)) {
|
||||||
|
throw DeadlyImportError("LWOB: Unexpected end of file");
|
||||||
|
}
|
||||||
verts += numIndices;
|
verts += numIndices;
|
||||||
faces++;
|
faces++;
|
||||||
cursor += numIndices;
|
cursor += numIndices;
|
||||||
|
|
|
@ -730,6 +730,11 @@ void LWOImporter::LoadLWOPoints(unsigned int length)
|
||||||
// --- this function is used for both LWO2 and LWOB but for
|
// --- this function is used for both LWO2 and LWOB but for
|
||||||
// LWO2 we need to allocate 25% more storage - it could be we'll
|
// LWO2 we need to allocate 25% more storage - it could be we'll
|
||||||
// need to duplicate some points later.
|
// need to duplicate some points later.
|
||||||
|
const size_t vertexLen = 12;
|
||||||
|
if ((length % vertexLen) != 0)
|
||||||
|
{
|
||||||
|
throw DeadlyImportError( "LWO2: Points chunk length is not multiple of vertexLen (12)");
|
||||||
|
}
|
||||||
register unsigned int regularSize = (unsigned int)mCurLayer->mTempPoints.size() + length / 12;
|
register unsigned int regularSize = (unsigned int)mCurLayer->mTempPoints.size() + length / 12;
|
||||||
if (mIsLWO2)
|
if (mIsLWO2)
|
||||||
{
|
{
|
||||||
|
|
|
@ -127,6 +127,13 @@ void OFFImporter::InternReadFile( const std::string& pFile,
|
||||||
const unsigned int numVertices = strtoul10(sz,&sz);SkipSpaces(&sz);
|
const unsigned int numVertices = strtoul10(sz,&sz);SkipSpaces(&sz);
|
||||||
const unsigned int numFaces = strtoul10(sz,&sz);
|
const unsigned int numFaces = strtoul10(sz,&sz);
|
||||||
|
|
||||||
|
if (!numVertices) {
|
||||||
|
throw DeadlyImportError("OFF: There are no valid vertices");
|
||||||
|
}
|
||||||
|
if (!numFaces) {
|
||||||
|
throw DeadlyImportError("OFF: There are no valid faces");
|
||||||
|
}
|
||||||
|
|
||||||
pScene->mMeshes = new aiMesh*[ pScene->mNumMeshes = 1 ];
|
pScene->mMeshes = new aiMesh*[ pScene->mNumMeshes = 1 ];
|
||||||
aiMesh* mesh = pScene->mMeshes[0] = new aiMesh();
|
aiMesh* mesh = pScene->mMeshes[0] = new aiMesh();
|
||||||
aiFace* faces = mesh->mFaces = new aiFace [mesh->mNumFaces = numFaces];
|
aiFace* faces = mesh->mFaces = new aiFace [mesh->mNumFaces = numFaces];
|
||||||
|
|
|
@ -156,7 +156,6 @@ void PLYImporter::InternReadFile( const std::string& pFile,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
delete[] this->mBuffer;
|
|
||||||
AI_DEBUG_INVALIDATE_PTR(this->mBuffer);
|
AI_DEBUG_INVALIDATE_PTR(this->mBuffer);
|
||||||
throw DeadlyImportError( "Invalid .ply file: Missing format specification");
|
throw DeadlyImportError( "Invalid .ply file: Missing format specification");
|
||||||
}
|
}
|
||||||
|
|
|
@ -229,6 +229,9 @@ void STLImporter::LoadASCIIFile()
|
||||||
size_t temp;
|
size_t temp;
|
||||||
// setup the name of the node
|
// setup the name of the node
|
||||||
if ((temp = (size_t)(sz-szMe))) {
|
if ((temp = (size_t)(sz-szMe))) {
|
||||||
|
if (temp >= MAXLEN) {
|
||||||
|
throw DeadlyImportError( "STL: Node name too long" );
|
||||||
|
}
|
||||||
|
|
||||||
pScene->mRootNode->mName.length = temp;
|
pScene->mRootNode->mName.length = temp;
|
||||||
memcpy(pScene->mRootNode->mName.data,szMe,temp);
|
memcpy(pScene->mRootNode->mName.data,szMe,temp);
|
||||||
|
|
|
@ -214,6 +214,10 @@ XFileParser::XFileParser( const std::vector<char>& pBuffer)
|
||||||
AI_SWAP2(ofs);
|
AI_SWAP2(ofs);
|
||||||
P += 4;
|
P += 4;
|
||||||
|
|
||||||
|
if (P + ofs > End + 2) {
|
||||||
|
throw DeadlyImportError("X: Unexpected EOF in compressed chunk");
|
||||||
|
}
|
||||||
|
|
||||||
// push data to the stream
|
// push data to the stream
|
||||||
stream.next_in = (Bytef*)P;
|
stream.next_in = (Bytef*)P;
|
||||||
stream.avail_in = ofs;
|
stream.avail_in = ofs;
|
||||||
|
|
Loading…
Reference in New Issue