KRMaterial now using simdjson ondemand deserialization.
Some checks failed
CMake on multiple platforms / build (Release, cl, cl, windows-latest) (push) Has been cancelled
CMake on multiple platforms / build (Release, clang, clang++, macos-latest) (push) Has been cancelled
CMake on multiple platforms / build (Release, clang, clang++, ubuntu-latest) (push) Has been cancelled
CMake on multiple platforms / build (Release, gcc, g++, ubuntu-latest) (push) Has been cancelled
Some checks failed
CMake on multiple platforms / build (Release, cl, cl, windows-latest) (push) Has been cancelled
CMake on multiple platforms / build (Release, clang, clang++, macos-latest) (push) Has been cancelled
CMake on multiple platforms / build (Release, clang, clang++, ubuntu-latest) (push) Has been cancelled
CMake on multiple platforms / build (Release, gcc, g++, ubuntu-latest) (push) Has been cancelled
WIP deserializing KRMaterial members and custom types.
This commit is contained in:
@@ -31,13 +31,13 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "vector2.h"
|
#include "hydra.h"
|
||||||
#include "vector3.h"
|
|
||||||
#include "matrix4.h"
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "../3rdparty/tinyxml2/tinyxml2.h"
|
#include "../3rdparty/tinyxml2/tinyxml2.h"
|
||||||
|
|
||||||
|
#include "simdjson.h"
|
||||||
|
|
||||||
#define KRMIN(x,y) ((x) < (y) ? (x) : (y))
|
#define KRMIN(x,y) ((x) < (y) ? (x) : (y))
|
||||||
#define KRMAX(x,y) ((x) > (y) ? (x) : (y))
|
#define KRMAX(x,y) ((x) > (y) ? (x) : (y))
|
||||||
#define KRCLAMP(x, min, max) (KRMAX(KRMIN(x, max), min))
|
#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);
|
const hydra::AABB getXMLAttribute(const std::string& base_name, ::tinyxml2::XMLElement* e, const hydra::AABB& default_value);
|
||||||
} // namespace kraken
|
} // namespace kraken
|
||||||
|
|
||||||
|
namespace simdjson {
|
||||||
|
|
||||||
|
template <typename builder_type>
|
||||||
|
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 <typename simdjson_value>
|
||||||
|
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 <typename builder_type>
|
||||||
|
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 <typename simdjson_value>
|
||||||
|
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 <typename builder_type>
|
||||||
|
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 <typename simdjson_value>
|
||||||
|
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
|
||||||
|
|||||||
@@ -42,44 +42,8 @@ using namespace mimir;
|
|||||||
using namespace hydra;
|
using namespace hydra;
|
||||||
using namespace simdjson;
|
using namespace simdjson;
|
||||||
|
|
||||||
namespace simdjson {
|
namespace simdjson
|
||||||
|
|
||||||
template <typename builder_type>
|
|
||||||
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 <typename builder_type>
|
|
||||||
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 <typename builder_type>
|
|
||||||
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 <typename builder_type>
|
template <typename builder_type>
|
||||||
void tag_invoke(serialize_tag, builder_type& builder, const KRMaterial::TransformedTexture& texture)
|
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();
|
builder.end_object();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename simdjson_value>
|
||||||
|
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
|
} // namespace simdjson
|
||||||
|
|
||||||
KRMaterial::KRMaterial(KRContext& context, const char* name)
|
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)
|
KRMaterial::KRMaterial(KRContext& context, std::string name, mimir::Block* data)
|
||||||
: KRResource(context, name)
|
: KRResource(context, name)
|
||||||
{
|
{
|
||||||
simdjson::dom::parser parser;
|
simdjson::ondemand::parser parser;
|
||||||
simdjson::dom::element jsonRoot;
|
simdjson::ondemand::document doc;
|
||||||
data->lock();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
char* str = (char*)data->getStart();
|
char* str = (char*)data->getStart();
|
||||||
@@ -115,8 +108,20 @@ KRMaterial::KRMaterial(KRContext& context, std::string name, mimir::Block* data)
|
|||||||
OutputDebugStringA("\n----====----\n\n");
|
OutputDebugStringA("\n----====----\n\n");
|
||||||
*/
|
*/
|
||||||
|
|
||||||
auto error = parser.parse((const char*)data->getStart(), data->getSize()).get(jsonRoot);
|
mimir::Block paddedData;
|
||||||
data->unlock();
|
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) {
|
if (error) {
|
||||||
// TODO - Report and handle error
|
// TODO - Report and handle error
|
||||||
return;
|
return;
|
||||||
@@ -174,6 +179,24 @@ KRMaterial::KRMaterial(KRContext& context, std::string name, mimir::Block* data)
|
|||||||
// TODO - Report and handle error
|
// TODO - Report and handle error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
simdjson::dom::object baseColorObj;
|
||||||
|
error = jsonRoot["baseColor"].get_object().get(baseColorObj);
|
||||||
|
if (error == simdjson::SUCCESS) {
|
||||||
|
|
||||||
|
error = baseColorObj["map"].get<TransformedTexture>().get(m_baseColorTexture);
|
||||||
|
if (error != simdjson::EMPTY) {
|
||||||
|
// TODO - Report and handle error
|
||||||
|
}
|
||||||
|
error = baseColorObj["factor"].get<Vector4>().get(m_baseColorFactor);
|
||||||
|
if (error != simdjson::EMPTY) {
|
||||||
|
// TODO - Report and handle error
|
||||||
|
}
|
||||||
|
} else if (error != simdjson::EMPTY) {
|
||||||
|
// TODO - Report and handle error
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
KRMaterial::~KRMaterial()
|
KRMaterial::~KRMaterial()
|
||||||
|
|||||||
Reference in New Issue
Block a user