From ad81d58ea86f45b6645b4eea7d1b887c704c7fe8 Mon Sep 17 00:00:00 2001 From: kearwood Date: Thu, 22 Sep 2022 23:02:42 -0700 Subject: [PATCH] Added standard constructor with just scene and name for KRModel and KRCollider. Implemented KRNode::createNode, to create nodes declared in KrCreateNodeInfo structs. Added stub function, KRNode::update to update node attributes from a KrNodeInfo struct. --- kraken/KRCollider.cpp | 12 +++++++++- kraken/KRCollider.h | 1 + kraken/KRContext.cpp | 2 +- kraken/KRModel.cpp | 30 ++++++++++++++++++++++- kraken/KRModel.h | 1 + kraken/KRNode.cpp | 56 +++++++++++++++++++++++++++++++++++++++++-- kraken/KRNode.h | 3 ++- 7 files changed, 99 insertions(+), 6 deletions(-) diff --git a/kraken/KRCollider.cpp b/kraken/KRCollider.cpp index 079b73e..70ace31 100755 --- a/kraken/KRCollider.cpp +++ b/kraken/KRCollider.cpp @@ -43,7 +43,17 @@ void KRCollider::InitNodeInfo(KrNodeInfo* nodeInfo) nodeInfo->collider.mesh = -1; } -KRCollider::KRCollider(KRScene& scene, std::string collider_name, std::string model_name, unsigned int layer_mask, float audio_occlusion) : KRNode(scene, collider_name) +KRCollider::KRCollider(KRScene& scene, std::string name) + : KRNode(scene, name) + , m_model(nullptr) + , m_layer_mask(0xffff) + , m_audio_occlusion(1.0f) +{ + +} + +KRCollider::KRCollider(KRScene& scene, std::string collider_name, std::string model_name, unsigned int layer_mask, float audio_occlusion) + : KRNode(scene, collider_name) { m_model_name = model_name; m_layer_mask = layer_mask; diff --git a/kraken/KRCollider.h b/kraken/KRCollider.h index 3c1fcbb..97b37b3 100755 --- a/kraken/KRCollider.h +++ b/kraken/KRCollider.h @@ -52,6 +52,7 @@ class KRCollider : public KRNode public: static void InitNodeInfo(KrNodeInfo* nodeInfo); + KRCollider(KRScene& scene, std::string name); KRCollider(KRScene& scene, std::string collider_name, std::string model_name, unsigned int layer_mask, float audio_occlusion); virtual ~KRCollider(); diff --git a/kraken/KRContext.cpp b/kraken/KRContext.cpp index b8ada8b..5e209fc 100755 --- a/kraken/KRContext.cpp +++ b/kraken/KRContext.cpp @@ -793,7 +793,7 @@ KrResult KRContext::createNode(const KrCreateNodeInfo* pCreateNodeInfo) } KRNode* newNode = nullptr; - KrResult res = KRNode::createNode(pCreateNodeInfo, &newNode); + KrResult res = KRNode::createNode(pCreateNodeInfo, scene, &newNode); if (res != KR_SUCCESS) { return res; } diff --git a/kraken/KRModel.cpp b/kraken/KRModel.cpp index 69e4772..6edd7d3 100755 --- a/kraken/KRModel.cpp +++ b/kraken/KRModel.cpp @@ -49,7 +49,35 @@ void KRModel::InitNodeInfo(KrNodeInfo* nodeInfo) nodeInfo->model.rim_power = 0.0f; } -KRModel::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, Vector3 rim_color, float rim_power) : KRNode(scene, instance_name) +KRModel::KRModel(KRScene& scene, std::string name) + : KRNode(scene, name) + , m_pLightMap(nullptr) + , m_min_lod_coverage(0.0f) + , m_receivesShadow(true) + , m_faces_camera(false) + , m_rim_color(Vector3::Zero()) + , m_rim_power(0.0f) +{ + m_boundsCachedMat.c[0] = -1.0f; + m_boundsCachedMat.c[1] = -1.0f; + m_boundsCachedMat.c[2] = -1.0f; + m_boundsCachedMat.c[3] = -1.0f; + m_boundsCachedMat.c[4] = -1.0f; + m_boundsCachedMat.c[5] = -1.0f; + m_boundsCachedMat.c[6] = -1.0f; + m_boundsCachedMat.c[7] = -1.0f; + m_boundsCachedMat.c[8] = -1.0f; + m_boundsCachedMat.c[9] = -1.0f; + m_boundsCachedMat.c[10] = -1.0f; + m_boundsCachedMat.c[11] = -1.0f; + m_boundsCachedMat.c[12] = -1.0f; + m_boundsCachedMat.c[13] = -1.0f; + m_boundsCachedMat.c[14] = -1.0f; + m_boundsCachedMat.c[15] = -1.0f; +} + +KRModel::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, Vector3 rim_color, float rim_power) + : KRNode(scene, instance_name) { m_lightMap = light_map; m_pLightMap = NULL; diff --git a/kraken/KRModel.h b/kraken/KRModel.h index 9252105..ce6c1bd 100755 --- a/kraken/KRModel.h +++ b/kraken/KRModel.h @@ -49,6 +49,7 @@ class KRModel : public KRNode public: static void InitNodeInfo(KrNodeInfo* nodeInfo); + 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, Vector3 rim_color = Vector3::Zero(), float rim_power = 0.0f); virtual ~KRModel(); diff --git a/kraken/KRNode.cpp b/kraken/KRNode.cpp index 2fe9b3d..3c5a674 100755 --- a/kraken/KRNode.cpp +++ b/kraken/KRNode.cpp @@ -63,6 +63,11 @@ void KRNode::InitNodeInfo(KrNodeInfo* nodeInfo) nodeInfo->scale_pivot = Vector3::Zero(); } +void KRNode::update(const KrNodeInfo* nodeInfo) +{ + // TODO - Implement +} + KRNode::KRNode(KRScene& scene, std::string name) : KRContextObject(scene.getContext()) { m_name = name; @@ -217,9 +222,56 @@ tinyxml2::XMLElement* KRNode::saveXML(tinyxml2::XMLNode* parent) return e; } -KrResult KRNode::createNode(const KrCreateNodeInfo* pCreateNodeInfo, KRNode** node) +KrResult KRNode::createNode(const KrCreateNodeInfo* pCreateNodeInfo, KRScene* scene, KRNode** node) { - return KR_ERROR_NOT_IMPLEMENTED; + switch (pCreateNodeInfo->node.sType) { + case KR_STRUCTURE_TYPE_NODE_CAMERA: + *node = new KRCamera(*scene, pCreateNodeInfo->node.pName); + break; + case KR_STRUCTURE_TYPE_NODE_LOD_SET: + *node = new KRLODSet(*scene, pCreateNodeInfo->node.pName); + break; + case KR_STRUCTURE_TYPE_NODE_LOD_GROUP: + *node = new KRLODGroup(*scene, pCreateNodeInfo->node.pName); + break; + case KR_STRUCTURE_TYPE_NODE_POINT_LIGHT: + *node = new KRPointLight(*scene, pCreateNodeInfo->node.pName); + break; + case KR_STRUCTURE_TYPE_NODE_DIRECTIONAL_LIGHT: + *node = new KRDirectionalLight(*scene, pCreateNodeInfo->node.pName); + break; + case KR_STRUCTURE_TYPE_NODE_SPOT_LIGHT: + *node = new KRSpotLight(*scene, pCreateNodeInfo->node.pName); + break; + case KR_STRUCTURE_TYPE_NODE_SPRITE: + *node = new KRSprite(*scene, pCreateNodeInfo->node.pName); + break; + case KR_STRUCTURE_TYPE_NODE_MODEL: + *node = new KRModel(*scene, pCreateNodeInfo->node.pName); + break; + case KR_STRUCTURE_TYPE_NODE_COLLIDER: + *node = new KRCollider(*scene, pCreateNodeInfo->node.pName); + break; + case KR_STRUCTURE_TYPE_NODE_BONE: + *node = new KRBone(*scene, pCreateNodeInfo->node.pName); + break; + case KR_STRUCTURE_TYPE_NODE_LOCATOR: + *node = new KRLocator(*scene, pCreateNodeInfo->node.pName); + break; + case KR_STRUCTURE_TYPE_NODE_AUDIO_SOURCE: + *node = new KRAudioSource(*scene, pCreateNodeInfo->node.pName); + break; + case KR_STRUCTURE_TYPE_NODE_AMBIENT_ZONE: + *node = new KRAmbientZone(*scene, pCreateNodeInfo->node.pName); + break; + case KR_STRUCTURE_TYPE_NODE_REVERB_ZONE: + *node = new KRReverbZone(*scene, pCreateNodeInfo->node.pName); + break; + default: + return KR_ERROR_NOT_IMPLEMENTED; + } + (*node)->update(&pCreateNodeInfo->node); + return KR_SUCCESS; } void KRNode::loadXML(tinyxml2::XMLElement* e) diff --git a/kraken/KRNode.h b/kraken/KRNode.h index 0de7e19..4cb0b36 100755 --- a/kraken/KRNode.h +++ b/kraken/KRNode.h @@ -108,6 +108,7 @@ public: }; static void InitNodeInfo(KrNodeInfo* nodeInfo); + virtual void update(const KrNodeInfo* nodeInfo); KRNode(KRScene& scene, std::string name); virtual ~KRNode(); @@ -115,7 +116,7 @@ public: virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent); static KRNode* LoadXML(KRScene& scene, tinyxml2::XMLElement* e); - static KrResult createNode(const KrCreateNodeInfo* pCreateNodeInfo, KRNode** node); + static KrResult createNode(const KrCreateNodeInfo* pCreateNodeInfo, KRScene* scene, KRNode** node); virtual void loadXML(tinyxml2::XMLElement* e); virtual std::string getElementName();