From 6c8bf9fa2cd6f621812dcb2921e47ee55d2d116e Mon Sep 17 00:00:00 2001 From: kearwood Date: Wed, 21 Sep 2022 23:55:24 -0700 Subject: [PATCH] WIP implementing createNode API. Added KRContext::m_nodeMap and initialization logic. Added code to hello_cube smoke test to call KrCreateNode. (Commented until test can pass) --- kraken/KRContext.cpp | 23 ++++++++++++++- kraken/KRContext.h | 3 ++ kraken/public/kraken.h | 1 + tests/smoke/hello_cube/hello_cube.cpp | 42 ++++++++++++++++++++++++--- tests/smoke/hello_cube/main_win.cpp | 1 + tools/convert/main.cpp | 1 + 6 files changed, 66 insertions(+), 5 deletions(-) diff --git a/kraken/KRContext.cpp b/kraken/KRContext.cpp index 4028747..6e734c6 100755 --- a/kraken/KRContext.cpp +++ b/kraken/KRContext.cpp @@ -84,11 +84,16 @@ void* KRContext::s_log_callback_user_data = NULL; KRContext::KRContext(const KrInitializeInfo* initializeInfo) : m_resourceMapSize(initializeInfo->resourceMapSize) + , m_resourceMap(nullptr) + , m_nodeMapSize(initializeInfo->nodeMapSize) + , m_nodeMap(nullptr) { m_presentationThread = std::make_unique(*this); m_streamerThread = std::make_unique(*this); m_resourceMap = (KRResource**)malloc(sizeof(KRResource*) * m_resourceMapSize); memset(m_resourceMap, 0, m_resourceMapSize * sizeof(KRResource*)); + m_nodeMap = (KRNode**)malloc(sizeof(KRNode*) * m_nodeMapSize); + memset(m_nodeMap, 0, m_nodeMapSize * sizeof(KRNode*)); m_streamingEnabled = false; #ifdef __APPLE__ mach_timebase_info(&m_timebase_info); @@ -172,7 +177,11 @@ KRContext::~KRContext() if (m_resourceMap) { delete m_resourceMap; - m_resourceMap = NULL; + m_resourceMap = nullptr; + } + if (m_nodeMap) { + delete m_nodeMap; + m_nodeMap = nullptr; } } @@ -744,6 +753,18 @@ KrResult KRContext::deleteNodeChildren(const KrDeleteNodeChildrenInfo* pDeleteNo KrResult KRContext::createNode(const KrCreateNodeInfo* pCreateNodeInfo) { + if (pCreateNodeInfo->newNodeHandle < 0 || pCreateNodeInfo->newNodeHandle >= m_nodeMapSize) { + return KR_ERROR_OUT_OF_BOUNDS; + } + if (pCreateNodeInfo->relativeNodeHandle < 0 || pCreateNodeInfo->relativeNodeHandle >= m_nodeMapSize) { + return KR_ERROR_OUT_OF_BOUNDS; + } + KRNode* relativeNode = nullptr; + if (pCreateNodeInfo->relativeNodeHandle != KR_NULL_HANDLE) { + // TODO - Handle node deletions by deleting nodes from m_nodeMap + relativeNode = m_nodeMap[pCreateNodeInfo->relativeNodeHandle]; + } + return KR_ERROR_NOT_IMPLEMENTED; } diff --git a/kraken/KRContext.h b/kraken/KRContext.h index 6df104f..7c560d6 100755 --- a/kraken/KRContext.h +++ b/kraken/KRContext.h @@ -176,6 +176,9 @@ private: KRResource** m_resourceMap; size_t m_resourceMapSize; + KRNode** m_nodeMap; + size_t m_nodeMapSize; + long m_current_frame; // TODO - Does this need to be atomic? long m_last_memory_warning_frame; // TODO - Does this need to be atomic? long m_last_fully_streamed_frame; // TODO - Does this need to be atomic? diff --git a/kraken/public/kraken.h b/kraken/public/kraken.h index 2a2d8b6..3cdfe83 100644 --- a/kraken/public/kraken.h +++ b/kraken/public/kraken.h @@ -123,6 +123,7 @@ typedef struct { KrStructureType sType; size_t resourceMapSize; + size_t nodeMapSize; } KrInitializeInfo; typedef struct diff --git a/tests/smoke/hello_cube/hello_cube.cpp b/tests/smoke/hello_cube/hello_cube.cpp index 38d70c7..0731316 100644 --- a/tests/smoke/hello_cube/hello_cube.cpp +++ b/tests/smoke/hello_cube/hello_cube.cpp @@ -34,10 +34,44 @@ void smoke_load() { - KrCreateSceneInfo create_scene_info = {}; - create_scene_info.sType = KR_STRUCTURE_TYPE_CREATE_SCENE; - create_scene_info.resourceHandle = 10; - create_scene_info.pSceneName = "cube"; + enum + { + kSceneResourceHandle = 10, + kSkyboxTextureResourceHandle + }; + + enum + { + kCameraNodeHandle = 10 + }; + + /* + KrMapResourceInfo map_skybox_resource = { KR_STRUCTURE_TYPE_MAP_RESOURCE }; + map_skybox_resource.pResourceName = "skybox"; + map_skybox_resource.resourceHandle = kSkyboxTextureResourceHandle; + KrResult res = KrMapResource(&map_skybox_resource); + assert(res == KR_SUCCESS); + */ + + // Create a scene + KrCreateSceneInfo create_scene_info = { KR_STRUCTURE_TYPE_CREATE_SCENE }; + create_scene_info.resourceHandle = kSceneResourceHandle; + create_scene_info.pSceneName = "my_scene"; KrResult res = KrCreateScene(&create_scene_info); assert(res == KR_SUCCESS); + + /* + // Add a camera to the scene + KrCreateNodeInfo create_camera_info = { KR_STRUCTURE_TYPE_CREATE_NODE }; + res = KrInitNodeInfo(&create_camera_info.node, KR_STRUCTURE_TYPE_NODE_CAMERA); + assert(res == KR_SUCCESS); + create_camera_info.relativeNodeHandle = -1; + create_camera_info.newNodeHandle = kCameraNodeHandle; + create_camera_info.sceneHandle = kSceneResourceHandle; + create_camera_info.node.pName = "my_camera"; + create_camera_info.node.camera.surface = 1; + // create_camera_info.node.camera.skybox_texture = kSkyboxTextureResourceHandle; + res = KrCreateNode(&create_camera_info); + assert(res == KR_SUCCESS); + */ } diff --git a/tests/smoke/hello_cube/main_win.cpp b/tests/smoke/hello_cube/main_win.cpp index 10ff5b8..611c57f 100644 --- a/tests/smoke/hello_cube/main_win.cpp +++ b/tests/smoke/hello_cube/main_win.cpp @@ -63,6 +63,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine KrInitializeInfo init_info = {}; init_info.sType = KR_STRUCTURE_TYPE_INITIALIZE; init_info.resourceMapSize = 1024; + init_info.nodeMapSize = 1024; KrResult res = KrInitialize(&init_info); if (res != KR_SUCCESS) { // printf("Failed to initialize Kraken!\n"); diff --git a/tools/convert/main.cpp b/tools/convert/main.cpp index 5205b5a..e75edec 100644 --- a/tools/convert/main.cpp +++ b/tools/convert/main.cpp @@ -54,6 +54,7 @@ int main(int argc, char* argv[]) KrInitializeInfo init_info = {}; init_info.sType = KR_STRUCTURE_TYPE_INITIALIZE; init_info.resourceMapSize = 1024; + init_info.nodeMapSize = 1024; KrResult res = KrInitialize(&init_info); if (res != KR_SUCCESS) { printf("Failed to initialize Kraken!\n");