Added hydra::Vector3 support to KRNodeProperty

This commit is contained in:
2025-11-19 22:31:33 -08:00
parent 92843b93d2
commit 8c52ed697f
3 changed files with 12 additions and 22 deletions

View File

@@ -67,9 +67,7 @@ KRLight::KRLight(KRScene& scene, std::string name)
: KRNode(scene, name)
, m_flareTexture(KRTextureBinding(KRTexture::TEXTURE_USAGE_LIGHT_FLARE))
{
m_color = Vector3::One();
m_occlusionQuery = 0;
m_decayStart = 0;
// Initialize shadow buffers
m_cShadowBuffers = 0;
@@ -93,9 +91,7 @@ tinyxml2::XMLElement* KRLight::saveXML(tinyxml2::XMLNode* parent)
{
tinyxml2::XMLElement* e = KRNode::saveXML(parent);
m_intensity.save(e);
e->SetAttribute("color_r", m_color.x);
e->SetAttribute("color_g", m_color.y);
e->SetAttribute("color_b", m_color.z);
m_color.save(e);
m_decayStart.save(e);
m_flareSize.save(e);
m_flareOcclusionSize.save(e);
@@ -111,18 +107,8 @@ tinyxml2::XMLElement* KRLight::saveXML(tinyxml2::XMLNode* parent)
void KRLight::loadXML(tinyxml2::XMLElement* e)
{
KRNode::loadXML(e);
float x = 1.0f, y = 1.0f, z = 1.0f;
if (e->QueryFloatAttribute("color_r", &x) != tinyxml2::XML_SUCCESS) {
x = 1.0;
}
if (e->QueryFloatAttribute("color_g", &y) != tinyxml2::XML_SUCCESS) {
y = 1.0;
}
if (e->QueryFloatAttribute("color_b", &z) != tinyxml2::XML_SUCCESS) {
z = 1.0;
}
m_color = Vector3::Create(x, y, z);
m_color.load(e);
m_intensity.load(e);
m_decayStart.load(e);
m_flareSize.load(e);
@@ -248,7 +234,7 @@ void KRLight::render(RenderInfo& ri)
info.modelFormat = ModelFormat::KRENGINE_MODEL_FORMAT_TRIANGLES;
KRPipeline* pParticleShader = m_pContext->getPipelineManager()->getPipeline(*ri.surface, info);
pParticleShader->setPushConstant(ShaderValue::dust_particle_color, m_color * ri.camera->settings.dust_particle_intensity * m_dust_particle_intensity * m_intensity);
pParticleShader->setPushConstant(ShaderValue::dust_particle_color, m_color.val * ri.camera->settings.dust_particle_intensity * m_dust_particle_intensity * m_intensity);
pParticleShader->setPushConstant(ShaderValue::particle_origin, Matrix4::DotWDiv(Matrix4::Invert(particleModelMatrix), Vector3::Zero()));
pParticleShader->bind(ri, particleModelMatrix); // TODO: Pass light index to shader
@@ -300,7 +286,7 @@ void KRLight::render(RenderInfo& ri)
float slice_spacing = (slice_far - slice_near) / slice_count;
pFogShader->setPushConstant(ShaderValue::slice_depth_scale, Vector2::Create(slice_near, slice_spacing));
pFogShader->setPushConstant(ShaderValue::light_color, (m_color * ri.camera->settings.volumetric_environment_intensity * m_intensity * -slice_spacing / 10.0f));
pFogShader->setPushConstant(ShaderValue::light_color, (m_color.val * ri.camera->settings.volumetric_environment_intensity * m_intensity * -slice_spacing / 10.0f));
pFogShader->bind(ri, Matrix4()); // TODO: Pass indexes of lights to shader
m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &m_pContext->getMeshManager()->KRENGINE_VBO_DATA_VOLUMETRIC_LIGHTING, 1.0f);

View File

@@ -79,10 +79,9 @@ protected:
bool getShaderValue(ShaderValue value, float* output) const override;
bool getShaderValue(ShaderValue value, hydra::Vector3* output) const override;
// Properties
KRNODE_PROPERTY(float, m_decayStart, 0.f, "decay_start");
hydra::Vector3 m_color;
KRTextureBinding m_flareTexture;
KRNODE_PROPERTY(hydra::Vector3, m_color, hydra::Vector3({1.f, 1.f, 1.f}), "decay_start");
KRNODE_PROPERTY(float, m_intensity, 1.f, "intensity");
KRNODE_PROPERTY(float, m_flareSize, 0.f, "flare_size");
KRNODE_PROPERTY(float, m_flareOcclusionSize, 0.05f, "flare_occlusion_size");
@@ -91,6 +90,7 @@ protected:
KRNODE_PROPERTY(float, m_dust_particle_density, 0.1f, "dust_particle_density");
KRNODE_PROPERTY(float, m_dust_particle_size, 1.f, "dust_particle_size");
KRNODE_PROPERTY(float, m_dust_particle_intensity, 1.f, "dust_particle_intensity");
KRTextureBinding m_flareTexture;
int m_occlusionQuery; // Occlusion query for attenuating occluded flares

View File

@@ -97,6 +97,8 @@ public:
{
if constexpr (std::is_same<T, bool>::value) {
element->SetAttribute(config::name, val ? "true" : "false");
} else if constexpr (std::is_same<T, hydra::Vector3>::value) {
kraken::setXMLAttribute(config::name, element, val, config::defaultVal);
} else {
element->SetAttribute(config::name, val);
}
@@ -112,6 +114,8 @@ public:
if (element->QueryBoolAttribute(config::name, &val) != tinyxml2::XML_SUCCESS) {
val = config::defaultVal;
}
} else if constexpr (std::is_same<T, hydra::Vector3>::value) {
kraken::getXMLAttribute(config::name, element, config::defaultVal);
} else {
static_assert(false, "Typename not implemented.");
}
@@ -122,7 +126,7 @@ public:
#define KRNODE_PROPERTY(PROP_TYPE, VAR, PROP_DEFAULT, PROP_NAME) \
struct VAR ## _config { \
static constexpr float defaultVal = PROP_DEFAULT; \
static constexpr PROP_TYPE defaultVal = PROP_DEFAULT; \
static constexpr const char* name = PROP_NAME; \
}; \
KRNodeProperty<PROP_TYPE, VAR ## _config> VAR;