From cf29556d410813713d9db46eecf21d4c4dbef29b Mon Sep 17 00:00:00 2001 From: Kearwood Date: Wed, 22 Jul 2020 19:38:01 -0700 Subject: [PATCH] WIP Implementing KrCreateWindowSurface and KrDeleteWindowSurface --- kraken/KRContext.cpp | 30 ++++++++++++++++++++++++++++++ kraken/KRContext.h | 10 ++++++++++ kraken/KRSceneManager.cpp | 1 + kraken/kraken.cpp | 16 ++++++++++++++++ kraken/public/kraken.h | 18 ++++++++++++++++++ 5 files changed, 75 insertions(+) diff --git a/kraken/KRContext.cpp b/kraken/KRContext.cpp index 9614c8f..f491353 100755 --- a/kraken/KRContext.cpp +++ b/kraken/KRContext.cpp @@ -789,3 +789,33 @@ void KRContext::removeResource(KRResource* resource) } } } + +KrResult KRContext::createWindowSurface(const KrCreateWindowSurfaceInfo* createWindowSurfaceInfo) +{ + if (createWindowSurfaceInfo->surfaceHandle < 0) { + return KR_ERROR_OUT_OF_BOUNDS; + } + if (m_surfaces.count(createWindowSurfaceInfo->surfaceHandle)) { + return KR_ERROR_DUPLICATE_HANDLE; + } + SurfaceInfo info{}; + info.surfaceHandle = createWindowSurfaceInfo->surfaceHandle; +#ifdef WIN32 + info.hWnd = static_cast(createWindowSurfaceInfo->hWnd); + m_surfaces.insert(std::pair(createWindowSurfaceInfo->surfaceHandle, info)); + // TODO - Complete implementation + return KR_ERROR_NOT_IMPLEMENTED; +#else + // Not implemented for this platform + return KR_ERROR_NOT_IMPLEMENTED; +#endif +} + +KrResult KRContext::deleteWindowSurface(const KrDeleteWindowSurfaceInfo* deleteWindowSurfaceInfo) +{ + if (deleteWindowSurfaceInfo->surfaceHandle < 0) { + return KR_ERROR_OUT_OF_BOUNDS; + } + // TODO - Complete implementation + return KR_ERROR_NOT_IMPLEMENTED; +} diff --git a/kraken/KRContext.h b/kraken/KRContext.h index 7cc0582..84537b7 100755 --- a/kraken/KRContext.h +++ b/kraken/KRContext.h @@ -40,6 +40,9 @@ public: KRContext(const KrInitializeInfo* initializeInfo); ~KRContext(); + KrResult createWindowSurface(const KrCreateWindowSurfaceInfo* createWindowSurfaceInfo); + KrResult deleteWindowSurface(const KrDeleteWindowSurfaceInfo* deleteWindowSurfaceInfo); + KrResult createBundle(const KrCreateBundleInfo* createBundleInfo); KrResult moveToBundle(const KrMoveToBundleInfo* moveToBundleInfo); KrResult loadResource(const KrLoadResourceInfo* loadResourceInfo); @@ -170,6 +173,13 @@ private: void destroyDeviceContexts(); unordered_multimap m_resources; + typedef struct { + KrSurfaceHandle surfaceHandle; +#ifdef WIN32 + HWND hWnd; +#endif + } SurfaceInfo; + unordered_map m_surfaces; }; #endif diff --git a/kraken/KRSceneManager.cpp b/kraken/KRSceneManager.cpp index ac9f3e1..0a5c235 100755 --- a/kraken/KRSceneManager.cpp +++ b/kraken/KRSceneManager.cpp @@ -49,6 +49,7 @@ KRResource* KRSceneManager::loadResource(const std::string& name, const std::str } return nullptr; } + KRResource* KRSceneManager::getResource(const std::string& name, const std::string& extension) { if (extension.compare("krscene") == 0) { diff --git a/kraken/kraken.cpp b/kraken/kraken.cpp index 0d128d1..3a1d4e7 100644 --- a/kraken/kraken.cpp +++ b/kraken/kraken.cpp @@ -42,6 +42,22 @@ KrResult KrShutdown() return KR_SUCCESS; } +KrResult KrCreateSurface(const KrCreateWindowSurfaceInfo* pCreateSurfaceInfo) +{ + if (!sContext) { + return KR_ERROR_NOT_INITIALIZED; + } + return sContext->createWindowSurface(pCreateSurfaceInfo); +} + +KrResult KrDeleteSurface(const KrDeleteWindowSurfaceInfo* pDeleteSurfaceInfo) +{ + if (!sContext) { + return KR_ERROR_NOT_INITIALIZED; + } + return sContext->deleteWindowSurface(pDeleteSurfaceInfo); +} + KrResult KrLoadResource(const KrLoadResourceInfo* pLoadResourceInfo) { if (!sContext) { diff --git a/kraken/public/kraken.h b/kraken/public/kraken.h index ddc13ef..44b631f 100644 --- a/kraken/public/kraken.h +++ b/kraken/public/kraken.h @@ -45,6 +45,7 @@ typedef enum { KR_ERROR_INCORRECT_TYPE = 5, KR_ERROR_NOT_FOUND = 6, KR_ERROR_AMBIGUOUS_MATCH = 7, + KR_ERROR_DUPLICATE_HANDLE = 8, KR_ERROR_UNEXPECTED = 0x10000000, KR_RESULT_MAX_ENUM = 0x7FFFFFFF } KrResult; @@ -97,12 +98,26 @@ typedef enum { typedef int KrResourceMapIndex; typedef int KrSceneNodeMapIndex; +typedef int KrSurfaceHandle; typedef struct { KrStructureType sType; size_t resourceMapSize; } KrInitializeInfo; +typedef struct { + KrStructureType sType; + KrSurfaceHandle surfaceHandle; +#if defined(_WIN32) || defined(_WIN64) + void* hWnd; // Can static cast to HWND +#endif +} KrCreateWindowSurfaceInfo; + +typedef struct { + KrStructureType sType; + KrSurfaceHandle surfaceHandle; +} KrDeleteWindowSurfaceInfo; + typedef struct { KrStructureType sType; const char* pResourcePath; @@ -361,6 +376,9 @@ typedef struct { KrResult KrInitialize(const KrInitializeInfo* pInitializeInfo); KrResult KrShutdown(); +KrResult KrCreateWindowSurface(const KrCreateWindowSurfaceInfo* pCreateWindowSurfaceInfo); +KrResult KrDeleteWindowSurface(const KrDeleteWindowSurfaceInfo* pDeleteWindowSurfaceInfo); + KrResult KrLoadResource(const KrLoadResourceInfo* pLoadResourceInfo); KrResult KrUnloadResource(const KrUnloadResourceInfo* pUnloadResourceInfo); KrResult KrSaveResource(const KrSaveResourceInfo* pSaveResourceInfo);