Merge branch 'master' into Artenuvielle-x3d_pugi_migration_artenuvielle
This commit is contained in:
@@ -149,7 +149,7 @@ D3MFOpcPackage::D3MFOpcPackage(IOSystem *pIOHandler, const std::string &rFile) :
|
||||
|
||||
IOStream *fileStream = mZipArchive->Open(file.c_str());
|
||||
if (nullptr == fileStream) {
|
||||
ai_assert(fileStream != nullptr);
|
||||
ASSIMP_LOG_ERROR("Filestream is nullptr.");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -159,7 +159,6 @@ bool parseColor(const char *color, aiColor4D &diffuse) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//const char *buf(color);
|
||||
if ('#' != color[0]) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -451,6 +451,7 @@ void HMPImporter::ReadFirstSkin(unsigned int iNumSkins, const unsigned char *szC
|
||||
|
||||
// now we need to skip any other skins ...
|
||||
for (unsigned int i = 1; i < iNumSkins; ++i) {
|
||||
SizeCheck(szCursor + 3 * sizeof(uint32_t));
|
||||
iType = *((uint32_t *)szCursor);
|
||||
szCursor += sizeof(uint32_t);
|
||||
iWidth = *((uint32_t *)szCursor);
|
||||
|
||||
@@ -896,7 +896,7 @@ char *_m3d_safestr(char *in, int morelines) {
|
||||
if (!out) return NULL;
|
||||
while (*i == ' ' || *i == '\t' || *i == '\r' || (morelines && *i == '\n'))
|
||||
i++;
|
||||
for (; *i && (morelines || (*i != '\r' && *i != '\n')); i++) {
|
||||
for (; *i && (morelines || (*i != '\r' && *i != '\n')) && o - out < l; i++) {
|
||||
if (*i == '\r') continue;
|
||||
if (*i == '\n') {
|
||||
if (morelines >= 3 && o > out && *(o - 1) == '\n') break;
|
||||
|
||||
@@ -600,7 +600,7 @@ void MDLImporter::InternReadFile_3DGS_MDL345() {
|
||||
|
||||
// need to read all textures
|
||||
for (unsigned int i = 0; i < (unsigned int)pcHeader->num_skins; ++i) {
|
||||
if (szCurrent >= szEnd) {
|
||||
if (szCurrent + sizeof(uint32_t) > szEnd) {
|
||||
throw DeadlyImportError("Texture data past end of file.");
|
||||
}
|
||||
BE_NCONST MDL::Skin *pcSkin;
|
||||
|
||||
@@ -132,6 +132,9 @@ void MDLImporter::CreateTextureARGB8_3DGS_MDL3(const unsigned char *szData) {
|
||||
pcNew->mWidth = pcHeader->skinwidth;
|
||||
pcNew->mHeight = pcHeader->skinheight;
|
||||
|
||||
if(pcNew->mWidth != 0 && pcNew->mHeight > UINT_MAX/pcNew->mWidth) {
|
||||
throw DeadlyImportError("Invalid MDL file. A texture is too big.");
|
||||
}
|
||||
pcNew->pcData = new aiTexel[pcNew->mWidth * pcNew->mHeight];
|
||||
|
||||
const unsigned char *szColorMap;
|
||||
@@ -217,6 +220,9 @@ void MDLImporter::ParseTextureColorData(const unsigned char *szData,
|
||||
|
||||
// allocate storage for the texture image
|
||||
if (do_read) {
|
||||
if(pcNew->mWidth != 0 && pcNew->mHeight > UINT_MAX/pcNew->mWidth) {
|
||||
throw DeadlyImportError("Invalid MDL file. A texture is too big.");
|
||||
}
|
||||
pcNew->pcData = new aiTexel[pcNew->mWidth * pcNew->mHeight];
|
||||
}
|
||||
|
||||
|
||||
@@ -325,7 +325,7 @@ std::shared_ptr<const EXPRESS::DataType> EXPRESS::DataType::Parse(const char*& i
|
||||
std::transform(s.begin(),s.end(),s.begin(),&ai_tolower<char> );
|
||||
if (schema->IsKnownToken(s)) {
|
||||
for(cur = t+1;*cur++ != '(';);
|
||||
const std::shared_ptr<const EXPRESS::DataType> dt = Parse(cur);
|
||||
std::shared_ptr<const EXPRESS::DataType> dt = Parse(cur);
|
||||
inout = *cur ? cur+1 : cur;
|
||||
return dt;
|
||||
}
|
||||
|
||||
@@ -300,13 +300,14 @@ private:
|
||||
|
||||
const char separator = getOsSeparator();
|
||||
for (it = in.begin(); it != in.end(); ++it) {
|
||||
int remaining = std::distance(in.end(), it);
|
||||
// Exclude :// and \\, which remain untouched.
|
||||
// https://sourceforge.net/tracker/?func=detail&aid=3031725&group_id=226462&atid=1067632
|
||||
if ( !strncmp(&*it, "://", 3 )) {
|
||||
if (remaining >= 3 && !strncmp(&*it, "://", 3 )) {
|
||||
it += 3;
|
||||
continue;
|
||||
}
|
||||
if (it == in.begin() && !strncmp(&*it, "\\\\", 2)) {
|
||||
if (it == in.begin() && remaining >= 2 && !strncmp(&*it, "\\\\", 2)) {
|
||||
it += 2;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -64,20 +64,28 @@ void CommentRemover::RemoveLineComments(const char* szComment,
|
||||
if (len > lenBuffer) {
|
||||
len = lenBuffer;
|
||||
}
|
||||
while (*szBuffer) {
|
||||
|
||||
char *szCurrent = szBuffer;
|
||||
while (*szCurrent) {
|
||||
|
||||
// skip over quotes
|
||||
if (*szBuffer == '\"' || *szBuffer == '\'')
|
||||
while (*szBuffer++ && *szBuffer != '\"' && *szBuffer != '\'');
|
||||
if (!strncmp(szBuffer,szComment,len)) {
|
||||
while (!IsLineEnd(*szBuffer))
|
||||
*szBuffer++ = chReplacement;
|
||||
if (*szCurrent == '\"' || *szCurrent == '\'')
|
||||
while (*szCurrent++ && *szCurrent != '\"' && *szCurrent != '\'');
|
||||
|
||||
if (!*szBuffer) {
|
||||
size_t lenRemaining = lenBuffer - (szCurrent - szBuffer);
|
||||
if(lenRemaining < len) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (!strncmp(szCurrent,szComment,len)) {
|
||||
while (!IsLineEnd(*szCurrent))
|
||||
*szCurrent++ = chReplacement;
|
||||
|
||||
if (!*szCurrent) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
++szBuffer;
|
||||
++szCurrent;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -58,14 +58,16 @@ const aiVector3D PlaneInit(0.8523f, 0.34321f, 0.5736f);
|
||||
// define the reference plane. We choose some arbitrary vector away from all basic axes
|
||||
// in the hope that no model spreads all its vertices along this plane.
|
||||
SpatialSort::SpatialSort(const aiVector3D *pPositions, unsigned int pNumPositions, unsigned int pElementOffset) :
|
||||
mPlaneNormal(PlaneInit) {
|
||||
mPlaneNormal(PlaneInit),
|
||||
mFinalized(false) {
|
||||
mPlaneNormal.Normalize();
|
||||
Fill(pPositions, pNumPositions, pElementOffset);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
SpatialSort::SpatialSort() :
|
||||
mPlaneNormal(PlaneInit) {
|
||||
mPlaneNormal(PlaneInit),
|
||||
mFinalized(false) {
|
||||
mPlaneNormal.Normalize();
|
||||
}
|
||||
|
||||
@@ -80,28 +82,41 @@ void SpatialSort::Fill(const aiVector3D *pPositions, unsigned int pNumPositions,
|
||||
unsigned int pElementOffset,
|
||||
bool pFinalize /*= true */) {
|
||||
mPositions.clear();
|
||||
mFinalized = false;
|
||||
Append(pPositions, pNumPositions, pElementOffset, pFinalize);
|
||||
mFinalized = pFinalize;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
ai_real SpatialSort::CalculateDistance(const aiVector3D &pPosition) const {
|
||||
return (pPosition - mCentroid) * mPlaneNormal;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
void SpatialSort::Finalize() {
|
||||
const ai_real scale = 1.0f / mPositions.size();
|
||||
for (unsigned int i = 0; i < mPositions.size(); i++) {
|
||||
mCentroid += scale * mPositions[i].mPosition;
|
||||
}
|
||||
for (unsigned int i = 0; i < mPositions.size(); i++) {
|
||||
mPositions[i].mDistance = CalculateDistance(mPositions[i].mPosition);
|
||||
}
|
||||
std::sort(mPositions.begin(), mPositions.end());
|
||||
mFinalized = true;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
void SpatialSort::Append(const aiVector3D *pPositions, unsigned int pNumPositions,
|
||||
unsigned int pElementOffset,
|
||||
bool pFinalize /*= true */) {
|
||||
ai_assert(!mFinalized && "You cannot add positions to the SpatialSort object after it has been finalized.");
|
||||
// store references to all given positions along with their distance to the reference plane
|
||||
const size_t initial = mPositions.size();
|
||||
mPositions.reserve(initial + (pFinalize ? pNumPositions : pNumPositions * 2));
|
||||
mPositions.reserve(initial + pNumPositions);
|
||||
for (unsigned int a = 0; a < pNumPositions; a++) {
|
||||
const char *tempPointer = reinterpret_cast<const char *>(pPositions);
|
||||
const aiVector3D *vec = reinterpret_cast<const aiVector3D *>(tempPointer + a * pElementOffset);
|
||||
|
||||
// store position by index and distance
|
||||
ai_real distance = *vec * mPlaneNormal;
|
||||
mPositions.push_back(Entry(static_cast<unsigned int>(a + initial), *vec, distance));
|
||||
mPositions.push_back(Entry(static_cast<unsigned int>(a + initial), *vec));
|
||||
}
|
||||
|
||||
if (pFinalize) {
|
||||
@@ -114,7 +129,8 @@ void SpatialSort::Append(const aiVector3D *pPositions, unsigned int pNumPosition
|
||||
// Returns an iterator for all positions close to the given position.
|
||||
void SpatialSort::FindPositions(const aiVector3D &pPosition,
|
||||
ai_real pRadius, std::vector<unsigned int> &poResults) const {
|
||||
const ai_real dist = pPosition * mPlaneNormal;
|
||||
ai_assert(mFinalized && "The SpatialSort object must be finalized before FindPositions can be called.");
|
||||
const ai_real dist = CalculateDistance(pPosition);
|
||||
const ai_real minDist = dist - pRadius, maxDist = dist + pRadius;
|
||||
|
||||
// clear the array
|
||||
@@ -229,6 +245,7 @@ BinFloat ToBinary(const ai_real &pValue) {
|
||||
// Fills an array with indices of all positions identical to the given position. In opposite to
|
||||
// FindPositions(), not an epsilon is used but a (very low) tolerance of four floating-point units.
|
||||
void SpatialSort::FindIdenticalPositions(const aiVector3D &pPosition, std::vector<unsigned int> &poResults) const {
|
||||
ai_assert(mFinalized && "The SpatialSort object must be finalized before FindIdenticalPositions can be called.");
|
||||
// Epsilons have a huge disadvantage: they are of constant precision, while floating-point
|
||||
// values are of log2 precision. If you apply e=0.01 to 100, the epsilon is rather small, but
|
||||
// if you apply it to 0.001, it is enormous.
|
||||
@@ -254,7 +271,7 @@ void SpatialSort::FindIdenticalPositions(const aiVector3D &pPosition, std::vecto
|
||||
|
||||
// Convert the plane distance to its signed integer representation so the ULPs tolerance can be
|
||||
// applied. For some reason, VC won't optimize two calls of the bit pattern conversion.
|
||||
const BinFloat minDistBinary = ToBinary(pPosition * mPlaneNormal) - distanceToleranceInULPs;
|
||||
const BinFloat minDistBinary = ToBinary(CalculateDistance(pPosition)) - distanceToleranceInULPs;
|
||||
const BinFloat maxDistBinary = minDistBinary + 2 * distanceToleranceInULPs;
|
||||
|
||||
// clear the array in this strange fashion because a simple clear() would also deallocate
|
||||
@@ -297,13 +314,14 @@ void SpatialSort::FindIdenticalPositions(const aiVector3D &pPosition, std::vecto
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
unsigned int SpatialSort::GenerateMappingTable(std::vector<unsigned int> &fill, ai_real pRadius) const {
|
||||
ai_assert(mFinalized && "The SpatialSort object must be finalized before GenerateMappingTable can be called.");
|
||||
fill.resize(mPositions.size(), UINT_MAX);
|
||||
ai_real dist, maxDist;
|
||||
|
||||
unsigned int t = 0;
|
||||
const ai_real pSquared = pRadius * pRadius;
|
||||
for (size_t i = 0; i < mPositions.size();) {
|
||||
dist = mPositions[i].mPosition * mPlaneNormal;
|
||||
dist = (mPositions[i].mPosition - mCentroid) * mPlaneNormal;
|
||||
maxDist = dist + pRadius;
|
||||
|
||||
fill[mPositions[i].mIndex] = t;
|
||||
|
||||
Reference in New Issue
Block a user