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

WIP deserializing KRMaterial members and custom types.
This commit is contained in:
2026-04-18 16:15:19 -07:00
parent 60d2883a4d
commit d1d98c079f
2 changed files with 191 additions and 45 deletions

View File

@@ -31,13 +31,13 @@
#pragma once
#include "vector2.h"
#include "vector3.h"
#include "matrix4.h"
#include "hydra.h"
#include <string>
#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 <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

View File

@@ -42,44 +42,8 @@ using namespace mimir;
using namespace hydra;
using namespace simdjson;
namespace simdjson {
template <typename builder_type>
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 <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>
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 <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
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<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
}
*/
}