diff --git a/kraken/nodes/KRNode.h b/kraken/nodes/KRNode.h index 89b6d16..3acbbdf 100755 --- a/kraken/nodes/KRNode.h +++ b/kraken/nodes/KRNode.h @@ -33,6 +33,7 @@ #include "resources/KRResource.h" #include "resources/KRResourceRequest.h" +#include "resources/KRResourceBinding.h" #include "KRViewport.h" #include "KROctreeNode.h" #include "KRBehavior.h" @@ -70,7 +71,7 @@ template class KRNodeProperty { public: - static constexpr T defaultVal = config::defaultVal; + static constexpr decltype(config::defaultVal) defaultVal = config::defaultVal; static constexpr const char* name = config::name; KRNodeProperty() : val(config::defaultVal) @@ -99,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_base_of::value) { + element->SetAttribute(config::name, val.getName().c_str()); } else { element->SetAttribute(config::name, val); } @@ -116,6 +119,13 @@ public: } } else if constexpr (std::is_same::value) { kraken::getXMLAttribute(config::name, element, config::defaultVal); + } else if constexpr (std::is_base_of::value) { + const char* name = element->Attribute(config::name); + if (name) { + val.set(name); + } else { + val.clear(); + } } else { static_assert(false, "Typename not implemented."); } @@ -126,7 +136,7 @@ public: #define KRNODE_PROPERTY(PROP_TYPE, VAR, PROP_DEFAULT, PROP_NAME) \ struct VAR ## _config { \ - static constexpr PROP_TYPE defaultVal = PROP_DEFAULT; \ + static constexpr decltype(PROP_DEFAULT) defaultVal = PROP_DEFAULT; \ static constexpr const char* name = PROP_NAME; \ }; \ KRNodeProperty VAR; diff --git a/kraken/nodes/KRSprite.cpp b/kraken/nodes/KRSprite.cpp index f73c3f9..0828207 100755 --- a/kraken/nodes/KRSprite.cpp +++ b/kraken/nodes/KRSprite.cpp @@ -56,7 +56,6 @@ void KRSprite::InitNodeInfo(KrNodeInfo* nodeInfo) KRSprite::KRSprite(KRScene& scene, std::string name) : KRNode(scene, name) - , m_spriteTexture(KRTextureBinding(KRTexture::TEXTURE_USAGE_SPRITE)) { } @@ -71,7 +70,7 @@ std::string KRSprite::getElementName() tinyxml2::XMLElement* KRSprite::saveXML(tinyxml2::XMLNode* parent) { tinyxml2::XMLElement* e = KRNode::saveXML(parent); - e->SetAttribute("sprite_texture", m_spriteTexture.getName().c_str()); + m_spriteTexture.save(e); m_spriteAlpha.save(e); return e; } @@ -80,19 +79,13 @@ void KRSprite::loadXML(tinyxml2::XMLElement* e) { KRNode::loadXML(e); + m_spriteTexture.load(e); m_spriteAlpha.load(e); - - const char* szSpriteTexture = e->Attribute("sprite_texture"); - if (szSpriteTexture) { - m_spriteTexture.set(szSpriteTexture); - } else { - m_spriteTexture.clear(); - } } void KRSprite::setSpriteTexture(std::string sprite_texture) { - m_spriteTexture.set(sprite_texture); + m_spriteTexture.val.set(sprite_texture); } void KRSprite::setSpriteAlpha(float alpha) @@ -114,7 +107,7 @@ void KRSprite::getResourceBindings(std::list& bindings) { KRNode::getResourceBindings(bindings); - bindings.push_back(&m_spriteTexture); + bindings.push_back(&m_spriteTexture.val); } void KRSprite::render(RenderInfo& ri) @@ -123,7 +116,7 @@ void KRSprite::render(RenderInfo& ri) if (ri.renderPass->getType() == RenderPassType::RENDER_PASS_ADDITIVE_PARTICLES) { if (m_spriteAlpha > 0.0f) { - if (m_spriteTexture.isBound()) { + if (m_spriteTexture.val.isBound()) { // TODO - Sprites are currently additive only. Need to expose this and allow for multiple blending modes KRMeshManager::KRVBOData& vertices = m_pContext->getMeshManager()->KRENGINE_VBO_DATA_2D_SQUARE_VERTICES; @@ -143,7 +136,7 @@ void KRSprite::render(RenderInfo& ri) info.modelFormat = ModelFormat::KRENGINE_MODEL_FORMAT_STRIP; KRPipeline* pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); - pShader->setImageBinding("diffuseTexture", m_spriteTexture.get(), m_pContext->getSamplerManager()->DEFAULT_CLAMPED_SAMPLER); + pShader->setImageBinding("diffuseTexture", m_spriteTexture.val.get(), m_pContext->getSamplerManager()->DEFAULT_CLAMPED_SAMPLER); pShader->bind(ri, getModelMatrix()); m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &vertices, 1.0f); diff --git a/kraken/nodes/KRSprite.h b/kraken/nodes/KRSprite.h index be643a6..903439a 100755 --- a/kraken/nodes/KRSprite.h +++ b/kraken/nodes/KRSprite.h @@ -61,7 +61,6 @@ protected: bool getShaderValue(ShaderValue value, float* output) const override; - KRTextureBinding m_spriteTexture; - + KRNODE_PROPERTY(KRTextureBinding, m_spriteTexture, KRTexture::TEXTURE_USAGE_SPRITE, "sprite_texture"); KRNODE_PROPERTY(float, m_spriteAlpha, 1.f, "sprite_alpha"); };