diff --git a/CMakeLists.txt b/CMakeLists.txt index 5404a7b..9812ede 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ 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_EXTENSIONS OFF) diff --git a/kraken/nodes/KRNode.h b/kraken/nodes/KRNode.h index cdcb587..a8fb510 100755 --- a/kraken/nodes/KRNode.h +++ b/kraken/nodes/KRNode.h @@ -37,6 +37,7 @@ #include "KROctreeNode.h" #include "KRBehavior.h" #include "KRShaderReflection.h" +#include using namespace kraken; @@ -65,6 +66,59 @@ class XMLNode; class XMLAttribute; } +template +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::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 VAR; + class KRNode : public KRContextObject , public KRReflectedObject diff --git a/kraken/nodes/KRSprite.cpp b/kraken/nodes/KRSprite.cpp index a576946..f73c3f9 100755 --- a/kraken/nodes/KRSprite.cpp +++ b/kraken/nodes/KRSprite.cpp @@ -50,7 +50,7 @@ using namespace hydra; void KRSprite::InitNodeInfo(KrNodeInfo* nodeInfo) { KRNode::InitNodeInfo(nodeInfo); - nodeInfo->sprite.alpha = 1.0f; + nodeInfo->sprite.alpha = decltype(m_spriteAlpha)::defaultVal; nodeInfo->sprite.texture = -1; } @@ -58,7 +58,6 @@ KRSprite::KRSprite(KRScene& scene, std::string name) : KRNode(scene, name) , m_spriteTexture(KRTextureBinding(KRTexture::TEXTURE_USAGE_SPRITE)) { - m_spriteAlpha = 1.0f; } KRSprite::~KRSprite() @@ -73,7 +72,7 @@ tinyxml2::XMLElement* KRSprite::saveXML(tinyxml2::XMLNode* parent) { tinyxml2::XMLElement* e = KRNode::saveXML(parent); e->SetAttribute("sprite_texture", m_spriteTexture.getName().c_str()); - e->SetAttribute("sprite_alpha", m_spriteAlpha); + m_spriteAlpha.save(e); return e; } @@ -81,9 +80,7 @@ void KRSprite::loadXML(tinyxml2::XMLElement* e) { KRNode::loadXML(e); - if (e->QueryFloatAttribute("sprite_alpha", &m_spriteAlpha) != tinyxml2::XML_SUCCESS) { - m_spriteAlpha = 1.0f; - } + m_spriteAlpha.load(e); const char* szSpriteTexture = e->Attribute("sprite_texture"); if (szSpriteTexture) { @@ -164,4 +161,4 @@ bool KRSprite::getShaderValue(ShaderValue value, float* output) const return true; } return KRNode::getShaderValue(value, output); -} \ No newline at end of file +} diff --git a/kraken/nodes/KRSprite.h b/kraken/nodes/KRSprite.h index 44290a1..be643a6 100755 --- a/kraken/nodes/KRSprite.h +++ b/kraken/nodes/KRSprite.h @@ -62,5 +62,6 @@ protected: bool getShaderValue(ShaderValue value, float* output) const override; KRTextureBinding m_spriteTexture; - float m_spriteAlpha; + + KRNODE_PROPERTY(float, m_spriteAlpha, 1.f, "sprite_alpha"); };