Change the behavior of NUMBER value in `Value` class. NUMBER now reprents the value is either int or real(floating point).
diff --git a/README.md b/README.md
index bf25870..f37303a 100644
--- a/README.md
+++ b/README.md
@@ -57,9 +57,9 @@
## Note on extension property
-In extension(`ExtensionMap`), JSON number value is parsed as int or float(number) and stored as `tinygltf::Value` object. If you want a floating point value from `tinygltf::Value`, use `GetAsFloat()` method.
+In extension(`ExtensionMap`), JSON number value is parsed as int or float(number) and stored as `tinygltf::Value` object. If you want a floating point value from `tinygltf::Value`, use `GetNumberAsDouble()` method.
-`IsNumber()` only returns true if the underlying value is a floating point value. If you wan to check if the value is `number`(int or real, in the context of JSON), Plese use `IsNumberOrInt()` method.
+`IsNumber()` returns true if the underlying value is an int value or a floating point value.
## Examples
diff --git a/tests/tester.cc b/tests/tester.cc
index b2ba048..144e26f 100644
--- a/tests/tester.cc
+++ b/tests/tester.cc
@@ -302,14 +302,14 @@
REQUIRE(texform["scale"].IsArray());
- // It looks json.hpp parse integer JSON number as integer, not floating point.
- // so we'll check if Value is number(floating point) or integer value.
- REQUIRE(texform["scale"].Get(0).IsNumberOrInt());
- REQUIRE(texform["scale"].Get(1).IsNumberOrInt());
+ // Note: It looks json.hpp parse integer JSON number as integer, not floating point.
+ // IsNumber return true either value is int or floating point.
+ REQUIRE(texform["scale"].Get(0).IsNumber());
+ REQUIRE(texform["scale"].Get(1).IsNumber());
double scale[2];
- scale[0] = texform["scale"].Get(0).GetAsFloat();
- scale[1] = texform["scale"].Get(1).GetAsFloat();
+ scale[0] = texform["scale"].Get(0).GetNumberAsDouble();
+ scale[1] = texform["scale"].Get(1).GetNumberAsDouble();
REQUIRE(scale[0] == Approx(1.0));
REQUIRE(scale[1] == Approx(-1.0));
diff --git a/tiny_gltf.h b/tiny_gltf.h
index 64941cb..5fdeaf5 100644
--- a/tiny_gltf.h
+++ b/tiny_gltf.h
@@ -28,6 +28,8 @@
// Version:
// - v2.3.0 Modified Material representation according to glTF 2.0 schema
// (and introduced TextureInfo class)
+// Change the behavior of `Value::IsNumber`. It return true either the
+// value is int or real.
// - v2.2.0 Add loading 16bit PNG support. Add Sparse accessor support(Thanks
// to @Ybalrid)
// - v2.1.0 Add draco compression.
@@ -160,7 +162,7 @@
typedef enum {
NULL_TYPE = 0,
- NUMBER_TYPE = 1,
+ REAL_TYPE = 1,
INT_TYPE = 2,
BOOL_TYPE = 3,
STRING_TYPE = 4,
@@ -213,6 +215,7 @@
}
}
+// TODO(syoyo): Move these functions to TinyGLTF class
bool IsDataURI(const std::string &in);
bool DecodeDataURI(std::vector<unsigned char> *out, std::string &mime_type,
const std::string &in, size_t reqBytes, bool checkSize);
@@ -234,12 +237,12 @@
Value()
: type_(NULL_TYPE),
int_value_(0),
- number_value_(0.0),
+ real_value_(0.0),
boolean_value_(false) {}
explicit Value(bool b) : type_(BOOL_TYPE) { boolean_value_ = b; }
explicit Value(int i) : type_(INT_TYPE) { int_value_ = i; }
- explicit Value(double n) : type_(NUMBER_TYPE) { number_value_ = n; }
+ explicit Value(double n) : type_(REAL_TYPE) { real_value_ = n; }
explicit Value(const std::string &s) : type_(STRING_TYPE) {
string_value_ = s;
}
@@ -260,13 +263,9 @@
bool IsInt() const { return (type_ == INT_TYPE); }
- // for backward compatibility, we use `IsNumber` for floating point value
- // only.
- bool IsNumber() const { return (type_ == NUMBER_TYPE); }
+ bool IsNumber() const { return (type_ == REAL_TYPE) || (type_ == INT_TYPE); }
- bool IsNumberOrInt() const {
- return (type_ == INT_TYPE) || (type_ == NUMBER_TYPE);
- }
+ bool IsReal() const { return (type_ == REAL_TYPE); }
bool IsString() const { return (type_ == STRING_TYPE); }
@@ -276,15 +275,22 @@
bool IsObject() const { return (type_ == OBJECT_TYPE); }
- double GetAsFloat() const {
+ // Use this function if you want to have number value as double.
+ double GetNumberAsDouble() const {
if (type_ == INT_TYPE) {
return double(int_value_);
- } else if (type_ == NUMBER_TYPE) {
- return number_value_;
+ } else {
+ return real_value_;
}
+ }
- // TODO(syoyo): Raise error?
- return std::numeric_limits<double>::quiet_NaN();
+ // Use this function if you want to have number value as int.
+ double GetNumberAsInt() const {
+ if (type_ == REAL_TYPE) {
+ return int(real_value_);
+ } else {
+ return int_value_;
+ }
}
// Accessor
@@ -344,7 +350,7 @@
int type_ = NULL_TYPE;
int int_value_ = 0;
- double number_value_ = 0.0;
+ double real_value_ = 0.0;
std::string string_value_;
std::vector<unsigned char> binary_value_;
Array array_value_;
@@ -366,7 +372,7 @@
return var; \
}
TINYGLTF_VALUE_GET(bool, boolean_value_)
-TINYGLTF_VALUE_GET(double, number_value_)
+TINYGLTF_VALUE_GET(double, real_value_)
TINYGLTF_VALUE_GET(int, int_value_)
TINYGLTF_VALUE_GET(std::string, string_value_)
TINYGLTF_VALUE_GET(std::vector<unsigned char>, binary_value_)
@@ -1351,7 +1357,7 @@
return true;
case BOOL_TYPE:
return one.Get<bool>() == other.Get<bool>();
- case NUMBER_TYPE:
+ case REAL_TYPE:
return TINYGLTF_DOUBLE_EQUAL(one.Get<double>(), other.Get<double>());
case INT_TYPE:
return one.Get<int>() == other.Get<int>();
@@ -5001,7 +5007,7 @@
static bool ValueToJson(const Value &value, json *ret) {
json obj;
switch (value.Type()) {
- case NUMBER_TYPE:
+ case REAL_TYPE:
obj = json(value.Get<double>());
break;
case INT_TYPE: