diff --git a/kraken/KRHelpers.h b/kraken/KRHelpers.h index f529528..be86cef 100644 --- a/kraken/KRHelpers.h +++ b/kraken/KRHelpers.h @@ -31,13 +31,13 @@ #pragma once -#include "vector2.h" -#include "vector3.h" -#include "matrix4.h" +#include "hydra.h" #include #include "../3rdparty/tinyxml2/tinyxml2.h" +#include "simdjson.h" + #define KRMIN(x,y) ((x) < (y) ? (x) : (y)) #define KRMAX(x,y) ((x) > (y) ? (x) : (y)) #define KRCLAMP(x, min, max) (KRMAX(KRMIN(x, max), min)) @@ -53,3 +53,126 @@ const hydra::Vector3 getXMLAttribute(const std::string& base_name, ::tinyxml2::X const hydra::AABB getXMLAttribute(const std::string& base_name, ::tinyxml2::XMLElement* e, const hydra::AABB& default_value); } // namespace kraken +namespace simdjson { + +template +void tag_invoke(serialize_tag, builder_type& builder, const hydra::Vector2& vec) +{ + builder.start_array(); + builder.append(vec.x); + builder.append_comma(); + builder.append(vec.y); + builder.end_array(); +} + +template +auto tag_invoke(deserialize_tag, simdjson_value &val, hydra::Vector2& vec) +{ + ondemand::array components; + auto error = val.get_array().get(components); + if (error) { + return error; + } + + ondemand::array_iterator itr; + if ((error = components.begin().get(itr))) + { + return error; + } + double v[2] = {0.f}; + for(int i=0; i < 2; i++) { + if ((error = (*itr).get(v[i]))) { + return error; + } + ++itr; + } + + vec[0] = v[0]; + vec[1] = v[1]; + return simdjson::SUCCESS; +} + +template +void tag_invoke(serialize_tag, builder_type& builder, const hydra::Vector3& vec) +{ + builder.start_array(); + builder.append(vec.x); + builder.append_comma(); + builder.append(vec.y); + builder.append_comma(); + builder.append(vec.z); + builder.end_array(); +} + + +template +auto tag_invoke(deserialize_tag, simdjson_value &val, hydra::Vector3& vec) { + ondemand::array components; + auto error = val.get_array().get(components); + if (error) { + return error; + } + + ondemand::array_iterator itr; + if ((error = components.begin().get(itr))) + { + return error; + } + double v[3] = {0.f}; + for(int i=0; i < 3; i++) { + if ((error = (*itr).get(v[i]))) { + return error; + } + ++itr; + } + + vec[0] = v[0]; + vec[1] = v[1]; + vec[2] = v[2]; + return simdjson::SUCCESS; +} + +template +void tag_invoke(serialize_tag, builder_type& builder, const hydra::Vector4& vec) +{ + builder.start_array(); + builder.append(vec.x); + builder.append_comma(); + builder.append(vec.y); + builder.append_comma(); + builder.append(vec.z); + builder.append_comma(); + builder.append(vec.w); + builder.end_array(); +} + +template +auto tag_invoke(deserialize_tag, simdjson_value &val, hydra::Vector4& vec) +{ + ondemand::array components; + auto error = val.get_array().get(components); + if (error) { + return error; + } + + ondemand::array_iterator itr; + if ((error = components.begin().get(itr))) + { + return error; + } + double v[4] = {0.f}; + for(int i=0; i < 4; i++) { + if ((error = (*itr).get(v[i]))) { + return error; + } + ++itr; + } + + vec[0] = v[0]; + vec[1] = v[1]; + vec[2] = v[2]; + vec[3] = v[3]; + return simdjson::SUCCESS; +} + +} // namespace simdjson diff --git a/kraken/resources/material/KRMaterial.cpp b/kraken/resources/material/KRMaterial.cpp index 2d27335..cc1371c 100755 --- a/kraken/resources/material/KRMaterial.cpp +++ b/kraken/resources/material/KRMaterial.cpp @@ -42,44 +42,8 @@ using namespace mimir; using namespace hydra; using namespace simdjson; -namespace simdjson { - -template -void tag_invoke(serialize_tag, builder_type& builder, const hydra::Vector2& vec) +namespace simdjson { - builder.start_array(); - builder.append(vec.x); - builder.append_comma(); - builder.append(vec.y); - builder.end_array(); -} - -template -void tag_invoke(serialize_tag, builder_type& builder, const hydra::Vector3& vec) -{ - builder.start_array(); - builder.append(vec.x); - builder.append_comma(); - builder.append(vec.y); - builder.append_comma(); - builder.append(vec.z); - builder.end_array(); -} - -template -void tag_invoke(serialize_tag, builder_type& builder, const hydra::Vector4& vec) -{ - builder.start_array(); - builder.append(vec.x); - builder.append_comma(); - builder.append(vec.y); - builder.append_comma(); - builder.append(vec.z); - builder.append_comma(); - builder.append(vec.w); - builder.end_array(); -} - template void tag_invoke(serialize_tag, builder_type& builder, const KRMaterial::TransformedTexture& texture) { @@ -94,6 +58,36 @@ void tag_invoke(serialize_tag, builder_type& builder, const KRMaterial::Transfor builder.end_object(); } +template +auto tag_invoke(deserialize_tag, simdjson_value &val, KRMaterial::TransformedTexture& map) { + ondemand::object obj; + auto error = val.get_object().get(obj); + if (error) { + return error; + } + + std::string textureName; + if ((error = obj["texture"].get_string().get(textureName))) { + return error; + } + map.texture.set(textureName); + + if ((error = obj["offset"].get(map.offset))) { + return error; + } + + if ((error = obj["scale"].get(map.scale))) { + return error; + } + + double v; + if ((error = obj["rotation"].get(v))) { + return error; + } + map.rotation = v; + + return simdjson::SUCCESS; +} } // namespace simdjson KRMaterial::KRMaterial(KRContext& context, const char* name) @@ -104,9 +98,8 @@ KRMaterial::KRMaterial(KRContext& context, const char* name) KRMaterial::KRMaterial(KRContext& context, std::string name, mimir::Block* data) : KRResource(context, name) { - simdjson::dom::parser parser; - simdjson::dom::element jsonRoot; - data->lock(); + simdjson::ondemand::parser parser; + simdjson::ondemand::document doc; /* char* str = (char*)data->getStart(); @@ -115,8 +108,20 @@ KRMaterial::KRMaterial(KRContext& context, std::string name, mimir::Block* data) OutputDebugStringA("\n----====----\n\n"); */ - auto error = parser.parse((const char*)data->getStart(), data->getSize()).get(jsonRoot); - data->unlock(); + mimir::Block paddedData; + paddedData.append(*data); + paddedData.expand(SIMDJSON_PADDING); + paddedData.lock(); + auto error = parser.iterate((const char*)paddedData.getStart(), paddedData.getSize()).get(doc); + paddedData.unlock(); + + if (error) { + // TODO - Report and handle error + return; + } + + ondemand::object jsonRoot; + error = doc.get_object().get(jsonRoot); if (error) { // TODO - Report and handle error return; @@ -173,6 +178,24 @@ KRMaterial::KRMaterial(KRContext& context, std::string name, mimir::Block* data) } else if (error != simdjson::EMPTY) { // TODO - Report and handle error } + + /* + simdjson::dom::object baseColorObj; + error = jsonRoot["baseColor"].get_object().get(baseColorObj); + if (error == simdjson::SUCCESS) { + + error = baseColorObj["map"].get().get(m_baseColorTexture); + if (error != simdjson::EMPTY) { + // TODO - Report and handle error + } + error = baseColorObj["factor"].get().get(m_baseColorFactor); + if (error != simdjson::EMPTY) { + // TODO - Report and handle error + } + } else if (error != simdjson::EMPTY) { + // TODO - Report and handle error + } + */ }