Added material transmission attributes.
Some checks are pending
CMake on multiple platforms / build (Release, cl, cl, windows-latest) (push) Waiting to run
CMake on multiple platforms / build (Release, clang, clang++, macos-latest) (push) Waiting to run
CMake on multiple platforms / build (Release, clang, clang++, ubuntu-latest) (push) Waiting to run
CMake on multiple platforms / build (Release, gcc, g++, ubuntu-latest) (push) Waiting to run

Added material shading model attribute.
Implemented material json serialization.
This commit is contained in:
2026-04-14 23:46:38 -07:00
parent 16de2d66f2
commit 3242983ce8
3 changed files with 233 additions and 1 deletions

View File

@@ -42,6 +42,60 @@ using namespace mimir;
using namespace hydra; using namespace hydra;
using namespace simdjson; using 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>
void tag_invoke(serialize_tag, builder_type& builder, const KRMaterial::TransformedTexture& texture)
{
builder.start_object();
builder.append_key_value<"texture">(texture.texture.getName());
builder.append_comma();
builder.append_key_value<"offset">(texture.offset);
builder.append_comma();
builder.append_key_value<"scale">(texture.scale);
builder.append_comma();
builder.append_key_value<"rotation">(texture.rotation);
builder.end_object();
}
} // namespace simdjson
KRMaterial::KRMaterial(KRContext& context, const char* name) KRMaterial::KRMaterial(KRContext& context, const char* name)
: KRResource(context, name) : KRResource(context, name)
{ {
@@ -53,6 +107,14 @@ KRMaterial::KRMaterial(KRContext& context, std::string name, mimir::Block* data)
simdjson::dom::parser parser; simdjson::dom::parser parser;
simdjson::dom::element jsonRoot; simdjson::dom::element jsonRoot;
data->lock(); data->lock();
/*
char* str = (char*)data->getStart();
OutputDebugStringA("\n\n----====----\n");
OutputDebugStringA(str);
OutputDebugStringA("\n----====----\n\n");
*/
auto error = parser.parse((const char*)data->getStart(), data->getSize()).get(jsonRoot); auto error = parser.parse((const char*)data->getStart(), data->getSize()).get(jsonRoot);
data->unlock(); data->unlock();
if (error) { if (error) {
@@ -80,7 +142,166 @@ bool KRMaterial::save(Block& data)
simdjson::builder::string_builder sb; simdjson::builder::string_builder sb;
sb.start_object(); sb.start_object();
sb.append_key_value<"name">(getName()); sb.append_key_value<"name">(getName());
sb.append_comma();
switch (m_alphaMode) {
case KRMATERIAL_ALPHA_MODE_OPAQUE:
sb.append_key_value<"alphaMode">("opaque");
break;
case KRMATERIAL_ALPHA_MODE_BLEND:
sb.append_key_value<"alphaMode">("blend");
break;
case KRMATERIAL_ALPHA_MODE_TEST:
sb.append_key_value<"alphaMode">("test");
break;
}
sb.append_comma();
sb.append_key_value<"alphaCutoff">(m_alphaCutoff);
sb.append_comma();
sb.append_key_value<"ior">(m_ior);
sb.append_comma();
sb.append_key_value<"dispersion">(m_dispersion);
sb.append_comma();
switch (m_shadingModel) {
case KRMATERIAL_SHADING_MODEL_UNLIT:
sb.append_key_value<"shadingModel">("unlit");
break;
case KRMATERIAL_SHADING_MODEL_PBR:
sb.append_key_value<"shadingModel">("pbr");
break;
}
sb.append_comma();
sb.escape_and_append_with_quotes("baseColor");
sb.append_colon();
sb.start_object();
sb.append_key_value<"map">(m_baseColorTexture);
sb.append_comma();
sb.append_key_value<"factor">(m_baseColorFactor);
sb.end_object(); sb.end_object();
sb.append_comma();
sb.escape_and_append_with_quotes("normal");
sb.append_colon();
sb.start_object();
sb.append_key_value<"map">(m_normalTexture);
sb.append_comma();
sb.append_key_value<"scale">(m_normalScale);
sb.end_object();
sb.append_comma();
sb.escape_and_append_with_quotes("emissive");
sb.append_colon();
sb.start_object();
sb.append_key_value<"map">(m_emissiveTexture);
sb.append_comma();
sb.append_key_value<"factor">(m_emissiveFactor);
sb.end_object();
sb.append_comma();
sb.escape_and_append_with_quotes("occlusion");
sb.append_colon();
sb.start_object();
sb.append_key_value<"map">(m_occlusionTexture);
sb.append_comma();
sb.append_key_value<"strength">(m_occlusionStrength);
sb.end_object();
sb.append_comma();
sb.escape_and_append_with_quotes("metalicRoughness");
sb.append_colon();
sb.start_object();
sb.append_key_value<"map">(m_metalicRoughness);
sb.append_comma();
sb.append_key_value<"metalicFactor">(m_metalicFactor);
sb.append_comma();
sb.append_key_value<"roughnessFactor">(m_roughnessFactor);
sb.end_object();
sb.append_comma();
sb.escape_and_append_with_quotes("anisotropy");
sb.append_colon();
sb.start_object();
sb.append_key_value<"map">(m_anisotropyTexture);
sb.append_comma();
sb.append_key_value<"strength">(m_anisotropyStrength);
sb.append_comma();
sb.append_key_value<"rotation">(m_anisotropyRotation);
sb.end_object();
sb.append_comma();
sb.escape_and_append_with_quotes("clearcoat");
sb.append_colon();
sb.start_object();
sb.append_key_value<"map">(m_clearcoatTexture);
sb.append_comma();
sb.append_key_value<"factor">(m_clearcoatFactor);
sb.append_comma();
sb.append_key_value<"roughnessMap">(m_clearcoatTexture);
sb.append_comma();
sb.append_key_value<"roughnessFactor">(m_anisotropyRotation);
sb.end_object();
sb.append_comma();
sb.escape_and_append_with_quotes("specular");
sb.append_colon();
sb.start_object();
sb.append_key_value<"map">(m_specularTexture);
sb.append_comma();
sb.append_key_value<"factor">(m_specularFactor);
sb.append_comma();
sb.append_key_value<"colorMap">(m_specularColorTexture);
sb.append_comma();
sb.append_key_value<"colorFactor">(m_specularColorFactor);
sb.end_object();
sb.append_comma();
sb.escape_and_append_with_quotes("thickness");
sb.append_colon();
sb.start_object();
sb.append_key_value<"map">(m_thicknessTexture);
sb.append_comma();
sb.append_key_value<"factor">(m_thicknessFactor);
sb.append_comma();
sb.append_key_value<"attenuiationDistance">(m_attenuationDistance);
sb.append_comma();
sb.append_key_value<"attenuationColor">(m_attenuationColor);
sb.end_object();
sb.append_comma();
sb.escape_and_append_with_quotes("transmission");
sb.append_colon();
sb.start_object();
sb.append_key_value<"map">(transmissionTexture);
sb.append_comma();
sb.append_key_value<"factor">(transmissionFactor);
sb.end_object();
sb.end_object();
const char* str = nullptr; const char* str = nullptr;
auto error = sb.c_str().get(str); auto error = sb.c_str().get(str);
if (error) { if (error) {
@@ -88,6 +309,7 @@ bool KRMaterial::save(Block& data)
// TODO - Report error // TODO - Report error
} }
data.append(str); data.append(str);
return true; return true;
/* /*

View File

@@ -64,6 +64,12 @@ public:
KRMATERIAL_ALPHA_MODE_BLEND // Blended alpha with backface culling KRMATERIAL_ALPHA_MODE_BLEND // Blended alpha with backface culling
} alpha_mode_type; } alpha_mode_type;
typedef enum
{
KRMATERIAL_SHADING_MODEL_UNLIT,
KRMATERIAL_SHADING_MODEL_PBR
} shading_model_type;
struct TransformedTexture struct TransformedTexture
{ {
KRTextureBinding texture; KRTextureBinding texture;
@@ -130,7 +136,7 @@ public:
float m_alphaCutoff{ 0.5f }; float m_alphaCutoff{ 0.5f };
bool m_doubleSided{ false }; bool m_doubleSided{ false };
float m_ior{ 1.5f }; float m_ior{ 1.5f };
bool m_isUnlit{ false }; shading_model_type m_shadingModel = { KRMATERIAL_SHADING_MODEL_PBR };
TransformedTexture m_anisotropyTexture{ KRTexture::TEXTURE_USAGE_MATERIAL_ANISOTROPY }; TransformedTexture m_anisotropyTexture{ KRTexture::TEXTURE_USAGE_MATERIAL_ANISOTROPY };
float m_anisotropyStrength{ 0.f }; float m_anisotropyStrength{ 0.f };
@@ -154,6 +160,9 @@ public:
float m_attenuationDistance{ std::numeric_limits<float>::max() }; float m_attenuationDistance{ std::numeric_limits<float>::max() };
hydra::Vector3 m_attenuationColor{ 1.f, 1.f, 1.f }; hydra::Vector3 m_attenuationColor{ 1.f, 1.f, 1.f };
TransformedTexture transmissionTexture{ KRTexture::TEXTURE_USAGE_MATERIAL_TRANSMISSION };
float transmissionFactor = 0.f;
private: private:
bool getShaderValue(ShaderValue value, float* output) const final; bool getShaderValue(ShaderValue value, float* output) const final;
bool getShaderValue(ShaderValue value, hydra::Vector2* output) const final; bool getShaderValue(ShaderValue value, hydra::Vector2* output) const final;

View File

@@ -84,6 +84,7 @@ public:
TEXTURE_USAGE_MATERIAL_SPECULAR = TEXTURE_USAGE_MATERIAL | 0x100, TEXTURE_USAGE_MATERIAL_SPECULAR = TEXTURE_USAGE_MATERIAL | 0x100,
TEXTURE_USAGE_MATERIAL_SPECULAR_COLOR = TEXTURE_USAGE_MATERIAL | 0x200, TEXTURE_USAGE_MATERIAL_SPECULAR_COLOR = TEXTURE_USAGE_MATERIAL | 0x200,
TEXTURE_USAGE_MATERIAL_THICKNESS = TEXTURE_USAGE_MATERIAL | 0x400, TEXTURE_USAGE_MATERIAL_THICKNESS = TEXTURE_USAGE_MATERIAL | 0x400,
TEXTURE_USAGE_MATERIAL_TRANSMISSION = TEXTURE_USAGE_MATERIAL | 0x800,
} texture_usage_t; } texture_usage_t;