diff -up irrlicht18-svn3629/examples/22.MaterialViewer/main.cpp.fastatof irrlicht18-svn3629/examples/22.MaterialViewer/main.cpp
--- irrlicht18-svn3629/examples/22.MaterialViewer/main.cpp.fastatof 2010-02-02 14:53:57.341250000 -0600
+++ irrlicht18-svn3629/examples/22.MaterialViewer/main.cpp 2012-08-23 14:00:46.917580700 -0500
@@ -230,7 +230,7 @@ protected:
u32 alpha=col.getAlpha();
if ( EditAlpha )
{
- alpha = (u32)core::strtol10( core::stringc( EditAlpha->getText() ).c_str(), 0);
+ alpha = (u32)core::strtoul10( core::stringc( EditAlpha->getText() ).c_str(), 0);
if ( alpha > 255 )
alpha = 255;
}
@@ -239,7 +239,7 @@ protected:
u32 red=col.getRed();
if ( EditRed )
{
- red = (u32)core::strtol10( core::stringc( EditRed->getText() ).c_str(), 0);
+ red = (u32)core::strtoul10( core::stringc( EditRed->getText() ).c_str(), 0);
if ( red > 255 )
red = 255;
}
@@ -248,7 +248,7 @@ protected:
u32 green=col.getGreen();
if ( EditGreen )
{
- green = (u32)core::strtol10( core::stringc( EditGreen->getText() ).c_str(), 0);
+ green = (u32)core::strtoul10( core::stringc( EditGreen->getText() ).c_str(), 0);
if ( green > 255 )
green = 255;
}
@@ -257,7 +257,7 @@ protected:
u32 blue=col.getBlue();
if ( EditBlue )
{
- blue = (u32)core::strtol10( core::stringc( EditBlue->getText() ).c_str(), 0);
+ blue = (u32)core::strtoul10( core::stringc( EditBlue->getText() ).c_str(), 0);
if ( blue > 255 )
blue = 255;
}
diff -up irrlicht18-svn3629/include/fast_atof.h.fastatof irrlicht18-svn3629/include/fast_atof.h
--- irrlicht18-svn3629/include/fast_atof.h.fastatof 2011-01-14 07:24:40.897355000 -0600
+++ irrlicht18-svn3629/include/fast_atof.h 2012-08-23 14:00:46.918580700 -0500
@@ -12,8 +12,8 @@ namespace irr
namespace core
{
-// we write [17] here instead of [] to work around a swig bug
-const float fast_atof_table[17] = {
+// we write [16] here instead of [] to work around a swig bug
+const float fast_atof_table[16] = {
0.f,
0.1f,
0.01f,
@@ -30,9 +30,32 @@ const float fast_atof_table[17] = {
0.0000000000001f,
0.00000000000001f,
0.000000000000001f,
- 0.0000000000000001f
};
+//! Convert a simple string of base 10 digits into an unsigned 32 bit integer.
+//! \param[in] in: The string of digits to convert. Only a leading - or + followed
+//! by digits 0 to 9 will be considered. Parsing stops at the
+//! first non-digit.
+//! \param[out] out: (optional) If provided, it will be set to point at the first
+//! character not used in the calculation.
+//! \return The unsigned integer value of the digits.
+inline u32 strtoul10(const char* in, const char** out=0)
+{
+ unsigned int value = 0;
+
+ bool running = true;
+ while ( running )
+ {
+ if ( *in < '0' || *in > '9' )
+ break;
+
+ value = ( value * 10 ) + ( *in - '0' );
+ ++in;
+ }
+ if (out)*out = in;
+ return value;
+}
+
//! Convert a simple string of base 10 digits into a signed 32 bit integer.
//! \param[in] in: The string of digits to convert. Only a leading - or + followed
//! by digits 0 to 9 will be considered. Parsing stops at the
@@ -43,38 +66,104 @@ const float fast_atof_table[17] = {
//! digits to encode in an s32 then +INT_MAX or -INT_MAX will be returned.
inline s32 strtol10(const char* in, const char** out=0)
{
- if(!in)
- return 0;
-
- bool negative = false;
- if('-' == *in)
- {
- negative = true;
+ bool inv = (*in=='-');
+ if (inv || *in=='+')
++in;
+
+ int value = strtoul10(in,out);
+ if (inv) {
+ value = -value;
}
- else if('+' == *in)
- ++in;
+ return value;
+}
- u32 unsignedValue = 0;
+//! Convert a simple string of base 8 (octal) digits into an unsigned 32 bit integer.
+//! \param[in] in: The string of digits to convert. Only digits 0 to 7 will be considered.
+//! Parsing stops at the first non-digit.
+//! \param[out] out: (optional) If provided, it will be set to point at the first
+//! character not used in the calculation.
+//! \return The unsigned integer value of the digits.
+inline u32 strtoul8(const char* in, const char** out=0)
+{
+ unsigned int value = 0;
- while ( ( *in >= '0') && ( *in <= '9' ))
+ bool running = true;
+ while ( running )
{
- unsignedValue = ( unsignedValue * 10 ) + ( *in - '0' );
+ if ( *in < '0' || *in > '7' )
+ break;
+
+ value = ( value << 3 ) + ( *in - '0' );
++in;
+ }
+ if (out)*out = in;
+ return value;
+}
- if(unsignedValue > (u32)INT_MAX)
+//! Convert a simple string of base 16 (hex) digits into an unsigned 32 bit integer.
+//! \param[in] in: The string of digits to convert. Only digits 0 to 9, A to F will be considered.
+//! Parsing stops at the first non-digit. Letters can be in either case.
+//! \param[out] out: (optional) If provided, it will be set to point at the first
+//! character not used in the calculation.
+//! \return The unsigned integer value of the digits.
+inline u32 strtoul16( const char* in, const char** out=0)
+{
+ unsigned int value = 0;
+
+ bool running = true;
+ while ( running )
+ {
+ if ( *in >= '0' && *in <= '9' )
{
- unsignedValue = (u32)INT_MAX;
- break;
+ value = ( value << 4u ) + ( *in - '0' );
}
+ else if (*in >= 'A' && *in <= 'F')
+ {
+ value = ( value << 4u ) + ( *in - 'A' ) + 10;
+ }
+ else if (*in >= 'a' && *in <= 'f')
+ {
+ value = ( value << 4u ) + ( *in - 'a' ) + 10;
+ }
+ else break;
+ ++in;
}
if (out)
*out = in;
+ return value;
+}
- if(negative)
- return -((s32)unsignedValue);
- else
- return (s32)unsignedValue;
+//! Convert a hex-encoded digi (1 character) to an 8 bit unsigned integer.
+//! \param[in] in: The string of digits to convert. Only digits 0 to 9, A to F will be considered.
+//! Parsing stops at the first non-digit. Letters can be in either case.
+//! \param[out] out: (optional) If provided, it will be set to point at the first
+//! character not used in the calculation.
+//! \return The unsigned integer value of the digits. 0xffffffff if the input is not hex
+inline u32 HexDigitToDecimal(char in)
+{
+ unsigned int out = 0xffffffff;
+ if (in >= '0' && in <= '9')
+ out = in - '0';
+
+ else if (in >= 'a' && in <= 'f')
+ out = 10u + in - 'a';
+
+ else if (in >= 'A' && in <= 'F')
+ out = 10u + in - 'A';
+
+ // return value is 0xffffffff if the input is not a hex digit
+ return out;
+}
+
+//! Convert a hex-encoded octet (2 characters) to an 8 bit unsigned integer.
+//! \param[in] in: The string of digits to convert. Only digits 0 to 9, A to F will be considered.
+//! Parsing stops at the first non-digit. Letters can be in either case.
+//! \param[out] out: (optional) If provided, it will be set to point at the first
+//! character not used in the calculation.
+//! \return The unsigned integer value of the digits. 0xffffffff if the input is not hex
+inline u8 HexOctetToDecimal(const char* in)
+{
+ return ((u8)HexDigitToDecimal(in[0])<<4)+(u8)HexDigitToDecimal(in[1]);
}
//! Converts a sequence of digits into a whole positive floating point value.
@@ -126,6 +215,56 @@ inline f32 strtof10(const char* in, cons
return floatValue;
}
+//! Convert a simple string of base 10 digits into an unsigned 64 bit integer.
+//! \param[in] in: The string of digits to convert. Only a leading - or + followed
+//! by digits 0 to 9 will be considered. Parsing stops at the
+//! first non-digit.
+//! \param[out] out: (optional) If provided, it will be set to point at the first
+//! character not used in the calculation.
+//! \return The unsigned 64 bit integer value of the digits.
+inline u64 strtoul10_64( const char* in, const char** out=0, unsigned int* max_inout=0)
+{
+ unsigned int cur = 0;
+ u64 value = 0;
+
+ bool running = true;
+ while ( running )
+ {
+ if ( *in < '0' || *in > '9' )
+ break;
+
+ const u64 new_value = ( value * 10 ) + ( *in - '0' );
+
+ if (new_value < value) /* numeric overflow, we rely on you */
+ return value;
+
+ value = new_value;
+
+ ++in;
+ ++cur;
+
+ if (max_inout && *max_inout == cur) {
+
+ if (out) { /* skip to end */
+ while (*in >= '0' && *in <= '9')
+ ++in;
+ *out = in;
+ }
+
+ return value;
+ }
+ }
+ if (out)
+ *out = in;
+
+ if (max_inout)
+ *max_inout = cur;
+
+ return value;
+}
+// Number of relevant decimals for floating-point parsing.
+#define AI_FAST_ATOF_RELAVANT_DECIMALS 10
+
//! Provides a fast function for converting a string into a float.
//! This is not guaranteed to be as accurate as atof(), but is
//! approximately 6 to 8 times as fast.
@@ -138,46 +277,51 @@ inline const char* fast_atof_move( const
// Please run this regression test when making any modifications to this function:
// https://sourceforge.net/tracker/download.php?group_id=74339&atid=540676&file_id=298968&aid=1865300
- out = 0.f;
- if(!in)
- return 0;
+ float f;
- bool negative = false;
- if(*in == '-')
- {
- negative = true;
+ bool inv = (*in=='-');
+ if (inv || *in=='+')
++in;
- }
-
- f32 value = strtof10 ( in, &in );
- if (*in == '.')
+ f = (float) strtoul10_64 ( in, &in);
+ if (*in == '.' || (in[0] == ',' && (in[1] >= '0' || in[1] <= '9'))) // allow for commas, too
{
++in;
- const char * afterDecimal = in;
- f32 decimal = strtof10 ( in, &afterDecimal );
- decimal *= fast_atof_table[afterDecimal - in];
-
- value += decimal;
+ // NOTE: The original implementation is highly unaccurate here. The precision of a single
+ // IEEE 754 float is not high enough, everything behind the 6th digit tends to be more
+ // inaccurate than it would need to be. Casting to double seems to solve the problem.
+ // strtol_64 is used to prevent integer overflow.
+
+ // Another fix: this tends to become 0 for long numbers if we don't limit the maximum
+ // number of digits to be read. AI_FAST_ATOF_RELAVANT_DECIMALS can be a value between
+ // 1 and 15.
+ unsigned int diff = AI_FAST_ATOF_RELAVANT_DECIMALS;
+ double pl = (double) strtoul10_64 ( in, &in, &diff );
- in = afterDecimal;
+ pl *= fast_atof_table[diff];
+ f += (float)pl;
}
- if ('e' == *in || 'E' == *in)
+ // A major 'E' must be allowed. Necessary for proper reading of some DXF files.
+ // Thanks to Zhao Lei to point out that this if() must be outside the if (*c == '.' ..)
+ if (*in == 'e' || *in == 'E')
{
++in;
- // Assume that the exponent is a whole number.
- // strtol10() will deal with both + and - signs,
- // but cast to (f32) to prevent overflow at FLT_MAX
- value *= (f32)pow(10.0f, (f32)strtol10(in, &in));
- }
-
- if(negative)
- out = -value;
- else
- out = value;
+ bool einv = (*in=='-');
+ if (einv || *in=='+')
+ ++in;
+
+ float exp = (float)strtoul10_64(in, &in);
+ if (einv)
+ exp *= -1.0f;
+ f *= pow(10.0f, exp);
+ }
+ if (inv)
+ f *= -1.0f;
+
+ out = f;
return in;
}
@@ -190,6 +334,47 @@ inline float fast_atof(const char* float
return ret;
}
+//! Convert a string to a floating point number
+//! \param c: The string to convert.
+//! \param cout: A pointer to the first character in the string that wasn't
+//! use to create the float value.
+inline float fast_atof( const char* c, const char** cout)
+{
+ float ret;
+ *cout = fast_atof_move(c, ret);
+
+ return ret;
+}
+
+//! Convert a string to a floating point number
+//! \param inout: The string to convert, returned
+//! as the pointer to the first character
+//! in the string that wasn't
+//! use to create the float value.
+inline float fast_atof( const char** inout)
+{
+ float ret;
+ *inout = fast_atof_move(*inout, ret);
+
+ return ret;
+}
+
+//! Parse a C++-like integer literal - hex and oct prefixes - to an unsigned int
+//! 0xNNNN - hex
+//! 0NNN - oct
+//! NNN - dec
+//! \param[in] in: The string to convert.
+//! \param cout: A pointer to the first character in the string that wasn't
+//! use to create the float value.
+inline u32 strtoul_cppstyle( const char* in, const char** out=0)
+{
+ if ('0' == in[0])
+ {
+ return 'x' == in[1] ? strtoul16(in+2,out) : strtoul8(in+1,out);
+ }
+ return strtoul10(in, out);
+}
+
} // end namespace core
} // end namespace irr
diff -up irrlicht18-svn3629/include/irrTypes.h.fastatof irrlicht18-svn3629/include/irrTypes.h
--- irrlicht18-svn3629/include/irrTypes.h.fastatof 2011-01-14 07:24:40.897355000 -0600
+++ irrlicht18-svn3629/include/irrTypes.h 2012-08-23 14:00:46.919580700 -0500
@@ -6,10 +6,25 @@
#define __IRR_TYPES_H_INCLUDED__
#include "IrrCompileConfig.h"
+#include <limits.h>
namespace irr
{
+#ifdef _LONGLONG
+#define NATIVE64
+#elif !((4294967290UL+7UL) == ((4294967290UL+7UL)&ULONG_MAX))
+#undef NATIVE64
+#elif !(((1UL << 31) * 2UL) != 0UL)
+#undef NATIVE64
+#elif !((((1UL << 31) * 2UL)&ULONG_MAX) != 0UL)
+#undef NATIVE64
+#elif !(ULONG_MAX > 4294967295UL)
+#undef NATIVE64
+#else
+#define NATIVE64
+#endif
+
//! 8 bit unsigned variable.
/** This is a typedef for unsigned char, it ensures portability of the engine. */
#ifdef _MSC_VER
@@ -36,16 +51,20 @@ typedef char c8;
/** This is a typedef for unsigned short, it ensures portability of the engine. */
#ifdef _MSC_VER
typedef unsigned __int16 u16;
-#else
+#elif UINT_MAX >= 4294967295UL
typedef unsigned short u16;
+#else
+typedef unsigned int u16;
#endif
//! 16 bit signed variable.
/** This is a typedef for signed short, it ensures portability of the engine. */
#ifdef _MSC_VER
typedef __int16 s16;
-#else
+#elif UINT_MAX >= 4294967295UL
typedef signed short s16;
+#else
+typedef signed int s16;
#endif
@@ -54,27 +73,42 @@ typedef signed short s16;
/** This is a typedef for unsigned int, it ensures portability of the engine. */
#ifdef _MSC_VER
typedef unsigned __int32 u32;
-#else
+#elif UINT_MAX >= 4294967295UL
typedef unsigned int u32;
+#else
+typedef unsigned long u32;
#endif
//! 32 bit signed variable.
/** This is a typedef for signed int, it ensures portability of the engine. */
#ifdef _MSC_VER
typedef __int32 s32;
-#else
+#elif UINT_MAX >= 4294967295UL
typedef signed int s32;
+#else
+typedef signed long s32;
#endif
+//! 64 bit unsigned variable.
+/** This is a typedef for unsigned long, it ensures portability of the engine */
+#ifdef _MSC_VER
+typedef unsigned __int64 u64;
+#elif defined( NATIVE64 )
+typedef unsigned long u64;
+#else /** Not NATIVE64 or Windows */
+typedef unsigned long long u64;
+#endif
-// 64 bit signed variable.
-// This is a typedef for __int64, it ensures portability of the engine.
-// This type is currently not used by the engine and not supported by compilers
-// other than Microsoft Compilers, so it is outcommented.
-//typedef __int64 s64;
-
-
+//! 64 bit signed variable.
+/** This is a typedef for signed long, it ensures portability of the engine. */
+#ifdef _MSC_VER
+typedef __int64 s64;
+#elif defined ( NATIVE64 )
+typedef signed long s64;
+#else /** Not NATIVE64 or Windows */
+typedef signed long long s64;
+#endif
//! 32 bit floating point variable.
/** This is a typedef for float, it ensures portability of the engine. */
diff -up irrlicht18-svn3629/source/Irrlicht/CImageLoaderPPM.cpp.fastatof irrlicht18-svn3629/source/Irrlicht/CImageLoaderPPM.cpp
--- irrlicht18-svn3629/source/Irrlicht/CImageLoaderPPM.cpp.fastatof 2011-01-14 07:24:40.897355000 -0600
+++ irrlicht18-svn3629/source/Irrlicht/CImageLoaderPPM.cpp 2012-08-23 14:00:46.919580700 -0500
@@ -64,10 +64,10 @@ IImage* CImageLoaderPPM::loadImage(io::I
core::stringc token;
getNextToken(file, token);
- const u32 width = core::strtol10(token.c_str());
+ const u32 width = core::strtoul10(token.c_str());
getNextToken(file, token);
- const u32 height = core::strtol10(token.c_str());
+ const u32 height = core::strtoul10(token.c_str());
u8* data = 0;
const u32 size = width*height;
@@ -106,7 +106,7 @@ IImage* CImageLoaderPPM::loadImage(io::I
else
{
getNextToken(file, token);
- const u32 maxDepth = core::strtol10(token.c_str());
+ const u32 maxDepth = core::strtoul10(token.c_str());
if (maxDepth > 255) // no double bytes yet
return 0;
@@ -144,7 +144,7 @@ IImage* CImageLoaderPPM::loadImage(io::I
for (u32 i=0; i<size; ++i)
{
getNextToken(file, token);
- const u8 num = (u8)core::strtol10(token.c_str());
+ const u8 num = (u8)core::strtoul10(token.c_str());
*ptr++ = num;
*ptr++ = num;
*ptr++ = num;
@@ -186,11 +186,11 @@ IImage* CImageLoaderPPM::loadImage(io::I
for (u32 i=0; i<size; ++i)
{
getNextToken(file, token);
- *ptr++ = (u8)core::strtol10(token.c_str());
+ *ptr++ = (u8)core::strtoul10(token.c_str());
getNextToken(file, token);
- *ptr++ = (u8)core::strtol10(token.c_str());
+ *ptr++ = (u8)core::strtoul10(token.c_str());
getNextToken(file, token);
- *ptr++ = (u8)core::strtol10(token.c_str());
+ *ptr++ = (u8)core::strtoul10(token.c_str());
*ptr++ = 255;
}
}
diff -up irrlicht18-svn3629/source/Irrlicht/COBJMeshFileLoader.cpp.fastatof irrlicht18-svn3629/source/Irrlicht/COBJMeshFileLoader.cpp
--- irrlicht18-svn3629/source/Irrlicht/COBJMeshFileLoader.cpp.fastatof 2011-03-08 17:24:22.253030000 -0600
+++ irrlicht18-svn3629/source/Irrlicht/COBJMeshFileLoader.cpp 2012-08-23 14:00:46.920580700 -0500
@@ -166,7 +166,7 @@ IAnimatedMesh* COBJMeshFileLoader::creat
if (core::stringc("off")==smooth)
smoothingGroup=0;
else
- smoothingGroup=core::strtol10(smooth, 0);
+ smoothingGroup=core::strtoul10(smooth, 0);
}
break;
@@ -864,7 +864,7 @@ bool COBJMeshFileLoader::retrieveVertexI
// if no number was found index will become 0 and later on -1 by decrement
if (word[0]=='-')
{
- idx[idxType] = core::strtol10(word+1,0);
+ idx[idxType] = core::strtoul10(word+1,0);
idx[idxType] *= -1;
switch (idxType)
{
@@ -880,7 +880,7 @@ bool COBJMeshFileLoader::retrieveVertexI
}
}
else
- idx[idxType] = core::strtol10(word,0)-1;
+ idx[idxType] = core::strtoul10(word,0)-1;
// reset the word
word[0] = '\0';
diff -up irrlicht18-svn3629/source/Irrlicht/COgreMeshFileLoader.cpp.fastatof irrlicht18-svn3629/source/Irrlicht/COgreMeshFileLoader.cpp
--- irrlicht18-svn3629/source/Irrlicht/COgreMeshFileLoader.cpp.fastatof 2011-01-14 07:24:40.897355000 -0600
+++ irrlicht18-svn3629/source/Irrlicht/COgreMeshFileLoader.cpp 2012-08-23 14:00:46.921580700 -0500
@@ -1135,7 +1135,7 @@ void COgreMeshFileLoader::readPass(io::I
else if (token=="max_anisotropy")
{
getMaterialToken(file, token);
- pass.Material.TextureLayer[textureUnit].AnisotropicFilter=(u8)core::strtol10(token.c_str());
+ pass.Material.TextureLayer[textureUnit].AnisotropicFilter=(u8)core::strtoul10(token.c_str());
}
else if (token=="texture_alias")
{
diff -up irrlicht18-svn3629/source/Irrlicht/CXMeshFileLoader.cpp.fastatof irrlicht18-svn3629/source/Irrlicht/CXMeshFileLoader.cpp
--- irrlicht18-svn3629/source/Irrlicht/CXMeshFileLoader.cpp.fastatof 2011-01-14 07:24:40.897355000 -0600
+++ irrlicht18-svn3629/source/Irrlicht/CXMeshFileLoader.cpp 2012-08-23 14:00:46.923580700 -0500
@@ -426,11 +426,11 @@ bool CXMeshFileLoader::readFileIntoMemor
tmp[2] = 0x0;
tmp[0] = Buffer[4];
tmp[1] = Buffer[5];
- MajorVersion = core::strtol10(tmp);
+ MajorVersion = core::strtoul10(tmp);
tmp[0] = Buffer[6];
tmp[1] = Buffer[7];
- MinorVersion = core::strtol10(tmp);
+ MinorVersion = core::strtoul10(tmp);
//! read format
if (strncmp(&Buffer[8], "txt ", 4) ==0)
@@ -2307,7 +2307,7 @@ u32 CXMeshFileLoader::readInt()
else
{
findNextNoneWhiteSpaceNumber();
- return core::strtol10(P, &P);
+ return core::strtoul10(P, &P);
}
}
diff -up irrlicht18-svn3629/source/Irrlicht/CXMLReaderImpl.h.fastatof irrlicht18-svn3629/source/Irrlicht/CXMLReaderImpl.h
--- irrlicht18-svn3629/source/Irrlicht/CXMLReaderImpl.h.fastatof 2011-01-14 07:24:40.897355000 -0600
+++ irrlicht18-svn3629/source/Irrlicht/CXMLReaderImpl.h 2012-08-23 14:00:46.923580700 -0500
@@ -144,7 +144,7 @@ public:
return 0;
core::stringc c(attr->Value.c_str());
- return core::strtol10(c.c_str());
+ return core::strtoul10(c.c_str());
}
@@ -156,7 +156,7 @@ public:
return 0;
core::stringc c(attrvalue);
- return core::strtol10(c.c_str());
+ return core::strtoul10(c.c_str());
}
diff -up irrlicht18-svn3629/source/Irrlicht/dmfsupport.h.fastatof irrlicht18-svn3629/source/Irrlicht/dmfsupport.h
--- irrlicht18-svn3629/source/Irrlicht/dmfsupport.h.fastatof 2011-01-14 07:24:40.897355000 -0600
+++ irrlicht18-svn3629/source/Irrlicht/dmfsupport.h 2012-08-23 14:00:46.923580700 -0500
@@ -330,7 +330,7 @@ bool GetDMFMaterials(const StringList& R
materials[i].pathName.replace('\\','/');
materials[i].pathName += "/";
// temp[3] is reserved, temp[4] is the number of texture layers
- materials[i].textureLayers = core::strtol10(temp[4].c_str());
+ materials[i].textureLayers = core::strtoul10(temp[4].c_str());
// Three values are separated by commas
temp1=SubdivideString(temp[5],",");
@@ -449,7 +449,7 @@ bool GetDMFVerticesFaces(const StringLis
offs++;
// load vertices
core::array<core::vector3df> pos;
- const u32 posCount = core::strtol10(RawFile[offs].c_str());
+ const u32 posCount = core::strtoul10(RawFile[offs].c_str());
++offs;
pos.reallocate(posCount);
for (u32 i=0; i<posCount; ++i)
@@ -470,7 +470,7 @@ bool GetDMFVerticesFaces(const StringLis
temp=SubdivideString(RawFile[offs+j],";");
//first value is vertices number for this face
- const s32 vert=core::strtol10(temp[0].c_str());
+ const s32 vert=core::strtoul10(temp[0].c_str());
faces[face_cnt].numVerts=vert;
//second is material ID
faces[face_cnt].materialID=atoi(temp[1].c_str());
@@ -481,7 +481,7 @@ bool GetDMFVerticesFaces(const StringLis
for(s32 k=0; k<vert; ++k)
{
//copy position
- vertices[vert_cnt].pos.set(pos[core::strtol10(temp[2+k].c_str())]);
+ vertices[vert_cnt].pos.set(pos[core::strtoul10(temp[2+k].c_str())]);
//get uv coords for tex and light if any
vertices[vert_cnt].tc.set(core::fast_atof(temp[2+vert+(2*k)].c_str()),
core::fast_atof(temp[2+vert+(2*k)+1].c_str()));