move some document into here

This commit is contained in:
yyc12345 2023-02-04 22:21:18 +08:00
parent e354c2c373
commit 5c50efe803
6 changed files with 1514 additions and 4 deletions

2
.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
*.fods eol=lf

1321
Documents/ClassOffset.fods Normal file

File diff suppressed because it is too large Load Diff

166
Documents/Recorder.txt Normal file
View File

@ -0,0 +1,166 @@
CKFile in VT21: 0xC8, 200, count50; in VT25: 0xE0, 224, count 56
lost 24 byte, 6 fields or 2 lists
m_FileName
in VT21 +34, 136
in VT25 +31, 124
m_MappedFile
in VT21 +37, 148
in VT25 +34, 136
m_Context
in VT21 +35, 140
in VT25 +32, 128
VxMemoryMappedFile and CKFileInfo seems no change
CKFileObject still no change
CKFilePluginDependencies still no change
CKStateChunk is 0x28u black box
CKBufferParser also is 0x10u black box
struct CKGUID {
DWORD d1,d2;
};
struct XBaseString {
// the string
char* m_Buffer;
// the length of the string
WORD m_Length;
// the allocated size
WORD m_Allocated;
};
struct XArray {
// elements start {secret}
DWORD* m_Begin;
// elements end {secret}
DWORD* m_End;
// reserved end {secret}
DWORD* m_AllocatedEnd;
}
struct XClassArray {
DWORD* m_Begin;
DWORD* m_End;
DWORD* m_AllocatedEnd;
}
struct XSArray {
DWORD* m_Begin;
DWORD* m_End;
};
struct XBitArray {
DWORD m_Data_Flags;
DWORD m_Size;
};
struct CKFileInfo
{
DWORD ProductVersion; // Virtools Version (Dev/Creation). (CK_VIRTOOLS_VERSION)
DWORD ProductBuild; // Virtools Build Number.
DWORD FileWriteMode; // Options used to save this file. (CK_FILE_WRITEMODE)
DWORD FileVersion; // Version of file format when file was saved.
DWORD CKVersion; // Version of CK when file was saved.
DWORD FileSize; // Size of file in bytes.
DWORD ObjectCount; // Number of objects stored in the file.
DWORD ManagerCount; // Number of managers which saved data in the file.
DWORD MaxIDSaved; // Maximum Object identifier saved
DWORD Crc; // Crc of data
DWORD Hdr1PackSize; // Reserved
DWORD Hdr1UnPackSize; // Reserved
DWORD DataPackSize; // Reserved
DWORD DataUnPackSize; // Reserved
};
struct CKFileObject {
CK_ID Object; // ID of the object being load/saved (as it will be/was saved in the file)
CK_ID CreatedObject; // ID of the object being created
CK_CLASSID ObjectCid; // Class Identifier of the object
CKObject* ObjPtr; // A pointer to the object itself (as CreatedObject when loading)
CKSTRING Name; // Name of the Object
CKStateChunk* Data; // A CKStateChunk that contains object information
int PostPackSize; // When compressed chunk by chunk : size of Data after compression
int PrePackSize; // When compressed chunk by chunk : size of Data before compression
CK_FO_OPTIONS Options; // When loading an object it may be renamed , use to replace another object
int FileIndex; // Position of the object data inside uncompressed file buffer
CKDWORD SaveFlags; // Flags used when this object was saved.
};
struct CKFilePluginDependencies{
int m_PluginCategory;
XArray/*<CKGUID>*/ m_Guids;
XBitArray ValidGuids;
};
struct VxMemoryMappedFile {
void* m_hFile;
void* m_hFileMapping; // Handle of memory mapped file
void* m_pMemoryMappedFileBase;
DWORD m_cbFile;
DWORD m_errCode;
};
struct CKBufferParser {
char* m_ReaderBegin;
DWORD m_ReaderPos;
CKBOOL m_NeedManualFree;
DWORD m_ReaderSize;
};
struct CKFile {
// 0
int m_SaveIDMax; // Maximum CK_ID found when saving or loading objects {secret}
XArray/*<CKFileObject>*/ m_FileObjects; // List of objects being saved / loaded {secret}
XArray/*<CKFileManagerData>*/ m_ManagersData; // Manager Data loaded {secret}
XClassArray/*<CKFilePluginDependencies>*/ m_PluginsDep; // Plugins dependencies for this file {secret}
XClassArray/*<XIntArray>*/ m_IndexByClassId; // List of index in the m_FileObjects table sorted by ClassID {secret}
XClassArray/*<XString>*/ m_IncludedFiles; // List of files that should be inserted in the CMO file. {secret}
// 16
CKFileInfo m_FileInfo; // Headers summary {secret}
// 16 + 14 = 30
// guess
DWORD unknow_fields;
XBitArray m_AlreadySavedMask; // BitArray of IDs already saved {secret}
// 30 + 3 = 33
CKDWORD m_Flags; // Flags used to save file {secret}
CKSTRING m_FileName; // Current file name {secret}
CKContext* m_Context; // CKContext on which file is loaded/Saved {secret}
CKBufferParser* m_Parser;
VxMemoryMappedFile* m_MappedFile;
// 33 + 5 = 38
// guess
float m_Chrono[5];
// 38 + 5 = 43
//[guess]
CKBOOL m_SceneSaved;
CKBOOL m_ReadFileDataDone;
// 43 + 2 = 45
XBitArray m_AlreadyReferencedMask; // BitArray of IDs already referenced {secret}
XObjectPointerArray m_ReferencedObjects;
// 45 + 2 + 3 = 50
};
VxTimeProfiler m_Chrono;
XFileObjectsTable m_ObjectsHashTable;
//#ifdef USECHUNKTABLE
XClassArray/*<CKFileChunk>*/ m_FileChunks; // Instead of allocating chunk per chunk a whole memory buffer is allocated to store all chunks and their readers
CKFileChunk* m_ObjectChunks;
CKFileChunk* m_ManagersChunks;
VxMemoryPool m_ChunkBuffers; // Store all decompressed file buffer in memory so that all chunks directly points to it...
// can only work for recent files ( > 2.0)
BYTE* m_CurrentChunkBufferPtr;
//#endif
CKBOOL m_ReadFileDataDone;
CKBOOL m_SceneSaved;
//-----------
XIntArray m_DuplicateNameFounds; // A List of file object index for which a existing object with the same name has been
// found, this list is build if the load option contains CK_LOAD_AUTOMATICMODE or CK_LOAD_DODIALOG
//-----
XBitArray m_AlreadySavedMask; // BitArray of IDs already saved {secret}
XBitArray m_AlreadyReferencedMask; // BitArray of IDs already referenced {secret}
XObjectPointerArray m_ReferencedObjects;
};

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2013-2023 BearKidsTeam
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -25,7 +25,7 @@ class CKEnum(object):
if i.value == self.m_Value: if i.value == self.m_Value:
return '<' + i.name + '>' return '<' + i.name + '>'
return "<[None] {:d}>".format(self.m_Value) return "<[None]: {:d}>".format(self.m_Value)
def __str__(self): def __str__(self):
return self.__repr__() return self.__repr__()
@ -48,14 +48,14 @@ class CKFlagEnum(CKEnum):
for i in self: for i in self:
# if it have exactly same entry, return directly # if it have exactly same entry, return directly
if i.value == self.m_Value: if i.value == self.m_Value:
return i.name return '<' + i.name + '>'
# check exist # check exist
if bool(self.m_Value & i.value): if bool(self.m_Value & i.value):
pending.append(i.name) pending.append(i.name)
result = ', '.join(pending) result = ', '.join(pending)
return ('<' + result + '>') if len(result) != 9 else "<[None] {:d}>".format(self.m_Value) return ('<' + result + '>') if len(result) != 0 else "<[None]: {:d}>".format(self.m_Value)
class CK_FILE_WRITEMODE(CKFlagEnum): class CK_FILE_WRITEMODE(CKFlagEnum):
CKFILE_UNCOMPRESSED =0 # Save data uncompressed CKFILE_UNCOMPRESSED =0 # Save data uncompressed

View File

@ -19,7 +19,7 @@ class CKFileInfo:
self.ProductVersion: int = 0 self.ProductVersion: int = 0
self.ProductBuild: int = 0 self.ProductBuild: int = 0
self.FileWriteMode: VTConstants.CK_FILE_WRITEMODE = VTConstants.CK_FILE_WRITEMODE(0) self.FileWriteMode: VTConstants.CK_FILE_WRITEMODE = VTConstants.CK_FILE_WRITEMODE(VTConstants.CK_FILE_WRITEMODE.CKFILE_WHOLECOMPRESSED)
self.FileVersion: int = 0 self.FileVersion: int = 0
self.CKVersion: int = 0 self.CKVersion: int = 0