From 6bb2421e1f3f88a563750f60ff512bbfd2e17a45 Mon Sep 17 00:00:00 2001 From: yyc12345 Date: Sun, 29 Dec 2024 10:05:13 +0800 Subject: [PATCH] feat: add CKLight into BMap. - add CKLight support in BMap. - move the implementation of BMFile into CPP file from HPP file. - swap the order of the implementation of BMFile and BMMeshTransition to correspond with the order of their declaration. - add document for some member functions of BMFile. --- BMap/BMExports.cpp | 176 +++++++++++++++++++-- BMap/BMExports.hpp | 62 ++++++-- BMap/BMap.cpp | 386 ++++++++++++++++++++++++++++----------------- BMap/BMap.hpp | 134 ++++++++-------- 4 files changed, 525 insertions(+), 233 deletions(-) diff --git a/BMap/BMExports.cpp b/BMap/BMExports.cpp index 2a68665..181733e 100644 --- a/BMap/BMExports.cpp +++ b/BMap/BMExports.cpp @@ -42,10 +42,13 @@ _Ty CheckGeneralObject(BMap::BMFile* possible_bmfile, LibCmo::CK2::CK_ID possibl #define CheckCKObject(bmfile, objid) CheckGeneralObject(bmfile, objid, LibCmo::CK2::CK_CLASSID::CKCID_OBJECT) #define CheckCKGroup(bmfile, objid) CheckGeneralObject(bmfile, objid, LibCmo::CK2::CK_CLASSID::CKCID_GROUP) -#define CheckCK3dObject(bmfile, objid) CheckGeneralObject(bmfile, objid, LibCmo::CK2::CK_CLASSID::CKCID_3DOBJECT) +#define CheckCK3dEntity(bmfile, objid) CheckGeneralObject(bmfile, objid, LibCmo::CK2::CK_CLASSID::CKCID_3DENTITY) +#define CheckCK3dObject(bmfile, objid) CheckGeneralObject(bmfile, objid, LibCmo::CK2::CK_CLASSID::CKCID_3DOBJECT) #define CheckCKMesh(bmfile, objid) CheckGeneralObject(bmfile, objid, LibCmo::CK2::CK_CLASSID::CKCID_MESH) #define CheckCKMaterial(bmfile, objid) CheckGeneralObject(bmfile, objid, LibCmo::CK2::CK_CLASSID::CKCID_MATERIAL) #define CheckCKTexture(bmfile, objid) CheckGeneralObject(bmfile, objid, LibCmo::CK2::CK_CLASSID::CKCID_TEXTURE) +#define CheckCKLight(bmfile, objid) CheckGeneralObject(bmfile, objid, LibCmo::CK2::CK_CLASSID::CKCID_LIGHT) +#define CheckCKTargetLight(bmfile, objid) CheckGeneralObject(bmfile, objid, LibCmo::CK2::CK_CLASSID::CKCID_TARGETLIGHT) #pragma endregion @@ -143,7 +146,7 @@ bool BMFile_Create( bool BMFile_Save( BMPARAM_IN(BMap::BMFile*, map_file), BMPARAM_IN(LibCmo::CKSTRING, file_name), - BMPARAM_IN(LibCmo::CK2::CK_TEXTURE_SAVEOPTIONS, texture_save_opt), + BMPARAM_IN(LibCmo::CK2::CK_TEXTURE_SAVEOPTIONS, texture_save_opt), BMPARAM_IN(bool, use_compress), BMPARAM_IN(LibCmo::CKINT, compreess_level)) { if (!CheckBMFile(map_file)) return false; @@ -234,6 +237,21 @@ bool BMFile_CreateTexture(BMPARAM_FILE_DECL(bmfile), BMPARAM_OUT(LibCmo::CK2::CK BMPARAM_OUT_ASSIGN(out_id, bmfile->CreateTexture()); return true; } +bool BMFile_GetTargetLightCount(BMPARAM_FILE_DECL(bmfile), BMPARAM_OUT(LibCmo::CKDWORD, out_count)) { + if (!CheckBMFile(bmfile)) return false; + BMPARAM_OUT_ASSIGN(out_count, bmfile->GetTargetLightCount()); + return true; +} +bool BMFile_GetTargetLight(BMPARAM_FILE_DECL(bmfile), BMPARAM_IN(LibCmo::CKDWORD, idx), BMPARAM_OUT(LibCmo::CK2::CK_ID, out_id)) { + if (!CheckBMFile(bmfile)) return false; + BMPARAM_OUT_ASSIGN(out_id, bmfile->GetTargetLight(idx)); + return true; +} +bool BMFile_CreateTargetLight(BMPARAM_FILE_DECL(bmfile), BMPARAM_OUT(LibCmo::CK2::CK_ID, out_id)) { + if (!CheckBMFile(bmfile)) return false; + BMPARAM_OUT_ASSIGN(out_id, bmfile->CreateTargetLight()); + return true; +} #pragma endregion @@ -841,34 +859,34 @@ bool BMMesh_SetMaterialSlot(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCm #pragma endregion -#pragma region CK3dObject +#pragma region CK3dEntity -bool BM3dObject_GetWorldMatrix(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::VxMath::VxMatrix, out_mat)) { - auto obj = CheckCK3dObject(bmfile, objid); +bool BM3dEntity_GetWorldMatrix(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::VxMath::VxMatrix, out_mat)) { + auto obj = CheckCK3dEntity(bmfile, objid); if (obj == nullptr) return false; BMPARAM_OUT_ASSIGN(out_mat, obj->GetWorldMatrix()); return true; } -bool BM3dObject_SetWorldMatrix(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::VxMath::VxMatrix, mat)) { - auto obj = CheckCK3dObject(bmfile, objid); +bool BM3dEntity_SetWorldMatrix(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::VxMath::VxMatrix, mat)) { + auto obj = CheckCK3dEntity(bmfile, objid); if (obj == nullptr) return false; obj->SetWorldMatrix(mat); return true; } -bool BM3dObject_GetCurrentMesh(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::CK2::CK_ID, out_meshid)) { - auto obj = CheckCK3dObject(bmfile, objid); +bool BM3dEntity_GetCurrentMesh(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::CK2::CK_ID, out_meshid)) { + auto obj = CheckCK3dEntity(bmfile, objid); if (obj == nullptr) return false; BMPARAM_OUT_ASSIGN(out_meshid, SafeGetID(obj->GetCurrentMesh())); return true; } -bool BM3dObject_SetCurrentMesh(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::CK2::CK_ID, meshid)) { - auto obj = CheckCK3dObject(bmfile, objid); +bool BM3dEntity_SetCurrentMesh(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::CK2::CK_ID, meshid)) { + auto obj = CheckCK3dEntity(bmfile, objid); auto meshobj = CheckCKMesh(bmfile, meshid); if (obj == nullptr /*|| meshobj == nullptr*/) return false; //allow nullptr assign @@ -876,16 +894,16 @@ bool BM3dObject_SetCurrentMesh(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(Li return true; } -bool BM3dObject_GetVisibility(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(bool, out_isVisible)) { - auto obj = CheckCK3dObject(bmfile, objid); +bool BM3dEntity_GetVisibility(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(bool, out_isVisible)) { + auto obj = CheckCK3dEntity(bmfile, objid); if (obj == nullptr) return false; BMPARAM_OUT_ASSIGN(out_isVisible, obj->IsVisible()); return true; } -bool BM3dObject_SetVisibility(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(bool, is_visible)) { - auto obj = CheckCK3dObject(bmfile, objid); +bool BM3dEntity_SetVisibility(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(bool, is_visible)) { + auto obj = CheckCK3dEntity(bmfile, objid); if (obj == nullptr) return false; obj->Show(is_visible ? LibCmo::CK2::CK_OBJECT_SHOWOPTION::CKSHOW : LibCmo::CK2::CK_OBJECT_SHOWOPTION::CKHIDE); @@ -894,3 +912,131 @@ bool BM3dObject_SetVisibility(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(boo #pragma endregion +#pragma region CK3dObject + +//nothing + +#pragma endregion + +#pragma region CKLight + +bool BMLight_GetType(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::VxMath::VXLIGHT_TYPE, out_val)) { + auto obj = CheckCKLight(bmfile, objid); + if (obj == nullptr) return false; + BMPARAM_OUT_ASSIGN(out_val, obj->GetType()); + return true; +} +bool BMLight_SetType(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::VxMath::VXLIGHT_TYPE, val)) { + auto obj = CheckCKLight(bmfile, objid); + if (obj == nullptr) return false; + obj->SetType(val); + return true; +} + +bool BMLight_GetColor(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::VxMath::VxColor, out_val)) { + auto obj = CheckCKLight(bmfile, objid); + if (obj == nullptr) return false; + BMPARAM_OUT_ASSIGN(out_val, obj->GetColor()); + return true; +} +bool BMLight_SetColor(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::VxMath::VxColor, col)) { + auto obj = CheckCKLight(bmfile, objid); + if (obj == nullptr) return false; + obj->SetColor(col); + return true; +} + +bool BMLight_GetConstantAttenuation(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::CKFLOAT, out_val)) { + auto obj = CheckCKLight(bmfile, objid); + if (obj == nullptr) return false; + BMPARAM_OUT_ASSIGN(out_val, obj->GetConstantAttenuation()); + return true; +} +bool BMLight_SetConstantAttenuation(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::CKFLOAT, val)) { + auto obj = CheckCKLight(bmfile, objid); + if (obj == nullptr) return false; + obj->SetConstantAttenuation(val); + return true; +} +bool BMLight_GetLinearAttenuation(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::CKFLOAT, out_val)) { + auto obj = CheckCKLight(bmfile, objid); + if (obj == nullptr) return false; + BMPARAM_OUT_ASSIGN(out_val, obj->GetLinearAttenuation()); + return true; +} +bool BMLight_SetLinearAttenuation(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::CKFLOAT, val)) { + auto obj = CheckCKLight(bmfile, objid); + if (obj == nullptr) return false; + obj->SetLinearAttenuation(val); + return true; +} +bool BMLight_GetQuadraticAttenuation(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::CKFLOAT, out_val)) { + auto obj = CheckCKLight(bmfile, objid); + if (obj == nullptr) return false; + BMPARAM_OUT_ASSIGN(out_val, obj->GetQuadraticAttenuation()); + return true; +} +bool BMLight_SetQuadraticAttenuation(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::CKFLOAT, val)) { + auto obj = CheckCKLight(bmfile, objid); + if (obj == nullptr) return false; + obj->SetQuadraticAttenuation(val); + return true; +} + +bool BMLight_GetRange(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::CKFLOAT, out_val)) { + auto obj = CheckCKLight(bmfile, objid); + if (obj == nullptr) return false; + BMPARAM_OUT_ASSIGN(out_val, obj->GetRange()); + return true; +} +bool BMLight_SetRange(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::CKFLOAT, val)) { + auto obj = CheckCKLight(bmfile, objid); + if (obj == nullptr) return false; + obj->SetRange(val); + return true; +} + +bool BMLight_GetHotSpot(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::CKFLOAT, out_val)) { + auto obj = CheckCKLight(bmfile, objid); + if (obj == nullptr) return false; + BMPARAM_OUT_ASSIGN(out_val, obj->GetHotSpot()); + return true; +} +bool BMLight_SetHotSpot(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::CKFLOAT, val)) { + auto obj = CheckCKLight(bmfile, objid); + if (obj == nullptr) return false; + obj->SetHotSpot(val); + return true; +} +bool BMLight_GetFalloff(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::CKFLOAT, out_val)) { + auto obj = CheckCKLight(bmfile, objid); + if (obj == nullptr) return false; + BMPARAM_OUT_ASSIGN(out_val, obj->GetFalloff()); + return true; +} +bool BMLight_SetFalloff(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::CKFLOAT, val)) { + auto obj = CheckCKLight(bmfile, objid); + if (obj == nullptr) return false; + obj->SetFalloff(val); + return true; +} +bool BMLight_GetFalloffShape(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::CKFLOAT, out_val)) { + auto obj = CheckCKLight(bmfile, objid); + if (obj == nullptr) return false; + BMPARAM_OUT_ASSIGN(out_val, obj->GetFalloffShape()); + return true; +} +bool BMLight_SetFalloffShape(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::CKFLOAT, val)) { + auto obj = CheckCKLight(bmfile, objid); + if (obj == nullptr) return false; + obj->SetFalloffShape(val); + return true; +} + +#pragma endregion + +#pragma region CKTargetLight + +// nothing + +#pragma endregion diff --git a/BMap/BMExports.hpp b/BMap/BMExports.hpp index fe923f2..f30d1aa 100644 --- a/BMap/BMExports.hpp +++ b/BMap/BMExports.hpp @@ -51,7 +51,7 @@ Each CK_ID also should be used with its corresponding BMFile*, because each BMfi // Do nothing and hope for the best? #define BMAP_RAW_EXPORT #define BMAP_RAW_IMPORT -#pragma error "Unknown dynamic link import/export semantics." +#error "Unknown dynamic link import/export semantics." #endif // Choosee import or export command according to special macro. @@ -81,7 +81,9 @@ Each CK_ID also should be used with its corresponding BMFile*, because each BMfi /** Declare an input parameter */ #define BMPARAM_IN(_t, _name) _t _name /** +@brief Declare an output parameter. +@details A pointer will be added automatically for caller receive it. See BMPARAM_OUT_ASSIGN and BMPARAM_OUT_VAL to know how to use output param in function body. @remark @@ -91,8 +93,8 @@ bool some_interface_func(BMPARAM_OUT(Type_t, param_name)) { BMPARAM_OUT_ASSIGN(param_name, some_value); // assign to out param. return BMPARAM_OUT_VAL(param_name) != other_value; // use out param value. } -@see BMPARAM_OUT_ASSIGN, BMPARAM_OUT_VAL ``` +@see BMPARAM_OUT_ASSIGN, BMPARAM_OUT_VAL */ #define BMPARAM_OUT(_t, _name) _t* _name /** Assign value for out param in function body. */ @@ -154,6 +156,9 @@ BMAP_EXPORT bool BMFile_CreateMaterial(BMPARAM_FILE_DECL(bmfile), BMPARAM_OUT(Li BMAP_EXPORT bool BMFile_GetTextureCount(BMPARAM_FILE_DECL(bmfile), BMPARAM_OUT(LibCmo::CKDWORD, out_count)); BMAP_EXPORT bool BMFile_GetTexture(BMPARAM_FILE_DECL(bmfile), BMPARAM_IN(LibCmo::CKDWORD, idx), BMPARAM_OUT(LibCmo::CK2::CK_ID, out_id)); BMAP_EXPORT bool BMFile_CreateTexture(BMPARAM_FILE_DECL(bmfile), BMPARAM_OUT(LibCmo::CK2::CK_ID, out_id)); +BMAP_EXPORT bool BMFile_GetTargetLightCount(BMPARAM_FILE_DECL(bmfile), BMPARAM_OUT(LibCmo::CKDWORD, out_count)); +BMAP_EXPORT bool BMFile_GetTargetLight(BMPARAM_FILE_DECL(bmfile), BMPARAM_IN(LibCmo::CKDWORD, idx), BMPARAM_OUT(LibCmo::CK2::CK_ID, out_id)); +BMAP_EXPORT bool BMFile_CreateTargetLight(BMPARAM_FILE_DECL(bmfile), BMPARAM_OUT(LibCmo::CK2::CK_ID, out_id)); #pragma endregion @@ -285,13 +290,52 @@ BMAP_EXPORT bool BMMesh_SetMaterialSlot(BMPARAM_OBJECT_DECL(bmfile, objid), BMPA #pragma endregion -#pragma region CK3dObject +#pragma region CK3dEntity -BMAP_EXPORT bool BM3dObject_GetWorldMatrix(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::VxMath::VxMatrix, out_mat)); -BMAP_EXPORT bool BM3dObject_SetWorldMatrix(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::VxMath::VxMatrix, mat)); -BMAP_EXPORT bool BM3dObject_GetCurrentMesh(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::CK2::CK_ID, out_meshid)); -BMAP_EXPORT bool BM3dObject_SetCurrentMesh(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::CK2::CK_ID, meshid)); -BMAP_EXPORT bool BM3dObject_GetVisibility(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(bool, out_isVisible)); -BMAP_EXPORT bool BM3dObject_SetVisibility(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(bool, is_visible)); +BMAP_EXPORT bool BM3dEntity_GetWorldMatrix(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::VxMath::VxMatrix, out_mat)); +BMAP_EXPORT bool BM3dEntity_SetWorldMatrix(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::VxMath::VxMatrix, mat)); +BMAP_EXPORT bool BM3dEntity_GetCurrentMesh(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::CK2::CK_ID, out_meshid)); +BMAP_EXPORT bool BM3dEntity_SetCurrentMesh(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::CK2::CK_ID, meshid)); +BMAP_EXPORT bool BM3dEntity_GetVisibility(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(bool, out_isVisible)); +BMAP_EXPORT bool BM3dEntity_SetVisibility(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(bool, is_visible)); + +#pragma endregion + +#pragma region CK3dObject + +// nothing + +#pragma endregion + +#pragma region CKLight + +BMAP_EXPORT bool BMLight_GetType(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::VxMath::VXLIGHT_TYPE, out_val)); +BMAP_EXPORT bool BMLight_SetType(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::VxMath::VXLIGHT_TYPE, val)); + +BMAP_EXPORT bool BMLight_GetColor(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::VxMath::VxColor, out_val)); +BMAP_EXPORT bool BMLight_SetColor(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::VxMath::VxColor, col)); + +BMAP_EXPORT bool BMLight_GetConstantAttenuation(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::CKFLOAT, out_val)); +BMAP_EXPORT bool BMLight_SetConstantAttenuation(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::CKFLOAT, val)); +BMAP_EXPORT bool BMLight_GetLinearAttenuation(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::CKFLOAT, out_val)); +BMAP_EXPORT bool BMLight_SetLinearAttenuation(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::CKFLOAT, val)); +BMAP_EXPORT bool BMLight_GetQuadraticAttenuation(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::CKFLOAT, out_val)); +BMAP_EXPORT bool BMLight_SetQuadraticAttenuation(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::CKFLOAT, val)); + +BMAP_EXPORT bool BMLight_GetRange(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::CKFLOAT, out_val)); +BMAP_EXPORT bool BMLight_SetRange(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::CKFLOAT, val)); + +BMAP_EXPORT bool BMLight_GetHotSpot(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::CKFLOAT, out_val)); +BMAP_EXPORT bool BMLight_SetHotSpot(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::CKFLOAT, val)); +BMAP_EXPORT bool BMLight_GetFalloff(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::CKFLOAT, out_val)); +BMAP_EXPORT bool BMLight_SetFalloff(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::CKFLOAT, val)); +BMAP_EXPORT bool BMLight_GetFalloffShape(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_OUT(LibCmo::CKFLOAT, out_val)); +BMAP_EXPORT bool BMLight_SetFalloffShape(BMPARAM_OBJECT_DECL(bmfile, objid), BMPARAM_IN(LibCmo::CKFLOAT, val)); + +#pragma endregion + +#pragma region CKTargetLight + +// nothing #pragma endregion diff --git a/BMap/BMap.cpp b/BMap/BMap.cpp index c5a2926..c2e7da7 100644 --- a/BMap/BMap.cpp +++ b/BMap/BMap.cpp @@ -2,6 +2,247 @@ namespace BMap { +#pragma region BMfile + + BMFile::BMFile(LibCmo::CKSTRING temp_folder, LibCmo::CKSTRING texture_folder, NakedOutputCallback raw_callback, LibCmo::CKDWORD encoding_count, LibCmo::CKSTRING* encodings, bool is_loader) : + m_IsInitError(false), m_IsLoader(is_loader), m_HasLoaded(false), m_HasSaved(false), m_Context(nullptr) { + m_Context = new LibCmo::CK2::CKContext(); + // binding callback with lambda wrapper. + // check whether callback is nullptr. + m_IsInitError = m_IsInitError || (raw_callback == nullptr); + if (raw_callback != nullptr) { + m_Context->SetOutputCallback([raw_callback](LibCmo::CKSTRING strl) -> void { + raw_callback(strl); + }); + } + + // set temp folder and texture folder + auto pm = m_Context->GetPathManager(); + m_IsInitError = m_IsInitError || !pm->AddPath(texture_folder); + m_IsInitError = m_IsInitError || !pm->SetTempFolder(temp_folder); + + // set encoding + LibCmo::XContainer::XArray cache; + for (LibCmo::CKDWORD i = 0; i < encoding_count; ++i) { + if (encodings[i] != nullptr) + cache.emplace_back(encodings[i]); + } + m_Context->SetEncoding(cache); + m_IsInitError = m_IsInitError || !m_Context->IsValidEncoding(); + + // set default texture save mode is external + m_Context->SetGlobalImagesSaveOptions(LibCmo::CK2::CK_TEXTURE_SAVEOPTIONS::CKTEXTURE_EXTERNAL); + // set default file write mode is whole compressed + m_Context->SetFileWriteMode(LibCmo::CK2::CK_FILE_WRITEMODE::CKFILE_WHOLECOMPRESSED); + } + + BMFile::~BMFile() { + delete m_Context; + } + +#pragma region Safe Check Function + + bool BMFile::IsInitError() { + return m_IsInitError; + } + + bool BMFile::CanExecLoad() { + // no error, is loader, no prev load + return (!m_IsInitError && m_IsLoader && !m_HasLoaded); + } + bool BMFile::CanExecSave() { + // no error, is saver, no prev save + return (!m_IsInitError && !m_IsLoader && !m_HasSaved); + } + bool BMFile::CanExecLoaderVisitor() { + // no error, is loader, has loaded + return (!m_IsInitError && m_IsLoader && m_HasLoaded); + } + bool BMFile::CanExecSaverVisitor() { + // no error, is saver, not saveed yet + // same as CanExecSave + return (!m_IsInitError && !m_IsLoader && !m_HasSaved); + } + +#pragma endregion + +#pragma region Help Function + + bool BMFile::Load(LibCmo::CKSTRING filename) { + if (!CanExecLoad()) return false; + + // create temp ckfile and load + LibCmo::CK2::CKFileReader reader(m_Context); + LibCmo::CK2::CKERROR err = reader.DeepLoad(filename); + + // detect error + if (err != LibCmo::CK2::CKERROR::CKERR_OK) { + // failed. clear document and return false + m_Context->ClearAll(); + return false; + } + + // sync data list to our list + m_ObjGroups.clear(); + m_Obj3dObjects.clear(); + m_ObjMeshes.clear(); + m_ObjMaterials.clear(); + m_ObjTextures.clear(); + m_ObjTargetLights.clear(); + for (const auto& fileobj : reader.GetFileObjects()) { + if (fileobj.ObjPtr == nullptr) continue; + + switch (fileobj.ObjectCid) { + case LibCmo::CK2::CK_CLASSID::CKCID_GROUP: + m_ObjGroups.emplace_back(fileobj.CreatedObjectId); + break; + case LibCmo::CK2::CK_CLASSID::CKCID_3DOBJECT: + m_Obj3dObjects.emplace_back(fileobj.CreatedObjectId); + break; + case LibCmo::CK2::CK_CLASSID::CKCID_MESH: + m_ObjMeshes.emplace_back(fileobj.CreatedObjectId); + break; + case LibCmo::CK2::CK_CLASSID::CKCID_MATERIAL: + m_ObjMaterials.emplace_back(fileobj.CreatedObjectId); + break; + case LibCmo::CK2::CK_CLASSID::CKCID_TEXTURE: + m_ObjTextures.emplace_back(fileobj.CreatedObjectId); + break; + case LibCmo::CK2::CK_CLASSID::CKCID_TARGETLIGHT: + m_ObjTargetLights.emplace_back(fileobj.CreatedObjectId); + break; + default: + break; // skip unknow objects + } + } + + m_HasLoaded = true; + return true; + } + + bool BMFile::Save(LibCmo::CKSTRING filename, LibCmo::CK2::CK_TEXTURE_SAVEOPTIONS texture_save_opt, bool use_compress, LibCmo::CKINT compress_level) { + if (!CanExecSave()) return false; + + // create temp writer + LibCmo::CK2::CKFileWriter writer(m_Context); + + // fill object data + for (const auto& id : m_ObjGroups) { + writer.AddSavedObject(m_Context->GetObject(id)); + } + for (const auto& id : m_Obj3dObjects) { + writer.AddSavedObject(m_Context->GetObject(id)); + } + for (const auto& id : m_ObjMeshes) { + writer.AddSavedObject(m_Context->GetObject(id)); + } + for (const auto& id : m_ObjMaterials) { + writer.AddSavedObject(m_Context->GetObject(id)); + } + for (const auto& id : m_ObjTextures) { + writer.AddSavedObject(m_Context->GetObject(id)); + } + for (const auto& id :m_ObjTargetLights) { + writer.AddSavedObject(m_Context->GetObject(id)); + } + + // set global texture save mode + m_Context->SetGlobalImagesSaveOptions(texture_save_opt); + // set compress level + if (use_compress) { + m_Context->SetFileWriteMode(LibCmo::CK2::CK_FILE_WRITEMODE::CKFILE_WHOLECOMPRESSED); + m_Context->SetCompressionLevel(compress_level); + } else { + m_Context->SetFileWriteMode(LibCmo::CK2::CK_FILE_WRITEMODE::CKFILE_UNCOMPRESSED); + } + + // save to file and detect error + LibCmo::CK2::CKERROR err = writer.Save(filename); + + // return with error detect. + m_HasSaved = true; + return err == LibCmo::CK2::CKERROR::CKERR_OK; + } + + LibCmo::CK2::ObjImpls::CKObject* BMFile::GetObjectPtr(LibCmo::CK2::CK_ID objid) { + // we fetch object from CKContext to get better performance + LibCmo::CK2::ObjImpls::CKObject* obj = m_Context->GetObject(objid); + + // however, we can not directly return the pointer fetched fron CKContext. + // BMFile only provide limited type visiting, we must make sure it provided ID also is existed in out stored list. + // so we check its type here. if type is not matched, we reset it to nullptr. + if (obj != nullptr) { + switch (obj->GetClassID()) { + case LibCmo::CK2::CK_CLASSID::CKCID_GROUP: + case LibCmo::CK2::CK_CLASSID::CKCID_3DOBJECT: + case LibCmo::CK2::CK_CLASSID::CKCID_MESH: + case LibCmo::CK2::CK_CLASSID::CKCID_MATERIAL: + case LibCmo::CK2::CK_CLASSID::CKCID_TEXTURE: + case LibCmo::CK2::CK_CLASSID::CKCID_TARGETLIGHT: + break; // okey. do nothing + default: + // this object should not be exposed to outside, reset it to nullptr + obj = nullptr; + break; + } + } + + // return result + return obj; + } + +#pragma endregion + +#pragma region Visitor + + LibCmo::CKDWORD BMFile::CommonGetObjectCount(std::vector& container) { + // only available in loader + if (!CanExecLoaderVisitor()) return 0; + return static_cast(container.size()); + } + LibCmo::CK2::CK_ID BMFile::CommonGetObject(std::vector& container, LibCmo::CKDWORD idx) { + // only available in loader + if (!CanExecLoaderVisitor()) return 0; + return container[idx]; + } + LibCmo::CK2::CK_ID BMFile::CommonCreateObject(std::vector& container, LibCmo::CK2::CK_CLASSID cid) { + // only available in saver + if (!CanExecSaverVisitor()) return 0; + + // try create object and get its pointer + LibCmo::CK2::ObjImpls::CKObject* obj = m_Context->CreateObject(cid, nullptr); + // check creation validation + if (obj == nullptr) return 0; + + // if success, write its id and emplace its id into list + LibCmo::CK2::CK_ID objid = obj->GetID(); + container.emplace_back(objid); + return objid; + } + + LibCmo::CKDWORD BMFile::GetGroupCount() { return CommonGetObjectCount(m_ObjGroups); } + LibCmo::CK2::CK_ID BMFile::GetGroup(LibCmo::CKDWORD idx) { return CommonGetObject(m_ObjGroups, idx); } + LibCmo::CK2::CK_ID BMFile::CreateGroup() { return CommonCreateObject(m_ObjGroups, LibCmo::CK2::CK_CLASSID::CKCID_GROUP); } + LibCmo::CKDWORD BMFile::Get3dObjectCount() { return CommonGetObjectCount(m_Obj3dObjects); } + LibCmo::CK2::CK_ID BMFile::Get3dObject(LibCmo::CKDWORD idx) { return CommonGetObject(m_Obj3dObjects, idx); } + LibCmo::CK2::CK_ID BMFile::Create3dObject() { return CommonCreateObject(m_Obj3dObjects, LibCmo::CK2::CK_CLASSID::CKCID_3DOBJECT); } + LibCmo::CKDWORD BMFile::GetMeshCount() { return CommonGetObjectCount(m_ObjMeshes); } + LibCmo::CK2::CK_ID BMFile::GetMesh(LibCmo::CKDWORD idx) { return CommonGetObject(m_ObjMeshes, idx); } + LibCmo::CK2::CK_ID BMFile::CreateMesh() { return CommonCreateObject(m_ObjMeshes, LibCmo::CK2::CK_CLASSID::CKCID_MESH); } + LibCmo::CKDWORD BMFile::GetMaterialCount() { return CommonGetObjectCount(m_ObjMaterials); } + LibCmo::CK2::CK_ID BMFile::GetMaterial(LibCmo::CKDWORD idx) { return CommonGetObject(m_ObjMaterials, idx); } + LibCmo::CK2::CK_ID BMFile::CreateMaterial() { return CommonCreateObject(m_ObjMaterials, LibCmo::CK2::CK_CLASSID::CKCID_MATERIAL); } + LibCmo::CKDWORD BMFile::GetTextureCount() { return CommonGetObjectCount(m_ObjTextures); } + LibCmo::CK2::CK_ID BMFile::GetTexture(LibCmo::CKDWORD idx) { return CommonGetObject(m_ObjTextures, idx); } + LibCmo::CK2::CK_ID BMFile::CreateTexture() { return CommonCreateObject(m_ObjTextures, LibCmo::CK2::CK_CLASSID::CKCID_TEXTURE); } + LibCmo::CKDWORD BMFile::GetTargetLightCount() { return CommonGetObjectCount(m_ObjTargetLights); } + LibCmo::CK2::CK_ID BMFile::GetTargetLight(LibCmo::CKDWORD idx) { return CommonGetObject(m_ObjTargetLights, idx); } + LibCmo::CK2::CK_ID BMFile::CreateTargetLight() { return CommonCreateObject(m_ObjTargetLights, LibCmo::CK2::CK_CLASSID::CKCID_TARGETLIGHT); } + +#pragma endregion + +#pragma endregion + #pragma region BMMeshTransition BMMeshTransition::TransitionVertex::TransitionVertex( @@ -229,149 +470,4 @@ namespace BMap { #pragma endregion -#pragma region BMfile - - BMFile::BMFile(LibCmo::CKSTRING temp_folder, LibCmo::CKSTRING texture_folder, NakedOutputCallback raw_callback, LibCmo::CKDWORD encoding_count, LibCmo::CKSTRING* encodings, bool is_loader) : - m_IsInitError(false), m_IsLoader(is_loader), m_HasLoaded(false), m_HasSaved(false), m_Context(nullptr) { - m_Context = new LibCmo::CK2::CKContext(); - // binding callback with lambda wrapper. - // check whether callback is nullptr. - m_IsInitError = m_IsInitError || (raw_callback == nullptr); - if (raw_callback != nullptr) { - m_Context->SetOutputCallback([raw_callback](LibCmo::CKSTRING strl) -> void { - raw_callback(strl); - }); - } - - // set temp folder and texture folder - auto pm = m_Context->GetPathManager(); - m_IsInitError = m_IsInitError || !pm->AddPath(texture_folder); - m_IsInitError = m_IsInitError || !pm->SetTempFolder(temp_folder); - - // set encoding - LibCmo::XContainer::XArray cache; - for (LibCmo::CKDWORD i = 0; i < encoding_count; ++i) { - if (encodings[i] != nullptr) - cache.emplace_back(encodings[i]); - } - m_Context->SetEncoding(cache); - m_IsInitError = m_IsInitError || !m_Context->IsValidEncoding(); - - // set default texture save mode is external - m_Context->SetGlobalImagesSaveOptions(LibCmo::CK2::CK_TEXTURE_SAVEOPTIONS::CKTEXTURE_EXTERNAL); - // set default file write mode is whole compressed - m_Context->SetFileWriteMode(LibCmo::CK2::CK_FILE_WRITEMODE::CKFILE_WHOLECOMPRESSED); - } - - BMFile::~BMFile() { - delete m_Context; - } - - bool BMFile::Load(LibCmo::CKSTRING filename) { - if (!CanExecLoad()) return false; - - // create temp ckfile and load - LibCmo::CK2::CKFileReader reader(m_Context); - LibCmo::CK2::CKERROR err = reader.DeepLoad(filename); - - // detect error - if (err != LibCmo::CK2::CKERROR::CKERR_OK) { - // failed. clear document and return false - m_Context->ClearAll(); - return false; - } - - // sync data list to our list - m_ObjGroups.clear(); - m_Obj3dObjects.clear(); - m_ObjMeshs.clear(); - m_ObjMaterials.clear(); - m_ObjTextures.clear(); - for (const auto& fileobj : reader.GetFileObjects()) { - if (fileobj.ObjPtr == nullptr) continue; - - switch (fileobj.ObjectCid) { - case LibCmo::CK2::CK_CLASSID::CKCID_GROUP: - m_ObjGroups.emplace_back(fileobj.CreatedObjectId); - break; - case LibCmo::CK2::CK_CLASSID::CKCID_3DOBJECT: - m_Obj3dObjects.emplace_back(fileobj.CreatedObjectId); - break; - case LibCmo::CK2::CK_CLASSID::CKCID_MESH: - m_ObjMeshs.emplace_back(fileobj.CreatedObjectId); - break; - case LibCmo::CK2::CK_CLASSID::CKCID_MATERIAL: - m_ObjMaterials.emplace_back(fileobj.CreatedObjectId); - break; - case LibCmo::CK2::CK_CLASSID::CKCID_TEXTURE: - m_ObjTextures.emplace_back(fileobj.CreatedObjectId); - break; - default: - break; // skip unknow objects - } - } - - m_HasLoaded = true; - return true; - } - - bool BMFile::Save(LibCmo::CKSTRING filename, LibCmo::CK2::CK_TEXTURE_SAVEOPTIONS texture_save_opt, bool use_compress, LibCmo::CKINT compress_level) { - if (!CanExecSave()) return false; - - // create temp writer - LibCmo::CK2::CKFileWriter writer(m_Context); - - // fill object data - for (const auto& id : m_ObjGroups) { - writer.AddSavedObject(m_Context->GetObject(id)); - } - for (const auto& id : m_Obj3dObjects) { - writer.AddSavedObject(m_Context->GetObject(id)); - } - for (const auto& id : m_ObjMeshs) { - writer.AddSavedObject(m_Context->GetObject(id)); - } - for (const auto& id : m_ObjMaterials) { - writer.AddSavedObject(m_Context->GetObject(id)); - } - for (const auto& id : m_ObjTextures) { - writer.AddSavedObject(m_Context->GetObject(id)); - } - - // set global texture save mode - m_Context->SetGlobalImagesSaveOptions(texture_save_opt); - // set compress level - if (use_compress) { - m_Context->SetFileWriteMode(LibCmo::CK2::CK_FILE_WRITEMODE::CKFILE_WHOLECOMPRESSED); - m_Context->SetCompressionLevel(compress_level); - } else { - m_Context->SetFileWriteMode(LibCmo::CK2::CK_FILE_WRITEMODE::CKFILE_UNCOMPRESSED); - } - - // save to file and detect error - LibCmo::CK2::CKERROR err = writer.Save(filename); - - // return with error detect. - m_HasSaved = true; - return err == LibCmo::CK2::CKERROR::CKERR_OK; - } - - LibCmo::CKDWORD BMFile::GetGroupCount() { return CommonGetObjectCount(m_ObjGroups); } - LibCmo::CK2::CK_ID BMFile::GetGroup(LibCmo::CKDWORD idx) { return CommonGetObject(m_ObjGroups, idx); } - LibCmo::CK2::CK_ID BMFile::CreateGroup() { return CommonCreateObject(m_ObjGroups, LibCmo::CK2::CK_CLASSID::CKCID_GROUP); } - LibCmo::CKDWORD BMFile::Get3dObjectCount() { return CommonGetObjectCount(m_Obj3dObjects); } - LibCmo::CK2::CK_ID BMFile::Get3dObject(LibCmo::CKDWORD idx) { return CommonGetObject(m_Obj3dObjects, idx); } - LibCmo::CK2::CK_ID BMFile::Create3dObject() { return CommonCreateObject(m_Obj3dObjects, LibCmo::CK2::CK_CLASSID::CKCID_3DOBJECT); } - LibCmo::CKDWORD BMFile::GetMeshCount() { return CommonGetObjectCount(m_ObjMeshs); } - LibCmo::CK2::CK_ID BMFile::GetMesh(LibCmo::CKDWORD idx) { return CommonGetObject(m_ObjMeshs, idx); } - LibCmo::CK2::CK_ID BMFile::CreateMesh() { return CommonCreateObject(m_ObjMeshs, LibCmo::CK2::CK_CLASSID::CKCID_MESH); } - LibCmo::CKDWORD BMFile::GetMaterialCount() { return CommonGetObjectCount(m_ObjMaterials); } - LibCmo::CK2::CK_ID BMFile::GetMaterial(LibCmo::CKDWORD idx) { return CommonGetObject(m_ObjMaterials, idx); } - LibCmo::CK2::CK_ID BMFile::CreateMaterial() { return CommonCreateObject(m_ObjMaterials, LibCmo::CK2::CK_CLASSID::CKCID_MATERIAL); } - LibCmo::CKDWORD BMFile::GetTextureCount() { return CommonGetObjectCount(m_ObjTextures); } - LibCmo::CK2::CK_ID BMFile::GetTexture(LibCmo::CKDWORD idx) { return CommonGetObject(m_ObjTextures, idx); } - LibCmo::CK2::CK_ID BMFile::CreateTexture() { return CommonCreateObject(m_ObjTextures, LibCmo::CK2::CK_CLASSID::CKCID_TEXTURE); } - -#pragma endregion - } diff --git a/BMap/BMap.hpp b/BMap/BMap.hpp index baf2100..deba81b 100644 --- a/BMap/BMap.hpp +++ b/BMap/BMap.hpp @@ -16,93 +16,95 @@ namespace BMap { ~BMFile(); YYCC_DEL_CLS_COPY_MOVE(BMFile); - // ===== safe visit functions ===== + // ===== Safe Check Function ===== - /** - Safe Visit Function will make sure this class is visited with safe mode. - These function will block all other functions if this class init failed. - Or, block any more operations if this class has loaded or saved once. In this time you only can free this class + /* + Safe Check Function will make sure this class is visited in safe mode. + Some of them are exposed to outside to report current status of this class, for example, whether there is a issue when initialize this class. + And some of them are used by internal functions to make sure there is a safe environment to execute corresponding functions. + For example, #Load function will use #CanExecLoad to detect whether it can execute loading process. */ public: - bool IsInitError() { - return m_IsInitError; - } - - private: - bool CanExecLoad() { - // no error, is loader, no prev load - return (!m_IsInitError && m_IsLoader && !m_HasLoaded); - } - bool CanExecSave() { - // no error, is saver, no prev save - return (!m_IsInitError && !m_IsLoader && !m_HasSaved); - } - bool CanExecLoaderVisitor() { - // no error, is loader, has loaded - return (!m_IsInitError && m_IsLoader && m_HasLoaded); - } - bool CanExecSaverVisitor() { - // no error, is saver, not saveed yet - // same as CanExecSave - return (!m_IsInitError && !m_IsLoader && !m_HasSaved); - } + /** + * @brief Check whether there is an error when initializing this class. + * @details + * This class is exposed for outside code to check. + * Internal code should use one of following 4 private check functions to check environment. + * @return True if there is an error when initializing this class. + */ + bool IsInitError(); private: /** - * @brief True if an error occurs when initializing this class. + * @brief Check whether it's okey to execute #Load function. + * @return True if it is okey. */ - bool m_IsInitError; + bool CanExecLoad(); /** - * @brief True if this class is a reader. + * @brief Check whether it's okey to execute #Save function. + * @return True if it is okey. */ - bool m_IsLoader; + bool CanExecSave(); /** - * @brief True if this class has read. Only valid when this class is reader. + * @brief Check whether it's okey to execute Loader-related function. + * @details + * Due to implementation, saving file and loading file are use the same class, BMFile to represent. + * So obviously you can visit loader-related function in a saver. + * This operation is illegal. So we need block these operation. + * This is what this function does. Provide the condition which raise blocking. + * @return True if it is okey. */ - bool m_HasLoaded; + bool CanExecLoaderVisitor(); /** - * @brief True if this class has written. Only valid when this class is writer. + * @brief Check whether it's okey to execute Saver-related function. + * @return True if it is okey. + * @see CanExecLoaderVisitor */ - bool m_HasSaved; + bool CanExecSaverVisitor(); - // ===== help functions ===== + private: + bool m_IsInitError; /**< True if an error occurs when initializing this class. */ + bool m_IsLoader; /**< True if this class is a reader. */ + bool m_HasLoaded; /**< True if this class has read. It's undefined behavior when visiting this variable if this class is not reader. */ + bool m_HasSaved; /**< True if this class has written. It's undefined behavior when visiting this variable if this class is not writer. */ + + // ===== Help Function ===== public: + /** + * @brief Load document to this class. + * @param[in] filename The path to file. + * @return True if no error, otherwise false. + */ bool Load(LibCmo::CKSTRING filename); + /** + * @brief Save current class into document. + * @param[in] filename The path to file. + * @param[in] texture_save_opt Global texture save option + * @param[in] use_compress True if use compression when saving. + * @param[in] compress_level The compress level if you choose using compression in file. + * @return + */ bool Save(LibCmo::CKSTRING filename, LibCmo::CK2::CK_TEXTURE_SAVEOPTIONS texture_save_opt, bool use_compress, LibCmo::CKINT compress_level); - LibCmo::CK2::ObjImpls::CKObject* GetObjectPtr(LibCmo::CK2::CK_ID objid) { - return m_Context->GetObject(objid);; - } + /** + * @brief Get object pointer from given ID. + * @details + * This function is specially exposed to outside for detecting whether given ID is valid in BMFile. + * Also used by BMMeshTransition to get essential objects. + * @param[in] objid The ID of object. + * @return The pointer to given ID represented object. nullptr if not found. + */ + LibCmo::CK2::ObjImpls::CKObject* GetObjectPtr(LibCmo::CK2::CK_ID objid); - // ===== visitors ===== + // ===== Visitor ===== private: - LibCmo::CKDWORD CommonGetObjectCount(std::vector& container) { - // only available in loader - if (!CanExecLoaderVisitor()) return 0; - return static_cast(container.size()); - } - LibCmo::CK2::CK_ID CommonGetObject(std::vector& container, LibCmo::CKDWORD idx) { - // only available in loader - if (!CanExecLoaderVisitor()) return 0; - return container[idx]; - } - LibCmo::CK2::CK_ID CommonCreateObject(std::vector& container, LibCmo::CK2::CK_CLASSID cid) { - // only available in saver - if (!CanExecSaverVisitor()) return 0; + LibCmo::CKDWORD CommonGetObjectCount(std::vector& container); + LibCmo::CK2::CK_ID CommonGetObject(std::vector& container, LibCmo::CKDWORD idx); + LibCmo::CK2::CK_ID CommonCreateObject(std::vector& container, LibCmo::CK2::CK_CLASSID cid); - // try create object and get its pointer - LibCmo::CK2::ObjImpls::CKObject* obj = m_Context->CreateObject(cid, nullptr); - // check creation validation - if (obj == nullptr) return 0; - - // if success, write its id and emplace its id into list - LibCmo::CK2::CK_ID objid = obj->GetID(); - container.emplace_back(objid); - return objid; - } public: LibCmo::CKDWORD GetGroupCount(); LibCmo::CK2::CK_ID GetGroup(LibCmo::CKDWORD idx); @@ -119,15 +121,19 @@ namespace BMap { LibCmo::CKDWORD GetTextureCount(); LibCmo::CK2::CK_ID GetTexture(LibCmo::CKDWORD idx); LibCmo::CK2::CK_ID CreateTexture(); + LibCmo::CKDWORD GetTargetLightCount(); + LibCmo::CK2::CK_ID GetTargetLight(LibCmo::CKDWORD idx); + LibCmo::CK2::CK_ID CreateTargetLight(); private: LibCmo::CK2::CKContext* m_Context; std::vector m_ObjGroups; std::vector m_Obj3dObjects; - std::vector m_ObjMeshs; + std::vector m_ObjMeshes; std::vector m_ObjMaterials; std::vector m_ObjTextures; + std::vector m_ObjTargetLights; };