From ca4fab461286cca1b00ea194ced9166dfc1324aa Mon Sep 17 00:00:00 2001 From: yyc12345 Date: Thu, 29 Jan 2026 11:09:07 +0800 Subject: [PATCH] fix: fix half struct fmt in unvirt --- Unvirt/CMakeLists.txt | 4 +- Unvirt/StructFmt.cpp | 789 ++++++++++++++++++ Unvirt/{StructFormatter.hpp => StructFmt.hpp} | 2 +- Unvirt/StructFormatter.cpp | 718 ---------------- 4 files changed, 792 insertions(+), 721 deletions(-) create mode 100644 Unvirt/StructFmt.cpp rename Unvirt/{StructFormatter.hpp => StructFmt.hpp} (96%) delete mode 100644 Unvirt/StructFormatter.cpp diff --git a/Unvirt/CMakeLists.txt b/Unvirt/CMakeLists.txt index bd3c334..aaf4c93 100644 --- a/Unvirt/CMakeLists.txt +++ b/Unvirt/CMakeLists.txt @@ -4,8 +4,8 @@ add_executable(Unvirt "") target_sources(Unvirt PRIVATE Docstring.cpp + StructFmt.cpp CmdHelper.cpp - StructFormatter.cpp UnvirtContext.cpp Unvirt.cpp ) @@ -15,8 +15,8 @@ PRIVATE FILE_SET HEADERS FILES Docstring.hpp + StructFmt.hpp CmdHelper.hpp - StructFormatter.hpp UnvirtContext.hpp ) # Setup header infomation diff --git a/Unvirt/StructFmt.cpp b/Unvirt/StructFmt.cpp new file mode 100644 index 0000000..94850a2 --- /dev/null +++ b/Unvirt/StructFmt.cpp @@ -0,0 +1,789 @@ +#include "StructFmt.hpp" +#include "Docstring.hpp" +#include +#include +#include +#include +#include +#include +#include + +using namespace yycc::patch::stream; +namespace strop = yycc::string::op; +namespace termcolor = yycc::carton::termcolor; +namespace tabulate = yycc::carton::tabulate; + +namespace Unvirt::StructFmt { + +#pragma region Assist Printer + + static std::u8string PrintCKSTRING(LibCmo::CKSTRING name) { + std::u8string ret; + if (name == nullptr) { + ret = termcolor::colored(u8"", termcolor::Color::LightMagenta); + } else { + if (name[0] == u8'\0') { + ret = termcolor::colored(u8"", termcolor::Color::LightMagenta); + } else { + ret = name; + } + } + return ret; + } + static std::u8string PrintPointer(const void* ptr) { + std::u8string ret; + if (ptr == nullptr) { + ret = termcolor::colored(u8"", termcolor::Color::LightCyan); + } else { + ret = strop::printf(u8"<0x%" PRIXPTR_LPAD PRIxPTR ">", reinterpret_cast(ptr)); + } + return ret; + } + static std::u8string PrintCKGUID(const LibCmo::CK2::CKGUID& guid) { + return strop::printf(u8"<0x%08" PRIxCKDWORD ", 0x%08" PRIxCKDWORD ">", guid.d1, guid.d2); + } + static std::u8string PrintBool(bool v) { + return (v ? u8"true" : u8"false"); + } + static std::u8string PrintColorfulBool(bool v) { + return (v ? termcolor::colored(u8"Yes", termcolor::Color::LightGreen) : termcolor::colored(u8"No", termcolor::Color::LightRed)); + } + static std::u8string PrintColor(LibCmo::CKDWORD argb) { + LibCmo::CKDWORD a = (argb & 0xFF000000) >> 24, + r = (argb & 0x00FF0000) >> 16, + g = (argb & 0x0000FF00) >> 8, + b = (argb & 0x000000FF); + LibCmo::CKFLOAT fa = static_cast(a) / 255.0f; + return strop::printf( + u8"A:%" PRIuCKDWORD " (%.4" PRIfCKFLOAT ") " + "RGB(%" PRIuCKDWORD ", %" PRIuCKDWORD ", %" PRIuCKDWORD ") " + "RGB#%02" PRIxCKDWORD "%02" PRIxCKDWORD "%02" PRIxCKDWORD " " + "RGBA#%02" PRIxCKDWORD "%02" PRIxCKDWORD "%02" PRIxCKDWORD "%02" PRIxCKDWORD, + a, fa, + r, g, b, + r, g, b, + r, g, b, a + ); + } + static std::u8string PrintColor(const LibCmo::VxMath::VxColor& col) { + return PrintColor(col.ToARGB()); + } + +#pragma endregion + +#pragma region Table Creator + + static tabulate::Tabulate CreateStandardTable(std::initializer_list header) { + tabulate::Tabulate table(header.size()); + table.show_header(true); + table.show_bar(false); + table.set_header(header); + return table; + } + + static tabulate::Tabulate CreateGridTable(size_t n) { + tabulate::Tabulate table(n); + table.show_header(false); + table.show_bar(false); + return table; + } + +#pragma endregion + +#pragma region Page Helper + + template + static void GeneralPrintList( + const std::vector& data, size_t page, size_t pageitems, + std::function printHdrFct, std::function printEntryFct) { + + // check page overflow + if (page * pageitems >= data.size()) { + console::write_line(YYCC_COLOR_LIGHT_RED(u8"Page out of range.")); + return; + } + + // calc page data + size_t fulllen = data.size(), + startpos = page * pageitems, + fullpage = (fulllen + (pageitems - 1)) / pageitems; // to solve `fulllen / pageitems` empty page issue. like CKStateChunk::GetCeilDwordSize function (+3 /4 to get DWORD size). + + // print header + printHdrFct(); + + // print body + for (size_t counter = startpos; counter < fulllen && (counter - startpos) < pageitems; ++counter) { + printEntryFct(counter, data[counter]); + } + + console::format_line(u8"Page %" PRIuSIZET " of %" PRIuSIZET, page + 1, fullpage); + } + +#pragma endregion + +#pragma region Object Printer + + static void PrintCKObjectDetail(LibCmo::CK2::ObjImpls::CKObject* obj) { + termcolor::cprintln(u8"CKObject", termcolor::Color::LightYellow); + // print name + std::cout << strop::printf(u8"Name: %s", PrintCKSTRING(obj->GetName()).c_str()) << std::endl; + // print id + std::cout << strop::printf(u8"CK ID: %" PRIuCKID, obj->GetID()) << std::endl; + // print class id + std::cout << strop::printf(u8"Class ID: %" PRIiCLASSID " (%s)", + obj->GetClassID(), + Docstring::GetClassIdHierarchy(obj->GetClassID()).c_str()) + << std::endl; + // print flags + std::cout << u8"Flags:" << std::endl; + std::cout << Docstring::GetFlagEnumName(obj->GetObjectFlags(), u8"\n", u8"\t") << std::endl; + } + + static void PrintCKSceneObjectDetail(LibCmo::CK2::ObjImpls::CKSceneObject* obj) { + PrintCKObjectDetail(obj); + termcolor::cprintln(u8"CKSceneObject", termcolor::Color::LightYellow); + termcolor::cprintln(u8"No Data", termcolor::Color::LightRed); + } + + static void PrintCKBeObjectDetail(LibCmo::CK2::ObjImpls::CKBeObject* obj) { + PrintCKSceneObjectDetail(obj); + termcolor::cprintln(u8"CKBeObject", termcolor::Color::LightYellow); + termcolor::cprintln(u8"No Data", termcolor::Color::LightRed); + } + + static void PrintCKGroupDetail(LibCmo::CK2::ObjImpls::CKGroup* obj) { + PrintCKBeObjectDetail(obj); + termcolor::cprintln(u8"CKGroup", termcolor::Color::LightYellow); + + LibCmo::CKDWORD count = obj->GetObjectCount(); + std::cout << strop::printf(u8"Group Object Count: %" PRIuCKDWORD, count) << std::endl; + auto group_object_table = CreateStandardTable({ + u8"CKID", + u8"Type", + u8"Object", + u8"Name", + }); + for (LibCmo::CKDWORD i = 0; i < count; ++i) { + LibCmo::CK2::ObjImpls::CKBeObject* beobj = obj->GetObject(i); + + group_object_table.add_row({strop::printf(u8"%" PRIuCKID, beobj->GetID()), + Docstring::GetClassIdName(beobj->GetClassID()), + PrintPointer(beobj), + (beobj != nullptr ? PrintCKSTRING(beobj->GetName()) : u8"")}); + } + group_object_table.print(); + } + + static void PrintCKRenderObjectDetail(LibCmo::CK2::ObjImpls::CKRenderObject* obj) { + PrintCKBeObjectDetail(obj); + termcolor::cprintln(u8"CKRenderObject", termcolor::Color::LightYellow); + termcolor::cprintln(u8"No Data", termcolor::Color::LightRed); + } + + static void PrintCK3dEntityDetail(LibCmo::CK2::ObjImpls::CK3dEntity* obj) { + PrintCKRenderObjectDetail(obj); + termcolor::cprintln(u8"CK3dEntity", termcolor::Color::LightYellow); + + std::cout << u8"== World Matrix ==" << std::endl; + auto mat = obj->GetWorldMatrix(); + auto matrix_table = CreateGridTable(4); + for (LibCmo::CKDWORD i = 0; i < 4; ++i) { + matrix_table.add_row({ + strop::printf(u8"%+" PRIeCKFLOAT, mat[i].x), + strop::printf(u8"%+" PRIeCKFLOAT, mat[i].y), + strop::printf(u8"%+" PRIeCKFLOAT, mat[i].z), + strop::printf(u8"%+" PRIeCKFLOAT, mat[i].w), + }); + } + matrix_table.print(); + + std::cout << u8"== Flags ==" << std::endl; + std::cout << u8"3dEntity Flags:" << std::endl; + std::cout << Docstring::GetFlagEnumName(obj->GetEntityFlags(), u8"\n", u8"\t") << std::endl; + std::cout << u8"Moveable Flags:" << std::endl; + std::cout << Docstring::GetFlagEnumName(obj->GetMoveableFlags(), u8"\n", u8"\t") << std::endl; + + std::cout << u8"== Meshs ==" << std::endl; + auto mesh_table = CreateStandardTable({ + u8"Index", + u8"Address", + u8"Name", + }); + // print current mesh + { + auto curmesh = obj->GetCurrentMesh(); + mesh_table.add_row({u8"->", PrintPointer(curmesh), (curmesh != nullptr ? PrintCKSTRING(curmesh->GetName()) : u8"")}); + } + // print other meshes + for (LibCmo::CKDWORD i = 0; i < obj->GetPotentialMeshCount(); ++i) { + auto thismesh = obj->GetPotentialMesh(i); + mesh_table.add_row({strop::printf(u8"#%" PRIuCKDWORD, i), + PrintPointer(thismesh), + (thismesh != nullptr ? PrintCKSTRING(thismesh->GetName()) : u8"")}); + } + mesh_table.print(); + + } + + static void PrintCKLightDetail(LibCmo::CK2::ObjImpls::CKLight* obj) { + PrintCK3dEntityDetail(obj); + termcolor::cprintln(u8"CKLight", termcolor::Color::LightYellow); + + std::cout << u8"== Basics ==" << std::endl; + std::cout << u8"Type: " << Docstring::GetEnumName(obj->GetType()) << std::endl; + std::cout << u8"Color: " << PrintColor(obj->GetColor()) << std::endl; + std::cout << strop::printf(u8"Light Power: %.2" PRIfCKFLOAT, obj->GetLightPower()) << std::endl; + + std::cout << u8"== Switches ==" << std::endl; + std::cout << u8"Activity: " << PrintBool(obj->GetActivity()) << std::endl; + std::cout << u8"Specular Flag: "<< PrintBool(obj->GetSpecularFlag()) << std::endl; + + std::cout << u8"== Attenuation ==" << std::endl; + std::cout << strop::printf(u8"Constant Attenuation: %.2" PRIfCKFLOAT, obj->GetConstantAttenuation()) << std::endl; + std::cout << strop::printf(u8"Linear Attenuation: %.2" PRIfCKFLOAT, obj->GetLinearAttenuation()) << std::endl; + std::cout << strop::printf(u8"Quadratic Attenuation: %.2" PRIfCKFLOAT, obj->GetQuadraticAttenuation()) << std::endl; + + std::cout << u8"== Spot Cone ==" << std::endl; + std::cout << strop::printf(u8"Range: %.2" PRIfCKFLOAT, obj->GetRange()) << std::endl; + std::cout << strop::printf(u8"Hot Spot: %.2" PRIfCKFLOAT, obj->GetHotSpot()) << std::endl; + std::cout << strop::printf(u8"Falloff: %.2" PRIfCKFLOAT, obj->GetFalloff()) << std::endl; + std::cout << strop::printf(u8"Falloff Shape: %.2" PRIfCKFLOAT, obj->GetFalloffShape()) << std::endl; + + std::cout << u8"== Target ==" << std::endl; + auto thistarget = obj->GetTarget(); + std::cout << u8"Target Address: " << PrintPointer(thistarget) << std::endl; + if (thistarget != nullptr) { + std::cout << u8"Target Name: " << PrintCKSTRING(thistarget->GetName()) << std::endl; + } + } + + static void PrintCKTargetLightDetail(LibCmo::CK2::ObjImpls::CKTargetLight* obj) { + PrintCKLightDetail(obj); + termcolor::cprintln(u8"CKTargetLight", termcolor::Color::LightYellow); + termcolor::cprintln(u8"No Data", termcolor::Color::LightRed); + } + + static void PrintCKCameraDetail(LibCmo::CK2::ObjImpls::CKCamera* obj) { + PrintCK3dEntityDetail(obj); + termcolor::cprintln(u8"CKCamera", termcolor::Color::LightYellow); + + std::cout << u8"== Basics ==" << std::endl; + std::cout << u8"Projection Type: " << Docstring::GetEnumName(obj->GetProjectionType()) << std::endl; + std::cout << strop::printf(u8"Orthographic Zoom: %.2" PRIfCKFLOAT, obj->GetOrthographicZoom()) << std::endl; + std::cout << strop::printf(u8"Front Plane: %.2" PRIfCKFLOAT, obj->GetFrontPlane()) << std::endl; + std::cout << strop::printf(u8"Back Plane: %.2" PRIfCKFLOAT, obj->GetBackPlane()) << std::endl; + std::cout << strop::printf(u8"Fov: %.2" PRIfCKFLOAT, obj->GetFov()) << std::endl; + LibCmo::CKDWORD width, height; + obj->GetAspectRatio(width, height); + std::cout << strop::printf(u8"Aspect Ratio: %" PRIuCKDWORD " : %" PRIuCKDWORD, width, height) << std::endl; + + std::cout << u8"== Target ==" << std::endl; + auto thistarget = obj->GetTarget(); + std::cout << u8"Target Address: " << PrintPointer(thistarget) << std::endl; + if (thistarget != nullptr) { + std::cout << u8"Target Name: " << PrintCKSTRING(thistarget->GetName()) << std::endl; + } + } + + static void PrintCKTargetCameraDetail(LibCmo::CK2::ObjImpls::CKTargetCamera* obj) { + PrintCKCameraDetail(obj); + termcolor::cprintln(u8"CKTargetCamera", termcolor::Color::LightYellow); + termcolor::cprintln(u8"No Data", termcolor::Color::LightRed); + } + + static void PrintCK3dObjectDetail(LibCmo::CK2::ObjImpls::CK3dObject* obj) { + PrintCK3dEntityDetail(obj); + termcolor::cprintln(u8"CK3dObject", termcolor::Color::LightYellow); + termcolor::cprintln(u8"No Data", termcolor::Color::LightRed); + } + + static void PrintCKTextureDetail(LibCmo::CK2::ObjImpls::CKTexture* obj) { + PrintCKBeObjectDetail(obj); + termcolor::cprintln(u8"CKTexture", termcolor::Color::LightYellow); + + // texture + std::cout << u8"== Texture ==" << std::endl; + + LibCmo::CK2::CKBitmapData& bd = obj->GetUnderlyingData(); + LibCmo::CKDWORD slot_count = bd.GetSlotCount(); + std::cout << strop::printf(u8"Slot Count: %" PRIuCKDWORD, slot_count) << std::endl; + std::cout << strop::printf(u8"Current Slot: %" PRIuCKDWORD, bd.GetCurrentSlot()) << std::endl; + + auto image_table = CreateStandardTable({ + u8"Index", + u8"Width", + u8"Height", + u8"Image Address", + u8"Image Size", + u8"File Name", + }); + for (LibCmo::CKDWORD i = 0; i < slot_count; ++i) { + auto desc = bd.GetImageDesc(i); + + image_table.add_row({ + strop::printf(u8"#%" PRIuCKDWORD, i), + strop::printf(u8"%" PRIuCKDWORD, desc->GetWidth()), + strop::printf(u8"%" PRIuCKDWORD, desc->GetHeight()), + PrintPointer(desc->GetImage()), + strop::printf(u8"0x%" PRIxCKDWORD " bytes", desc->GetImageSize()), + PrintCKSTRING(bd.GetSlotFileName(i)), + }); + } + image_table.print(); + + // other data + std::cout << u8"== Misc ==" << std::endl; + std::cout << u8"Video Format: " << Docstring::GetEnumName(obj->GetVideoFormat()) << std::endl; + std::cout << u8"Save Option: " << Docstring::GetEnumName(bd.GetSaveOptions()) << std::endl; + std::cout << strop::printf(u8"Pick Threshold: %" PRIuCKDWORD, bd.GetPickThreshold()) << std::endl; + std::cout << u8"Transparent Color: " << PrintColor(bd.GetTransparentColor()) << std::endl; + + std::cout << u8"Bitmap Flags:" << std::endl; + std::cout << Docstring::GetFlagEnumName(bd.GetBitmapFlags(), u8"\n", u8"\t") << std::endl; + } + + static void PrintCKMaterialDetail(LibCmo::CK2::ObjImpls::CKMaterial* obj) { + PrintCKBeObjectDetail(obj); + termcolor::cprintln(u8"CKMaterial", termcolor::Color::LightYellow); + + // color + std::cout << u8"== Color ==" << std::endl; + + std::cout << u8"Diffuse: " << PrintColor(obj->GetDiffuse()) << std::endl; + std::cout << u8"Ambient: " << PrintColor(obj->GetAmbient()) << std::endl; + std::cout << u8"Specular: " << PrintColor(obj->GetSpecular()) << std::endl; + std::cout << u8"Emissive: " << PrintColor(obj->GetEmissive()) << std::endl; + + std::cout << strop::printf(u8"Specular Power: %.2" PRIfCKFLOAT, obj->GetSpecularPower()) << std::endl; + + // basic data + std::cout << u8"== Basic ==" << std::endl; + std::cout << u8"Both Sided: " << PrintBool(obj->GetTwoSidedEnabled()) << std::endl; + std::cout << u8"Fill Mode: " << Docstring::GetEnumName(obj->GetFillMode()) << std::endl; + std::cout << u8"Shade Mode: " << Docstring::GetEnumName(obj->GetShadeMode()) << std::endl; + + // textures + std::cout << u8"== Texture ==" << std::endl; + std::cout << u8"Textures:" << std::endl; + auto texture_table = CreateStandardTable({ + u8"Index", + u8"Address", + u8"Name", + }); + for (LibCmo::CKDWORD i = 0; i < 4; ++i) { + auto tex = obj->GetTexture(i); + texture_table.add_row( + {strop::printf(u8"#%" PRIuCKDWORD, i), PrintPointer(tex), (tex != nullptr ? PrintCKSTRING(tex->GetName()) : u8"")}); + } + texture_table.print(); + std::cout << u8"Texture Blend: " << Docstring::GetEnumName(obj->GetTextureBlendMode()) << std::endl; + std::cout << u8"Filter Min: " << Docstring::GetEnumName(obj->GetTextureMinMode()) << std::endl; + std::cout << u8"Filter Mag: " << Docstring::GetEnumName(obj->GetTextureMagMode()) << std::endl; + std::cout << u8"Address Mode: " << Docstring::GetEnumName(obj->GetTextureAddressMode()) << std::endl; + std::cout << u8"Perspective Correct: " << PrintBool(obj->GetPerspectiveCorrectionEnabled()) << std::endl; + + // alpha test + std::cout << u8"== Alpha Test ==" << std::endl; + std::cout << u8"Enabled: " << PrintBool(obj->GetAlphaTestEnabled()) << std::endl; + std::cout << u8"Alpha Function: " << Docstring::GetEnumName(obj->GetAlphaFunc()) << std::endl; + std::cout << strop::printf(u8"Alpha Ref Value: %" PRIuCKBYTE, obj->GetAlphaRef()) << std::endl; + + // alpha blend + std::cout << u8"== Alpha Blend ==" << std::endl; + std::cout << u8"Enabled: " << PrintBool(obj->GetAlphaBlendEnabled()) << std::endl; + std::cout << u8"Source Blend: " << Docstring::GetEnumName(obj->GetSourceBlend()) << std::endl; + std::cout << u8"Destination Blend: " << Docstring::GetEnumName(obj->GetDestBlend()) << std::endl; + + // z buffer + std::cout << u8"== Z-Buffer Write ==" << std::endl; + std::cout << u8"Enabled: " << PrintBool(obj->GetZWriteEnabled()) << std::endl; + std::cout << u8"Z Compare Function: " << Docstring::GetEnumName(obj->GetZFunc()) << std::endl; + + // effect + std::cout << u8"== Effect ==" << std::endl; + std::cout << u8"Effect: " << Docstring::GetEnumName(obj->GetEffect()) << std::endl; + + } + + static void PrintCKMeshDetail(LibCmo::CK2::ObjImpls::CKMesh* obj) { + PrintCKBeObjectDetail(obj); + termcolor::cprintln(u8"CKMesh", termcolor::Color::LightYellow); + + std::cout << u8"== Flags ==" << std::endl; + std::cout << u8"Mesh Flags:" << std::endl; + std::cout << Docstring::GetFlagEnumName(obj->GetMeshFlags(), u8"\n", u8"\t") << std::endl; + std::cout << u8"Lit Mode: " << Docstring::GetEnumName(obj->GetLitMode()) << std::endl; + std::cout << u8"Wrap Mode: " << Docstring::GetEnumName(obj->GetWrapMode()) << std::endl; + + // vertex data + std::cout << u8"== Vertex ==" << std::endl; + std::cout << strop::printf(u8"Vertex Count: %" PRIuCKDWORD, obj->GetVertexCount()) << std::endl; + auto vertex_table = CreateStandardTable({ + u8"Address", + u8"Size", + u8"Type", + }); + vertex_table.add_row({ + PrintPointer(obj->GetVertexPositions()), + strop::printf(u8"0x%" PRIxCKDWORD " bytes", obj->GetVertexCount() * CKSizeof(LibCmo::VxMath::VxVector3)), + u8"Positions", + }); + vertex_table.add_row({ + PrintPointer(obj->GetVertexNormals()), + strop::printf(u8"0x%" PRIxCKDWORD " bytes", obj->GetVertexCount() * CKSizeof(LibCmo::VxMath::VxVector3)), + u8"Normals", + }); + vertex_table.add_row({ + PrintPointer(obj->GetVertexUVs()), + strop::printf(u8"0x%" PRIxCKDWORD " bytes", obj->GetVertexCount() * CKSizeof(LibCmo::VxMath::VxVector2)), + u8"UVs", + }); + vertex_table.add_row({ + PrintPointer(obj->GetVertexColors()), + strop::printf(u8"0x%" PRIxCKDWORD " bytes", obj->GetVertexCount() * CKSizeof(LibCmo::CKDWORD)), + u8"Colors", + }); + vertex_table.add_row({ + PrintPointer(obj->GetVertexSpecularColors()), + strop::printf(u8"0x%" PRIxCKDWORD " bytes", obj->GetVertexCount() * CKSizeof(LibCmo::CKDWORD)), + u8"Specular Colors", + }); + vertex_table.print(); + + // face data + std::cout << u8"== Face ==" << std::endl; + std::cout << strop::printf(u8"Face Count: %" PRIuCKDWORD, obj->GetFaceCount()) << std::endl; + auto face_table = CreateStandardTable({ + u8"Address", + u8"Size", + u8"Type", + }); + face_table.add_row({ + PrintPointer(obj->GetFaceIndices()), + strop::printf(u8"0x%" PRIxCKDWORD " bytes", obj->GetFaceCount() * 3 * CKSizeof(LibCmo::CKWORD)), + u8"Indices", + }); + face_table.add_row({ + PrintPointer(obj->GetFaceMaterialSlotIndexs()), + strop::printf(u8"0x%" PRIxCKDWORD " bytes", obj->GetFaceCount() * CKSizeof(LibCmo::CKWORD)), + u8"Material Slot Indexs", + }); + face_table.print(); + + // mtl slot data + std::cout << u8"== Material Slot ==" << std::endl; + LibCmo::CKDWORD slotcount = obj->GetMaterialSlotCount(); + LibCmo::CK2::ObjImpls::CKMaterial** pMtlSlots = obj->GetMaterialSlots(); + std::cout << strop::printf(u8"Material Slot Count: %" PRIuCKDWORD, slotcount) << std::endl; + auto mtl_table = CreateStandardTable({ + u8"Index", + u8"Address", + u8"Name", + }); + for (LibCmo::CKDWORD i = 0; i < slotcount; ++i) { + LibCmo::CK2::ObjImpls::CKMaterial* mtl = pMtlSlots[i]; + mtl_table.add_row( + {strop::printf(u8"#%" PRIuCKDWORD, i), PrintPointer(mtl), (mtl != nullptr ? PrintCKSTRING(mtl->GetName()) : u8"")}); + } + mtl_table.print(); + + } + +#pragma endregion + + + void PrintCKFileInfo(const LibCmo::CK2::CKFileInfo& fileinfo) { + + console::write_line(YYCC_COLOR_LIGHT_YELLOW(u8"CKFileInfo")); + console::format_line(u8"FileVersion: %" PRIuCKDWORD, fileinfo.FileVersion); + LibCmo::CKDWORD ck_series[3] { + (fileinfo.CKVersion >> 24) & 0xFF, + (fileinfo.CKVersion >> 16) & 0xFF, + (fileinfo.CKVersion >> 0) & 0xFFFF + }; + console::format_line(u8"CKVersion: %02" PRIxCKDWORD "/%02" PRIxCKDWORD "/%04" PRIxCKDWORD, + ck_series[0], ck_series[1], ck_series[2] + ); + LibCmo::CKDWORD product_series[4] { + (fileinfo.ProductBuild >> 24) & 0xFF, + (fileinfo.ProductBuild >> 16) & 0xFF, + (fileinfo.ProductBuild >> 8) & 0xFF, + (fileinfo.ProductBuild >> 0) & 0xFF, + }; + console::format_line(u8"Product (Version / Build): %" PRIuCKDWORD " / %" PRIuCKDWORD ".%" PRIuCKDWORD ".%" PRIuCKDWORD ".%" PRIuCKDWORD, + fileinfo.ProductVersion, product_series[0], product_series[1], product_series[2], product_series[3] + ); + + console::format_line(u8"Save Flags: %s", + Docstring::GetFlagEnumName(fileinfo.FileWriteMode, u8", ").c_str() + ); + + console::format_line(u8"File Size: %s", Docstring::GetReadableFileSize(fileinfo.FileSize).c_str()); + + console::format_line(u8"Crc: 0x%" PRIxCKDWORD, fileinfo.Crc); + console::write_line(u8""); + + + console::format_line(u8"Hdr1 (Pack / UnPack): %s / %s", + Docstring::GetReadableFileSize(fileinfo.Hdr1PackSize).c_str(), + Docstring::GetReadableFileSize(fileinfo.Hdr1UnPackSize).c_str() + ); + + console::format_line(u8"Data (Pack / UnPack): %s / %s", + Docstring::GetReadableFileSize(fileinfo.DataPackSize).c_str(), + Docstring::GetReadableFileSize(fileinfo.DataUnPackSize).c_str() + ); + console::write_line(u8""); + + + console::format_line(u8"Manager Count: %" PRIuCKDWORD, fileinfo.ManagerCount); + console::format_line(u8"Object Count: %" PRIuCKDWORD, fileinfo.ObjectCount); + console::format_line(u8"Max ID Saved: %" PRIuCKID, fileinfo.MaxIDSaved); + + } + +#pragma region Object List Printer + + static void PrintObjectListHeader(bool full_detail) { + if (full_detail) { + console::write_line(u8"SaveFlags\tOptions\tCK ID\tFile CK ID\tFile Index\tPack Size\tIndex\tType\tCKObject\tCKStateChunk\tName"); + } else { + console::write_line(u8"Index\tType\tObject\tChunk\tName"); + } + } + static void PrintObjectListEntry(const LibCmo::CK2::CKFileObject& obj, const LibCmo::CK2::CKFileInfo& fileinfo, size_t entry_index, bool full_detail) { + if (full_detail) { + Console::Format(u8"0x%08" PRIxCKDWORD "\t", obj.SaveFlags); + Console::Format(u8"%s\t", Docstring::GetEnumName(obj.Options).c_str()); + + Console::Format(u8"%" PRIuCKID "\t%" PRIuCKID "\t", + obj.CreatedObjectId, + obj.ObjectId + ); + + Console::Format(u8"0x%08" PRIxCKDWORD " (Rel: 0x%08" PRIxCKDWORD ")\t", + obj.FileIndex, + obj.FileIndex - CKSizeof(LibCmo::CK2::CKRawFileInfo) - fileinfo.Hdr1UnPackSize + ); + Console::Format(u8"0x%08" PRIxCKDWORD "\t", obj.PackSize); + } + // following items are shared by full details and simple layout + console::format_line(u8"#%" PRIuSIZET "\t%s\t%s\t%s\t%s", + entry_index, + Docstring::GetClassIdName(obj.ObjectCid).c_str(), + PrintColorfulBool(obj.ObjPtr != nullptr).c_str(), + PrintColorfulBool(obj.Data != nullptr).c_str(), + PrintCKSTRING(LibCmo::XContainer::NSXString::ToCKSTRING(obj.Name)).c_str() + ); + } + void PrintObjectList( + const LibCmo::XContainer::XArray& ls, + const LibCmo::CK2::CKFileInfo& fileinfo, + size_t page, size_t pageitems, + bool full_detail) { + + console::write_line(YYCC_COLOR_LIGHT_YELLOW(u8"CKFileObject")); + GeneralPrintList(ls, page, pageitems, + [full_detail]() -> void { + PrintObjectListHeader(full_detail); + }, + [&fileinfo, full_detail](size_t index, const LibCmo::CK2::CKFileObject& obj) -> void { + PrintObjectListEntry(obj, fileinfo, index, full_detail); + } + ); + + } + void PrintSearchedObjectList( + const LibCmo::XContainer::XArray& idxls, + const LibCmo::XContainer::XArray& ls, + const LibCmo::CK2::CKFileInfo& fileinfo, + size_t page, size_t pageitems, + bool full_detail) { + + console::write_line(YYCC_COLOR_LIGHT_YELLOW(u8"CKFileObject Searching Result")); + GeneralPrintList(idxls, page, pageitems, + [full_detail]() -> void { + PrintObjectListHeader(full_detail); + }, + [&ls, &fileinfo, full_detail](size_t, const size_t& index_to_obj) -> void { + // resolve index to real item. + // and pass the entry index, not the page index. + PrintObjectListEntry(ls[index_to_obj], fileinfo, index_to_obj, full_detail); + } + ); + + } + +#pragma endregion + +#pragma region Manager List Printer + + static void PrintManagerListHeader(bool full_detail) { + // manager list now do not affected by list style because it is enough short + console::write_line(u8"Index\tCKGUID\tCKStateChunk"); + } + static void PrintManagerListEntry(const LibCmo::CK2::CKFileManagerData& mgr, size_t entry_index, bool full_detail) { + // not affected by list style. + console::format_line(u8"#%" PRIuSIZET "\t%s\t%s", + entry_index, + PrintCKGUID(mgr.Manager).c_str(), + PrintPointer(mgr.Data).c_str() + ); + } + void PrintManagerList( + const LibCmo::XContainer::XArray& ls, + size_t page, size_t pageitems, + bool full_detail) { + + console::write_line(YYCC_COLOR_LIGHT_YELLOW(u8"CKFileManager")); + GeneralPrintList(ls, page, pageitems, + [full_detail]() -> void { + // print header + PrintManagerListHeader(full_detail); + }, + [full_detail](size_t index, const LibCmo::CK2::CKFileManagerData& mgr) -> void { + // print body + PrintManagerListEntry(mgr, index, full_detail); + } + ); + + } + void PrintSearchedManagerList( + const LibCmo::XContainer::XArray& idxls, + const LibCmo::XContainer::XArray& ls, + size_t page, size_t pageitems, + bool full_detail) { + + console::write_line(YYCC_COLOR_LIGHT_YELLOW(u8"CKFileManager Searching Result")); + GeneralPrintList(idxls, page, pageitems, + [full_detail]() -> void { + PrintManagerListHeader(full_detail); + }, + [&ls, full_detail](size_t, const size_t& index_to_mgr) -> void { + // resolve index to real one + PrintManagerListEntry(ls[index_to_mgr], index_to_mgr, full_detail); + } + ); + + } + +#pragma endregion + + void PrintCKObject(const LibCmo::CK2::ObjImpls::CKObject* obj) { + if (obj == nullptr) { + console::write_line(YYCC_COLOR_LIGHT_RED(u8"Null Object")); + return; + } + + LibCmo::CK2::ObjImpls::CKObject* mobj = const_cast(obj); + switch (mobj->GetClassID()) { + case LibCmo::CK2::CK_CLASSID::CKCID_OBJECT: + PrintCKObjectDetail(static_cast(mobj)); + break; + case LibCmo::CK2::CK_CLASSID::CKCID_SCENEOBJECT: + PrintCKSceneObjectDetail(static_cast(mobj)); + break; + case LibCmo::CK2::CK_CLASSID::CKCID_BEOBJECT: + PrintCKBeObjectDetail(static_cast(mobj)); + break; + case LibCmo::CK2::CK_CLASSID::CKCID_GROUP: + PrintCKGroupDetail(static_cast(mobj)); + break; + case LibCmo::CK2::CK_CLASSID::CKCID_RENDEROBJECT: + PrintCKRenderObjectDetail(static_cast(mobj)); + break; + case LibCmo::CK2::CK_CLASSID::CKCID_3DENTITY: + PrintCK3dEntityDetail(static_cast(mobj)); + break; + case LibCmo::CK2::CK_CLASSID::CKCID_LIGHT: + PrintCKLightDetail(static_cast(mobj)); + break; + case LibCmo::CK2::CK_CLASSID::CKCID_TARGETLIGHT: + PrintCKTargetLightDetail(static_cast(mobj)); + break; + case LibCmo::CK2::CK_CLASSID::CKCID_CAMERA: + PrintCKCameraDetail(static_cast(mobj)); + break; + case LibCmo::CK2::CK_CLASSID::CKCID_TARGETCAMERA: + PrintCKTargetCameraDetail(static_cast(mobj)); + break; + case LibCmo::CK2::CK_CLASSID::CKCID_3DOBJECT: + PrintCK3dObjectDetail(static_cast(mobj)); + break; + case LibCmo::CK2::CK_CLASSID::CKCID_TEXTURE: + PrintCKTextureDetail(static_cast(mobj)); + break; + case LibCmo::CK2::CK_CLASSID::CKCID_MATERIAL: + PrintCKMaterialDetail(static_cast(mobj)); + break; + case LibCmo::CK2::CK_CLASSID::CKCID_MESH: + PrintCKMeshDetail(static_cast(mobj)); + break; + default: + console::write_line(YYCC_COLOR_LIGHT_RED(u8"Not Implemented.")); + break; + } + + } + + void PrintCKBaseManager(const LibCmo::CK2::MgrImpls::CKBaseManager* mgr) { + console::write_line(YYCC_COLOR_LIGHT_YELLOW(u8"CKBaseManager")); + if (mgr == nullptr) { + console::write_line(YYCC_COLOR_LIGHT_RED(u8"Null Manager")); + return; + } + + console::write_line(YYCC_COLOR_LIGHT_RED(u8"Not Implemented.")); + } + + void PrintCKStateChunk(const LibCmo::CK2::CKStateChunk* chunk) { + console::write_line(YYCC_COLOR_LIGHT_YELLOW(u8"CKStateChunk")); + if (chunk == nullptr) { + console::write_line(YYCC_COLOR_LIGHT_RED(u8"Null Chunk")); + return; + } + + // hack const state chunk + LibCmo::CK2::CKStateChunk* operchunk = const_cast(chunk); + + // write profile + const auto profile = operchunk->GetStateChunkProfile(); + + console::format_line(u8"Type: %s", Docstring::GetClassIdName(profile.m_ClassId).c_str()); + + console::format_line(u8"Version (Data / Chunk): %" PRIuCKDWORD " (%s) / %" PRIuCKDWORD " (%s)", + static_cast(profile.m_DataVersion), Docstring::GetEnumName(profile.m_DataVersion).c_str(), + static_cast(profile.m_ChunkVersion), Docstring::GetEnumName(profile.m_ChunkVersion).c_str() + ); + console::format_line(u8"List (Object / Chunk / Manager): %" PRIuCKDWORD " / %" PRIuCKDWORD " / %" PRIuCKDWORD, + static_cast(profile.m_ObjectListSize), + static_cast(profile.m_ChunkListSize), + static_cast(profile.m_ManagerListSize) + ); + + console::format_line(u8"Data: %s (0x%" PRIxCKDWORD " DWORD)", + PrintPointer(profile.m_pData).c_str(), + profile.m_DataDwSize + ); + + console::format_line(u8"Bind CKFile: %s", PrintPointer(profile.m_BindFile).c_str()); + console::format_line(u8"Bind CKContext: %s", PrintPointer(profile.m_BindContext).c_str()); + + // write identifiers + operchunk->StartRead(); + const auto collection = operchunk->GetIdentifiersProfile(); + operchunk->StopRead(); + console::write_line(YYCC_COLOR_LIGHT_YELLOW(u8"Identifiers")); + console::write_line(u8"Identifier\tData Pointer\tData Size"); + for (const auto& ident : collection) { + console::format_line(u8"0x%08" PRIxCKDWORD "\t%s\t%" PRIuCKDWORD " (%" PRIuCKDWORD " DWORD + %" PRIuCKDWORD ")", + ident.m_Identifier, + PrintPointer(ident.m_DataPtr).c_str(), + ident.m_AreaSize, + ident.m_AreaSize / CKSizeof(LibCmo::CKDWORD), + ident.m_AreaSize % CKSizeof(LibCmo::CKDWORD) + ); + } + } + +} diff --git a/Unvirt/StructFormatter.hpp b/Unvirt/StructFmt.hpp similarity index 96% rename from Unvirt/StructFormatter.hpp rename to Unvirt/StructFmt.hpp index 22d317a..da405ec 100644 --- a/Unvirt/StructFormatter.hpp +++ b/Unvirt/StructFmt.hpp @@ -2,7 +2,7 @@ #include -namespace Unvirt::StructFormatter { +namespace Unvirt::StructFmt { #define PRIuSIZET "zu" diff --git a/Unvirt/StructFormatter.cpp b/Unvirt/StructFormatter.cpp deleted file mode 100644 index dab85fa..0000000 --- a/Unvirt/StructFormatter.cpp +++ /dev/null @@ -1,718 +0,0 @@ -#include "StructFormatter.hpp" - -#include -#include "AccessibleValue.hpp" - -namespace Console = YYCC::ConsoleHelper; - -namespace Unvirt::StructFormatter { - -#pragma region Assist Functions - - static std::u8string PrintCKSTRING(LibCmo::CKSTRING name) { - std::u8string ret; - if (name == nullptr) { - ret = YYCC_COLOR_LIGHT_MAGENTA(u8""); - } else { - if (name[0] == u8'\0') { - ret = YYCC_COLOR_LIGHT_MAGENTA(u8""); - } else { - ret = name; - } - } - return ret; - } - static std::u8string PrintPointer(const void* ptr) { - std::u8string ret; - if (ptr == nullptr) { - ret = YYCC_COLOR_LIGHT_CYAN(u8""); - } else { - YYCC::StringHelper::Printf(ret, u8"<0x%" PRI_XPTR_LEFT_PADDING PRIxPTR ">", reinterpret_cast(ptr)); - } - return ret; - } - static std::u8string PrintCKGUID(const LibCmo::CK2::CKGUID& guid) { - return YYCC::StringHelper::Printf(u8"<0x%08" PRIxCKDWORD ", 0x%08" PRIxCKDWORD ">", guid.d1, guid.d2); - } - static std::u8string PrintBool(bool v) { - return (v ? u8"true" : u8"false"); - } - static std::u8string PrintColorfulBool(bool v) { - return (v ? YYCC_COLOR_LIGHT_GREEN(u8"Yes") : YYCC_COLOR_LIGHT_RED(u8"No")); - } - static std::u8string PrintColor(LibCmo::CKDWORD argb) { - LibCmo::CKDWORD a = (argb & 0xFF000000) >> 24, - r = (argb & 0x00FF0000) >> 16, - g = (argb & 0x0000FF00) >> 8, - b = (argb & 0x000000FF); - LibCmo::CKFLOAT fa = static_cast(a) / 255.0f; - return YYCC::StringHelper::Printf( - u8"A:%" PRIuCKDWORD " (%.4" PRIfCKFLOAT ") " - "RGB(%" PRIuCKDWORD ", %" PRIuCKDWORD ", %" PRIuCKDWORD ") " - "RGB#%02" PRIxCKDWORD "%02" PRIxCKDWORD "%02" PRIxCKDWORD " " - "RGBA#%02" PRIxCKDWORD "%02" PRIxCKDWORD "%02" PRIxCKDWORD "%02" PRIxCKDWORD, - a, fa, - r, g, b, - r, g, b, - r, g, b, a - ); - } - static std::u8string PrintColor(const LibCmo::VxMath::VxColor& col) { - return PrintColor(col.ToARGB()); - } - - template - static void GeneralPrintList( - const std::vector<_Ty>& data, size_t page, size_t pageitems, - std::function printHdrFct, std::function printEntryFct) { - - // check page overflow - if (page * pageitems >= data.size()) { - Console::WriteLine(YYCC_COLOR_LIGHT_RED(u8"Page out of range.")); - return; - } - - // calc page data - size_t fulllen = data.size(), - startpos = page * pageitems, - fullpage = (fulllen + (pageitems - 1)) / pageitems; // to solve `fulllen / pageitems` empty page issue. like CKStateChunk::GetCeilDwordSize function (+3 /4 to get DWORD size). - - // print header - printHdrFct(); - - // print body - for (size_t counter = startpos; counter < fulllen && (counter - startpos) < pageitems; ++counter) { - printEntryFct(counter, data[counter]); - } - - Console::FormatLine(u8"Page %" PRIuSIZET " of %" PRIuSIZET, page + 1, fullpage); - } - -#pragma endregion - -#pragma region Object Printer - - static void PrintCKObjectDetail(LibCmo::CK2::ObjImpls::CKObject* obj) { - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CKObject")); - // print name - Console::FormatLine(u8"Name: %s", PrintCKSTRING(obj->GetName()).c_str()); - // print id - Console::FormatLine(u8"CK ID: %" PRIuCKID, obj->GetID()); - // print class id - Console::FormatLine(u8"Class ID: %" PRIiCLASSID " (%s)", obj->GetClassID(), AccessibleValue::GetClassIdHierarchy(obj->GetClassID()).c_str()); - // print flags - Console::WriteLine(u8"Flags:"); - Console::WriteLine(AccessibleValue::GetFlagEnumName(obj->GetObjectFlags(), AccessibleValue::EnumDesc::CK_OBJECT_FLAGS, u8"\n", u8"\t").c_str()); - } - - static void PrintCKSceneObjectDetail(LibCmo::CK2::ObjImpls::CKSceneObject* obj) { - PrintCKObjectDetail(obj); - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CKSceneObject")); - Console::WriteLine(YYCC_COLOR_LIGHT_RED(u8"No Data")); - } - - static void PrintCKBeObjectDetail(LibCmo::CK2::ObjImpls::CKBeObject* obj) { - PrintCKSceneObjectDetail(obj); - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CKBeObject")); - Console::WriteLine(YYCC_COLOR_LIGHT_RED(u8"No Data")); - } - - static void PrintCKGroupDetail(LibCmo::CK2::ObjImpls::CKGroup* obj) { - PrintCKBeObjectDetail(obj); - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CKGroup")); - - LibCmo::CKDWORD count = obj->GetObjectCount(); - Console::FormatLine(u8"Group Object Count: %" PRIuCKDWORD, count); - Console::WriteLine(u8"CKID\tType\tObject\tName"); - for (LibCmo::CKDWORD i = 0; i < count; ++i) { - LibCmo::CK2::ObjImpls::CKBeObject* beobj = obj->GetObject(i); - - Console::FormatLine(u8"%" PRIuCKID "\t%s\t%s\t%s", - beobj->GetID(), - AccessibleValue::GetClassIdName(beobj->GetClassID()).c_str(), - PrintPointer(beobj).c_str(), - (beobj != nullptr ? PrintCKSTRING(beobj->GetName()).c_str() : u8"") - ); - } - } - - static void PrintCKRenderObjectDetail(LibCmo::CK2::ObjImpls::CKRenderObject* obj) { - PrintCKBeObjectDetail(obj); - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CKRenderObject")); - Console::WriteLine(YYCC_COLOR_LIGHT_RED(u8"No Data")); - } - - static void PrintCK3dEntityDetail(LibCmo::CK2::ObjImpls::CK3dEntity* obj) { - PrintCKRenderObjectDetail(obj); - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CK3dEntity")); - - Console::WriteLine(u8"== World Matrix =="); - auto mat = obj->GetWorldMatrix(); - for (LibCmo::CKDWORD i = 0; i < 4; ++i) { - Console::FormatLine(u8"%+" PRIeCKFLOAT "\t%+" PRIeCKFLOAT "\t%+" PRIeCKFLOAT "\t%+" PRIeCKFLOAT, - mat[i].x, mat[i].y, mat[i].z, mat[i].w - ); - } - - Console::WriteLine(u8"== Flags =="); - Console::WriteLine(u8"3dEntity Flags:"); - Console::WriteLine(AccessibleValue::GetFlagEnumName(obj->GetEntityFlags(), AccessibleValue::EnumDesc::CK_3DENTITY_FLAGS, u8"\n", u8"\t").c_str()); - Console::WriteLine(u8"Moveable Flags:"); - Console::WriteLine(AccessibleValue::GetFlagEnumName(obj->GetMoveableFlags(), AccessibleValue::EnumDesc::VX_MOVEABLE_FLAGS, u8"\n", u8"\t").c_str()); - - Console::WriteLine(u8"== Meshs =="); - Console::WriteLine(u8"Index\tAddress\tName"); - // print current mesh - { - auto curmesh = obj->GetCurrentMesh(); - Console::FormatLine(u8"->\t%s\t%s", - PrintPointer(curmesh).c_str(), - (curmesh != nullptr ? PrintCKSTRING(curmesh->GetName()).c_str() : u8"") - ); - } - // print other meshes - for (LibCmo::CKDWORD i = 0; i < obj->GetPotentialMeshCount(); ++i) { - auto thismesh = obj->GetPotentialMesh(i); - Console::FormatLine(u8"#%" PRIuCKDWORD "\t%s\t%s", - i, - PrintPointer(thismesh).c_str(), - (thismesh != nullptr ? PrintCKSTRING(thismesh->GetName()).c_str() : u8"") - ); - } - - } - - static void PrintCKLightDetail(LibCmo::CK2::ObjImpls::CKLight* obj) { - PrintCK3dEntityDetail(obj); - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CKLight")); - - Console::WriteLine(u8"== Basics =="); - Console::FormatLine(u8"Type: %s", AccessibleValue::GetEnumName(obj->GetType(), AccessibleValue::EnumDesc::VXLIGHT_TYPE).c_str()); - Console::FormatLine(u8"Color: %s", PrintColor(obj->GetColor()).c_str()); - Console::FormatLine(u8"Light Power: %.2" PRIfCKFLOAT, obj->GetLightPower()); - - Console::WriteLine(u8"== Switches =="); - Console::FormatLine(u8"Activity: %s", PrintBool(obj->GetActivity()).c_str()); - Console::FormatLine(u8"Specular Flag: %s", PrintBool(obj->GetSpecularFlag()).c_str()); - - Console::WriteLine(u8"== Attenuation =="); - Console::FormatLine(u8"Constant Attenuation: %.2" PRIfCKFLOAT, obj->GetConstantAttenuation()); - Console::FormatLine(u8"Linear Attenuation: %.2" PRIfCKFLOAT, obj->GetLinearAttenuation()); - Console::FormatLine(u8"Quadratic Attenuation: %.2" PRIfCKFLOAT, obj->GetQuadraticAttenuation()); - - Console::WriteLine(u8"== Spot Cone =="); - Console::FormatLine(u8"Range: %.2" PRIfCKFLOAT, obj->GetRange()); - Console::FormatLine(u8"Hot Spot: %.2" PRIfCKFLOAT, obj->GetHotSpot()); - Console::FormatLine(u8"Falloff: %.2" PRIfCKFLOAT, obj->GetFalloff()); - Console::FormatLine(u8"Falloff Shape: %.2" PRIfCKFLOAT, obj->GetFalloffShape()); - - Console::WriteLine(u8"== Target =="); - auto thistarget = obj->GetTarget(); - Console::FormatLine(u8"Target Address: %s", PrintPointer(thistarget).c_str()); - if (thistarget != nullptr) - Console::FormatLine(u8"Target Name: %s", PrintCKSTRING(thistarget->GetName()).c_str()); - } - - static void PrintCKTargetLightDetail(LibCmo::CK2::ObjImpls::CKTargetLight* obj) { - PrintCKLightDetail(obj); - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CKTargetLight")); - Console::WriteLine(YYCC_COLOR_LIGHT_RED(u8"No Data")); - } - - static void PrintCKCameraDetail(LibCmo::CK2::ObjImpls::CKCamera* obj) { - PrintCK3dEntityDetail(obj); - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CKCamera")); - - Console::WriteLine(u8"== Basics =="); - Console::FormatLine(u8"Projection Type: %s", AccessibleValue::GetEnumName(obj->GetProjectionType(), AccessibleValue::EnumDesc::CK_CAMERA_PROJECTION).c_str()); - Console::FormatLine(u8"Orthographic Zoom: %.2" PRIfCKFLOAT, obj->GetOrthographicZoom()); - Console::FormatLine(u8"Front Plane: %.2" PRIfCKFLOAT, obj->GetFrontPlane()); - Console::FormatLine(u8"Back Plane: %.2" PRIfCKFLOAT, obj->GetBackPlane()); - Console::FormatLine(u8"Fov: %.2" PRIfCKFLOAT, obj->GetFov()); - LibCmo::CKDWORD width, height; - obj->GetAspectRatio(width, height); - Console::FormatLine(u8"Aspect Ratio: %" PRIuCKDWORD " : %" PRIuCKDWORD, width, height); - - Console::WriteLine(u8"== Target =="); - auto thistarget = obj->GetTarget(); - Console::FormatLine(u8"Target Address: %s", PrintPointer(thistarget).c_str()); - if (thistarget != nullptr) - Console::FormatLine(u8"Target Name: %s", PrintCKSTRING(thistarget->GetName()).c_str()); - } - - static void PrintCKTargetCameraDetail(LibCmo::CK2::ObjImpls::CKTargetCamera* obj) { - PrintCKCameraDetail(obj); - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CKTargetCamera")); - Console::WriteLine(YYCC_COLOR_LIGHT_RED(u8"No Data")); - } - - static void PrintCK3dObjectDetail(LibCmo::CK2::ObjImpls::CK3dObject* obj) { - PrintCK3dEntityDetail(obj); - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CK3dObject")); - Console::WriteLine(YYCC_COLOR_LIGHT_RED(u8"No Data")); - } - - static void PrintCKTextureDetail(LibCmo::CK2::ObjImpls::CKTexture* obj) { - PrintCKBeObjectDetail(obj); - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CKTexture")); - - // texture - Console::WriteLine(u8"== Texture =="); - - LibCmo::CK2::CKBitmapData& bd = obj->GetUnderlyingData(); - LibCmo::CKDWORD slot_count = bd.GetSlotCount(); - Console::FormatLine(u8"Slot Count: %" PRIuCKDWORD, slot_count); - Console::FormatLine(u8"Current Slot: %" PRIuCKDWORD, bd.GetCurrentSlot()); - - Console::WriteLine(u8"Index\tWidth\tHeight\tImage Addr\tImage Size\tFilename"); - for (LibCmo::CKDWORD i = 0; i < slot_count; ++i) { - auto desc = bd.GetImageDesc(i); - - Console::FormatLine(u8"#%" PRIuCKDWORD "\t%" PRIuCKDWORD "\t%" PRIuCKDWORD "\t%s\t0x%" PRIxCKDWORD " bytes\t%s", - i, - desc->GetWidth(), - desc->GetHeight(), - PrintPointer(desc->GetImage()).c_str(), - desc->GetImageSize(), - PrintCKSTRING(bd.GetSlotFileName(i)).c_str() - ); - } - - // other data - Console::WriteLine(u8"== Misc =="); - Console::FormatLine(u8"Video Format: %s", AccessibleValue::GetEnumName(obj->GetVideoFormat(), AccessibleValue::EnumDesc::VX_PIXELFORMAT).c_str()); - Console::FormatLine(u8"Save Option: %s", AccessibleValue::GetEnumName(bd.GetSaveOptions(), AccessibleValue::EnumDesc::CK_TEXTURE_SAVEOPTIONS).c_str()); - Console::FormatLine(u8"Pick Threshold: %" PRIuCKDWORD, bd.GetPickThreshold()); - Console::FormatLine(u8"Transparent Color: %s", PrintColor(bd.GetTransparentColor()).c_str()); - - Console::WriteLine(u8"Bitmap Flags:"); - Console::WriteLine(AccessibleValue::GetFlagEnumName(bd.GetBitmapFlags(), AccessibleValue::EnumDesc::CK_BITMAPDATA_FLAGS, u8"\n", u8"\t").c_str()); - } - - static void PrintCKMaterialDetail(LibCmo::CK2::ObjImpls::CKMaterial* obj) { - PrintCKBeObjectDetail(obj); - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CKMaterial")); - - // color - Console::WriteLine(u8"== Color =="); - - Console::FormatLine(u8"Diffuse: %s", PrintColor(obj->GetDiffuse()).c_str()); - Console::FormatLine(u8"Ambient: %s", PrintColor(obj->GetAmbient()).c_str()); - Console::FormatLine(u8"Specular: %s", PrintColor(obj->GetSpecular()).c_str()); - Console::FormatLine(u8"Emissive: %s", PrintColor(obj->GetEmissive()).c_str()); - - Console::FormatLine(u8"Specular Power: %.2" PRIfCKFLOAT, obj->GetSpecularPower()); - - // basic data - Console::WriteLine(u8"== Basic =="); - Console::FormatLine(u8"Both Sided: %s", PrintBool(obj->GetTwoSidedEnabled()).c_str()); - Console::FormatLine(u8"Fill Mode: %s", AccessibleValue::GetEnumName(obj->GetFillMode(), AccessibleValue::EnumDesc::VXFILL_MODE).c_str()); - Console::FormatLine(u8"Shade Mode: %s", AccessibleValue::GetEnumName(obj->GetShadeMode(), AccessibleValue::EnumDesc::VXSHADE_MODE).c_str()); - - // textures - Console::WriteLine(u8"== Texture =="); - Console::WriteLine(u8"Textures:"); - Console::WriteLine(u8"Index\tAddress\tName"); - for (LibCmo::CKDWORD i = 0; i < 4; ++i) { - auto tex = obj->GetTexture(i); - Console::FormatLine(u8"#%" PRIuCKDWORD "\t%s\t%s", - i, - PrintPointer(tex).c_str(), - (tex != nullptr ? PrintCKSTRING(tex->GetName()).c_str() : u8"") - ); - } - Console::FormatLine(u8"Texture Blend: %s", AccessibleValue::GetEnumName(obj->GetTextureBlendMode(), AccessibleValue::EnumDesc::VXTEXTURE_BLENDMODE).c_str()); - Console::FormatLine(u8"Filter Min: %s", AccessibleValue::GetEnumName(obj->GetTextureMinMode(), AccessibleValue::EnumDesc::VXTEXTURE_FILTERMODE).c_str()); - Console::FormatLine(u8"Filter Mag: %s", AccessibleValue::GetEnumName(obj->GetTextureMagMode(), AccessibleValue::EnumDesc::VXTEXTURE_FILTERMODE).c_str()); - Console::FormatLine(u8"Address Mode: %s", AccessibleValue::GetEnumName(obj->GetTextureAddressMode(), AccessibleValue::EnumDesc::VXTEXTURE_ADDRESSMODE).c_str()); - Console::FormatLine(u8"Perspective Correct: %s", PrintBool(obj->GetPerspectiveCorrectionEnabled()).c_str()); - - // alpha test - Console::WriteLine(u8"== Alpha Test =="); - Console::FormatLine(u8"Enabled: %s", PrintBool(obj->GetAlphaTestEnabled()).c_str()); - Console::FormatLine(u8"Alpha Function: %s", AccessibleValue::GetEnumName(obj->GetAlphaFunc(), AccessibleValue::EnumDesc::VXCMPFUNC).c_str()); - Console::FormatLine(u8"Alpha Ref Value: %" PRIuCKBYTE, obj->GetAlphaRef()); - - // alpha blend - Console::WriteLine(u8"== Alpha Blend =="); - Console::FormatLine(u8"Enabled: %s", PrintBool(obj->GetAlphaBlendEnabled()).c_str()); - Console::FormatLine(u8"Source Blend: %s", AccessibleValue::GetEnumName(obj->GetSourceBlend(), AccessibleValue::EnumDesc::VXBLEND_MODE).c_str()); - Console::FormatLine(u8"Destination Blend: %s", AccessibleValue::GetEnumName(obj->GetDestBlend(), AccessibleValue::EnumDesc::VXBLEND_MODE).c_str()); - - // z buffer - Console::WriteLine(u8"== Z-Buffer Write =="); - Console::FormatLine(u8"Enabled: %s", PrintBool(obj->GetZWriteEnabled()).c_str()); - Console::FormatLine(u8"Z Compare Function: %s", AccessibleValue::GetEnumName(obj->GetZFunc(), AccessibleValue::EnumDesc::VXCMPFUNC).c_str()); - - // effect - Console::WriteLine(u8"== Effect =="); - Console::FormatLine(u8"Effect: %s", AccessibleValue::GetEnumName(obj->GetEffect(), AccessibleValue::EnumDesc::VX_EFFECT).c_str()); - - } - - static void PrintCKMeshDetail(LibCmo::CK2::ObjImpls::CKMesh* obj) { - PrintCKBeObjectDetail(obj); - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CKMesh")); - - Console::WriteLine(u8"== Flags =="); - Console::WriteLine(u8"Mesh Flags:"); - Console::WriteLine(AccessibleValue::GetFlagEnumName(obj->GetMeshFlags(), AccessibleValue::EnumDesc::VXMESH_FLAGS, u8"\n", u8"\t").c_str()); - Console::FormatLine(u8"Lit Mode: %s", AccessibleValue::GetEnumName(obj->GetLitMode(), AccessibleValue::EnumDesc::VXMESH_LITMODE).c_str()); - Console::FormatLine(u8"Wrap Mode: %s", AccessibleValue::GetEnumName(obj->GetWrapMode(), AccessibleValue::EnumDesc::VXTEXTURE_WRAPMODE).c_str()); - - // vertex data - Console::WriteLine(u8"== Vertex =="); - Console::FormatLine(u8"Vertex Count: %" PRIuCKDWORD, obj->GetVertexCount()); - Console::WriteLine(u8"Address\tSize\tType"); - - Console::FormatLine(u8"%s\t0x%" PRIxCKDWORD " bytes\tPositions", - PrintPointer(obj->GetVertexPositions()).c_str(), - obj->GetVertexCount() * CKSizeof(LibCmo::VxMath::VxVector3) - ); - Console::FormatLine(u8"%s\t0x%" PRIxCKDWORD " bytes\tNormals", - PrintPointer(obj->GetVertexNormals()).c_str(), - obj->GetVertexCount() * CKSizeof(LibCmo::VxMath::VxVector3) - ); - Console::FormatLine(u8"%s\t0x%" PRIxCKDWORD " bytes\tUVs", - PrintPointer(obj->GetVertexUVs()).c_str(), - obj->GetVertexCount() * CKSizeof(LibCmo::VxMath::VxVector2) - ); - Console::FormatLine(u8"%s\t0x%" PRIxCKDWORD " bytes\tColors", - PrintPointer(obj->GetVertexColors()).c_str(), - obj->GetVertexCount() * CKSizeof(LibCmo::CKDWORD) - ); - Console::FormatLine(u8"%s\t0x%" PRIxCKDWORD " bytes\tSpecularColors", - PrintPointer(obj->GetVertexSpecularColors()).c_str(), - obj->GetVertexCount() * CKSizeof(LibCmo::CKDWORD) - ); - - // face data - Console::WriteLine(u8"== Face =="); - Console::FormatLine(u8"Face Count: %" PRIuCKDWORD, obj->GetFaceCount()); - Console::WriteLine(u8"Address\tSize\tType"); - - Console::FormatLine(u8"%s\t0x%" PRIxCKDWORD " bytes\tIndices", - PrintPointer(obj->GetFaceIndices()).c_str(), - obj->GetFaceCount() * 3 * CKSizeof(LibCmo::CKWORD) - ); - Console::FormatLine(u8"%s\t0x%" PRIxCKDWORD " bytes\tMaterialSlotIndexs", - PrintPointer(obj->GetFaceMaterialSlotIndexs()).c_str(), - obj->GetFaceCount() * CKSizeof(LibCmo::CKWORD) - ); - - // mtl slot data - Console::WriteLine(u8"== Material Slot =="); - LibCmo::CKDWORD slotcount = obj->GetMaterialSlotCount(); - LibCmo::CK2::ObjImpls::CKMaterial** pMtlSlots = obj->GetMaterialSlots(); - Console::FormatLine(u8"Material Slot Count: %" PRIuCKDWORD, slotcount); - Console::WriteLine(u8"Index\tAddress\tName"); - for (LibCmo::CKDWORD i = 0; i < slotcount; ++i) { - LibCmo::CK2::ObjImpls::CKMaterial* mtl = pMtlSlots[i]; - - Console::FormatLine(u8"#%" PRIuCKDWORD "\t%s\t%s", - i, - PrintPointer(mtl).c_str(), - (mtl != nullptr ? PrintCKSTRING(mtl->GetName()).c_str() : u8"") - ); - } - - } - -#pragma endregion - - - void PrintCKFileInfo(const LibCmo::CK2::CKFileInfo& fileinfo) { - - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CKFileInfo")); - Console::FormatLine(u8"FileVersion: %" PRIuCKDWORD, fileinfo.FileVersion); - LibCmo::CKDWORD ck_series[3] { - (fileinfo.CKVersion >> 24) & 0xFF, - (fileinfo.CKVersion >> 16) & 0xFF, - (fileinfo.CKVersion >> 0) & 0xFFFF - }; - Console::FormatLine(u8"CKVersion: %02" PRIxCKDWORD "/%02" PRIxCKDWORD "/%04" PRIxCKDWORD, - ck_series[0], ck_series[1], ck_series[2] - ); - LibCmo::CKDWORD product_series[4] { - (fileinfo.ProductBuild >> 24) & 0xFF, - (fileinfo.ProductBuild >> 16) & 0xFF, - (fileinfo.ProductBuild >> 8) & 0xFF, - (fileinfo.ProductBuild >> 0) & 0xFF, - }; - Console::FormatLine(u8"Product (Version / Build): %" PRIuCKDWORD " / %" PRIuCKDWORD ".%" PRIuCKDWORD ".%" PRIuCKDWORD ".%" PRIuCKDWORD, - fileinfo.ProductVersion, product_series[0], product_series[1], product_series[2], product_series[3] - ); - - Console::FormatLine(u8"Save Flags: %s", - AccessibleValue::GetFlagEnumName(fileinfo.FileWriteMode, AccessibleValue::EnumDesc::CK_FILE_WRITEMODE, u8", ").c_str() - ); - - Console::FormatLine(u8"File Size: %s", AccessibleValue::GetReadableFileSize(fileinfo.FileSize).c_str()); - - Console::FormatLine(u8"Crc: 0x%" PRIxCKDWORD, fileinfo.Crc); - Console::WriteLine(u8""); - - - Console::FormatLine(u8"Hdr1 (Pack / UnPack): %s / %s", - AccessibleValue::GetReadableFileSize(fileinfo.Hdr1PackSize).c_str(), - AccessibleValue::GetReadableFileSize(fileinfo.Hdr1UnPackSize).c_str() - ); - - Console::FormatLine(u8"Data (Pack / UnPack): %s / %s", - AccessibleValue::GetReadableFileSize(fileinfo.DataPackSize).c_str(), - AccessibleValue::GetReadableFileSize(fileinfo.DataUnPackSize).c_str() - ); - Console::WriteLine(u8""); - - - Console::FormatLine(u8"Manager Count: %" PRIuCKDWORD, fileinfo.ManagerCount); - Console::FormatLine(u8"Object Count: %" PRIuCKDWORD, fileinfo.ObjectCount); - Console::FormatLine(u8"Max ID Saved: %" PRIuCKID, fileinfo.MaxIDSaved); - - } - -#pragma region Object List Printer - - static void PrintObjectListHeader(bool full_detail) { - if (full_detail) { - Console::WriteLine(u8"SaveFlags\tOptions\tCK ID\tFile CK ID\tFile Index\tPack Size\tIndex\tType\tCKObject\tCKStateChunk\tName"); - } else { - Console::WriteLine(u8"Index\tType\tObject\tChunk\tName"); - } - } - static void PrintObjectListEntry(const LibCmo::CK2::CKFileObject& obj, const LibCmo::CK2::CKFileInfo& fileinfo, size_t entry_index, bool full_detail) { - if (full_detail) { - Console::Format(u8"0x%08" PRIxCKDWORD "\t", obj.SaveFlags); - Console::Format(u8"%s\t", AccessibleValue::GetEnumName(obj.Options, AccessibleValue::EnumDesc::CK_FO_OPTIONS).c_str()); - - Console::Format(u8"%" PRIuCKID "\t%" PRIuCKID "\t", - obj.CreatedObjectId, - obj.ObjectId - ); - - Console::Format(u8"0x%08" PRIxCKDWORD " (Rel: 0x%08" PRIxCKDWORD ")\t", - obj.FileIndex, - obj.FileIndex - CKSizeof(LibCmo::CK2::CKRawFileInfo) - fileinfo.Hdr1UnPackSize - ); - Console::Format(u8"0x%08" PRIxCKDWORD "\t", obj.PackSize); - } - // following items are shared by full details and simple layout - Console::FormatLine(u8"#%" PRIuSIZET "\t%s\t%s\t%s\t%s", - entry_index, - AccessibleValue::GetClassIdName(obj.ObjectCid).c_str(), - PrintColorfulBool(obj.ObjPtr != nullptr).c_str(), - PrintColorfulBool(obj.Data != nullptr).c_str(), - PrintCKSTRING(LibCmo::XContainer::NSXString::ToCKSTRING(obj.Name)).c_str() - ); - } - void PrintObjectList( - const LibCmo::XContainer::XArray& ls, - const LibCmo::CK2::CKFileInfo& fileinfo, - size_t page, size_t pageitems, - bool full_detail) { - - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CKFileObject")); - GeneralPrintList(ls, page, pageitems, - [full_detail]() -> void { - PrintObjectListHeader(full_detail); - }, - [&fileinfo, full_detail](size_t index, const LibCmo::CK2::CKFileObject& obj) -> void { - PrintObjectListEntry(obj, fileinfo, index, full_detail); - } - ); - - } - void PrintSearchedObjectList( - const LibCmo::XContainer::XArray& idxls, - const LibCmo::XContainer::XArray& ls, - const LibCmo::CK2::CKFileInfo& fileinfo, - size_t page, size_t pageitems, - bool full_detail) { - - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CKFileObject Searching Result")); - GeneralPrintList(idxls, page, pageitems, - [full_detail]() -> void { - PrintObjectListHeader(full_detail); - }, - [&ls, &fileinfo, full_detail](size_t, const size_t& index_to_obj) -> void { - // resolve index to real item. - // and pass the entry index, not the page index. - PrintObjectListEntry(ls[index_to_obj], fileinfo, index_to_obj, full_detail); - } - ); - - } - -#pragma endregion - -#pragma region Manager List Printer - - static void PrintManagerListHeader(bool full_detail) { - // manager list now do not affected by list style because it is enough short - Console::WriteLine(u8"Index\tCKGUID\tCKStateChunk"); - } - static void PrintManagerListEntry(const LibCmo::CK2::CKFileManagerData& mgr, size_t entry_index, bool full_detail) { - // not affected by list style. - Console::FormatLine(u8"#%" PRIuSIZET "\t%s\t%s", - entry_index, - PrintCKGUID(mgr.Manager).c_str(), - PrintPointer(mgr.Data).c_str() - ); - } - void PrintManagerList( - const LibCmo::XContainer::XArray& ls, - size_t page, size_t pageitems, - bool full_detail) { - - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CKFileManager")); - GeneralPrintList(ls, page, pageitems, - [full_detail]() -> void { - // print header - PrintManagerListHeader(full_detail); - }, - [full_detail](size_t index, const LibCmo::CK2::CKFileManagerData& mgr) -> void { - // print body - PrintManagerListEntry(mgr, index, full_detail); - } - ); - - } - void PrintSearchedManagerList( - const LibCmo::XContainer::XArray& idxls, - const LibCmo::XContainer::XArray& ls, - size_t page, size_t pageitems, - bool full_detail) { - - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CKFileManager Searching Result")); - GeneralPrintList(idxls, page, pageitems, - [full_detail]() -> void { - PrintManagerListHeader(full_detail); - }, - [&ls, full_detail](size_t, const size_t& index_to_mgr) -> void { - // resolve index to real one - PrintManagerListEntry(ls[index_to_mgr], index_to_mgr, full_detail); - } - ); - - } - -#pragma endregion - - void PrintCKObject(const LibCmo::CK2::ObjImpls::CKObject* obj) { - if (obj == nullptr) { - Console::WriteLine(YYCC_COLOR_LIGHT_RED(u8"Null Object")); - return; - } - - LibCmo::CK2::ObjImpls::CKObject* mobj = const_cast(obj); - switch (mobj->GetClassID()) { - case LibCmo::CK2::CK_CLASSID::CKCID_OBJECT: - PrintCKObjectDetail(static_cast(mobj)); - break; - case LibCmo::CK2::CK_CLASSID::CKCID_SCENEOBJECT: - PrintCKSceneObjectDetail(static_cast(mobj)); - break; - case LibCmo::CK2::CK_CLASSID::CKCID_BEOBJECT: - PrintCKBeObjectDetail(static_cast(mobj)); - break; - case LibCmo::CK2::CK_CLASSID::CKCID_GROUP: - PrintCKGroupDetail(static_cast(mobj)); - break; - case LibCmo::CK2::CK_CLASSID::CKCID_RENDEROBJECT: - PrintCKRenderObjectDetail(static_cast(mobj)); - break; - case LibCmo::CK2::CK_CLASSID::CKCID_3DENTITY: - PrintCK3dEntityDetail(static_cast(mobj)); - break; - case LibCmo::CK2::CK_CLASSID::CKCID_LIGHT: - PrintCKLightDetail(static_cast(mobj)); - break; - case LibCmo::CK2::CK_CLASSID::CKCID_TARGETLIGHT: - PrintCKTargetLightDetail(static_cast(mobj)); - break; - case LibCmo::CK2::CK_CLASSID::CKCID_CAMERA: - PrintCKCameraDetail(static_cast(mobj)); - break; - case LibCmo::CK2::CK_CLASSID::CKCID_TARGETCAMERA: - PrintCKTargetCameraDetail(static_cast(mobj)); - break; - case LibCmo::CK2::CK_CLASSID::CKCID_3DOBJECT: - PrintCK3dObjectDetail(static_cast(mobj)); - break; - case LibCmo::CK2::CK_CLASSID::CKCID_TEXTURE: - PrintCKTextureDetail(static_cast(mobj)); - break; - case LibCmo::CK2::CK_CLASSID::CKCID_MATERIAL: - PrintCKMaterialDetail(static_cast(mobj)); - break; - case LibCmo::CK2::CK_CLASSID::CKCID_MESH: - PrintCKMeshDetail(static_cast(mobj)); - break; - default: - Console::WriteLine(YYCC_COLOR_LIGHT_RED(u8"Not Implemented.")); - break; - } - - } - - void PrintCKBaseManager(const LibCmo::CK2::MgrImpls::CKBaseManager* mgr) { - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CKBaseManager")); - if (mgr == nullptr) { - Console::WriteLine(YYCC_COLOR_LIGHT_RED(u8"Null Manager")); - return; - } - - Console::WriteLine(YYCC_COLOR_LIGHT_RED(u8"Not Implemented.")); - } - - void PrintCKStateChunk(const LibCmo::CK2::CKStateChunk* chunk) { - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"CKStateChunk")); - if (chunk == nullptr) { - Console::WriteLine(YYCC_COLOR_LIGHT_RED(u8"Null Chunk")); - return; - } - - // hack const state chunk - LibCmo::CK2::CKStateChunk* operchunk = const_cast(chunk); - - // write profile - const auto profile = operchunk->GetStateChunkProfile(); - - Console::FormatLine(u8"Type: %s", AccessibleValue::GetClassIdName(profile.m_ClassId).c_str()); - - Console::FormatLine(u8"Version (Data / Chunk): %" PRIuCKDWORD " (%s) / %" PRIuCKDWORD " (%s)", - static_cast(profile.m_DataVersion), AccessibleValue::GetEnumName(profile.m_DataVersion, AccessibleValue::EnumDesc::CK_STATECHUNK_DATAVERSION).c_str(), - static_cast(profile.m_ChunkVersion), AccessibleValue::GetEnumName(profile.m_ChunkVersion, AccessibleValue::EnumDesc::CK_STATECHUNK_CHUNKVERSION).c_str() - ); - Console::FormatLine(u8"List (Object / Chunk / Manager): %" PRIuCKDWORD " / %" PRIuCKDWORD " / %" PRIuCKDWORD, - static_cast(profile.m_ObjectListSize), - static_cast(profile.m_ChunkListSize), - static_cast(profile.m_ManagerListSize) - ); - - Console::FormatLine(u8"Data: %s (0x%" PRIxCKDWORD " DWORD)", - PrintPointer(profile.m_pData).c_str(), - profile.m_DataDwSize - ); - - Console::FormatLine(u8"Bind CKFile: %s", PrintPointer(profile.m_BindFile).c_str()); - Console::FormatLine(u8"Bind CKContext: %s", PrintPointer(profile.m_BindContext).c_str()); - - // write identifiers - operchunk->StartRead(); - const auto collection = operchunk->GetIdentifiersProfile(); - operchunk->StopRead(); - Console::WriteLine(YYCC_COLOR_LIGHT_YELLOW(u8"Identifiers")); - Console::WriteLine(u8"Identifier\tData Pointer\tData Size"); - for (const auto& ident : collection) { - Console::FormatLine(u8"0x%08" PRIxCKDWORD "\t%s\t%" PRIuCKDWORD " (%" PRIuCKDWORD " DWORD + %" PRIuCKDWORD ")", - ident.m_Identifier, - PrintPointer(ident.m_DataPtr).c_str(), - ident.m_AreaSize, - ident.m_AreaSize / CKSizeof(LibCmo::CKDWORD), - ident.m_AreaSize % CKSizeof(LibCmo::CKDWORD) - ); - } - } - -}