From c075148eade7781c1f4b6711d847c0e9de026dc7 Mon Sep 17 00:00:00 2001 From: Kearwood Gilbert Date: Mon, 24 Nov 2025 19:31:26 -0800 Subject: [PATCH] Add hydra::AABB support to KRNodeProperty. KRLODGroup now using KRNodeProperty. --- kraken/KRHelpers.cpp | 30 +++++++++++++++ kraken/KRHelpers.h | 2 + kraken/nodes/KRLODGroup.cpp | 76 +++++++------------------------------ kraken/nodes/KRLODGroup.h | 8 ++-- kraken/nodes/KRNode.h | 6 ++- 5 files changed, 54 insertions(+), 68 deletions(-) diff --git a/kraken/KRHelpers.cpp b/kraken/KRHelpers.cpp index e7e692c..ebfcf41 100644 --- a/kraken/KRHelpers.cpp +++ b/kraken/KRHelpers.cpp @@ -60,4 +60,34 @@ const Vector3 getXMLAttribute(const std::string& base_name, tinyxml2::XMLElement } } +void setXMLAttribute(const std::string& base_name, tinyxml2::XMLElement* e, const AABB& value, const AABB& default_value) +{ + // TODO - Increase number of digits after the decimal in floating point format (6 -> 12?) + // FINDME, TODO - This needs optimization... + if (value != default_value) { + e->SetAttribute((base_name + "_min_x").c_str(), value.min.x); + e->SetAttribute((base_name + "_min_y").c_str(), value.min.y); + e->SetAttribute((base_name + "_min_z").c_str(), value.min.z); + + e->SetAttribute((base_name + "_max_x").c_str(), value.max.x); + e->SetAttribute((base_name + "_max_y").c_str(), value.max.y); + e->SetAttribute((base_name + "_max_z").c_str(), value.max.z); + } +} + +const AABB getXMLAttribute(const std::string& base_name, tinyxml2::XMLElement* e, const AABB& default_value) +{ + AABB value; + if (e->QueryFloatAttribute((base_name + "_min_x").c_str(), &value.min.x) == tinyxml2::XML_SUCCESS + && e->QueryFloatAttribute((base_name + "_min_y").c_str(), &value.min.y) == tinyxml2::XML_SUCCESS + && e->QueryFloatAttribute((base_name + "_min_z").c_str(), &value.min.z) == tinyxml2::XML_SUCCESS + && e->QueryFloatAttribute((base_name + "_max_x").c_str(), &value.max.x) == tinyxml2::XML_SUCCESS + && e->QueryFloatAttribute((base_name + "_max_y").c_str(), &value.max.y) == tinyxml2::XML_SUCCESS + && e->QueryFloatAttribute((base_name + "_max_z").c_str(), &value.max.z) == tinyxml2::XML_SUCCESS) { + return value; + } else { + return default_value; + } +} + } // namespace kraken diff --git a/kraken/KRHelpers.h b/kraken/KRHelpers.h index 3d56df8..f529528 100644 --- a/kraken/KRHelpers.h +++ b/kraken/KRHelpers.h @@ -48,6 +48,8 @@ float const D2R = PI * 2 / 360; namespace kraken { void setXMLAttribute(const std::string& base_name, ::tinyxml2::XMLElement* e, const hydra::Vector3& value, const hydra::Vector3& default_value); +void setXMLAttribute(const std::string& base_name, ::tinyxml2::XMLElement* e, const hydra::AABB& value, const hydra::AABB& default_value); const hydra::Vector3 getXMLAttribute(const std::string& base_name, ::tinyxml2::XMLElement* e, const hydra::Vector3& default_value); +const hydra::AABB getXMLAttribute(const std::string& base_name, ::tinyxml2::XMLElement* e, const hydra::AABB& default_value); } // namespace kraken diff --git a/kraken/nodes/KRLODGroup.cpp b/kraken/nodes/KRLODGroup.cpp index 647d7f3..4649918 100755 --- a/kraken/nodes/KRLODGroup.cpp +++ b/kraken/nodes/KRLODGroup.cpp @@ -39,19 +39,15 @@ using namespace hydra; void KRLODGroup::InitNodeInfo(KrNodeInfo* nodeInfo) { KRNode::InitNodeInfo(nodeInfo); - nodeInfo->lod_group.min_distance = 0.0f; - nodeInfo->lod_group.max_distance = 0.0f; - nodeInfo->lod_group.reference_min = Vector3::Zero(); - nodeInfo->lod_group.reference_max = Vector3::Zero(); + nodeInfo->lod_group.min_distance = decltype(m_min_distance)::defaultVal; + nodeInfo->lod_group.max_distance = decltype(m_max_distance)::defaultVal; + nodeInfo->lod_group.reference_min = decltype(m_reference)::defaultVal.min; + nodeInfo->lod_group.reference_max = decltype(m_reference)::defaultVal.max; nodeInfo->lod_group.use_world_units = true; } KRLODGroup::KRLODGroup(KRScene& scene, std::string name) : KRNode(scene, name) { - m_min_distance = 0.0f; - m_max_distance = 0.0f; - m_reference = AABB::Create(Vector3::Zero(), Vector3::Zero()); - m_use_world_units = true; } KRLODGroup::~KRLODGroup() @@ -65,66 +61,20 @@ std::string KRLODGroup::getElementName() tinyxml2::XMLElement* KRLODGroup::saveXML(tinyxml2::XMLNode* parent) { tinyxml2::XMLElement* e = KRNode::saveXML(parent); - e->SetAttribute("min_distance", m_min_distance); - e->SetAttribute("max_distance", m_max_distance); - - e->SetAttribute("reference_min_x", m_reference.min.x); - e->SetAttribute("reference_min_y", m_reference.min.y); - e->SetAttribute("reference_min_z", m_reference.min.z); - - - e->SetAttribute("reference_max_x", m_reference.max.x); - e->SetAttribute("reference_max_y", m_reference.max.y); - e->SetAttribute("reference_max_z", m_reference.max.z); - - e->SetAttribute("use_world_units", m_use_world_units ? "true" : "false"); + m_min_distance.save(e); + m_max_distance.save(e); + m_reference.save(e); + m_use_world_units.save(e); return e; } void KRLODGroup::loadXML(tinyxml2::XMLElement* e) { KRNode::loadXML(e); - - m_min_distance = 0.0f; - if (e->QueryFloatAttribute("min_distance", &m_min_distance) != tinyxml2::XML_SUCCESS) { - m_min_distance = 0.0f; - } - - m_max_distance = 0.0f; - if (e->QueryFloatAttribute("max_distance", &m_max_distance) != tinyxml2::XML_SUCCESS) { - m_max_distance = 0.0f; - } - - - float x = 0.0f, y = 0.0f, z = 0.0f; - if (e->QueryFloatAttribute("reference_min_x", &x) != tinyxml2::XML_SUCCESS) { - x = 0.0f; - } - if (e->QueryFloatAttribute("reference_min_y", &y) != tinyxml2::XML_SUCCESS) { - y = 0.0f; - } - if (e->QueryFloatAttribute("reference_min_z", &z) != tinyxml2::XML_SUCCESS) { - z = 0.0f; - } - - m_reference.min = Vector3::Create(x, y, z); - - x = 0.0f; y = 0.0f; z = 0.0f; - if (e->QueryFloatAttribute("reference_max_x", &x) != tinyxml2::XML_SUCCESS) { - x = 0.0f; - } - if (e->QueryFloatAttribute("reference_max_y", &y) != tinyxml2::XML_SUCCESS) { - y = 0.0f; - } - if (e->QueryFloatAttribute("reference_max_z", &z) != tinyxml2::XML_SUCCESS) { - z = 0.0f; - } - m_reference.max = Vector3::Create(x, y, z); - - m_use_world_units = true; - if (e->QueryBoolAttribute("use_world_units", &m_use_world_units) != tinyxml2::XML_SUCCESS) { - m_use_world_units = true; - } + m_min_distance.load(e); + m_max_distance.load(e); + m_reference.load(e); + m_use_world_units.load(e); } @@ -152,7 +102,7 @@ KRNode::LodVisibility KRLODGroup::calcLODVisibility(const KRViewport& viewport) Vector3 world_camera_position = viewport.getCameraPosition(); Vector3 local_camera_position = worldToLocal(world_camera_position); - Vector3 local_reference_point = m_reference.nearestPoint(local_camera_position); + Vector3 local_reference_point = m_reference.val.nearestPoint(local_camera_position); if (m_use_world_units) { Vector3 world_reference_point = localToWorld(local_reference_point); diff --git a/kraken/nodes/KRLODGroup.h b/kraken/nodes/KRLODGroup.h index eea4644..a43310b 100755 --- a/kraken/nodes/KRLODGroup.h +++ b/kraken/nodes/KRLODGroup.h @@ -57,8 +57,8 @@ public: LodVisibility calcLODVisibility(const KRViewport& viewport); private: - float m_min_distance; - float m_max_distance; - hydra::AABB m_reference; // Point of reference, used for distance calculation. Usually set to the bounding box center - bool m_use_world_units; + KRNODE_PROPERTY(float, m_min_distance, 0.f, "min_distance"); + KRNODE_PROPERTY(float, m_max_distance, 0.f, "max_distance"); + KRNODE_PROPERTY(hydra::AABB, m_reference, hydra::AABB({ 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}), "reference"); // Point of reference, used for distance calculation. Usually set to the bounding box center + KRNODE_PROPERTY(bool, m_use_world_units, true, "use_world_units"); }; diff --git a/kraken/nodes/KRNode.h b/kraken/nodes/KRNode.h index 9d3adf8..6188c98 100755 --- a/kraken/nodes/KRNode.h +++ b/kraken/nodes/KRNode.h @@ -100,6 +100,8 @@ public: element->SetAttribute(config::name, val ? "true" : "false"); } else if constexpr (std::is_same::value) { kraken::setXMLAttribute(config::name, element, val, config::defaultVal); + } else if constexpr (std::is_same::value) { + kraken::setXMLAttribute(config::name, element, val, config::defaultVal); } else if constexpr (std::is_same::value) { element->SetAttribute(config::name, val.c_str()); } else if constexpr (std::is_base_of::value) { @@ -128,7 +130,9 @@ public: val = config::defaultVal; } } else if constexpr (std::is_same::value) { - kraken::getXMLAttribute(config::name, element, config::defaultVal); + val = kraken::getXMLAttribute(config::name, element, config::defaultVal); + } else if constexpr (std::is_same::value) { + val = kraken::getXMLAttribute(config::name, element, config::defaultVal); } else if constexpr (std::is_same::value) { const char* name = element->Attribute(config::name); if (name) {