From dbb6e983073b0e7cf667d5a82737f66ebbc5cb6b Mon Sep 17 00:00:00 2001 From: Kearwood Gilbert Date: Tue, 11 Nov 2025 14:13:17 -0800 Subject: [PATCH] Implemented KRResourceBinding and KRTextureBinding, apply to KRSprite --- kraken/CMakeLists.txt | 2 + kraken/nodes/KRSprite.cpp | 34 ++----- kraken/nodes/KRSprite.h | 4 +- kraken/resources/KRResourceBinding.cpp | 92 +++++++++++++++++++ kraken/resources/KRResourceBinding.h | 60 ++++++++++++ kraken/resources/texture/KRTextureBinding.cpp | 53 +++++++++++ kraken/resources/texture/KRTextureBinding.h | 46 ++++++++++ 7 files changed, 265 insertions(+), 26 deletions(-) create mode 100644 kraken/resources/KRResourceBinding.cpp create mode 100644 kraken/resources/KRResourceBinding.h create mode 100644 kraken/resources/texture/KRTextureBinding.cpp create mode 100644 kraken/resources/texture/KRTextureBinding.h diff --git a/kraken/CMakeLists.txt b/kraken/CMakeLists.txt index ec2dcf4..ddce0ac 100644 --- a/kraken/CMakeLists.txt +++ b/kraken/CMakeLists.txt @@ -11,6 +11,7 @@ add_sources(resources/KRResource+blend.cpp) add_sources(resources/KRResource+obj.cpp) add_private_headers(resources/KRResource.h) add_source_and_header(resources/KRResource) +add_source_and_header(resources/KRResourceBinding) add_source_and_header(resources/KRResourceManager) add_source_and_header(resources/animation/KRAnimation) add_source_and_header(resources/animation/KRAnimationAttribute) @@ -35,6 +36,7 @@ add_source_and_header(resources/shader/KRShader) add_source_and_header(resources/shader/KRShaderManager) add_source_and_header(resources/source/KRSource) add_source_and_header(resources/source/KRSourceManager) +add_source_and_header(resources/texture/KRTextureBinding) add_source_and_header(resources/texture/KRTexture) add_source_and_header(resources/texture/KRTexture2D) add_source_and_header(resources/texture/KRTextureAnimated) diff --git a/kraken/nodes/KRSprite.cpp b/kraken/nodes/KRSprite.cpp index 2aecff7..e9bd033 100755 --- a/kraken/nodes/KRSprite.cpp +++ b/kraken/nodes/KRSprite.cpp @@ -56,8 +56,6 @@ void KRSprite::InitNodeInfo(KrNodeInfo* nodeInfo) KRSprite::KRSprite(KRScene& scene, std::string name) : KRNode(scene, name) { - m_spriteTexture = ""; - m_pSpriteTexture = NULL; m_spriteAlpha = 1.0f; } @@ -72,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.c_str()); + e->SetAttribute("sprite_texture", m_spriteTexture.getName().c_str()); e->SetAttribute("sprite_alpha", m_spriteAlpha); return e; } @@ -87,17 +85,15 @@ void KRSprite::loadXML(tinyxml2::XMLElement* e) const char* szSpriteTexture = e->Attribute("sprite_texture"); if (szSpriteTexture) { - m_spriteTexture = szSpriteTexture; + m_spriteTexture.setName(szSpriteTexture); } else { - m_spriteTexture = ""; + m_spriteTexture.clear(); } - m_pSpriteTexture = NULL; } void KRSprite::setSpriteTexture(std::string sprite_texture) { - m_spriteTexture = sprite_texture; - m_pSpriteTexture = NULL; + m_spriteTexture.setName(sprite_texture); } void KRSprite::setSpriteAlpha(float alpha) @@ -122,14 +118,10 @@ void KRSprite::render(RenderInfo& ri) if (m_lod_visible >= LOD_VISIBILITY_PRESTREAM && ri.renderPass->getType() == RenderPassType::RENDER_PASS_PRESTREAM) { // Pre-stream sprites, even if the alpha is zero - if (m_spriteTexture.size() && m_pSpriteTexture == NULL) { - if (!m_pSpriteTexture && m_spriteTexture.size()) { - m_pSpriteTexture = getContext().getTextureManager()->getTexture(m_spriteTexture); - } - } + m_spriteTexture.load(&getContext()); - if (m_pSpriteTexture) { - m_pSpriteTexture->resetPoolExpiry(0.0f, KRTexture::TEXTURE_USAGE_SPRITE); + if (m_spriteTexture.isLoaded()) { + m_spriteTexture.get()->resetPoolExpiry(0.0f, KRTexture::TEXTURE_USAGE_SPRITE); } } @@ -139,14 +131,8 @@ void KRSprite::render(RenderInfo& ri) if (ri.renderPass->getType() == RenderPassType::RENDER_PASS_ADDITIVE_PARTICLES) { - if (m_spriteTexture.size() && m_spriteAlpha > 0.0f) { - - - if (!m_pSpriteTexture && m_spriteTexture.size()) { - m_pSpriteTexture = getContext().getTextureManager()->getTexture(m_spriteTexture); - } - - if (m_pSpriteTexture) { + if (m_spriteAlpha > 0.0f) { + if (m_spriteTexture.isLoaded()) { // 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; @@ -166,7 +152,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_pSpriteTexture, m_pContext->getSamplerManager()->DEFAULT_CLAMPED_SAMPLER); + pShader->setImageBinding("diffuseTexture", m_spriteTexture.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 4071c0d..69e3d8e 100755 --- a/kraken/nodes/KRSprite.h +++ b/kraken/nodes/KRSprite.h @@ -34,6 +34,7 @@ #include "resources/KRResource.h" #include "KRNode.h" #include "resources/texture/KRTexture.h" +#include "resources/texture/KRTextureBinding.h" class KRSprite : public KRNode { @@ -59,7 +60,6 @@ protected: bool getShaderValue(ShaderValue value, float* output) const override; - std::string m_spriteTexture; - KRTexture* m_pSpriteTexture; + KRTextureBinding m_spriteTexture; float m_spriteAlpha; }; diff --git a/kraken/resources/KRResourceBinding.cpp b/kraken/resources/KRResourceBinding.cpp new file mode 100644 index 0000000..a6ec00d --- /dev/null +++ b/kraken/resources/KRResourceBinding.cpp @@ -0,0 +1,92 @@ +// +// KRResource.cpp +// Kraken Engine +// +// Copyright 2025 Kearwood Gilbert. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other materials +// provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY KEARWOOD GILBERT ''AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KEARWOOD GILBERT OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// The views and conclusions contained in the software and documentation are those of the +// authors and should not be interpreted as representing official policies, either expressed +// or implied, of Kearwood Gilbert. +// + +#include "KREngine-common.h" +#include "KRResourceBinding.h" +#include "KRContext.h" + +KRResourceBinding::KRResourceBinding(std::string& name) + : m_name(name) + , m_resource(nullptr) +{ +} + +KRResourceBinding::KRResourceBinding() + : m_resource(nullptr) +{ +} + +KRResourceBinding::~KRResourceBinding() +{ + m_resource = nullptr; + m_name.clear(); +} + +KRResource* KRResourceBinding::get() +{ + return m_resource; +} + +void KRResourceBinding::set(KRResource* resource) +{ + if (resource == nullptr) { + m_resource = nullptr; + m_name.clear(); + return; + } + + m_resource = resource; + m_name = resource->getName(); +} + +const std::string& KRResourceBinding::getName() const +{ + return m_name; +} + +void KRResourceBinding::setName(const std::string& name) +{ + if (m_name == name) { + return; + } + m_name = name; + m_resource = nullptr; +} + +void KRResourceBinding::clear() +{ + set(nullptr); +} + +bool KRResourceBinding::isLoaded() const +{ + return m_resource != nullptr; +} \ No newline at end of file diff --git a/kraken/resources/KRResourceBinding.h b/kraken/resources/KRResourceBinding.h new file mode 100644 index 0000000..f9708d4 --- /dev/null +++ b/kraken/resources/KRResourceBinding.h @@ -0,0 +1,60 @@ +// +// KRResourceBinding.h +// Kraken Engine +// +// Copyright 2025 Kearwood Gilbert. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other materials +// provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY KEARWOOD GILBERT ''AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KEARWOOD GILBERT OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// The views and conclusions contained in the software and documentation are those of the +// authors and should not be interpreted as representing official policies, either expressed +// or implied, of Kearwood Gilbert. +// + +#pragma once + +#include "KREngine-common.h" +#include "KRContextObject.h" + +class KRResource; +class KRContext; + +class KRResourceBinding +{ +public: + KRResourceBinding(std::string& name); + KRResourceBinding(); + ~KRResourceBinding(); + + KRResource* get(); + void set(KRResource* resource); + void clear(); + + const std::string& getName() const; + void setName(const std::string& name); + + virtual bool load(KRContext* context) = 0; + bool isLoaded() const; + +protected: + KRResource* m_resource; + std::string m_name; +}; diff --git a/kraken/resources/texture/KRTextureBinding.cpp b/kraken/resources/texture/KRTextureBinding.cpp new file mode 100644 index 0000000..28efd17 --- /dev/null +++ b/kraken/resources/texture/KRTextureBinding.cpp @@ -0,0 +1,53 @@ +// +// KRTextureBinding.cpp +// Kraken Engine +// +// Copyright 2025 Kearwood Gilbert. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other materials +// provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY KEARWOOD GILBERT ''AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KEARWOOD GILBERT OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// The views and conclusions contained in the software and documentation are those of the +// authors and should not be interpreted as representing official policies, either expressed +// or implied, of Kearwood Gilbert. +// + +#include "KREngine-common.h" +#include "KRContext.h" +#include "KRTexture.h" +#include "KRTextureBinding.h" + +KRTexture* KRTextureBinding::get() +{ + return static_cast(m_resource); +} + +bool KRTextureBinding::load(KRContext* context) +{ + if (m_name.size() == 0) { + return true; + } + if (m_resource != nullptr) { + return true; + } + m_resource = context->getTextureManager()->getTexture(m_name); + + return (m_resource != nullptr); +} \ No newline at end of file diff --git a/kraken/resources/texture/KRTextureBinding.h b/kraken/resources/texture/KRTextureBinding.h new file mode 100644 index 0000000..5288fc6 --- /dev/null +++ b/kraken/resources/texture/KRTextureBinding.h @@ -0,0 +1,46 @@ +// +// KRTextureBinding.h +// Kraken Engine +// +// Copyright 2025 Kearwood Gilbert. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other materials +// provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY KEARWOOD GILBERT ''AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KEARWOOD GILBERT OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// The views and conclusions contained in the software and documentation are those of the +// authors and should not be interpreted as representing official policies, either expressed +// or implied, of Kearwood Gilbert. +// + +#pragma once + +#include "KREngine-common.h" +#include "resources/KRResourceBinding.h" + +class KRTexture; + +class KRTextureBinding : public KRResourceBinding +{ +public: + KRTexture* get(); + + bool load(KRContext* context) override final; +private: +}; \ No newline at end of file