diff --git a/Documents/Recorder.txt b/Documents/Recorder.txt index 1934e7a..6b00357 100644 --- a/Documents/Recorder.txt +++ b/Documents/Recorder.txt @@ -89,6 +89,39 @@ struct XBitArray { DWORD m_Size; }; +struct VxImageDescEx { + int Size; // Size of the structure + DWORD Flags; // Reserved for special formats (such as compressed ) 0 otherwise + + int Width; // Width in pixel of the image + int Height; // Height in pixel of the image + union { + int BytesPerLine; // Pitch (width in bytes) of the image + int TotalImageSize; // For compressed image (DXT1...) the total size of the image + }; + int BitsPerPixel; // Number of bits per pixel + union { + DWORD RedMask; // Mask for Red component + DWORD BumpDuMask; // Mask for Bump Du component + }; + union { + DWORD GreenMask; // Mask for Green component + DWORD BumpDvMask; // Mask for Bump Dv component + }; + union { + DWORD BlueMask; // Mask for Blue component + DWORD BumpLumMask; // Mask for Luminance component + + }; + DWORD AlphaMask; // Mask for Alpha component + + short BytesPerColorEntry; // ColorMap Stride + short ColorMapEntries; // If other than 0 image is palletized + + BYTE* ColorMap; // Palette colors + BYTE* Image; // Image +}; + // = typedef struct XFileObjectsTable::Entry { CK_ID key; diff --git a/LibCmo/CKDefines.hpp b/LibCmo/CKDefines.hpp index 2462f1e..24f0aba 100644 --- a/LibCmo/CKDefines.hpp +++ b/LibCmo/CKDefines.hpp @@ -81,7 +81,47 @@ namespace LibCmo { }; CKDWORD d[2]; }; - CKGUID(CKDWORD gd1 = 0, CKDWORD gd2 = 0) { d[0] = gd1; d[1] = gd2; } + constexpr CKGUID(CKDWORD gd1 = 0, CKDWORD gd2 = 0) : d1(gd1), d2(gd2) {} + CKGUID(const CKGUID& rhs) : d1(rhs.d1), d2(rhs.d2) {} + CKGUID& operator=(const CKGUID& rhs) { + this->d1 = rhs.d1; + this->d2 = rhs.d2; + } + + bool operator ==(const CKGUID& rhs) const { + return ((this->d1 == rhs.d1) && (this->d2 == rhs.d2)); + } + bool operator !=(const CKGUID& rhs) const { + return ((this->d1 != rhs.d1) || (this->d2 != rhs.d2)); + } + bool operator <(const CKGUID& rhs) const { + if (this->d1 < rhs.d1) { + return true; + } + + if (this->d1 == rhs.d1) { + return (this->d2 < rhs.d2); + } + + return false; + } + bool operator <=(const CKGUID& rhs) const { + return (this->d1 <= rhs.d1); + } + bool operator >(const CKGUID& rhs) const { + if (this->d1 > rhs.d1) { + return true; + } + + if (this->d1 == rhs.d1) { + return (this->d2 > rhs.d2); + } + + return false; + } + bool operator >=(const CKGUID& rhs) const { + return (this->d1 >= rhs.d1); + } }; @@ -125,7 +165,7 @@ namespace LibCmo { struct VxMatrix { float m_Data[4][4]; - VxMatrix() : m_Data() { + VxMatrix() : m_Data() { memset(m_Data, 0, sizeof(m_Data)); m_Data[0][0] = m_Data[1][1] = m_Data[2][2] = m_Data[3][3] = 1.0f; } diff --git a/LibCmo/CKEnums.hpp b/LibCmo/CKEnums.hpp index 7706b86..e3db7a4 100644 --- a/LibCmo/CKEnums.hpp +++ b/LibCmo/CKEnums.hpp @@ -1,236 +1,275 @@ #pragma once +#include "CKDefines.hpp" #include #include namespace LibCmo::CK2 { - enum class CK_CLASSID : uint32_t { - CKCID_OBJECT = 1, - CKCID_PARAMETERIN = 2, - CKCID_PARAMETEROPERATION = 4, - CKCID_STATE = 5, - CKCID_BEHAVIORLINK = 6, - CKCID_BEHAVIOR = 8, - CKCID_BEHAVIORIO = 9, - CKCID_RENDERCONTEXT = 12, - CKCID_KINEMATICCHAIN = 13, - CKCID_SCENEOBJECT = 11, - CKCID_OBJECTANIMATION = 15, - CKCID_ANIMATION = 16, - CKCID_KEYEDANIMATION = 18, - CKCID_BEOBJECT = 19, - CKCID_DATAARRAY = 52, - CKCID_SCENE = 10, - CKCID_LEVEL = 21, - CKCID_PLACE = 22, - CKCID_GROUP = 23, - CKCID_SOUND = 24, - CKCID_WAVESOUND = 25, - CKCID_MIDISOUND = 26, - CKCID_MATERIAL = 30, - CKCID_TEXTURE = 31, - CKCID_MESH = 32, - CKCID_PATCHMESH = 53, - CKCID_RENDEROBJECT = 47, - CKCID_2DENTITY = 27, - CKCID_SPRITE = 28, - CKCID_SPRITETEXT = 29, - CKCID_3DENTITY = 33, - CKCID_GRID = 50, - CKCID_CURVEPOINT = 36, - CKCID_SPRITE3D = 37, - CKCID_CURVE = 43, - CKCID_CAMERA = 34, - CKCID_TARGETCAMERA = 35, - CKCID_LIGHT = 38, - CKCID_TARGETLIGHT = 39, - CKCID_CHARACTER = 40, - CKCID_3DOBJECT = 41, - CKCID_BODYPART = 42, - CKCID_PARAMETER = 46, - CKCID_PARAMETERLOCAL = 45, - CKCID_PARAMETEROUT = 3, - CKCID_INTERFACEOBJECTMANAGER = 48, - CKCID_CRITICALSECTION = 49, - CKCID_LAYER = 51, - CKCID_PROGRESSIVEMESH = 54, - CKCID_SYNCHRO = 20, + namespace PredefinedGuids { - CKCID_OBJECTARRAY = 80, - CKCID_SCENEOBJECTDESC = 81, - CKCID_ATTRIBUTEMANAGER = 82, - CKCID_MESSAGEMANAGER = 83, - CKCID_COLLISIONMANAGER = 84, - CKCID_OBJECTMANAGER = 85, - CKCID_FLOORMANAGER = 86, - CKCID_RENDERMANAGER = 87, - CKCID_BEHAVIORMANAGER = 88, - CKCID_INPUTMANAGER = 89, - CKCID_PARAMETERMANAGER = 90, - CKCID_GRIDMANAGER = 91, - CKCID_SOUNDMANAGER = 92, - CKCID_TIMEMANAGER = 93, - CKCID_CUIKBEHDATA = static_cast(-1), + constexpr const CKDWORD OBJECT_MANAGER_GUID1 = 0x7cbb3b91; + constexpr const CKDWORD ATTRIBUTE_MANAGER_GUID1 = 0x3d242466; + constexpr const CKDWORD MESSAGE_MANAGER_GUID1 = 0x466a0fac; + constexpr const CKDWORD FLOOR_MANAGER_GUID1 = 0x420936f9; + constexpr const CKDWORD COLLISION_MANAGER_GUID1 = 0x38244712; + constexpr const CKDWORD GRID_MANAGER_GUID1 = 0x7f004791; + constexpr const CKDWORD TIME_MANAGER_GUID1 = 0x89ce7b32; + constexpr const CKDWORD BEHAVIOR_MANAGER_GUID1 = 0x58d621ae; + constexpr const CKDWORD INPUT_MANAGER_GUID1 = 0xf787c904; + constexpr const CKDWORD SOUND_MANAGER_GUID1 = 0xdce135f6; + constexpr const CKDWORD MIDI_MANAGER_GUID1 = 0x594154a6; + constexpr const CKDWORD INTERFACE_MANAGER_GUID1 = 0x9a4b8e3d; + constexpr const CKDWORD RENDER_MANAGER_GUID1 = 0xa213c8d5; + constexpr const CKDWORD PARAMETER_MANAGER_GUID1 = 0x9ce57ab6; + constexpr const CKDWORD PATH_MANAGER_GUID1 = 0x15fd54b9; + constexpr const CKDWORD VARIABLE_MANAGER_GUID1 = 0x98cc3cc9; - CKCID_MAXCLASSID = 55, - CKCID_MAXMAXCLASSID = 128 - }; + constexpr const CKGUID OBJECT_MANAGER_GUID{ OBJECT_MANAGER_GUID1 ,0 }; + constexpr const CKGUID ATTRIBUTE_MANAGER_GUID{ ATTRIBUTE_MANAGER_GUID1, 0 }; + constexpr const CKGUID MESSAGE_MANAGER_GUID{ MESSAGE_MANAGER_GUID1 ,0 }; + constexpr const CKGUID TIME_MANAGER_GUID{ TIME_MANAGER_GUID1 ,0 }; + constexpr const CKGUID SOUND_MANAGER_GUID{ SOUND_MANAGER_GUID1 ,0 }; + constexpr const CKGUID MIDI_MANAGER_GUID{ MIDI_MANAGER_GUID1 ,0 }; + constexpr const CKGUID INPUT_MANAGER_GUID{ INPUT_MANAGER_GUID1 ,0 }; + constexpr const CKGUID BEHAVIOR_MANAGER_GUID{ BEHAVIOR_MANAGER_GUID1 ,0 }; + constexpr const CKGUID FLOOR_MANAGER_GUID{ FLOOR_MANAGER_GUID1 ,0 }; + constexpr const CKGUID COLLISION_MANAGER_GUID{ COLLISION_MANAGER_GUID1 ,0 }; + constexpr const CKGUID GRID_MANAGER_GUID{ GRID_MANAGER_GUID1 ,0 }; + constexpr const CKGUID INTERFACE_MANAGER_GUID{ INTERFACE_MANAGER_GUID1 ,0 }; + constexpr const CKGUID RENDER_MANAGER_GUID{ RENDER_MANAGER_GUID1 ,0 }; + constexpr const CKGUID PARAMETER_MANAGER_GUID{ PARAMETER_MANAGER_GUID1 ,0 }; + constexpr const CKGUID PATH_MANAGER_GUID{ PATH_MANAGER_GUID1 ,0 }; + constexpr const CKGUID VARIABLE_MANAGER_GUID{ VARIABLE_MANAGER_GUID1 ,0 }; - enum class CKERROR : int32_t { - CKERR_OK = 0, - CKERR_INVALIDPARAMETER = -1, - CKERR_INVALIDPARAMETERTYPE = -2, - CKERR_INVALIDSIZE = -3, - CKERR_INVALIDOPERATION = -4, - CKERR_OPERATIONNOTIMPLEMENTED = -5, - CKERR_OUTOFMEMORY = -6, - CKERR_NOTIMPLEMENTED = -7, - CKERR_NOTFOUND = -11, - CKERR_NOLEVEL = -13, - CKERR_CANCREATERENDERCONTEXT = -14, - CKERR_NOTIFICATIONNOTHANDLED = -16, - CKERR_ALREADYPRESENT = -17, - CKERR_INVALIDRENDERCONTEXT = -18, - CKERR_RENDERCONTEXTINACTIVE = -19, - CKERR_NOLOADPLUGINS = -20, - CKERR_NOSAVEPLUGINS = -21, - CKERR_INVALIDFILE = -22, - CKERR_INVALIDPLUGIN = -23, - CKERR_NOTINITIALIZED = -24, - CKERR_INVALIDMESSAGE = -25, - CKERR_INVALIDPROTOTYPE = -28, - CKERR_NODLLFOUND = -29, - CKERR_ALREADYREGISTREDDLL = -30, - CKERR_INVALIDDLL = -31, - CKERR_INVALIDOBJECT = -34, - CKERR_INVALIDCONDSOLEWINDOW = -35, - CKERR_INVALIDKINEMATICCHAIN = -36, - CKERR_NOKEYBOARD = -37, - CKERR_NOMOUSE = -38, - CKERR_NOJOYSTICK = -39, - CKERR_INCOMPATIBLEPARAMETERS = -40, - CKERR_NORENDERENGINE = -44, - CKERR_NOCURRENTLEVEL = -45, - CKERR_SOUNDDISABLED = -46, - CKERR_DINPUTDISABLED = -47, - CKERR_INVALIDGUID = -48, - CKERR_NOTENOUGHDISKPLACE = -49, - CKERR_CANTWRITETOFILE = -50, - CKERR_BEHAVIORADDDENIEDBYCB = -51, - CKERR_INCOMPATIBLECLASSID = -52, - CKERR_MANAGERALREADYEXISTS = -53, - CKERR_PAUSED = -54, - CKERR_PLUGINSMISSING = -55, - CKERR_OBSOLETEVIRTOOLS = -56, - CKERR_FILECRCERROR = -57, - CKERR_ALREADYFULLSCREEN = -58, - CKERR_CANCELLED = -59, - CKERR_NOANIMATIONKEY = -121, - CKERR_INVALIDINDEX = -122, - CKERR_INVALIDANIMATION = -123 - }; + } - enum class CK_FILE_WRITEMODE : uint32_t { - CKFILE_UNCOMPRESSED = 0, - CKFILE_CHUNKCOMPRESSED_OLD = 1, - CKFILE_EXTERNALTEXTURES_OLD = 2, - CKFILE_FORVIEWER = 4, - CKFILE_WHOLECOMPRESSED = 8 - }; - enum class CK_LOAD_FLAGS : uint32_t { - CK_LOAD_ANIMATION = 1 << 0, - CK_LOAD_GEOMETRY = 1 << 1, - CK_LOAD_DEFAULT = CK_LOAD_GEOMETRY | CK_LOAD_ANIMATION, - CK_LOAD_ASCHARACTER = 1 << 2, - CK_LOAD_DODIALOG = 1 << 3, - CK_LOAD_AS_DYNAMIC_OBJECT = 1 << 4, - CK_LOAD_AUTOMATICMODE = 1 << 5, - CK_LOAD_CHECKDUPLICATES = 1 << 6, - CK_LOAD_CHECKDEPENDENCIES = 1 << 7, - CK_LOAD_ONLYBEHAVIORS = 1 << 8 - }; - enum class CK_FO_OPTIONS : uint32_t { - CK_FO_DEFAULT = 0, - CK_FO_RENAMEOBJECT, - CK_FO_REPLACEOBJECT, - CK_FO_DONTLOADOBJECT - }; - enum class CK_PLUGIN_TYPE : uint32_t { - CKPLUGIN_BITMAP_READER = 0, - CKPLUGIN_SOUND_READER = 1, - CKPLUGIN_MODEL_READER = 2, - CKPLUGIN_MANAGER_DLL = 3, - CKPLUGIN_BEHAVIOR_DLL = 4, - CKPLUGIN_RENDERENGINE_DLL = 5, - CKPLUGIN_MOVIE_READER = 6, - CKPLUGIN_EXTENSION_DLL = 7 - }; - enum class CK_STATECHUNK_DATAVERSION : uint32_t { - CHUNKDATA_OLDVERSION = 0, - CHUNKDATA_BASEVERSION = 1, - CHUNK_WAVESOUND_VERSION2 = 2, - CHUNK_WAVESOUND_VERSION3 = 3, - CHUNK_MATERIAL_VERSION_ZTEST = 4, - CHUNK_MAJORCHANGE_VERSION = 5, - CHUNK_MACCHANGE_VERSION = 6, - CHUNK_WAVESOUND_VERSION4 = 7, - CHUNK_SCENECHANGE_VERSION = 8, - CHUNK_MESHCHANGE_VERSION = 9, - CHUNK_DEV_2_1 = 10, - CHUNKDATA_CURRENTVERSION = CHUNK_DEV_2_1 - }; - enum class CK_STATECHUNK_CHUNKVERSION : uint32_t { - CHUNK_VERSIONBASE = 0, - CHUNK_VERSION1 = 4, - CHUNK_VERSION2 = 5, - CHUNK_VERSION3 = 6, - CHUNK_VERSION4 = 7 - }; - enum class CK_STATECHUNK_CHUNKOPTIONS : uint32_t { - CHNK_OPTION_IDS = 0x01, - CHNK_OPTION_MAN = 0x02, - CHNK_OPTION_CHN = 0x04, - CHNK_OPTION_FILE = 0x08, - CHNK_OPTION_ALLOWDYN = 0x10, - CHNK_OPTION_LISTBIG = 0x20, - CHNK_DONTDELETE_PTR = 0x40, - CHNK_DONTDELETE_PARSER = 0x80 - }; - enum class CK_OBJECT_FLAGS : uint32_t { - CK_OBJECT_INTERFACEOBJ = 0x00000001, - CK_OBJECT_PRIVATE = 0x00000002, - CK_OBJECT_INTERFACEMARK = 0x00000004, - CK_OBJECT_FREEID = 0x00000008, - CK_OBJECT_TOBEDELETED = 0x00000010, - CK_OBJECT_NOTTOBESAVED = 0x00000020, - CK_OBJECT_VISIBLE = 0x00000040, - CK_OBJECT_NAMESHARED = 0x00000080, - CK_OBJECT_DYNAMIC = 0x00000108, - CK_OBJECT_HIERACHICALHIDE = 0x00000200, - CK_OBJECT_UPTODATE = 0x00000400, - CK_OBJECT_TEMPMARKER = 0x00000800, - CK_OBJECT_ONLYFORFILEREFERENCE = 0x00001000, - CK_OBJECT_NOTTOBEDELETED = 0x00002000, - CK_OBJECT_APPDATA = 0x00004000, - CK_OBJECT_SINGLEACTIVITY = 0x00008000, - CK_OBJECT_LOADSKIPBEOBJECT = 0x00010000, - CK_OBJECT_NOTTOBELISTEDANDSAVED = 0x00000023, - CK_PARAMETEROUT_SETTINGS = 0x00400000, - CK_PARAMETEROUT_PARAMOP = 0x00800000, - CK_PARAMETERIN_DISABLED = 0x01000000, - CK_PARAMETERIN_THIS = 0x02000000, - CK_PARAMETERIN_SHARED = 0x04000000, - CK_PARAMETEROUT_DELETEAFTERUSE = 0x08000000, - CK_OBJECT_PARAMMASK = 0x0FC00000, - CK_BEHAVIORIO_IN = 0x10000000, - CK_BEHAVIORIO_OUT = 0x20000000, - CK_BEHAVIORIO_ACTIVE = 0x40000000, - CK_OBJECT_IOTYPEMASK = 0x30000000, - CK_OBJECT_IOMASK = 0xF0000000, - CKBEHAVIORLINK_RESERVED = 0x10000000, - CKBEHAVIORLINK_ACTIVATEDLASTFRAME = 0x20000000, - CK_OBJECT_BEHAVIORLINKMASK = 0x30000000 - }; + enum class CK_CLASSID : uint32_t { + CKCID_OBJECT = 1, + CKCID_PARAMETERIN = 2, + CKCID_PARAMETEROPERATION = 4, + CKCID_STATE = 5, + CKCID_BEHAVIORLINK = 6, + CKCID_BEHAVIOR = 8, + CKCID_BEHAVIORIO = 9, + CKCID_RENDERCONTEXT = 12, + CKCID_KINEMATICCHAIN = 13, + CKCID_SCENEOBJECT = 11, + CKCID_OBJECTANIMATION = 15, + CKCID_ANIMATION = 16, + CKCID_KEYEDANIMATION = 18, + CKCID_BEOBJECT = 19, + CKCID_DATAARRAY = 52, + CKCID_SCENE = 10, + CKCID_LEVEL = 21, + CKCID_PLACE = 22, + CKCID_GROUP = 23, + CKCID_SOUND = 24, + CKCID_WAVESOUND = 25, + CKCID_MIDISOUND = 26, + CKCID_MATERIAL = 30, + CKCID_TEXTURE = 31, + CKCID_MESH = 32, + CKCID_PATCHMESH = 53, + CKCID_RENDEROBJECT = 47, + CKCID_2DENTITY = 27, + CKCID_SPRITE = 28, + CKCID_SPRITETEXT = 29, + CKCID_3DENTITY = 33, + CKCID_GRID = 50, + CKCID_CURVEPOINT = 36, + CKCID_SPRITE3D = 37, + CKCID_CURVE = 43, + CKCID_CAMERA = 34, + CKCID_TARGETCAMERA = 35, + CKCID_LIGHT = 38, + CKCID_TARGETLIGHT = 39, + CKCID_CHARACTER = 40, + CKCID_3DOBJECT = 41, + CKCID_BODYPART = 42, + CKCID_PARAMETER = 46, + CKCID_PARAMETERLOCAL = 45, + CKCID_PARAMETEROUT = 3, + CKCID_INTERFACEOBJECTMANAGER = 48, + CKCID_CRITICALSECTION = 49, + CKCID_LAYER = 51, + CKCID_PROGRESSIVEMESH = 54, + CKCID_SYNCHRO = 20, + + CKCID_OBJECTARRAY = 80, + CKCID_SCENEOBJECTDESC = 81, + CKCID_ATTRIBUTEMANAGER = 82, + CKCID_MESSAGEMANAGER = 83, + CKCID_COLLISIONMANAGER = 84, + CKCID_OBJECTMANAGER = 85, + CKCID_FLOORMANAGER = 86, + CKCID_RENDERMANAGER = 87, + CKCID_BEHAVIORMANAGER = 88, + CKCID_INPUTMANAGER = 89, + CKCID_PARAMETERMANAGER = 90, + CKCID_GRIDMANAGER = 91, + CKCID_SOUNDMANAGER = 92, + CKCID_TIMEMANAGER = 93, + CKCID_CUIKBEHDATA = static_cast(-1), + + CKCID_MAXCLASSID = 55, + CKCID_MAXMAXCLASSID = 128 + }; + + enum class CKERROR : int32_t { + CKERR_OK = 0, + CKERR_INVALIDPARAMETER = -1, + CKERR_INVALIDPARAMETERTYPE = -2, + CKERR_INVALIDSIZE = -3, + CKERR_INVALIDOPERATION = -4, + CKERR_OPERATIONNOTIMPLEMENTED = -5, + CKERR_OUTOFMEMORY = -6, + CKERR_NOTIMPLEMENTED = -7, + CKERR_NOTFOUND = -11, + CKERR_NOLEVEL = -13, + CKERR_CANCREATERENDERCONTEXT = -14, + CKERR_NOTIFICATIONNOTHANDLED = -16, + CKERR_ALREADYPRESENT = -17, + CKERR_INVALIDRENDERCONTEXT = -18, + CKERR_RENDERCONTEXTINACTIVE = -19, + CKERR_NOLOADPLUGINS = -20, + CKERR_NOSAVEPLUGINS = -21, + CKERR_INVALIDFILE = -22, + CKERR_INVALIDPLUGIN = -23, + CKERR_NOTINITIALIZED = -24, + CKERR_INVALIDMESSAGE = -25, + CKERR_INVALIDPROTOTYPE = -28, + CKERR_NODLLFOUND = -29, + CKERR_ALREADYREGISTREDDLL = -30, + CKERR_INVALIDDLL = -31, + CKERR_INVALIDOBJECT = -34, + CKERR_INVALIDCONDSOLEWINDOW = -35, + CKERR_INVALIDKINEMATICCHAIN = -36, + CKERR_NOKEYBOARD = -37, + CKERR_NOMOUSE = -38, + CKERR_NOJOYSTICK = -39, + CKERR_INCOMPATIBLEPARAMETERS = -40, + CKERR_NORENDERENGINE = -44, + CKERR_NOCURRENTLEVEL = -45, + CKERR_SOUNDDISABLED = -46, + CKERR_DINPUTDISABLED = -47, + CKERR_INVALIDGUID = -48, + CKERR_NOTENOUGHDISKPLACE = -49, + CKERR_CANTWRITETOFILE = -50, + CKERR_BEHAVIORADDDENIEDBYCB = -51, + CKERR_INCOMPATIBLECLASSID = -52, + CKERR_MANAGERALREADYEXISTS = -53, + CKERR_PAUSED = -54, + CKERR_PLUGINSMISSING = -55, + CKERR_OBSOLETEVIRTOOLS = -56, + CKERR_FILECRCERROR = -57, + CKERR_ALREADYFULLSCREEN = -58, + CKERR_CANCELLED = -59, + CKERR_NOANIMATIONKEY = -121, + CKERR_INVALIDINDEX = -122, + CKERR_INVALIDANIMATION = -123 + }; + + enum class CK_FILE_WRITEMODE : uint32_t { + CKFILE_UNCOMPRESSED = 0, + CKFILE_CHUNKCOMPRESSED_OLD = 1, + CKFILE_EXTERNALTEXTURES_OLD = 2, + CKFILE_FORVIEWER = 4, + CKFILE_WHOLECOMPRESSED = 8 + }; + enum class CK_LOAD_FLAGS : uint32_t { + CK_LOAD_ANIMATION = 1 << 0, + CK_LOAD_GEOMETRY = 1 << 1, + CK_LOAD_DEFAULT = CK_LOAD_GEOMETRY | CK_LOAD_ANIMATION, + CK_LOAD_ASCHARACTER = 1 << 2, + CK_LOAD_DODIALOG = 1 << 3, + CK_LOAD_AS_DYNAMIC_OBJECT = 1 << 4, + CK_LOAD_AUTOMATICMODE = 1 << 5, + CK_LOAD_CHECKDUPLICATES = 1 << 6, + CK_LOAD_CHECKDEPENDENCIES = 1 << 7, + CK_LOAD_ONLYBEHAVIORS = 1 << 8 + }; + enum class CK_FO_OPTIONS : uint32_t { + CK_FO_DEFAULT = 0, + CK_FO_RENAMEOBJECT, + CK_FO_REPLACEOBJECT, + CK_FO_DONTLOADOBJECT + }; + enum class CK_PLUGIN_TYPE : uint32_t { + CKPLUGIN_BITMAP_READER = 0, + CKPLUGIN_SOUND_READER = 1, + CKPLUGIN_MODEL_READER = 2, + CKPLUGIN_MANAGER_DLL = 3, + CKPLUGIN_BEHAVIOR_DLL = 4, + CKPLUGIN_RENDERENGINE_DLL = 5, + CKPLUGIN_MOVIE_READER = 6, + CKPLUGIN_EXTENSION_DLL = 7 + }; + enum class CK_STATECHUNK_DATAVERSION : uint32_t { + CHUNKDATA_OLDVERSION = 0, + CHUNKDATA_BASEVERSION = 1, + CHUNK_WAVESOUND_VERSION2 = 2, + CHUNK_WAVESOUND_VERSION3 = 3, + CHUNK_MATERIAL_VERSION_ZTEST = 4, + CHUNK_MAJORCHANGE_VERSION = 5, + CHUNK_MACCHANGE_VERSION = 6, + CHUNK_WAVESOUND_VERSION4 = 7, + CHUNK_SCENECHANGE_VERSION = 8, + CHUNK_MESHCHANGE_VERSION = 9, + CHUNK_DEV_2_1 = 10, + CHUNKDATA_CURRENTVERSION = CHUNK_DEV_2_1 + }; + enum class CK_STATECHUNK_CHUNKVERSION : uint32_t { + CHUNK_VERSIONBASE = 0, + CHUNK_VERSION1 = 4, + CHUNK_VERSION2 = 5, + CHUNK_VERSION3 = 6, + CHUNK_VERSION4 = 7 + }; + enum class CK_STATECHUNK_CHUNKOPTIONS : uint32_t { + CHNK_OPTION_IDS = 0x01, + CHNK_OPTION_MAN = 0x02, + CHNK_OPTION_CHN = 0x04, + CHNK_OPTION_FILE = 0x08, + CHNK_OPTION_ALLOWDYN = 0x10, + CHNK_OPTION_LISTBIG = 0x20, + CHNK_DONTDELETE_PTR = 0x40, + CHNK_DONTDELETE_PARSER = 0x80 + }; + enum class CK_OBJECT_FLAGS : uint32_t { + CK_OBJECT_INTERFACEOBJ = 0x00000001, + CK_OBJECT_PRIVATE = 0x00000002, + CK_OBJECT_INTERFACEMARK = 0x00000004, + CK_OBJECT_FREEID = 0x00000008, + CK_OBJECT_TOBEDELETED = 0x00000010, + CK_OBJECT_NOTTOBESAVED = 0x00000020, + CK_OBJECT_VISIBLE = 0x00000040, + CK_OBJECT_NAMESHARED = 0x00000080, + CK_OBJECT_DYNAMIC = 0x00000108, + CK_OBJECT_HIERACHICALHIDE = 0x00000200, + CK_OBJECT_UPTODATE = 0x00000400, + CK_OBJECT_TEMPMARKER = 0x00000800, + CK_OBJECT_ONLYFORFILEREFERENCE = 0x00001000, + CK_OBJECT_NOTTOBEDELETED = 0x00002000, + CK_OBJECT_APPDATA = 0x00004000, + CK_OBJECT_SINGLEACTIVITY = 0x00008000, + CK_OBJECT_LOADSKIPBEOBJECT = 0x00010000, + CK_OBJECT_NOTTOBELISTEDANDSAVED = 0x00000023, + CK_PARAMETEROUT_SETTINGS = 0x00400000, + CK_PARAMETEROUT_PARAMOP = 0x00800000, + CK_PARAMETERIN_DISABLED = 0x01000000, + CK_PARAMETERIN_THIS = 0x02000000, + CK_PARAMETERIN_SHARED = 0x04000000, + CK_PARAMETEROUT_DELETEAFTERUSE = 0x08000000, + CK_OBJECT_PARAMMASK = 0x0FC00000, + CK_BEHAVIORIO_IN = 0x10000000, + CK_BEHAVIORIO_OUT = 0x20000000, + CK_BEHAVIORIO_ACTIVE = 0x40000000, + CK_OBJECT_IOTYPEMASK = 0x30000000, + CK_OBJECT_IOMASK = 0xF0000000, + CKBEHAVIORLINK_RESERVED = 0x10000000, + CKBEHAVIORLINK_ACTIVATEDLASTFRAME = 0x20000000, + CK_OBJECT_BEHAVIORLINKMASK = 0x30000000 + }; } diff --git a/LibCmo/CKManagerImplements/CKBaseManager.cpp b/LibCmo/CKManagerImplements/CKBaseManager.cpp new file mode 100644 index 0000000..b4ca5c9 --- /dev/null +++ b/LibCmo/CKManagerImplements/CKBaseManager.cpp @@ -0,0 +1,20 @@ +#include "../CKManagers.hpp" + +namespace LibCmo::CK2::CKManagerImplements { + + CKBaseManager::CKBaseManager(CKMinContext* ctx, CK_ID ckid) { + + } + CKBaseManager::~CKBaseManager() { + + } + + + CKAttributeManager::CKAttributeManager(CKMinContext* ctx, CK_ID ckid) : CKBaseManager(ctx, ckid) { + + } + CKAttributeManager::~CKAttributeManager() { + + } + +} diff --git a/LibCmo/CKManagers.hpp b/LibCmo/CKManagers.hpp index 618642b..70c06e6 100644 --- a/LibCmo/CKManagers.hpp +++ b/LibCmo/CKManagers.hpp @@ -7,20 +7,21 @@ namespace LibCmo::CK2::CKManagerImplements { class CKBaseManager { public: - CKBaseManager(); + CKBaseManager(CKMinContext* ctx, CK_ID ckid); CKBaseManager(const CKBaseManager&) = delete; CKBaseManager& operator=(const CKBaseManager&) = delete; virtual ~CKBaseManager(); virtual CKERROR LoadData(CKStateChunk* statechunk, CKFileData::ShallowDocument* doc); virtual CKStateChunk* SaveData(CKFileData::ShallowDocument* doc); + private: }; - class CKAttributeManager { + class CKAttributeManager : public CKBaseManager { public: - CKAttributeManager(); + CKAttributeManager(CKMinContext* ctx, CK_ID ckid); CKAttributeManager(const CKAttributeManager&) = delete; CKAttributeManager& operator=(const CKAttributeManager&) = delete; virtual ~CKAttributeManager(); diff --git a/LibCmo/CKMinContext.cpp b/LibCmo/CKMinContext.cpp index 12dda7d..52f7db9 100644 --- a/LibCmo/CKMinContext.cpp +++ b/LibCmo/CKMinContext.cpp @@ -1,5 +1,7 @@ #include "VTUtils.hpp" #include "CKMinContext.hpp" +#include "CKObjects.hpp" +#include "CKManagers.hpp" namespace LibCmo::CK2 { @@ -13,7 +15,24 @@ namespace LibCmo::CK2 { CKMinContext::CKMinContext() : m_NameEncoding(), m_NameEncodingToken(EncodingHelper::ENCODING_TOKEN_DEFAULT), m_TempFolder(), - m_PrintCallback(nullptr) + m_PrintCallback(nullptr), + // register CKObjects + m_ObjectsCreationMap{ + {CK_CLASSID::CKCID_OBJECT, ([](CKMinContext* ctx, CK_ID id, CKSTRING name) ->CKObjectImplements::CKObject* { return new(std::nothrow) CKObjectImplements::CKObject(ctx, id, name); })}, + {CK_CLASSID::CKCID_SCENEOBJECT, ([](CKMinContext* ctx, CK_ID id, CKSTRING name) ->CKObjectImplements::CKObject* { return new(std::nothrow) CKObjectImplements::CKSceneObject(ctx, id, name); })}, + {CK_CLASSID::CKCID_BEOBJECT, ([](CKMinContext* ctx, CK_ID id, CKSTRING name) ->CKObjectImplements::CKObject* { return new(std::nothrow) CKObjectImplements::CKBeObject(ctx, id, name); })}, + {CK_CLASSID::CKCID_GROUP, ([](CKMinContext* ctx, CK_ID id, CKSTRING name) ->CKObjectImplements::CKObject* { return new(std::nothrow) CKObjectImplements::CKGroup(ctx, id, name); })}, + {CK_CLASSID::CKCID_MESH, ([](CKMinContext* ctx, CK_ID id, CKSTRING name) ->CKObjectImplements::CKObject* { return new(std::nothrow) CKObjectImplements::CKMesh(ctx, id, name); })}, + {CK_CLASSID::CKCID_TEXTURE, ([](CKMinContext* ctx, CK_ID id, CKSTRING name) ->CKObjectImplements::CKObject* { return new(std::nothrow) CKObjectImplements::CKTexture(ctx, id, name); })}, + {CK_CLASSID::CKCID_MATERIAL, ([](CKMinContext* ctx, CK_ID id, CKSTRING name) ->CKObjectImplements::CKObject* { return new(std::nothrow) CKObjectImplements::CKMaterial(ctx, id, name); })}, + {CK_CLASSID::CKCID_RENDEROBJECT, ([](CKMinContext* ctx, CK_ID id, CKSTRING name) ->CKObjectImplements::CKObject* { return new(std::nothrow) CKObjectImplements::CKRenderObject(ctx, id, name); })}, + {CK_CLASSID::CKCID_3DENTITY, ([](CKMinContext* ctx, CK_ID id, CKSTRING name) ->CKObjectImplements::CKObject* { return new(std::nothrow) CKObjectImplements::CK3dEntity(ctx, id, name); })}, + {CK_CLASSID::CKCID_3DOBJECT, ([](CKMinContext* ctx, CK_ID id, CKSTRING name) ->CKObjectImplements::CKObject* { return new(std::nothrow) CKObjectImplements::CK3dObject(ctx, id, name); })} + }, + // register CKBaseManagers + m_ManagersCreationMap{ + {PredefinedGuids::ATTRIBUTE_MANAGER_GUID, ([](CKMinContext* ctx, CK_ID id) ->CKManagerImplements::CKBaseManager* { return new(std::nothrow) CKManagerImplements::CKAttributeManager(ctx, id); })}, + } { // preset for temp folder m_TempFolder = std::filesystem::temp_directory_path(); diff --git a/LibCmo/CKMinContext.hpp b/LibCmo/CKMinContext.hpp index e40a7ad..087a593 100644 --- a/LibCmo/CKMinContext.hpp +++ b/LibCmo/CKMinContext.hpp @@ -1,9 +1,11 @@ #pragma once #include "CKDefines.hpp" -#include "CKObjects.hpp" +#include "CKEnums.hpp" #include "VTEncoding.hpp" #include +#include +#include namespace LibCmo::CK2 { @@ -23,7 +25,7 @@ namespace LibCmo::CK2 { void DestroyCKObject(CKObjectImplements::CKObject* obj); CKManagerImplements::CKBaseManager* CreateCKManager(CKGUID guid); - CKManagerImplements::CKBaseManager* GetCKManager(CKGUID guid); + CKManagerImplements::CKBaseManager* GetCKManager(CK_ID guid); void DestroyCKManager(CKManagerImplements::CKBaseManager* mgr); void GetUtf8String(std::string& native_name, std::string& u8_name); @@ -37,6 +39,12 @@ namespace LibCmo::CK2 { private: void RefetchEncodingToken(void); + std::map m_ObjectsList; + std::map m_ManagersList; + + std::map> m_ObjectsCreationMap; + std::map> m_ManagersCreationMap; + std::string m_NameEncoding; EncodingHelper::ENCODING_TOKEN m_NameEncodingToken; std::filesystem::path m_TempFolder; diff --git a/LibCmo/CKObjectImplements/CKObject.cpp b/LibCmo/CKObjectImplements/CKObject.cpp index de4f08f..4b0f474 100644 --- a/LibCmo/CKObjectImplements/CKObject.cpp +++ b/LibCmo/CKObjectImplements/CKObject.cpp @@ -2,12 +2,55 @@ namespace LibCmo::CK2::CKObjectImplements { - CKObject::CKObject() { - + CKObject::CKObject(CKMinContext* ctx, CK_ID ckid, CKSTRING name) : + m_ID(ckid), m_Context(ctx), + m_Name(name == nullptr ? "" : name), m_HasName(name != nullptr), + m_ObjectFlags(CK_OBJECT_FLAGS::CK_PARAMETERIN_DISABLED) { + ; } CKObject::~CKObject() { } + CKSceneObject::CKSceneObject(CKMinContext* ctx, CK_ID ckid, CKSTRING name) : CKObject(ctx, ckid, name) { + } + CKSceneObject::~CKSceneObject() { + } + + CKBeObject::CKBeObject(CKMinContext* ctx, CK_ID ckid, CKSTRING name) : CKSceneObject(ctx, ckid, name) { + } + CKBeObject::~CKBeObject() { + } + + CKGroup::CKGroup(CKMinContext* ctx, CK_ID ckid, CKSTRING name) : CKBeObject(ctx, ckid, name) { + } + CKGroup::~CKGroup() { + } + + CKMesh::CKMesh(CKMinContext* ctx, CK_ID ckid, CKSTRING name) : CKBeObject(ctx, ckid, name) { + } + CKMesh::~CKMesh() { + } + + CKTexture::CKTexture(CKMinContext* ctx, CK_ID ckid, CKSTRING name) : CKBeObject(ctx, ckid, name) { + } + CKMaterial::~CKMaterial() { + } + + CKRenderObject::CKRenderObject(CKMinContext* ctx, CK_ID ckid, CKSTRING name) : CKBeObject(ctx, ckid, name) { + } + CKRenderObject::~CKRenderObject() { + } + + CK3dEntity::CK3dEntity(CKMinContext* ctx, CK_ID ckid, CKSTRING name) : CKRenderObject(ctx, ckid, name) { + } + CK3dEntity::~CK3dEntity() { + } + + CK3dObject::CK3dObject(CKMinContext* ctx, CK_ID ckid, CKSTRING name) : CK3dEntity(ctx, ckid, name) { + } + CK3dObject::~CK3dObject() { + } + } \ No newline at end of file diff --git a/LibCmo/CKObjects.hpp b/LibCmo/CKObjects.hpp index 850f61d..5550194 100644 --- a/LibCmo/CKObjects.hpp +++ b/LibCmo/CKObjects.hpp @@ -7,14 +7,18 @@ namespace LibCmo::CK2::CKObjectImplements { class CKObject { public: - CKObject(); + CKObject(CKMinContext* ctx, CK_ID ckid, CKSTRING name); CKObject(const CKObject&) = delete; CKObject& operator=(const CKObject&) = delete; virtual ~CKObject(); CK_ID GetID(void) { return this->m_ID; } - CKSTRING GetName(void) { return this->m_Name.c_str(); } - void SetName(CKSTRING u8_name) { this->m_Name = u8_name; } + CKSTRING GetName(void) { return m_HasName ? this->m_Name.c_str() : nullptr; } + void SetName(CKSTRING u8_name) { + this->m_HasName = u8_name != nullptr; + if (this->m_HasName) this->m_Name = u8_name; + else this->m_Name.clear(); + } CK_OBJECT_FLAGS GetObjectFlags(void) { return this->m_ObjectFlags; } void SetObjectFlags(CK_OBJECT_FLAGS flags) { this->m_ObjectFlags = flags; } @@ -24,13 +28,14 @@ namespace LibCmo::CK2::CKObjectImplements { protected: CK_ID m_ID; std::string m_Name; + bool m_HasName; CK_OBJECT_FLAGS m_ObjectFlags; CKMinContext* m_Context; }; class CKSceneObject : public CKObject { public: - CKSceneObject(); + CKSceneObject(CKMinContext* ctx, CK_ID ckid, CKSTRING name); CKSceneObject(const CKSceneObject&) = delete; CKSceneObject& operator=(const CKSceneObject&) = delete; virtual ~CKSceneObject(); @@ -42,7 +47,7 @@ namespace LibCmo::CK2::CKObjectImplements { class CKBeObject : public CKSceneObject { public: - CKBeObject(); + CKBeObject(CKMinContext* ctx, CK_ID ckid, CKSTRING name); CKBeObject(const CKBeObject&) = delete; CKBeObject& operator=(const CKBeObject&) = delete; virtual ~CKBeObject(); @@ -54,7 +59,7 @@ namespace LibCmo::CK2::CKObjectImplements { class CKGroup : public CKBeObject { public: - CKGroup(); + CKGroup(CKMinContext* ctx, CK_ID ckid, CKSTRING name); CKGroup(const CKGroup&) = delete; CKGroup& operator=(const CKGroup&) = delete; virtual ~CKGroup(); @@ -66,7 +71,7 @@ namespace LibCmo::CK2::CKObjectImplements { class CKMesh : public CKBeObject { public: - CKMesh(); + CKMesh(CKMinContext* ctx, CK_ID ckid, CKSTRING name); CKMesh(const CKMesh&) = delete; CKMesh& operator=(const CKMesh&) = delete; virtual ~CKMesh(); @@ -78,7 +83,7 @@ namespace LibCmo::CK2::CKObjectImplements { class CKTexture : public CKBeObject { public: - CKTexture(); + CKTexture(CKMinContext* ctx, CK_ID ckid, CKSTRING name); CKTexture(const CKTexture&) = delete; CKTexture& operator=(const CKTexture&) = delete; virtual ~CKTexture(); @@ -90,7 +95,7 @@ namespace LibCmo::CK2::CKObjectImplements { class CKMaterial : public CKBeObject { public: - CKMaterial(); + CKMaterial(CKMinContext* ctx, CK_ID ckid, CKSTRING name); CKMaterial(const CKMaterial&) = delete; CKMaterial& operator=(const CKMaterial&) = delete; virtual ~CKMaterial(); @@ -102,7 +107,7 @@ namespace LibCmo::CK2::CKObjectImplements { class CKRenderObject : public CKBeObject { public: - CKRenderObject(); + CKRenderObject(CKMinContext* ctx, CK_ID ckid, CKSTRING name); CKRenderObject(const CKRenderObject&) = delete; CKRenderObject& operator=(const CKRenderObject&) = delete; ~CKRenderObject(); @@ -112,9 +117,9 @@ namespace LibCmo::CK2::CKObjectImplements { }; - class CK3dEntity : public CKBeObject { + class CK3dEntity : public CKRenderObject { public: - CK3dEntity(); + CK3dEntity(CKMinContext* ctx, CK_ID ckid, CKSTRING name); CK3dEntity(const CK3dEntity&) = delete; CK3dEntity& operator=(const CK3dEntity&) = delete; virtual ~CK3dEntity(); @@ -126,7 +131,7 @@ namespace LibCmo::CK2::CKObjectImplements { class CK3dObject :public CK3dEntity { public: - CK3dObject(); + CK3dObject(CKMinContext* ctx, CK_ID ckid, CKSTRING name); CK3dObject(const CK3dObject&) = delete; CK3dObject& operator=(const CK3dObject&) = delete; ~CK3dObject(); diff --git a/LibCmo/CKStateChunk.cpp b/LibCmo/CKStateChunk.cpp index 5430990..3255b17 100644 --- a/LibCmo/CKStateChunk.cpp +++ b/LibCmo/CKStateChunk.cpp @@ -132,11 +132,13 @@ namespace LibCmo::CK2 { needed = dwsize + this->m_Parser.m_CurrentPos; // try resizing it - this->ResizeBuffer(needed); + if (!this->ResizeBuffer(needed)) return false; // update size this->m_Parser.m_DataSize = needed; } + + return true; } bool CKStateChunk::Skip(CKDWORD DwordCount) { @@ -392,6 +394,8 @@ namespace LibCmo::CK2 { std::memcpy(strl.data(), this->m_pData + this->m_Parser.m_CurrentPos, strByteSize); this->m_Parser.m_CurrentPos += strDwordSize; } else strl.clear(); + + return CKERROR::CKERR_OK; } diff --git a/LibCmo/LibCmo.vcxproj b/LibCmo/LibCmo.vcxproj index 5a94dd4..66297ee 100644 --- a/LibCmo/LibCmo.vcxproj +++ b/LibCmo/LibCmo.vcxproj @@ -178,6 +178,7 @@ + diff --git a/LibCmo/LibCmo.vcxproj.filters b/LibCmo/LibCmo.vcxproj.filters index abfd5a5..e187cb2 100644 --- a/LibCmo/LibCmo.vcxproj.filters +++ b/LibCmo/LibCmo.vcxproj.filters @@ -51,6 +51,9 @@ Sources + + Sources\CKManagerImplements +