Add hydra::AABB support to KRNodeProperty. KRLODGroup now using KRNodeProperty.

This commit is contained in:
2025-11-24 19:31:26 -08:00
parent a7cd068e39
commit c075148ead
5 changed files with 54 additions and 68 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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");
};

View File

@@ -100,6 +100,8 @@ public:
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 if constexpr (std::is_same<T, hydra::AABB>::value) {
kraken::setXMLAttribute(config::name, element, val, config::defaultVal);
} else if constexpr (std::is_same<T, std::string>::value) {
element->SetAttribute(config::name, val.c_str());
} else if constexpr (std::is_base_of<KRResourceBinding, T>::value) {
@@ -128,7 +130,9 @@ public:
val = config::defaultVal;
}
} else if constexpr (std::is_same<T, hydra::Vector3>::value) {
kraken::getXMLAttribute(config::name, element, config::defaultVal);
val = kraken::getXMLAttribute(config::name, element, config::defaultVal);
} else if constexpr (std::is_same<T, hydra::AABB>::value) {
val = kraken::getXMLAttribute(config::name, element, config::defaultVal);
} else if constexpr (std::is_same<T, std::string>::value) {
const char* name = element->Attribute(config::name);
if (name) {