Convert double to float in gltf model and json util
This commit is contained in:
@@ -143,7 +143,7 @@ namespace Inferno {
|
|||||||
|
|
||||||
void Gltf::parseScene(glTF::Scene* scene, const std::string& key, const json& object)
|
void Gltf::parseScene(glTF::Scene* scene, const std::string& key, const json& object)
|
||||||
{
|
{
|
||||||
auto nodes = Json::parseDoubleArrayProperty(object, "nodes", false);
|
auto nodes = Json::parseFloatArrayProperty(object, "nodes", false);
|
||||||
ASSERT(!nodes || nodes.value().size() > 0, "Gltf scene '{}' empty 'nodes' property", key);
|
ASSERT(!nodes || nodes.value().size() > 0, "Gltf scene '{}' empty 'nodes' property", key);
|
||||||
|
|
||||||
auto name = Json::parseStringProperty(object, "name", false);
|
auto name = Json::parseStringProperty(object, "name", false);
|
||||||
@@ -160,21 +160,21 @@ namespace Inferno {
|
|||||||
|
|
||||||
auto skin = Json::parseUnsignedProperty(object, "skin", false);
|
auto skin = Json::parseUnsignedProperty(object, "skin", false);
|
||||||
|
|
||||||
auto matrix = Json::parseDoubleArrayProperty(object, "matrix", false);
|
auto matrix = Json::parseFloatArrayProperty(object, "matrix", false);
|
||||||
ASSERT(!matrix || matrix.value().size() == 16, "Gltf node '{}' property 'matrix' invalid size", key);
|
ASSERT(!matrix || matrix.value().size() == 16, "Gltf node '{}' property 'matrix' invalid size", key);
|
||||||
|
|
||||||
auto mesh = Json::parseUnsignedProperty(object, "mesh", false);
|
auto mesh = Json::parseUnsignedProperty(object, "mesh", false);
|
||||||
|
|
||||||
auto rotation = Json::parseDoubleArrayProperty(object, "rotation", false);
|
auto rotation = Json::parseFloatArrayProperty(object, "rotation", false);
|
||||||
ASSERT(!rotation || rotation.value().size() == 4, "Gltf node '{}' property 'rotation' invalid size", key);
|
ASSERT(!rotation || rotation.value().size() == 4, "Gltf node '{}' property 'rotation' invalid size", key);
|
||||||
|
|
||||||
auto scale = Json::parseDoubleArrayProperty(object, "scale", false);
|
auto scale = Json::parseFloatArrayProperty(object, "scale", false);
|
||||||
ASSERT(!scale || scale.value().size() == 3, "Gltf node '{}' property 'scale' invalid size", key);
|
ASSERT(!scale || scale.value().size() == 3, "Gltf node '{}' property 'scale' invalid size", key);
|
||||||
|
|
||||||
auto translation = Json::parseDoubleArrayProperty(object, "translation", false);
|
auto translation = Json::parseFloatArrayProperty(object, "translation", false);
|
||||||
ASSERT(!translation || translation.value().size() == 3, "Gltf node '{}' property 'translation' invalid size", key);
|
ASSERT(!translation || translation.value().size() == 3, "Gltf node '{}' property 'translation' invalid size", key);
|
||||||
|
|
||||||
auto weights = Json::parseDoubleArrayProperty(object, "weights", false);
|
auto weights = Json::parseFloatArrayProperty(object, "weights", false);
|
||||||
ASSERT(!weights || weights.value().size() > 0, "Gltf node '{}' empty property 'weights'", key);
|
ASSERT(!weights || weights.value().size() > 0, "Gltf node '{}' empty property 'weights'", key);
|
||||||
|
|
||||||
auto name = Json::parseStringProperty(object, "name", false);
|
auto name = Json::parseStringProperty(object, "name", false);
|
||||||
@@ -239,7 +239,7 @@ namespace Inferno {
|
|||||||
mesh->primitives.emplace_back(std::move(primitive));
|
mesh->primitives.emplace_back(std::move(primitive));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto weights = Json::parseDoubleArrayProperty(object, "weights", false);
|
auto weights = Json::parseFloatArrayProperty(object, "weights", false);
|
||||||
ASSERT(!weights || weights.value().size() > 0, "Gltf mesh '{}' empty property 'weights'", key);
|
ASSERT(!weights || weights.value().size() > 0, "Gltf mesh '{}' empty property 'weights'", key);
|
||||||
|
|
||||||
auto name = Json::parseStringProperty(object, "name", false);
|
auto name = Json::parseStringProperty(object, "name", false);
|
||||||
@@ -265,10 +265,10 @@ namespace Inferno {
|
|||||||
auto type = Json::parseStringProperty(object, "type", true);
|
auto type = Json::parseStringProperty(object, "type", true);
|
||||||
ASSERT(type, "Gltf accessor '{}' missing required property 'type'", key);
|
ASSERT(type, "Gltf accessor '{}' missing required property 'type'", key);
|
||||||
|
|
||||||
auto max = Json::parseDoubleArrayProperty(object, "max", false);
|
auto max = Json::parseFloatArrayProperty(object, "max", false);
|
||||||
ASSERT(!max || max.value().size() > 0, "Gltf accessor '{}' empty property 'max'", key);
|
ASSERT(!max || max.value().size() > 0, "Gltf accessor '{}' empty property 'max'", key);
|
||||||
|
|
||||||
auto min = Json::parseDoubleArrayProperty(object, "min", false);
|
auto min = Json::parseFloatArrayProperty(object, "min", false);
|
||||||
ASSERT(!min || min.value().size() > 0, "Gltf accessor '{}' empty property 'min'", key);
|
ASSERT(!min || min.value().size() > 0, "Gltf accessor '{}' empty property 'min'", key);
|
||||||
|
|
||||||
auto name = Json::parseStringProperty(object, "name", false);
|
auto name = Json::parseStringProperty(object, "name", false);
|
||||||
|
|||||||
@@ -35,12 +35,12 @@ namespace Inferno {
|
|||||||
uint32_t camera;
|
uint32_t camera;
|
||||||
std::vector<uint32_t> children;
|
std::vector<uint32_t> children;
|
||||||
uint32_t skin;
|
uint32_t skin;
|
||||||
std::array<double, 16> matrix { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }; // Identity matrix
|
std::array<float, 16> matrix { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }; // Identity matrix
|
||||||
uint32_t mesh;
|
uint32_t mesh;
|
||||||
std::array<double, 4> rotation { 0, 0, 0, 1 };
|
std::array<float, 4> rotation { 0, 0, 0, 1 };
|
||||||
std::array<double, 3> scale { 1, 1, 1 };
|
std::array<float, 3> scale { 1, 1, 1 };
|
||||||
std::array<double, 3> translation { 0, 0, 0 };
|
std::array<float, 3> translation { 0, 0, 0 };
|
||||||
std::vector<double> weights;
|
std::vector<float> weights;
|
||||||
std::string name;
|
std::string name;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@ namespace Inferno {
|
|||||||
// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#meshes
|
// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#meshes
|
||||||
struct Mesh {
|
struct Mesh {
|
||||||
std::vector<Primitive> primitives; // Required
|
std::vector<Primitive> primitives; // Required
|
||||||
std::vector<double> weights;
|
std::vector<float> weights;
|
||||||
std::string name;
|
std::string name;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -67,8 +67,8 @@ namespace Inferno {
|
|||||||
bool normalized { false };
|
bool normalized { false };
|
||||||
uint32_t count; // Required
|
uint32_t count; // Required
|
||||||
std::string type; // Required
|
std::string type; // Required
|
||||||
std::vector<double> max;
|
std::vector<float> max;
|
||||||
std::vector<double> min;
|
std::vector<float> min;
|
||||||
std::string name;
|
std::string name;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -127,7 +127,8 @@ namespace Inferno {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Return vector if it has any items, uninitialized optional otherwise
|
// Return vector if it has any items, uninitialized optional otherwise
|
||||||
return values.size() > 0 ? std::optional { values } : std::nullopt;
|
if (values.size() > 0) return values;
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@@ -165,7 +166,8 @@ namespace Inferno {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Return map if it has any items, uninitialized optional otherwise
|
// Return map if it has any items, uninitialized optional otherwise
|
||||||
return values.size() > 0 ? std::optional { values } : std::nullopt;
|
if (values.size() > 0) return values;
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::optional<bool> parseBoolProperty(const json& json, const char* property, bool required)
|
static std::optional<bool> parseBoolProperty(const json& json, const char* property, bool required)
|
||||||
@@ -173,19 +175,25 @@ namespace Inferno {
|
|||||||
return parseProperty<bool>(json, property, required, json::value_t::boolean);
|
return parseProperty<bool>(json, property, required, json::value_t::boolean);
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::optional<double> parseDoubleProperty(const json& json, const char* property, bool required)
|
static std::optional<float> parseFloatProperty(const json& json, const char* property, bool required)
|
||||||
{
|
{
|
||||||
return parseProperty<double>(json, property, required, std::vector { json::value_t::number_integer, json::value_t::number_unsigned, json::value_t::number_float });
|
auto result = parseProperty<double>(json, property, required, std::vector { json::value_t::number_integer, json::value_t::number_unsigned, json::value_t::number_float });
|
||||||
|
if (result) return static_cast<float>(result.value());
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::optional<int32_t> parseIntegerProperty(const json& json, const char* property, bool required)
|
static std::optional<int32_t> parseIntegerProperty(const json& json, const char* property, bool required)
|
||||||
{
|
{
|
||||||
return parseProperty<int32_t>(json, property, required, json::value_t::number_integer);
|
auto result = parseProperty<int64_t>(json, property, required, json::value_t::number_integer);
|
||||||
|
if (result) return static_cast<int32_t>(result.value());
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::optional<uint32_t> parseUnsignedProperty(const json& json, const char* property, bool required)
|
static std::optional<uint32_t> parseUnsignedProperty(const json& json, const char* property, bool required)
|
||||||
{
|
{
|
||||||
return parseProperty<uint32_t>(json, property, required, json::value_t::number_unsigned);
|
auto result = parseProperty<uint64_t>(json, property, required, json::value_t::number_unsigned);
|
||||||
|
if (result) return static_cast<uint32_t>(result.value());
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::optional<std::string> parseStringProperty(const json& json, const char* property, bool required)
|
static std::optional<std::string> parseStringProperty(const json& json, const char* property, bool required)
|
||||||
@@ -193,34 +201,46 @@ namespace Inferno {
|
|||||||
return parseProperty<std::string>(json, property, required, json::value_t::string);
|
return parseProperty<std::string>(json, property, required, json::value_t::string);
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::optional<std::vector<double>> parseDoubleArrayProperty(const json& json, const char* property, bool required)
|
static std::optional<std::vector<float>> parseFloatArrayProperty(const json& json, const char* property, bool required)
|
||||||
{
|
{
|
||||||
return parseArrayProperty<double>(json, property, required, std::vector { json::value_t::number_integer, json::value_t::number_unsigned, json::value_t::number_float });
|
auto result = parseArrayProperty<double>(json, property, required, std::vector { json::value_t::number_integer, json::value_t::number_unsigned, json::value_t::number_float });
|
||||||
|
if (result) return std::vector<float>(result.value().begin(), result.value().end());
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::optional<std::vector<int32_t>> parseIntegerArrayProperty(const json& json, const char* property, bool required)
|
static std::optional<std::vector<int32_t>> parseIntegerArrayProperty(const json& json, const char* property, bool required)
|
||||||
{
|
{
|
||||||
return parseArrayProperty<int32_t>(json, property, required, json::value_t::number_integer);
|
auto result = parseArrayProperty<int64_t>(json, property, required, json::value_t::number_integer);
|
||||||
|
if (result) return std::vector<int32_t>(result.value().begin(), result.value().end());
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::optional<std::vector<uint32_t>> parseUnsignedArrayProperty(const json& json, const char* property, bool required)
|
static std::optional<std::vector<uint32_t>> parseUnsignedArrayProperty(const json& json, const char* property, bool required)
|
||||||
{
|
{
|
||||||
return parseArrayProperty<uint32_t>(json, property, required, json::value_t::number_unsigned);
|
auto result = parseArrayProperty<uint64_t>(json, property, required, json::value_t::number_unsigned);
|
||||||
|
if (result) return std::vector<uint32_t>(result.value().begin(), result.value().end());
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::optional<std::map<std::string, double>> parseDoubleObjectProperty(const json& json, const char* property, bool required)
|
static std::optional<std::map<std::string, float>> parseFloatObjectProperty(const json& json, const char* property, bool required)
|
||||||
{
|
{
|
||||||
return parseObjectProperty<double>(json, property, required, std::vector { json::value_t::number_integer, json::value_t::number_unsigned, json::value_t::number_float });
|
auto result = parseObjectProperty<double>(json, property, required, std::vector { json::value_t::number_integer, json::value_t::number_unsigned, json::value_t::number_float });
|
||||||
|
if (result) return std::map<std::string, float>(result.value().begin(), result.value().end());
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::optional<std::map<std::string, int32_t>> parseIntegerObjectProperty(const json& json, const char* property, bool required)
|
static std::optional<std::map<std::string, int32_t>> parseIntegerObjectProperty(const json& json, const char* property, bool required)
|
||||||
{
|
{
|
||||||
return parseObjectProperty<int32_t>(json, property, required, json::value_t::number_integer);
|
auto result = parseObjectProperty<int64_t>(json, property, required, json::value_t::number_integer);
|
||||||
|
if (result) return std::map<std::string, int32_t>(result.value().begin(), result.value().end());
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::optional<std::map<std::string, uint32_t>> parseUnsignedObjectProperty(const json& json, const char* property, bool required)
|
static std::optional<std::map<std::string, uint32_t>> parseUnsignedObjectProperty(const json& json, const char* property, bool required)
|
||||||
{
|
{
|
||||||
return parseObjectProperty<uint32_t>(json, property, required, json::value_t::number_unsigned);
|
auto result = parseObjectProperty<uint64_t>(json, property, required, json::value_t::number_unsigned);
|
||||||
|
if (result) return std::map<std::string, uint32_t>(result.value().begin(), result.value().end());
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user