From 0a66f11ff03731e02f904f9088872df230135802 Mon Sep 17 00:00:00 2001 From: Kearwood Gilbert Date: Sat, 21 Sep 2024 23:32:38 -0700 Subject: [PATCH] Implemented API for model node creation. hello_cube smoke test now adds a model node and assigns the built-in cube model --- kraken/KRSurface.cpp | 4 +- kraken/nodes/KRAmbientZone.h | 2 +- kraken/nodes/KRAudioSource.h | 2 +- kraken/nodes/KRBone.h | 2 +- kraken/nodes/KRCollider.h | 2 +- kraken/nodes/KRDirectionalLight.h | 2 +- kraken/nodes/KRLight.h | 2 +- kraken/nodes/KRModel.cpp | 49 ++++++++++++++++++++++-- kraken/nodes/KRModel.h | 4 +- kraken/nodes/KRNode.cpp | 2 +- kraken/nodes/KRNode.h | 2 +- kraken/nodes/KRParticleSystem.h | 10 ++--- kraken/nodes/KRParticleSystemNewtonian.h | 2 +- kraken/nodes/KRPointLight.h | 2 +- kraken/nodes/KRReverbZone.h | 2 +- kraken/nodes/KRSprite.h | 10 ++--- tests/smoke/hello_cube/hello_cube.cpp | 25 +++++++++++- 17 files changed, 95 insertions(+), 29 deletions(-) diff --git a/kraken/KRSurface.cpp b/kraken/KRSurface.cpp index 2c3e888..e69adb2 100644 --- a/kraken/KRSurface.cpp +++ b/kraken/KRSurface.cpp @@ -190,8 +190,8 @@ KrResult KRSurface::createSwapChain() RenderPassInfo info{}; info.finalPass = false; - // info.type = RenderPassType::RENDER_PASS_PRESTREAM; - // m_renderGraph->addRenderPass(*device, info); + info.type = RenderPassType::RENDER_PASS_PRESTREAM; + m_renderGraph->addRenderPass(*device, info); for (int shadow_index = 0; shadow_index < shadow_buffer_count; shadow_index++) { info.depthAttachment.id = attachment_shadow_cascades[shadow_index]; diff --git a/kraken/nodes/KRAmbientZone.h b/kraken/nodes/KRAmbientZone.h index 62bebf8..450d323 100755 --- a/kraken/nodes/KRAmbientZone.h +++ b/kraken/nodes/KRAmbientZone.h @@ -45,7 +45,7 @@ public: virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent); virtual void loadXML(tinyxml2::XMLElement* e); - void render(RenderInfo& ri); + void render(RenderInfo& ri) override; std::string getZone(); void setZone(const std::string& zone); diff --git a/kraken/nodes/KRAudioSource.h b/kraken/nodes/KRAudioSource.h index 2c86e58..f13dd7d 100755 --- a/kraken/nodes/KRAudioSource.h +++ b/kraken/nodes/KRAudioSource.h @@ -50,7 +50,7 @@ public: virtual void loadXML(tinyxml2::XMLElement* e); virtual void physicsUpdate(float deltaTime); - void render(RenderInfo& ri); + void render(RenderInfo& ri) override; // ---- Audio Playback Controls ---- diff --git a/kraken/nodes/KRBone.h b/kraken/nodes/KRBone.h index bb573a1..db1cc4f 100755 --- a/kraken/nodes/KRBone.h +++ b/kraken/nodes/KRBone.h @@ -48,7 +48,7 @@ public: virtual void loadXML(tinyxml2::XMLElement* e); virtual hydra::AABB getBounds(); - void render(RenderInfo& ri); + void render(RenderInfo& ri) override; void setBindPose(const hydra::Matrix4& pose); const hydra::Matrix4& getBindPose(); diff --git a/kraken/nodes/KRCollider.h b/kraken/nodes/KRCollider.h index 2b27ef3..5db781c 100755 --- a/kraken/nodes/KRCollider.h +++ b/kraken/nodes/KRCollider.h @@ -70,7 +70,7 @@ public: float getAudioOcclusion(); void setAudioOcclusion(float audio_occlusion); - void render(RenderInfo& ri); + void render(RenderInfo& ri) override; private: KRMesh* m_model; diff --git a/kraken/nodes/KRDirectionalLight.h b/kraken/nodes/KRDirectionalLight.h index 5c9e51f..0fa5b35 100755 --- a/kraken/nodes/KRDirectionalLight.h +++ b/kraken/nodes/KRDirectionalLight.h @@ -46,7 +46,7 @@ public: hydra::Vector3 getLocalLightDirection(); hydra::Vector3 getWorldLightDirection(); - virtual void render(RenderInfo& ri); + virtual void render(RenderInfo& ri) override; virtual hydra::AABB getBounds(); protected: diff --git a/kraken/nodes/KRLight.h b/kraken/nodes/KRLight.h index 4d2128a..aed1da2 100755 --- a/kraken/nodes/KRLight.h +++ b/kraken/nodes/KRLight.h @@ -64,7 +64,7 @@ public: void setFlareOcclusionSize(float occlusion_size); void deleteBuffers(); - virtual void render(RenderInfo& ri); + virtual void render(RenderInfo& ri) override; int getShadowBufferCount(); int* getShadowTextures(); diff --git a/kraken/nodes/KRModel.cpp b/kraken/nodes/KRModel.cpp index 3d65c5a..732df33 100755 --- a/kraken/nodes/KRModel.cpp +++ b/kraken/nodes/KRModel.cpp @@ -44,9 +44,9 @@ void KRModel::InitNodeInfo(KrNodeInfo* nodeInfo) { KRNode::InitNodeInfo(nodeInfo); nodeInfo->model.faces_camera = false; - nodeInfo->model.light_map_texture = -1; + nodeInfo->model.light_map_texture = KR_NULL_HANDLE; nodeInfo->model.lod_min_coverage = 0.0f; - nodeInfo->model.mesh = -1; + nodeInfo->model.mesh = KR_NULL_HANDLE; nodeInfo->model.receives_shadow = true; nodeInfo->model.rim_color = Vector3::Zero(); nodeInfo->model.rim_power = 0.0f; @@ -114,6 +114,50 @@ KRModel::~KRModel() } +KrResult KRModel::update(const KrNodeInfo* nodeInfo) +{ + KrResult res = KRNode::update(nodeInfo); + if (res != KR_SUCCESS) { + return res; + } + m_faces_camera = nodeInfo->model.faces_camera; + m_min_lod_coverage = nodeInfo->model.lod_min_coverage; + m_receivesShadow = nodeInfo->model.receives_shadow; + m_rim_color = nodeInfo->model.rim_color; + m_rim_power = nodeInfo->model.rim_power; + + KRTexture* light_map_texture = nullptr; + if (nodeInfo->model.light_map_texture != KR_NULL_HANDLE) { + res = m_pContext->getMappedResource(nodeInfo->model.light_map_texture, &light_map_texture); + if (res != KR_SUCCESS) { + return res; + } + } + m_pLightMap = light_map_texture; + if (m_pLightMap) { + m_lightMap = m_pLightMap->getName(); + } else { + m_lightMap = ""; + } + + KRMesh* mesh = nullptr; + if (nodeInfo->model.mesh != KR_NULL_HANDLE) { + res = m_pContext->getMappedResource(nodeInfo->model.mesh, &mesh); + if (res != KR_SUCCESS) { + return res; + } + } + if (mesh != nullptr) { + m_models.clear(); + m_model_name = mesh->getName(); + } else { + m_models.clear(); + m_model_name = ""; + } + + return KR_SUCCESS; +} + std::string KRModel::getElementName() { return "model"; @@ -197,7 +241,6 @@ void KRModel::loadModel() void KRModel::render(KRNode::RenderInfo& ri) { - if (m_lod_visible >= LOD_VISIBILITY_PRESTREAM && ri.renderPass->getType() == RenderPassType::RENDER_PASS_PRESTREAM) { preStream(*ri.viewport); } diff --git a/kraken/nodes/KRModel.h b/kraken/nodes/KRModel.h index dd85d37..a022727 100755 --- a/kraken/nodes/KRModel.h +++ b/kraken/nodes/KRModel.h @@ -52,11 +52,13 @@ public: KRModel(KRScene& scene, std::string name); KRModel(KRScene& scene, std::string instance_name, std::string model_name, std::string light_map, float lod_min_coverage, bool receives_shadow, bool faces_camera, hydra::Vector3 rim_color = hydra::Vector3::Zero(), float rim_power = 0.0f); virtual ~KRModel(); + + KrResult update(const KrNodeInfo* nodeInfo) override; virtual std::string getElementName(); virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent); - virtual void render(KRNode::RenderInfo& ri); + virtual void render(KRNode::RenderInfo& ri) override; virtual hydra::AABB getBounds(); diff --git a/kraken/nodes/KRNode.cpp b/kraken/nodes/KRNode.cpp index 94e00c7..d5e4a10 100755 --- a/kraken/nodes/KRNode.cpp +++ b/kraken/nodes/KRNode.cpp @@ -677,7 +677,7 @@ KRNode* KRNode::LoadXML(KRScene& scene, tinyxml2::XMLElement* e) return new_node; } -void KRNode::render(const RenderInfo& ri) +void KRNode::render(RenderInfo& ri) { if (m_lod_visible <= LOD_VISIBILITY_PRESTREAM) return; diff --git a/kraken/nodes/KRNode.h b/kraken/nodes/KRNode.h index fa84a10..dd5546e 100755 --- a/kraken/nodes/KRNode.h +++ b/kraken/nodes/KRNode.h @@ -209,7 +209,7 @@ public: KRScene& getScene(); - virtual void render(const RenderInfo& ri); + virtual void render(RenderInfo& ri); virtual void physicsUpdate(float deltaTime); virtual bool hasPhysics(); diff --git a/kraken/nodes/KRParticleSystem.h b/kraken/nodes/KRParticleSystem.h index 3ca80d6..4a64018 100755 --- a/kraken/nodes/KRParticleSystem.h +++ b/kraken/nodes/KRParticleSystem.h @@ -38,13 +38,13 @@ class KRParticleSystem : public KRNode public: virtual ~KRParticleSystem(); - virtual std::string getElementName() = 0; - virtual void loadXML(tinyxml2::XMLElement* e); - virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent); + virtual std::string getElementName() override = 0; + virtual void loadXML(tinyxml2::XMLElement* e) override; + virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent) override; - virtual hydra::AABB getBounds() = 0; + virtual hydra::AABB getBounds() override = 0; - virtual void render(RenderInfo& ri) = 0; + virtual void render(RenderInfo& ri) override = 0; protected: KRParticleSystem(KRScene& scene, std::string name); diff --git a/kraken/nodes/KRParticleSystemNewtonian.h b/kraken/nodes/KRParticleSystemNewtonian.h index 9942265..74b4276 100755 --- a/kraken/nodes/KRParticleSystemNewtonian.h +++ b/kraken/nodes/KRParticleSystemNewtonian.h @@ -46,7 +46,7 @@ public: virtual hydra::AABB getBounds(); - virtual void render(RenderInfo& ri); + virtual void render(RenderInfo& ri) override; virtual void physicsUpdate(float deltaTime); diff --git a/kraken/nodes/KRPointLight.h b/kraken/nodes/KRPointLight.h index 4bbad86..faf5bd3 100755 --- a/kraken/nodes/KRPointLight.h +++ b/kraken/nodes/KRPointLight.h @@ -43,7 +43,7 @@ public: virtual std::string getElementName(); virtual hydra::AABB getBounds(); - virtual void render(RenderInfo& ri); + virtual void render(RenderInfo& ri) override; private: void generateMesh(); diff --git a/kraken/nodes/KRReverbZone.h b/kraken/nodes/KRReverbZone.h index ebdfaf0..e35ff12 100755 --- a/kraken/nodes/KRReverbZone.h +++ b/kraken/nodes/KRReverbZone.h @@ -46,7 +46,7 @@ public: virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent); virtual void loadXML(tinyxml2::XMLElement* e); - void render(RenderInfo& ri); + void render(RenderInfo& ri) override; std::string getZone(); void setZone(const std::string& zone); diff --git a/kraken/nodes/KRSprite.h b/kraken/nodes/KRSprite.h index 87959e9..0fbdf19 100755 --- a/kraken/nodes/KRSprite.h +++ b/kraken/nodes/KRSprite.h @@ -43,17 +43,17 @@ public: KRSprite(KRScene& scene, std::string name); virtual ~KRSprite(); - virtual std::string getElementName(); - virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent); - virtual void loadXML(tinyxml2::XMLElement* e); + virtual std::string getElementName() override; + virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent) override; + virtual void loadXML(tinyxml2::XMLElement* e) override; void setSpriteTexture(std::string sprite_texture); void setSpriteAlpha(float alpha); float getSpriteAlpha() const; - virtual void render(RenderInfo& ri); + virtual void render(RenderInfo& ri) override; - virtual hydra::AABB getBounds(); + virtual hydra::AABB getBounds() override; protected: diff --git a/tests/smoke/hello_cube/hello_cube.cpp b/tests/smoke/hello_cube/hello_cube.cpp index ecf7778..258c3ea 100644 --- a/tests/smoke/hello_cube/hello_cube.cpp +++ b/tests/smoke/hello_cube/hello_cube.cpp @@ -37,12 +37,14 @@ bool smoke_load() enum { kSceneResourceHandle = 10, - kSkyboxTextureResourceHandle + kSkyboxTextureResourceHandle, + kCubeMeshResourceHandle }; enum { - kCameraNodeHandle = 10 + kCameraNodeHandle = 10, + kCubeNodeHandle = 11 }; KrLoadResourceInfo load_resource_info = {}; @@ -63,6 +65,12 @@ bool smoke_load() KrResult res = KrMapResource(&map_skybox_resource); assert(res == KR_SUCCESS); */ + + KrMapResourceInfo map_cube_mesh_resource = { KR_STRUCTURE_TYPE_MAP_RESOURCE }; + map_cube_mesh_resource.pResourceName = "__cube"; + map_cube_mesh_resource.resourceHandle = kCubeMeshResourceHandle; + res = KrMapResource(&map_cube_mesh_resource); + assert(res == KR_SUCCESS); // Create a scene KrCreateSceneInfo create_scene_info = { KR_STRUCTURE_TYPE_CREATE_SCENE }; @@ -85,5 +93,18 @@ bool smoke_load() res = KrCreateNode(&create_camera_info); assert(res == KR_SUCCESS); + // Add a cube to the scene + KrCreateNodeInfo create_cube_info = { KR_STRUCTURE_TYPE_CREATE_NODE }; + res = KrInitNodeInfo(&create_cube_info.node, KR_STRUCTURE_TYPE_NODE_MODEL); + assert(res == KR_SUCCESS); + create_cube_info.relativeNodeHandle = KR_NULL_HANDLE; + create_cube_info.location = KR_SCENE_NODE_APPEND_CHILD; + create_cube_info.newNodeHandle = kCubeNodeHandle; + create_cube_info.sceneHandle = kSceneResourceHandle; + create_cube_info.node.pName = "my_cube"; + create_cube_info.node.model.mesh = kCubeMeshResourceHandle; + res = KrCreateNode(&create_cube_info); + assert(res == KR_SUCCESS); + return true; }