Implement KRNodeProperty to reduce boilerplate needed for adding new node attributes

This commit is contained in:
2025-11-17 22:03:45 -08:00
parent 9b20d1ef1d
commit ead7aade63
4 changed files with 61 additions and 9 deletions

View File

@@ -1,6 +1,6 @@
cmake_minimum_required (VERSION 3.16) cmake_minimum_required (VERSION 3.16)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_EXTENSIONS OFF)

View File

@@ -37,6 +37,7 @@
#include "KROctreeNode.h" #include "KROctreeNode.h"
#include "KRBehavior.h" #include "KRBehavior.h"
#include "KRShaderReflection.h" #include "KRShaderReflection.h"
#include <type_traits>
using namespace kraken; using namespace kraken;
@@ -65,6 +66,59 @@ class XMLNode;
class XMLAttribute; class XMLAttribute;
} }
template <typename T, class config>
class KRNodeProperty
{
public:
static constexpr T defaultVal = config::defaultVal;
static constexpr const char* name = config::name;
KRNodeProperty()
: val(config::defaultVal)
{
}
KRNodeProperty(T& val)
: val(val)
{
}
KRNodeProperty& operator=(const T& v)
{
val = v;
return *this;
}
operator const T& () const
{
return val;
}
void save(tinyxml2::XMLElement* element) const
{
element->SetAttribute(config::name, val);
}
void load(tinyxml2::XMLElement* element)
{
if constexpr (std::is_same<T, float>::value) {
if (element->QueryFloatAttribute(config::name, &val) != tinyxml2::XML_SUCCESS) {
val = config::defaultVal;
}
} else {
static_assert(false, "Typename not implemented.");
}
}
T val;
};
#define KRNODE_PROPERTY(PROP_TYPE, VAR, PROP_DEFAULT, PROP_NAME) \
struct VAR ## _config { \
static constexpr float defaultVal = PROP_DEFAULT; \
static constexpr const char* name = PROP_NAME; \
}; \
KRNodeProperty<PROP_TYPE, VAR ## _config> VAR;
class KRNode class KRNode
: public KRContextObject : public KRContextObject
, public KRReflectedObject , public KRReflectedObject

View File

@@ -50,7 +50,7 @@ using namespace hydra;
void KRSprite::InitNodeInfo(KrNodeInfo* nodeInfo) void KRSprite::InitNodeInfo(KrNodeInfo* nodeInfo)
{ {
KRNode::InitNodeInfo(nodeInfo); KRNode::InitNodeInfo(nodeInfo);
nodeInfo->sprite.alpha = 1.0f; nodeInfo->sprite.alpha = decltype(m_spriteAlpha)::defaultVal;
nodeInfo->sprite.texture = -1; nodeInfo->sprite.texture = -1;
} }
@@ -58,7 +58,6 @@ KRSprite::KRSprite(KRScene& scene, std::string name)
: KRNode(scene, name) : KRNode(scene, name)
, m_spriteTexture(KRTextureBinding(KRTexture::TEXTURE_USAGE_SPRITE)) , m_spriteTexture(KRTextureBinding(KRTexture::TEXTURE_USAGE_SPRITE))
{ {
m_spriteAlpha = 1.0f;
} }
KRSprite::~KRSprite() KRSprite::~KRSprite()
@@ -73,7 +72,7 @@ tinyxml2::XMLElement* KRSprite::saveXML(tinyxml2::XMLNode* parent)
{ {
tinyxml2::XMLElement* e = KRNode::saveXML(parent); tinyxml2::XMLElement* e = KRNode::saveXML(parent);
e->SetAttribute("sprite_texture", m_spriteTexture.getName().c_str()); e->SetAttribute("sprite_texture", m_spriteTexture.getName().c_str());
e->SetAttribute("sprite_alpha", m_spriteAlpha); m_spriteAlpha.save(e);
return e; return e;
} }
@@ -81,9 +80,7 @@ void KRSprite::loadXML(tinyxml2::XMLElement* e)
{ {
KRNode::loadXML(e); KRNode::loadXML(e);
if (e->QueryFloatAttribute("sprite_alpha", &m_spriteAlpha) != tinyxml2::XML_SUCCESS) { m_spriteAlpha.load(e);
m_spriteAlpha = 1.0f;
}
const char* szSpriteTexture = e->Attribute("sprite_texture"); const char* szSpriteTexture = e->Attribute("sprite_texture");
if (szSpriteTexture) { if (szSpriteTexture) {

View File

@@ -62,5 +62,6 @@ protected:
bool getShaderValue(ShaderValue value, float* output) const override; bool getShaderValue(ShaderValue value, float* output) const override;
KRTextureBinding m_spriteTexture; KRTextureBinding m_spriteTexture;
float m_spriteAlpha;
KRNODE_PROPERTY(float, m_spriteAlpha, 1.f, "sprite_alpha");
}; };