From 89fc46c7789149e18d56aa939588e04e9d07bf6d Mon Sep 17 00:00:00 2001 From: kervala Date: Sat, 20 Apr 2019 10:33:30 +0200 Subject: [PATCH 01/14] Fixed: Missing macro for Nmake --HG-- branch : develop --- code/CMakeModules/PCHSupport.cmake | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/code/CMakeModules/PCHSupport.cmake b/code/CMakeModules/PCHSupport.cmake index e0794ad9d..5069ec40f 100644 --- a/code/CMakeModules/PCHSupport.cmake +++ b/code/CMakeModules/PCHSupport.cmake @@ -299,6 +299,27 @@ MACRO(PCH_SET_COMPILE_FLAGS _target) SEPARATE_ARGUMENTS(PCH_FLAGS) ENDMACRO() +MACRO(GET_PDB_FILENAME _out_filename _target) + # determine output directory based on target type + GET_TARGET_PROPERTY(_targetType ${_target} TYPE) + IF(${_targetType} STREQUAL EXECUTABLE) + SET(_targetOutput ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + ELSEIF(${_targetType} STREQUAL STATIC_LIBRARY) + SET(_targetOutput ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}) + ELSE() + SET(_targetOutput ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) + ENDIF() + + # determine target postfix + STRING(TOUPPER "${CMAKE_BUILD_TYPE}_POSTFIX" _postfix_var_name) + GET_TARGET_PROPERTY(_targetPostfix ${_target} ${_postfix_var_name}) + IF(${_targetPostfix} MATCHES NOTFOUND) + SET(_targetPostfix "") + ENDIF() + + SET(${_out_filename} "${_targetOutput}/${_target}${_targetPostfix}.pdb") +ENDMACRO(GET_PDB_FILENAME) + MACRO(PCH_SET_COMPILE_COMMAND _inputcpp _compile_FLAGS _includes) IF(CMAKE_CXX_COMPILER_ARG1) # remove leading space in compiler argument @@ -308,7 +329,7 @@ MACRO(PCH_SET_COMPILE_COMMAND _inputcpp _compile_FLAGS _includes) ENDIF() IF(MSVC) - GET_INTERMEDIATE_PDB_FULLPATH(${_PCH_current_target} _PDB_FILE) + GET_PDB_FILENAME(_PDB_FILE ${_PCH_current_target}) SET(PCH_TEMP_CONTENT) From d769a22686046ec0d580f0fe3ea4ceaf6c3bf521 Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 21 Apr 2019 14:10:43 +0200 Subject: [PATCH 02/14] Fixed: Don't use current servers count if default one is hihger --HG-- branch : develop --- code/ryzom/tools/client/ryzom_installer/src/configfile.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/ryzom/tools/client/ryzom_installer/src/configfile.cpp b/code/ryzom/tools/client/ryzom_installer/src/configfile.cpp index 7b61bda7e..bff6fb795 100644 --- a/code/ryzom/tools/client/ryzom_installer/src/configfile.cpp +++ b/code/ryzom/tools/client/ryzom_installer/src/configfile.cpp @@ -121,7 +121,8 @@ bool CConfigFile::load(const QString &filename) // only resize if added servers in local ryzom_installer.ini CServers defaultServers = m_servers; - m_servers.resize(serversCount); + // only resize if servers count is greater than default ones + if (serversCount > m_servers.count()) m_servers.resize(serversCount); for (int i = 0; i < serversCount; ++i) { From 7271eb4f03ec5f89fdc7f81d4dd234c3a70cab74 Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 21 Apr 2019 14:12:55 +0200 Subject: [PATCH 03/14] Changed: Don't include Freetype headers in .h --HG-- branch : develop --- code/nel/include/nel/3d/font_generator.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/nel/include/nel/3d/font_generator.h b/code/nel/include/nel/3d/font_generator.h index e71551c43..b69249d58 100644 --- a/code/nel/include/nel/3d/font_generator.h +++ b/code/nel/include/nel/3d/font_generator.h @@ -21,8 +21,12 @@ #undef NL_DONT_USE_EXTERNAL_CODE #ifndef NL_DONT_USE_EXTERNAL_CODE -#include -#include FT_FREETYPE_H + +// forward declarations to avoid including freetype.h in headers +typedef int FT_Error; +typedef struct FT_LibraryRec_ *FT_Library; +typedef struct FT_FaceRec_* FT_Face; + #else // NL_DONT_USE_EXTERNAL_CODE #endif // NL_DONT_USE_EXTERNAL_CODE From 931b62d2e4172c286046d1de8524d19b78a20188 Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 21 Apr 2019 14:15:49 +0200 Subject: [PATCH 04/14] Changed: Updated LZMA SDK to version 18.05 --HG-- branch : develop --- code/ryzom/client/src/seven_zip/7z.h | 12 +- code/ryzom/client/src/seven_zip/7zAlloc.cpp | 12 +- code/ryzom/client/src/seven_zip/7zAlloc.h | 20 +- code/ryzom/client/src/seven_zip/7zArcIn.cpp | 98 +- code/ryzom/client/src/seven_zip/7zBuf.cpp | 12 +- code/ryzom/client/src/seven_zip/7zBuf.h | 10 +- code/ryzom/client/src/seven_zip/7zBuf2.cpp | 17 +- code/ryzom/client/src/seven_zip/7zCrc.cpp | 16 +- code/ryzom/client/src/seven_zip/7zCrcOpt.cpp | 50 +- code/ryzom/client/src/seven_zip/7zDec.cpp | 58 +- code/ryzom/client/src/seven_zip/7zFile.cpp | 26 +- code/ryzom/client/src/seven_zip/7zFile.h | 8 +- code/ryzom/client/src/seven_zip/7zMain.cpp | 161 +- code/ryzom/client/src/seven_zip/7zStream.cpp | 111 +- code/ryzom/client/src/seven_zip/7zTypes.h | 224 +- code/ryzom/client/src/seven_zip/7zVersion.h | 22 +- code/ryzom/client/src/seven_zip/Aes.cpp | 67 +- code/ryzom/client/src/seven_zip/AesOpt.cpp | 4 +- code/ryzom/client/src/seven_zip/Alloc.cpp | 399 ++- code/ryzom/client/src/seven_zip/Alloc.h | 20 +- code/ryzom/client/src/seven_zip/Bcj2.cpp | 13 +- code/ryzom/client/src/seven_zip/Bcj2Enc.cpp | 4 +- code/ryzom/client/src/seven_zip/Bra.cpp | 289 +- code/ryzom/client/src/seven_zip/Bra86.cpp | 4 +- code/ryzom/client/src/seven_zip/BraIA64.cpp | 82 +- code/ryzom/client/src/seven_zip/Compiler.h | 3 +- code/ryzom/client/src/seven_zip/CpuArch.h | 174 +- code/ryzom/client/src/seven_zip/LzFind.cpp | 163 +- code/ryzom/client/src/seven_zip/LzFind.h | 12 +- code/ryzom/client/src/seven_zip/Lzma2Dec.cpp | 350 ++- code/ryzom/client/src/seven_zip/Lzma2Dec.h | 66 +- code/ryzom/client/src/seven_zip/Lzma2Enc.cpp | 691 +++-- code/ryzom/client/src/seven_zip/Lzma2Enc.h | 45 +- code/ryzom/client/src/seven_zip/LzmaDec.cpp | 401 +-- code/ryzom/client/src/seven_zip/LzmaDec.h | 47 +- code/ryzom/client/src/seven_zip/LzmaEnc.cpp | 2354 ++++++++++------- code/ryzom/client/src/seven_zip/LzmaEnc.h | 48 +- code/ryzom/client/src/seven_zip/Ppmd.h | 4 +- code/ryzom/client/src/seven_zip/Ppmd7.cpp | 28 +- code/ryzom/client/src/seven_zip/Ppmd7.h | 26 +- code/ryzom/client/src/seven_zip/Ppmd7Dec.cpp | 34 +- code/ryzom/client/src/seven_zip/Ppmd7Enc.cpp | 4 +- code/ryzom/client/src/seven_zip/Precomp.h | 4 +- code/ryzom/client/src/seven_zip/Sha256.cpp | 6 +- code/ryzom/client/src/seven_zip/Xz.cpp | 18 +- code/ryzom/client/src/seven_zip/Xz.h | 237 +- code/ryzom/client/src/seven_zip/XzCrc64.cpp | 22 +- .../ryzom/client/src/seven_zip/XzCrc64Opt.cpp | 30 +- code/ryzom/client/src/seven_zip/XzDec.cpp | 2266 ++++++++++++++-- code/ryzom/client/src/seven_zip/XzEnc.cpp | 1355 ++++++++-- code/ryzom/client/src/seven_zip/XzEnc.h | 27 +- code/ryzom/client/src/seven_zip/XzIn.cpp | 60 +- code/ryzom/client/src/seven_zip/seven_zip.cpp | 30 +- 53 files changed, 7427 insertions(+), 2817 deletions(-) diff --git a/code/ryzom/client/src/seven_zip/7z.h b/code/ryzom/client/src/seven_zip/7z.h index 476815194..6c7886e38 100644 --- a/code/ryzom/client/src/seven_zip/7z.h +++ b/code/ryzom/client/src/seven_zip/7z.h @@ -1,5 +1,5 @@ /* 7z.h -- 7z interface -2015-11-18 : Igor Pavlov : Public domain */ +2017-04-03 : Igor Pavlov : Public domain */ #ifndef __7Z_H #define __7Z_H @@ -98,7 +98,7 @@ UInt64 SzAr_GetFolderUnpackSize(const CSzAr *p, UInt32 folderIndex); SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex, ILookInStream *stream, UInt64 startPos, Byte *outBuffer, size_t outSize, - ISzAlloc *allocMain); + ISzAllocPtr allocMain); typedef struct { @@ -131,7 +131,7 @@ typedef struct #define SzArEx_GetFileSize(p, i) ((p)->UnpackPositions[(i) + 1] - (p)->UnpackPositions[i]) void SzArEx_Init(CSzArEx *p); -void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc); +void SzArEx_Free(CSzArEx *p, ISzAllocPtr alloc); UInt64 SzArEx_GetFolderStreamPos(const CSzArEx *p, UInt32 folderIndex, UInt32 indexInFolder); int SzArEx_GetFolderFullPackSize(const CSzArEx *p, UInt32 folderIndex, UInt64 *resSize); @@ -179,8 +179,8 @@ SRes SzArEx_Extract( size_t *outBufferSize, /* buffer size for output buffer */ size_t *offset, /* offset of stream for required file in *outBuffer */ size_t *outSizeProcessed, /* size of file in *outBuffer */ - ISzAlloc *allocMain, - ISzAlloc *allocTemp); + ISzAllocPtr allocMain, + ISzAllocPtr allocTemp); /* @@ -195,7 +195,7 @@ SZ_ERROR_FAIL */ SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, - ISzAlloc *allocMain, ISzAlloc *allocTemp); + ISzAllocPtr allocMain, ISzAllocPtr allocTemp); EXTERN_C_END diff --git a/code/ryzom/client/src/seven_zip/7zAlloc.cpp b/code/ryzom/client/src/seven_zip/7zAlloc.cpp index 3e848c980..c924a529f 100644 --- a/code/ryzom/client/src/seven_zip/7zAlloc.cpp +++ b/code/ryzom/client/src/seven_zip/7zAlloc.cpp @@ -1,8 +1,10 @@ /* 7zAlloc.c -- Allocation functions -2015-11-09 : Igor Pavlov : Public domain */ +2017-04-03 : Igor Pavlov : Public domain */ #include "Precomp.h" +#include + #include "7zAlloc.h" /* #define _SZ_ALLOC_DEBUG */ @@ -20,7 +22,7 @@ int g_allocCountTemp = 0; #endif -void *SzAlloc(void *p, size_t size) +void *SzAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p); if (size == 0) @@ -32,7 +34,7 @@ void *SzAlloc(void *p, size_t size) return malloc(size); } -void SzFree(void *p, void *address) +void SzFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p); #ifdef _SZ_ALLOC_DEBUG @@ -45,7 +47,7 @@ void SzFree(void *p, void *address) free(address); } -void *SzAllocTemp(void *p, size_t size) +void *SzAllocTemp(ISzAllocPtr p, size_t size) { UNUSED_VAR(p); if (size == 0) @@ -60,7 +62,7 @@ void *SzAllocTemp(void *p, size_t size) return malloc(size); } -void SzFreeTemp(void *p, void *address) +void SzFreeTemp(ISzAllocPtr p, void *address) { UNUSED_VAR(p); #ifdef _SZ_ALLOC_DEBUG diff --git a/code/ryzom/client/src/seven_zip/7zAlloc.h b/code/ryzom/client/src/seven_zip/7zAlloc.h index 2fd5bdbc8..44778f9b2 100644 --- a/code/ryzom/client/src/seven_zip/7zAlloc.h +++ b/code/ryzom/client/src/seven_zip/7zAlloc.h @@ -1,23 +1,19 @@ /* 7zAlloc.h -- Allocation functions -2013-03-25 : Igor Pavlov : Public domain */ +2017-04-03 : Igor Pavlov : Public domain */ #ifndef __7Z_ALLOC_H #define __7Z_ALLOC_H -#include +#include "7zTypes.h" -#ifdef __cplusplus -extern "C" { -#endif +EXTERN_C_BEGIN -void *SzAlloc(void *p, size_t size); -void SzFree(void *p, void *address); +void *SzAlloc(ISzAllocPtr p, size_t size); +void SzFree(ISzAllocPtr p, void *address); -void *SzAllocTemp(void *p, size_t size); -void SzFreeTemp(void *p, void *address); +void *SzAllocTemp(ISzAllocPtr p, size_t size); +void SzFreeTemp(ISzAllocPtr p, void *address); -#ifdef __cplusplus -} -#endif +EXTERN_C_END #endif diff --git a/code/ryzom/client/src/seven_zip/7zArcIn.cpp b/code/ryzom/client/src/seven_zip/7zArcIn.cpp index 2beed3d5c..e1b03d879 100644 --- a/code/ryzom/client/src/seven_zip/7zArcIn.cpp +++ b/code/ryzom/client/src/seven_zip/7zArcIn.cpp @@ -1,5 +1,5 @@ /* 7zArcIn.c -- 7z Input functions -2016-05-16 : Igor Pavlov : Public domain */ +2017-04-03 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -11,7 +11,7 @@ #include "CpuArch.h" #define MY_ALLOC(T, p, size, alloc) { \ - if ((p = (T *)IAlloc_Alloc(alloc, (size) * sizeof(T))) == NULL) return SZ_ERROR_MEM; } + if ((p = (T *)ISzAlloc_Alloc(alloc, (size) * sizeof(T))) == NULL) return SZ_ERROR_MEM; } #define MY_ALLOC_ZE(T, p, size, alloc) { if ((size) == 0) p = NULL; else MY_ALLOC(T, p, size, alloc) } @@ -60,7 +60,7 @@ const Byte k7zSignature[k7zSignatureSize] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}; #define SzBitUi32s_Init(p) { (p)->Defs = NULL; (p)->Vals = NULL; } -static SRes SzBitUi32s_Alloc(CSzBitUi32s *p, size_t num, ISzAlloc *alloc) +static SRes SzBitUi32s_Alloc(CSzBitUi32s *p, size_t num, ISzAllocPtr alloc) { if (num == 0) { @@ -75,18 +75,18 @@ static SRes SzBitUi32s_Alloc(CSzBitUi32s *p, size_t num, ISzAlloc *alloc) return SZ_OK; } -void SzBitUi32s_Free(CSzBitUi32s *p, ISzAlloc *alloc) +void SzBitUi32s_Free(CSzBitUi32s *p, ISzAllocPtr alloc) { - IAlloc_Free(alloc, p->Defs); p->Defs = NULL; - IAlloc_Free(alloc, p->Vals); p->Vals = NULL; + ISzAlloc_Free(alloc, p->Defs); p->Defs = NULL; + ISzAlloc_Free(alloc, p->Vals); p->Vals = NULL; } #define SzBitUi64s_Init(p) { (p)->Defs = NULL; (p)->Vals = NULL; } -void SzBitUi64s_Free(CSzBitUi64s *p, ISzAlloc *alloc) +void SzBitUi64s_Free(CSzBitUi64s *p, ISzAllocPtr alloc) { - IAlloc_Free(alloc, p->Defs); p->Defs = NULL; - IAlloc_Free(alloc, p->Vals); p->Vals = NULL; + ISzAlloc_Free(alloc, p->Defs); p->Defs = NULL; + ISzAlloc_Free(alloc, p->Vals); p->Vals = NULL; } @@ -107,18 +107,18 @@ static void SzAr_Init(CSzAr *p) p->CodersData = NULL; } -static void SzAr_Free(CSzAr *p, ISzAlloc *alloc) +static void SzAr_Free(CSzAr *p, ISzAllocPtr alloc) { - IAlloc_Free(alloc, p->PackPositions); + ISzAlloc_Free(alloc, p->PackPositions); SzBitUi32s_Free(&p->FolderCRCs, alloc); - IAlloc_Free(alloc, p->FoCodersOffsets); - IAlloc_Free(alloc, p->FoStartPackStreamIndex); - IAlloc_Free(alloc, p->FoToCoderUnpackSizes); - IAlloc_Free(alloc, p->FoToMainUnpackSizeIndex); - IAlloc_Free(alloc, p->CoderUnpackSizes); + ISzAlloc_Free(alloc, p->FoCodersOffsets); + ISzAlloc_Free(alloc, p->FoStartPackStreamIndex); + ISzAlloc_Free(alloc, p->FoToCoderUnpackSizes); + ISzAlloc_Free(alloc, p->FoToMainUnpackSizeIndex); + ISzAlloc_Free(alloc, p->CoderUnpackSizes); - IAlloc_Free(alloc, p->CodersData); + ISzAlloc_Free(alloc, p->CodersData); SzAr_Init(p); } @@ -147,16 +147,16 @@ void SzArEx_Init(CSzArEx *p) SzBitUi64s_Init(&p->CTime); } -void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc) +void SzArEx_Free(CSzArEx *p, ISzAllocPtr alloc) { - IAlloc_Free(alloc, p->UnpackPositions); - IAlloc_Free(alloc, p->IsDirs); + ISzAlloc_Free(alloc, p->UnpackPositions); + ISzAlloc_Free(alloc, p->IsDirs); - IAlloc_Free(alloc, p->FolderToFile); - IAlloc_Free(alloc, p->FileToFolder); + ISzAlloc_Free(alloc, p->FolderToFile); + ISzAlloc_Free(alloc, p->FileToFolder); - IAlloc_Free(alloc, p->FileNameOffsets); - IAlloc_Free(alloc, p->FileNames); + ISzAlloc_Free(alloc, p->FileNameOffsets); + ISzAlloc_Free(alloc, p->FileNames); SzBitUi32s_Free(&p->CRCs, alloc); SzBitUi32s_Free(&p->Attribs, alloc); @@ -305,7 +305,7 @@ static UInt32 CountDefinedBits(const Byte *bits, UInt32 numItems) return sum; } -static MY_NO_INLINE SRes ReadBitVector(CSzData *sd, UInt32 numItems, Byte **v, ISzAlloc *alloc) +static MY_NO_INLINE SRes ReadBitVector(CSzData *sd, UInt32 numItems, Byte **v, ISzAllocPtr alloc) { Byte allAreDefined; Byte *v2; @@ -328,12 +328,12 @@ static MY_NO_INLINE SRes ReadBitVector(CSzData *sd, UInt32 numItems, Byte **v, I { unsigned numBits = (unsigned)numItems & 7; if (numBits != 0) - v2[numBytes - 1] = (Byte)((((UInt32)1 << numBits) - 1) << (8 - numBits)); + v2[(size_t)numBytes - 1] = (Byte)((((UInt32)1 << numBits) - 1) << (8 - numBits)); } return SZ_OK; } -static MY_NO_INLINE SRes ReadUi32s(CSzData *sd2, UInt32 numItems, CSzBitUi32s *crcs, ISzAlloc *alloc) +static MY_NO_INLINE SRes ReadUi32s(CSzData *sd2, UInt32 numItems, CSzBitUi32s *crcs, ISzAllocPtr alloc) { UInt32 i; CSzData sd; @@ -354,7 +354,7 @@ static MY_NO_INLINE SRes ReadUi32s(CSzData *sd2, UInt32 numItems, CSzBitUi32s *c return SZ_OK; } -static SRes ReadBitUi32s(CSzData *sd, UInt32 numItems, CSzBitUi32s *crcs, ISzAlloc *alloc) +static SRes ReadBitUi32s(CSzData *sd, UInt32 numItems, CSzBitUi32s *crcs, ISzAllocPtr alloc) { SzBitUi32s_Free(crcs, alloc); RINOK(ReadBitVector(sd, numItems, &crcs->Defs, alloc)); @@ -380,7 +380,7 @@ static SRes SkipBitUi32s(CSzData *sd, UInt32 numItems) return SZ_OK; } -static SRes ReadPackInfo(CSzAr *p, CSzData *sd, ISzAlloc *alloc) +static SRes ReadPackInfo(CSzAr *p, CSzData *sd, ISzAllocPtr alloc) { RINOK(SzReadNumber32(sd, &p->NumPackStreams)); @@ -635,7 +635,7 @@ static SRes ReadUnpackInfo(CSzAr *p, CSzData *sd2, UInt32 numFoldersMax, const CBuf *tempBufs, UInt32 numTempBufs, - ISzAlloc *alloc) + ISzAllocPtr alloc) { CSzData sd; @@ -934,7 +934,7 @@ static SRes SzReadStreamsInfo(CSzAr *p, UInt32 numFoldersMax, const CBuf *tempBufs, UInt32 numTempBufs, UInt64 *dataOffset, CSubStreamInfo *ssi, - ISzAlloc *alloc) + ISzAllocPtr alloc) { UInt64 type; @@ -976,7 +976,7 @@ static SRes SzReadAndDecodePackedStreams( UInt32 numFoldersMax, UInt64 baseOffset, CSzAr *p, - ISzAlloc *allocTemp) + ISzAllocPtr allocTemp) { UInt64 dataStartPos; UInt32 fo; @@ -1043,7 +1043,7 @@ static SRes SzReadFileNames(const Byte *data, size_t size, UInt32 numFiles, size static MY_NO_INLINE SRes ReadTime(CSzBitUi64s *p, UInt32 num, CSzData *sd2, const CBuf *tempBufs, UInt32 numTempBufs, - ISzAlloc *alloc) + ISzAllocPtr alloc) { CSzData sd; UInt32 i; @@ -1096,8 +1096,8 @@ static SRes SzReadHeader2( CSzData *sd, ILookInStream *inStream, CBuf *tempBufs, UInt32 *numTempBufs, - ISzAlloc *allocMain, - ISzAlloc *allocTemp + ISzAllocPtr allocMain, + ISzAllocPtr allocTemp ) { CSubStreamInfo ssi; @@ -1472,8 +1472,8 @@ static SRes SzReadHeader( CSzArEx *p, CSzData *sd, ILookInStream *inStream, - ISzAlloc *allocMain, - ISzAlloc *allocTemp) + ISzAllocPtr allocMain, + ISzAllocPtr allocTemp) { UInt32 i; UInt32 numTempBufs = 0; @@ -1501,8 +1501,8 @@ static SRes SzReadHeader( static SRes SzArEx_Open2( CSzArEx *p, ILookInStream *inStream, - ISzAlloc *allocMain, - ISzAlloc *allocTemp) + ISzAllocPtr allocMain, + ISzAllocPtr allocTemp) { Byte header[k7zStartHeaderSize]; Int64 startArcPos; @@ -1513,7 +1513,7 @@ static SRes SzArEx_Open2( SRes res; startArcPos = 0; - RINOK(inStream->Seek(inStream, &startArcPos, SZ_SEEK_CUR)); + RINOK(ILookInStream_Seek(inStream, &startArcPos, SZ_SEEK_CUR)); RINOK(LookInStream_Read2(inStream, header, k7zStartHeaderSize, SZ_ERROR_NO_ARCHIVE)); @@ -1542,7 +1542,7 @@ static SRes SzArEx_Open2( { Int64 pos = 0; - RINOK(inStream->Seek(inStream, &pos, SZ_SEEK_END)); + RINOK(ILookInStream_Seek(inStream, &pos, SZ_SEEK_END)); if ((UInt64)pos < startArcPos + nextHeaderOffset || (UInt64)pos < startArcPos + k7zStartHeaderSize + nextHeaderOffset || (UInt64)pos < startArcPos + k7zStartHeaderSize + nextHeaderOffset + nextHeaderSize) @@ -1623,7 +1623,7 @@ static SRes SzArEx_Open2( SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, - ISzAlloc *allocMain, ISzAlloc *allocTemp) + ISzAllocPtr allocMain, ISzAllocPtr allocTemp) { SRes res = SzArEx_Open2(p, inStream, allocMain, allocTemp); if (res != SZ_OK) @@ -1641,8 +1641,8 @@ SRes SzArEx_Extract( size_t *outBufferSize, size_t *offset, size_t *outSizeProcessed, - ISzAlloc *allocMain, - ISzAlloc *allocTemp) + ISzAllocPtr allocMain, + ISzAllocPtr allocTemp) { UInt32 folderIndex = p->FileToFolder[fileIndex]; SRes res = SZ_OK; @@ -1652,7 +1652,7 @@ SRes SzArEx_Extract( if (folderIndex == (UInt32)-1) { - IAlloc_Free(allocMain, *tempBuf); + ISzAlloc_Free(allocMain, *tempBuf); *blockIndex = folderIndex; *tempBuf = NULL; *outBufferSize = 0; @@ -1664,7 +1664,7 @@ SRes SzArEx_Extract( UInt64 unpackSizeSpec = SzAr_GetFolderUnpackSize(&p->db, folderIndex); /* UInt64 unpackSizeSpec = - p->UnpackPositions[p->FolderToFile[folderIndex + 1]] - + p->UnpackPositions[p->FolderToFile[(size_t)folderIndex + 1]] - p->UnpackPositions[p->FolderToFile[folderIndex]]; */ size_t unpackSize = (size_t)unpackSizeSpec; @@ -1672,7 +1672,7 @@ SRes SzArEx_Extract( if (unpackSize != unpackSizeSpec) return SZ_ERROR_MEM; *blockIndex = folderIndex; - IAlloc_Free(allocMain, *tempBuf); + ISzAlloc_Free(allocMain, *tempBuf); *tempBuf = NULL; if (res == SZ_OK) @@ -1680,7 +1680,7 @@ SRes SzArEx_Extract( *outBufferSize = unpackSize; if (unpackSize != 0) { - *tempBuf = (Byte *)IAlloc_Alloc(allocMain, unpackSize); + *tempBuf = (Byte *)ISzAlloc_Alloc(allocMain, unpackSize); if (*tempBuf == NULL) res = SZ_ERROR_MEM; } @@ -1697,7 +1697,7 @@ SRes SzArEx_Extract( { UInt64 unpackPos = p->UnpackPositions[fileIndex]; *offset = (size_t)(unpackPos - p->UnpackPositions[p->FolderToFile[folderIndex]]); - *outSizeProcessed = (size_t)(p->UnpackPositions[fileIndex + 1] - unpackPos); + *outSizeProcessed = (size_t)(p->UnpackPositions[(size_t)fileIndex + 1] - unpackPos); if (*offset + *outSizeProcessed > *outBufferSize) return SZ_ERROR_FAIL; if (SzBitWithVals_Check(&p->CRCs, fileIndex)) diff --git a/code/ryzom/client/src/seven_zip/7zBuf.cpp b/code/ryzom/client/src/seven_zip/7zBuf.cpp index 089a5c4f2..8865c32a8 100644 --- a/code/ryzom/client/src/seven_zip/7zBuf.cpp +++ b/code/ryzom/client/src/seven_zip/7zBuf.cpp @@ -1,5 +1,5 @@ /* 7zBuf.c -- Byte Buffer -2013-01-21 : Igor Pavlov : Public domain */ +2017-04-03 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -11,7 +11,7 @@ void Buf_Init(CBuf *p) p->size = 0; } -int Buf_Create(CBuf *p, size_t size, ISzAlloc *alloc) +int Buf_Create(CBuf *p, size_t size, ISzAllocPtr alloc) { p->size = 0; if (size == 0) @@ -19,8 +19,8 @@ int Buf_Create(CBuf *p, size_t size, ISzAlloc *alloc) p->data = 0; return 1; } - p->data = (Byte *)alloc->Alloc(alloc, size); - if (p->data != 0) + p->data = (Byte *)ISzAlloc_Alloc(alloc, size); + if (p->data) { p->size = size; return 1; @@ -28,9 +28,9 @@ int Buf_Create(CBuf *p, size_t size, ISzAlloc *alloc) return 0; } -void Buf_Free(CBuf *p, ISzAlloc *alloc) +void Buf_Free(CBuf *p, ISzAllocPtr alloc) { - alloc->Free(alloc, p->data); + ISzAlloc_Free(alloc, p->data); p->data = 0; p->size = 0; } diff --git a/code/ryzom/client/src/seven_zip/7zBuf.h b/code/ryzom/client/src/seven_zip/7zBuf.h index 65f1d7a71..81d1b5b64 100644 --- a/code/ryzom/client/src/seven_zip/7zBuf.h +++ b/code/ryzom/client/src/seven_zip/7zBuf.h @@ -1,5 +1,5 @@ /* 7zBuf.h -- Byte Buffer -2013-01-18 : Igor Pavlov : Public domain */ +2017-04-03 : Igor Pavlov : Public domain */ #ifndef __7Z_BUF_H #define __7Z_BUF_H @@ -15,8 +15,8 @@ typedef struct } CBuf; void Buf_Init(CBuf *p); -int Buf_Create(CBuf *p, size_t size, ISzAlloc *alloc); -void Buf_Free(CBuf *p, ISzAlloc *alloc); +int Buf_Create(CBuf *p, size_t size, ISzAllocPtr alloc); +void Buf_Free(CBuf *p, ISzAllocPtr alloc); typedef struct { @@ -27,8 +27,8 @@ typedef struct void DynBuf_Construct(CDynBuf *p); void DynBuf_SeekToBeg(CDynBuf *p); -int DynBuf_Write(CDynBuf *p, const Byte *buf, size_t size, ISzAlloc *alloc); -void DynBuf_Free(CDynBuf *p, ISzAlloc *alloc); +int DynBuf_Write(CDynBuf *p, const Byte *buf, size_t size, ISzAllocPtr alloc); +void DynBuf_Free(CDynBuf *p, ISzAllocPtr alloc); EXTERN_C_END diff --git a/code/ryzom/client/src/seven_zip/7zBuf2.cpp b/code/ryzom/client/src/seven_zip/7zBuf2.cpp index 430f76bf8..208347416 100644 --- a/code/ryzom/client/src/seven_zip/7zBuf2.cpp +++ b/code/ryzom/client/src/seven_zip/7zBuf2.cpp @@ -1,5 +1,5 @@ /* 7zBuf2.c -- Byte Buffer -2014-08-22 : Igor Pavlov : Public domain */ +2017-04-03 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -19,19 +19,20 @@ void DynBuf_SeekToBeg(CDynBuf *p) p->pos = 0; } -int DynBuf_Write(CDynBuf *p, const Byte *buf, size_t size, ISzAlloc *alloc) +int DynBuf_Write(CDynBuf *p, const Byte *buf, size_t size, ISzAllocPtr alloc) { if (size > p->size - p->pos) { size_t newSize = p->pos + size; Byte *data; newSize += newSize / 4; - data = (Byte *)alloc->Alloc(alloc, newSize); - if (data == 0) + data = (Byte *)ISzAlloc_Alloc(alloc, newSize); + if (!data) return 0; p->size = newSize; - memcpy(data, p->data, p->pos); - alloc->Free(alloc, p->data); + if (p->pos != 0) + memcpy(data, p->data, p->pos); + ISzAlloc_Free(alloc, p->data); p->data = data; } if (size != 0) @@ -42,9 +43,9 @@ int DynBuf_Write(CDynBuf *p, const Byte *buf, size_t size, ISzAlloc *alloc) return 1; } -void DynBuf_Free(CDynBuf *p, ISzAlloc *alloc) +void DynBuf_Free(CDynBuf *p, ISzAllocPtr alloc) { - alloc->Free(alloc, p->data); + ISzAlloc_Free(alloc, p->data); p->data = 0; p->size = 0; p->pos = 0; diff --git a/code/ryzom/client/src/seven_zip/7zCrc.cpp b/code/ryzom/client/src/seven_zip/7zCrc.cpp index dc6d6abdc..b4d84f023 100644 --- a/code/ryzom/client/src/seven_zip/7zCrc.cpp +++ b/code/ryzom/client/src/seven_zip/7zCrc.cpp @@ -1,5 +1,5 @@ /* 7zCrc.c -- CRC32 init -2015-03-10 : Igor Pavlov : Public domain */ +2017-06-06 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -61,12 +61,12 @@ void MY_FAST_CALL CrcGenerateTable() UInt32 r = i; unsigned j; for (j = 0; j < 8; j++) - r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1)); + r = (r >> 1) ^ (kCrcPoly & ((UInt32)0 - (r & 1))); g_CrcTable[i] = r; } - for (; i < 256 * CRC_NUM_TABLES; i++) + for (i = 256; i < 256 * CRC_NUM_TABLES; i++) { - UInt32 r = g_CrcTable[i - 256]; + UInt32 r = g_CrcTable[(size_t)i - 256]; g_CrcTable[i] = g_CrcTable[r & 0xFF] ^ (r >> 8); } @@ -86,8 +86,8 @@ void MY_FAST_CALL CrcGenerateTable() #ifdef MY_CPU_X86_OR_AMD64 if (!CPU_Is_InOrder()) - g_CrcUpdate = CrcUpdateT8; #endif + g_CrcUpdate = CrcUpdateT8; #endif #else @@ -101,7 +101,7 @@ void MY_FAST_CALL CrcGenerateTable() g_CrcUpdate = CrcUpdateT4; #if CRC_NUM_TABLES >= 8 g_CrcUpdateT8 = CrcUpdateT8; - // g_CrcUpdate = CrcUpdateT8; + g_CrcUpdate = CrcUpdateT8; #endif } else if (p[0] != 1 || p[1] != 2) @@ -111,14 +111,14 @@ void MY_FAST_CALL CrcGenerateTable() { for (i = 256 * CRC_NUM_TABLES - 1; i >= 256; i--) { - UInt32 x = g_CrcTable[i - 256]; + UInt32 x = g_CrcTable[(size_t)i - 256]; g_CrcTable[i] = CRC_UINT32_SWAP(x); } g_CrcUpdateT4 = CrcUpdateT1_BeT4; g_CrcUpdate = CrcUpdateT1_BeT4; #if CRC_NUM_TABLES >= 8 g_CrcUpdateT8 = CrcUpdateT1_BeT8; - // g_CrcUpdate = CrcUpdateT1_BeT8; + g_CrcUpdate = CrcUpdateT1_BeT8; #endif } } diff --git a/code/ryzom/client/src/seven_zip/7zCrcOpt.cpp b/code/ryzom/client/src/seven_zip/7zCrcOpt.cpp index d1e1cd7ba..73beba298 100644 --- a/code/ryzom/client/src/seven_zip/7zCrcOpt.cpp +++ b/code/ryzom/client/src/seven_zip/7zCrcOpt.cpp @@ -1,5 +1,5 @@ /* 7zCrcOpt.c -- CRC32 calculation -2015-03-01 : Igor Pavlov : Public domain */ +2017-04-03 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -18,10 +18,10 @@ UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const U { v ^= *(const UInt32 *)p; v = - table[0x300 + ((v ) & 0xFF)] - ^ table[0x200 + ((v >> 8) & 0xFF)] - ^ table[0x100 + ((v >> 16) & 0xFF)] - ^ table[0x000 + ((v >> 24))]; + (table + 0x300)[((v ) & 0xFF)] + ^ (table + 0x200)[((v >> 8) & 0xFF)] + ^ (table + 0x100)[((v >> 16) & 0xFF)] + ^ (table + 0x000)[((v >> 24))]; } for (; size > 0; size--, p++) v = CRC_UPDATE_BYTE_2(v, *p); @@ -38,16 +38,16 @@ UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const U UInt32 d; v ^= *(const UInt32 *)p; v = - table[0x700 + ((v ) & 0xFF)] - ^ table[0x600 + ((v >> 8) & 0xFF)] - ^ table[0x500 + ((v >> 16) & 0xFF)] - ^ table[0x400 + ((v >> 24))]; + (table + 0x700)[((v ) & 0xFF)] + ^ (table + 0x600)[((v >> 8) & 0xFF)] + ^ (table + 0x500)[((v >> 16) & 0xFF)] + ^ (table + 0x400)[((v >> 24))]; d = *((const UInt32 *)p + 1); v ^= - table[0x300 + ((d ) & 0xFF)] - ^ table[0x200 + ((d >> 8) & 0xFF)] - ^ table[0x100 + ((d >> 16) & 0xFF)] - ^ table[0x000 + ((d >> 24))]; + (table + 0x300)[((d ) & 0xFF)] + ^ (table + 0x200)[((d >> 8) & 0xFF)] + ^ (table + 0x100)[((d >> 16) & 0xFF)] + ^ (table + 0x000)[((d >> 24))]; } for (; size > 0; size--, p++) v = CRC_UPDATE_BYTE_2(v, *p); @@ -74,10 +74,10 @@ UInt32 MY_FAST_CALL CrcUpdateT1_BeT4(UInt32 v, const void *data, size_t size, co { v ^= *(const UInt32 *)p; v = - table[0x000 + ((v ) & 0xFF)] - ^ table[0x100 + ((v >> 8) & 0xFF)] - ^ table[0x200 + ((v >> 16) & 0xFF)] - ^ table[0x300 + ((v >> 24))]; + (table + 0x000)[((v ) & 0xFF)] + ^ (table + 0x100)[((v >> 8) & 0xFF)] + ^ (table + 0x200)[((v >> 16) & 0xFF)] + ^ (table + 0x300)[((v >> 24))]; } for (; size > 0; size--, p++) v = CRC_UPDATE_BYTE_2_BE(v, *p); @@ -96,16 +96,16 @@ UInt32 MY_FAST_CALL CrcUpdateT1_BeT8(UInt32 v, const void *data, size_t size, co UInt32 d; v ^= *(const UInt32 *)p; v = - table[0x400 + ((v ) & 0xFF)] - ^ table[0x500 + ((v >> 8) & 0xFF)] - ^ table[0x600 + ((v >> 16) & 0xFF)] - ^ table[0x700 + ((v >> 24))]; + (table + 0x400)[((v ) & 0xFF)] + ^ (table + 0x500)[((v >> 8) & 0xFF)] + ^ (table + 0x600)[((v >> 16) & 0xFF)] + ^ (table + 0x700)[((v >> 24))]; d = *((const UInt32 *)p + 1); v ^= - table[0x000 + ((d ) & 0xFF)] - ^ table[0x100 + ((d >> 8) & 0xFF)] - ^ table[0x200 + ((d >> 16) & 0xFF)] - ^ table[0x300 + ((d >> 24))]; + (table + 0x000)[((d ) & 0xFF)] + ^ (table + 0x100)[((d >> 8) & 0xFF)] + ^ (table + 0x200)[((d >> 16) & 0xFF)] + ^ (table + 0x300)[((d >> 24))]; } for (; size > 0; size--, p++) v = CRC_UPDATE_BYTE_2_BE(v, *p); diff --git a/code/ryzom/client/src/seven_zip/7zDec.cpp b/code/ryzom/client/src/seven_zip/7zDec.cpp index cc9f58412..1ddde0bcb 100644 --- a/code/ryzom/client/src/seven_zip/7zDec.cpp +++ b/code/ryzom/client/src/seven_zip/7zDec.cpp @@ -1,5 +1,5 @@ /* 7zDec.c -- Decoding from 7z folder -2015-11-18 : Igor Pavlov : Public domain */ +2017-04-03 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -39,28 +39,28 @@ typedef struct { - IByteIn p; + IByteIn vt; const Byte *cur; const Byte *end; const Byte *begin; UInt64 processed; Bool extra; SRes res; - ILookInStream *inStream; + const ILookInStream *inStream; } CByteInToLook; -static Byte ReadByte(void *pp) +static Byte ReadByte(const IByteIn *pp) { - CByteInToLook *p = (CByteInToLook *)pp; + CByteInToLook *p = CONTAINER_FROM_VTBL(pp, CByteInToLook, vt); if (p->cur != p->end) return *p->cur++; if (p->res == SZ_OK) { size_t size = p->cur - p->begin; p->processed += size; - p->res = p->inStream->Skip(p->inStream, size); + p->res = ILookInStream_Skip(p->inStream, size); size = (1 << 25); - p->res = p->inStream->Look(p->inStream, (const void **)&p->begin, &size); + p->res = ILookInStream_Look(p->inStream, (const void **)&p->begin, &size); p->cur = p->begin; p->end = p->begin + size; if (size != 0) @@ -70,14 +70,14 @@ static Byte ReadByte(void *pp) return 0; } -static SRes SzDecodePpmd(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStream *inStream, - Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain) +static SRes SzDecodePpmd(const Byte *props, unsigned propsSize, UInt64 inSize, const ILookInStream *inStream, + Byte *outBuffer, SizeT outSize, ISzAllocPtr allocMain) { CPpmd7 ppmd; CByteInToLook s; SRes res = SZ_OK; - s.p.Read = ReadByte; + s.vt.Read = ReadByte; s.inStream = inStream; s.begin = s.end = s.cur = NULL; s.extra = False; @@ -103,7 +103,7 @@ static SRes SzDecodePpmd(const Byte *props, unsigned propsSize, UInt64 inSize, I { CPpmd7z_RangeDec rc; Ppmd7z_RangeDec_CreateVTable(&rc); - rc.Stream = &s.p; + rc.Stream = &s.vt; if (!Ppmd7z_RangeDec_Init(&rc)) res = SZ_ERROR_DATA; else if (s.extra) @@ -113,7 +113,7 @@ static SRes SzDecodePpmd(const Byte *props, unsigned propsSize, UInt64 inSize, I SizeT i; for (i = 0; i < outSize; i++) { - int sym = Ppmd7_DecodeSymbol(&ppmd, &rc.p); + int sym = Ppmd7_DecodeSymbol(&ppmd, &rc.vt); if (s.extra || sym < 0) break; outBuffer[i] = (Byte)sym; @@ -132,7 +132,7 @@ static SRes SzDecodePpmd(const Byte *props, unsigned propsSize, UInt64 inSize, I static SRes SzDecodeLzma(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStream *inStream, - Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain) + Byte *outBuffer, SizeT outSize, ISzAllocPtr allocMain) { CLzmaDec state; SRes res = SZ_OK; @@ -149,14 +149,14 @@ static SRes SzDecodeLzma(const Byte *props, unsigned propsSize, UInt64 inSize, I size_t lookahead = (1 << 18); if (lookahead > inSize) lookahead = (size_t)inSize; - res = inStream->Look(inStream, &inBuf, &lookahead); + res = ILookInStream_Look(inStream, &inBuf, &lookahead); if (res != SZ_OK) break; { SizeT inProcessed = (SizeT)lookahead, dicPos = state.dicPos; ELzmaStatus status; - res = LzmaDec_DecodeToDic(&state, outSize, (Byte*)inBuf, &inProcessed, LZMA_FINISH_END, &status); + res = LzmaDec_DecodeToDic(&state, outSize, (const Byte*)inBuf, &inProcessed, LZMA_FINISH_END, &status); lookahead -= inProcessed; inSize -= inProcessed; if (res != SZ_OK) @@ -178,7 +178,7 @@ static SRes SzDecodeLzma(const Byte *props, unsigned propsSize, UInt64 inSize, I break; } - res = inStream->Skip((void *)inStream, inProcessed); + res = ILookInStream_Skip(inStream, inProcessed); if (res != SZ_OK) break; } @@ -192,7 +192,7 @@ static SRes SzDecodeLzma(const Byte *props, unsigned propsSize, UInt64 inSize, I #ifndef _7Z_NO_METHOD_LZMA2 static SRes SzDecodeLzma2(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStream *inStream, - Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain) + Byte *outBuffer, SizeT outSize, ISzAllocPtr allocMain) { CLzma2Dec state; SRes res = SZ_OK; @@ -211,14 +211,14 @@ static SRes SzDecodeLzma2(const Byte *props, unsigned propsSize, UInt64 inSize, size_t lookahead = (1 << 18); if (lookahead > inSize) lookahead = (size_t)inSize; - res = inStream->Look(inStream, &inBuf, &lookahead); + res = ILookInStream_Look(inStream, &inBuf, &lookahead); if (res != SZ_OK) break; { SizeT inProcessed = (SizeT)lookahead, dicPos = state.decoder.dicPos; ELzmaStatus status; - res = Lzma2Dec_DecodeToDic(&state, outSize, (Byte*)inBuf, &inProcessed, LZMA_FINISH_END, &status); + res = Lzma2Dec_DecodeToDic(&state, outSize, (const Byte*)inBuf, &inProcessed, LZMA_FINISH_END, &status); lookahead -= inProcessed; inSize -= inProcessed; if (res != SZ_OK) @@ -237,7 +237,7 @@ static SRes SzDecodeLzma2(const Byte *props, unsigned propsSize, UInt64 inSize, break; } - res = inStream->Skip((void *)inStream, inProcessed); + res = ILookInStream_Skip(inStream, inProcessed); if (res != SZ_OK) break; } @@ -258,13 +258,13 @@ static SRes SzDecodeCopy(UInt64 inSize, ILookInStream *inStream, Byte *outBuffer size_t curSize = (1 << 18); if (curSize > inSize) curSize = (size_t)inSize; - RINOK(inStream->Look(inStream, &inBuf, &curSize)); + RINOK(ILookInStream_Look(inStream, &inBuf, &curSize)); if (curSize == 0) return SZ_ERROR_INPUT_EOF; memcpy(outBuffer, inBuf, curSize); outBuffer += curSize; inSize -= curSize; - RINOK(inStream->Skip((void *)inStream, curSize)); + RINOK(ILookInStream_Skip(inStream, curSize)); } return SZ_OK; } @@ -372,7 +372,7 @@ static SRes SzFolder_Decode2(const CSzFolder *folder, const UInt64 *unpackSizes, const UInt64 *packPositions, ILookInStream *inStream, UInt64 startPos, - Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain, + Byte *outBuffer, SizeT outSize, ISzAllocPtr allocMain, Byte *tempBuf[]) { UInt32 ci; @@ -404,7 +404,7 @@ static SRes SzFolder_Decode2(const CSzFolder *folder, outSizeCur = (SizeT)unpackSize; if (outSizeCur != unpackSize) return SZ_ERROR_MEM; - temp = (Byte *)IAlloc_Alloc(allocMain, outSizeCur); + temp = (Byte *)ISzAlloc_Alloc(allocMain, outSizeCur); if (!temp && outSizeCur != 0) return SZ_ERROR_MEM; outBufCur = tempBuf[1 - ci] = temp; @@ -421,7 +421,7 @@ static SRes SzFolder_Decode2(const CSzFolder *folder, return SZ_ERROR_UNSUPPORTED; } offset = packPositions[si]; - inSize = packPositions[si + 1] - offset; + inSize = packPositions[(size_t)si + 1] - offset; RINOK(LookInStream_SeekTo(inStream, startPos + offset)); if (coder->MethodID == k_Copy) @@ -460,7 +460,7 @@ static SRes SzFolder_Decode2(const CSzFolder *folder, tempSizes[2] = (SizeT)s3Size; if (tempSizes[2] != s3Size) return SZ_ERROR_MEM; - tempBuf[2] = (Byte *)IAlloc_Alloc(allocMain, tempSizes[2]); + tempBuf[2] = (Byte *)ISzAlloc_Alloc(allocMain, tempSizes[2]); if (!tempBuf[2] && tempSizes[2] != 0) return SZ_ERROR_MEM; @@ -549,7 +549,7 @@ static SRes SzFolder_Decode2(const CSzFolder *folder, SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex, ILookInStream *inStream, UInt64 startPos, Byte *outBuffer, size_t outSize, - ISzAlloc *allocMain) + ISzAllocPtr allocMain) { SRes res; CSzFolder folder; @@ -557,7 +557,7 @@ SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex, const Byte *data = p->CodersData + p->FoCodersOffsets[folderIndex]; sd.Data = data; - sd.Size = p->FoCodersOffsets[folderIndex + 1] - p->FoCodersOffsets[folderIndex]; + sd.Size = p->FoCodersOffsets[(size_t)folderIndex + 1] - p->FoCodersOffsets[folderIndex]; res = SzGetNextFolderItem(&folder, &sd); @@ -579,7 +579,7 @@ SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex, outBuffer, (SizeT)outSize, allocMain, tempBuf); for (i = 0; i < 3; i++) - IAlloc_Free(allocMain, tempBuf[i]); + ISzAlloc_Free(allocMain, tempBuf[i]); if (res == SZ_OK) if (SzBitWithVals_Check(&p->FolderCRCs, folderIndex)) diff --git a/code/ryzom/client/src/seven_zip/7zFile.cpp b/code/ryzom/client/src/seven_zip/7zFile.cpp index 041e5b154..8992fb1c5 100644 --- a/code/ryzom/client/src/seven_zip/7zFile.cpp +++ b/code/ryzom/client/src/seven_zip/7zFile.cpp @@ -1,5 +1,5 @@ /* 7zFile.c -- File IO -2009-11-24 : Igor Pavlov : Public domain */ +2017-04-03 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -238,49 +238,49 @@ WRes File_GetLength(CSzFile *p, UInt64 *length) /* ---------- FileSeqInStream ---------- */ -static SRes FileSeqInStream_Read(void *pp, void *buf, size_t *size) +static SRes FileSeqInStream_Read(const ISeqInStream *pp, void *buf, size_t *size) { - CFileSeqInStream *p = (CFileSeqInStream *)pp; + CFileSeqInStream *p = CONTAINER_FROM_VTBL(pp, CFileSeqInStream, vt); return File_Read(&p->file, buf, size) == 0 ? SZ_OK : SZ_ERROR_READ; } void FileSeqInStream_CreateVTable(CFileSeqInStream *p) { - p->s.Read = FileSeqInStream_Read; + p->vt.Read = FileSeqInStream_Read; } /* ---------- FileInStream ---------- */ -static SRes FileInStream_Read(void *pp, void *buf, size_t *size) +static SRes FileInStream_Read(const ISeekInStream *pp, void *buf, size_t *size) { - CFileInStream *p = (CFileInStream *)pp; + CFileInStream *p = CONTAINER_FROM_VTBL(pp, CFileInStream, vt); return (File_Read(&p->file, buf, size) == 0) ? SZ_OK : SZ_ERROR_READ; } -static SRes FileInStream_Seek(void *pp, Int64 *pos, ESzSeek origin) +static SRes FileInStream_Seek(const ISeekInStream *pp, Int64 *pos, ESzSeek origin) { - CFileInStream *p = (CFileInStream *)pp; + CFileInStream *p = CONTAINER_FROM_VTBL(pp, CFileInStream, vt); return File_Seek(&p->file, pos, origin); } void FileInStream_CreateVTable(CFileInStream *p) { - p->s.Read = FileInStream_Read; - p->s.Seek = FileInStream_Seek; + p->vt.Read = FileInStream_Read; + p->vt.Seek = FileInStream_Seek; } /* ---------- FileOutStream ---------- */ -static size_t FileOutStream_Write(void *pp, const void *data, size_t size) +static size_t FileOutStream_Write(const ISeqOutStream *pp, const void *data, size_t size) { - CFileOutStream *p = (CFileOutStream *)pp; + CFileOutStream *p = CONTAINER_FROM_VTBL(pp, CFileOutStream, vt); File_Write(&p->file, data, &size); return size; } void FileOutStream_CreateVTable(CFileOutStream *p) { - p->s.Write = FileOutStream_Write; + p->vt.Write = FileOutStream_Write; } diff --git a/code/ryzom/client/src/seven_zip/7zFile.h b/code/ryzom/client/src/seven_zip/7zFile.h index 658987ed5..0e7925382 100644 --- a/code/ryzom/client/src/seven_zip/7zFile.h +++ b/code/ryzom/client/src/seven_zip/7zFile.h @@ -1,5 +1,5 @@ /* 7zFile.h -- File IO -2013-01-18 : Igor Pavlov : Public domain */ +2017-04-03 : Igor Pavlov : Public domain */ #ifndef __7Z_FILE_H #define __7Z_FILE_H @@ -54,7 +54,7 @@ WRes File_GetLength(CSzFile *p, UInt64 *length); typedef struct { - ISeqInStream s; + ISeqInStream vt; CSzFile file; } CFileSeqInStream; @@ -63,7 +63,7 @@ void FileSeqInStream_CreateVTable(CFileSeqInStream *p); typedef struct { - ISeekInStream s; + ISeekInStream vt; CSzFile file; } CFileInStream; @@ -72,7 +72,7 @@ void FileInStream_CreateVTable(CFileInStream *p); typedef struct { - ISeqOutStream s; + ISeqOutStream vt; CSzFile file; } CFileOutStream; diff --git a/code/ryzom/client/src/seven_zip/7zMain.cpp b/code/ryzom/client/src/seven_zip/7zMain.cpp index 63b5a2bd7..0ec9a8ada 100644 --- a/code/ryzom/client/src/seven_zip/7zMain.cpp +++ b/code/ryzom/client/src/seven_zip/7zMain.cpp @@ -1,11 +1,13 @@ /* 7zMain.c - Test application for 7z Decoder -2016-05-16 : Igor Pavlov : Public domain */ +2018-04-19 : Igor Pavlov : Public domain */ #include "Precomp.h" #include #include +#include "CpuArch.h" + #include "7z.h" #include "7zAlloc.h" #include "7zBuf.h" @@ -23,7 +25,17 @@ #endif #endif -static ISzAlloc g_Alloc = { SzAlloc, SzFree }; + +#define kInputBufSize ((size_t)1 << 18) + +static const ISzAlloc g_Alloc = { SzAlloc, SzFree }; + + +static void Print(const char *s) +{ + fputs(s, stdout); +} + static int Buf_EnsureSize(CBuf *dest, size_t size) { @@ -238,12 +250,12 @@ static SRes PrintString(const UInt16 *s) #endif ); if (res == SZ_OK) - fputs((const char *)buf.data, stdout); + Print((const char *)buf.data); Buf_Free(&buf, &g_Alloc); return res; } -static void UInt64ToStr(UInt64 value, char *s) +static void UInt64ToStr(UInt64 value, char *s, int numDigits) { char temp[32]; int pos = 0; @@ -253,6 +265,10 @@ static void UInt64ToStr(UInt64 value, char *s) value /= 10; } while (value != 0); + + for (numDigits -= pos; numDigits > 0; numDigits--) + *s++ = ' '; + do *s++ = temp[--pos]; while (pos); @@ -266,8 +282,10 @@ static char *UIntToStr(char *s, unsigned value, int numDigits) do temp[pos++] = (char)('0' + (value % 10)); while (value /= 10); + for (numDigits -= pos; numDigits > 0; numDigits--) *s++ = '0'; + do *s++ = temp[--pos]; while (pos); @@ -323,9 +341,16 @@ static void ConvertFileTimeToString(const CNtfsFileTime *nt, char *s) UIntToStr_2(s, sec); s[2] = 0; } -void PrintError(const char *sz) +static void PrintLF() { - printf("\nERROR: %s\n", sz); + Print("\n"); +} + +static void PrintError(char *s) +{ + Print("\nERROR: "); + Print(s); + PrintLF(); } static void GetAttribString(UInt32 wa, Bool isDir, char *s) @@ -343,25 +368,27 @@ static void GetAttribString(UInt32 wa, Bool isDir, char *s) #endif } + // #define NUM_PARENTS_MAX 128 int MY_CDECL main(int numargs, char *args[]) { - CFileInStream archiveStream; - CLookToRead lookStream; - CSzArEx db; - SRes res; ISzAlloc allocImp; ISzAlloc allocTempImp; + + CFileInStream archiveStream; + CLookToRead2 lookStream; + CSzArEx db; + SRes res; UInt16 *temp = NULL; size_t tempSize = 0; // UInt32 parents[NUM_PARENTS_MAX]; - printf("\n7z ANSI-C Decoder " MY_VERSION_COPYRIGHT_DATE "\n\n"); + Print("\n7z Decoder " MY_VERSION_CPU " : " MY_COPYRIGHT_DATE "\n\n"); if (numargs == 1) { - printf( + Print( "Usage: 7zDec \n\n" "\n" " e: Extract files from archive (without using directory names)\n" @@ -370,7 +397,7 @@ int MY_CDECL main(int numargs, char *args[]) " x: eXtract files with full paths\n"); return 0; } - + if (numargs < 3) { PrintError("incorrect command"); @@ -381,11 +408,9 @@ int MY_CDECL main(int numargs, char *args[]) g_FileCodePage = AreFileApisANSI() ? CP_ACP : CP_OEMCP; #endif - allocImp.Alloc = SzAlloc; - allocImp.Free = SzFree; - allocTempImp.Alloc = SzAllocTemp; - allocTempImp.Free = SzFreeTemp; + allocImp = g_Alloc; + allocTempImp = g_Alloc; #ifdef UNDER_CE if (InFile_OpenW(&archiveStream.file, L"\test.7z")) @@ -398,16 +423,31 @@ int MY_CDECL main(int numargs, char *args[]) } FileInStream_CreateVTable(&archiveStream); - LookToRead_CreateVTable(&lookStream, False); - - lookStream.realStream = &archiveStream.s; - LookToRead_Init(&lookStream); + LookToRead2_CreateVTable(&lookStream, False); + lookStream.buf = NULL; + res = SZ_OK; + + { + lookStream.buf = (Byte*)ISzAlloc_Alloc(&allocImp, kInputBufSize); + if (!lookStream.buf) + res = SZ_ERROR_MEM; + else + { + lookStream.bufSize = kInputBufSize; + lookStream.realStream = &archiveStream.vt; + LookToRead2_Init(&lookStream); + } + } + CrcGenerateTable(); - + SzArEx_Init(&db); - - res = SzArEx_Open(&db, &lookStream.s, &allocImp, &allocTempImp); + + if (res == SZ_OK) + { + res = SzArEx_Open(&db, &lookStream.vt, &allocImp, &allocTempImp); + } if (res == SZ_OK) { @@ -477,7 +517,7 @@ int MY_CDECL main(int numargs, char *args[]) GetAttribString(SzBitWithVals_Check(&db.Attribs, i) ? db.Attribs.Vals[i] : 0, isDir, attr); fileSize = SzArEx_GetFileSize(&db, i); - UInt64ToStr(fileSize, s); + UInt64ToStr(fileSize, s, 10); if (SzBitWithVals_Check(&db.MTime, i)) ConvertFileTimeToString(&db.MTime.Vals[i], t); @@ -489,29 +529,33 @@ int MY_CDECL main(int numargs, char *args[]) t[j] = '\0'; } - printf("%s %s %10s ", t, attr, s); + Print(t); + Print(" "); + Print(attr); + Print(" "); + Print(s); + Print(" "); res = PrintString(temp); if (res != SZ_OK) break; if (isDir) - printf("/"); - printf("\n"); + Print("/"); + PrintLF(); continue; } - fputs(testCommand ? + Print(testCommand ? "Testing ": - "Extracting ", - stdout); + "Extracting "); res = PrintString(temp); if (res != SZ_OK) break; if (isDir) - printf("/"); + Print("/"); else { - res = SzArEx_Extract(&db, &lookStream.s, i, + res = SzArEx_Extract(&db, &lookStream.vt, i, &blockIndex, &outBuffer, &outBufferSize, &offset, &outSizeProcessed, &allocImp, &allocTempImp); @@ -543,7 +587,7 @@ int MY_CDECL main(int numargs, char *args[]) if (isDir) { MyCreateDir(destPath); - printf("\n"); + PrintLF(); continue; } else if (OutFile_OpenUtf16(&outFile, destPath)) @@ -561,6 +605,31 @@ int MY_CDECL main(int numargs, char *args[]) res = SZ_ERROR_FAIL; break; } + + #ifdef USE_WINDOWS_FILE + { + FILETIME mtime, ctime; + FILETIME *mtimePtr = NULL; + FILETIME *ctimePtr = NULL; + + if (SzBitWithVals_Check(&db.MTime, i)) + { + const CNtfsFileTime *t = &db.MTime.Vals[i]; + mtime.dwLowDateTime = (DWORD)(t->Low); + mtime.dwHighDateTime = (DWORD)(t->High); + mtimePtr = &mtime; + } + if (SzBitWithVals_Check(&db.CTime, i)) + { + const CNtfsFileTime *t = &db.CTime.Vals[i]; + ctime.dwLowDateTime = (DWORD)(t->Low); + ctime.dwHighDateTime = (DWORD)(t->High); + ctimePtr = &ctime; + } + if (mtimePtr || ctimePtr) + SetFileTime(outFile.handle, ctimePtr, NULL, mtimePtr); + } + #endif if (File_Close(&outFile)) { @@ -571,23 +640,31 @@ int MY_CDECL main(int numargs, char *args[]) #ifdef USE_WINDOWS_FILE if (SzBitWithVals_Check(&db.Attribs, i)) - SetFileAttributesW((LPCWSTR)destPath, db.Attribs.Vals[i]); + { + UInt32 attrib = db.Attribs.Vals[i]; + /* p7zip stores posix attributes in high 16 bits and adds 0x8000 as marker. + We remove posix bits, if we detect posix mode field */ + if ((attrib & 0xF0000000) != 0) + attrib &= 0x7FFF; + SetFileAttributesW((LPCWSTR)destPath, attrib); + } #endif } - printf("\n"); + PrintLF(); } - IAlloc_Free(&allocImp, outBuffer); + ISzAlloc_Free(&allocImp, outBuffer); } } - SzArEx_Free(&db, &allocImp); SzFree(NULL, temp); + SzArEx_Free(&db, &allocImp); + ISzAlloc_Free(&allocImp, lookStream.buf); File_Close(&archiveStream.file); if (res == SZ_OK) { - printf("\nEverything is Ok\n"); + Print("\nEverything is Ok\n"); return 0; } @@ -598,7 +675,11 @@ int MY_CDECL main(int numargs, char *args[]) else if (res == SZ_ERROR_CRC) PrintError("CRC error"); else - printf("\nERROR #%d\n", res); + { + char s[32]; + UInt64ToStr(res, s, 0); + PrintError(s); + } return 1; } diff --git a/code/ryzom/client/src/seven_zip/7zStream.cpp b/code/ryzom/client/src/seven_zip/7zStream.cpp index 88f9c42b1..6b5aa1621 100644 --- a/code/ryzom/client/src/seven_zip/7zStream.cpp +++ b/code/ryzom/client/src/seven_zip/7zStream.cpp @@ -1,5 +1,5 @@ /* 7zStream.c -- 7z Stream functions -2013-11-12 : Igor Pavlov : Public domain */ +2017-04-03 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -7,12 +7,12 @@ #include "7zTypes.h" -SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType) +SRes SeqInStream_Read2(const ISeqInStream *stream, void *buf, size_t size, SRes errorType) { while (size != 0) { size_t processed = size; - RINOK(stream->Read(stream, buf, &processed)); + RINOK(ISeqInStream_Read(stream, buf, &processed)); if (processed == 0) return errorType; buf = (void *)((Byte *)buf + processed); @@ -21,40 +21,42 @@ SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorT return SZ_OK; } -SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size) +SRes SeqInStream_Read(const ISeqInStream *stream, void *buf, size_t size) { return SeqInStream_Read2(stream, buf, size, SZ_ERROR_INPUT_EOF); } -SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf) +SRes SeqInStream_ReadByte(const ISeqInStream *stream, Byte *buf) { size_t processed = 1; - RINOK(stream->Read(stream, buf, &processed)); + RINOK(ISeqInStream_Read(stream, buf, &processed)); return (processed == 1) ? SZ_OK : SZ_ERROR_INPUT_EOF; } -SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset) + + +SRes LookInStream_SeekTo(const ILookInStream *stream, UInt64 offset) { Int64 t = offset; - return stream->Seek(stream, &t, SZ_SEEK_SET); + return ILookInStream_Seek(stream, &t, SZ_SEEK_SET); } -SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size) +SRes LookInStream_LookRead(const ILookInStream *stream, void *buf, size_t *size) { const void *lookBuf; if (*size == 0) return SZ_OK; - RINOK(stream->Look(stream, &lookBuf, size)); + RINOK(ILookInStream_Look(stream, &lookBuf, size)); memcpy(buf, lookBuf, *size); - return stream->Skip(stream, *size); + return ILookInStream_Skip(stream, *size); } -SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType) +SRes LookInStream_Read2(const ILookInStream *stream, void *buf, size_t size, SRes errorType) { while (size != 0) { size_t processed = size; - RINOK(stream->Read(stream, buf, &processed)); + RINOK(ILookInStream_Read(stream, buf, &processed)); if (processed == 0) return errorType; buf = (void *)((Byte *)buf + processed); @@ -63,61 +65,67 @@ SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes erro return SZ_OK; } -SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size) +SRes LookInStream_Read(const ILookInStream *stream, void *buf, size_t size) { return LookInStream_Read2(stream, buf, size, SZ_ERROR_INPUT_EOF); } -static SRes LookToRead_Look_Lookahead(void *pp, const void **buf, size_t *size) + + +#define GET_LookToRead2 CLookToRead2 *p = CONTAINER_FROM_VTBL(pp, CLookToRead2, vt); + +static SRes LookToRead2_Look_Lookahead(const ILookInStream *pp, const void **buf, size_t *size) { SRes res = SZ_OK; - CLookToRead *p = (CLookToRead *)pp; + GET_LookToRead2 size_t size2 = p->size - p->pos; - if (size2 == 0 && *size > 0) + if (size2 == 0 && *size != 0) { p->pos = 0; - size2 = LookToRead_BUF_SIZE; - res = p->realStream->Read(p->realStream, p->buf, &size2); + p->size = 0; + size2 = p->bufSize; + res = ISeekInStream_Read(p->realStream, p->buf, &size2); p->size = size2; } - if (size2 < *size) + if (*size > size2) *size = size2; *buf = p->buf + p->pos; return res; } -static SRes LookToRead_Look_Exact(void *pp, const void **buf, size_t *size) +static SRes LookToRead2_Look_Exact(const ILookInStream *pp, const void **buf, size_t *size) { SRes res = SZ_OK; - CLookToRead *p = (CLookToRead *)pp; + GET_LookToRead2 size_t size2 = p->size - p->pos; - if (size2 == 0 && *size > 0) + if (size2 == 0 && *size != 0) { p->pos = 0; - if (*size > LookToRead_BUF_SIZE) - *size = LookToRead_BUF_SIZE; - res = p->realStream->Read(p->realStream, p->buf, size); + p->size = 0; + if (*size > p->bufSize) + *size = p->bufSize; + res = ISeekInStream_Read(p->realStream, p->buf, size); size2 = p->size = *size; } - if (size2 < *size) + if (*size > size2) *size = size2; *buf = p->buf + p->pos; return res; } -static SRes LookToRead_Skip(void *pp, size_t offset) +static SRes LookToRead2_Skip(const ILookInStream *pp, size_t offset) { - CLookToRead *p = (CLookToRead *)pp; + GET_LookToRead2 p->pos += offset; return SZ_OK; } -static SRes LookToRead_Read(void *pp, void *buf, size_t *size) +static SRes LookToRead2_Read(const ILookInStream *pp, void *buf, size_t *size) { - CLookToRead *p = (CLookToRead *)pp; + GET_LookToRead2 size_t rem = p->size - p->pos; if (rem == 0) - return p->realStream->Read(p->realStream, buf, size); + return ISeekInStream_Read(p->realStream, buf, size); if (rem > *size) rem = *size; memcpy(buf, p->buf + p->pos, rem); @@ -126,46 +134,43 @@ static SRes LookToRead_Read(void *pp, void *buf, size_t *size) return SZ_OK; } -static SRes LookToRead_Seek(void *pp, Int64 *pos, ESzSeek origin) +static SRes LookToRead2_Seek(const ILookInStream *pp, Int64 *pos, ESzSeek origin) { - CLookToRead *p = (CLookToRead *)pp; + GET_LookToRead2 p->pos = p->size = 0; - return p->realStream->Seek(p->realStream, pos, origin); + return ISeekInStream_Seek(p->realStream, pos, origin); } -void LookToRead_CreateVTable(CLookToRead *p, int lookahead) +void LookToRead2_CreateVTable(CLookToRead2 *p, int lookahead) { - p->s.Look = lookahead ? - LookToRead_Look_Lookahead : - LookToRead_Look_Exact; - p->s.Skip = LookToRead_Skip; - p->s.Read = LookToRead_Read; - p->s.Seek = LookToRead_Seek; + p->vt.Look = lookahead ? + LookToRead2_Look_Lookahead : + LookToRead2_Look_Exact; + p->vt.Skip = LookToRead2_Skip; + p->vt.Read = LookToRead2_Read; + p->vt.Seek = LookToRead2_Seek; } -void LookToRead_Init(CLookToRead *p) -{ - p->pos = p->size = 0; -} -static SRes SecToLook_Read(void *pp, void *buf, size_t *size) + +static SRes SecToLook_Read(const ISeqInStream *pp, void *buf, size_t *size) { - CSecToLook *p = (CSecToLook *)pp; + CSecToLook *p = CONTAINER_FROM_VTBL(pp, CSecToLook, vt); return LookInStream_LookRead(p->realStream, buf, size); } void SecToLook_CreateVTable(CSecToLook *p) { - p->s.Read = SecToLook_Read; + p->vt.Read = SecToLook_Read; } -static SRes SecToRead_Read(void *pp, void *buf, size_t *size) +static SRes SecToRead_Read(const ISeqInStream *pp, void *buf, size_t *size) { - CSecToRead *p = (CSecToRead *)pp; - return p->realStream->Read(p->realStream, buf, size); + CSecToRead *p = CONTAINER_FROM_VTBL(pp, CSecToRead, vt); + return ILookInStream_Read(p->realStream, buf, size); } void SecToRead_CreateVTable(CSecToRead *p) { - p->s.Read = SecToRead_Read; + p->vt.Read = SecToRead_Read; } diff --git a/code/ryzom/client/src/seven_zip/7zTypes.h b/code/ryzom/client/src/seven_zip/7zTypes.h index 778413ef4..29244b23e 100644 --- a/code/ryzom/client/src/seven_zip/7zTypes.h +++ b/code/ryzom/client/src/seven_zip/7zTypes.h @@ -1,5 +1,5 @@ /* 7zTypes.h -- Basic types -2013-11-12 : Igor Pavlov : Public domain */ +2017-07-17 : Igor Pavlov : Public domain */ #ifndef __7Z_TYPES_H #define __7Z_TYPES_H @@ -42,13 +42,23 @@ EXTERN_C_BEGIN typedef int SRes; + #ifdef _WIN32 + /* typedef DWORD WRes; */ typedef unsigned WRes; +#define MY_SRes_HRESULT_FROM_WRes(x) HRESULT_FROM_WIN32(x) + #else + typedef int WRes; +#define MY__FACILITY_WIN32 7 +#define MY__FACILITY__WRes MY__FACILITY_WIN32 +#define MY_SRes_HRESULT_FROM_WRes(x) ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (MY__FACILITY__WRes << 16) | 0x80000000))) + #endif + #ifndef RINOK #define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } #endif @@ -112,48 +122,72 @@ typedef int Bool; #define MY_NO_INLINE #endif +#define MY_FORCE_INLINE __forceinline + #define MY_CDECL __cdecl #define MY_FAST_CALL __fastcall #else #define MY_NO_INLINE +#define MY_FORCE_INLINE #define MY_CDECL #define MY_FAST_CALL +/* inline keyword : for C++ / C99 */ + +/* GCC, clang: */ +/* +#if defined (__GNUC__) && (__GNUC__ >= 4) +#define MY_FORCE_INLINE __attribute__((always_inline)) +#define MY_NO_INLINE __attribute__((noinline)) +#endif +*/ + #endif /* The following interfaces use first parameter as pointer to structure */ -typedef struct +typedef struct IByteIn IByteIn; +struct IByteIn { - Byte (*Read)(void *p); /* reads one byte, returns 0 in case of EOF or error */ -} IByteIn; + Byte (*Read)(const IByteIn *p); /* reads one byte, returns 0 in case of EOF or error */ +}; +#define IByteIn_Read(p) (p)->Read(p) -typedef struct -{ - void (*Write)(void *p, Byte b); -} IByteOut; -typedef struct +typedef struct IByteOut IByteOut; +struct IByteOut { - SRes (*Read)(void *p, void *buf, size_t *size); + void (*Write)(const IByteOut *p, Byte b); +}; +#define IByteOut_Write(p, b) (p)->Write(p, b) + + +typedef struct ISeqInStream ISeqInStream; +struct ISeqInStream +{ + SRes (*Read)(const ISeqInStream *p, void *buf, size_t *size); /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. (output(*size) < input(*size)) is allowed */ -} ISeqInStream; +}; +#define ISeqInStream_Read(p, buf, size) (p)->Read(p, buf, size) /* it can return SZ_ERROR_INPUT_EOF */ -SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size); -SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType); -SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf); +SRes SeqInStream_Read(const ISeqInStream *stream, void *buf, size_t size); +SRes SeqInStream_Read2(const ISeqInStream *stream, void *buf, size_t size, SRes errorType); +SRes SeqInStream_ReadByte(const ISeqInStream *stream, Byte *buf); -typedef struct + +typedef struct ISeqOutStream ISeqOutStream; +struct ISeqOutStream { - size_t (*Write)(void *p, const void *buf, size_t size); + size_t (*Write)(const ISeqOutStream *p, const void *buf, size_t size); /* Returns: result - the number of actually written bytes. (result < size) means error */ -} ISeqOutStream; +}; +#define ISeqOutStream_Write(p, buf, size) (p)->Write(p, buf, size) typedef enum { @@ -162,78 +196,162 @@ typedef enum SZ_SEEK_END = 2 } ESzSeek; -typedef struct -{ - SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ - SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); -} ISeekInStream; -typedef struct +typedef struct ISeekInStream ISeekInStream; +struct ISeekInStream { - SRes (*Look)(void *p, const void **buf, size_t *size); + SRes (*Read)(const ISeekInStream *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ + SRes (*Seek)(const ISeekInStream *p, Int64 *pos, ESzSeek origin); +}; +#define ISeekInStream_Read(p, buf, size) (p)->Read(p, buf, size) +#define ISeekInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin) + + +typedef struct ILookInStream ILookInStream; +struct ILookInStream +{ + SRes (*Look)(const ILookInStream *p, const void **buf, size_t *size); /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. (output(*size) > input(*size)) is not allowed (output(*size) < input(*size)) is allowed */ - SRes (*Skip)(void *p, size_t offset); + SRes (*Skip)(const ILookInStream *p, size_t offset); /* offset must be <= output(*size) of Look */ - SRes (*Read)(void *p, void *buf, size_t *size); + SRes (*Read)(const ILookInStream *p, void *buf, size_t *size); /* reads directly (without buffer). It's same as ISeqInStream::Read */ - SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); -} ILookInStream; + SRes (*Seek)(const ILookInStream *p, Int64 *pos, ESzSeek origin); +}; -SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size); -SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset); +#define ILookInStream_Look(p, buf, size) (p)->Look(p, buf, size) +#define ILookInStream_Skip(p, offset) (p)->Skip(p, offset) +#define ILookInStream_Read(p, buf, size) (p)->Read(p, buf, size) +#define ILookInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin) + + +SRes LookInStream_LookRead(const ILookInStream *stream, void *buf, size_t *size); +SRes LookInStream_SeekTo(const ILookInStream *stream, UInt64 offset); /* reads via ILookInStream::Read */ -SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType); -SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size); +SRes LookInStream_Read2(const ILookInStream *stream, void *buf, size_t size, SRes errorType); +SRes LookInStream_Read(const ILookInStream *stream, void *buf, size_t size); + -#define LookToRead_BUF_SIZE (1 << 14) typedef struct { - ILookInStream s; - ISeekInStream *realStream; + ILookInStream vt; + const ISeekInStream *realStream; + size_t pos; - size_t size; - Byte buf[LookToRead_BUF_SIZE]; -} CLookToRead; + size_t size; /* it's data size */ + + /* the following variables must be set outside */ + Byte *buf; + size_t bufSize; +} CLookToRead2; + +void LookToRead2_CreateVTable(CLookToRead2 *p, int lookahead); + +#define LookToRead2_Init(p) { (p)->pos = (p)->size = 0; } -void LookToRead_CreateVTable(CLookToRead *p, int lookahead); -void LookToRead_Init(CLookToRead *p); typedef struct { - ISeqInStream s; - ILookInStream *realStream; + ISeqInStream vt; + const ILookInStream *realStream; } CSecToLook; void SecToLook_CreateVTable(CSecToLook *p); + + typedef struct { - ISeqInStream s; - ILookInStream *realStream; + ISeqInStream vt; + const ILookInStream *realStream; } CSecToRead; void SecToRead_CreateVTable(CSecToRead *p); -typedef struct + +typedef struct ICompressProgress ICompressProgress; + +struct ICompressProgress { - SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize); + SRes (*Progress)(const ICompressProgress *p, UInt64 inSize, UInt64 outSize); /* Returns: result. (result != SZ_OK) means break. Value (UInt64)(Int64)-1 for size means unknown value. */ -} ICompressProgress; +}; +#define ICompressProgress_Progress(p, inSize, outSize) (p)->Progress(p, inSize, outSize) -typedef struct + + +typedef struct ISzAlloc ISzAlloc; +typedef const ISzAlloc * ISzAllocPtr; + +struct ISzAlloc { - void *(*Alloc)(void *p, size_t size); - void (*Free)(void *p, void *address); /* address can be 0 */ -} ISzAlloc; + void *(*Alloc)(ISzAllocPtr p, size_t size); + void (*Free)(ISzAllocPtr p, void *address); /* address can be 0 */ +}; + +#define ISzAlloc_Alloc(p, size) (p)->Alloc(p, size) +#define ISzAlloc_Free(p, a) (p)->Free(p, a) + +/* deprecated */ +#define IAlloc_Alloc(p, size) ISzAlloc_Alloc(p, size) +#define IAlloc_Free(p, a) ISzAlloc_Free(p, a) + + + + + +#ifndef MY_offsetof + #ifdef offsetof + #define MY_offsetof(type, m) offsetof(type, m) + /* + #define MY_offsetof(type, m) FIELD_OFFSET(type, m) + */ + #else + #define MY_offsetof(type, m) ((size_t)&(((type *)0)->m)) + #endif +#endif + + + +#ifndef MY_container_of + +/* +#define MY_container_of(ptr, type, m) container_of(ptr, type, m) +#define MY_container_of(ptr, type, m) CONTAINING_RECORD(ptr, type, m) +#define MY_container_of(ptr, type, m) ((type *)((char *)(ptr) - offsetof(type, m))) +#define MY_container_of(ptr, type, m) (&((type *)0)->m == (ptr), ((type *)(((char *)(ptr)) - MY_offsetof(type, m)))) +*/ + +/* + GCC shows warning: "perhaps the 'offsetof' macro was used incorrectly" + GCC 3.4.4 : classes with constructor + GCC 4.8.1 : classes with non-public variable members" +*/ + +#define MY_container_of(ptr, type, m) ((type *)((char *)(1 ? (ptr) : &((type *)0)->m) - MY_offsetof(type, m))) + + +#endif + +#define CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) ((type *)(ptr)) + +/* +#define CONTAINER_FROM_VTBL(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) +*/ +#define CONTAINER_FROM_VTBL(ptr, type, m) MY_container_of(ptr, type, m) + +#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) +/* +#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL(ptr, type, m) +*/ + -#define IAlloc_Alloc(p, size) (p)->Alloc((p), size) -#define IAlloc_Free(p, a) (p)->Free((p), a) #ifdef _WIN32 diff --git a/code/ryzom/client/src/seven_zip/7zVersion.h b/code/ryzom/client/src/seven_zip/7zVersion.h index 4f15081de..f3fb623aa 100644 --- a/code/ryzom/client/src/seven_zip/7zVersion.h +++ b/code/ryzom/client/src/seven_zip/7zVersion.h @@ -1,14 +1,21 @@ -#define MY_VER_MAJOR 16 -#define MY_VER_MINOR 04 +#define MY_VER_MAJOR 18 +#define MY_VER_MINOR 05 #define MY_VER_BUILD 0 -#define MY_VERSION_NUMBERS "16.04" -#define MY_VERSION "16.04" -#define MY_DATE "2016-10-04" +#define MY_VERSION_NUMBERS "18.05" +#define MY_VERSION MY_VERSION_NUMBERS + +#ifdef MY_CPU_NAME + #define MY_VERSION_CPU MY_VERSION " (" MY_CPU_NAME ")" +#else + #define MY_VERSION_CPU MY_VERSION +#endif + +#define MY_DATE "2018-04-30" #undef MY_COPYRIGHT #undef MY_VERSION_COPYRIGHT_DATE #define MY_AUTHOR_NAME "Igor Pavlov" #define MY_COPYRIGHT_PD "Igor Pavlov : Public domain" -#define MY_COPYRIGHT_CR "Copyright (c) 1999-2016 Igor Pavlov" +#define MY_COPYRIGHT_CR "Copyright (c) 1999-2018 Igor Pavlov" #ifdef USE_COPYRIGHT_CR #define MY_COPYRIGHT MY_COPYRIGHT_CR @@ -16,4 +23,5 @@ #define MY_COPYRIGHT MY_COPYRIGHT_PD #endif -#define MY_VERSION_COPYRIGHT_DATE MY_VERSION " : " MY_COPYRIGHT " : " MY_DATE +#define MY_COPYRIGHT_DATE MY_COPYRIGHT " : " MY_DATE +#define MY_VERSION_COPYRIGHT_DATE MY_VERSION_CPU " : " MY_COPYRIGHT " : " MY_DATE diff --git a/code/ryzom/client/src/seven_zip/Aes.cpp b/code/ryzom/client/src/seven_zip/Aes.cpp index b10b9e58a..1cdd0e787 100644 --- a/code/ryzom/client/src/seven_zip/Aes.cpp +++ b/code/ryzom/client/src/seven_zip/Aes.cpp @@ -1,5 +1,5 @@ /* Aes.c -- AES encryption / decryption -2016-05-21 : Igor Pavlov : Public domain */ +2017-01-24 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -49,7 +49,13 @@ static const Byte Rcon[11] = { 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0 #define gb0(x) ( (x) & 0xFF) #define gb1(x) (((x) >> ( 8)) & 0xFF) #define gb2(x) (((x) >> (16)) & 0xFF) -#define gb3(x) (((x) >> (24)) & 0xFF) +#define gb3(x) (((x) >> (24))) + +#define gb(n, x) gb ## n(x) + +#define TT(x) (T + (x << 8)) +#define DD(x) (D + (x << 8)) + void AesGenTables(void) { @@ -63,10 +69,10 @@ void AesGenTables(void) UInt32 a1 = Sbox[i]; UInt32 a2 = xtime(a1); UInt32 a3 = a2 ^ a1; - T[ i] = Ui32(a2, a1, a1, a3); - T[0x100 + i] = Ui32(a3, a2, a1, a1); - T[0x200 + i] = Ui32(a1, a3, a2, a1); - T[0x300 + i] = Ui32(a1, a1, a3, a2); + TT(0)[i] = Ui32(a2, a1, a1, a3); + TT(1)[i] = Ui32(a3, a2, a1, a1); + TT(2)[i] = Ui32(a1, a3, a2, a1); + TT(3)[i] = Ui32(a1, a1, a3, a2); } { UInt32 a1 = InvS[i]; @@ -77,10 +83,10 @@ void AesGenTables(void) UInt32 aB = a8 ^ a2 ^ a1; UInt32 aD = a8 ^ a4 ^ a1; UInt32 aE = a8 ^ a4 ^ a2; - D[ i] = Ui32(aE, a9, aD, aB); - D[0x100 + i] = Ui32(aB, aE, a9, aD); - D[0x200 + i] = Ui32(aD, aB, aE, a9); - D[0x300 + i] = Ui32(a9, aD, aB, aE); + DD(0)[i] = Ui32(aE, a9, aD, aB); + DD(1)[i] = Ui32(aB, aE, a9, aD); + DD(2)[i] = Ui32(aD, aB, aE, a9); + DD(3)[i] = Ui32(a9, aD, aB, aE); } } @@ -99,7 +105,7 @@ void AesGenTables(void) } -#define HT(i, x, s) (T + (x << 8))[gb ## x(s[(i + x) & 3])] +#define HT(i, x, s) TT(x)[gb(x, s[(i + x) & 3])] #define HT4(m, i, s, p) m[i] = \ HT(i, 0, s) ^ \ @@ -113,11 +119,11 @@ void AesGenTables(void) HT4(m, 2, s, p); \ HT4(m, 3, s, p); \ -#define FT(i, x) Sbox[gb ## x(m[(i + x) & 3])] +#define FT(i, x) Sbox[gb(x, m[(i + x) & 3])] #define FT4(i) dest[i] = Ui32(FT(i, 0), FT(i, 1), FT(i, 2), FT(i, 3)) ^ w[i]; -#define HD(i, x, s) (D + (x << 8))[gb ## x(s[(i - x) & 3])] +#define HD(i, x, s) DD(x)[gb(x, s[(i - x) & 3])] #define HD4(m, i, s, p) m[i] = \ HD(i, 0, s) ^ \ @@ -131,7 +137,7 @@ void AesGenTables(void) HD4(m, 2, s, p); \ HD4(m, 3, s, p); \ -#define FD(i, x) InvS[gb ## x(m[(i - x) & 3])] +#define FD(i, x) InvS[gb(x, m[(i - x) & 3])] #define FD4(i) dest[i] = Ui32(FD(i, 0), FD(i, 1), FD(i, 2), FD(i, 3)) ^ w[i]; void MY_FAST_CALL Aes_SetKey_Enc(UInt32 *w, const Byte *key, unsigned keySize) @@ -147,7 +153,7 @@ void MY_FAST_CALL Aes_SetKey_Enc(UInt32 *w, const Byte *key, unsigned keySize) for (; i < wSize; i++) { - UInt32 t = w[i - 1]; + UInt32 t = w[(size_t)i - 1]; unsigned rem = i % keySize; if (rem == 0) t = Ui32(Sbox[gb1(t)] ^ Rcon[i / keySize], Sbox[gb2(t)], Sbox[gb3(t)], Sbox[gb0(t)]); @@ -167,10 +173,10 @@ void MY_FAST_CALL Aes_SetKey_Dec(UInt32 *w, const Byte *key, unsigned keySize) { UInt32 r = w[i]; w[i] = - D[ (unsigned)Sbox[gb0(r)]] ^ - D[0x100 + (unsigned)Sbox[gb1(r)]] ^ - D[0x200 + (unsigned)Sbox[gb2(r)]] ^ - D[0x300 + (unsigned)Sbox[gb3(r)]]; + DD(0)[Sbox[gb0(r)]] ^ + DD(1)[Sbox[gb1(r)]] ^ + DD(2)[Sbox[gb2(r)]] ^ + DD(3)[Sbox[gb3(r)]]; } } @@ -276,20 +282,25 @@ void MY_FAST_CALL AesCtr_Code(UInt32 *p, Byte *data, size_t numBlocks) for (; numBlocks != 0; numBlocks--) { UInt32 temp[4]; - Byte buf[16]; - int i; + unsigned i; if (++p[0] == 0) p[1]++; Aes_Encode(p + 4, temp, p); - SetUi32(buf, temp[0]); - SetUi32(buf + 4, temp[1]); - SetUi32(buf + 8, temp[2]); - SetUi32(buf + 12, temp[3]); - - for (i = 0; i < 16; i++) - *data++ ^= buf[i]; + for (i = 0; i < 4; i++, data += 4) + { + UInt32 t = temp[i]; + + #ifdef MY_CPU_LE_UNALIGN + *((UInt32 *)data) ^= t; + #else + data[0] ^= (t & 0xFF); + data[1] ^= ((t >> 8) & 0xFF); + data[2] ^= ((t >> 16) & 0xFF); + data[3] ^= ((t >> 24)); + #endif + } } } diff --git a/code/ryzom/client/src/seven_zip/AesOpt.cpp b/code/ryzom/client/src/seven_zip/AesOpt.cpp index 10a8fb25c..9571c467f 100644 --- a/code/ryzom/client/src/seven_zip/AesOpt.cpp +++ b/code/ryzom/client/src/seven_zip/AesOpt.cpp @@ -1,12 +1,12 @@ /* AesOpt.c -- Intel's AES -2013-11-12 : Igor Pavlov : Public domain */ +2017-06-08 : Igor Pavlov : Public domain */ #include "Precomp.h" #include "CpuArch.h" #ifdef MY_CPU_X86_OR_AMD64 -#if _MSC_VER >= 1500 +#if (_MSC_VER > 1500) || (_MSC_FULL_VER >= 150030729) #define USE_INTEL_AES #endif #endif diff --git a/code/ryzom/client/src/seven_zip/Alloc.cpp b/code/ryzom/client/src/seven_zip/Alloc.cpp index 3f6ac4191..bcede4b85 100644 --- a/code/ryzom/client/src/seven_zip/Alloc.cpp +++ b/code/ryzom/client/src/seven_zip/Alloc.cpp @@ -1,8 +1,10 @@ /* Alloc.c -- Memory allocation functions -2015-02-21 : Igor Pavlov : Public domain */ +2018-04-27 : Igor Pavlov : Public domain */ #include "Precomp.h" +#include + #ifdef _WIN32 #include #endif @@ -14,20 +16,127 @@ /* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ #ifdef _SZ_ALLOC_DEBUG + #include int g_allocCount = 0; int g_allocCountMid = 0; int g_allocCountBig = 0; + + +#define CONVERT_INT_TO_STR(charType, tempSize) \ + unsigned char temp[tempSize]; unsigned i = 0; \ + while (val >= 10) { temp[i++] = (unsigned char)('0' + (unsigned)(val % 10)); val /= 10; } \ + *s++ = (charType)('0' + (unsigned)val); \ + while (i != 0) { i--; *s++ = temp[i]; } \ + *s = 0; + +static void ConvertUInt64ToString(UInt64 val, char *s) +{ + CONVERT_INT_TO_STR(char, 24); +} + +#define GET_HEX_CHAR(t) ((char)(((t < 10) ? ('0' + t) : ('A' + (t - 10))))) + +static void ConvertUInt64ToHex(UInt64 val, char *s) +{ + UInt64 v = val; + unsigned i; + for (i = 1;; i++) + { + v >>= 4; + if (v == 0) + break; + } + s[i] = 0; + do + { + unsigned t = (unsigned)(val & 0xF); + val >>= 4; + s[--i] = GET_HEX_CHAR(t); + } + while (i); +} + +#define DEBUG_OUT_STREAM stderr + +static void Print(const char *s) +{ + fputs(s, DEBUG_OUT_STREAM); +} + +static void PrintAligned(const char *s, size_t align) +{ + size_t len = strlen(s); + for(;;) + { + fputc(' ', DEBUG_OUT_STREAM); + if (len >= align) + break; + ++len; + } + Print(s); +} + +static void PrintLn() +{ + Print("\n"); +} + +static void PrintHex(UInt64 v, size_t align) +{ + char s[32]; + ConvertUInt64ToHex(v, s); + PrintAligned(s, align); +} + +static void PrintDec(UInt64 v, size_t align) +{ + char s[32]; + ConvertUInt64ToString(v, s); + PrintAligned(s, align); +} + +static void PrintAddr(void *p) +{ + PrintHex((UInt64)(size_t)(ptrdiff_t)p, 12); +} + + +#define PRINT_ALLOC(name, cnt, size, ptr) \ + Print(name " "); \ + PrintDec(cnt++, 10); \ + PrintHex(size, 10); \ + PrintAddr(ptr); \ + PrintLn(); + +#define PRINT_FREE(name, cnt, ptr) if (ptr) { \ + Print(name " "); \ + PrintDec(--cnt, 10); \ + PrintAddr(ptr); \ + PrintLn(); } + +#else + +#define PRINT_ALLOC(name, cnt, size, ptr) +#define PRINT_FREE(name, cnt, ptr) +#define Print(s) +#define PrintLn() +#define PrintHex(v, align) +#define PrintDec(v, align) +#define PrintAddr(p) + #endif + + void *MyAlloc(size_t size) { if (size == 0) - return 0; + return NULL; #ifdef _SZ_ALLOC_DEBUG { void *p = malloc(size); - fprintf(stderr, "\nAlloc %10d bytes, count = %10d, addr = %8X", size, g_allocCount++, (unsigned)p); + PRINT_ALLOC("Alloc ", g_allocCount, size, p); return p; } #else @@ -37,10 +146,8 @@ void *MyAlloc(size_t size) void MyFree(void *address) { - #ifdef _SZ_ALLOC_DEBUG - if (address != 0) - fprintf(stderr, "\nFree; count = %10d, addr = %8X", --g_allocCount, (unsigned)address); - #endif + PRINT_FREE("Free ", g_allocCount, address); + free(address); } @@ -49,20 +156,18 @@ void MyFree(void *address) void *MidAlloc(size_t size) { if (size == 0) - return 0; - #ifdef _SZ_ALLOC_DEBUG - fprintf(stderr, "\nAlloc_Mid %10d bytes; count = %10d", size, g_allocCountMid++); - #endif - return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); + return NULL; + + PRINT_ALLOC("Alloc-Mid", g_allocCountMid, size, NULL); + + return VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); } void MidFree(void *address) { - #ifdef _SZ_ALLOC_DEBUG - if (address != 0) - fprintf(stderr, "\nFree_Mid; count = %10d", --g_allocCountMid); - #endif - if (address == 0) + PRINT_FREE("Free-Mid", g_allocCountMid, address); + + if (!address) return; VirtualFree(address, 0, MEM_RELEASE); } @@ -79,10 +184,10 @@ typedef SIZE_T (WINAPI *GetLargePageMinimumP)(); void SetLargePageSize() { #ifdef _7ZIP_LARGE_PAGES - SIZE_T size = 0; + SIZE_T size; GetLargePageMinimumP largePageMinimum = (GetLargePageMinimumP) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetLargePageMinimum"); - if (largePageMinimum == 0) + if (!largePageMinimum) return; size = largePageMinimum(); if (size == 0 || (size & (size - 1)) != 0) @@ -95,31 +200,36 @@ void SetLargePageSize() void *BigAlloc(size_t size) { if (size == 0) - return 0; - #ifdef _SZ_ALLOC_DEBUG - fprintf(stderr, "\nAlloc_Big %10d bytes; count = %10d", size, g_allocCountBig++); - #endif + return NULL; + + PRINT_ALLOC("Alloc-Big", g_allocCountBig, size, NULL); #ifdef _7ZIP_LARGE_PAGES - if (g_LargePageSize != 0 && g_LargePageSize <= (1 << 30) && size >= (1 << 18)) { - void *res = VirtualAlloc(0, (size + g_LargePageSize - 1) & (~(g_LargePageSize - 1)), - MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE); - if (res != 0) - return res; + SIZE_T ps = g_LargePageSize; + if (ps != 0 && ps <= (1 << 30) && size > (ps / 2)) + { + size_t size2; + ps--; + size2 = (size + ps) & ~ps; + if (size2 >= size) + { + void *res = VirtualAlloc(NULL, size2, MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE); + if (res) + return res; + } + } } #endif - return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); + + return VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); } void BigFree(void *address) { - #ifdef _SZ_ALLOC_DEBUG - if (address != 0) - fprintf(stderr, "\nFree_Big; count = %10d", --g_allocCountBig); - #endif + PRINT_FREE("Free-Big", g_allocCountBig, address); - if (address == 0) + if (!address) return; VirtualFree(address, 0, MEM_RELEASE); } @@ -127,10 +237,219 @@ void BigFree(void *address) #endif -static void *SzAlloc(void *p, size_t size) { UNUSED_VAR(p); return MyAlloc(size); } -static void SzFree(void *p, void *address) { UNUSED_VAR(p); MyFree(address); } -ISzAlloc g_Alloc = { SzAlloc, SzFree }; +static void *SzAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p); return MyAlloc(size); } +static void SzFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p); MyFree(address); } +const ISzAlloc g_Alloc = { SzAlloc, SzFree }; -static void *SzBigAlloc(void *p, size_t size) { UNUSED_VAR(p); return BigAlloc(size); } -static void SzBigFree(void *p, void *address) { UNUSED_VAR(p); BigFree(address); } -ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree }; +static void *SzMidAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p); return MidAlloc(size); } +static void SzMidFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p); MidFree(address); } +const ISzAlloc g_MidAlloc = { SzMidAlloc, SzMidFree }; + +static void *SzBigAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p); return BigAlloc(size); } +static void SzBigFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p); BigFree(address); } +const ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree }; + + +/* + uintptr_t : C99 (optional) + : unsupported in VS6 +*/ + +#ifdef _WIN32 + typedef UINT_PTR UIntPtr; +#else + /* + typedef uintptr_t UIntPtr; + */ + typedef ptrdiff_t UIntPtr; +#endif + + +#define ADJUST_ALLOC_SIZE 0 +/* +#define ADJUST_ALLOC_SIZE (sizeof(void *) - 1) +*/ +/* + Use (ADJUST_ALLOC_SIZE = (sizeof(void *) - 1)), if + MyAlloc() can return address that is NOT multiple of sizeof(void *). +*/ + + +/* +#define MY_ALIGN_PTR_DOWN(p, align) ((void *)((char *)(p) - ((size_t)(UIntPtr)(p) & ((align) - 1)))) +*/ +#define MY_ALIGN_PTR_DOWN(p, align) ((void *)((((UIntPtr)(p)) & ~((UIntPtr)(align) - 1)))) + +#define MY_ALIGN_PTR_UP_PLUS(p, align) MY_ALIGN_PTR_DOWN(((char *)(p) + (align) + ADJUST_ALLOC_SIZE), align) + + +#if (_POSIX_C_SOURCE >= 200112L) && !defined(_WIN32) + #define USE_posix_memalign +#endif + +/* + This posix_memalign() is for test purposes only. + We also need special Free() function instead of free(), + if this posix_memalign() is used. +*/ + +/* +static int posix_memalign(void **ptr, size_t align, size_t size) +{ + size_t newSize = size + align; + void *p; + void *pAligned; + *ptr = NULL; + if (newSize < size) + return 12; // ENOMEM + p = MyAlloc(newSize); + if (!p) + return 12; // ENOMEM + pAligned = MY_ALIGN_PTR_UP_PLUS(p, align); + ((void **)pAligned)[-1] = p; + *ptr = pAligned; + return 0; +} +*/ + +/* + ALLOC_ALIGN_SIZE >= sizeof(void *) + ALLOC_ALIGN_SIZE >= cache_line_size +*/ + +#define ALLOC_ALIGN_SIZE ((size_t)1 << 7) + +static void *SzAlignedAlloc(ISzAllocPtr pp, size_t size) +{ + #ifndef USE_posix_memalign + + void *p; + void *pAligned; + size_t newSize; + UNUSED_VAR(pp); + + /* also we can allocate additional dummy ALLOC_ALIGN_SIZE bytes after aligned + block to prevent cache line sharing with another allocated blocks */ + + newSize = size + ALLOC_ALIGN_SIZE * 1 + ADJUST_ALLOC_SIZE; + if (newSize < size) + return NULL; + + p = MyAlloc(newSize); + + if (!p) + return NULL; + pAligned = MY_ALIGN_PTR_UP_PLUS(p, ALLOC_ALIGN_SIZE); + + Print(" size="); PrintHex(size, 8); + Print(" a_size="); PrintHex(newSize, 8); + Print(" ptr="); PrintAddr(p); + Print(" a_ptr="); PrintAddr(pAligned); + PrintLn(); + + ((void **)pAligned)[-1] = p; + + return pAligned; + + #else + + void *p; + UNUSED_VAR(pp); + if (posix_memalign(&p, ALLOC_ALIGN_SIZE, size)) + return NULL; + + Print(" posix_memalign="); PrintAddr(p); + PrintLn(); + + return p; + + #endif +} + + +static void SzAlignedFree(ISzAllocPtr pp, void *address) +{ + UNUSED_VAR(pp); + #ifndef USE_posix_memalign + if (address) + MyFree(((void **)address)[-1]); + #else + free(address); + #endif +} + + +const ISzAlloc g_AlignedAlloc = { SzAlignedAlloc, SzAlignedFree }; + + + +#define MY_ALIGN_PTR_DOWN_1(p) MY_ALIGN_PTR_DOWN(p, sizeof(void *)) + +/* we align ptr to support cases where CAlignOffsetAlloc::offset is not multiply of sizeof(void *) */ +#define REAL_BLOCK_PTR_VAR(p) ((void **)MY_ALIGN_PTR_DOWN_1(p))[-1] +/* +#define REAL_BLOCK_PTR_VAR(p) ((void **)(p))[-1] +*/ + +static void *AlignOffsetAlloc_Alloc(ISzAllocPtr pp, size_t size) +{ + CAlignOffsetAlloc *p = CONTAINER_FROM_VTBL(pp, CAlignOffsetAlloc, vt); + void *adr; + void *pAligned; + size_t newSize; + size_t extra; + size_t alignSize = (size_t)1 << p->numAlignBits; + + if (alignSize < sizeof(void *)) + alignSize = sizeof(void *); + + if (p->offset >= alignSize) + return NULL; + + /* also we can allocate additional dummy ALLOC_ALIGN_SIZE bytes after aligned + block to prevent cache line sharing with another allocated blocks */ + extra = p->offset & (sizeof(void *) - 1); + newSize = size + alignSize + extra + ADJUST_ALLOC_SIZE; + if (newSize < size) + return NULL; + + adr = ISzAlloc_Alloc(p->baseAlloc, newSize); + + if (!adr) + return NULL; + + pAligned = (char *)MY_ALIGN_PTR_DOWN((char *)adr + + alignSize - p->offset + extra + ADJUST_ALLOC_SIZE, alignSize) + p->offset; + + PrintLn(); + Print("- Aligned: "); + Print(" size="); PrintHex(size, 8); + Print(" a_size="); PrintHex(newSize, 8); + Print(" ptr="); PrintAddr(adr); + Print(" a_ptr="); PrintAddr(pAligned); + PrintLn(); + + REAL_BLOCK_PTR_VAR(pAligned) = adr; + + return pAligned; +} + + +static void AlignOffsetAlloc_Free(ISzAllocPtr pp, void *address) +{ + if (address) + { + CAlignOffsetAlloc *p = CONTAINER_FROM_VTBL(pp, CAlignOffsetAlloc, vt); + PrintLn(); + Print("- Aligned Free: "); + PrintLn(); + ISzAlloc_Free(p->baseAlloc, REAL_BLOCK_PTR_VAR(address)); + } +} + + +void AlignOffsetAlloc_CreateVTable(CAlignOffsetAlloc *p) +{ + p->vt.Alloc = AlignOffsetAlloc_Alloc; + p->vt.Free = AlignOffsetAlloc_Free; +} diff --git a/code/ryzom/client/src/seven_zip/Alloc.h b/code/ryzom/client/src/seven_zip/Alloc.h index bac0d87e2..648237646 100644 --- a/code/ryzom/client/src/seven_zip/Alloc.h +++ b/code/ryzom/client/src/seven_zip/Alloc.h @@ -1,5 +1,5 @@ /* Alloc.h -- Memory allocation functions -2015-02-21 : Igor Pavlov : Public domain */ +2018-02-19 : Igor Pavlov : Public domain */ #ifndef __COMMON_ALLOC_H #define __COMMON_ALLOC_H @@ -29,8 +29,22 @@ void BigFree(void *address); #endif -extern ISzAlloc g_Alloc; -extern ISzAlloc g_BigAlloc; +extern const ISzAlloc g_Alloc; +extern const ISzAlloc g_BigAlloc; +extern const ISzAlloc g_MidAlloc; +extern const ISzAlloc g_AlignedAlloc; + + +typedef struct +{ + ISzAlloc vt; + ISzAllocPtr baseAlloc; + unsigned numAlignBits; /* ((1 << numAlignBits) >= sizeof(void *)) */ + size_t offset; /* (offset == (k * sizeof(void *)) && offset < (1 << numAlignBits) */ +} CAlignOffsetAlloc; + +void AlignOffsetAlloc_CreateVTable(CAlignOffsetAlloc *p); + EXTERN_C_END diff --git a/code/ryzom/client/src/seven_zip/Bcj2.cpp b/code/ryzom/client/src/seven_zip/Bcj2.cpp index 3c88e44fc..9a0046a65 100644 --- a/code/ryzom/client/src/seven_zip/Bcj2.cpp +++ b/code/ryzom/client/src/seven_zip/Bcj2.cpp @@ -1,5 +1,5 @@ /* Bcj2.c -- BCJ2 Decoder (Converter for x86 code) -2015-08-01 : Igor Pavlov : Public domain */ +2018-04-28 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -61,7 +61,8 @@ SRes Bcj2Dec_Decode(CBcj2Dec *p) Byte *dest = p->dest; if (dest == p->destLim) return SZ_OK; - *dest = p->temp[p->state++ - BCJ2_DEC_STATE_ORIG_0]; + *dest = p->temp[(size_t)p->state - BCJ2_DEC_STATE_ORIG_0]; + p->state++; p->dest = dest + 1; } } @@ -231,10 +232,10 @@ SRes Bcj2Dec_Decode(CBcj2Dec *p) if (rem < 4) { - SizeT i; - SetUi32(p->temp, val); - for (i = 0; i < rem; i++) - dest[i] = p->temp[i]; + p->temp[0] = (Byte)val; if (rem > 0) dest[0] = (Byte)val; val >>= 8; + p->temp[1] = (Byte)val; if (rem > 1) dest[1] = (Byte)val; val >>= 8; + p->temp[2] = (Byte)val; if (rem > 2) dest[2] = (Byte)val; val >>= 8; + p->temp[3] = (Byte)val; p->dest = dest + rem; p->state = BCJ2_DEC_STATE_ORIG_0 + (unsigned)rem; break; diff --git a/code/ryzom/client/src/seven_zip/Bcj2Enc.cpp b/code/ryzom/client/src/seven_zip/Bcj2Enc.cpp index be600f918..0b76a7c2c 100644 --- a/code/ryzom/client/src/seven_zip/Bcj2Enc.cpp +++ b/code/ryzom/client/src/seven_zip/Bcj2Enc.cpp @@ -1,5 +1,5 @@ /* Bcj2Enc.c -- BCJ2 Encoder (Converter for x86 code) -2014-11-10 : Igor Pavlov : Public domain */ +2017-04-28 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -270,7 +270,7 @@ void Bcj2Enc_Encode(CBcj2Enc *p) unsigned i; p->tempPos = tempPos; for (i = 0; i < tempPos; i++) - p->temp[i] = p->temp[i + num]; + p->temp[i] = p->temp[(size_t)i + num]; p->src = src; p->srcLim = srcLim; diff --git a/code/ryzom/client/src/seven_zip/Bra.cpp b/code/ryzom/client/src/seven_zip/Bra.cpp index cdb945692..aed17e330 100644 --- a/code/ryzom/client/src/seven_zip/Bra.cpp +++ b/code/ryzom/client/src/seven_zip/Bra.cpp @@ -1,135 +1,230 @@ /* Bra.c -- Converters for RISC code -2010-04-16 : Igor Pavlov : Public domain */ +2017-04-04 : Igor Pavlov : Public domain */ #include "Precomp.h" +#include "CpuArch.h" #include "Bra.h" SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) { - SizeT i; - if (size < 4) - return 0; - size -= 4; - ip += 8; - for (i = 0; i <= size; i += 4) + Byte *p; + const Byte *lim; + size &= ~(size_t)3; + ip += 4; + p = data; + lim = data + size; + + if (encoding) + + for (;;) { - if (data[i + 3] == 0xEB) + for (;;) { - UInt32 dest; - UInt32 src = ((UInt32)data[i + 2] << 16) | ((UInt32)data[i + 1] << 8) | (data[i + 0]); - src <<= 2; - if (encoding) - dest = ip + (UInt32)i + src; - else - dest = src - (ip + (UInt32)i); - dest >>= 2; - data[i + 2] = (Byte)(dest >> 16); - data[i + 1] = (Byte)(dest >> 8); - data[i + 0] = (Byte)dest; + if (p >= lim) + return p - data; + p += 4; + if (p[-1] == 0xEB) + break; + } + { + UInt32 v = GetUi32(p - 4); + v <<= 2; + v += ip + (UInt32)(p - data); + v >>= 2; + v &= 0x00FFFFFF; + v |= 0xEB000000; + SetUi32(p - 4, v); + } + } + + for (;;) + { + for (;;) + { + if (p >= lim) + return p - data; + p += 4; + if (p[-1] == 0xEB) + break; + } + { + UInt32 v = GetUi32(p - 4); + v <<= 2; + v -= ip + (UInt32)(p - data); + v >>= 2; + v &= 0x00FFFFFF; + v |= 0xEB000000; + SetUi32(p - 4, v); } } - return i; } + SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) { - SizeT i; - if (size < 4) - return 0; - size -= 4; - ip += 4; - for (i = 0; i <= size; i += 2) + Byte *p; + const Byte *lim; + size &= ~(size_t)1; + p = data; + lim = data + size - 4; + + if (encoding) + + for (;;) { - if ((data[i + 1] & 0xF8) == 0xF0 && - (data[i + 3] & 0xF8) == 0xF8) + UInt32 b1; + for (;;) { - UInt32 dest; - UInt32 src = - (((UInt32)data[i + 1] & 0x7) << 19) | - ((UInt32)data[i + 0] << 11) | - (((UInt32)data[i + 3] & 0x7) << 8) | - (data[i + 2]); - - src <<= 1; - if (encoding) - dest = ip + (UInt32)i + src; - else - dest = src - (ip + (UInt32)i); - dest >>= 1; - - data[i + 1] = (Byte)(0xF0 | ((dest >> 19) & 0x7)); - data[i + 0] = (Byte)(dest >> 11); - data[i + 3] = (Byte)(0xF8 | ((dest >> 8) & 0x7)); - data[i + 2] = (Byte)dest; - i += 2; + UInt32 b3; + if (p > lim) + return p - data; + b1 = p[1]; + b3 = p[3]; + p += 2; + b1 ^= 8; + if ((b3 & b1) >= 0xF8) + break; + } + { + UInt32 v = + ((UInt32)b1 << 19) + + (((UInt32)p[1] & 0x7) << 8) + + (((UInt32)p[-2] << 11)) + + (p[0]); + + p += 2; + { + UInt32 cur = (ip + (UInt32)(p - data)) >> 1; + v += cur; + } + + p[-4] = (Byte)(v >> 11); + p[-3] = (Byte)(0xF0 | ((v >> 19) & 0x7)); + p[-2] = (Byte)v; + p[-1] = (Byte)(0xF8 | (v >> 8)); + } + } + + for (;;) + { + UInt32 b1; + for (;;) + { + UInt32 b3; + if (p > lim) + return p - data; + b1 = p[1]; + b3 = p[3]; + p += 2; + b1 ^= 8; + if ((b3 & b1) >= 0xF8) + break; + } + { + UInt32 v = + ((UInt32)b1 << 19) + + (((UInt32)p[1] & 0x7) << 8) + + (((UInt32)p[-2] << 11)) + + (p[0]); + + p += 2; + { + UInt32 cur = (ip + (UInt32)(p - data)) >> 1; + v -= cur; + } + + /* + SetUi16(p - 4, (UInt16)(((v >> 11) & 0x7FF) | 0xF000)); + SetUi16(p - 2, (UInt16)(v | 0xF800)); + */ + + p[-4] = (Byte)(v >> 11); + p[-3] = (Byte)(0xF0 | ((v >> 19) & 0x7)); + p[-2] = (Byte)v; + p[-1] = (Byte)(0xF8 | (v >> 8)); } } - return i; } + SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) { - SizeT i; - if (size < 4) - return 0; - size -= 4; - for (i = 0; i <= size; i += 4) + Byte *p; + const Byte *lim; + size &= ~(size_t)3; + ip -= 4; + p = data; + lim = data + size; + + for (;;) { - if ((data[i] >> 2) == 0x12 && (data[i + 3] & 3) == 1) + for (;;) { - UInt32 src = ((UInt32)(data[i + 0] & 3) << 24) | - ((UInt32)data[i + 1] << 16) | - ((UInt32)data[i + 2] << 8) | - ((UInt32)data[i + 3] & (~3)); - - UInt32 dest; + if (p >= lim) + return p - data; + p += 4; + /* if ((v & 0xFC000003) == 0x48000001) */ + if ((p[-4] & 0xFC) == 0x48 && (p[-1] & 3) == 1) + break; + } + { + UInt32 v = GetBe32(p - 4); if (encoding) - dest = ip + (UInt32)i + src; + v += ip + (UInt32)(p - data); else - dest = src - (ip + (UInt32)i); - data[i + 0] = (Byte)(0x48 | ((dest >> 24) & 0x3)); - data[i + 1] = (Byte)(dest >> 16); - data[i + 2] = (Byte)(dest >> 8); - data[i + 3] &= 0x3; - data[i + 3] |= dest; + v -= ip + (UInt32)(p - data); + v &= 0x03FFFFFF; + v |= 0x48000000; + SetBe32(p - 4, v); } } - return i; } + SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) { - UInt32 i; - if (size < 4) - return 0; - size -= 4; - for (i = 0; i <= size; i += 4) - { - if ((data[i] == 0x40 && (data[i + 1] & 0xC0) == 0x00) || - (data[i] == 0x7F && (data[i + 1] & 0xC0) == 0xC0)) - { - UInt32 src = - ((UInt32)data[i + 0] << 24) | - ((UInt32)data[i + 1] << 16) | - ((UInt32)data[i + 2] << 8) | - ((UInt32)data[i + 3]); - UInt32 dest; - - src <<= 2; - if (encoding) - dest = ip + i + src; - else - dest = src - (ip + i); - dest >>= 2; - - dest = (((0 - ((dest >> 22) & 1)) << 22) & 0x3FFFFFFF) | (dest & 0x3FFFFF) | 0x40000000; + Byte *p; + const Byte *lim; + size &= ~(size_t)3; + ip -= 4; + p = data; + lim = data + size; - data[i + 0] = (Byte)(dest >> 24); - data[i + 1] = (Byte)(dest >> 16); - data[i + 2] = (Byte)(dest >> 8); - data[i + 3] = (Byte)dest; + for (;;) + { + for (;;) + { + if (p >= lim) + return p - data; + /* + v = GetBe32(p); + p += 4; + m = v + ((UInt32)5 << 29); + m ^= (UInt32)7 << 29; + m += (UInt32)1 << 22; + if ((m & ((UInt32)0x1FF << 23)) == 0) + break; + */ + p += 4; + if ((p[-4] == 0x40 && (p[-3] & 0xC0) == 0) || + (p[-4] == 0x7F && (p[-3] >= 0xC0))) + break; + } + { + UInt32 v = GetBe32(p - 4); + v <<= 2; + if (encoding) + v += ip + (UInt32)(p - data); + else + v -= ip + (UInt32)(p - data); + + v &= 0x01FFFFFF; + v -= (UInt32)1 << 24; + v ^= 0xFF000000; + v >>= 2; + v |= 0x40000000; + SetBe32(p - 4, v); } } - return i; } diff --git a/code/ryzom/client/src/seven_zip/Bra86.cpp b/code/ryzom/client/src/seven_zip/Bra86.cpp index 6db15e7ec..93ed4d762 100644 --- a/code/ryzom/client/src/seven_zip/Bra86.cpp +++ b/code/ryzom/client/src/seven_zip/Bra86.cpp @@ -1,5 +1,5 @@ /* Bra86.c -- Converter for x86 code (BCJ) -2013-11-12 : Igor Pavlov : Public domain */ +2017-04-03 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -37,7 +37,7 @@ SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding else { mask >>= (unsigned)d; - if (mask != 0 && (mask > 4 || mask == 3 || Test86MSByte(p[(mask >> 1) + 1]))) + if (mask != 0 && (mask > 4 || mask == 3 || Test86MSByte(p[(size_t)(mask >> 1) + 1]))) { mask = (mask >> 1) | 4; pos++; diff --git a/code/ryzom/client/src/seven_zip/BraIA64.cpp b/code/ryzom/client/src/seven_zip/BraIA64.cpp index fa60356b2..d1dbc62c5 100644 --- a/code/ryzom/client/src/seven_zip/BraIA64.cpp +++ b/code/ryzom/client/src/seven_zip/BraIA64.cpp @@ -1,69 +1,53 @@ /* BraIA64.c -- Converter for IA-64 code -2013-11-12 : Igor Pavlov : Public domain */ +2017-01-26 : Igor Pavlov : Public domain */ #include "Precomp.h" +#include "CpuArch.h" #include "Bra.h" -static const Byte kBranchTable[32] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 4, 4, 6, 6, 0, 0, 7, 7, - 4, 4, 0, 0, 4, 4, 0, 0 -}; - SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) { SizeT i; if (size < 16) return 0; size -= 16; - for (i = 0; i <= size; i += 16) + i = 0; + do { - UInt32 instrTemplate = data[i] & 0x1F; - UInt32 mask = kBranchTable[instrTemplate]; - UInt32 bitPos = 5; - int slot; - for (slot = 0; slot < 3; slot++, bitPos += 41) + unsigned m = ((UInt32)0x334B0000 >> (data[i] & 0x1E)) & 3; + if (m) { - UInt32 bytePos, bitRes; - UInt64 instruction, instNorm; - int j; - if (((mask >> slot) & 1) == 0) - continue; - bytePos = (bitPos >> 3); - bitRes = bitPos & 0x7; - instruction = 0; - for (j = 0; j < 6; j++) - instruction += (UInt64)data[i + j + bytePos] << (8 * j); - - instNorm = instruction >> bitRes; - if (((instNorm >> 37) & 0xF) == 0x5 && ((instNorm >> 9) & 0x7) == 0) + m++; + do { - UInt32 src = (UInt32)((instNorm >> 13) & 0xFFFFF); - UInt32 dest; - src |= ((UInt32)(instNorm >> 36) & 1) << 20; - - src <<= 4; - - if (encoding) - dest = ip + (UInt32)i + src; - else - dest = src - (ip + (UInt32)i); - - dest >>= 4; - - instNorm &= ~((UInt64)(0x8FFFFF) << 13); - instNorm |= ((UInt64)(dest & 0xFFFFF) << 13); - instNorm |= ((UInt64)(dest & 0x100000) << (36 - 20)); - - instruction &= (1 << bitRes) - 1; - instruction |= (instNorm << bitRes); - for (j = 0; j < 6; j++) - data[i + j + bytePos] = (Byte)(instruction >> (8 * j)); + Byte *p = data + (i + (size_t)m * 5 - 8); + if (((p[3] >> m) & 15) == 5 + && (((p[-1] | ((UInt32)p[0] << 8)) >> m) & 0x70) == 0) + { + unsigned raw = GetUi32(p); + unsigned v = raw >> m; + v = (v & 0xFFFFF) | ((v & (1 << 23)) >> 3); + + v <<= 4; + if (encoding) + v += ip + (UInt32)i; + else + v -= ip + (UInt32)i; + v >>= 4; + + v &= 0x1FFFFF; + v += 0x700000; + v &= 0x8FFFFF; + raw &= ~((UInt32)0x8FFFFF << m); + raw |= (v << m); + SetUi32(p, raw); + } } + while (++m <= 4); } + i += 16; } + while (i <= size); return i; } diff --git a/code/ryzom/client/src/seven_zip/Compiler.h b/code/ryzom/client/src/seven_zip/Compiler.h index 5bba7ee56..0cc409d8a 100644 --- a/code/ryzom/client/src/seven_zip/Compiler.h +++ b/code/ryzom/client/src/seven_zip/Compiler.h @@ -1,5 +1,5 @@ /* Compiler.h -2015-08-02 : Igor Pavlov : Public domain */ +2017-04-03 : Igor Pavlov : Public domain */ #ifndef __7Z_COMPILER_H #define __7Z_COMPILER_H @@ -21,6 +21,7 @@ #pragma warning(disable : 4514) // unreferenced inline function has been removed #pragma warning(disable : 4702) // unreachable code #pragma warning(disable : 4710) // not inlined + #pragma warning(disable : 4714) // function marked as __forceinline not inlined #pragma warning(disable : 4786) // identifier was truncated to '255' characters in the debug information #endif diff --git a/code/ryzom/client/src/seven_zip/CpuArch.h b/code/ryzom/client/src/seven_zip/CpuArch.h index e42ce2814..056116dde 100644 --- a/code/ryzom/client/src/seven_zip/CpuArch.h +++ b/code/ryzom/client/src/seven_zip/CpuArch.h @@ -1,5 +1,5 @@ /* CpuArch.h -- CPU specific code -2016-06-09: Igor Pavlov : Public domain */ +2017-09-04 : Igor Pavlov : Public domain */ #ifndef __CPU_ARCH_H #define __CPU_ARCH_H @@ -16,48 +16,122 @@ If MY_CPU_LE and MY_CPU_BE are not defined, we don't know about ENDIANNESS of pl MY_CPU_LE_UNALIGN means that CPU is LITTLE ENDIAN and CPU supports unaligned memory accesses. */ -#if defined(_M_X64) \ - || defined(_M_AMD64) \ - || defined(__x86_64__) \ - || defined(__AMD64__) \ - || defined(__amd64__) +#if defined(_M_X64) \ + || defined(_M_AMD64) \ + || defined(__x86_64__) \ + || defined(__AMD64__) \ + || defined(__amd64__) #define MY_CPU_AMD64 -#endif - -#if defined(MY_CPU_AMD64) \ - || defined(_M_IA64) \ - || defined(__AARCH64EL__) \ - || defined(__AARCH64EB__) + #ifdef __ILP32__ + #define MY_CPU_NAME "x32" + #else + #define MY_CPU_NAME "x64" + #endif #define MY_CPU_64BIT #endif -#if defined(_M_IX86) || defined(__i386__) -#define MY_CPU_X86 + +#if defined(_M_IX86) \ + || defined(__i386__) + #define MY_CPU_X86 + #define MY_CPU_NAME "x86" + #define MY_CPU_32BIT #endif + +#if defined(_M_ARM64) \ + || defined(__AARCH64EL__) \ + || defined(__AARCH64EB__) \ + || defined(__aarch64__) + #define MY_CPU_ARM64 + #define MY_CPU_NAME "arm64" + #define MY_CPU_64BIT +#endif + + +#if defined(_M_ARM) \ + || defined(_M_ARM_NT) \ + || defined(_M_ARMT) \ + || defined(__arm__) \ + || defined(__thumb__) \ + || defined(__ARMEL__) \ + || defined(__ARMEB__) \ + || defined(__THUMBEL__) \ + || defined(__THUMBEB__) + #define MY_CPU_ARM + #define MY_CPU_NAME "arm" + #define MY_CPU_32BIT +#endif + + +#if defined(_M_IA64) \ + || defined(__ia64__) + #define MY_CPU_IA64 + #define MY_CPU_NAME "ia64" + #define MY_CPU_64BIT +#endif + + +#if defined(__mips64) \ + || defined(__mips64__) \ + || (defined(__mips) && (__mips == 64 || __mips == 4 || __mips == 3)) + #define MY_CPU_NAME "mips64" + #define MY_CPU_64BIT +#elif defined(__mips__) + #define MY_CPU_NAME "mips" + /* #define MY_CPU_32BIT */ +#endif + + +#if defined(__ppc64__) \ + || defined(__powerpc64__) + #ifdef __ILP32__ + #define MY_CPU_NAME "ppc64-32" + #else + #define MY_CPU_NAME "ppc64" + #endif + #define MY_CPU_64BIT +#elif defined(__ppc__) \ + || defined(__powerpc__) + #define MY_CPU_NAME "ppc" + #define MY_CPU_32BIT +#endif + + +#if defined(__sparc64__) + #define MY_CPU_NAME "sparc64" + #define MY_CPU_64BIT +#elif defined(__sparc__) + #define MY_CPU_NAME "sparc" + /* #define MY_CPU_32BIT */ +#endif + + #if defined(MY_CPU_X86) || defined(MY_CPU_AMD64) #define MY_CPU_X86_OR_AMD64 #endif -#if defined(MY_CPU_X86) \ - || defined(_M_ARM) \ - || defined(__ARMEL__) \ - || defined(__THUMBEL__) \ - || defined(__ARMEB__) \ - || defined(__THUMBEB__) - #define MY_CPU_32BIT + +#ifdef _WIN32 + + #ifdef MY_CPU_ARM + #define MY_CPU_ARM_LE + #endif + + #ifdef MY_CPU_ARM64 + #define MY_CPU_ARM64_LE + #endif + + #ifdef _M_IA64 + #define MY_CPU_IA64_LE + #endif + #endif -#if defined(_WIN32) && defined(_M_ARM) -#define MY_CPU_ARM_LE -#endif - -#if defined(_WIN32) && defined(_M_IA64) -#define MY_CPU_IA64_LE -#endif #if defined(MY_CPU_X86_OR_AMD64) \ || defined(MY_CPU_ARM_LE) \ + || defined(MY_CPU_ARM64_LE) \ || defined(MY_CPU_IA64_LE) \ || defined(__LITTLE_ENDIAN__) \ || defined(__ARMEL__) \ @@ -86,14 +160,37 @@ MY_CPU_LE_UNALIGN means that CPU is LITTLE ENDIAN and CPU supports unaligned mem #define MY_CPU_BE #endif + #if defined(MY_CPU_LE) && defined(MY_CPU_BE) -Stop_Compiling_Bad_Endian + #error Stop_Compiling_Bad_Endian #endif +#if defined(MY_CPU_32BIT) && defined(MY_CPU_64BIT) + #error Stop_Compiling_Bad_32_64_BIT +#endif + + +#ifndef MY_CPU_NAME + #ifdef MY_CPU_LE + #define MY_CPU_NAME "LE" + #elif defined(MY_CPU_BE) + #define MY_CPU_NAME "BE" + #else + /* + #define MY_CPU_NAME "" + */ + #endif +#endif + + + + + #ifdef MY_CPU_LE #if defined(MY_CPU_X86_OR_AMD64) \ - /* || defined(__AARCH64EL__) */ + || defined(MY_CPU_ARM64) \ + || defined(__ARM_FEATURE_UNALIGNED) #define MY_CPU_LE_UNALIGN #endif #endif @@ -139,6 +236,11 @@ Stop_Compiling_Bad_Endian #endif +#ifdef __has_builtin + #define MY__has_builtin(x) __has_builtin(x) +#else + #define MY__has_builtin(x) 0 +#endif #if defined(MY_CPU_LE_UNALIGN) && /* defined(_WIN64) && */ (_MSC_VER >= 1300) @@ -146,15 +248,21 @@ Stop_Compiling_Bad_Endian #include +#pragma intrinsic(_byteswap_ushort) #pragma intrinsic(_byteswap_ulong) #pragma intrinsic(_byteswap_uint64) + +/* #define GetBe16(p) _byteswap_ushort(*(const UInt16 *)(const Byte *)(p)) */ #define GetBe32(p) _byteswap_ulong(*(const UInt32 *)(const Byte *)(p)) #define GetBe64(p) _byteswap_uint64(*(const UInt64 *)(const Byte *)(p)) #define SetBe32(p, v) (*(UInt32 *)(void *)(p)) = _byteswap_ulong(v) -#elif defined(MY_CPU_LE_UNALIGN) && defined (__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) +#elif defined(MY_CPU_LE_UNALIGN) && ( \ + (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) \ + || (defined(__clang__) && MY__has_builtin(__builtin_bswap16)) ) +/* #define GetBe16(p) __builtin_bswap16(*(const UInt16 *)(const Byte *)(p)) */ #define GetBe32(p) __builtin_bswap32(*(const UInt32 *)(const Byte *)(p)) #define GetBe64(p) __builtin_bswap64(*(const UInt64 *)(const Byte *)(p)) @@ -179,10 +287,14 @@ Stop_Compiling_Bad_Endian #endif +#ifndef GetBe16 + #define GetBe16(p) ( (UInt16) ( \ ((UInt16)((const Byte *)(p))[0] << 8) | \ ((const Byte *)(p))[1] )) +#endif + #ifdef MY_CPU_X86_OR_AMD64 diff --git a/code/ryzom/client/src/seven_zip/LzFind.cpp b/code/ryzom/client/src/seven_zip/LzFind.cpp index 2d05fa395..18ef49dca 100644 --- a/code/ryzom/client/src/seven_zip/LzFind.cpp +++ b/code/ryzom/client/src/seven_zip/LzFind.cpp @@ -1,5 +1,5 @@ /* LzFind.c -- Match finder for LZ algorithms -2015-10-15 : Igor Pavlov : Public domain */ +2017-06-10 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -16,18 +16,18 @@ #define kStartMaxLen 3 -static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc) +static void LzInWindow_Free(CMatchFinder *p, ISzAllocPtr alloc) { if (!p->directInput) { - alloc->Free(alloc, p->bufferBase); + ISzAlloc_Free(alloc, p->bufferBase); p->bufferBase = NULL; } } /* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */ -static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc) +static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAllocPtr alloc) { UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv; if (p->directInput) @@ -39,7 +39,7 @@ static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *a { LzInWindow_Free(p, alloc); p->blockSize = blockSize; - p->bufferBase = (Byte *)alloc->Alloc(alloc, (size_t)blockSize); + p->bufferBase = (Byte *)ISzAlloc_Alloc(alloc, (size_t)blockSize); } return (p->bufferBase != NULL); } @@ -81,7 +81,7 @@ static void MatchFinder_ReadBlock(CMatchFinder *p) if (size == 0) return; - p->result = p->stream->Read(p->stream, dest, &size); + p->result = ISeqInStream_Read(p->stream, dest, &size); if (p->result != SZ_OK) return; if (size == 0) @@ -142,6 +142,7 @@ void MatchFinder_Construct(CMatchFinder *p) p->bufferBase = NULL; p->directInput = 0; p->hash = NULL; + p->expectedDataSize = (UInt64)(Int64)-1; MatchFinder_SetDefaultSettings(p); for (i = 0; i < 256; i++) @@ -149,34 +150,34 @@ void MatchFinder_Construct(CMatchFinder *p) UInt32 r = i; unsigned j; for (j = 0; j < 8; j++) - r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1)); + r = (r >> 1) ^ (kCrcPoly & ((UInt32)0 - (r & 1))); p->crc[i] = r; } } -static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAlloc *alloc) +static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAllocPtr alloc) { - alloc->Free(alloc, p->hash); + ISzAlloc_Free(alloc, p->hash); p->hash = NULL; } -void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc) +void MatchFinder_Free(CMatchFinder *p, ISzAllocPtr alloc) { MatchFinder_FreeThisClassMemory(p, alloc); LzInWindow_Free(p, alloc); } -static CLzRef* AllocRefs(size_t num, ISzAlloc *alloc) +static CLzRef* AllocRefs(size_t num, ISzAllocPtr alloc) { size_t sizeInBytes = (size_t)num * sizeof(CLzRef); if (sizeInBytes / sizeof(CLzRef) != num) return NULL; - return (CLzRef *)alloc->Alloc(alloc, sizeInBytes); + return (CLzRef *)ISzAlloc_Alloc(alloc, sizeInBytes); } int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, - ISzAlloc *alloc) + ISzAllocPtr alloc) { UInt32 sizeReserv; @@ -208,7 +209,11 @@ int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, hs = (1 << 16) - 1; else { - hs = historySize - 1; + hs = historySize; + if (hs > p->expectedDataSize) + hs = (UInt32)p->expectedDataSize; + if (hs != 0) + hs--; hs |= (hs >> 1); hs |= (hs >> 2); hs |= (hs >> 4); @@ -292,17 +297,33 @@ static void MatchFinder_SetLimits(CMatchFinder *p) p->posLimit = p->pos + limit; } -void MatchFinder_Init_2(CMatchFinder *p, int readData) + +void MatchFinder_Init_LowHash(CMatchFinder *p) +{ + size_t i; + CLzRef *items = p->hash; + size_t numItems = p->fixedHashSize; + for (i = 0; i < numItems; i++) + items[i] = kEmptyHashValue; +} + + +void MatchFinder_Init_HighHash(CMatchFinder *p) +{ + size_t i; + CLzRef *items = p->hash + p->fixedHashSize; + size_t numItems = (size_t)p->hashMask + 1; + for (i = 0; i < numItems; i++) + items[i] = kEmptyHashValue; +} + + +void MatchFinder_Init_3(CMatchFinder *p, int readData) { - UInt32 i; - UInt32 *hash = p->hash; - UInt32 num = p->hashSizeSum; - for (i = 0; i < num; i++) - hash[i] = kEmptyHashValue; - p->cyclicBufferPos = 0; p->buffer = p->bufferBase; - p->pos = p->streamPos = p->cyclicBufferSize; + p->pos = + p->streamPos = p->cyclicBufferSize; p->result = SZ_OK; p->streamEndWasReached = 0; @@ -312,10 +333,14 @@ void MatchFinder_Init_2(CMatchFinder *p, int readData) MatchFinder_SetLimits(p); } + void MatchFinder_Init(CMatchFinder *p) { - MatchFinder_Init_2(p, True); + MatchFinder_Init_HighHash(p); + MatchFinder_Init_LowHash(p); + MatchFinder_Init_3(p, True); } + static UInt32 MatchFinder_GetSubValue(CMatchFinder *p) { @@ -558,10 +583,10 @@ static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) d2 = pos - hash[h2]; - curMatch = hash[kFix3HashSize + hv]; + curMatch = (hash + kFix3HashSize)[hv]; hash[h2] = pos; - hash[kFix3HashSize + hv] = pos; + (hash + kFix3HashSize)[hv] = pos; maxLen = 2; offset = 0; @@ -594,13 +619,13 @@ static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) pos = p->pos; d2 = pos - hash[ h2]; - d3 = pos - hash[kFix3HashSize + h3]; + d3 = pos - (hash + kFix3HashSize)[h3]; - curMatch = hash[kFix4HashSize + hv]; + curMatch = (hash + kFix4HashSize)[hv]; hash[ h2] = pos; - hash[kFix3HashSize + h3] = pos; - hash[kFix4HashSize + hv] = pos; + (hash + kFix3HashSize)[h3] = pos; + (hash + kFix4HashSize)[hv] = pos; maxLen = 0; offset = 0; @@ -615,7 +640,7 @@ static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) if (d2 != d3 && d3 < p->cyclicBufferSize && *(cur - d3) == *cur) { maxLen = 3; - distances[offset + 1] = d3 - 1; + distances[(size_t)offset + 1] = d3 - 1; offset += 2; d2 = d3; } @@ -623,7 +648,7 @@ static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) if (offset != 0) { UPDATE_maxLen - distances[offset - 2] = maxLen; + distances[(size_t)offset - 2] = maxLen; if (maxLen == lenLimit) { SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); @@ -650,15 +675,15 @@ static UInt32 Bt5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) pos = p->pos; d2 = pos - hash[ h2]; - d3 = pos - hash[kFix3HashSize + h3]; - d4 = pos - hash[kFix4HashSize + h4]; + d3 = pos - (hash + kFix3HashSize)[h3]; + d4 = pos - (hash + kFix4HashSize)[h4]; - curMatch = hash[kFix5HashSize + hv]; + curMatch = (hash + kFix5HashSize)[hv]; hash[ h2] = pos; - hash[kFix3HashSize + h3] = pos; - hash[kFix4HashSize + h4] = pos; - hash[kFix5HashSize + hv] = pos; + (hash + kFix3HashSize)[h3] = pos; + (hash + kFix4HashSize)[h4] = pos; + (hash + kFix5HashSize)[hv] = pos; maxLen = 0; offset = 0; @@ -691,7 +716,7 @@ static UInt32 Bt5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) && *(cur - d4 + 3) == *(cur + 3)) { maxLen = 4; - distances[offset + 1] = d4 - 1; + distances[(size_t)offset + 1] = d4 - 1; offset += 2; d2 = d4; } @@ -699,7 +724,7 @@ static UInt32 Bt5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) if (offset != 0) { UPDATE_maxLen - distances[offset - 2] = maxLen; + distances[(size_t)offset - 2] = maxLen; if (maxLen == lenLimit) { SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); @@ -726,13 +751,13 @@ static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) pos = p->pos; d2 = pos - hash[ h2]; - d3 = pos - hash[kFix3HashSize + h3]; + d3 = pos - (hash + kFix3HashSize)[h3]; - curMatch = hash[kFix4HashSize + hv]; + curMatch = (hash + kFix4HashSize)[hv]; hash[ h2] = pos; - hash[kFix3HashSize + h3] = pos; - hash[kFix4HashSize + hv] = pos; + (hash + kFix3HashSize)[h3] = pos; + (hash + kFix4HashSize)[hv] = pos; maxLen = 0; offset = 0; @@ -747,7 +772,7 @@ static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) if (d2 != d3 && d3 < p->cyclicBufferSize && *(cur - d3) == *cur) { maxLen = 3; - distances[offset + 1] = d3 - 1; + distances[(size_t)offset + 1] = d3 - 1; offset += 2; d2 = d3; } @@ -755,7 +780,7 @@ static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) if (offset != 0) { UPDATE_maxLen - distances[offset - 2] = maxLen; + distances[(size_t)offset - 2] = maxLen; if (maxLen == lenLimit) { p->son[p->cyclicBufferPos] = curMatch; @@ -784,15 +809,15 @@ static UInt32 Hc5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) pos = p->pos; d2 = pos - hash[ h2]; - d3 = pos - hash[kFix3HashSize + h3]; - d4 = pos - hash[kFix4HashSize + h4]; + d3 = pos - (hash + kFix3HashSize)[h3]; + d4 = pos - (hash + kFix4HashSize)[h4]; - curMatch = hash[kFix5HashSize + hv]; + curMatch = (hash + kFix5HashSize)[hv]; hash[ h2] = pos; - hash[kFix3HashSize + h3] = pos; - hash[kFix4HashSize + h4] = pos; - hash[kFix5HashSize + hv] = pos; + (hash + kFix3HashSize)[h3] = pos; + (hash + kFix4HashSize)[h4] = pos; + (hash + kFix5HashSize)[hv] = pos; maxLen = 0; offset = 0; @@ -825,7 +850,7 @@ static UInt32 Hc5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) && *(cur - d4 + 3) == *(cur + 3)) { maxLen = 4; - distances[offset + 1] = d4 - 1; + distances[(size_t)offset + 1] = d4 - 1; offset += 2; d2 = d4; } @@ -833,7 +858,7 @@ static UInt32 Hc5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) if (offset != 0) { UPDATE_maxLen - distances[offset - 2] = maxLen; + distances[(size_t)offset - 2] = maxLen; if (maxLen == lenLimit) { p->son[p->cyclicBufferPos] = curMatch; @@ -897,9 +922,9 @@ static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num) SKIP_HEADER(3) HASH3_CALC; hash = p->hash; - curMatch = hash[kFix3HashSize + hv]; + curMatch = (hash + kFix3HashSize)[hv]; hash[h2] = - hash[kFix3HashSize + hv] = p->pos; + (hash + kFix3HashSize)[hv] = p->pos; SKIP_FOOTER } while (--num != 0); @@ -914,10 +939,10 @@ static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) SKIP_HEADER(4) HASH4_CALC; hash = p->hash; - curMatch = hash[kFix4HashSize + hv]; + curMatch = (hash + kFix4HashSize)[hv]; hash[ h2] = - hash[kFix3HashSize + h3] = - hash[kFix4HashSize + hv] = p->pos; + (hash + kFix3HashSize)[h3] = + (hash + kFix4HashSize)[hv] = p->pos; SKIP_FOOTER } while (--num != 0); @@ -933,11 +958,11 @@ static void Bt5_MatchFinder_Skip(CMatchFinder *p, UInt32 num) SKIP_HEADER(5) HASH5_CALC; hash = p->hash; - curMatch = hash[kFix5HashSize + hv]; + curMatch = (hash + kFix5HashSize)[hv]; hash[ h2] = - hash[kFix3HashSize + h3] = - hash[kFix4HashSize + h4] = - hash[kFix5HashSize + hv] = p->pos; + (hash + kFix3HashSize)[h3] = + (hash + kFix4HashSize)[h4] = + (hash + kFix5HashSize)[hv] = p->pos; SKIP_FOOTER } while (--num != 0); @@ -953,10 +978,10 @@ static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) SKIP_HEADER(4) HASH4_CALC; hash = p->hash; - curMatch = hash[kFix4HashSize + hv]; + curMatch = (hash + kFix4HashSize)[hv]; hash[ h2] = - hash[kFix3HashSize + h3] = - hash[kFix4HashSize + hv] = p->pos; + (hash + kFix3HashSize)[h3] = + (hash + kFix4HashSize)[hv] = p->pos; p->son[p->cyclicBufferPos] = curMatch; MOVE_POS } @@ -973,11 +998,11 @@ static void Hc5_MatchFinder_Skip(CMatchFinder *p, UInt32 num) SKIP_HEADER(5) HASH5_CALC; hash = p->hash; - curMatch = p->hash[kFix5HashSize + hv]; + curMatch = hash + kFix5HashSize)[hv]; hash[ h2] = - hash[kFix3HashSize + h3] = - hash[kFix4HashSize + h4] = - hash[kFix5HashSize + hv] = p->pos; + (hash + kFix3HashSize)[h3] = + (hash + kFix4HashSize)[h4] = + (hash + kFix5HashSize)[hv] = p->pos; p->son[p->cyclicBufferPos] = curMatch; MOVE_POS } diff --git a/code/ryzom/client/src/seven_zip/LzFind.h b/code/ryzom/client/src/seven_zip/LzFind.h index d119944f4..42c13be15 100644 --- a/code/ryzom/client/src/seven_zip/LzFind.h +++ b/code/ryzom/client/src/seven_zip/LzFind.h @@ -1,5 +1,5 @@ /* LzFind.h -- Match finder for LZ algorithms -2015-10-15 : Igor Pavlov : Public domain */ +2017-06-10 : Igor Pavlov : Public domain */ #ifndef __LZ_FIND_H #define __LZ_FIND_H @@ -47,6 +47,8 @@ typedef struct _CMatchFinder SRes result; UInt32 crc[256]; size_t numRefs; + + UInt64 expectedDataSize; } CMatchFinder; #define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer) @@ -71,8 +73,8 @@ void MatchFinder_Construct(CMatchFinder *p); */ int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, - ISzAlloc *alloc); -void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc); + ISzAllocPtr alloc); +void MatchFinder_Free(CMatchFinder *p, ISzAllocPtr alloc); void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, size_t numItems); void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue); @@ -103,7 +105,9 @@ typedef struct _IMatchFinder void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable); -void MatchFinder_Init_2(CMatchFinder *p, int readData); +void MatchFinder_Init_LowHash(CMatchFinder *p); +void MatchFinder_Init_HighHash(CMatchFinder *p); +void MatchFinder_Init_3(CMatchFinder *p, int readData); void MatchFinder_Init(CMatchFinder *p); UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); diff --git a/code/ryzom/client/src/seven_zip/Lzma2Dec.cpp b/code/ryzom/client/src/seven_zip/Lzma2Dec.cpp index b84f88a48..7904bb68d 100644 --- a/code/ryzom/client/src/seven_zip/Lzma2Dec.cpp +++ b/code/ryzom/client/src/seven_zip/Lzma2Dec.cpp @@ -1,5 +1,5 @@ /* Lzma2Dec.c -- LZMA2 Decoder -2015-11-09 : Igor Pavlov : Public domain */ +2018-02-19 : Igor Pavlov : Public domain */ /* #define SHOW_DEBUG_INFO */ @@ -14,28 +14,22 @@ #include "Lzma2Dec.h" /* -00000000 - EOS -00000001 U U - Uncompressed Reset Dic -00000010 U U - Uncompressed No Reset -100uuuuu U U P P - LZMA no reset -101uuuuu U U P P - LZMA reset state -110uuuuu U U P P S - LZMA reset state + new prop -111uuuuu U U P P S - LZMA reset state + new prop + reset dic +00000000 - End of data +00000001 U U - Uncompressed, reset dic, need reset state and set new prop +00000010 U U - Uncompressed, no reset +100uuuuu U U P P - LZMA, no reset +101uuuuu U U P P - LZMA, reset state +110uuuuu U U P P S - LZMA, reset state + set new prop +111uuuuu U U P P S - LZMA, reset state + set new prop, reset dic u, U - Unpack Size P - Pack Size S - Props */ -#define LZMA2_CONTROL_LZMA (1 << 7) -#define LZMA2_CONTROL_COPY_NO_RESET 2 #define LZMA2_CONTROL_COPY_RESET_DIC 1 -#define LZMA2_CONTROL_EOF 0 -#define LZMA2_IS_UNCOMPRESSED_STATE(p) (((p)->control & LZMA2_CONTROL_LZMA) == 0) - -#define LZMA2_GET_LZMA_MODE(p) (((p)->control >> 5) & 3) -#define LZMA2_IS_THERE_PROP(mode) ((mode) >= 2) +#define LZMA2_IS_UNCOMPRESSED_STATE(p) (((p)->control & (1 << 7)) == 0) #define LZMA2_LCLP_MAX 4 #define LZMA2_DIC_SIZE_FROM_PROP(p) (((UInt32)2 | ((p) & 1)) << ((p) / 2 + 11)) @@ -74,14 +68,14 @@ static SRes Lzma2Dec_GetOldProps(Byte prop, Byte *props) return SZ_OK; } -SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAlloc *alloc) +SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc) { Byte props[LZMA_PROPS_SIZE]; RINOK(Lzma2Dec_GetOldProps(prop, props)); return LzmaDec_AllocateProbs(&p->decoder, props, LZMA_PROPS_SIZE, alloc); } -SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAlloc *alloc) +SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc) { Byte props[LZMA_PROPS_SIZE]; RINOK(Lzma2Dec_GetOldProps(prop, props)); @@ -91,9 +85,11 @@ SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAlloc *alloc) void Lzma2Dec_Init(CLzma2Dec *p) { p->state = LZMA2_STATE_CONTROL; - p->needInitDic = True; - p->needInitState = True; - p->needInitProp = True; + p->needInitLevel = 0xE0; + p->isExtraMode = False; + p->unpackSize = 0; + + // p->decoder.dicPos = 0; // we can use it instead of full init LzmaDec_Init(&p->decoder); } @@ -102,19 +98,26 @@ static ELzma2State Lzma2Dec_UpdateState(CLzma2Dec *p, Byte b) switch (p->state) { case LZMA2_STATE_CONTROL: + p->isExtraMode = False; p->control = b; - PRF(printf("\n %4X ", (unsigned)p->decoder.dicPos)); - PRF(printf(" %2X", (unsigned)b)); - if (p->control == 0) + PRF(printf("\n %8X", (unsigned)p->decoder.dicPos)); + PRF(printf(" %02X", (unsigned)b)); + if (b == 0) return LZMA2_STATE_FINISHED; if (LZMA2_IS_UNCOMPRESSED_STATE(p)) { - if ((p->control & 0x7F) > 2) + if (b == LZMA2_CONTROL_COPY_RESET_DIC) + p->needInitLevel = 0xC0; + else if (b > 2 || p->needInitLevel == 0xE0) return LZMA2_STATE_ERROR; - p->unpackSize = 0; } else - p->unpackSize = (UInt32)(p->control & 0x1F) << 16; + { + if (b < p->needInitLevel) + return LZMA2_STATE_ERROR; + p->needInitLevel = 0; + p->unpackSize = (UInt32)(b & 0x1F) << 16; + } return LZMA2_STATE_UNPACK0; case LZMA2_STATE_UNPACK0: @@ -124,8 +127,8 @@ static ELzma2State Lzma2Dec_UpdateState(CLzma2Dec *p, Byte b) case LZMA2_STATE_UNPACK1: p->unpackSize |= (UInt32)b; p->unpackSize++; - PRF(printf(" %8u", (unsigned)p->unpackSize)); - return (LZMA2_IS_UNCOMPRESSED_STATE(p)) ? LZMA2_STATE_DATA : LZMA2_STATE_PACK0; + PRF(printf(" %7u", (unsigned)p->unpackSize)); + return LZMA2_IS_UNCOMPRESSED_STATE(p) ? LZMA2_STATE_DATA : LZMA2_STATE_PACK0; case LZMA2_STATE_PACK0: p->packSize = (UInt32)b << 8; @@ -134,9 +137,9 @@ static ELzma2State Lzma2Dec_UpdateState(CLzma2Dec *p, Byte b) case LZMA2_STATE_PACK1: p->packSize |= (UInt32)b; p->packSize++; - PRF(printf(" %8u", (unsigned)p->packSize)); - return LZMA2_IS_THERE_PROP(LZMA2_GET_LZMA_MODE(p)) ? LZMA2_STATE_PROP: - (p->needInitProp ? LZMA2_STATE_ERROR : LZMA2_STATE_DATA); + // if (p->packSize < 5) return LZMA2_STATE_ERROR; + PRF(printf(" %5u", (unsigned)p->packSize)); + return (p->control & 0x40) ? LZMA2_STATE_PROP : LZMA2_STATE_DATA; case LZMA2_STATE_PROP: { @@ -145,13 +148,12 @@ static ELzma2State Lzma2Dec_UpdateState(CLzma2Dec *p, Byte b) return LZMA2_STATE_ERROR; lc = b % 9; b /= 9; - p->decoder.prop.pb = b / 5; + p->decoder.prop.pb = (Byte)(b / 5); lp = b % 5; if (lc + lp > LZMA2_LCLP_MAX) return LZMA2_STATE_ERROR; - p->decoder.prop.lc = lc; - p->decoder.prop.lp = lp; - p->needInitProp = False; + p->decoder.prop.lc = (Byte)lc; + p->decoder.prop.lp = (Byte)lp; return LZMA2_STATE_DATA; } } @@ -169,6 +171,7 @@ static void LzmaDec_UpdateWithUncompressed(CLzmaDec *p, const Byte *src, SizeT s void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState); + SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) { @@ -176,12 +179,17 @@ SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, *srcLen = 0; *status = LZMA_STATUS_NOT_SPECIFIED; - while (p->state != LZMA2_STATE_FINISHED) + while (p->state != LZMA2_STATE_ERROR) { - SizeT dicPos = p->decoder.dicPos; + SizeT dicPos; + + if (p->state == LZMA2_STATE_FINISHED) + { + *status = LZMA_STATUS_FINISHED_WITH_MARK; + return SZ_OK; + } - if (p->state == LZMA2_STATE_ERROR) - return SZ_ERROR_DATA; + dicPos = p->decoder.dicPos; if (dicPos == dicLimit && finishMode == LZMA_FINISH_ANY) { @@ -198,29 +206,25 @@ SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, } (*srcLen)++; p->state = Lzma2Dec_UpdateState(p, *src++); - if (dicPos == dicLimit && p->state != LZMA2_STATE_FINISHED) - { - p->state = LZMA2_STATE_ERROR; - return SZ_ERROR_DATA; - } + break; continue; } { - SizeT destSizeCur = dicLimit - dicPos; - SizeT srcSizeCur = inSize - *srcLen; + SizeT inCur = inSize - *srcLen; + SizeT outCur = dicLimit - dicPos; ELzmaFinishMode curFinishMode = LZMA_FINISH_ANY; - if (p->unpackSize <= destSizeCur) + if (outCur >= p->unpackSize) { - destSizeCur = (SizeT)p->unpackSize; + outCur = (SizeT)p->unpackSize; curFinishMode = LZMA_FINISH_END; } if (LZMA2_IS_UNCOMPRESSED_STATE(p)) { - if (*srcLen == inSize) + if (inCur == 0) { *status = LZMA_STATUS_NEEDS_MORE_INPUT; return SZ_OK; @@ -229,134 +233,240 @@ SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, if (p->state == LZMA2_STATE_DATA) { Bool initDic = (p->control == LZMA2_CONTROL_COPY_RESET_DIC); - if (initDic) - p->needInitProp = p->needInitState = True; - else if (p->needInitDic) - { - p->state = LZMA2_STATE_ERROR; - return SZ_ERROR_DATA; - } - p->needInitDic = False; LzmaDec_InitDicAndState(&p->decoder, initDic, False); } - if (srcSizeCur > destSizeCur) - srcSizeCur = destSizeCur; + if (inCur > outCur) + inCur = outCur; + if (inCur == 0) + break; - if (srcSizeCur == 0) - { - p->state = LZMA2_STATE_ERROR; - return SZ_ERROR_DATA; - } + LzmaDec_UpdateWithUncompressed(&p->decoder, src, inCur); - LzmaDec_UpdateWithUncompressed(&p->decoder, src, srcSizeCur); - - src += srcSizeCur; - *srcLen += srcSizeCur; - p->unpackSize -= (UInt32)srcSizeCur; + src += inCur; + *srcLen += inCur; + p->unpackSize -= (UInt32)inCur; p->state = (p->unpackSize == 0) ? LZMA2_STATE_CONTROL : LZMA2_STATE_DATA_CONT; } else { - SizeT outSizeProcessed; SRes res; if (p->state == LZMA2_STATE_DATA) { - unsigned mode = LZMA2_GET_LZMA_MODE(p); - Bool initDic = (mode == 3); - Bool initState = (mode != 0); - if ((!initDic && p->needInitDic) || (!initState && p->needInitState)) - { - p->state = LZMA2_STATE_ERROR; - return SZ_ERROR_DATA; - } - + Bool initDic = (p->control >= 0xE0); + Bool initState = (p->control >= 0xA0); LzmaDec_InitDicAndState(&p->decoder, initDic, initState); - p->needInitDic = False; - p->needInitState = False; p->state = LZMA2_STATE_DATA_CONT; } - if (srcSizeCur > p->packSize) - srcSizeCur = (SizeT)p->packSize; - - res = LzmaDec_DecodeToDic(&p->decoder, dicPos + destSizeCur, src, &srcSizeCur, curFinishMode, status); + if (inCur > p->packSize) + inCur = (SizeT)p->packSize; - src += srcSizeCur; - *srcLen += srcSizeCur; - p->packSize -= (UInt32)srcSizeCur; + res = LzmaDec_DecodeToDic(&p->decoder, dicPos + outCur, src, &inCur, curFinishMode, status); - outSizeProcessed = p->decoder.dicPos - dicPos; - p->unpackSize -= (UInt32)outSizeProcessed; + src += inCur; + *srcLen += inCur; + p->packSize -= (UInt32)inCur; + outCur = p->decoder.dicPos - dicPos; + p->unpackSize -= (UInt32)outCur; - RINOK(res); + if (res != 0) + break; + if (*status == LZMA_STATUS_NEEDS_MORE_INPUT) - return res; + { + if (p->packSize == 0) + break; + return SZ_OK; + } - if (srcSizeCur == 0 && outSizeProcessed == 0) + if (inCur == 0 && outCur == 0) { if (*status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK || p->unpackSize != 0 || p->packSize != 0) - { - p->state = LZMA2_STATE_ERROR; - return SZ_ERROR_DATA; - } + break; p->state = LZMA2_STATE_CONTROL; } - if (*status == LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK) - *status = LZMA_STATUS_NOT_FINISHED; + *status = LZMA_STATUS_NOT_SPECIFIED; } } } - *status = LZMA_STATUS_FINISHED_WITH_MARK; - return SZ_OK; + *status = LZMA_STATUS_NOT_SPECIFIED; + p->state = LZMA2_STATE_ERROR; + return SZ_ERROR_DATA; } + + + +ELzma2ParseStatus Lzma2Dec_Parse(CLzma2Dec *p, + SizeT outSize, + const Byte *src, SizeT *srcLen, + int checkFinishBlock) +{ + SizeT inSize = *srcLen; + *srcLen = 0; + + while (p->state != LZMA2_STATE_ERROR) + { + if (p->state == LZMA2_STATE_FINISHED) + return (ELzma2ParseStatus)LZMA_STATUS_FINISHED_WITH_MARK; + + if (outSize == 0 && !checkFinishBlock) + return (ELzma2ParseStatus)LZMA_STATUS_NOT_FINISHED; + + if (p->state != LZMA2_STATE_DATA && p->state != LZMA2_STATE_DATA_CONT) + { + if (*srcLen == inSize) + return (ELzma2ParseStatus)LZMA_STATUS_NEEDS_MORE_INPUT; + (*srcLen)++; + + p->state = Lzma2Dec_UpdateState(p, *src++); + + if (p->state == LZMA2_STATE_UNPACK0) + { + // if (p->decoder.dicPos != 0) + if (p->control == LZMA2_CONTROL_COPY_RESET_DIC || p->control >= 0xE0) + return (ELzma2ParseStatus)LZMA2_PARSE_STATUS_NEW_BLOCK; + // if (outSize == 0) return LZMA_STATUS_NOT_FINISHED; + } + + // The following code can be commented. + // It's not big problem, if we read additional input bytes. + // It will be stopped later in LZMA2_STATE_DATA / LZMA2_STATE_DATA_CONT state. + + if (outSize == 0 && p->state != LZMA2_STATE_FINISHED) + { + // checkFinishBlock is true. So we expect that block must be finished, + // We can return LZMA_STATUS_NOT_SPECIFIED or LZMA_STATUS_NOT_FINISHED here + // break; + return (ELzma2ParseStatus)LZMA_STATUS_NOT_FINISHED; + } + + if (p->state == LZMA2_STATE_DATA) + return (ELzma2ParseStatus)LZMA2_PARSE_STATUS_NEW_CHUNK; + + continue; + } + + if (outSize == 0) + return (ELzma2ParseStatus)LZMA_STATUS_NOT_FINISHED; + + { + SizeT inCur = inSize - *srcLen; + + if (LZMA2_IS_UNCOMPRESSED_STATE(p)) + { + if (inCur == 0) + return (ELzma2ParseStatus)LZMA_STATUS_NEEDS_MORE_INPUT; + if (inCur > p->unpackSize) + inCur = p->unpackSize; + if (inCur > outSize) + inCur = outSize; + p->decoder.dicPos += inCur; + src += inCur; + *srcLen += inCur; + outSize -= inCur; + p->unpackSize -= (UInt32)inCur; + p->state = (p->unpackSize == 0) ? LZMA2_STATE_CONTROL : LZMA2_STATE_DATA_CONT; + } + else + { + p->isExtraMode = True; + + if (inCur == 0) + { + if (p->packSize != 0) + return (ELzma2ParseStatus)LZMA_STATUS_NEEDS_MORE_INPUT; + } + else if (p->state == LZMA2_STATE_DATA) + { + p->state = LZMA2_STATE_DATA_CONT; + if (*src != 0) + { + // first byte of lzma chunk must be Zero + *srcLen += 1; + p->packSize--; + break; + } + } + + if (inCur > p->packSize) + inCur = (SizeT)p->packSize; + + src += inCur; + *srcLen += inCur; + p->packSize -= (UInt32)inCur; + + if (p->packSize == 0) + { + SizeT rem = outSize; + if (rem > p->unpackSize) + rem = p->unpackSize; + p->decoder.dicPos += rem; + p->unpackSize -= (UInt32)rem; + outSize -= rem; + if (p->unpackSize == 0) + p->state = LZMA2_STATE_CONTROL; + } + } + } + } + + p->state = LZMA2_STATE_ERROR; + return (ELzma2ParseStatus)LZMA_STATUS_NOT_SPECIFIED; +} + + + + SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) { SizeT outSize = *destLen, inSize = *srcLen; *srcLen = *destLen = 0; + for (;;) { - SizeT srcSizeCur = inSize, outSizeCur, dicPos; + SizeT inCur = inSize, outCur, dicPos; ELzmaFinishMode curFinishMode; SRes res; + if (p->decoder.dicPos == p->decoder.dicBufSize) p->decoder.dicPos = 0; dicPos = p->decoder.dicPos; - if (outSize > p->decoder.dicBufSize - dicPos) + curFinishMode = LZMA_FINISH_ANY; + outCur = p->decoder.dicBufSize - dicPos; + + if (outCur >= outSize) { - outSizeCur = p->decoder.dicBufSize; - curFinishMode = LZMA_FINISH_ANY; - } - else - { - outSizeCur = dicPos + outSize; + outCur = outSize; curFinishMode = finishMode; } - res = Lzma2Dec_DecodeToDic(p, outSizeCur, src, &srcSizeCur, curFinishMode, status); - src += srcSizeCur; - inSize -= srcSizeCur; - *srcLen += srcSizeCur; - outSizeCur = p->decoder.dicPos - dicPos; - memcpy(dest, p->decoder.dic + dicPos, outSizeCur); - dest += outSizeCur; - outSize -= outSizeCur; - *destLen += outSizeCur; + res = Lzma2Dec_DecodeToDic(p, dicPos + outCur, src, &inCur, curFinishMode, status); + + src += inCur; + inSize -= inCur; + *srcLen += inCur; + outCur = p->decoder.dicPos - dicPos; + memcpy(dest, p->decoder.dic + dicPos, outCur); + dest += outCur; + outSize -= outCur; + *destLen += outCur; if (res != 0) return res; - if (outSizeCur == 0 || outSize == 0) + if (outCur == 0 || outSize == 0) return SZ_OK; } } + SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, - Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAlloc *alloc) + Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAllocPtr alloc) { CLzma2Dec p; SRes res; diff --git a/code/ryzom/client/src/seven_zip/Lzma2Dec.h b/code/ryzom/client/src/seven_zip/Lzma2Dec.h index e6a0f6ed6..b8ddeac89 100644 --- a/code/ryzom/client/src/seven_zip/Lzma2Dec.h +++ b/code/ryzom/client/src/seven_zip/Lzma2Dec.h @@ -1,5 +1,5 @@ /* Lzma2Dec.h -- LZMA2 Decoder -2015-05-13 : Igor Pavlov : Public domain */ +2018-02-19 : Igor Pavlov : Public domain */ #ifndef __LZMA2_DEC_H #define __LZMA2_DEC_H @@ -12,25 +12,24 @@ EXTERN_C_BEGIN typedef struct { - CLzmaDec decoder; - UInt32 packSize; - UInt32 unpackSize; unsigned state; Byte control; - Bool needInitDic; - Bool needInitState; - Bool needInitProp; + Byte needInitLevel; + Byte isExtraMode; + Byte _pad_; + UInt32 packSize; + UInt32 unpackSize; + CLzmaDec decoder; } CLzma2Dec; #define Lzma2Dec_Construct(p) LzmaDec_Construct(&(p)->decoder) -#define Lzma2Dec_FreeProbs(p, alloc) LzmaDec_FreeProbs(&(p)->decoder, alloc); -#define Lzma2Dec_Free(p, alloc) LzmaDec_Free(&(p)->decoder, alloc); +#define Lzma2Dec_FreeProbs(p, alloc) LzmaDec_FreeProbs(&(p)->decoder, alloc) +#define Lzma2Dec_Free(p, alloc) LzmaDec_Free(&(p)->decoder, alloc) -SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAlloc *alloc); -SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAlloc *alloc); +SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc); +SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc); void Lzma2Dec_Init(CLzma2Dec *p); - /* finishMode: It has meaning only if the decoding reaches output limit (*destLen or dicLimit). @@ -53,6 +52,47 @@ SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); +/* ---------- LZMA2 block and chunk parsing ---------- */ + +/* +Lzma2Dec_Parse() parses compressed data stream up to next independent block or next chunk data. +It can return LZMA_STATUS_* code or LZMA2_PARSE_STATUS_* code: + - LZMA2_PARSE_STATUS_NEW_BLOCK - there is new block, and 1 additional byte (control byte of next block header) was read from input. + - LZMA2_PARSE_STATUS_NEW_CHUNK - there is new chunk, and only lzma2 header of new chunk was read. + CLzma2Dec::unpackSize contains unpack size of that chunk +*/ + +typedef enum +{ +/* + LZMA_STATUS_NOT_SPECIFIED // data error + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED // + LZMA_STATUS_NEEDS_MORE_INPUT + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK // unused +*/ + LZMA2_PARSE_STATUS_NEW_BLOCK = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + 1, + LZMA2_PARSE_STATUS_NEW_CHUNK +} ELzma2ParseStatus; + +ELzma2ParseStatus Lzma2Dec_Parse(CLzma2Dec *p, + SizeT outSize, // output size + const Byte *src, SizeT *srcLen, + int checkFinishBlock // set (checkFinishBlock = 1), if it must read full input data, if decoder.dicPos reaches blockMax position. + ); + +/* +LZMA2 parser doesn't decode LZMA chunks, so we must read + full input LZMA chunk to decode some part of LZMA chunk. + +Lzma2Dec_GetUnpackExtra() returns the value that shows + max possible number of output bytes that can be output by decoder + at current input positon. +*/ + +#define Lzma2Dec_GetUnpackExtra(p) ((p)->isExtraMode ? (p)->unpackSize : 0); + + /* ---------- One Call Interface ---------- */ /* @@ -73,7 +113,7 @@ Returns: */ SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, - Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAlloc *alloc); + Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAllocPtr alloc); EXTERN_C_END diff --git a/code/ryzom/client/src/seven_zip/Lzma2Enc.cpp b/code/ryzom/client/src/seven_zip/Lzma2Enc.cpp index e6bae51b3..4b06d9111 100644 --- a/code/ryzom/client/src/seven_zip/Lzma2Enc.cpp +++ b/code/ryzom/client/src/seven_zip/Lzma2Enc.cpp @@ -1,9 +1,8 @@ /* Lzma2Enc.c -- LZMA2 Encoder -2015-10-04 : Igor Pavlov : Public domain */ +2018-04-27 : Igor Pavlov : Public domain */ #include "Precomp.h" -/* #include */ #include #define _7ZIP_ST @@ -13,7 +12,7 @@ #ifndef _7ZIP_ST #include "MtCoder.h" #else -#define NUM_MT_CODER_THREADS_MAX 1 +#define MTCODER__THREADS_MAX 1 #endif #define LZMA2_CONTROL_LZMA (1 << 7) @@ -35,34 +34,87 @@ #define PRF(x) /* x */ + +/* ---------- CLimitedSeqInStream ---------- */ + +typedef struct +{ + ISeqInStream vt; + ISeqInStream *realStream; + UInt64 limit; + UInt64 processed; + int finished; +} CLimitedSeqInStream; + +static void LimitedSeqInStream_Init(CLimitedSeqInStream *p) +{ + p->limit = (UInt64)(Int64)-1; + p->processed = 0; + p->finished = 0; +} + +static SRes LimitedSeqInStream_Read(const ISeqInStream *pp, void *data, size_t *size) +{ + CLimitedSeqInStream *p = CONTAINER_FROM_VTBL(pp, CLimitedSeqInStream, vt); + size_t size2 = *size; + SRes res = SZ_OK; + + if (p->limit != (UInt64)(Int64)-1) + { + UInt64 rem = p->limit - p->processed; + if (size2 > rem) + size2 = (size_t)rem; + } + if (size2 != 0) + { + res = ISeqInStream_Read(p->realStream, data, &size2); + p->finished = (size2 == 0 ? 1 : 0); + p->processed += size2; + } + *size = size2; + return res; +} + + /* ---------- CLzma2EncInt ---------- */ typedef struct { CLzmaEncHandle enc; + Byte propsAreSet; + Byte propsByte; + Byte needInitState; + Byte needInitProp; UInt64 srcPos; - Byte props; - Bool needInitState; - Bool needInitProp; } CLzma2EncInt; -static SRes Lzma2EncInt_Init(CLzma2EncInt *p, const CLzma2EncProps *props) + +static SRes Lzma2EncInt_InitStream(CLzma2EncInt *p, const CLzma2EncProps *props) { - Byte propsEncoded[LZMA_PROPS_SIZE]; - SizeT propsSize = LZMA_PROPS_SIZE; - RINOK(LzmaEnc_SetProps(p->enc, &props->lzmaProps)); - RINOK(LzmaEnc_WriteProperties(p->enc, propsEncoded, &propsSize)); - p->srcPos = 0; - p->props = propsEncoded[0]; - p->needInitState = True; - p->needInitProp = True; + if (!p->propsAreSet) + { + SizeT propsSize = LZMA_PROPS_SIZE; + Byte propsEncoded[LZMA_PROPS_SIZE]; + RINOK(LzmaEnc_SetProps(p->enc, &props->lzmaProps)); + RINOK(LzmaEnc_WriteProperties(p->enc, propsEncoded, &propsSize)); + p->propsByte = propsEncoded[0]; + p->propsAreSet = True; + } return SZ_OK; } +static void Lzma2EncInt_InitBlock(CLzma2EncInt *p) +{ + p->srcPos = 0; + p->needInitState = True; + p->needInitProp = True; +} + + SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, ISeqInStream *inStream, UInt32 keepWindowSize, - ISzAlloc *alloc, ISzAlloc *allocBig); + ISzAllocPtr alloc, ISzAllocPtr allocBig); SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, - UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig); + UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig); SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit, Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize); const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp); @@ -70,6 +122,9 @@ void LzmaEnc_Finish(CLzmaEncHandle pp); void LzmaEnc_SaveState(CLzmaEncHandle pp); void LzmaEnc_RestoreState(CLzmaEncHandle pp); +/* +UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp); +*/ static SRes Lzma2EncInt_EncodeSubblock(CLzma2EncInt *p, Byte *outBuf, size_t *packSizeRes, ISeqOutStream *outStream) @@ -126,7 +181,7 @@ static SRes Lzma2EncInt_EncodeSubblock(CLzma2EncInt *p, Byte *outBuf, if (outStream) { *packSizeRes += destPos; - if (outStream->Write(outStream, outBuf, destPos) != destPos) + if (ISeqOutStream_Write(outStream, outBuf, destPos) != destPos) return SZ_ERROR_WRITE; destPos = 0; } @@ -154,7 +209,7 @@ static SRes Lzma2EncInt_EncodeSubblock(CLzma2EncInt *p, Byte *outBuf, outBuf[destPos++] = (Byte)pm; if (p->needInitProp) - outBuf[destPos++] = p->props; + outBuf[destPos++] = p->propsByte; p->needInitProp = False; p->needInitState = False; @@ -162,7 +217,7 @@ static SRes Lzma2EncInt_EncodeSubblock(CLzma2EncInt *p, Byte *outBuf, p->srcPos += unpackSize; if (outStream) - if (outStream->Write(outStream, outBuf, destPos) != destPos) + if (ISeqOutStream_Write(outStream, outBuf, destPos) != destPos) return SZ_ERROR_WRITE; *packSizeRes = destPos; @@ -176,14 +231,16 @@ static SRes Lzma2EncInt_EncodeSubblock(CLzma2EncInt *p, Byte *outBuf, void Lzma2EncProps_Init(CLzma2EncProps *p) { LzmaEncProps_Init(&p->lzmaProps); + p->blockSize = LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO; + p->numBlockThreads_Reduced = -1; + p->numBlockThreads_Max = -1; p->numTotalThreads = -1; - p->numBlockThreads = -1; - p->blockSize = 0; } void Lzma2EncProps_Normalize(CLzma2EncProps *p) { - int t1, t1n, t2, t3; + UInt64 fileSize; + int t1, t1n, t2, t2r, t3; { CLzmaEncProps lzmaProps = p->lzmaProps; LzmaEncProps_Normalize(&lzmaProps); @@ -191,11 +248,11 @@ void Lzma2EncProps_Normalize(CLzma2EncProps *p) } t1 = p->lzmaProps.numThreads; - t2 = p->numBlockThreads; + t2 = p->numBlockThreads_Max; t3 = p->numTotalThreads; - if (t2 > NUM_MT_CODER_THREADS_MAX) - t2 = NUM_MT_CODER_THREADS_MAX; + if (t2 > MTCODER__THREADS_MAX) + t2 = MTCODER__THREADS_MAX; if (t3 <= 0) { @@ -211,8 +268,8 @@ void Lzma2EncProps_Normalize(CLzma2EncProps *p) t1 = 1; t2 = t3; } - if (t2 > NUM_MT_CODER_THREADS_MAX) - t2 = NUM_MT_CODER_THREADS_MAX; + if (t2 > MTCODER__THREADS_MAX) + t2 = MTCODER__THREADS_MAX; } else if (t1 <= 0) { @@ -225,46 +282,71 @@ void Lzma2EncProps_Normalize(CLzma2EncProps *p) p->lzmaProps.numThreads = t1; + t2r = t2; + + fileSize = p->lzmaProps.reduceSize; + + if ( p->blockSize != LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID + && p->blockSize != LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO + && (p->blockSize < fileSize || fileSize == (UInt64)(Int64)-1)) + p->lzmaProps.reduceSize = p->blockSize; + LzmaEncProps_Normalize(&p->lzmaProps); + p->lzmaProps.reduceSize = fileSize; + t1 = p->lzmaProps.numThreads; - if (p->blockSize == 0) + if (p->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID) { - UInt32 dictSize = p->lzmaProps.dictSize; - UInt64 blockSize = (UInt64)dictSize << 2; - const UInt32 kMinSize = (UInt32)1 << 20; - const UInt32 kMaxSize = (UInt32)1 << 28; - if (blockSize < kMinSize) blockSize = kMinSize; - if (blockSize > kMaxSize) blockSize = kMaxSize; - if (blockSize < dictSize) blockSize = dictSize; - p->blockSize = (size_t)blockSize; + t2r = t2 = 1; + t3 = t1; } - - if (t2 > 1 && p->lzmaProps.reduceSize != (UInt64)(Int64)-1) + else if (p->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO && t2 <= 1) { - UInt64 temp = p->lzmaProps.reduceSize + p->blockSize - 1; - if (temp > p->lzmaProps.reduceSize) + /* if there is no block multi-threading, we use SOLID block */ + p->blockSize = LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID; + } + else + { + if (p->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO) { - UInt64 numBlocks = temp / p->blockSize; + const UInt32 kMinSize = (UInt32)1 << 20; + const UInt32 kMaxSize = (UInt32)1 << 28; + const UInt32 dictSize = p->lzmaProps.dictSize; + UInt64 blockSize = (UInt64)dictSize << 2; + if (blockSize < kMinSize) blockSize = kMinSize; + if (blockSize > kMaxSize) blockSize = kMaxSize; + if (blockSize < dictSize) blockSize = dictSize; + blockSize += (kMinSize - 1); + blockSize &= ~(UInt64)(kMinSize - 1); + p->blockSize = blockSize; + } + + if (t2 > 1 && fileSize != (UInt64)(Int64)-1) + { + UInt64 numBlocks = fileSize / p->blockSize; + if (numBlocks * p->blockSize != fileSize) + numBlocks++; if (numBlocks < (unsigned)t2) { - t2 = (unsigned)numBlocks; - if (t2 == 0) - t2 = 1; - t3 = t1 * t2; + t2r = (unsigned)numBlocks; + if (t2r == 0) + t2r = 1; + t3 = t1 * t2r; } } } - p->numBlockThreads = t2; + p->numBlockThreads_Max = t2; + p->numBlockThreads_Reduced = t2r; p->numTotalThreads = t3; } static SRes Progress(ICompressProgress *p, UInt64 inSize, UInt64 outSize) { - return (p && p->Progress(p, inSize, outSize) != SZ_OK) ? SZ_ERROR_PROGRESS : SZ_OK; + return (p && ICompressProgress_Progress(p, inSize, outSize) != SZ_OK) ? SZ_ERROR_PROGRESS : SZ_OK; } @@ -274,180 +356,112 @@ typedef struct { Byte propEncoded; CLzma2EncProps props; + UInt64 expectedDataSize; - Byte *outBuf; + Byte *tempBufLzma; - ISzAlloc *alloc; - ISzAlloc *allocBig; + ISzAllocPtr alloc; + ISzAllocPtr allocBig; - CLzma2EncInt coders[NUM_MT_CODER_THREADS_MAX]; + CLzma2EncInt coders[MTCODER__THREADS_MAX]; #ifndef _7ZIP_ST + + ISeqOutStream *outStream; + Byte *outBuf; + size_t outBuf_Rem; /* remainder in outBuf */ + + size_t outBufSize; /* size of allocated outBufs[i] */ + size_t outBufsDataSizes[MTCODER__BLOCKS_MAX]; + Bool mtCoder_WasConstructed; CMtCoder mtCoder; + Byte *outBufs[MTCODER__BLOCKS_MAX]; + #endif } CLzma2Enc; -/* ---------- Lzma2EncThread ---------- */ -static SRes Lzma2Enc_EncodeMt1(CLzma2EncInt *p, CLzma2Enc *mainEncoder, - ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress) +CLzma2EncHandle Lzma2Enc_Create(ISzAllocPtr alloc, ISzAllocPtr allocBig) { - UInt64 packTotal = 0; - SRes res = SZ_OK; - - if (!mainEncoder->outBuf) - { - mainEncoder->outBuf = (Byte *)IAlloc_Alloc(mainEncoder->alloc, LZMA2_CHUNK_SIZE_COMPRESSED_MAX); - if (!mainEncoder->outBuf) - return SZ_ERROR_MEM; - } - - RINOK(Lzma2EncInt_Init(p, &mainEncoder->props)); - RINOK(LzmaEnc_PrepareForLzma2(p->enc, inStream, LZMA2_KEEP_WINDOW_SIZE, - mainEncoder->alloc, mainEncoder->allocBig)); - - for (;;) - { - size_t packSize = LZMA2_CHUNK_SIZE_COMPRESSED_MAX; - res = Lzma2EncInt_EncodeSubblock(p, mainEncoder->outBuf, &packSize, outStream); - if (res != SZ_OK) - break; - packTotal += packSize; - res = Progress(progress, p->srcPos, packTotal); - if (res != SZ_OK) - break; - if (packSize == 0) - break; - } - - LzmaEnc_Finish(p->enc); - - if (res == SZ_OK) - { - Byte b = 0; - if (outStream->Write(outStream, &b, 1) != 1) - return SZ_ERROR_WRITE; - } - - return res; -} - - -#ifndef _7ZIP_ST - -typedef struct -{ - IMtCoderCallback funcTable; - CLzma2Enc *lzma2Enc; -} CMtCallbackImp; - -static SRes MtCallbackImp_Code(void *pp, unsigned index, Byte *dest, size_t *destSize, - const Byte *src, size_t srcSize, int finished) -{ - CMtCallbackImp *imp = (CMtCallbackImp *)pp; - CLzma2Enc *mainEncoder = imp->lzma2Enc; - CLzma2EncInt *p = &mainEncoder->coders[index]; - - SRes res = SZ_OK; - { - size_t destLim = *destSize; - *destSize = 0; - - if (srcSize != 0) - { - RINOK(Lzma2EncInt_Init(p, &mainEncoder->props)); - - RINOK(LzmaEnc_MemPrepare(p->enc, src, srcSize, LZMA2_KEEP_WINDOW_SIZE, - mainEncoder->alloc, mainEncoder->allocBig)); - - while (p->srcPos < srcSize) - { - size_t packSize = destLim - *destSize; - res = Lzma2EncInt_EncodeSubblock(p, dest + *destSize, &packSize, NULL); - if (res != SZ_OK) - break; - *destSize += packSize; - - if (packSize == 0) - { - res = SZ_ERROR_FAIL; - break; - } - - if (MtProgress_Set(&mainEncoder->mtCoder.mtProgress, index, p->srcPos, *destSize) != SZ_OK) - { - res = SZ_ERROR_PROGRESS; - break; - } - } - - LzmaEnc_Finish(p->enc); - if (res != SZ_OK) - return res; - } - - if (finished) - { - if (*destSize == destLim) - return SZ_ERROR_OUTPUT_EOF; - dest[(*destSize)++] = 0; - } - } - return res; -} - -#endif - - -/* ---------- Lzma2Enc ---------- */ - -CLzma2EncHandle Lzma2Enc_Create(ISzAlloc *alloc, ISzAlloc *allocBig) -{ - CLzma2Enc *p = (CLzma2Enc *)alloc->Alloc(alloc, sizeof(CLzma2Enc)); + CLzma2Enc *p = (CLzma2Enc *)ISzAlloc_Alloc(alloc, sizeof(CLzma2Enc)); if (!p) return NULL; Lzma2EncProps_Init(&p->props); Lzma2EncProps_Normalize(&p->props); - p->outBuf = 0; + p->expectedDataSize = (UInt64)(Int64)-1; + p->tempBufLzma = NULL; p->alloc = alloc; p->allocBig = allocBig; { unsigned i; - for (i = 0; i < NUM_MT_CODER_THREADS_MAX; i++) - p->coders[i].enc = 0; + for (i = 0; i < MTCODER__THREADS_MAX; i++) + p->coders[i].enc = NULL; } #ifndef _7ZIP_ST - MtCoder_Construct(&p->mtCoder); + p->mtCoder_WasConstructed = False; + { + unsigned i; + for (i = 0; i < MTCODER__BLOCKS_MAX; i++) + p->outBufs[i] = NULL; + p->outBufSize = 0; + } #endif return p; } + +#ifndef _7ZIP_ST + +static void Lzma2Enc_FreeOutBufs(CLzma2Enc *p) +{ + unsigned i; + for (i = 0; i < MTCODER__BLOCKS_MAX; i++) + if (p->outBufs[i]) + { + ISzAlloc_Free(p->alloc, p->outBufs[i]); + p->outBufs[i] = NULL; + } + p->outBufSize = 0; +} + +#endif + + void Lzma2Enc_Destroy(CLzma2EncHandle pp) { CLzma2Enc *p = (CLzma2Enc *)pp; unsigned i; - for (i = 0; i < NUM_MT_CODER_THREADS_MAX; i++) + for (i = 0; i < MTCODER__THREADS_MAX; i++) { CLzma2EncInt *t = &p->coders[i]; if (t->enc) { LzmaEnc_Destroy(t->enc, p->alloc, p->allocBig); - t->enc = 0; + t->enc = NULL; } } + #ifndef _7ZIP_ST - MtCoder_Destruct(&p->mtCoder); + if (p->mtCoder_WasConstructed) + { + MtCoder_Destruct(&p->mtCoder); + p->mtCoder_WasConstructed = False; + } + Lzma2Enc_FreeOutBufs(p); #endif - IAlloc_Free(p->alloc, p->outBuf); - IAlloc_Free(p->alloc, pp); + ISzAlloc_Free(p->alloc, p->tempBufLzma); + p->tempBufLzma = NULL; + + ISzAlloc_Free(p->alloc, pp); } + SRes Lzma2Enc_SetProps(CLzma2EncHandle pp, const CLzma2EncProps *props) { CLzma2Enc *p = (CLzma2Enc *)pp; @@ -460,6 +474,14 @@ SRes Lzma2Enc_SetProps(CLzma2EncHandle pp, const CLzma2EncProps *props) return SZ_OK; } + +void Lzma2Enc_SetDataSize(CLzmaEncHandle pp, UInt64 expectedDataSiize) +{ + CLzma2Enc *p = (CLzma2Enc *)pp; + p->expectedDataSize = expectedDataSiize; +} + + Byte Lzma2Enc_WriteProperties(CLzma2EncHandle pp) { CLzma2Enc *p = (CLzma2Enc *)pp; @@ -471,50 +493,311 @@ Byte Lzma2Enc_WriteProperties(CLzma2EncHandle pp) return (Byte)i; } -SRes Lzma2Enc_Encode(CLzma2EncHandle pp, - ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress) -{ - CLzma2Enc *p = (CLzma2Enc *)pp; - int i; - for (i = 0; i < p->props.numBlockThreads; i++) +static SRes Lzma2Enc_EncodeMt1( + CLzma2Enc *me, + CLzma2EncInt *p, + ISeqOutStream *outStream, + Byte *outBuf, size_t *outBufSize, + ISeqInStream *inStream, + const Byte *inData, size_t inDataSize, + int finished, + ICompressProgress *progress) +{ + UInt64 unpackTotal = 0; + UInt64 packTotal = 0; + size_t outLim = 0; + CLimitedSeqInStream limitedInStream; + + if (outBuf) { - CLzma2EncInt *t = &p->coders[(unsigned)i]; - if (!t->enc) + outLim = *outBufSize; + *outBufSize = 0; + } + + if (!p->enc) + { + p->propsAreSet = False; + p->enc = LzmaEnc_Create(me->alloc); + if (!p->enc) + return SZ_ERROR_MEM; + } + + limitedInStream.realStream = inStream; + if (inStream) + { + limitedInStream.vt.Read = LimitedSeqInStream_Read; + } + + if (!outBuf) + { + // outStream version works only in one thread. So we use CLzma2Enc::tempBufLzma + if (!me->tempBufLzma) { - t->enc = LzmaEnc_Create(p->alloc); - if (!t->enc) + me->tempBufLzma = (Byte *)ISzAlloc_Alloc(me->alloc, LZMA2_CHUNK_SIZE_COMPRESSED_MAX); + if (!me->tempBufLzma) return SZ_ERROR_MEM; } } - #ifndef _7ZIP_ST - if (p->props.numBlockThreads > 1) - { - CMtCallbackImp mtCallback; + RINOK(Lzma2EncInt_InitStream(p, &me->props)); - mtCallback.funcTable.Code = MtCallbackImp_Code; - mtCallback.lzma2Enc = p; + for (;;) + { + SRes res = SZ_OK; + size_t inSizeCur = 0; + + Lzma2EncInt_InitBlock(p); + LimitedSeqInStream_Init(&limitedInStream); + limitedInStream.limit = me->props.blockSize; + + if (inStream) + { + UInt64 expected = (UInt64)(Int64)-1; + // inStream version works only in one thread. So we use CLzma2Enc::expectedDataSize + if (me->expectedDataSize != (UInt64)(Int64)-1 + && me->expectedDataSize >= unpackTotal) + expected = me->expectedDataSize - unpackTotal; + if (me->props.blockSize != LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID + && expected > me->props.blockSize) + expected = (size_t)me->props.blockSize; + + LzmaEnc_SetDataSize(p->enc, expected); + + RINOK(LzmaEnc_PrepareForLzma2(p->enc, + &limitedInStream.vt, + LZMA2_KEEP_WINDOW_SIZE, + me->alloc, + me->allocBig)); + } + else + { + inSizeCur = inDataSize - (size_t)unpackTotal; + if (me->props.blockSize != LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID + && inSizeCur > me->props.blockSize) + inSizeCur = (size_t)me->props.blockSize; + + // LzmaEnc_SetDataSize(p->enc, inSizeCur); + + RINOK(LzmaEnc_MemPrepare(p->enc, + inData + (size_t)unpackTotal, inSizeCur, + LZMA2_KEEP_WINDOW_SIZE, + me->alloc, + me->allocBig)); + } + + for (;;) + { + size_t packSize = LZMA2_CHUNK_SIZE_COMPRESSED_MAX; + if (outBuf) + packSize = outLim - (size_t)packTotal; + + res = Lzma2EncInt_EncodeSubblock(p, + outBuf ? outBuf + (size_t)packTotal : me->tempBufLzma, &packSize, + outBuf ? NULL : outStream); + + if (res != SZ_OK) + break; + + packTotal += packSize; + if (outBuf) + *outBufSize = (size_t)packTotal; + + res = Progress(progress, unpackTotal + p->srcPos, packTotal); + if (res != SZ_OK) + break; + + /* + if (LzmaEnc_GetNumAvailableBytes(p->enc) == 0) + break; + */ + + if (packSize == 0) + break; + } + + LzmaEnc_Finish(p->enc); + + unpackTotal += p->srcPos; + + RINOK(res); + + if (p->srcPos != (inStream ? limitedInStream.processed : inSizeCur)) + return SZ_ERROR_FAIL; + + if (inStream ? limitedInStream.finished : (unpackTotal == inDataSize)) + { + if (finished) + { + if (outBuf) + { + size_t destPos = *outBufSize; + if (destPos >= outLim) + return SZ_ERROR_OUTPUT_EOF; + outBuf[destPos] = 0; + *outBufSize = destPos + 1; + } + else + { + Byte b = 0; + if (ISeqOutStream_Write(outStream, &b, 1) != 1) + return SZ_ERROR_WRITE; + } + } + return SZ_OK; + } + } +} + + + +#ifndef _7ZIP_ST + +static SRes Lzma2Enc_MtCallback_Code(void *pp, unsigned coderIndex, unsigned outBufIndex, + const Byte *src, size_t srcSize, int finished) +{ + CLzma2Enc *me = (CLzma2Enc *)pp; + size_t destSize = me->outBufSize; + SRes res; + CMtProgressThunk progressThunk; + + Byte *dest = me->outBufs[outBufIndex]; + + me->outBufsDataSizes[outBufIndex] = 0; + + if (!dest) + { + dest = (Byte *)ISzAlloc_Alloc(me->alloc, me->outBufSize); + if (!dest) + return SZ_ERROR_MEM; + me->outBufs[outBufIndex] = dest; + } + + MtProgressThunk_CreateVTable(&progressThunk); + progressThunk.mtProgress = &me->mtCoder.mtProgress; + progressThunk.inSize = 0; + progressThunk.outSize = 0; + + res = Lzma2Enc_EncodeMt1(me, + &me->coders[coderIndex], + NULL, dest, &destSize, + NULL, src, srcSize, + finished, + &progressThunk.vt); + + me->outBufsDataSizes[outBufIndex] = destSize; + + return res; +} + + +static SRes Lzma2Enc_MtCallback_Write(void *pp, unsigned outBufIndex) +{ + CLzma2Enc *me = (CLzma2Enc *)pp; + size_t size = me->outBufsDataSizes[outBufIndex]; + const Byte *data = me->outBufs[outBufIndex]; + + if (me->outStream) + return ISeqOutStream_Write(me->outStream, data, size) == size ? SZ_OK : SZ_ERROR_WRITE; + + if (size > me->outBuf_Rem) + return SZ_ERROR_OUTPUT_EOF; + memcpy(me->outBuf, data, size); + me->outBuf_Rem -= size; + me->outBuf += size; + return SZ_OK; +} + +#endif + + + +SRes Lzma2Enc_Encode2(CLzma2EncHandle pp, + ISeqOutStream *outStream, + Byte *outBuf, size_t *outBufSize, + ISeqInStream *inStream, + const Byte *inData, size_t inDataSize, + ICompressProgress *progress) +{ + CLzma2Enc *p = (CLzma2Enc *)pp; + + if (inStream && inData) + return SZ_ERROR_PARAM; + + if (outStream && outBuf) + return SZ_ERROR_PARAM; + + { + unsigned i; + for (i = 0; i < MTCODER__THREADS_MAX; i++) + p->coders[i].propsAreSet = False; + } + + #ifndef _7ZIP_ST + + if (p->props.numBlockThreads_Reduced > 1) + { + IMtCoderCallback2 vt; + + if (!p->mtCoder_WasConstructed) + { + p->mtCoder_WasConstructed = True; + MtCoder_Construct(&p->mtCoder); + } + + vt.Code = Lzma2Enc_MtCallback_Code; + vt.Write = Lzma2Enc_MtCallback_Write; + + p->outStream = outStream; + p->outBuf = NULL; + p->outBuf_Rem = 0; + if (!outStream) + { + p->outBuf = outBuf; + p->outBuf_Rem = *outBufSize; + *outBufSize = 0; + } + + p->mtCoder.allocBig = p->allocBig; p->mtCoder.progress = progress; p->mtCoder.inStream = inStream; - p->mtCoder.outStream = outStream; - p->mtCoder.alloc = p->alloc; - p->mtCoder.mtCallback = &mtCallback.funcTable; + p->mtCoder.inData = inData; + p->mtCoder.inDataSize = inDataSize; + p->mtCoder.mtCallback = &vt; + p->mtCoder.mtCallbackObject = p; + + p->mtCoder.blockSize = (size_t)p->props.blockSize; + if (p->mtCoder.blockSize != p->props.blockSize) + return SZ_ERROR_PARAM; /* SZ_ERROR_MEM */ - p->mtCoder.blockSize = p->props.blockSize; - p->mtCoder.destBlockSize = p->props.blockSize + (p->props.blockSize >> 10) + 16; - if (p->mtCoder.destBlockSize < p->props.blockSize) { - p->mtCoder.destBlockSize = (size_t)0 - 1; - if (p->mtCoder.destBlockSize < p->props.blockSize) - return SZ_ERROR_FAIL; + size_t destBlockSize = p->mtCoder.blockSize + (p->mtCoder.blockSize >> 10) + 16; + if (destBlockSize < p->mtCoder.blockSize) + return SZ_ERROR_PARAM; + if (p->outBufSize != destBlockSize) + Lzma2Enc_FreeOutBufs(p); + p->outBufSize = destBlockSize; } - p->mtCoder.numThreads = p->props.numBlockThreads; + + p->mtCoder.numThreadsMax = p->props.numBlockThreads_Max; + p->mtCoder.expectedDataSize = p->expectedDataSize; - return MtCoder_Code(&p->mtCoder); + { + SRes res = MtCoder_Code(&p->mtCoder); + if (!outStream) + *outBufSize = p->outBuf - outBuf; + return res; + } } + #endif - return Lzma2Enc_EncodeMt1(&p->coders[0], p, outStream, inStream, progress); + + return Lzma2Enc_EncodeMt1(p, + &p->coders[0], + outStream, outBuf, outBufSize, + inStream, inData, inDataSize, + True, /* finished */ + progress); } diff --git a/code/ryzom/client/src/seven_zip/Lzma2Enc.h b/code/ryzom/client/src/seven_zip/Lzma2Enc.h index f409f184c..6a6110ff7 100644 --- a/code/ryzom/client/src/seven_zip/Lzma2Enc.h +++ b/code/ryzom/client/src/seven_zip/Lzma2Enc.h @@ -1,5 +1,5 @@ /* Lzma2Enc.h -- LZMA2 Encoder -2013-01-18 : Igor Pavlov : Public domain */ +2017-07-27 : Igor Pavlov : Public domain */ #ifndef __LZMA2_ENC_H #define __LZMA2_ENC_H @@ -8,11 +8,15 @@ EXTERN_C_BEGIN +#define LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO 0 +#define LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID ((UInt64)(Int64)-1) + typedef struct { CLzmaEncProps lzmaProps; - size_t blockSize; - int numBlockThreads; + UInt64 blockSize; + int numBlockThreads_Reduced; + int numBlockThreads_Max; int numTotalThreads; } CLzma2EncProps; @@ -22,40 +26,29 @@ void Lzma2EncProps_Normalize(CLzma2EncProps *p); /* ---------- CLzmaEnc2Handle Interface ---------- */ /* Lzma2Enc_* functions can return the following exit codes: -Returns: +SRes: SZ_OK - OK SZ_ERROR_MEM - Memory allocation error SZ_ERROR_PARAM - Incorrect paramater in props - SZ_ERROR_WRITE - Write callback error + SZ_ERROR_WRITE - ISeqOutStream write callback error + SZ_ERROR_OUTPUT_EOF - output buffer overflow - version with (Byte *) output SZ_ERROR_PROGRESS - some break from progress callback - SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) + SZ_ERROR_THREAD - error in multithreading functions (only for Mt version) */ typedef void * CLzma2EncHandle; -CLzma2EncHandle Lzma2Enc_Create(ISzAlloc *alloc, ISzAlloc *allocBig); +CLzma2EncHandle Lzma2Enc_Create(ISzAllocPtr alloc, ISzAllocPtr allocBig); void Lzma2Enc_Destroy(CLzma2EncHandle p); SRes Lzma2Enc_SetProps(CLzma2EncHandle p, const CLzma2EncProps *props); +void Lzma2Enc_SetDataSize(CLzma2EncHandle p, UInt64 expectedDataSiize); Byte Lzma2Enc_WriteProperties(CLzma2EncHandle p); -SRes Lzma2Enc_Encode(CLzma2EncHandle p, - ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress); - -/* ---------- One Call Interface ---------- */ - -/* Lzma2Encode -Return code: - SZ_OK - OK - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_PARAM - Incorrect paramater - SZ_ERROR_OUTPUT_EOF - output buffer overflow - SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) -*/ - -/* -SRes Lzma2Encode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, - const CLzmaEncProps *props, Byte *propsEncoded, int writeEndMark, - ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); -*/ +SRes Lzma2Enc_Encode2(CLzma2EncHandle p, + ISeqOutStream *outStream, + Byte *outBuf, size_t *outBufSize, + ISeqInStream *inStream, + const Byte *inData, size_t inDataSize, + ICompressProgress *progress); EXTERN_C_END diff --git a/code/ryzom/client/src/seven_zip/LzmaDec.cpp b/code/ryzom/client/src/seven_zip/LzmaDec.cpp index 12dce11fb..cccb93267 100644 --- a/code/ryzom/client/src/seven_zip/LzmaDec.cpp +++ b/code/ryzom/client/src/seven_zip/LzmaDec.cpp @@ -1,8 +1,9 @@ /* LzmaDec.c -- LZMA Decoder -2016-05-16 : Igor Pavlov : Public domain */ +2018-02-28 : Igor Pavlov : Public domain */ #include "Precomp.h" +/* #include "CpuArch.h" */ #include "LzmaDec.h" #include @@ -24,9 +25,16 @@ #define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \ { UPDATE_0(p); i = (i + i); A0; } else \ { UPDATE_1(p); i = (i + i) + 1; A1; } -#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;) -#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); } +#define TREE_GET_BIT(probs, i) { GET_BIT2(probs + i, i, ;, ;); } + +#define REV_BIT(p, i, A0, A1) IF_BIT_0(p + i) \ + { UPDATE_0(p + i); A0; } else \ + { UPDATE_1(p + i); A1; } +#define REV_BIT_VAR( p, i, m) REV_BIT(p, i, i += m; m += m, m += m; i += m; ) +#define REV_BIT_CONST(p, i, m) REV_BIT(p, i, i += m; , i += m * 2; ) +#define REV_BIT_LAST( p, i, m) REV_BIT(p, i, i -= m , ; ) + #define TREE_DECODE(probs, limit, i) \ { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; } @@ -46,12 +54,15 @@ i -= 0x40; } #endif -#define NORMAL_LITER_DEC GET_BIT(prob + symbol, symbol) +#define NORMAL_LITER_DEC TREE_GET_BIT(prob, symbol) #define MATCHED_LITER_DEC \ - matchByte <<= 1; \ - bit = (matchByte & offs); \ - probLit = prob + offs + bit + symbol; \ - GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit) + matchByte += matchByte; \ + bit = offs; \ + offs &= matchByte; \ + probLit = prob + (offs + bit + symbol); \ + GET_BIT2(probLit, symbol, offs ^= bit; , ;) + + #define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); } @@ -66,25 +77,28 @@ { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; } +#define REV_BIT_CHECK(p, i, m) IF_BIT_0_CHECK(p + i) \ + { UPDATE_0_CHECK; i += m; m += m; } else \ + { UPDATE_1_CHECK; m += m; i += m; } + + #define kNumPosBitsMax 4 #define kNumPosStatesMax (1 << kNumPosBitsMax) #define kLenNumLowBits 3 #define kLenNumLowSymbols (1 << kLenNumLowBits) -#define kLenNumMidBits 3 -#define kLenNumMidSymbols (1 << kLenNumMidBits) #define kLenNumHighBits 8 #define kLenNumHighSymbols (1 << kLenNumHighBits) -#define LenChoice 0 -#define LenChoice2 (LenChoice + 1) -#define LenLow (LenChoice2 + 1) -#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits)) -#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits)) +#define LenLow 0 +#define LenHigh (LenLow + 2 * (kNumPosStatesMax << kLenNumLowBits)) #define kNumLenProbs (LenHigh + kLenNumHighSymbols) +#define LenChoice LenLow +#define LenChoice2 (LenLow + (1 << kLenNumLowBits)) #define kNumStates 12 +#define kNumStates2 16 #define kNumLitStates 7 #define kStartPosModelIndex 4 @@ -98,54 +112,117 @@ #define kAlignTableSize (1 << kNumAlignBits) #define kMatchMinLen 2 -#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) +#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols * 2 + kLenNumHighSymbols) -#define IsMatch 0 -#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax)) +/* External ASM code needs same CLzmaProb array layout. So don't change it. */ + +/* (probs_1664) is faster and better for code size at some platforms */ +/* +#ifdef MY_CPU_X86_OR_AMD64 +*/ +#define kStartOffset 1664 +#define GET_PROBS p->probs_1664 +/* +#define GET_PROBS p->probs + kStartOffset +#else +#define kStartOffset 0 +#define GET_PROBS p->probs +#endif +*/ + +#define SpecPos (-kStartOffset) +#define IsRep0Long (SpecPos + kNumFullDistances) +#define RepLenCoder (IsRep0Long + (kNumStates2 << kNumPosBitsMax)) +#define LenCoder (RepLenCoder + kNumLenProbs) +#define IsMatch (LenCoder + kNumLenProbs) +#define Align (IsMatch + (kNumStates2 << kNumPosBitsMax)) +#define IsRep (Align + kAlignTableSize) #define IsRepG0 (IsRep + kNumStates) #define IsRepG1 (IsRepG0 + kNumStates) #define IsRepG2 (IsRepG1 + kNumStates) -#define IsRep0Long (IsRepG2 + kNumStates) -#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax)) -#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) -#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex) -#define LenCoder (Align + kAlignTableSize) -#define RepLenCoder (LenCoder + kNumLenProbs) -#define Literal (RepLenCoder + kNumLenProbs) +#define PosSlot (IsRepG2 + kNumStates) +#define Literal (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) +#define NUM_BASE_PROBS (Literal + kStartOffset) -#define LZMA_BASE_SIZE 1846 -#define LZMA_LIT_SIZE 0x300 - -#if Literal != LZMA_BASE_SIZE -StopCompilingDueBUG +#if Align != 0 && kStartOffset != 0 + #error Stop_Compiling_Bad_LZMA_kAlign #endif -#define LzmaProps_GetNumProbs(p) (Literal + ((UInt32)LZMA_LIT_SIZE << ((p)->lc + (p)->lp))) +#if NUM_BASE_PROBS != 1984 + #error Stop_Compiling_Bad_LZMA_PROBS +#endif + + +#define LZMA_LIT_SIZE 0x300 + +#define LzmaProps_GetNumProbs(p) (NUM_BASE_PROBS + ((UInt32)LZMA_LIT_SIZE << ((p)->lc + (p)->lp))) + + +#define CALC_POS_STATE(processedPos, pbMask) (((processedPos) & (pbMask)) << 4) +#define COMBINED_PS_STATE (posState + state) +#define GET_LEN_STATE (posState) #define LZMA_DIC_MIN (1 << 12) -/* First LZMA-symbol is always decoded. -And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization +/* +p->remainLen : shows status of LZMA decoder: + < kMatchSpecLenStart : normal remain + = kMatchSpecLenStart : finished + = kMatchSpecLenStart + 1 : need init range coder + = kMatchSpecLenStart + 2 : need init range coder and state +*/ + +/* ---------- LZMA_DECODE_REAL ---------- */ +/* +LzmaDec_DecodeReal_3() can be implemented in external ASM file. +3 - is the code compatibility version of that function for check at link time. +*/ + +#define LZMA_DECODE_REAL LzmaDec_DecodeReal_3 + +/* +LZMA_DECODE_REAL() +In: + RangeCoder is normalized + if (p->dicPos == limit) + { + LzmaDec_TryDummy() was called before to exclude LITERAL and MATCH-REP cases. + So first symbol can be only MATCH-NON-REP. And if that MATCH-NON-REP symbol + is not END_OF_PAYALOAD_MARKER, then function returns error code. + } + +Processing: + first LZMA symbol will be decoded in any case + All checks for limits are at the end of main loop, + It will decode new LZMA-symbols while (p->buf < bufLimit && dicPos < limit), + RangeCoder is still without last normalization when (p->buf < bufLimit) is being checked. + Out: + RangeCoder is normalized Result: SZ_OK - OK SZ_ERROR_DATA - Error p->remainLen: < kMatchSpecLenStart : normal remain = kMatchSpecLenStart : finished - = kMatchSpecLenStart + 1 : Flush marker (unused now) - = kMatchSpecLenStart + 2 : State Init Marker (unused now) */ -static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit) -{ - CLzmaProb *probs = p->probs; - unsigned state = p->state; +#ifdef _LZMA_DEC_OPT + +int MY_FAST_CALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit); + +#else + +static +int MY_FAST_CALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit) +{ + CLzmaProb *probs = GET_PROBS; + unsigned state = (unsigned)p->state; UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3]; unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1; - unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1; unsigned lc = p->prop.lc; + unsigned lpMask = ((unsigned)0x100 << p->prop.lp) - ((unsigned)0x100 >> lc); Byte *dic = p->dic; SizeT dicBufSize = p->dicBufSize; @@ -164,17 +241,16 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte CLzmaProb *prob; UInt32 bound; unsigned ttt; - unsigned posState = processedPos & pbMask; + unsigned posState = CALC_POS_STATE(processedPos, pbMask); - prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; + prob = probs + IsMatch + COMBINED_PS_STATE; IF_BIT_0(prob) { unsigned symbol; UPDATE_0(prob); prob = probs + Literal; if (processedPos != 0 || checkDicSize != 0) - prob += ((UInt32)LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) + - (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc)))); + prob += (UInt32)3 * ((((processedPos << 8) + dic[(dicPos == 0 ? dicBufSize : dicPos) - 1]) & lpMask) << lc); processedPos++; if (state < kNumLitStates) @@ -240,13 +316,16 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte else { UPDATE_1(prob); + /* + // that case was checked before with kBadRepCode if (checkDicSize == 0 && processedPos == 0) return SZ_ERROR_DATA; + */ prob = probs + IsRepG0 + state; IF_BIT_0(prob) { UPDATE_0(prob); - prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; + prob = probs + IsRep0Long + COMBINED_PS_STATE; IF_BIT_0(prob) { UPDATE_0(prob); @@ -299,7 +378,7 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte IF_BIT_0(probLen) { UPDATE_0(probLen); - probLen = prob + LenLow + (posState << kLenNumLowBits); + probLen = prob + LenLow + GET_LEN_STATE; offset = 0; lim = (1 << kLenNumLowBits); } @@ -310,15 +389,15 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte IF_BIT_0(probLen) { UPDATE_0(probLen); - probLen = prob + LenMid + (posState << kLenNumMidBits); + probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits); offset = kLenNumLowSymbols; - lim = (1 << kLenNumMidBits); + lim = (1 << kLenNumLowBits); } else { UPDATE_1(probLen); probLen = prob + LenHigh; - offset = kLenNumLowSymbols + kLenNumMidSymbols; + offset = kLenNumLowSymbols * 2; lim = (1 << kLenNumHighBits); } } @@ -331,7 +410,7 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte IF_BIT_0(probLen) { UPDATE_0(probLen); - probLen = prob + LenLow + (posState << kLenNumLowBits); + probLen = prob + LenLow + GET_LEN_STATE; len = 1; TREE_GET_BIT(probLen, len); TREE_GET_BIT(probLen, len); @@ -345,7 +424,7 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte IF_BIT_0(probLen) { UPDATE_0(probLen); - probLen = prob + LenMid + (posState << kLenNumMidBits); + probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits); len = 1; TREE_GET_BIT(probLen, len); TREE_GET_BIT(probLen, len); @@ -356,7 +435,7 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte UPDATE_1(probLen); probLen = prob + LenHigh; TREE_DECODE(probLen, (1 << kLenNumHighBits), len); - len += kLenNumLowSymbols + kLenNumMidSymbols; + len += kLenNumLowSymbols * 2; } } } @@ -376,16 +455,16 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte if (posSlot < kEndPosModelIndex) { distance <<= numDirectBits; - prob = probs + SpecPos + distance - posSlot - 1; + prob = probs + SpecPos; { - UInt32 mask = 1; - unsigned i = 1; + UInt32 m = 1; + distance++; do { - GET_BIT2(prob + i, i, ; , distance |= mask); - mask <<= 1; + REV_BIT_VAR(prob, distance, m); } - while (--numDirectBits != 0); + while (--numDirectBits); + distance -= m; } } else @@ -412,19 +491,20 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte } */ } - while (--numDirectBits != 0); + while (--numDirectBits); prob = probs + Align; distance <<= kNumAlignBits; { unsigned i = 1; - GET_BIT2(prob + i, i, ; , distance |= 1); - GET_BIT2(prob + i, i, ; , distance |= 2); - GET_BIT2(prob + i, i, ; , distance |= 4); - GET_BIT2(prob + i, i, ; , distance |= 8); + REV_BIT_CONST(prob, i, 1); + REV_BIT_CONST(prob, i, 2); + REV_BIT_CONST(prob, i, 4); + REV_BIT_LAST (prob, i, 8); + distance |= i; } if (distance == (UInt32)0xFFFFFFFF) { - len += kMatchSpecLenStart; + len = kMatchSpecLenStart; state -= kNumStates; break; } @@ -435,20 +515,12 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte rep2 = rep1; rep1 = rep0; rep0 = distance + 1; - if (checkDicSize == 0) - { - if (distance >= processedPos) - { - p->dicPos = dicPos; - return SZ_ERROR_DATA; - } - } - else if (distance >= checkDicSize) + state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3; + if (distance >= (checkDicSize == 0 ? processedPos: checkDicSize)) { p->dicPos = dicPos; return SZ_ERROR_DATA; } - state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3; } len += kMatchMinLen; @@ -511,6 +583,7 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte return SZ_OK; } +#endif static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) { @@ -519,7 +592,7 @@ static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) Byte *dic = p->dic; SizeT dicPos = p->dicPos; SizeT dicBufSize = p->dicBufSize; - unsigned len = p->remainLen; + unsigned len = (unsigned)p->remainLen; SizeT rep0 = p->reps[0]; /* we use SizeT to avoid the BUG of VC14 for AMD64 */ SizeT rem = limit - dicPos; if (rem < len) @@ -540,6 +613,14 @@ static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) } } + +#define kRange0 0xFFFFFFFF +#define kBound0 ((kRange0 >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1)) +#define kBadRepCode (kBound0 + (((kRange0 - kBound0) >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1))) +#if kBadRepCode != (0xC0000000 - 0x400) + #error Stop_Compiling_Bad_LZMA_Check +#endif + static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit) { do @@ -550,9 +631,13 @@ static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte UInt32 rem = p->prop.dicSize - p->processedPos; if (limit - p->dicPos > rem) limit2 = p->dicPos + rem; + + if (p->processedPos == 0) + if (p->code >= kBadRepCode) + return SZ_ERROR_DATA; } - - RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit)); + + RINOK(LZMA_DECODE_REAL(p, limit2, bufLimit)); if (p->checkDicSize == 0 && p->processedPos >= p->prop.dicSize) p->checkDicSize = p->prop.dicSize; @@ -561,9 +646,6 @@ static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte } while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart); - if (p->remainLen > kMatchSpecLenStart) - p->remainLen = kMatchSpecLenStart; - return 0; } @@ -580,17 +662,17 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inS UInt32 range = p->range; UInt32 code = p->code; const Byte *bufLimit = buf + inSize; - const CLzmaProb *probs = p->probs; - unsigned state = p->state; + const CLzmaProb *probs = GET_PROBS; + unsigned state = (unsigned)p->state; ELzmaDummy res; { const CLzmaProb *prob; UInt32 bound; unsigned ttt; - unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1); + unsigned posState = CALC_POS_STATE(p->processedPos, (1 << p->prop.pb) - 1); - prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; + prob = probs + IsMatch + COMBINED_PS_STATE; IF_BIT_0_CHECK(prob) { UPDATE_0_CHECK @@ -618,10 +700,11 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inS { unsigned bit; const CLzmaProb *probLit; - matchByte <<= 1; - bit = (matchByte & offs); - probLit = prob + offs + bit + symbol; - GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit) + matchByte += matchByte; + bit = offs; + offs &= matchByte; + probLit = prob + (offs + bit + symbol); + GET_BIT2_CHECK(probLit, symbol, offs ^= bit; , ; ) } while (symbol < 0x100); } @@ -648,7 +731,7 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inS IF_BIT_0_CHECK(prob) { UPDATE_0_CHECK; - prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; + prob = probs + IsRep0Long + COMBINED_PS_STATE; IF_BIT_0_CHECK(prob) { UPDATE_0_CHECK; @@ -691,7 +774,7 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inS IF_BIT_0_CHECK(probLen) { UPDATE_0_CHECK; - probLen = prob + LenLow + (posState << kLenNumLowBits); + probLen = prob + LenLow + GET_LEN_STATE; offset = 0; limit = 1 << kLenNumLowBits; } @@ -702,15 +785,15 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inS IF_BIT_0_CHECK(probLen) { UPDATE_0_CHECK; - probLen = prob + LenMid + (posState << kLenNumMidBits); + probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits); offset = kLenNumLowSymbols; - limit = 1 << kLenNumMidBits; + limit = 1 << kLenNumLowBits; } else { UPDATE_1_CHECK; probLen = prob + LenHigh; - offset = kLenNumLowSymbols + kLenNumMidSymbols; + offset = kLenNumLowSymbols * 2; limit = 1 << kLenNumHighBits; } } @@ -722,7 +805,7 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inS { unsigned posSlot; prob = probs + PosSlot + - ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << + ((len < kNumLenToPosStates - 1 ? len : kNumLenToPosStates - 1) << kNumPosSlotBits); TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot); if (posSlot >= kStartPosModelIndex) @@ -733,7 +816,7 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inS if (posSlot < kEndPosModelIndex) { - prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1; + prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits); } else { @@ -745,17 +828,18 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inS code -= range & (((code - range) >> 31) - 1); /* if (code >= range) code -= range; */ } - while (--numDirectBits != 0); + while (--numDirectBits); prob = probs + Align; numDirectBits = kNumAlignBits; } { unsigned i = 1; + unsigned m = 1; do { - GET_BIT_CHECK(prob + i, i); + REV_BIT_CHECK(prob, i, m); } - while (--numDirectBits != 0); + while (--numDirectBits); } } } @@ -768,18 +852,17 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inS void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState) { - p->needFlush = 1; - p->remainLen = 0; + p->remainLen = kMatchSpecLenStart + 1; p->tempBufSize = 0; if (initDic) { p->processedPos = 0; p->checkDicSize = 0; - p->needInitState = 1; + p->remainLen = kMatchSpecLenStart + 2; } if (initState) - p->needInitState = 1; + p->remainLen = kMatchSpecLenStart + 2; } void LzmaDec_Init(CLzmaDec *p) @@ -788,53 +871,54 @@ void LzmaDec_Init(CLzmaDec *p) LzmaDec_InitDicAndState(p, True, True); } -static void LzmaDec_InitStateReal(CLzmaDec *p) -{ - SizeT numProbs = LzmaProps_GetNumProbs(&p->prop); - SizeT i; - CLzmaProb *probs = p->probs; - for (i = 0; i < numProbs; i++) - probs[i] = kBitModelTotal >> 1; - p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1; - p->state = 0; - p->needInitState = 0; -} SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) { SizeT inSize = *srcLen; (*srcLen) = 0; - LzmaDec_WriteRem(p, dicLimit); *status = LZMA_STATUS_NOT_SPECIFIED; + if (p->remainLen > kMatchSpecLenStart) + { + for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--) + p->tempBuf[p->tempBufSize++] = *src++; + if (p->tempBufSize != 0 && p->tempBuf[0] != 0) + return SZ_ERROR_DATA; + if (p->tempBufSize < RC_INIT_SIZE) + { + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + p->code = + ((UInt32)p->tempBuf[1] << 24) + | ((UInt32)p->tempBuf[2] << 16) + | ((UInt32)p->tempBuf[3] << 8) + | ((UInt32)p->tempBuf[4]); + p->range = 0xFFFFFFFF; + p->tempBufSize = 0; + + if (p->remainLen > kMatchSpecLenStart + 1) + { + SizeT numProbs = LzmaProps_GetNumProbs(&p->prop); + SizeT i; + CLzmaProb *probs = p->probs; + for (i = 0; i < numProbs; i++) + probs[i] = kBitModelTotal >> 1; + p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1; + p->state = 0; + } + + p->remainLen = 0; + } + + LzmaDec_WriteRem(p, dicLimit); + while (p->remainLen != kMatchSpecLenStart) { - int checkEndMarkNow; + int checkEndMarkNow = 0; - if (p->needFlush) - { - for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--) - p->tempBuf[p->tempBufSize++] = *src++; - if (p->tempBufSize < RC_INIT_SIZE) - { - *status = LZMA_STATUS_NEEDS_MORE_INPUT; - return SZ_OK; - } - if (p->tempBuf[0] != 0) - return SZ_ERROR_DATA; - p->code = - ((UInt32)p->tempBuf[1] << 24) - | ((UInt32)p->tempBuf[2] << 16) - | ((UInt32)p->tempBuf[3] << 8) - | ((UInt32)p->tempBuf[4]); - p->range = 0xFFFFFFFF; - p->needFlush = 0; - p->tempBufSize = 0; - } - - checkEndMarkNow = 0; if (p->dicPos >= dicLimit) { if (p->remainLen == 0 && p->code == 0) @@ -855,9 +939,6 @@ SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *sr checkEndMarkNow = 1; } - if (p->needInitState) - LzmaDec_InitStateReal(p); - if (p->tempBufSize == 0) { SizeT processed; @@ -930,11 +1011,14 @@ SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *sr p->tempBufSize = 0; } } - if (p->code == 0) - *status = LZMA_STATUS_FINISHED_WITH_MARK; - return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA; + + if (p->code != 0) + return SZ_ERROR_DATA; + *status = LZMA_STATUS_FINISHED_WITH_MARK; + return SZ_OK; } + SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) { SizeT outSize = *destLen; @@ -975,19 +1059,19 @@ SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *sr } } -void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc) +void LzmaDec_FreeProbs(CLzmaDec *p, ISzAllocPtr alloc) { - alloc->Free(alloc, p->probs); + ISzAlloc_Free(alloc, p->probs); p->probs = NULL; } -static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc) +static void LzmaDec_FreeDict(CLzmaDec *p, ISzAllocPtr alloc) { - alloc->Free(alloc, p->dic); + ISzAlloc_Free(alloc, p->dic); p->dic = NULL; } -void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc) +void LzmaDec_Free(CLzmaDec *p, ISzAllocPtr alloc) { LzmaDec_FreeProbs(p, alloc); LzmaDec_FreeDict(p, alloc); @@ -1011,29 +1095,30 @@ SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size) if (d >= (9 * 5 * 5)) return SZ_ERROR_UNSUPPORTED; - p->lc = d % 9; + p->lc = (Byte)(d % 9); d /= 9; - p->pb = d / 5; - p->lp = d % 5; + p->pb = (Byte)(d / 5); + p->lp = (Byte)(d % 5); return SZ_OK; } -static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc) +static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAllocPtr alloc) { UInt32 numProbs = LzmaProps_GetNumProbs(propNew); if (!p->probs || numProbs != p->numProbs) { LzmaDec_FreeProbs(p, alloc); - p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb)); - p->numProbs = numProbs; + p->probs = (CLzmaProb *)ISzAlloc_Alloc(alloc, numProbs * sizeof(CLzmaProb)); if (!p->probs) return SZ_ERROR_MEM; + p->probs_1664 = p->probs + 1664; + p->numProbs = numProbs; } return SZ_OK; } -SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) +SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc) { CLzmaProps propNew; RINOK(LzmaProps_Decode(&propNew, props, propsSize)); @@ -1042,7 +1127,7 @@ SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, I return SZ_OK; } -SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) +SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc) { CLzmaProps propNew; SizeT dicBufSize; @@ -1062,7 +1147,7 @@ SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAll if (!p->dic || dicBufSize != p->dicBufSize) { LzmaDec_FreeDict(p, alloc); - p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize); + p->dic = (Byte *)ISzAlloc_Alloc(alloc, dicBufSize); if (!p->dic) { LzmaDec_FreeProbs(p, alloc); @@ -1076,7 +1161,7 @@ SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAll SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, - ELzmaStatus *status, ISzAlloc *alloc) + ELzmaStatus *status, ISzAllocPtr alloc) { CLzmaDec p; SRes res; diff --git a/code/ryzom/client/src/seven_zip/LzmaDec.h b/code/ryzom/client/src/seven_zip/LzmaDec.h index cc44daef2..1f0927ab1 100644 --- a/code/ryzom/client/src/seven_zip/LzmaDec.h +++ b/code/ryzom/client/src/seven_zip/LzmaDec.h @@ -1,5 +1,5 @@ /* LzmaDec.h -- LZMA Decoder -2013-01-18 : Igor Pavlov : Public domain */ +2018-04-21 : Igor Pavlov : Public domain */ #ifndef __LZMA_DEC_H #define __LZMA_DEC_H @@ -12,11 +12,13 @@ EXTERN_C_BEGIN /* _LZMA_PROB32 can increase the speed on some CPUs, but memory usage for CLzmaDec::probs will be doubled in that case */ +typedef #ifdef _LZMA_PROB32 -#define CLzmaProb UInt32 + UInt32 #else -#define CLzmaProb UInt16 + UInt16 #endif + CLzmaProb; /* ---------- LZMA Properties ---------- */ @@ -25,7 +27,10 @@ EXTERN_C_BEGIN typedef struct _CLzmaProps { - unsigned lc, lp, pb; + Byte lc; + Byte lp; + Byte pb; + Byte _pad_; UInt32 dicSize; } CLzmaProps; @@ -47,32 +52,34 @@ SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size); typedef struct { + /* Don't change this structure. ASM code can use it. */ CLzmaProps prop; CLzmaProb *probs; + CLzmaProb *probs_1664; Byte *dic; - const Byte *buf; - UInt32 range, code; - SizeT dicPos; SizeT dicBufSize; + SizeT dicPos; + const Byte *buf; + UInt32 range; + UInt32 code; UInt32 processedPos; UInt32 checkDicSize; - unsigned state; UInt32 reps[4]; - unsigned remainLen; - int needFlush; - int needInitState; + UInt32 state; + UInt32 remainLen; + UInt32 numProbs; unsigned tempBufSize; Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; } CLzmaDec; -#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; } +#define LzmaDec_Construct(p) { (p)->dic = NULL; (p)->probs = NULL; } void LzmaDec_Init(CLzmaDec *p); /* There are two types of LZMA streams: - 0) Stream with end mark. That end mark adds about 6 bytes to compressed size. - 1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */ + - Stream with end mark. That end mark adds about 6 bytes to compressed size. + - Stream without end mark. You must know exact uncompressed size to decompress such stream. */ typedef enum { @@ -129,11 +136,11 @@ LzmaDec_Allocate* can return: SZ_ERROR_UNSUPPORTED - Unsupported properties */ -SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc); -void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc); +SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc); +void LzmaDec_FreeProbs(CLzmaDec *p, ISzAllocPtr alloc); -SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc); -void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc); +SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc); +void LzmaDec_Free(CLzmaDec *p, ISzAllocPtr alloc); /* ---------- Dictionary Interface ---------- */ @@ -142,7 +149,7 @@ void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc); You must work with CLzmaDec variables directly in this interface. STEPS: - LzmaDec_Constr() + LzmaDec_Construct() LzmaDec_Allocate() for (each new stream) { @@ -220,7 +227,7 @@ Returns: SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, - ELzmaStatus *status, ISzAlloc *alloc); + ELzmaStatus *status, ISzAllocPtr alloc); EXTERN_C_END diff --git a/code/ryzom/client/src/seven_zip/LzmaEnc.cpp b/code/ryzom/client/src/seven_zip/LzmaEnc.cpp index 0845691cf..69de5d12e 100644 --- a/code/ryzom/client/src/seven_zip/LzmaEnc.cpp +++ b/code/ryzom/client/src/seven_zip/LzmaEnc.cpp @@ -1,5 +1,5 @@ /* LzmaEnc.c -- LZMA Encoder -2016-05-16 : Igor Pavlov : Public domain */ +2018-04-29 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -25,17 +25,8 @@ static unsigned g_STAT_OFFSET = 0; #endif -#define kMaxHistorySize ((UInt32)3 << 29) -/* #define kMaxHistorySize ((UInt32)7 << 29) */ - -#define kBlockSizeMax ((1 << LZMA_NUM_BLOCK_SIZE_BITS) - 1) - -#define kBlockSize (9 << 10) -#define kUnpackBlockSize (1 << 18) -#define kMatchArraySize (1 << 21) -#define kMatchRecordMaxSize ((LZMA_MATCH_LEN_MAX * 2 + 3) * LZMA_MATCH_LEN_MAX) - -#define kNumMaxDirectBits (31) +#define kLzmaMaxHistorySize ((UInt32)3 << 29) +/* #define kLzmaMaxHistorySize ((UInt32)7 << 29) */ #define kNumTopBits 24 #define kTopValue ((UInt32)1 << kNumTopBits) @@ -64,14 +55,15 @@ void LzmaEncProps_Normalize(CLzmaEncProps *p) if (level < 0) level = 5; p->level = level; - if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26))); + if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level <= 7 ? (1 << 25) : (1 << 26))); if (p->dictSize > p->reduceSize) { unsigned i; + UInt32 reduceSize = (UInt32)p->reduceSize; for (i = 11; i <= 30; i++) { - if ((UInt32)p->reduceSize <= ((UInt32)2 << i)) { p->dictSize = ((UInt32)2 << i); break; } - if ((UInt32)p->reduceSize <= ((UInt32)3 << i)) { p->dictSize = ((UInt32)3 << i); break; } + if (reduceSize <= ((UInt32)2 << i)) { p->dictSize = ((UInt32)2 << i); break; } + if (reduceSize <= ((UInt32)3 << i)) { p->dictSize = ((UInt32)3 << i); break; } } } @@ -112,9 +104,9 @@ UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2) #define BSR2_RET(pos, res) { unsigned long zz; _BitScanReverse(&zz, (pos)); res = (zz + zz) + ((pos >> (zz - 1)) & 1); } -static UInt32 GetPosSlot1(UInt32 pos) +static unsigned GetPosSlot1(UInt32 pos) { - UInt32 res; + unsigned res; BSR2_RET(pos, res); return res; } @@ -147,18 +139,18 @@ static void LzmaEnc_FastPosInit(Byte *g_FastPos) /* we can use ((limit - pos) >> 31) only if (pos < ((UInt32)1 << 31)) */ /* -#define BSR2_RET(pos, res) { UInt32 zz = 6 + ((kNumLogBits - 1) & \ +#define BSR2_RET(pos, res) { unsigned zz = 6 + ((kNumLogBits - 1) & \ (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \ res = p->g_FastPos[pos >> zz] + (zz * 2); } */ /* -#define BSR2_RET(pos, res) { UInt32 zz = 6 + ((kNumLogBits - 1) & \ +#define BSR2_RET(pos, res) { unsigned zz = 6 + ((kNumLogBits - 1) & \ (0 - (((((UInt32)1 << (kNumLogBits)) - 1) - (pos >> 6)) >> 31))); \ res = p->g_FastPos[pos >> zz] + (zz * 2); } */ -#define BSR2_RET(pos, res) { UInt32 zz = (pos < (1 << (kNumLogBits + 6))) ? 6 : 6 + kNumLogBits - 1; \ +#define BSR2_RET(pos, res) { unsigned zz = (pos < (1 << (kNumLogBits + 6))) ? 6 : 6 + kNumLogBits - 1; \ res = p->g_FastPos[pos >> zz] + (zz * 2); } /* @@ -169,32 +161,32 @@ static void LzmaEnc_FastPosInit(Byte *g_FastPos) #define GetPosSlot1(pos) p->g_FastPos[pos] #define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } -#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos]; else BSR2_RET(pos, res); } +#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos & (kNumFullDistances - 1)]; else BSR2_RET(pos, res); } #endif #define LZMA_NUM_REPS 4 -typedef unsigned CState; +typedef UInt16 CState; +typedef UInt16 CExtra; typedef struct { UInt32 price; - CState state; - int prev1IsChar; - int prev2; - - UInt32 posPrev2; - UInt32 backPrev2; - - UInt32 posPrev; - UInt32 backPrev; - UInt32 backs[LZMA_NUM_REPS]; + CExtra extra; + // 0 : normal + // 1 : LIT : MATCH + // > 1 : MATCH (extra-1) : LIT : REP0 (len) + UInt32 len; + UInt32 dist; + UInt32 reps[LZMA_NUM_REPS]; } COptimal; + #define kNumOpts (1 << 12) +#define kPackReserve (1 + kNumOpts * 2) #define kNumLenToPosStates 4 #define kNumPosSlotBits 6 @@ -202,22 +194,21 @@ typedef struct #define kDicLogSizeMax 32 #define kDistTableSizeMax (kDicLogSizeMax * 2) - #define kNumAlignBits 4 #define kAlignTableSize (1 << kNumAlignBits) #define kAlignMask (kAlignTableSize - 1) #define kStartPosModelIndex 4 #define kEndPosModelIndex 14 -#define kNumPosModels (kEndPosModelIndex - kStartPosModelIndex) - #define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) +typedef #ifdef _LZMA_PROB32 -#define CLzmaProb UInt32 + UInt32 #else -#define CLzmaProb UInt16 + UInt16 #endif + CLzmaProb; #define LZMA_PB_MAX 4 #define LZMA_LC_MAX 8 @@ -225,15 +216,11 @@ typedef struct #define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX) - #define kLenNumLowBits 3 #define kLenNumLowSymbols (1 << kLenNumLowBits) -#define kLenNumMidBits 3 -#define kLenNumMidSymbols (1 << kLenNumMidBits) #define kLenNumHighBits 8 #define kLenNumHighSymbols (1 << kLenNumHighBits) - -#define kLenNumSymbolsTotal (kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) +#define kLenNumSymbolsTotal (kLenNumLowSymbols * 2 + kLenNumHighSymbols) #define LZMA_MATCH_LEN_MIN 2 #define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1) @@ -243,27 +230,23 @@ typedef struct typedef struct { - CLzmaProb choice; - CLzmaProb choice2; - CLzmaProb low[LZMA_NUM_PB_STATES_MAX << kLenNumLowBits]; - CLzmaProb mid[LZMA_NUM_PB_STATES_MAX << kLenNumMidBits]; + CLzmaProb low[LZMA_NUM_PB_STATES_MAX << (kLenNumLowBits + 1)]; CLzmaProb high[kLenNumHighSymbols]; } CLenEnc; typedef struct { - CLenEnc p; - UInt32 tableSize; + unsigned tableSize; + unsigned counters[LZMA_NUM_PB_STATES_MAX]; UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal]; - UInt32 counters[LZMA_NUM_PB_STATES_MAX]; } CLenPriceEnc; typedef struct { UInt32 range; - Byte cache; + unsigned cache; UInt64 low; UInt64 cacheSize; Byte *buf; @@ -279,48 +262,54 @@ typedef struct { CLzmaProb *litProbs; - UInt32 state; + unsigned state; UInt32 reps[LZMA_NUM_REPS]; - CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; + CLzmaProb posAlignEncoder[1 << kNumAlignBits]; CLzmaProb isRep[kNumStates]; CLzmaProb isRepG0[kNumStates]; CLzmaProb isRepG1[kNumStates]; CLzmaProb isRepG2[kNumStates]; + CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; - CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; - CLzmaProb posAlignEncoder[1 << kNumAlignBits]; + CLzmaProb posEncoders[kNumFullDistances]; - CLenPriceEnc lenEnc; - CLenPriceEnc repLenEnc; + CLenEnc lenProbs; + CLenEnc repLenProbs; + } CSaveState; +typedef UInt32 CProbPrice; + + typedef struct { void *matchFinderObj; IMatchFinder matchFinder; - UInt32 optimumEndIndex; - UInt32 optimumCurrentIndex; + unsigned optCur; + unsigned optEnd; - UInt32 longestMatchLength; - UInt32 numPairs; + unsigned longestMatchLen; + unsigned numPairs; UInt32 numAvail; - UInt32 numFastBytes; - UInt32 additionalOffset; + unsigned state; + unsigned numFastBytes; + unsigned additionalOffset; UInt32 reps[LZMA_NUM_REPS]; - UInt32 state; + unsigned lpMask, pbMask; + CLzmaProb *litProbs; + CRangeEnc rc; + + UInt32 backRes; unsigned lc, lp, pb; - unsigned lpMask, pbMask; unsigned lclp; - CLzmaProb *litProbs; - Bool fastMode; Bool writeEndMark; Bool finished; @@ -329,19 +318,19 @@ typedef struct UInt64 nowPos64; - UInt32 matchPriceCount; - UInt32 alignPriceCount; + unsigned matchPriceCount; + unsigned alignPriceCount; - UInt32 distTableSize; + unsigned distTableSize; UInt32 dictSize; SRes result; - CRangeEnc rc; - #ifndef _7ZIP_ST Bool mtMode; + // begin of CMatchFinderMt is used in LZ thread CMatchFinderMt matchFinderMt; + // end of CMatchFinderMt is used in BT and HASH threads #endif CMatchFinder matchFinderBase; @@ -350,33 +339,37 @@ typedef struct Byte pad[128]; #endif - COptimal opt[kNumOpts]; - - #ifndef LZMA_LOG_BSR - Byte g_FastPos[1 << kNumLogBits]; - #endif + // LZ thread + CProbPrice ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; - UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2 + 1]; + UInt32 alignPrices[kAlignTableSize]; UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax]; UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances]; - UInt32 alignPrices[kAlignTableSize]; - CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; + CLzmaProb posAlignEncoder[1 << kNumAlignBits]; CLzmaProb isRep[kNumStates]; CLzmaProb isRepG0[kNumStates]; CLzmaProb isRepG1[kNumStates]; CLzmaProb isRepG2[kNumStates]; + CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; - CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; - CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; - CLzmaProb posAlignEncoder[1 << kNumAlignBits]; + CLzmaProb posEncoders[kNumFullDistances]; + CLenEnc lenProbs; + CLenEnc repLenProbs; + + #ifndef LZMA_LOG_BSR + Byte g_FastPos[1 << kNumLogBits]; + #endif + CLenPriceEnc lenEnc; CLenPriceEnc repLenEnc; + COptimal opt[kNumOpts]; + CSaveState saveState; #ifndef _7ZIP_ST @@ -385,58 +378,62 @@ typedef struct } CLzmaEnc; + +#define COPY_ARR(dest, src, arr) memcpy(dest->arr, src->arr, sizeof(src->arr)); + void LzmaEnc_SaveState(CLzmaEncHandle pp) { CLzmaEnc *p = (CLzmaEnc *)pp; CSaveState *dest = &p->saveState; - int i; - dest->lenEnc = p->lenEnc; - dest->repLenEnc = p->repLenEnc; + dest->state = p->state; + + dest->lenProbs = p->lenProbs; + dest->repLenProbs = p->repLenProbs; + + COPY_ARR(dest, p, reps); + + COPY_ARR(dest, p, posAlignEncoder); + COPY_ARR(dest, p, isRep); + COPY_ARR(dest, p, isRepG0); + COPY_ARR(dest, p, isRepG1); + COPY_ARR(dest, p, isRepG2); + COPY_ARR(dest, p, isMatch); + COPY_ARR(dest, p, isRep0Long); + COPY_ARR(dest, p, posSlotEncoder); + COPY_ARR(dest, p, posEncoders); - for (i = 0; i < kNumStates; i++) - { - memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i])); - memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i])); - } - for (i = 0; i < kNumLenToPosStates; i++) - memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i])); - memcpy(dest->isRep, p->isRep, sizeof(p->isRep)); - memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0)); - memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1)); - memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2)); - memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders)); - memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder)); - memcpy(dest->reps, p->reps, sizeof(p->reps)); memcpy(dest->litProbs, p->litProbs, ((UInt32)0x300 << p->lclp) * sizeof(CLzmaProb)); } + void LzmaEnc_RestoreState(CLzmaEncHandle pp) { CLzmaEnc *dest = (CLzmaEnc *)pp; const CSaveState *p = &dest->saveState; - int i; - dest->lenEnc = p->lenEnc; - dest->repLenEnc = p->repLenEnc; + dest->state = p->state; - for (i = 0; i < kNumStates; i++) - { - memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i])); - memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i])); - } - for (i = 0; i < kNumLenToPosStates; i++) - memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i])); - memcpy(dest->isRep, p->isRep, sizeof(p->isRep)); - memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0)); - memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1)); - memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2)); - memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders)); - memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder)); - memcpy(dest->reps, p->reps, sizeof(p->reps)); + dest->lenProbs = p->lenProbs; + dest->repLenProbs = p->repLenProbs; + + COPY_ARR(dest, p, reps); + + COPY_ARR(dest, p, posAlignEncoder); + COPY_ARR(dest, p, isRep); + COPY_ARR(dest, p, isRepG0); + COPY_ARR(dest, p, isRepG1); + COPY_ARR(dest, p, isRepG2); + COPY_ARR(dest, p, isMatch); + COPY_ARR(dest, p, isRep0Long); + COPY_ARR(dest, p, posSlotEncoder); + COPY_ARR(dest, p, posEncoders); + memcpy(dest->litProbs, p->litProbs, ((UInt32)0x300 << dest->lclp) * sizeof(CLzmaProb)); } + + SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2) { CLzmaEnc *p = (CLzmaEnc *)pp; @@ -447,7 +444,7 @@ SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2) || props.lp > LZMA_LP_MAX || props.pb > LZMA_PB_MAX || props.dictSize > ((UInt64)1 << kDicLogSizeMaxCompress) - || props.dictSize > kMaxHistorySize) + || props.dictSize > kLzmaMaxHistorySize) return SZ_ERROR_PARAM; p->dictSize = props.dictSize; @@ -465,7 +462,7 @@ SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2) p->fastMode = (props.algo == 0); p->matchFinderBase.btMode = (Byte)(props.btMode ? 1 : 0); { - UInt32 numHashBytes = 4; + unsigned numHashBytes = 4; if (props.btMode) { if (props.numHashBytes < 2) @@ -494,13 +491,27 @@ SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2) return SZ_OK; } -static const int kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; -static const int kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; -static const int kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; -static const int kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; -#define IsCharState(s) ((s) < 7) +void LzmaEnc_SetDataSize(CLzmaEncHandle pp, UInt64 expectedDataSiize) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + p->matchFinderBase.expectedDataSize = expectedDataSiize; +} + +#define kState_Start 0 +#define kState_LitAfterMatch 4 +#define kState_LitAfterRep 5 +#define kState_MatchAfterLit 7 +#define kState_RepAfterLit 8 + +static const Byte kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; +static const Byte kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; +static const Byte kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; +static const Byte kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; + +#define IsLitState(s) ((s) < 7) +#define GetLenToPosState2(len) (((len) < kNumLenToPosStates - 1) ? (len) : kNumLenToPosStates - 1) #define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1) #define kInfinityPrice (1 << 30) @@ -511,14 +522,16 @@ static void RangeEnc_Construct(CRangeEnc *p) p->bufBase = NULL; } -#define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize) +#define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize) +#define RangeEnc_GetProcessed_sizet(p) ((size_t)(p)->processed + ((p)->buf - (p)->bufBase) + (size_t)(p)->cacheSize) #define RC_BUF_SIZE (1 << 16) -static int RangeEnc_Alloc(CRangeEnc *p, ISzAlloc *alloc) + +static int RangeEnc_Alloc(CRangeEnc *p, ISzAllocPtr alloc) { if (!p->bufBase) { - p->bufBase = (Byte *)alloc->Alloc(alloc, RC_BUF_SIZE); + p->bufBase = (Byte *)ISzAlloc_Alloc(alloc, RC_BUF_SIZE); if (!p->bufBase) return 0; p->bufLim = p->bufBase + RC_BUF_SIZE; @@ -526,19 +539,19 @@ static int RangeEnc_Alloc(CRangeEnc *p, ISzAlloc *alloc) return 1; } -static void RangeEnc_Free(CRangeEnc *p, ISzAlloc *alloc) +static void RangeEnc_Free(CRangeEnc *p, ISzAllocPtr alloc) { - alloc->Free(alloc, p->bufBase); + ISzAlloc_Free(alloc, p->bufBase); p->bufBase = 0; } static void RangeEnc_Init(CRangeEnc *p) { /* Stream.Init(); */ - p->low = 0; p->range = 0xFFFFFFFF; - p->cacheSize = 1; p->cache = 0; + p->low = 0; + p->cacheSize = 0; p->buf = p->bufBase; @@ -546,37 +559,48 @@ static void RangeEnc_Init(CRangeEnc *p) p->res = SZ_OK; } -static void RangeEnc_FlushStream(CRangeEnc *p) +MY_NO_INLINE static void RangeEnc_FlushStream(CRangeEnc *p) { size_t num; if (p->res != SZ_OK) return; num = p->buf - p->bufBase; - if (num != p->outStream->Write(p->outStream, p->bufBase, num)) + if (num != ISeqOutStream_Write(p->outStream, p->bufBase, num)) p->res = SZ_ERROR_WRITE; p->processed += num; p->buf = p->bufBase; } -static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p) +MY_NO_INLINE static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p) { - if ((UInt32)p->low < (UInt32)0xFF000000 || (unsigned)(p->low >> 32) != 0) + UInt32 low = (UInt32)p->low; + unsigned high = (unsigned)(p->low >> 32); + p->low = (UInt32)(low << 8); + if (low < (UInt32)0xFF000000 || high != 0) { - Byte temp = p->cache; - do { Byte *buf = p->buf; - *buf++ = (Byte)(temp + (Byte)(p->low >> 32)); + *buf++ = (Byte)(p->cache + high); + p->cache = (unsigned)(low >> 24); p->buf = buf; if (buf == p->bufLim) RangeEnc_FlushStream(p); - temp = 0xFF; + if (p->cacheSize == 0) + return; + } + high += 0xFF; + for (;;) + { + Byte *buf = p->buf; + *buf++ = (Byte)(high); + p->buf = buf; + if (buf == p->bufLim) + RangeEnc_FlushStream(p); + if (--p->cacheSize == 0) + return; } - while (--p->cacheSize != 0); - p->cache = (Byte)((UInt32)p->low >> 24); } p->cacheSize++; - p->low = (UInt32)p->low << 8; } static void RangeEnc_FlushData(CRangeEnc *p) @@ -586,78 +610,121 @@ static void RangeEnc_FlushData(CRangeEnc *p) RangeEnc_ShiftLow(p); } -static void RangeEnc_EncodeDirectBits(CRangeEnc *p, UInt32 value, unsigned numBits) -{ - do - { - p->range >>= 1; - p->low += p->range & (0 - ((value >> --numBits) & 1)); - if (p->range < kTopValue) - { - p->range <<= 8; - RangeEnc_ShiftLow(p); - } - } - while (numBits != 0); -} +#define RC_NORM(p) if (range < kTopValue) { range <<= 8; RangeEnc_ShiftLow(p); } -static void RangeEnc_EncodeBit(CRangeEnc *p, CLzmaProb *prob, UInt32 symbol) +#define RC_BIT_PRE(p, prob) \ + ttt = *(prob); \ + newBound = (range >> kNumBitModelTotalBits) * ttt; + +// #define _LZMA_ENC_USE_BRANCH + +#ifdef _LZMA_ENC_USE_BRANCH + +#define RC_BIT(p, prob, symbol) { \ + RC_BIT_PRE(p, prob) \ + if (symbol == 0) { range = newBound; ttt += (kBitModelTotal - ttt) >> kNumMoveBits; } \ + else { (p)->low += newBound; range -= newBound; ttt -= ttt >> kNumMoveBits; } \ + *(prob) = (CLzmaProb)ttt; \ + RC_NORM(p) \ + } + +#else + +#define RC_BIT(p, prob, symbol) { \ + UInt32 mask; \ + RC_BIT_PRE(p, prob) \ + mask = 0 - (UInt32)symbol; \ + range &= mask; \ + mask &= newBound; \ + range -= mask; \ + (p)->low += mask; \ + mask = (UInt32)symbol - 1; \ + range += newBound & mask; \ + mask &= (kBitModelTotal - ((1 << kNumMoveBits) - 1)); \ + mask += ((1 << kNumMoveBits) - 1); \ + ttt += (Int32)(mask - ttt) >> kNumMoveBits; \ + *(prob) = (CLzmaProb)ttt; \ + RC_NORM(p) \ + } + +#endif + + + + +#define RC_BIT_0_BASE(p, prob) \ + range = newBound; *(prob) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); + +#define RC_BIT_1_BASE(p, prob) \ + range -= newBound; (p)->low += newBound; *(prob) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); \ + +#define RC_BIT_0(p, prob) \ + RC_BIT_0_BASE(p, prob) \ + RC_NORM(p) + +#define RC_BIT_1(p, prob) \ + RC_BIT_1_BASE(p, prob) \ + RC_NORM(p) + +static void RangeEnc_EncodeBit_0(CRangeEnc *p, CLzmaProb *prob) { - UInt32 ttt = *prob; - UInt32 newBound = (p->range >> kNumBitModelTotalBits) * ttt; - if (symbol == 0) - { - p->range = newBound; - ttt += (kBitModelTotal - ttt) >> kNumMoveBits; - } - else - { - p->low += newBound; - p->range -= newBound; - ttt -= ttt >> kNumMoveBits; - } - *prob = (CLzmaProb)ttt; - if (p->range < kTopValue) - { - p->range <<= 8; - RangeEnc_ShiftLow(p); - } + UInt32 range, ttt, newBound; + range = p->range; + RC_BIT_PRE(p, prob) + RC_BIT_0(p, prob) + p->range = range; } static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol) { + UInt32 range = p->range; symbol |= 0x100; do { - RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1); + UInt32 ttt, newBound; + // RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1); + CLzmaProb *prob = probs + (symbol >> 8); + UInt32 bit = (symbol >> 7) & 1; symbol <<= 1; + RC_BIT(p, prob, bit); } while (symbol < 0x10000); + p->range = range; } static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol, UInt32 matchByte) { + UInt32 range = p->range; UInt32 offs = 0x100; symbol |= 0x100; do { + UInt32 ttt, newBound; + CLzmaProb *prob; + UInt32 bit; matchByte <<= 1; - RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1); + // RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1); + prob = probs + (offs + (matchByte & offs) + (symbol >> 8)); + bit = (symbol >> 7) & 1; symbol <<= 1; offs &= ~(matchByte ^ symbol); + RC_BIT(p, prob, bit); } while (symbol < 0x10000); + p->range = range; } -static void LzmaEnc_InitPriceTables(UInt32 *ProbPrices) + + +static void LzmaEnc_InitPriceTables(CProbPrice *ProbPrices) { UInt32 i; - for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits)) + for (i = 0; i < (kBitModelTotal >> kNumMoveReducingBits); i++) { - const int kCyclesBits = kNumBitPriceShiftBits; - UInt32 w = i; - UInt32 bitCount = 0; - int j; + const unsigned kCyclesBits = kNumBitPriceShiftBits; + UInt32 w = (i << kNumMoveReducingBits) + (1 << (kNumMoveReducingBits - 1)); + unsigned bitCount = 0; + unsigned j; for (j = 0; j < kCyclesBits; j++) { w = w * w; @@ -668,37 +735,41 @@ static void LzmaEnc_InitPriceTables(UInt32 *ProbPrices) bitCount++; } } - ProbPrices[i >> kNumMoveReducingBits] = ((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount); + ProbPrices[i] = (CProbPrice)((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount); + // printf("\n%3d: %5d", i, ProbPrices[i]); } } #define GET_PRICE(prob, symbol) \ - p->ProbPrices[((prob) ^ (((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; + p->ProbPrices[((prob) ^ (unsigned)(((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; #define GET_PRICEa(prob, symbol) \ - ProbPrices[((prob) ^ ((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; + ProbPrices[((prob) ^ (unsigned)((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; #define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits] #define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] -#define GET_PRICE_0a(prob) ProbPrices[(prob) >> kNumMoveReducingBits] -#define GET_PRICE_1a(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] +#define GET_PRICEa_0(prob) ProbPrices[(prob) >> kNumMoveReducingBits] +#define GET_PRICEa_1(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] -static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, const UInt32 *ProbPrices) + +static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, const CProbPrice *ProbPrices) { UInt32 price = 0; symbol |= 0x100; do { - price += GET_PRICEa(probs[symbol >> 8], (symbol >> 7) & 1); - symbol <<= 1; + unsigned bit = symbol & 1; + symbol >>= 1; + price += GET_PRICEa(probs[symbol], bit); } - while (symbol < 0x10000); + while (symbol >= 2); return price; } -static UInt32 LitEnc_GetPriceMatched(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, const UInt32 *ProbPrices) + +static UInt32 LitEnc_Matched_GetPrice(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, const CProbPrice *ProbPrices) { UInt32 price = 0; UInt32 offs = 0x100; @@ -715,520 +786,525 @@ static UInt32 LitEnc_GetPriceMatched(const CLzmaProb *probs, UInt32 symbol, UInt } -static void RcTree_Encode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) +static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, unsigned numBits, UInt32 symbol) { - UInt32 m = 1; - int i; - for (i = numBitLevels; i != 0;) + UInt32 range = rc->range; + unsigned m = 1; + do { - UInt32 bit; - i--; - bit = (symbol >> i) & 1; - RangeEnc_EncodeBit(rc, probs + m, bit); + UInt32 ttt, newBound; + unsigned bit = symbol & 1; + // RangeEnc_EncodeBit(rc, probs + m, bit); + symbol >>= 1; + RC_BIT(rc, probs + m, bit); m = (m << 1) | bit; } + while (--numBits); + rc->range = range; } -static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) -{ - UInt32 m = 1; - int i; - for (i = 0; i < numBitLevels; i++) - { - UInt32 bit = symbol & 1; - RangeEnc_EncodeBit(rc, probs + m, bit); - m = (m << 1) | bit; - symbol >>= 1; - } -} - -static UInt32 RcTree_GetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, const UInt32 *ProbPrices) -{ - UInt32 price = 0; - symbol |= (1 << numBitLevels); - while (symbol != 1) - { - price += GET_PRICEa(probs[symbol >> 1], symbol & 1); - symbol >>= 1; - } - return price; -} - -static UInt32 RcTree_ReverseGetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, const UInt32 *ProbPrices) -{ - UInt32 price = 0; - UInt32 m = 1; - int i; - for (i = numBitLevels; i != 0; i--) - { - UInt32 bit = symbol & 1; - symbol >>= 1; - price += GET_PRICEa(probs[m], bit); - m = (m << 1) | bit; - } - return price; -} static void LenEnc_Init(CLenEnc *p) { unsigned i; - p->choice = p->choice2 = kProbInitValue; - for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumLowBits); i++) + for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << (kLenNumLowBits + 1)); i++) p->low[i] = kProbInitValue; - for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumMidBits); i++) - p->mid[i] = kProbInitValue; for (i = 0; i < kLenNumHighSymbols; i++) p->high[i] = kProbInitValue; } -static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState) +static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, unsigned symbol, unsigned posState) { - if (symbol < kLenNumLowSymbols) + UInt32 range, ttt, newBound; + CLzmaProb *probs = p->low; + range = rc->range; + RC_BIT_PRE(rc, probs); + if (symbol >= kLenNumLowSymbols) { - RangeEnc_EncodeBit(rc, &p->choice, 0); - RcTree_Encode(rc, p->low + (posState << kLenNumLowBits), kLenNumLowBits, symbol); - } - else - { - RangeEnc_EncodeBit(rc, &p->choice, 1); - if (symbol < kLenNumLowSymbols + kLenNumMidSymbols) + RC_BIT_1(rc, probs); + probs += kLenNumLowSymbols; + RC_BIT_PRE(rc, probs); + if (symbol >= kLenNumLowSymbols * 2) { - RangeEnc_EncodeBit(rc, &p->choice2, 0); - RcTree_Encode(rc, p->mid + (posState << kLenNumMidBits), kLenNumMidBits, symbol - kLenNumLowSymbols); - } - else - { - RangeEnc_EncodeBit(rc, &p->choice2, 1); - RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols - kLenNumMidSymbols); - } - } -} - -static void LenEnc_SetPrices(CLenEnc *p, UInt32 posState, UInt32 numSymbols, UInt32 *prices, const UInt32 *ProbPrices) -{ - UInt32 a0 = GET_PRICE_0a(p->choice); - UInt32 a1 = GET_PRICE_1a(p->choice); - UInt32 b0 = a1 + GET_PRICE_0a(p->choice2); - UInt32 b1 = a1 + GET_PRICE_1a(p->choice2); - UInt32 i = 0; - for (i = 0; i < kLenNumLowSymbols; i++) - { - if (i >= numSymbols) + RC_BIT_1(rc, probs); + rc->range = range; + // RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols * 2); + LitEnc_Encode(rc, p->high, symbol - kLenNumLowSymbols * 2); return; - prices[i] = a0 + RcTree_GetPrice(p->low + (posState << kLenNumLowBits), kLenNumLowBits, i, ProbPrices); + } + symbol -= kLenNumLowSymbols; } - for (; i < kLenNumLowSymbols + kLenNumMidSymbols; i++) + + // RcTree_Encode(rc, probs + (posState << kLenNumLowBits), kLenNumLowBits, symbol); { - if (i >= numSymbols) - return; - prices[i] = b0 + RcTree_GetPrice(p->mid + (posState << kLenNumMidBits), kLenNumMidBits, i - kLenNumLowSymbols, ProbPrices); + unsigned m; + unsigned bit; + RC_BIT_0(rc, probs); + probs += (posState << (1 + kLenNumLowBits)); + bit = (symbol >> 2) ; RC_BIT(rc, probs + 1, bit); m = (1 << 1) + bit; + bit = (symbol >> 1) & 1; RC_BIT(rc, probs + m, bit); m = (m << 1) + bit; + bit = symbol & 1; RC_BIT(rc, probs + m, bit); + rc->range = range; } - for (; i < numSymbols; i++) - prices[i] = b1 + RcTree_GetPrice(p->high, kLenNumHighBits, i - kLenNumLowSymbols - kLenNumMidSymbols, ProbPrices); } -static void MY_FAST_CALL LenPriceEnc_UpdateTable(CLenPriceEnc *p, UInt32 posState, const UInt32 *ProbPrices) +static void SetPrices_3(const CLzmaProb *probs, UInt32 startPrice, UInt32 *prices, const CProbPrice *ProbPrices) { - LenEnc_SetPrices(&p->p, posState, p->tableSize, p->prices[posState], ProbPrices); - p->counters[posState] = p->tableSize; + unsigned i; + for (i = 0; i < 8; i += 2) + { + UInt32 price = startPrice; + UInt32 prob; + price += GET_PRICEa(probs[1 ], (i >> 2)); + price += GET_PRICEa(probs[2 + (i >> 2)], (i >> 1) & 1); + prob = probs[4 + (i >> 1)]; + prices[i ] = price + GET_PRICEa_0(prob); + prices[i + 1] = price + GET_PRICEa_1(prob); + } } -static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, UInt32 numPosStates, const UInt32 *ProbPrices) + +MY_NO_INLINE static void MY_FAST_CALL LenPriceEnc_UpdateTable( + CLenPriceEnc *p, unsigned posState, + const CLenEnc *enc, + const CProbPrice *ProbPrices) { - UInt32 posState; + // int y; for (y = 0; y < 100; y++) { + UInt32 a; + unsigned i, numSymbols; + + UInt32 *prices = p->prices[posState]; + { + const CLzmaProb *probs = enc->low + (posState << (1 + kLenNumLowBits)); + SetPrices_3(probs, GET_PRICEa_0(enc->low[0]), prices, ProbPrices); + a = GET_PRICEa_1(enc->low[0]); + SetPrices_3(probs + kLenNumLowSymbols, a + GET_PRICEa_0(enc->low[kLenNumLowSymbols]), prices + kLenNumLowSymbols, ProbPrices); + a += GET_PRICEa_1(enc->low[kLenNumLowSymbols]); + } + numSymbols = p->tableSize; + p->counters[posState] = numSymbols; + for (i = kLenNumLowSymbols * 2; i < numSymbols; i += 1) + { + prices[i] = a + + // RcTree_GetPrice(enc->high, kLenNumHighBits, i - kLenNumLowSymbols * 2, ProbPrices); + LitEnc_GetPrice(enc->high, i - kLenNumLowSymbols * 2, ProbPrices); + /* + unsigned sym = (i - kLenNumLowSymbols * 2) >> 1; + UInt32 price = a + RcTree_GetPrice(enc->high, kLenNumHighBits - 1, sym, ProbPrices); + UInt32 prob = enc->high[(1 << 7) + sym]; + prices[i ] = price + GET_PRICEa_0(prob); + prices[i + 1] = price + GET_PRICEa_1(prob); + */ + } + // } +} + +static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, unsigned numPosStates, + const CLenEnc *enc, + const CProbPrice *ProbPrices) +{ + unsigned posState; for (posState = 0; posState < numPosStates; posState++) - LenPriceEnc_UpdateTable(p, posState, ProbPrices); -} - -static void LenEnc_Encode2(CLenPriceEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState, Bool updatePrice, const UInt32 *ProbPrices) -{ - LenEnc_Encode(&p->p, rc, symbol, posState); - if (updatePrice) - if (--p->counters[posState] == 0) - LenPriceEnc_UpdateTable(p, posState, ProbPrices); + LenPriceEnc_UpdateTable(p, posState, enc, ProbPrices); } - - -static void MovePos(CLzmaEnc *p, UInt32 num) -{ +/* #ifdef SHOW_STAT g_STAT_OFFSET += num; printf("\n MovePos %u", num); #endif +*/ - if (num != 0) - { - p->additionalOffset += num; - p->matchFinder.Skip(p->matchFinderObj, num); - } -} +#define MOVE_POS(p, num) { \ + p->additionalOffset += (num); \ + p->matchFinder.Skip(p->matchFinderObj, (num)); } -static UInt32 ReadMatchDistances(CLzmaEnc *p, UInt32 *numDistancePairsRes) + +static unsigned ReadMatchDistances(CLzmaEnc *p, unsigned *numPairsRes) { - UInt32 lenRes = 0, numPairs; + unsigned numPairs; + + p->additionalOffset++; p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); numPairs = p->matchFinder.GetMatches(p->matchFinderObj, p->matches); + *numPairsRes = numPairs; #ifdef SHOW_STAT printf("\n i = %u numPairs = %u ", g_STAT_OFFSET, numPairs / 2); g_STAT_OFFSET++; { - UInt32 i; + unsigned i; for (i = 0; i < numPairs; i += 2) printf("%2u %6u | ", p->matches[i], p->matches[i + 1]); } #endif - if (numPairs > 0) + if (numPairs == 0) + return 0; { - lenRes = p->matches[numPairs - 2]; - if (lenRes == p->numFastBytes) + unsigned len = p->matches[(size_t)numPairs - 2]; + if (len != p->numFastBytes) + return len; { UInt32 numAvail = p->numAvail; if (numAvail > LZMA_MATCH_LEN_MAX) numAvail = LZMA_MATCH_LEN_MAX; { - const Byte *pbyCur = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; - const Byte *pby = pbyCur + lenRes; - ptrdiff_t dif = (ptrdiff_t)-1 - p->matches[numPairs - 1]; - const Byte *pbyLim = pbyCur + numAvail; - for (; pby != pbyLim && *pby == pby[dif]; pby++); - lenRes = (UInt32)(pby - pbyCur); + const Byte *p1 = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + const Byte *p2 = p1 + len; + ptrdiff_t dif = (ptrdiff_t)-1 - p->matches[(size_t)numPairs - 1]; + const Byte *lim = p1 + numAvail; + for (; p2 != lim && *p2 == p2[dif]; p2++); + return (unsigned)(p2 - p1); } } } - p->additionalOffset++; - *numDistancePairsRes = numPairs; - return lenRes; } +#define MARK_LIT ((UInt32)(Int32)-1) -#define MakeAsChar(p) (p)->backPrev = (UInt32)(-1); (p)->prev1IsChar = False; -#define MakeAsShortRep(p) (p)->backPrev = 0; (p)->prev1IsChar = False; -#define IsShortRep(p) ((p)->backPrev == 0) +#define MakeAs_Lit(p) { (p)->dist = MARK_LIT; (p)->extra = 0; } +#define MakeAs_ShortRep(p) { (p)->dist = 0; (p)->extra = 0; } +#define IsShortRep(p) ((p)->dist == 0) -static UInt32 GetRepLen1Price(CLzmaEnc *p, UInt32 state, UInt32 posState) -{ - return - GET_PRICE_0(p->isRepG0[state]) + - GET_PRICE_0(p->isRep0Long[state][posState]); -} -static UInt32 GetPureRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 state, UInt32 posState) +#define GetPrice_ShortRep(p, state, posState) \ + ( GET_PRICE_0(p->isRepG0[state]) + GET_PRICE_0(p->isRep0Long[state][posState])) + +#define GetPrice_Rep_0(p, state, posState) ( \ + GET_PRICE_1(p->isMatch[state][posState]) \ + + GET_PRICE_1(p->isRep0Long[state][posState])) \ + + GET_PRICE_1(p->isRep[state]) \ + + GET_PRICE_0(p->isRepG0[state]) + + +static UInt32 GetPrice_PureRep(const CLzmaEnc *p, unsigned repIndex, size_t state, size_t posState) { UInt32 price; + UInt32 prob = p->isRepG0[state]; if (repIndex == 0) { - price = GET_PRICE_0(p->isRepG0[state]); + price = GET_PRICE_0(prob); price += GET_PRICE_1(p->isRep0Long[state][posState]); } else { - price = GET_PRICE_1(p->isRepG0[state]); + price = GET_PRICE_1(prob); + prob = p->isRepG1[state]; if (repIndex == 1) - price += GET_PRICE_0(p->isRepG1[state]); + price += GET_PRICE_0(prob); else { - price += GET_PRICE_1(p->isRepG1[state]); + price += GET_PRICE_1(prob); price += GET_PRICE(p->isRepG2[state], repIndex - 2); } } return price; } -static UInt32 GetRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 len, UInt32 state, UInt32 posState) -{ - return p->repLenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN] + - GetPureRepPrice(p, repIndex, state, posState); -} -static UInt32 Backward(CLzmaEnc *p, UInt32 *backRes, UInt32 cur) +static unsigned Backward(CLzmaEnc *p, unsigned cur) { - UInt32 posMem = p->opt[cur].posPrev; - UInt32 backMem = p->opt[cur].backPrev; - p->optimumEndIndex = cur; - do + unsigned wr = cur + 1; + p->optEnd = wr; + + for (;;) { - if (p->opt[cur].prev1IsChar) + UInt32 dist = p->opt[cur].dist; + UInt32 len = p->opt[cur].len; + UInt32 extra = p->opt[cur].extra; + cur -= len; + + if (extra) { - MakeAsChar(&p->opt[posMem]) - p->opt[posMem].posPrev = posMem - 1; - if (p->opt[cur].prev2) + wr--; + p->opt[wr].len = len; + cur -= extra; + len = extra; + if (extra == 1) { - p->opt[posMem - 1].prev1IsChar = False; - p->opt[posMem - 1].posPrev = p->opt[cur].posPrev2; - p->opt[posMem - 1].backPrev = p->opt[cur].backPrev2; + p->opt[wr].dist = dist; + dist = MARK_LIT; + } + else + { + p->opt[wr].dist = 0; + len--; + wr--; + p->opt[wr].dist = MARK_LIT; + p->opt[wr].len = 1; } } + + if (cur == 0) { - UInt32 posPrev = posMem; - UInt32 backCur = backMem; - - backMem = p->opt[posPrev].backPrev; - posMem = p->opt[posPrev].posPrev; - - p->opt[posPrev].backPrev = backCur; - p->opt[posPrev].posPrev = cur; - cur = posPrev; + p->backRes = dist; + p->optCur = wr; + return len; } + + wr--; + p->opt[wr].dist = dist; + p->opt[wr].len = len; } - while (cur != 0); - *backRes = p->opt[0].backPrev; - p->optimumCurrentIndex = p->opt[0].posPrev; - return p->optimumCurrentIndex; } -#define LIT_PROBS(pos, prevByte) (p->litProbs + ((((pos) & p->lpMask) << p->lc) + ((prevByte) >> (8 - p->lc))) * (UInt32)0x300) -static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes) + +#define LIT_PROBS(pos, prevByte) \ + (p->litProbs + (UInt32)3 * (((((pos) << 8) + (prevByte)) & p->lpMask) << p->lc)) + + +static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) { - UInt32 lenEnd, cur; - UInt32 reps[LZMA_NUM_REPS], repLens[LZMA_NUM_REPS]; + unsigned last, cur; + UInt32 reps[LZMA_NUM_REPS]; + unsigned repLens[LZMA_NUM_REPS]; UInt32 *matches; { - - UInt32 numAvail, mainLen, numPairs, repMaxIndex, i, posState, len; - UInt32 matchPrice, repMatchPrice, normalMatchPrice; - const Byte *data; - Byte curByte, matchByte; - - if (p->optimumEndIndex != p->optimumCurrentIndex) - { - const COptimal *opt = &p->opt[p->optimumCurrentIndex]; - UInt32 lenRes = opt->posPrev - p->optimumCurrentIndex; - *backRes = opt->backPrev; - p->optimumCurrentIndex = opt->posPrev; - return lenRes; - } - p->optimumCurrentIndex = p->optimumEndIndex = 0; - - if (p->additionalOffset == 0) - mainLen = ReadMatchDistances(p, &numPairs); - else - { - mainLen = p->longestMatchLength; - numPairs = p->numPairs; - } - - numAvail = p->numAvail; - if (numAvail < 2) - { - *backRes = (UInt32)(-1); - return 1; - } - if (numAvail > LZMA_MATCH_LEN_MAX) - numAvail = LZMA_MATCH_LEN_MAX; - - data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; - repMaxIndex = 0; - for (i = 0; i < LZMA_NUM_REPS; i++) - { - UInt32 lenTest; - const Byte *data2; - reps[i] = p->reps[i]; - data2 = data - reps[i] - 1; - if (data[0] != data2[0] || data[1] != data2[1]) + UInt32 numAvail; + unsigned numPairs, mainLen, repMaxIndex, i, posState; + UInt32 matchPrice, repMatchPrice; + const Byte *data; + Byte curByte, matchByte; + + p->optCur = p->optEnd = 0; + + if (p->additionalOffset == 0) + mainLen = ReadMatchDistances(p, &numPairs); + else { - repLens[i] = 0; - continue; + mainLen = p->longestMatchLen; + numPairs = p->numPairs; } - for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); - repLens[i] = lenTest; - if (lenTest > repLens[repMaxIndex]) - repMaxIndex = i; - } - if (repLens[repMaxIndex] >= p->numFastBytes) - { - UInt32 lenRes; - *backRes = repMaxIndex; - lenRes = repLens[repMaxIndex]; - MovePos(p, lenRes - 1); - return lenRes; - } - - matches = p->matches; - if (mainLen >= p->numFastBytes) - { - *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; - MovePos(p, mainLen - 1); - return mainLen; - } - curByte = *data; - matchByte = *(data - (reps[0] + 1)); - - if (mainLen < 2 && curByte != matchByte && repLens[repMaxIndex] < 2) - { - *backRes = (UInt32)-1; - return 1; - } - - p->opt[0].state = (CState)p->state; - - posState = (position & p->pbMask); - - { - const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); - p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) + - (!IsCharState(p->state) ? - LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : + + numAvail = p->numAvail; + if (numAvail < 2) + { + p->backRes = MARK_LIT; + return 1; + } + if (numAvail > LZMA_MATCH_LEN_MAX) + numAvail = LZMA_MATCH_LEN_MAX; + + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + repMaxIndex = 0; + + for (i = 0; i < LZMA_NUM_REPS; i++) + { + unsigned len; + const Byte *data2; + reps[i] = p->reps[i]; + data2 = data - reps[i]; + if (data[0] != data2[0] || data[1] != data2[1]) + { + repLens[i] = 0; + continue; + } + for (len = 2; len < numAvail && data[len] == data2[len]; len++); + repLens[i] = len; + if (len > repLens[repMaxIndex]) + repMaxIndex = i; + } + + if (repLens[repMaxIndex] >= p->numFastBytes) + { + unsigned len; + p->backRes = repMaxIndex; + len = repLens[repMaxIndex]; + MOVE_POS(p, len - 1) + return len; + } + + matches = p->matches; + + if (mainLen >= p->numFastBytes) + { + p->backRes = matches[(size_t)numPairs - 1] + LZMA_NUM_REPS; + MOVE_POS(p, mainLen - 1) + return mainLen; + } + + curByte = *data; + matchByte = *(data - reps[0]); + + if (mainLen < 2 && curByte != matchByte && repLens[repMaxIndex] < 2) + { + p->backRes = MARK_LIT; + return 1; + } + + p->opt[0].state = (CState)p->state; + + posState = (position & p->pbMask); + + { + const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); + p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) + + (!IsLitState(p->state) ? + LitEnc_Matched_GetPrice(probs, curByte, matchByte, p->ProbPrices) : LitEnc_GetPrice(probs, curByte, p->ProbPrices)); - } - - MakeAsChar(&p->opt[1]); - - matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]); - repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]); - - if (matchByte == curByte) - { - UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, p->state, posState); - if (shortRepPrice < p->opt[1].price) - { - p->opt[1].price = shortRepPrice; - MakeAsShortRep(&p->opt[1]); } - } - lenEnd = ((mainLen >= repLens[repMaxIndex]) ? mainLen : repLens[repMaxIndex]); - - if (lenEnd < 2) - { - *backRes = p->opt[1].backPrev; - return 1; - } - - p->opt[1].posPrev = 0; - for (i = 0; i < LZMA_NUM_REPS; i++) - p->opt[0].backs[i] = reps[i]; - - len = lenEnd; - do - p->opt[len--].price = kInfinityPrice; - while (len >= 2); - - for (i = 0; i < LZMA_NUM_REPS; i++) - { - UInt32 repLen = repLens[i]; - UInt32 price; - if (repLen < 2) - continue; - price = repMatchPrice + GetPureRepPrice(p, i, p->state, posState); - do + + MakeAs_Lit(&p->opt[1]); + + matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]); + repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]); + + if (matchByte == curByte) { - UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][repLen - 2]; - COptimal *opt = &p->opt[repLen]; - if (curAndLenPrice < opt->price) + UInt32 shortRepPrice = repMatchPrice + GetPrice_ShortRep(p, p->state, posState); + if (shortRepPrice < p->opt[1].price) { - opt->price = curAndLenPrice; - opt->posPrev = 0; - opt->backPrev = i; - opt->prev1IsChar = False; + p->opt[1].price = shortRepPrice; + MakeAs_ShortRep(&p->opt[1]); } } - while (--repLen >= 2); - } - - normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]); - - len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); - if (len <= mainLen) - { - UInt32 offs = 0; - while (len > matches[offs]) - offs += 2; - for (; ; len++) + + last = (mainLen >= repLens[repMaxIndex] ? mainLen : repLens[repMaxIndex]); + + if (last < 2) { - COptimal *opt; - UInt32 distance = matches[offs + 1]; + p->backRes = p->opt[1].dist; + return 1; + } + + p->opt[1].len = 1; + + p->opt[0].reps[0] = reps[0]; + p->opt[0].reps[1] = reps[1]; + p->opt[0].reps[2] = reps[2]; + p->opt[0].reps[3] = reps[3]; + + { + unsigned len = last; + do + p->opt[len--].price = kInfinityPrice; + while (len >= 2); + } - UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN]; - UInt32 lenToPosState = GetLenToPosState(len); - if (distance < kNumFullDistances) - curAndLenPrice += p->distancesPrices[lenToPosState][distance]; - else + // ---------- REP ---------- + + for (i = 0; i < LZMA_NUM_REPS; i++) + { + unsigned repLen = repLens[i]; + UInt32 price; + if (repLen < 2) + continue; + price = repMatchPrice + GetPrice_PureRep(p, i, p->state, posState); + do { - UInt32 slot; - GetPosSlot2(distance, slot); - curAndLenPrice += p->alignPrices[distance & kAlignMask] + p->posSlotPrices[lenToPosState][slot]; + UInt32 price2 = price + p->repLenEnc.prices[posState][(size_t)repLen - 2]; + COptimal *opt = &p->opt[repLen]; + if (price2 < opt->price) + { + opt->price = price2; + opt->len = repLen; + opt->dist = i; + opt->extra = 0; + } } - opt = &p->opt[len]; - if (curAndLenPrice < opt->price) + while (--repLen >= 2); + } + + + // ---------- MATCH ---------- + { + unsigned len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); + if (len <= mainLen) { - opt->price = curAndLenPrice; - opt->posPrev = 0; - opt->backPrev = distance + LZMA_NUM_REPS; - opt->prev1IsChar = False; - } - if (len == matches[offs]) - { - offs += 2; - if (offs == numPairs) - break; + unsigned offs = 0; + UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]); + + while (len > matches[offs]) + offs += 2; + + for (; ; len++) + { + COptimal *opt; + UInt32 dist = matches[(size_t)offs + 1]; + UInt32 price2 = normalMatchPrice + p->lenEnc.prices[posState][(size_t)len - LZMA_MATCH_LEN_MIN]; + unsigned lenToPosState = GetLenToPosState(len); + + if (dist < kNumFullDistances) + price2 += p->distancesPrices[lenToPosState][dist & (kNumFullDistances - 1)]; + else + { + unsigned slot; + GetPosSlot2(dist, slot); + price2 += p->alignPrices[dist & kAlignMask]; + price2 += p->posSlotPrices[lenToPosState][slot]; + } + + opt = &p->opt[len]; + + if (price2 < opt->price) + { + opt->price = price2; + opt->len = len; + opt->dist = dist + LZMA_NUM_REPS; + opt->extra = 0; + } + + if (len == matches[offs]) + { + offs += 2; + if (offs == numPairs) + break; + } + } } } - } + - cur = 0; + cur = 0; #ifdef SHOW_STAT2 /* if (position >= 0) */ { unsigned i; printf("\n pos = %4X", position); - for (i = cur; i <= lenEnd; i++) + for (i = cur; i <= last; i++) printf("\nprice[%4X] = %u", position - cur + i, p->opt[i].price); } #endif - } + + + // ---------- Optimal Parsing ---------- + for (;;) { - UInt32 numAvail; - UInt32 numAvailFull, newLen, numPairs, posPrev, state, posState, startLen; - UInt32 curPrice, curAnd1Price, matchPrice, repMatchPrice; - Bool nextIsChar; + UInt32 numAvail, numAvailFull; + unsigned newLen, numPairs, prev, state, posState, startLen; + UInt32 curPrice, litPrice, matchPrice, repMatchPrice; + Bool nextIsLit; Byte curByte, matchByte; const Byte *data; - COptimal *curOpt; - COptimal *nextOpt; + COptimal *curOpt, *nextOpt; - cur++; - if (cur == lenEnd) - return Backward(p, backRes, cur); + if (++cur == last) + return Backward(p, cur); newLen = ReadMatchDistances(p, &numPairs); + if (newLen >= p->numFastBytes) { p->numPairs = numPairs; - p->longestMatchLength = newLen; - return Backward(p, backRes, cur); + p->longestMatchLen = newLen; + return Backward(p, cur); } - position++; + curOpt = &p->opt[cur]; - posPrev = curOpt->posPrev; - if (curOpt->prev1IsChar) - { - posPrev--; - if (curOpt->prev2) - { - state = p->opt[curOpt->posPrev2].state; - if (curOpt->backPrev2 < LZMA_NUM_REPS) - state = kRepNextStates[state]; - else - state = kMatchNextStates[state]; - } - else - state = p->opt[posPrev].state; - state = kLiteralNextStates[state]; - } - else - state = p->opt[posPrev].state; - if (posPrev == cur - 1) + prev = cur - curOpt->len; + + if (curOpt->len == 1) { + state = p->opt[prev].state; if (IsShortRep(curOpt)) state = kShortRepNextStates[state]; else @@ -1236,92 +1312,136 @@ static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes) } else { - UInt32 pos; const COptimal *prevOpt; - if (curOpt->prev1IsChar && curOpt->prev2) + UInt32 b0; + UInt32 dist = curOpt->dist; + + if (curOpt->extra) { - posPrev = curOpt->posPrev2; - pos = curOpt->backPrev2; - state = kRepNextStates[state]; + prev -= curOpt->extra; + state = kState_RepAfterLit; + if (curOpt->extra == 1) + state = (dist < LZMA_NUM_REPS) ? kState_RepAfterLit : kState_MatchAfterLit; } else { - pos = curOpt->backPrev; - if (pos < LZMA_NUM_REPS) + state = p->opt[prev].state; + if (dist < LZMA_NUM_REPS) state = kRepNextStates[state]; else state = kMatchNextStates[state]; } - prevOpt = &p->opt[posPrev]; - if (pos < LZMA_NUM_REPS) + + prevOpt = &p->opt[prev]; + b0 = prevOpt->reps[0]; + + if (dist < LZMA_NUM_REPS) { - UInt32 i; - reps[0] = prevOpt->backs[pos]; - for (i = 1; i <= pos; i++) - reps[i] = prevOpt->backs[i - 1]; - for (; i < LZMA_NUM_REPS; i++) - reps[i] = prevOpt->backs[i]; + if (dist == 0) + { + reps[0] = b0; + reps[1] = prevOpt->reps[1]; + reps[2] = prevOpt->reps[2]; + reps[3] = prevOpt->reps[3]; + } + else + { + reps[1] = b0; + b0 = prevOpt->reps[1]; + if (dist == 1) + { + reps[0] = b0; + reps[2] = prevOpt->reps[2]; + reps[3] = prevOpt->reps[3]; + } + else + { + reps[2] = b0; + reps[0] = prevOpt->reps[dist]; + reps[3] = prevOpt->reps[dist ^ 1]; + } + } } else { - UInt32 i; - reps[0] = (pos - LZMA_NUM_REPS); - for (i = 1; i < LZMA_NUM_REPS; i++) - reps[i] = prevOpt->backs[i - 1]; + reps[0] = (dist - LZMA_NUM_REPS + 1); + reps[1] = b0; + reps[2] = prevOpt->reps[1]; + reps[3] = prevOpt->reps[2]; } } + curOpt->state = (CState)state; + curOpt->reps[0] = reps[0]; + curOpt->reps[1] = reps[1]; + curOpt->reps[2] = reps[2]; + curOpt->reps[3] = reps[3]; - curOpt->backs[0] = reps[0]; - curOpt->backs[1] = reps[1]; - curOpt->backs[2] = reps[2]; - curOpt->backs[3] = reps[3]; - - curPrice = curOpt->price; - nextIsChar = False; data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; curByte = *data; - matchByte = *(data - (reps[0] + 1)); + matchByte = *(data - reps[0]); + position++; posState = (position & p->pbMask); - curAnd1Price = curPrice + GET_PRICE_0(p->isMatch[state][posState]); + /* + The order of Price checks: + < LIT + <= SHORT_REP + < LIT : REP_0 + < REP [ : LIT : REP_0 ] + < MATCH [ : LIT : REP_0 ] + */ + + curPrice = curOpt->price; + litPrice = curPrice + GET_PRICE_0(p->isMatch[state][posState]); + + nextOpt = &p->opt[(size_t)cur + 1]; + nextIsLit = False; + + // if (litPrice >= nextOpt->price) litPrice = 0; else // 18.new { const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); - curAnd1Price += - (!IsCharState(state) ? - LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : + litPrice += (!IsLitState(state) ? + LitEnc_Matched_GetPrice(probs, curByte, matchByte, p->ProbPrices) : LitEnc_GetPrice(probs, curByte, p->ProbPrices)); - } - - nextOpt = &p->opt[cur + 1]; - - if (curAnd1Price < nextOpt->price) - { - nextOpt->price = curAnd1Price; - nextOpt->posPrev = cur; - MakeAsChar(nextOpt); - nextIsChar = True; + + if (litPrice < nextOpt->price) + { + nextOpt->price = litPrice; + nextOpt->len = 1; + MakeAs_Lit(nextOpt); + nextIsLit = True; + } } matchPrice = curPrice + GET_PRICE_1(p->isMatch[state][posState]); repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]); - if (matchByte == curByte && !(nextOpt->posPrev < cur && nextOpt->backPrev == 0)) + // ---------- SHORT_REP ---------- + // if (IsLitState(state)) // 18.new + if (matchByte == curByte) + // if (repMatchPrice < nextOpt->price) // 18.new + if (nextOpt->len < 2 + || (nextOpt->dist != 0 + && nextOpt->extra <= 1 // 17.old + )) { - UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, state, posState); - if (shortRepPrice <= nextOpt->price) + UInt32 shortRepPrice = repMatchPrice + GetPrice_ShortRep(p, state, posState); + if (shortRepPrice <= nextOpt->price) // 17.old + // if (shortRepPrice < nextOpt->price) // 18.new { nextOpt->price = shortRepPrice; - nextOpt->posPrev = cur; - MakeAsShortRep(nextOpt); - nextIsChar = True; + nextOpt->len = 1; + MakeAs_ShortRep(nextOpt); + nextIsLit = False; } } + numAvailFull = p->numAvail; { UInt32 temp = kNumOpts - 1 - cur; - if (temp < numAvailFull) + if (numAvailFull > temp) numAvailFull = temp; } @@ -1329,41 +1449,53 @@ static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes) continue; numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes); - if (!nextIsChar && matchByte != curByte) /* speed optimization */ - { - /* try Literal + rep0 */ - UInt32 temp; - UInt32 lenTest2; - const Byte *data2 = data - reps[0] - 1; - UInt32 limit = p->numFastBytes + 1; - if (limit > numAvailFull) - limit = numAvailFull; + // numAvail <= p->numFastBytes - for (temp = 1; temp < limit && data[temp] == data2[temp]; temp++); - lenTest2 = temp - 1; - if (lenTest2 >= 2) + // ---------- LIT : REP_0 ---------- + + if ( + // litPrice != 0 && // 18.new + !nextIsLit + && matchByte != curByte + && numAvailFull > 2) + { + const Byte *data2 = data - reps[0]; + if (data[1] == data2[1] && data[2] == data2[2]) { - UInt32 state2 = kLiteralNextStates[state]; - UInt32 posStateNext = (position + 1) & p->pbMask; - UInt32 nextRepMatchPrice = curAnd1Price + - GET_PRICE_1(p->isMatch[state2][posStateNext]) + - GET_PRICE_1(p->isRep[state2]); - /* for (; lenTest2 >= 2; lenTest2--) */ + unsigned len; + unsigned limit = p->numFastBytes + 1; + if (limit > numAvailFull) + limit = numAvailFull; + for (len = 3; len < limit && data[len] == data2[len]; len++); + { - UInt32 curAndLenPrice; - COptimal *opt; - UInt32 offset = cur + 1 + lenTest2; - while (lenEnd < offset) - p->opt[++lenEnd].price = kInfinityPrice; - curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); - opt = &p->opt[offset]; - if (curAndLenPrice < opt->price) + unsigned state2 = kLiteralNextStates[state]; + unsigned posState2 = (position + 1) & p->pbMask; + UInt32 price = litPrice + GetPrice_Rep_0(p, state2, posState2); { - opt->price = curAndLenPrice; - opt->posPrev = cur + 1; - opt->backPrev = 0; - opt->prev1IsChar = True; - opt->prev2 = False; + unsigned offset = cur + len; + while (last < offset) + p->opt[++last].price = kInfinityPrice; + + // do + { + UInt32 price2; + COptimal *opt; + len--; + // price2 = price + GetPrice_Len_Rep_0(p, len, state2, posState2); + price2 = price + p->repLenEnc.prices[posState2][len - LZMA_MATCH_LEN_MIN]; + + opt = &p->opt[offset]; + // offset--; + if (price2 < opt->price) + { + opt->price = price2; + opt->len = len; + opt->dist = 0; + opt->extra = 1; + } + } + // while (len >= 3); } } } @@ -1371,87 +1503,105 @@ static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes) startLen = 2; /* speed optimization */ { - UInt32 repIndex; - for (repIndex = 0; repIndex < LZMA_NUM_REPS; repIndex++) - { - UInt32 lenTest; - UInt32 lenTestTemp; - UInt32 price; - const Byte *data2 = data - reps[repIndex] - 1; - if (data[0] != data2[0] || data[1] != data2[1]) - continue; - for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); - while (lenEnd < cur + lenTest) - p->opt[++lenEnd].price = kInfinityPrice; - lenTestTemp = lenTest; - price = repMatchPrice + GetPureRepPrice(p, repIndex, state, posState); - do + // ---------- REP ---------- + unsigned repIndex = 0; // 17.old + // unsigned repIndex = IsLitState(state) ? 0 : 1; // 18.notused + for (; repIndex < LZMA_NUM_REPS; repIndex++) { - UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][lenTest - 2]; - COptimal *opt = &p->opt[cur + lenTest]; - if (curAndLenPrice < opt->price) - { - opt->price = curAndLenPrice; - opt->posPrev = cur; - opt->backPrev = repIndex; - opt->prev1IsChar = False; - } - } - while (--lenTest >= 2); - lenTest = lenTestTemp; - - if (repIndex == 0) - startLen = lenTest + 1; + unsigned len; + UInt32 price; + const Byte *data2 = data - reps[repIndex]; + if (data[0] != data2[0] || data[1] != data2[1]) + continue; - /* if (_maxMode) */ + for (len = 2; len < numAvail && data[len] == data2[len]; len++); + + // if (len < startLen) continue; // 18.new: speed optimization + + while (last < cur + len) + p->opt[++last].price = kInfinityPrice; { - UInt32 lenTest2 = lenTest + 1; - UInt32 limit = lenTest2 + p->numFastBytes; + unsigned len2 = len; + price = repMatchPrice + GetPrice_PureRep(p, repIndex, state, posState); + do + { + UInt32 price2 = price + p->repLenEnc.prices[posState][(size_t)len2 - 2]; + COptimal *opt = &p->opt[cur + len2]; + if (price2 < opt->price) + { + opt->price = price2; + opt->len = len2; + opt->dist = repIndex; + opt->extra = 0; + } + } + while (--len2 >= 2); + } + + if (repIndex == 0) startLen = len + 1; // 17.old + // startLen = len + 1; // 18.new + + /* if (_maxMode) */ + { + // ---------- REP : LIT : REP_0 ---------- + // numFastBytes + 1 + numFastBytes + + unsigned len2 = len + 1; + unsigned limit = len2 + p->numFastBytes; if (limit > numAvailFull) limit = numAvailFull; - for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); - lenTest2 -= lenTest + 1; - if (lenTest2 >= 2) + + for (; len2 < limit && data[len2] == data2[len2]; len2++); + + len2 -= len; + if (len2 >= 3) { - UInt32 nextRepMatchPrice; - UInt32 state2 = kRepNextStates[state]; - UInt32 posStateNext = (position + lenTest) & p->pbMask; - UInt32 curAndLenCharPrice = - price + p->repLenEnc.prices[posState][lenTest - 2] + - GET_PRICE_0(p->isMatch[state2][posStateNext]) + - LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), - data[lenTest], data2[lenTest], p->ProbPrices); - state2 = kLiteralNextStates[state2]; - posStateNext = (position + lenTest + 1) & p->pbMask; - nextRepMatchPrice = curAndLenCharPrice + - GET_PRICE_1(p->isMatch[state2][posStateNext]) + - GET_PRICE_1(p->isRep[state2]); + unsigned state2 = kRepNextStates[state]; + unsigned posState2 = (position + len) & p->pbMask; + price += + p->repLenEnc.prices[posState][(size_t)len - 2] + + GET_PRICE_0(p->isMatch[state2][posState2]) + + LitEnc_Matched_GetPrice(LIT_PROBS(position + len, data[(size_t)len - 1]), + data[len], data2[len], p->ProbPrices); - /* for (; lenTest2 >= 2; lenTest2--) */ + // state2 = kLiteralNextStates[state2]; + state2 = kState_LitAfterRep; + posState2 = (posState2 + 1) & p->pbMask; + + + price += GetPrice_Rep_0(p, state2, posState2); { - UInt32 curAndLenPrice; - COptimal *opt; - UInt32 offset = cur + lenTest + 1 + lenTest2; - while (lenEnd < offset) - p->opt[++lenEnd].price = kInfinityPrice; - curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); - opt = &p->opt[offset]; - if (curAndLenPrice < opt->price) + unsigned offset = cur + len + len2; + while (last < offset) + p->opt[++last].price = kInfinityPrice; + // do { - opt->price = curAndLenPrice; - opt->posPrev = cur + lenTest + 1; - opt->backPrev = 0; - opt->prev1IsChar = True; - opt->prev2 = True; - opt->posPrev2 = cur; - opt->backPrev2 = repIndex; + unsigned price2; + COptimal *opt; + len2--; + // price2 = price + GetPrice_Len_Rep_0(p, len2, state2, posState2); + price2 = price + p->repLenEnc.prices[posState2][len2 - LZMA_MATCH_LEN_MIN]; + + opt = &p->opt[offset]; + // offset--; + if (price2 < opt->price) + { + opt->price = price2; + opt->len = len2; + opt->extra = (CExtra)(len + 1); + opt->dist = repIndex; + } } + // while (len2 >= 3); } } } + } } - } - /* for (UInt32 lenTest = 2; lenTest <= newLen; lenTest++) */ + + + // ---------- MATCH ---------- + /* for (unsigned len = 2; len <= newLen; len++) */ if (newLen > numAvail) { newLen = numAvail; @@ -1459,134 +1609,148 @@ static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes) matches[numPairs] = newLen; numPairs += 2; } + if (newLen >= startLen) { UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]); - UInt32 offs, curBack, posSlot; - UInt32 lenTest; - while (lenEnd < cur + newLen) - p->opt[++lenEnd].price = kInfinityPrice; + UInt32 dist; + unsigned offs, posSlot, len; + while (last < cur + newLen) + p->opt[++last].price = kInfinityPrice; offs = 0; while (startLen > matches[offs]) offs += 2; - curBack = matches[offs + 1]; - GetPosSlot2(curBack, posSlot); - for (lenTest = /*2*/ startLen; ; lenTest++) + dist = matches[(size_t)offs + 1]; + + // if (dist >= kNumFullDistances) + GetPosSlot2(dist, posSlot); + + for (len = /*2*/ startLen; ; len++) { - UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][lenTest - LZMA_MATCH_LEN_MIN]; + UInt32 price = normalMatchPrice + p->lenEnc.prices[posState][(size_t)len - LZMA_MATCH_LEN_MIN]; { - UInt32 lenToPosState = GetLenToPosState(lenTest); - COptimal *opt; - if (curBack < kNumFullDistances) - curAndLenPrice += p->distancesPrices[lenToPosState][curBack]; - else - curAndLenPrice += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[curBack & kAlignMask]; - - opt = &p->opt[cur + lenTest]; - if (curAndLenPrice < opt->price) - { - opt->price = curAndLenPrice; - opt->posPrev = cur; - opt->backPrev = curBack + LZMA_NUM_REPS; - opt->prev1IsChar = False; - } + COptimal *opt; + unsigned lenToPosState = len - 2; lenToPosState = GetLenToPosState2(lenToPosState); + if (dist < kNumFullDistances) + price += p->distancesPrices[lenToPosState][dist & (kNumFullDistances - 1)]; + else + price += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[dist & kAlignMask]; + + opt = &p->opt[cur + len]; + if (price < opt->price) + { + opt->price = price; + opt->len = len; + opt->dist = dist + LZMA_NUM_REPS; + opt->extra = 0; + } } - if (/*_maxMode && */lenTest == matches[offs]) + if (/*_maxMode && */ len == matches[offs]) { - /* Try Match + Literal + Rep0 */ - const Byte *data2 = data - curBack - 1; - UInt32 lenTest2 = lenTest + 1; - UInt32 limit = lenTest2 + p->numFastBytes; + // MATCH : LIT : REP_0 + + const Byte *data2 = data - dist - 1; + unsigned len2 = len + 1; + unsigned limit = len2 + p->numFastBytes; if (limit > numAvailFull) limit = numAvailFull; - for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); - lenTest2 -= lenTest + 1; - if (lenTest2 >= 2) + + for (; len2 < limit && data[len2] == data2[len2]; len2++); + + len2 -= len; + + if (len2 >= 3) { - UInt32 nextRepMatchPrice; - UInt32 state2 = kMatchNextStates[state]; - UInt32 posStateNext = (position + lenTest) & p->pbMask; - UInt32 curAndLenCharPrice = curAndLenPrice + - GET_PRICE_0(p->isMatch[state2][posStateNext]) + - LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), - data[lenTest], data2[lenTest], p->ProbPrices); - state2 = kLiteralNextStates[state2]; - posStateNext = (posStateNext + 1) & p->pbMask; - nextRepMatchPrice = curAndLenCharPrice + - GET_PRICE_1(p->isMatch[state2][posStateNext]) + - GET_PRICE_1(p->isRep[state2]); - - /* for (; lenTest2 >= 2; lenTest2--) */ + unsigned state2 = kMatchNextStates[state]; + unsigned posState2 = (position + len) & p->pbMask; + unsigned offset; + price += GET_PRICE_0(p->isMatch[state2][posState2]); + price += LitEnc_Matched_GetPrice(LIT_PROBS(position + len, data[(size_t)len - 1]), + data[len], data2[len], p->ProbPrices); + + // state2 = kLiteralNextStates[state2]; + state2 = kState_LitAfterMatch; + + posState2 = (posState2 + 1) & p->pbMask; + price += GetPrice_Rep_0(p, state2, posState2); + + offset = cur + len + len2; + while (last < offset) + p->opt[++last].price = kInfinityPrice; + // do { - UInt32 offset = cur + lenTest + 1 + lenTest2; - UInt32 curAndLenPrice2; + UInt32 price2; COptimal *opt; - while (lenEnd < offset) - p->opt[++lenEnd].price = kInfinityPrice; - curAndLenPrice2 = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); + len2--; + // price2 = price + GetPrice_Len_Rep_0(p, len2, state2, posState2); + price2 = price + p->repLenEnc.prices[posState2][len2 - LZMA_MATCH_LEN_MIN]; opt = &p->opt[offset]; - if (curAndLenPrice2 < opt->price) + // offset--; + if (price2 < opt->price) { - opt->price = curAndLenPrice2; - opt->posPrev = cur + lenTest + 1; - opt->backPrev = 0; - opt->prev1IsChar = True; - opt->prev2 = True; - opt->posPrev2 = cur; - opt->backPrev2 = curBack + LZMA_NUM_REPS; + opt->price = price2; + opt->len = len2; + opt->extra = (CExtra)(len + 1); + opt->dist = dist + LZMA_NUM_REPS; } } + // while (len2 >= 3); } + offs += 2; if (offs == numPairs) break; - curBack = matches[offs + 1]; - if (curBack >= kNumFullDistances) - GetPosSlot2(curBack, posSlot); + dist = matches[(size_t)offs + 1]; + // if (dist >= kNumFullDistances) + GetPosSlot2(dist, posSlot); } } } } } + + #define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist)) -static UInt32 GetOptimumFast(CLzmaEnc *p, UInt32 *backRes) + + +static unsigned GetOptimumFast(CLzmaEnc *p) { - UInt32 numAvail, mainLen, mainDist, numPairs, repIndex, repLen, i; + UInt32 numAvail, mainDist; + unsigned mainLen, numPairs, repIndex, repLen, i; const Byte *data; - const UInt32 *matches; if (p->additionalOffset == 0) mainLen = ReadMatchDistances(p, &numPairs); else { - mainLen = p->longestMatchLength; + mainLen = p->longestMatchLen; numPairs = p->numPairs; } numAvail = p->numAvail; - *backRes = (UInt32)-1; + p->backRes = MARK_LIT; if (numAvail < 2) return 1; if (numAvail > LZMA_MATCH_LEN_MAX) numAvail = LZMA_MATCH_LEN_MAX; data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; - repLen = repIndex = 0; + for (i = 0; i < LZMA_NUM_REPS; i++) { - UInt32 len; - const Byte *data2 = data - p->reps[i] - 1; + unsigned len; + const Byte *data2 = data - p->reps[i]; if (data[0] != data2[0] || data[1] != data2[1]) continue; for (len = 2; len < numAvail && data[len] == data2[len]; len++); if (len >= p->numFastBytes) { - *backRes = i; - MovePos(p, len - 1); + p->backRes = i; + MOVE_POS(p, len - 1) return len; } if (len > repLen) @@ -1596,84 +1760,152 @@ static UInt32 GetOptimumFast(CLzmaEnc *p, UInt32 *backRes) } } - matches = p->matches; if (mainLen >= p->numFastBytes) { - *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; - MovePos(p, mainLen - 1); + p->backRes = p->matches[(size_t)numPairs - 1] + LZMA_NUM_REPS; + MOVE_POS(p, mainLen - 1) return mainLen; } mainDist = 0; /* for GCC */ + if (mainLen >= 2) { - mainDist = matches[numPairs - 1]; - while (numPairs > 2 && mainLen == matches[numPairs - 4] + 1) + mainDist = p->matches[(size_t)numPairs - 1]; + while (numPairs > 2) { - if (!ChangePair(matches[numPairs - 3], mainDist)) + UInt32 dist2; + if (mainLen != p->matches[(size_t)numPairs - 4] + 1) + break; + dist2 = p->matches[(size_t)numPairs - 3]; + if (!ChangePair(dist2, mainDist)) break; numPairs -= 2; - mainLen = matches[numPairs - 2]; - mainDist = matches[numPairs - 1]; + mainLen--; + mainDist = dist2; } if (mainLen == 2 && mainDist >= 0x80) mainLen = 1; } - if (repLen >= 2 && ( - (repLen + 1 >= mainLen) || - (repLen + 2 >= mainLen && mainDist >= (1 << 9)) || - (repLen + 3 >= mainLen && mainDist >= (1 << 15)))) + if (repLen >= 2) + if ( repLen + 1 >= mainLen + || (repLen + 2 >= mainLen && mainDist >= (1 << 9)) + || (repLen + 3 >= mainLen && mainDist >= (1 << 15))) { - *backRes = repIndex; - MovePos(p, repLen - 1); + p->backRes = repIndex; + MOVE_POS(p, repLen - 1) return repLen; } if (mainLen < 2 || numAvail <= 2) return 1; - p->longestMatchLength = ReadMatchDistances(p, &p->numPairs); - if (p->longestMatchLength >= 2) { - UInt32 newDistance = matches[p->numPairs - 1]; - if ((p->longestMatchLength >= mainLen && newDistance < mainDist) || - (p->longestMatchLength == mainLen + 1 && !ChangePair(mainDist, newDistance)) || - (p->longestMatchLength > mainLen + 1) || - (p->longestMatchLength + 1 >= mainLen && mainLen >= 3 && ChangePair(newDistance, mainDist))) - return 1; + unsigned len1 = ReadMatchDistances(p, &p->numPairs); + p->longestMatchLen = len1; + + if (len1 >= 2) + { + UInt32 newDist = p->matches[(size_t)p->numPairs - 1]; + if ( (len1 >= mainLen && newDist < mainDist) + || (len1 == mainLen + 1 && !ChangePair(mainDist, newDist)) + || (len1 > mainLen + 1) + || (len1 + 1 >= mainLen && mainLen >= 3 && ChangePair(newDist, mainDist))) + return 1; + } } data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + for (i = 0; i < LZMA_NUM_REPS; i++) { - UInt32 len, limit; - const Byte *data2 = data - p->reps[i] - 1; + unsigned len, limit; + const Byte *data2 = data - p->reps[i]; if (data[0] != data2[0] || data[1] != data2[1]) continue; limit = mainLen - 1; - for (len = 2; len < limit && data[len] == data2[len]; len++); - if (len >= limit) - return 1; + for (len = 2;; len++) + { + if (len >= limit) + return 1; + if (data[len] != data2[len]) + break; + } + } + + p->backRes = mainDist + LZMA_NUM_REPS; + if (mainLen != 2) + { + MOVE_POS(p, mainLen - 2) } - *backRes = mainDist + LZMA_NUM_REPS; - MovePos(p, mainLen - 2); return mainLen; } -static void WriteEndMarker(CLzmaEnc *p, UInt32 posState) + + + +static void WriteEndMarker(CLzmaEnc *p, unsigned posState) { - UInt32 len; - RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); - RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); + UInt32 range; + range = p->rc.range; + { + UInt32 ttt, newBound; + CLzmaProb *prob = &p->isMatch[p->state][posState]; + RC_BIT_PRE(&p->rc, prob) + RC_BIT_1(&p->rc, prob) + prob = &p->isRep[p->state]; + RC_BIT_PRE(&p->rc, prob) + RC_BIT_0(&p->rc, prob) + } p->state = kMatchNextStates[p->state]; - len = LZMA_MATCH_LEN_MIN; - LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); - RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, (1 << kNumPosSlotBits) - 1); - RangeEnc_EncodeDirectBits(&p->rc, (((UInt32)1 << 30) - 1) >> kNumAlignBits, 30 - kNumAlignBits); - RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask); + + p->rc.range = range; + LenEnc_Encode(&p->lenProbs, &p->rc, 0, posState); + range = p->rc.range; + + { + // RcTree_Encode_PosSlot(&p->rc, p->posSlotEncoder[0], (1 << kNumPosSlotBits) - 1); + CLzmaProb *probs = p->posSlotEncoder[0]; + unsigned m = 1; + do + { + UInt32 ttt, newBound; + RC_BIT_PRE(p, probs + m) + RC_BIT_1(&p->rc, probs + m); + m = (m << 1) + 1; + } + while (m < (1 << kNumPosSlotBits)); + } + { + // RangeEnc_EncodeDirectBits(&p->rc, ((UInt32)1 << (30 - kNumAlignBits)) - 1, 30 - kNumAlignBits); UInt32 range = p->range; + unsigned numBits = 30 - kNumAlignBits; + do + { + range >>= 1; + p->rc.low += range; + RC_NORM(&p->rc) + } + while (--numBits); + } + + { + // RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask); + CLzmaProb *probs = p->posAlignEncoder; + unsigned m = 1; + do + { + UInt32 ttt, newBound; + RC_BIT_PRE(p, probs + m) + RC_BIT_1(&p->rc, probs + m); + m = (m << 1) + 1; + } + while (m < kAlignTableSize); + } + p->rc.range = range; } + static SRes CheckErrors(CLzmaEnc *p) { if (p->result != SZ_OK) @@ -1687,7 +1919,8 @@ static SRes CheckErrors(CLzmaEnc *p) return p->result; } -static SRes Flush(CLzmaEnc *p, UInt32 nowPos) + +MY_NO_INLINE static SRes Flush(CLzmaEnc *p, UInt32 nowPos) { /* ReleaseMFStream(); */ p->finished = True; @@ -1698,47 +1931,108 @@ static SRes Flush(CLzmaEnc *p, UInt32 nowPos) return CheckErrors(p); } + + static void FillAlignPrices(CLzmaEnc *p) { - UInt32 i; - for (i = 0; i < kAlignTableSize; i++) - p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices); + unsigned i; + const CProbPrice *ProbPrices = p->ProbPrices; + const CLzmaProb *probs = p->posAlignEncoder; p->alignPriceCount = 0; + for (i = 0; i < kAlignTableSize / 2; i++) + { + UInt32 price = 0; + unsigned symbol = i; + unsigned m = 1; + unsigned bit; + UInt32 prob; + bit = symbol & 1; symbol >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit; + bit = symbol & 1; symbol >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit; + bit = symbol & 1; symbol >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit; + prob = probs[m]; + p->alignPrices[i ] = price + GET_PRICEa_0(prob); + p->alignPrices[i + 8] = price + GET_PRICEa_1(prob); + // p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices); + } } + static void FillDistancesPrices(CLzmaEnc *p) { UInt32 tempPrices[kNumFullDistances]; - UInt32 i, lenToPosState; + unsigned i, lenToPosState; + + const CProbPrice *ProbPrices = p->ProbPrices; + p->matchPriceCount = 0; + for (i = kStartPosModelIndex; i < kNumFullDistances; i++) { - UInt32 posSlot = GetPosSlot1(i); - UInt32 footerBits = ((posSlot >> 1) - 1); - UInt32 base = ((2 | (posSlot & 1)) << footerBits); - tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base - posSlot - 1, footerBits, i - base, p->ProbPrices); + unsigned posSlot = GetPosSlot1(i); + unsigned footerBits = ((posSlot >> 1) - 1); + unsigned base = ((2 | (posSlot & 1)) << footerBits); + // tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base, footerBits, i - base, p->ProbPrices); + + const CLzmaProb *probs = p->posEncoders + base; + UInt32 price = 0; + unsigned m = 1; + unsigned symbol = i - base; + do + { + unsigned bit = symbol & 1; + symbol >>= 1; + price += GET_PRICEa(probs[m], bit); + m = (m << 1) + bit; + } + while (--footerBits); + tempPrices[i] = price; } for (lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++) { - UInt32 posSlot; + unsigned posSlot; const CLzmaProb *encoder = p->posSlotEncoder[lenToPosState]; UInt32 *posSlotPrices = p->posSlotPrices[lenToPosState]; - for (posSlot = 0; posSlot < p->distTableSize; posSlot++) - posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices); - for (posSlot = kEndPosModelIndex; posSlot < p->distTableSize; posSlot++) - posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits); + unsigned distTableSize = p->distTableSize; + const CLzmaProb *probs = encoder; + for (posSlot = 0; posSlot < distTableSize; posSlot += 2) + { + // posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices); + UInt32 price = 0; + unsigned bit; + unsigned symbol = (posSlot >> 1) + (1 << (kNumPosSlotBits - 1)); + UInt32 prob; + bit = symbol & 1; symbol >>= 1; price += GET_PRICEa(probs[symbol], bit); + bit = symbol & 1; symbol >>= 1; price += GET_PRICEa(probs[symbol], bit); + bit = symbol & 1; symbol >>= 1; price += GET_PRICEa(probs[symbol], bit); + bit = symbol & 1; symbol >>= 1; price += GET_PRICEa(probs[symbol], bit); + bit = symbol & 1; symbol >>= 1; price += GET_PRICEa(probs[symbol], bit); + prob = probs[(posSlot >> 1) + (1 << (kNumPosSlotBits - 1))]; + posSlotPrices[posSlot ] = price + GET_PRICEa_0(prob); + posSlotPrices[posSlot + 1] = price + GET_PRICEa_1(prob); + } + for (posSlot = kEndPosModelIndex; posSlot < distTableSize; posSlot++) + posSlotPrices[posSlot] += ((UInt32)(((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits); { UInt32 *distancesPrices = p->distancesPrices[lenToPosState]; - for (i = 0; i < kStartPosModelIndex; i++) - distancesPrices[i] = posSlotPrices[i]; - for (; i < kNumFullDistances; i++) - distancesPrices[i] = posSlotPrices[GetPosSlot1(i)] + tempPrices[i]; + { + distancesPrices[0] = posSlotPrices[0]; + distancesPrices[1] = posSlotPrices[1]; + distancesPrices[2] = posSlotPrices[2]; + distancesPrices[3] = posSlotPrices[3]; + } + for (i = 4; i < kNumFullDistances; i += 2) + { + UInt32 slotPrice = posSlotPrices[GetPosSlot1(i)]; + distancesPrices[i ] = slotPrice + tempPrices[i]; + distancesPrices[i + 1] = slotPrice + tempPrices[i + 1]; + } } } - p->matchPriceCount = 0; } + + void LzmaEnc_Construct(CLzmaEnc *p) { RangeEnc_Construct(&p->rc); @@ -1762,26 +2056,27 @@ void LzmaEnc_Construct(CLzmaEnc *p) LzmaEnc_InitPriceTables(p->ProbPrices); p->litProbs = NULL; p->saveState.litProbs = NULL; + } -CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc) +CLzmaEncHandle LzmaEnc_Create(ISzAllocPtr alloc) { void *p; - p = alloc->Alloc(alloc, sizeof(CLzmaEnc)); + p = ISzAlloc_Alloc(alloc, sizeof(CLzmaEnc)); if (p) LzmaEnc_Construct((CLzmaEnc *)p); return p; } -void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc) +void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAllocPtr alloc) { - alloc->Free(alloc, p->litProbs); - alloc->Free(alloc, p->saveState.litProbs); + ISzAlloc_Free(alloc, p->litProbs); + ISzAlloc_Free(alloc, p->saveState.litProbs); p->litProbs = NULL; p->saveState.litProbs = NULL; } -void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig) +void LzmaEnc_Destruct(CLzmaEnc *p, ISzAllocPtr alloc, ISzAllocPtr allocBig) { #ifndef _7ZIP_ST MatchFinderMt_Destruct(&p->matchFinderMt, allocBig); @@ -1792,13 +2087,14 @@ void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig) RangeEnc_Free(&p->rc, alloc); } -void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig) +void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAllocPtr alloc, ISzAllocPtr allocBig) { LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig); - alloc->Free(alloc, p); + ISzAlloc_Free(alloc, p); } -static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize, UInt32 maxUnpackSize) + +static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, UInt32 maxPackSize, UInt32 maxUnpackSize) { UInt32 nowPos32, startPos32; if (p->needInit) @@ -1816,13 +2112,13 @@ static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize if (p->nowPos64 == 0) { - UInt32 numPairs; + unsigned numPairs; Byte curByte; if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) return Flush(p, nowPos32); ReadMatchDistances(p, &numPairs); - RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][0], 0); - p->state = kLiteralNextStates[p->state]; + RangeEnc_EncodeBit_0(&p->rc, &p->isMatch[kState_Start][0]); + // p->state = kLiteralNextStates[p->state]; curByte = *(p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset); LitEnc_Encode(&p->rc, p->litProbs, curByte); p->additionalOffset--; @@ -1830,109 +2126,225 @@ static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize } if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0) + for (;;) { - UInt32 pos, len, posState; - + UInt32 dist; + unsigned len, posState; + UInt32 range, ttt, newBound; + CLzmaProb *probs; + if (p->fastMode) - len = GetOptimumFast(p, &pos); + len = GetOptimumFast(p); else - len = GetOptimum(p, nowPos32, &pos); + { + unsigned oci = p->optCur; + if (p->optEnd == oci) + len = GetOptimum(p, nowPos32); + else + { + const COptimal *opt = &p->opt[oci]; + len = opt->len; + p->backRes = opt->dist; + p->optCur = oci + 1; + } + } + + posState = (unsigned)nowPos32 & p->pbMask; + range = p->rc.range; + probs = &p->isMatch[p->state][posState]; + + RC_BIT_PRE(&p->rc, probs) + + dist = p->backRes; #ifdef SHOW_STAT2 - printf("\n pos = %4X, len = %u pos = %u", nowPos32, len, pos); + printf("\n pos = %6X, len = %3u pos = %6u", nowPos32, len, dist); #endif - posState = nowPos32 & p->pbMask; - if (len == 1 && pos == (UInt32)-1) + if (dist == MARK_LIT) { Byte curByte; - CLzmaProb *probs; const Byte *data; + unsigned state; - RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 0); + RC_BIT_0(&p->rc, probs); + p->rc.range = range; data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; - curByte = *data; probs = LIT_PROBS(nowPos32, *(data - 1)); - if (IsCharState(p->state)) + curByte = *data; + state = p->state; + p->state = kLiteralNextStates[state]; + if (IsLitState(state)) LitEnc_Encode(&p->rc, probs, curByte); else - LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0] - 1)); - p->state = kLiteralNextStates[p->state]; + LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0])); } else { - RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); - if (pos < LZMA_NUM_REPS) + RC_BIT_1(&p->rc, probs); + probs = &p->isRep[p->state]; + RC_BIT_PRE(&p->rc, probs) + + if (dist < LZMA_NUM_REPS) { - RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 1); - if (pos == 0) + RC_BIT_1(&p->rc, probs); + probs = &p->isRepG0[p->state]; + RC_BIT_PRE(&p->rc, probs) + if (dist == 0) { - RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 0); - RangeEnc_EncodeBit(&p->rc, &p->isRep0Long[p->state][posState], ((len == 1) ? 0 : 1)); + RC_BIT_0(&p->rc, probs); + probs = &p->isRep0Long[p->state][posState]; + RC_BIT_PRE(&p->rc, probs) + if (len != 1) + { + RC_BIT_1_BASE(&p->rc, probs); + } + else + { + RC_BIT_0_BASE(&p->rc, probs); + p->state = kShortRepNextStates[p->state]; + } } else { - UInt32 distance = p->reps[pos]; - RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 1); - if (pos == 1) - RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 0); + RC_BIT_1(&p->rc, probs); + probs = &p->isRepG1[p->state]; + RC_BIT_PRE(&p->rc, probs) + if (dist == 1) + { + RC_BIT_0_BASE(&p->rc, probs); + dist = p->reps[1]; + } else { - RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 1); - RangeEnc_EncodeBit(&p->rc, &p->isRepG2[p->state], pos - 2); - if (pos == 3) + RC_BIT_1(&p->rc, probs); + probs = &p->isRepG2[p->state]; + RC_BIT_PRE(&p->rc, probs) + if (dist == 2) + { + RC_BIT_0_BASE(&p->rc, probs); + dist = p->reps[2]; + } + else + { + RC_BIT_1_BASE(&p->rc, probs); + dist = p->reps[3]; p->reps[3] = p->reps[2]; + } p->reps[2] = p->reps[1]; } p->reps[1] = p->reps[0]; - p->reps[0] = distance; + p->reps[0] = dist; } - if (len == 1) - p->state = kShortRepNextStates[p->state]; - else + + RC_NORM(&p->rc) + + p->rc.range = range; + + if (len != 1) { - LenEnc_Encode2(&p->repLenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); + LenEnc_Encode(&p->repLenProbs, &p->rc, len - LZMA_MATCH_LEN_MIN, posState); + if (!p->fastMode) + if (--p->repLenEnc.counters[posState] == 0) + LenPriceEnc_UpdateTable(&p->repLenEnc, posState, &p->repLenProbs, p->ProbPrices); + p->state = kRepNextStates[p->state]; } } else { - UInt32 posSlot; - RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); + unsigned posSlot; + RC_BIT_0(&p->rc, probs); + p->rc.range = range; p->state = kMatchNextStates[p->state]; - LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); - pos -= LZMA_NUM_REPS; - GetPosSlot(pos, posSlot); - RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, posSlot); - - if (posSlot >= kStartPosModelIndex) - { - UInt32 footerBits = ((posSlot >> 1) - 1); - UInt32 base = ((2 | (posSlot & 1)) << footerBits); - UInt32 posReduced = pos - base; - if (posSlot < kEndPosModelIndex) - RcTree_ReverseEncode(&p->rc, p->posEncoders + base - posSlot - 1, footerBits, posReduced); - else - { - RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits); - RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask); - p->alignPriceCount++; - } - } + LenEnc_Encode(&p->lenProbs, &p->rc, len - LZMA_MATCH_LEN_MIN, posState); + if (!p->fastMode) + if (--p->lenEnc.counters[posState] == 0) + LenPriceEnc_UpdateTable(&p->lenEnc, posState, &p->lenProbs, p->ProbPrices); + + dist -= LZMA_NUM_REPS; p->reps[3] = p->reps[2]; p->reps[2] = p->reps[1]; p->reps[1] = p->reps[0]; - p->reps[0] = pos; + p->reps[0] = dist + 1; + p->matchPriceCount++; + GetPosSlot(dist, posSlot); + // RcTree_Encode_PosSlot(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], posSlot); + { + UInt32 symbol = posSlot + (1 << kNumPosSlotBits); + range = p->rc.range; + probs = p->posSlotEncoder[GetLenToPosState(len)]; + do + { + CLzmaProb *prob = probs + (symbol >> kNumPosSlotBits); + UInt32 bit = (symbol >> (kNumPosSlotBits - 1)) & 1; + symbol <<= 1; + RC_BIT(&p->rc, prob, bit); + } + while (symbol < (1 << kNumPosSlotBits * 2)); + p->rc.range = range; + } + + if (dist >= kStartPosModelIndex) + { + unsigned footerBits = ((posSlot >> 1) - 1); + + if (dist < kNumFullDistances) + { + unsigned base = ((2 | (posSlot & 1)) << footerBits); + RcTree_ReverseEncode(&p->rc, p->posEncoders + base, footerBits, dist - base); + } + else + { + UInt32 pos2 = (dist | 0xF) << (32 - footerBits); + range = p->rc.range; + // RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits); + /* + do + { + range >>= 1; + p->rc.low += range & (0 - ((dist >> --footerBits) & 1)); + RC_NORM(&p->rc) + } + while (footerBits > kNumAlignBits); + */ + do + { + range >>= 1; + p->rc.low += range & (0 - (pos2 >> 31)); + pos2 += pos2; + RC_NORM(&p->rc) + } + while (pos2 != 0xF0000000); + + + // RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask); + + { + unsigned m = 1; + unsigned bit; + bit = dist & 1; dist >>= 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit); m = (m << 1) + bit; + bit = dist & 1; dist >>= 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit); m = (m << 1) + bit; + bit = dist & 1; dist >>= 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit); m = (m << 1) + bit; + bit = dist & 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit); + p->rc.range = range; + p->alignPriceCount++; + } + } + } } } - p->additionalOffset -= len; + nowPos32 += len; + p->additionalOffset -= len; + if (p->additionalOffset == 0) { UInt32 processed; + if (!p->fastMode) { if (p->matchPriceCount >= (1 << 7)) @@ -1940,13 +2352,15 @@ static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize if (p->alignPriceCount >= kAlignTableSize) FillAlignPrices(p); } + if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) break; processed = nowPos32 - startPos32; - if (useLimits) + + if (maxPackSize) { - if (processed + kNumOpts + 300 >= maxUnpackSize || - RangeEnc_GetProcessed(&p->rc) + kNumOpts * 2 >= maxPackSize) + if (processed + kNumOpts + 300 >= maxUnpackSize + || RangeEnc_GetProcessed_sizet(&p->rc) + kPackReserve >= maxPackSize) break; } else if (processed >= (1 << 17)) @@ -1956,13 +2370,16 @@ static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize } } } + p->nowPos64 += nowPos32 - startPos32; return Flush(p, nowPos32); } + + #define kBigHashDicLimit ((UInt32)1 << 24) -static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) +static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig) { UInt32 beforeSize = kNumOpts; if (!RangeEnc_Alloc(&p->rc, alloc)) @@ -1977,8 +2394,8 @@ static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, I if (!p->litProbs || !p->saveState.litProbs || p->lclp != lclp) { LzmaEnc_FreeLits(p, alloc); - p->litProbs = (CLzmaProb *)alloc->Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb)); - p->saveState.litProbs = (CLzmaProb *)alloc->Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb)); + p->litProbs = (CLzmaProb *)ISzAlloc_Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb)); + p->saveState.litProbs = (CLzmaProb *)ISzAlloc_Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb)); if (!p->litProbs || !p->saveState.litProbs) { LzmaEnc_FreeLits(p, alloc); @@ -1996,8 +2413,13 @@ static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, I #ifndef _7ZIP_ST if (p->mtMode) { - RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)); + RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, + LZMA_MATCH_LEN_MAX + + 1 /* 18.04 */ + , allocBig)); p->matchFinderObj = &p->matchFinderMt; + p->matchFinderBase.bigHash = (Byte)( + (p->dictSize > kBigHashDicLimit && p->matchFinderBase.hashMask >= 0xFFFFFF) ? 1 : 0); MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder); } else @@ -2014,17 +2436,21 @@ static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, I void LzmaEnc_Init(CLzmaEnc *p) { - UInt32 i; + unsigned i; p->state = 0; - for (i = 0 ; i < LZMA_NUM_REPS; i++) - p->reps[i] = 0; + p->reps[0] = + p->reps[1] = + p->reps[2] = + p->reps[3] = 1; RangeEnc_Init(&p->rc); + for (i = 0; i < (1 << kNumAlignBits); i++) + p->posAlignEncoder[i] = kProbInitValue; for (i = 0; i < kNumStates; i++) { - UInt32 j; + unsigned j; for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++) { p->isMatch[i][j] = kProbInitValue; @@ -2036,39 +2462,38 @@ void LzmaEnc_Init(CLzmaEnc *p) p->isRepG2[i] = kProbInitValue; } - { - UInt32 num = (UInt32)0x300 << (p->lp + p->lc); - CLzmaProb *probs = p->litProbs; - for (i = 0; i < num; i++) - probs[i] = kProbInitValue; - } - { for (i = 0; i < kNumLenToPosStates; i++) { CLzmaProb *probs = p->posSlotEncoder[i]; - UInt32 j; + unsigned j; for (j = 0; j < (1 << kNumPosSlotBits); j++) probs[j] = kProbInitValue; } } { - for (i = 0; i < kNumFullDistances - kEndPosModelIndex; i++) + for (i = 0; i < kNumFullDistances; i++) p->posEncoders[i] = kProbInitValue; } - LenEnc_Init(&p->lenEnc.p); - LenEnc_Init(&p->repLenEnc.p); + { + UInt32 num = (UInt32)0x300 << (p->lp + p->lc); + UInt32 k; + CLzmaProb *probs = p->litProbs; + for (k = 0; k < num; k++) + probs[k] = kProbInitValue; + } - for (i = 0; i < (1 << kNumAlignBits); i++) - p->posAlignEncoder[i] = kProbInitValue; - p->optimumEndIndex = 0; - p->optimumCurrentIndex = 0; + LenEnc_Init(&p->lenProbs); + LenEnc_Init(&p->repLenProbs); + + p->optEnd = 0; + p->optCur = 0; p->additionalOffset = 0; p->pbMask = (1 << p->pb) - 1; - p->lpMask = (1 << p->lp) - 1; + p->lpMask = ((UInt32)0x100 << p->lp) - ((unsigned)0x100 >> p->lc); } void LzmaEnc_InitPrices(CLzmaEnc *p) @@ -2082,14 +2507,14 @@ void LzmaEnc_InitPrices(CLzmaEnc *p) p->lenEnc.tableSize = p->repLenEnc.tableSize = p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN; - LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, p->ProbPrices); - LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, p->ProbPrices); + LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, &p->lenProbs, p->ProbPrices); + LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, &p->repLenProbs, p->ProbPrices); } -static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) +static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig) { - UInt32 i; - for (i = 0; i < (UInt32)kDicLogSizeMaxCompress; i++) + unsigned i; + for (i = kEndPosModelIndex / 2; i < kDicLogSizeMax; i++) if (p->dictSize <= ((UInt32)1 << i)) break; p->distTableSize = i * 2; @@ -2104,7 +2529,7 @@ static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *a } static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, - ISzAlloc *alloc, ISzAlloc *allocBig) + ISzAllocPtr alloc, ISzAllocPtr allocBig) { CLzmaEnc *p = (CLzmaEnc *)pp; p->matchFinderBase.stream = inStream; @@ -2115,7 +2540,7 @@ static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInS SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, ISeqInStream *inStream, UInt32 keepWindowSize, - ISzAlloc *alloc, ISzAlloc *allocBig) + ISzAllocPtr alloc, ISzAllocPtr allocBig) { CLzmaEnc *p = (CLzmaEnc *)pp; p->matchFinderBase.stream = inStream; @@ -2131,12 +2556,13 @@ static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen) } SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, - UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) + UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig) { CLzmaEnc *p = (CLzmaEnc *)pp; LzmaEnc_SetInputBuf(p, src, srcLen); p->needInit = 1; + LzmaEnc_SetDataSize(pp, srcLen); return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); } @@ -2154,15 +2580,15 @@ void LzmaEnc_Finish(CLzmaEncHandle pp) typedef struct { - ISeqOutStream funcTable; + ISeqOutStream vt; Byte *data; SizeT rem; Bool overflow; -} CSeqOutStreamBuf; +} CLzmaEnc_SeqOutStreamBuf; -static size_t MyWrite(void *pp, const void *data, size_t size) +static size_t SeqOutStreamBuf_Write(const ISeqOutStream *pp, const void *data, size_t size) { - CSeqOutStreamBuf *p = (CSeqOutStreamBuf *)pp; + CLzmaEnc_SeqOutStreamBuf *p = CONTAINER_FROM_VTBL(pp, CLzmaEnc_SeqOutStreamBuf, vt); if (p->rem < size) { size = p->rem; @@ -2195,9 +2621,9 @@ SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit, CLzmaEnc *p = (CLzmaEnc *)pp; UInt64 nowPos64; SRes res; - CSeqOutStreamBuf outStream; + CLzmaEnc_SeqOutStreamBuf outStream; - outStream.funcTable.Write = MyWrite; + outStream.vt.Write = SeqOutStreamBuf_Write; outStream.data = dest; outStream.rem = *destLen; outStream.overflow = False; @@ -2209,11 +2635,15 @@ SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit, if (reInit) LzmaEnc_Init(p); LzmaEnc_InitPrices(p); + nowPos64 = p->nowPos64; RangeEnc_Init(&p->rc); - p->rc.outStream = &outStream.funcTable; + p->rc.outStream = &outStream.vt; - res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize); + if (desiredPackSize == 0) + return SZ_ERROR_OUTPUT_EOF; + + res = LzmaEnc_CodeOneBlock(p, desiredPackSize, *unpackSize); *unpackSize = (UInt32)(p->nowPos64 - nowPos64); *destLen -= outStream.rem; @@ -2236,12 +2666,12 @@ static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress) for (;;) { - res = LzmaEnc_CodeOneBlock(p, False, 0, 0); + res = LzmaEnc_CodeOneBlock(p, 0, 0); if (res != SZ_OK || p->finished) break; if (progress) { - res = progress->Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc)); + res = ICompressProgress_Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc)); if (res != SZ_OK) { res = SZ_ERROR_PROGRESS; @@ -2253,7 +2683,7 @@ static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress) LzmaEnc_Finish(p); /* - if (res == S_OK && !Inline_MatchFinder_IsFinishedOK(&p->matchFinderBase)) + if (res == SZ_OK && !Inline_MatchFinder_IsFinishedOK(&p->matchFinderBase)) res = SZ_ERROR_FAIL; } */ @@ -2263,7 +2693,7 @@ static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress) SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress, - ISzAlloc *alloc, ISzAlloc *allocBig) + ISzAllocPtr alloc, ISzAllocPtr allocBig) { RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig)); return LzmaEnc_Encode2((CLzmaEnc *)pp, progress); @@ -2298,21 +2728,27 @@ SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size) } +unsigned LzmaEnc_IsWriteEndMark(CLzmaEncHandle pp) +{ + return ((CLzmaEnc *)pp)->writeEndMark; +} + + SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, - int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) + int writeEndMark, ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig) { SRes res; CLzmaEnc *p = (CLzmaEnc *)pp; - CSeqOutStreamBuf outStream; + CLzmaEnc_SeqOutStreamBuf outStream; - outStream.funcTable.Write = MyWrite; + outStream.vt.Write = SeqOutStreamBuf_Write; outStream.data = dest; outStream.rem = *destLen; outStream.overflow = False; p->writeEndMark = writeEndMark; - p->rc.outStream = &outStream.funcTable; + p->rc.outStream = &outStream.vt; res = LzmaEnc_MemPrepare(pp, src, srcLen, 0, alloc, allocBig); @@ -2332,7 +2768,7 @@ SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, - ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) + ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig) { CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc); SRes res; diff --git a/code/ryzom/client/src/seven_zip/LzmaEnc.h b/code/ryzom/client/src/seven_zip/LzmaEnc.h index cffe220bb..9194ee576 100644 --- a/code/ryzom/client/src/seven_zip/LzmaEnc.h +++ b/code/ryzom/client/src/seven_zip/LzmaEnc.h @@ -1,5 +1,5 @@ /* LzmaEnc.h -- LZMA Encoder -2013-01-18 : Igor Pavlov : Public domain */ +2017-07-27 : Igor Pavlov : Public domain */ #ifndef __LZMA_ENC_H #define __LZMA_ENC_H @@ -12,12 +12,10 @@ EXTERN_C_BEGIN typedef struct _CLzmaEncProps { - int level; /* 0 <= level <= 9 */ + int level; /* 0 <= level <= 9 */ UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version - (1 << 12) <= dictSize <= (1 << 30) for 64-bit version - default = (1 << 24) */ - UInt64 reduceSize; /* estimated size of data that will be compressed. default = 0xFFFFFFFF. - Encoder uses this value to reduce dictionary size */ + (1 << 12) <= dictSize <= (3 << 29) for 64-bit version + default = (1 << 24) */ int lc; /* 0 <= lc <= 8, default = 3 */ int lp; /* 0 <= lp <= 4, default = 0 */ int pb; /* 0 <= pb <= 4, default = 2 */ @@ -25,9 +23,12 @@ typedef struct _CLzmaEncProps int fb; /* 5 <= fb <= 273, default = 32 */ int btMode; /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */ int numHashBytes; /* 2, 3 or 4, default = 4 */ - UInt32 mc; /* 1 <= mc <= (1 << 30), default = 32 */ + UInt32 mc; /* 1 <= mc <= (1 << 30), default = 32 */ unsigned writeEndMark; /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */ int numThreads; /* 1 or 2, default = 2 */ + + UInt64 reduceSize; /* estimated size of data that will be compressed. default = (UInt64)(Int64)-1. + Encoder uses this value to reduce dictionary size */ } CLzmaEncProps; void LzmaEncProps_Init(CLzmaEncProps *p); @@ -37,41 +38,38 @@ UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2); /* ---------- CLzmaEncHandle Interface ---------- */ -/* LzmaEnc_* functions can return the following exit codes: -Returns: +/* LzmaEnc* functions can return the following exit codes: +SRes: SZ_OK - OK SZ_ERROR_MEM - Memory allocation error SZ_ERROR_PARAM - Incorrect paramater in props - SZ_ERROR_WRITE - Write callback error. + SZ_ERROR_WRITE - ISeqOutStream write callback error + SZ_ERROR_OUTPUT_EOF - output buffer overflow - version with (Byte *) output SZ_ERROR_PROGRESS - some break from progress callback - SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) + SZ_ERROR_THREAD - error in multithreading functions (only for Mt version) */ typedef void * CLzmaEncHandle; -CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc); -void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig); +CLzmaEncHandle LzmaEnc_Create(ISzAllocPtr alloc); +void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAllocPtr alloc, ISzAllocPtr allocBig); + SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props); +void LzmaEnc_SetDataSize(CLzmaEncHandle p, UInt64 expectedDataSiize); SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size); +unsigned LzmaEnc_IsWriteEndMark(CLzmaEncHandle p); + SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream, - ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); + ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig); SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, - int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); + int writeEndMark, ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig); + /* ---------- One Call Interface ---------- */ -/* LzmaEncode -Return code: - SZ_OK - OK - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_PARAM - Incorrect paramater - SZ_ERROR_OUTPUT_EOF - output buffer overflow - SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) -*/ - SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, - ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); + ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig); EXTERN_C_END diff --git a/code/ryzom/client/src/seven_zip/Ppmd.h b/code/ryzom/client/src/seven_zip/Ppmd.h index 5655b26d7..a5c1e3ef2 100644 --- a/code/ryzom/client/src/seven_zip/Ppmd.h +++ b/code/ryzom/client/src/seven_zip/Ppmd.h @@ -1,5 +1,5 @@ /* Ppmd.h -- PPMD codec common code -2016-05-16 : Igor Pavlov : Public domain +2017-04-03 : Igor Pavlov : Public domain This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ #ifndef __PPMD_H @@ -77,7 +77,7 @@ typedef CPpmd_Byte_Ref; #define PPMD_SetAllBitsIn256Bytes(p) \ - { unsigned z; for (z = 0; z < 256 / sizeof(p[0]); z += 8) { \ + { size_t z; for (z = 0; z < 256 / sizeof(p[0]); z += 8) { \ p[z+7] = p[z+6] = p[z+5] = p[z+4] = p[z+3] = p[z+2] = p[z+1] = p[z+0] = ~(size_t)0; }} EXTERN_C_END diff --git a/code/ryzom/client/src/seven_zip/Ppmd7.cpp b/code/ryzom/client/src/seven_zip/Ppmd7.cpp index eda8eb70a..0951a7c74 100644 --- a/code/ryzom/client/src/seven_zip/Ppmd7.cpp +++ b/code/ryzom/client/src/seven_zip/Ppmd7.cpp @@ -1,5 +1,5 @@ /* Ppmd7.c -- PPMdH codec -2016-05-21 : Igor Pavlov : Public domain +2017-04-03 : Igor Pavlov : Public domain This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ #include "Precomp.h" @@ -15,7 +15,7 @@ static const UInt16 kInitBinEsc[] = { 0x3CDD, 0x1F3F, 0x59BF, 0x48F3, 0x64A1, 0x #define UNIT_SIZE 12 #define U2B(nu) ((UInt32)(nu) * UNIT_SIZE) -#define U2I(nu) (p->Units2Indx[(nu) - 1]) +#define U2I(nu) (p->Units2Indx[(size_t)(nu) - 1]) #define I2U(indx) (p->Indx2Units[indx]) #ifdef PPMD_32BIT @@ -88,29 +88,31 @@ void Ppmd7_Construct(CPpmd7 *p) memset(p->HB2Flag + 0x40, 8, 0x100 - 0x40); } -void Ppmd7_Free(CPpmd7 *p, ISzAlloc *alloc) +void Ppmd7_Free(CPpmd7 *p, ISzAllocPtr alloc) { - alloc->Free(alloc, p->Base); + ISzAlloc_Free(alloc, p->Base); p->Size = 0; p->Base = 0; } -Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAlloc *alloc) +Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAllocPtr alloc) { - if (p->Base == 0 || p->Size != size) + if (!p->Base || p->Size != size) { + size_t size2; Ppmd7_Free(p, alloc); + size2 = 0 + #ifndef PPMD_32BIT + + UNIT_SIZE + #endif + ; p->AlignOffset = #ifdef PPMD_32BIT (4 - size) & 3; #else 4 - (size & 3); #endif - if ((p->Base = (Byte *)alloc->Alloc(alloc, p->AlignOffset + size - #ifndef PPMD_32BIT - + UNIT_SIZE - #endif - )) == 0) + if ((p->Base = (Byte *)ISzAlloc_Alloc(alloc, p->AlignOffset + size + size2)) == 0) return False; p->Size = size; } @@ -513,7 +515,7 @@ static void UpdateModel(CPpmd7 *p) /* Expand for one UNIT */ unsigned oldNU = ns1 >> 1; unsigned i = U2I(oldNU); - if (i != U2I(oldNU + 1)) + if (i != U2I((size_t)oldNU + 1)) { void *ptr = AllocUnits(p, i + 1); void *oldPtr; @@ -639,7 +641,7 @@ CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *escFreq) unsigned nonMasked = p->MinContext->NumStats - numMasked; if (p->MinContext->NumStats != 256) { - see = p->See[(unsigned)p->NS2Indx[nonMasked - 1]] + + see = p->See[(unsigned)p->NS2Indx[(size_t)nonMasked - 1]] + (nonMasked < (unsigned)SUFFIX(p->MinContext)->NumStats - p->MinContext->NumStats) + 2 * (unsigned)(p->MinContext->SummFreq < 11 * p->MinContext->NumStats) + 4 * (unsigned)(numMasked > nonMasked) + diff --git a/code/ryzom/client/src/seven_zip/Ppmd7.h b/code/ryzom/client/src/seven_zip/Ppmd7.h index 87eefde80..45002d95b 100644 --- a/code/ryzom/client/src/seven_zip/Ppmd7.h +++ b/code/ryzom/client/src/seven_zip/Ppmd7.h @@ -1,5 +1,5 @@ /* Ppmd7.h -- PPMdH compression codec -2016-05-21 : Igor Pavlov : Public domain +2017-04-03 : Igor Pavlov : Public domain This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ /* This code supports virtual RangeDecoder and includes the implementation @@ -60,8 +60,8 @@ typedef struct } CPpmd7; void Ppmd7_Construct(CPpmd7 *p); -Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAlloc *alloc); -void Ppmd7_Free(CPpmd7 *p, ISzAlloc *alloc); +Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAllocPtr alloc); +void Ppmd7_Free(CPpmd7 *p, ISzAllocPtr alloc); void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder); #define Ppmd7_WasAllocated(p) ((p)->Base != NULL) @@ -86,8 +86,8 @@ void Ppmd7_Update2(CPpmd7 *p); void Ppmd7_UpdateBin(CPpmd7 *p); #define Ppmd7_GetBinSumm(p) \ - &p->BinSumm[(unsigned)Ppmd7Context_OneState(p->MinContext)->Freq - 1][p->PrevSuccess + \ - p->NS2BSIndx[Ppmd7_GetContext(p, p->MinContext->Suffix)->NumStats - 1] + \ + &p->BinSumm[(size_t)(unsigned)Ppmd7Context_OneState(p->MinContext)->Freq - 1][p->PrevSuccess + \ + p->NS2BSIndx[(size_t)Ppmd7_GetContext(p, p->MinContext->Suffix)->NumStats - 1] + \ (p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol]) + \ 2 * p->HB2Flag[(unsigned)Ppmd7Context_OneState(p->MinContext)->Symbol] + \ ((p->RunLength >> 26) & 0x20)] @@ -97,16 +97,18 @@ CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *scale); /* ---------- Decode ---------- */ -typedef struct +typedef struct IPpmd7_RangeDec IPpmd7_RangeDec; + +struct IPpmd7_RangeDec { - UInt32 (*GetThreshold)(void *p, UInt32 total); - void (*Decode)(void *p, UInt32 start, UInt32 size); - UInt32 (*DecodeBit)(void *p, UInt32 size0); -} IPpmd7_RangeDec; + UInt32 (*GetThreshold)(const IPpmd7_RangeDec *p, UInt32 total); + void (*Decode)(const IPpmd7_RangeDec *p, UInt32 start, UInt32 size); + UInt32 (*DecodeBit)(const IPpmd7_RangeDec *p, UInt32 size0); +}; typedef struct { - IPpmd7_RangeDec p; + IPpmd7_RangeDec vt; UInt32 Range; UInt32 Code; IByteIn *Stream; @@ -116,7 +118,7 @@ void Ppmd7z_RangeDec_CreateVTable(CPpmd7z_RangeDec *p); Bool Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p); #define Ppmd7z_RangeDec_IsFinishedOK(p) ((p)->Code == 0) -int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc); +int Ppmd7_DecodeSymbol(CPpmd7 *p, const IPpmd7_RangeDec *rc); /* ---------- Encode ---------- */ diff --git a/code/ryzom/client/src/seven_zip/Ppmd7Dec.cpp b/code/ryzom/client/src/seven_zip/Ppmd7Dec.cpp index 04b4b09e3..7953bb07c 100644 --- a/code/ryzom/client/src/seven_zip/Ppmd7Dec.cpp +++ b/code/ryzom/client/src/seven_zip/Ppmd7Dec.cpp @@ -1,5 +1,5 @@ /* Ppmd7Dec.c -- PPMdH Decoder -2010-03-12 : Igor Pavlov : Public domain +2017-04-03 : Igor Pavlov : Public domain This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ #include "Precomp.h" @@ -13,44 +13,46 @@ Bool Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p) unsigned i; p->Code = 0; p->Range = 0xFFFFFFFF; - if (p->Stream->Read((void *)p->Stream) != 0) + if (IByteIn_Read(p->Stream) != 0) return False; for (i = 0; i < 4; i++) - p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream); + p->Code = (p->Code << 8) | IByteIn_Read(p->Stream); return (p->Code < 0xFFFFFFFF); } -static UInt32 Range_GetThreshold(void *pp, UInt32 total) +#define GET_Ppmd7z_RangeDec CPpmd7z_RangeDec *p = CONTAINER_FROM_VTBL(pp, CPpmd7z_RangeDec, vt); + +static UInt32 Range_GetThreshold(const IPpmd7_RangeDec *pp, UInt32 total) { - CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp; - return (p->Code) / (p->Range /= total); + GET_Ppmd7z_RangeDec + return p->Code / (p->Range /= total); } static void Range_Normalize(CPpmd7z_RangeDec *p) { if (p->Range < kTopValue) { - p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream); + p->Code = (p->Code << 8) | IByteIn_Read(p->Stream); p->Range <<= 8; if (p->Range < kTopValue) { - p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream); + p->Code = (p->Code << 8) | IByteIn_Read(p->Stream); p->Range <<= 8; } } } -static void Range_Decode(void *pp, UInt32 start, UInt32 size) +static void Range_Decode(const IPpmd7_RangeDec *pp, UInt32 start, UInt32 size) { - CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp; + GET_Ppmd7z_RangeDec p->Code -= start * p->Range; p->Range *= size; Range_Normalize(p); } -static UInt32 Range_DecodeBit(void *pp, UInt32 size0) +static UInt32 Range_DecodeBit(const IPpmd7_RangeDec *pp, UInt32 size0) { - CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp; + GET_Ppmd7z_RangeDec UInt32 newBound = (p->Range >> 14) * size0; UInt32 symbol; if (p->Code < newBound) @@ -70,15 +72,15 @@ static UInt32 Range_DecodeBit(void *pp, UInt32 size0) void Ppmd7z_RangeDec_CreateVTable(CPpmd7z_RangeDec *p) { - p->p.GetThreshold = Range_GetThreshold; - p->p.Decode = Range_Decode; - p->p.DecodeBit = Range_DecodeBit; + p->vt.GetThreshold = Range_GetThreshold; + p->vt.Decode = Range_Decode; + p->vt.DecodeBit = Range_DecodeBit; } #define MASK(sym) ((signed char *)charMask)[sym] -int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc) +int Ppmd7_DecodeSymbol(CPpmd7 *p, const IPpmd7_RangeDec *rc) { size_t charMask[256 / sizeof(size_t)]; if (p->MinContext->NumStats != 1) diff --git a/code/ryzom/client/src/seven_zip/Ppmd7Enc.cpp b/code/ryzom/client/src/seven_zip/Ppmd7Enc.cpp index e6dd3d2fc..286b8712c 100644 --- a/code/ryzom/client/src/seven_zip/Ppmd7Enc.cpp +++ b/code/ryzom/client/src/seven_zip/Ppmd7Enc.cpp @@ -1,5 +1,5 @@ /* Ppmd7Enc.c -- PPMdH Encoder -2015-09-28 : Igor Pavlov : Public domain +2017-04-03 : Igor Pavlov : Public domain This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ #include "Precomp.h" @@ -23,7 +23,7 @@ static void RangeEnc_ShiftLow(CPpmd7z_RangeEnc *p) Byte temp = p->Cache; do { - p->Stream->Write(p->Stream, (Byte)(temp + (Byte)(p->Low >> 32))); + IByteOut_Write(p->Stream, (Byte)(temp + (Byte)(p->Low >> 32))); temp = 0xFF; } while (--p->CacheSize != 0); diff --git a/code/ryzom/client/src/seven_zip/Precomp.h b/code/ryzom/client/src/seven_zip/Precomp.h index dd604bdbe..fa36461bd 100644 --- a/code/ryzom/client/src/seven_zip/Precomp.h +++ b/code/ryzom/client/src/seven_zip/Precomp.h @@ -10,7 +10,9 @@ #include #endif +#define _7ZIP_ST + #include "Compiler.h" -#include "7zTypes.h" +/* #include "7zTypes.h" */ #endif diff --git a/code/ryzom/client/src/seven_zip/Sha256.cpp b/code/ryzom/client/src/seven_zip/Sha256.cpp index b5bc19b96..04b688c6b 100644 --- a/code/ryzom/client/src/seven_zip/Sha256.cpp +++ b/code/ryzom/client/src/seven_zip/Sha256.cpp @@ -1,5 +1,5 @@ /* Crypto/Sha256.c -- SHA-256 Hash -2015-11-14 : Igor Pavlov : Public domain +2017-04-03 : Igor Pavlov : Public domain This code is based on public domain code from Wei Dai's Crypto++ library. */ #include "Precomp.h" @@ -45,7 +45,7 @@ void Sha256_Init(CSha256 *p) #ifdef _SHA256_UNROLL2 #define R(a,b,c,d,e,f,g,h, i) \ - h += S1(e) + Ch(e,f,g) + K[(i)+(j)] + (j ? blk2(i) : blk0(i)); \ + h += S1(e) + Ch(e,f,g) + K[(i)+(size_t)(j)] + (j ? blk2(i) : blk0(i)); \ d += h; \ h += S0(a) + Maj(a, b, c) @@ -73,7 +73,7 @@ void Sha256_Init(CSha256 *p) #define h(i) T[(7-(i))&7] #define R(i) \ - h(i) += S1(e(i)) + Ch(e(i),f(i),g(i)) + K[(i)+(j)] + (j ? blk2(i) : blk0(i)); \ + h(i) += S1(e(i)) + Ch(e(i),f(i),g(i)) + K[(i)+(size_t)(j)] + (j ? blk2(i) : blk0(i)); \ d(i) += h(i); \ h(i) += S0(a(i)) + Maj(a(i), b(i), c(i)) \ diff --git a/code/ryzom/client/src/seven_zip/Xz.cpp b/code/ryzom/client/src/seven_zip/Xz.cpp index 1ef687825..d9f83df16 100644 --- a/code/ryzom/client/src/seven_zip/Xz.cpp +++ b/code/ryzom/client/src/seven_zip/Xz.cpp @@ -1,5 +1,5 @@ /* Xz.c - Xz -2015-05-01 : Igor Pavlov : Public domain */ +2017-05-12 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -9,7 +9,7 @@ #include "XzCrc64.h" const Byte XZ_SIG[XZ_SIG_SIZE] = { 0xFD, '7', 'z', 'X', 'Z', 0 }; -const Byte XZ_FOOTER_SIG[XZ_FOOTER_SIG_SIZE] = { 'Y', 'Z' }; +/* const Byte XZ_FOOTER_SIG[XZ_FOOTER_SIG_SIZE] = { 'Y', 'Z' }; */ unsigned Xz_WriteVarInt(Byte *buf, UInt64 v) { @@ -20,22 +20,22 @@ unsigned Xz_WriteVarInt(Byte *buf, UInt64 v) v >>= 7; } while (v != 0); - buf[i - 1] &= 0x7F; + buf[(size_t)i - 1] &= 0x7F; return i; } void Xz_Construct(CXzStream *p) { - p->numBlocks = p->numBlocksAllocated = 0; - p->blocks = 0; + p->numBlocks = 0; + p->blocks = NULL; p->flags = 0; } -void Xz_Free(CXzStream *p, ISzAlloc *alloc) +void Xz_Free(CXzStream *p, ISzAllocPtr alloc) { - alloc->Free(alloc, p->blocks); - p->numBlocks = p->numBlocksAllocated = 0; - p->blocks = 0; + ISzAlloc_Free(alloc, p->blocks); + p->numBlocks = 0; + p->blocks = NULL; } unsigned XzFlags_GetCheckSize(CXzStreamFlags f) diff --git a/code/ryzom/client/src/seven_zip/Xz.h b/code/ryzom/client/src/seven_zip/Xz.h index be3a1c362..ef067e0e4 100644 --- a/code/ryzom/client/src/seven_zip/Xz.h +++ b/code/ryzom/client/src/seven_zip/Xz.h @@ -1,5 +1,5 @@ /* Xz.h - Xz interface -2015-05-01 : Igor Pavlov : Public domain */ +2018-02-28 : Igor Pavlov : Public domain */ #ifndef __XZ_H #define __XZ_H @@ -50,6 +50,7 @@ typedef struct #define XzBlock_GetNumFilters(p) (((p)->flags & XZ_BF_NUM_FILTERS_MASK) + 1) #define XzBlock_HasPackSize(p) (((p)->flags & XZ_BF_PACK_SIZE) != 0) #define XzBlock_HasUnpackSize(p) (((p)->flags & XZ_BF_UNPACK_SIZE) != 0) +#define XzBlock_HasUnsupportedFlags(p) (((p)->flags & ~(XZ_BF_NUM_FILTERS_MASK | XZ_BF_PACK_SIZE | XZ_BF_UNPACK_SIZE)) != 0) SRes XzBlock_Parse(CXzBlock *p, const Byte *header); SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, Bool *isIndex, UInt32 *headerSizeRes); @@ -60,7 +61,13 @@ SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, Bool *isIndex, UInt #define XZ_FOOTER_SIG_SIZE 2 extern const Byte XZ_SIG[XZ_SIG_SIZE]; + +/* extern const Byte XZ_FOOTER_SIG[XZ_FOOTER_SIG_SIZE]; +*/ + +#define XZ_FOOTER_SIG_0 'Y' +#define XZ_FOOTER_SIG_1 'Z' #define XZ_STREAM_FLAGS_SIZE 2 #define XZ_STREAM_CRC_SIZE 4 @@ -106,13 +113,12 @@ typedef struct { CXzStreamFlags flags; size_t numBlocks; - size_t numBlocksAllocated; CXzBlockSizes *blocks; UInt64 startOffset; } CXzStream; void Xz_Construct(CXzStream *p); -void Xz_Free(CXzStream *p, ISzAlloc *alloc); +void Xz_Free(CXzStream *p, ISzAllocPtr alloc); #define XZ_SIZE_OVERFLOW ((UInt64)(Int64)-1) @@ -127,12 +133,15 @@ typedef struct } CXzs; void Xzs_Construct(CXzs *p); -void Xzs_Free(CXzs *p, ISzAlloc *alloc); -SRes Xzs_ReadBackward(CXzs *p, ILookInStream *inStream, Int64 *startOffset, ICompressProgress *progress, ISzAlloc *alloc); +void Xzs_Free(CXzs *p, ISzAllocPtr alloc); +SRes Xzs_ReadBackward(CXzs *p, ILookInStream *inStream, Int64 *startOffset, ICompressProgress *progress, ISzAllocPtr alloc); UInt64 Xzs_GetNumBlocks(const CXzs *p); UInt64 Xzs_GetUnpackSize(const CXzs *p); + +// ECoderStatus values are identical to ELzmaStatus values of LZMA2 decoder + typedef enum { CODER_STATUS_NOT_SPECIFIED, /* use main error code instead */ @@ -141,43 +150,55 @@ typedef enum CODER_STATUS_NEEDS_MORE_INPUT /* you must provide more input bytes */ } ECoderStatus; + +// ECoderFinishMode values are identical to ELzmaFinishMode + typedef enum { CODER_FINISH_ANY, /* finish at any point */ CODER_FINISH_END /* block must be finished at the end */ } ECoderFinishMode; + typedef struct _IStateCoder { void *p; - void (*Free)(void *p, ISzAlloc *alloc); - SRes (*SetProps)(void *p, const Byte *props, size_t propSize, ISzAlloc *alloc); + void (*Free)(void *p, ISzAllocPtr alloc); + SRes (*SetProps)(void *p, const Byte *props, size_t propSize, ISzAllocPtr alloc); void (*Init)(void *p); - SRes (*Code)(void *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, - int srcWasFinished, ECoderFinishMode finishMode, int *wasFinished); + SRes (*Code2)(void *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + int srcWasFinished, ECoderFinishMode finishMode, + // int *wasFinished, + ECoderStatus *status); + SizeT (*Filter)(void *p, Byte *data, SizeT size); } IStateCoder; + + #define MIXCODER_NUM_FILTERS_MAX 4 typedef struct { - ISzAlloc *alloc; + ISzAllocPtr alloc; Byte *buf; unsigned numCoders; + + Byte *outBuf; + size_t outBufSize; + size_t outWritten; // is equal to lzmaDecoder.dicPos (in outBuf mode) + Bool wasFinished; + SRes res; + ECoderStatus status; + // Bool SingleBufMode; + int finished[MIXCODER_NUM_FILTERS_MAX - 1]; size_t pos[MIXCODER_NUM_FILTERS_MAX - 1]; size_t size[MIXCODER_NUM_FILTERS_MAX - 1]; UInt64 ids[MIXCODER_NUM_FILTERS_MAX]; + SRes results[MIXCODER_NUM_FILTERS_MAX]; IStateCoder coders[MIXCODER_NUM_FILTERS_MAX]; } CMixCoder; -void MixCoder_Construct(CMixCoder *p, ISzAlloc *alloc); -void MixCoder_Free(CMixCoder *p); -void MixCoder_Init(CMixCoder *p); -SRes MixCoder_SetFromMethod(CMixCoder *p, unsigned coderIndex, UInt64 methodId); -SRes MixCoder_Code(CMixCoder *p, Byte *dest, SizeT *destLen, - const Byte *src, SizeT *srcLen, int srcWasFinished, - ECoderFinishMode finishMode, ECoderStatus *status); typedef enum { @@ -191,6 +212,7 @@ typedef enum XZ_STATE_BLOCK_FOOTER } EXzState; + typedef struct { EXzState state; @@ -204,7 +226,7 @@ typedef struct UInt64 packSize; UInt64 unpackSize; - UInt64 numBlocks; + UInt64 numBlocks; // number of finished blocks in current stream UInt64 indexSize; UInt64 indexPos; UInt64 padSize; @@ -218,14 +240,65 @@ typedef struct CXzBlock block; CXzCheck check; CSha256 sha; + + Bool parseMode; + Bool headerParsedOk; + Bool decodeToStreamSignature; + unsigned decodeOnlyOneBlock; + + Byte *outBuf; + size_t outBufSize; + size_t outDataWritten; // the size of data in (outBuf) that were fully unpacked + Byte shaDigest[SHA256_DIGEST_SIZE]; Byte buf[XZ_BLOCK_HEADER_SIZE_MAX]; } CXzUnpacker; -void XzUnpacker_Construct(CXzUnpacker *p, ISzAlloc *alloc); +/* alloc : aligned for cache line allocation is better */ +void XzUnpacker_Construct(CXzUnpacker *p, ISzAllocPtr alloc); void XzUnpacker_Init(CXzUnpacker *p); +void XzUnpacker_SetOutBuf(CXzUnpacker *p, Byte *outBuf, size_t outBufSize); void XzUnpacker_Free(CXzUnpacker *p); +/* + XzUnpacker + The sequence for decoding functions: + { + XzUnpacker_Construct() + [Decoding_Calls] + XzUnpacker_Free() + } + + [Decoding_Calls] + + There are 3 types of interfaces for [Decoding_Calls] calls: + + Interface-1 : Partial output buffers: + { + XzUnpacker_Init() + for() + XzUnpacker_Code(); + } + + Interface-2 : Direct output buffer: + Use it, if you know exact size of decoded data, and you need + whole xz unpacked data in one output buffer. + xz unpacker doesn't allocate additional buffer for lzma2 dictionary in that mode. + { + XzUnpacker_Init() + XzUnpacker_SetOutBufMode(); // to set output buffer and size + for() + XzUnpacker_Code(); // (dest = NULL) in XzUnpacker_Code() + } + + Interface-3 : Direct output buffer : One call full decoding + It unpacks whole input buffer to output buffer in one call. + It uses Interface-2 internally. + { + XzUnpacker_CodeFull() + } +*/ + /* finishMode: It has meaning only if the decoding reaches output limit (*destLen). @@ -255,20 +328,132 @@ Returns: SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, - const Byte *src, SizeT *srcLen, ECoderFinishMode finishMode, - ECoderStatus *status); + const Byte *src, SizeT *srcLen, int srcFinished, + ECoderFinishMode finishMode, ECoderStatus *status); -Bool XzUnpacker_IsStreamWasFinished(CXzUnpacker *p); +SRes XzUnpacker_CodeFull(CXzUnpacker *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, + ECoderFinishMode finishMode, ECoderStatus *status); + +Bool XzUnpacker_IsStreamWasFinished(const CXzUnpacker *p); /* -Call XzUnpacker_GetExtraSize after XzUnpacker_Code function to detect real size of -xz stream in two cases: -XzUnpacker_Code() returns: +XzUnpacker_GetExtraSize() returns then number of uncofirmed bytes, + if it's in (XZ_STATE_STREAM_HEADER) state or in (XZ_STATE_STREAM_PADDING) state. +These bytes can be some bytes after xz archive, or +it can be start of new xz stream. + +Call XzUnpacker_GetExtraSize() after XzUnpacker_Code() function to detect real size of +xz stream in two cases, if XzUnpacker_Code() returns: res == SZ_OK && status == CODER_STATUS_NEEDS_MORE_INPUT res == SZ_ERROR_NO_ARCHIVE */ -UInt64 XzUnpacker_GetExtraSize(CXzUnpacker *p); +UInt64 XzUnpacker_GetExtraSize(const CXzUnpacker *p); + + +/* + for random block decoding: + XzUnpacker_Init(); + set CXzUnpacker::streamFlags + XzUnpacker_PrepareToRandomBlockDecoding() + loop + { + XzUnpacker_Code() + XzUnpacker_IsBlockFinished() + } +*/ + +void XzUnpacker_PrepareToRandomBlockDecoding(CXzUnpacker *p); +Bool XzUnpacker_IsBlockFinished(const CXzUnpacker *p); + +#define XzUnpacker_GetPackSizeForIndex(p) ((p)->packSize + (p)->blockHeaderSize + XzFlags_GetCheckSize((p)->streamFlags)) + + + +/* ---------- Multi Threading Decoding ---------- */ + + +typedef struct +{ + size_t inBufSize_ST; + size_t outStep_ST; + Bool ignoreErrors; + + #ifndef _7ZIP_ST + unsigned numThreads; + size_t inBufSize_MT; + size_t memUseMax; + #endif +} CXzDecMtProps; + +void XzDecMtProps_Init(CXzDecMtProps *p); + + +typedef void * CXzDecMtHandle; + +/* + alloc : XzDecMt uses CAlignOffsetAlloc for addresses allocated by (alloc). + allocMid : for big allocations, aligned allocation is better +*/ + +CXzDecMtHandle XzDecMt_Create(ISzAllocPtr alloc, ISzAllocPtr allocMid); +void XzDecMt_Destroy(CXzDecMtHandle p); + + +typedef struct +{ + Byte UnpackSize_Defined; + Byte NumStreams_Defined; + Byte NumBlocks_Defined; + + Byte DataAfterEnd; + Byte DecodingTruncated; // Decoding was Truncated, we need only partial output data + + UInt64 InSize; // pack size processed + UInt64 OutSize; + + UInt64 NumStreams; + UInt64 NumBlocks; + + SRes DecodeRes; + SRes ReadRes; + SRes ProgressRes; + SRes CombinedRes; + SRes CombinedRes_Type; + +} CXzStatInfo; + +void XzStatInfo_Clear(CXzStatInfo *p); + +/* +XzDecMt_Decode() +SRes: + SZ_OK - OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_NO_ARCHIVE - is not xz archive + SZ_ERROR_ARCHIVE - Headers error + SZ_ERROR_DATA - Data Error + SZ_ERROR_CRC - CRC Error + SZ_ERROR_INPUT_EOF - it needs more input data + SZ_ERROR_WRITE - ISeqOutStream error + (SZ_ERROR_READ) - ISeqInStream errors + (SZ_ERROR_PROGRESS) - ICompressProgress errors + // SZ_ERROR_THREAD - error in multi-threading functions + MY_SRes_HRESULT_FROM_WRes(WRes_error) - error in multi-threading function +*/ + +SRes XzDecMt_Decode(CXzDecMtHandle p, + const CXzDecMtProps *props, + const UInt64 *outDataSize, // NULL means undefined + int finishMode, // 0 - partial unpacking is allowed, 1 - xz stream(s) must be finished + ISeqOutStream *outStream, + // Byte *outBuf, size_t *outBufSize, + ISeqInStream *inStream, + // const Byte *inData, size_t inDataSize, + CXzStatInfo *stat, + int *isMT, // 0 means that ST (Single-Thread) version was used + ICompressProgress *progress); EXTERN_C_END diff --git a/code/ryzom/client/src/seven_zip/XzCrc64.cpp b/code/ryzom/client/src/seven_zip/XzCrc64.cpp index e2da63b6e..b6d02cbeb 100644 --- a/code/ryzom/client/src/seven_zip/XzCrc64.cpp +++ b/code/ryzom/client/src/seven_zip/XzCrc64.cpp @@ -1,5 +1,5 @@ /* XzCrc64.c -- CRC64 calculation -2015-03-01 : Igor Pavlov : Public domain */ +2017-05-23 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -9,9 +9,9 @@ #define kCrc64Poly UINT64_CONST(0xC96C5795D7870F42) #ifdef MY_CPU_LE - #define CRC_NUM_TABLES 4 + #define CRC64_NUM_TABLES 4 #else - #define CRC_NUM_TABLES 5 + #define CRC64_NUM_TABLES 5 #define CRC_UINT64_SWAP(v) \ ((v >> 56) \ | ((v >> 40) & ((UInt64)0xFF << 8)) \ @@ -29,10 +29,10 @@ UInt64 MY_FAST_CALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, const UInt64 *table); #endif -typedef UInt64 (MY_FAST_CALL *CRC_FUNC)(UInt64 v, const void *data, size_t size, const UInt64 *table); +typedef UInt64 (MY_FAST_CALL *CRC64_FUNC)(UInt64 v, const void *data, size_t size, const UInt64 *table); -static CRC_FUNC g_Crc64Update; -UInt64 g_Crc64Table[256 * CRC_NUM_TABLES]; +static CRC64_FUNC g_Crc64Update; +UInt64 g_Crc64Table[256 * CRC64_NUM_TABLES]; UInt64 MY_FAST_CALL Crc64Update(UInt64 v, const void *data, size_t size) { @@ -52,12 +52,12 @@ void MY_FAST_CALL Crc64GenerateTable() UInt64 r = i; unsigned j; for (j = 0; j < 8; j++) - r = (r >> 1) ^ (kCrc64Poly & ~((r & 1) - 1)); + r = (r >> 1) ^ (kCrc64Poly & ((UInt64)0 - (r & 1))); g_Crc64Table[i] = r; } - for (; i < 256 * CRC_NUM_TABLES; i++) + for (i = 256; i < 256 * CRC64_NUM_TABLES; i++) { - UInt64 r = g_Crc64Table[i - 256]; + UInt64 r = g_Crc64Table[(size_t)i - 256]; g_Crc64Table[i] = g_Crc64Table[r & 0xFF] ^ (r >> 8); } @@ -74,9 +74,9 @@ void MY_FAST_CALL Crc64GenerateTable() else #endif { - for (i = 256 * CRC_NUM_TABLES - 1; i >= 256; i--) + for (i = 256 * CRC64_NUM_TABLES - 1; i >= 256; i--) { - UInt64 x = g_Crc64Table[i - 256]; + UInt64 x = g_Crc64Table[(size_t)i - 256]; g_Crc64Table[i] = CRC_UINT64_SWAP(x); } g_Crc64Update = XzCrc64UpdateT1_BeT4; diff --git a/code/ryzom/client/src/seven_zip/XzCrc64Opt.cpp b/code/ryzom/client/src/seven_zip/XzCrc64Opt.cpp index c4fde65a1..b2852de4d 100644 --- a/code/ryzom/client/src/seven_zip/XzCrc64Opt.cpp +++ b/code/ryzom/client/src/seven_zip/XzCrc64Opt.cpp @@ -1,5 +1,5 @@ /* XzCrc64Opt.c -- CRC64 calculation -2015-03-01 : Igor Pavlov : Public domain */ +2017-06-30 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -7,24 +7,24 @@ #ifndef MY_CPU_BE -#define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) +#define CRC64_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) UInt64 MY_FAST_CALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, const UInt64 *table) { const Byte *p = (const Byte *)data; for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) - v = CRC_UPDATE_BYTE_2(v, *p); + v = CRC64_UPDATE_BYTE_2(v, *p); for (; size >= 4; size -= 4, p += 4) { UInt32 d = (UInt32)v ^ *(const UInt32 *)p; v = (v >> 32) - ^ table[0x300 + ((d ) & 0xFF)] - ^ table[0x200 + ((d >> 8) & 0xFF)] - ^ table[0x100 + ((d >> 16) & 0xFF)] - ^ table[0x000 + ((d >> 24))]; + ^ (table + 0x300)[((d ) & 0xFF)] + ^ (table + 0x200)[((d >> 8) & 0xFF)] + ^ (table + 0x100)[((d >> 16) & 0xFF)] + ^ (table + 0x000)[((d >> 24))]; } for (; size > 0; size--, p++) - v = CRC_UPDATE_BYTE_2(v, *p); + v = CRC64_UPDATE_BYTE_2(v, *p); return v; } @@ -43,7 +43,7 @@ UInt64 MY_FAST_CALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, con | ((v << 40) & ((UInt64)0xFF << 48)) \ | ((v << 56))) -#define CRC_UPDATE_BYTE_2_BE(crc, b) (table[(Byte)((crc) >> 56) ^ (b)] ^ ((crc) << 8)) +#define CRC64_UPDATE_BYTE_2_BE(crc, b) (table[(Byte)((crc) >> 56) ^ (b)] ^ ((crc) << 8)) UInt64 MY_FAST_CALL XzCrc64UpdateT1_BeT4(UInt64 v, const void *data, size_t size, const UInt64 *table) { @@ -51,18 +51,18 @@ UInt64 MY_FAST_CALL XzCrc64UpdateT1_BeT4(UInt64 v, const void *data, size_t size table += 0x100; v = CRC_UINT64_SWAP(v); for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) - v = CRC_UPDATE_BYTE_2_BE(v, *p); + v = CRC64_UPDATE_BYTE_2_BE(v, *p); for (; size >= 4; size -= 4, p += 4) { UInt32 d = (UInt32)(v >> 32) ^ *(const UInt32 *)p; v = (v << 32) - ^ table[0x000 + ((d ) & 0xFF)] - ^ table[0x100 + ((d >> 8) & 0xFF)] - ^ table[0x200 + ((d >> 16) & 0xFF)] - ^ table[0x300 + ((d >> 24))]; + ^ (table + 0x000)[((d ) & 0xFF)] + ^ (table + 0x100)[((d >> 8) & 0xFF)] + ^ (table + 0x200)[((d >> 16) & 0xFF)] + ^ (table + 0x300)[((d >> 24))]; } for (; size > 0; size--, p++) - v = CRC_UPDATE_BYTE_2_BE(v, *p); + v = CRC64_UPDATE_BYTE_2_BE(v, *p); return CRC_UINT64_SWAP(v); } diff --git a/code/ryzom/client/src/seven_zip/XzDec.cpp b/code/ryzom/client/src/seven_zip/XzDec.cpp index 1edc02456..e2c2a4667 100644 --- a/code/ryzom/client/src/seven_zip/XzDec.cpp +++ b/code/ryzom/client/src/seven_zip/XzDec.cpp @@ -1,14 +1,33 @@ /* XzDec.c -- Xz Decode -2015-11-09 : Igor Pavlov : Public domain */ +2018-04-24 : Igor Pavlov : Public domain */ #include "Precomp.h" +// #include + +// #define XZ_DUMP + /* #define XZ_DUMP */ #ifdef XZ_DUMP #include #endif +// #define SHOW_DEBUG_INFO + +#ifdef SHOW_DEBUG_INFO +#include +#endif + +#ifdef SHOW_DEBUG_INFO +#define PRF(x) x +#else +#define PRF(x) +#endif + +#define PRF_STR(s) PRF(printf("\n" s "\n")) +#define PRF_STR_INT(s, d) PRF(printf("\n" s " %d\n", (unsigned)d)) + #include #include @@ -19,16 +38,18 @@ #include "Delta.h" #include "Lzma2Dec.h" +// #define USE_SUBBLOCK + #ifdef USE_SUBBLOCK #include "Bcj3Dec.c" -#include "SbDec.c" +#include "SbDec.h" #endif #include "Xz.h" #define XZ_CHECK_SIZE_MAX 64 -#define CODER_BUF_SIZE (1 << 17) +#define CODER_BUF_SIZE ((size_t)1 << 17) unsigned Xz_ReadVarInt(const Byte *p, size_t maxSize, UInt64 *value) { @@ -56,8 +77,9 @@ typedef struct size_t bufConv; size_t bufTotal; - UInt32 methodId; int encodeMode; + + UInt32 methodId; UInt32 delta; UInt32 ip; UInt32 x86State; @@ -66,12 +88,12 @@ typedef struct Byte buf[BRA_BUF_SIZE]; } CBraState; -static void BraState_Free(void *pp, ISzAlloc *alloc) +static void BraState_Free(void *pp, ISzAllocPtr alloc) { - alloc->Free(alloc, pp); + ISzAlloc_Free(alloc, pp); } -static SRes BraState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAlloc *alloc) +static SRes BraState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAllocPtr alloc) { CBraState *p = ((CBraState *)pp); UNUSED_VAR(alloc); @@ -121,69 +143,84 @@ static void BraState_Init(void *pp) Delta_Init(p->deltaState); } -#define CASE_BRA_CONV(isa) case XZ_ID_ ## isa: p->bufConv = isa ## _Convert(p->buf, p->bufTotal, p->ip, p->encodeMode); break; -static SRes BraState_Code(void *pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, - int srcWasFinished, ECoderFinishMode finishMode, int *wasFinished) +#define CASE_BRA_CONV(isa) case XZ_ID_ ## isa: size = isa ## _Convert(data, size, p->ip, p->encodeMode); break; + +static SizeT BraState_Filter(void *pp, Byte *data, SizeT size) { CBraState *p = ((CBraState *)pp); - SizeT destLenOrig = *destLen; - SizeT srcLenOrig = *srcLen; + switch (p->methodId) + { + case XZ_ID_Delta: + if (p->encodeMode) + Delta_Encode(p->deltaState, p->delta, data, size); + else + Delta_Decode(p->deltaState, p->delta, data, size); + break; + case XZ_ID_X86: + size = x86_Convert(data, size, p->ip, &p->x86State, p->encodeMode); + break; + CASE_BRA_CONV(PPC) + CASE_BRA_CONV(IA64) + CASE_BRA_CONV(ARM) + CASE_BRA_CONV(ARMT) + CASE_BRA_CONV(SPARC) + } + p->ip += (UInt32)size; + return size; +} + + +static SRes BraState_Code2(void *pp, + Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, int srcWasFinished, + ECoderFinishMode finishMode, + // int *wasFinished + ECoderStatus *status) +{ + CBraState *p = ((CBraState *)pp); + SizeT destRem = *destLen; + SizeT srcRem = *srcLen; UNUSED_VAR(finishMode); + *destLen = 0; *srcLen = 0; - *wasFinished = 0; - while (destLenOrig > 0) + // *wasFinished = False; + *status = CODER_STATUS_NOT_FINISHED; + + while (destRem > 0) { if (p->bufPos != p->bufConv) { - size_t curSize = p->bufConv - p->bufPos; - if (curSize > destLenOrig) - curSize = destLenOrig; - memcpy(dest, p->buf + p->bufPos, curSize); - p->bufPos += curSize; - *destLen += curSize; - dest += curSize; - destLenOrig -= curSize; + size_t size = p->bufConv - p->bufPos; + if (size > destRem) + size = destRem; + memcpy(dest, p->buf + p->bufPos, size); + p->bufPos += size; + *destLen += size; + dest += size; + destRem -= size; continue; } + p->bufTotal -= p->bufPos; memmove(p->buf, p->buf + p->bufPos, p->bufTotal); p->bufPos = 0; p->bufConv = 0; { - size_t curSize = BRA_BUF_SIZE - p->bufTotal; - if (curSize > srcLenOrig) - curSize = srcLenOrig; - memcpy(p->buf + p->bufTotal, src, curSize); - *srcLen += curSize; - src += curSize; - srcLenOrig -= curSize; - p->bufTotal += curSize; + size_t size = BRA_BUF_SIZE - p->bufTotal; + if (size > srcRem) + size = srcRem; + memcpy(p->buf + p->bufTotal, src, size); + *srcLen += size; + src += size; + srcRem -= size; + p->bufTotal += size; } if (p->bufTotal == 0) break; - switch (p->methodId) - { - case XZ_ID_Delta: - if (p->encodeMode) - Delta_Encode(p->deltaState, p->delta, p->buf, p->bufTotal); - else - Delta_Decode(p->deltaState, p->delta, p->buf, p->bufTotal); - p->bufConv = p->bufTotal; - break; - case XZ_ID_X86: - p->bufConv = x86_Convert(p->buf, p->bufTotal, p->ip, &p->x86State, p->encodeMode); - break; - CASE_BRA_CONV(PPC) - CASE_BRA_CONV(IA64) - CASE_BRA_CONV(ARM) - CASE_BRA_CONV(ARMT) - CASE_BRA_CONV(SPARC) - default: - return SZ_ERROR_UNSUPPORTED; - } - p->ip += (UInt32)p->bufConv; + + p->bufConv = BraState_Filter(pp, p->buf, p->bufTotal); if (p->bufConv == 0) { @@ -192,48 +229,54 @@ static SRes BraState_Code(void *pp, Byte *dest, SizeT *destLen, const Byte *src, p->bufConv = p->bufTotal; } } - if (p->bufTotal == p->bufPos && srcLenOrig == 0 && srcWasFinished) - *wasFinished = 1; + + if (p->bufTotal == p->bufPos && srcRem == 0 && srcWasFinished) + { + *status = CODER_STATUS_FINISHED_WITH_MARK; + // *wasFinished = 1; + } + return SZ_OK; } -SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAlloc *alloc) + +SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAllocPtr alloc) { CBraState *decoder; - if (id != XZ_ID_Delta && - id != XZ_ID_X86 && - id != XZ_ID_PPC && - id != XZ_ID_IA64 && - id != XZ_ID_ARM && - id != XZ_ID_ARMT && - id != XZ_ID_SPARC) + if (id < XZ_ID_Delta || id > XZ_ID_SPARC) return SZ_ERROR_UNSUPPORTED; - p->p = 0; - decoder = (CBraState *)alloc->Alloc(alloc, sizeof(CBraState)); - if (decoder == 0) - return SZ_ERROR_MEM; + decoder = (CBraState*)p->p; + if (!decoder) + { + decoder = (CBraState *)ISzAlloc_Alloc(alloc, sizeof(CBraState)); + if (!decoder) + return SZ_ERROR_MEM; + p->p = decoder; + p->Free = BraState_Free; + p->SetProps = BraState_SetProps; + p->Init = BraState_Init; + p->Code2 = BraState_Code2; + p->Filter = BraState_Filter; + } decoder->methodId = (UInt32)id; decoder->encodeMode = encodeMode; - p->p = decoder; - p->Free = BraState_Free; - p->SetProps = BraState_SetProps; - p->Init = BraState_Init; - p->Code = BraState_Code; return SZ_OK; } + + /* ---------- SbState ---------- */ #ifdef USE_SUBBLOCK -static void SbState_Free(void *pp, ISzAlloc *alloc) +static void SbState_Free(void *pp, ISzAllocPtr alloc) { CSbDec *p = (CSbDec *)pp; SbDec_Free(p); - alloc->Free(alloc, pp); + ISzAlloc_Free(alloc, pp); } -static SRes SbState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAlloc *alloc) +static SRes SbState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAllocPtr alloc) { UNUSED_VAR(pp); UNUSED_VAR(props); @@ -246,8 +289,10 @@ static void SbState_Init(void *pp) SbDec_Init((CSbDec *)pp); } -static SRes SbState_Code(void *pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, - int srcWasFinished, ECoderFinishMode finishMode, int *wasFinished) +static SRes SbState_Code2(void *pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + int srcWasFinished, ECoderFinishMode finishMode, + // int *wasFinished + ECoderStatus *status) { CSbDec *p = (CSbDec *)pp; SRes res; @@ -260,102 +305,185 @@ static SRes SbState_Code(void *pp, Byte *dest, SizeT *destLen, const Byte *src, res = SbDec_Decode((CSbDec *)pp); *destLen -= p->destLen; *srcLen -= p->srcLen; - *wasFinished = (*destLen == 0 && *srcLen == 0); /* change it */ + // *wasFinished = (*destLen == 0 && *srcLen == 0); /* change it */ + *status = (*destLen == 0 && *srcLen == 0) ? + CODER_STATUS_FINISHED_WITH_MARK : + CODER_STATUS_NOT_FINISHED; return res; } -SRes SbState_SetFromMethod(IStateCoder *p, ISzAlloc *alloc) +static SRes SbState_SetFromMethod(IStateCoder *p, ISzAllocPtr alloc) { - CSbDec *decoder; - p->p = 0; - decoder = alloc->Alloc(alloc, sizeof(CSbDec)); - if (decoder == 0) - return SZ_ERROR_MEM; - p->p = decoder; - p->Free = SbState_Free; - p->SetProps = SbState_SetProps; - p->Init = SbState_Init; - p->Code = SbState_Code; + CSbDec *decoder = (CSbDec *)p->p; + if (!decoder) + { + decoder = (CSbDec *)ISzAlloc_Alloc(alloc, sizeof(CSbDec)); + if (!decoder) + return SZ_ERROR_MEM; + p->p = decoder; + p->Free = SbState_Free; + p->SetProps = SbState_SetProps; + p->Init = SbState_Init; + p->Code2 = SbState_Code2; + p->Filter = NULL; + } SbDec_Construct(decoder); SbDec_SetAlloc(decoder, alloc); return SZ_OK; } + #endif -/* ---------- Lzma2State ---------- */ -static void Lzma2State_Free(void *pp, ISzAlloc *alloc) + +/* ---------- Lzma2 ---------- */ + +typedef struct { - Lzma2Dec_Free((CLzma2Dec *)pp, alloc); - alloc->Free(alloc, pp); + CLzma2Dec decoder; + Bool outBufMode; +} CLzma2Dec_Spec; + + +static void Lzma2State_Free(void *pp, ISzAllocPtr alloc) +{ + CLzma2Dec_Spec *p = (CLzma2Dec_Spec *)pp; + if (p->outBufMode) + Lzma2Dec_FreeProbs(&p->decoder, alloc); + else + Lzma2Dec_Free(&p->decoder, alloc); + ISzAlloc_Free(alloc, pp); } -static SRes Lzma2State_SetProps(void *pp, const Byte *props, size_t propSize, ISzAlloc *alloc) +static SRes Lzma2State_SetProps(void *pp, const Byte *props, size_t propSize, ISzAllocPtr alloc) { if (propSize != 1) return SZ_ERROR_UNSUPPORTED; - return Lzma2Dec_Allocate((CLzma2Dec *)pp, props[0], alloc); + { + CLzma2Dec_Spec *p = (CLzma2Dec_Spec *)pp; + if (p->outBufMode) + return Lzma2Dec_AllocateProbs(&p->decoder, props[0], alloc); + else + return Lzma2Dec_Allocate(&p->decoder, props[0], alloc); + } } static void Lzma2State_Init(void *pp) { - Lzma2Dec_Init((CLzma2Dec *)pp); + Lzma2Dec_Init(&((CLzma2Dec_Spec *)pp)->decoder); } -static SRes Lzma2State_Code(void *pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, - int srcWasFinished, ECoderFinishMode finishMode, int *wasFinished) + +/* + if (outBufMode), then (dest) is not used. Use NULL. + Data is unpacked to (spec->decoder.decoder.dic) output buffer. +*/ + +static SRes Lzma2State_Code2(void *pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + int srcWasFinished, ECoderFinishMode finishMode, + // int *wasFinished, + ECoderStatus *status) { - ELzmaStatus status; + CLzma2Dec_Spec *spec = (CLzma2Dec_Spec *)pp; + ELzmaStatus status2; /* ELzmaFinishMode fm = (finishMode == LZMA_FINISH_ANY) ? LZMA_FINISH_ANY : LZMA_FINISH_END; */ - SRes res = Lzma2Dec_DecodeToBuf((CLzma2Dec *)pp, dest, destLen, src, srcLen, (ELzmaFinishMode)finishMode, &status); + SRes res; UNUSED_VAR(srcWasFinished); - *wasFinished = (status == LZMA_STATUS_FINISHED_WITH_MARK); + if (spec->outBufMode) + { + SizeT dicPos = spec->decoder.decoder.dicPos; + SizeT dicLimit = dicPos + *destLen; + res = Lzma2Dec_DecodeToDic(&spec->decoder, dicLimit, src, srcLen, (ELzmaFinishMode)finishMode, &status2); + *destLen = spec->decoder.decoder.dicPos - dicPos; + } + else + res = Lzma2Dec_DecodeToBuf(&spec->decoder, dest, destLen, src, srcLen, (ELzmaFinishMode)finishMode, &status2); + // *wasFinished = (status2 == LZMA_STATUS_FINISHED_WITH_MARK); + // ECoderStatus values are identical to ELzmaStatus values of LZMA2 decoder + *status = (ECoderStatus)status2; return res; } -static SRes Lzma2State_SetFromMethod(IStateCoder *p, ISzAlloc *alloc) + +static SRes Lzma2State_SetFromMethod(IStateCoder *p, Byte *outBuf, size_t outBufSize, ISzAllocPtr alloc) { - CLzma2Dec *decoder = (CLzma2Dec *)alloc->Alloc(alloc, sizeof(CLzma2Dec)); - p->p = decoder; - if (decoder == 0) - return SZ_ERROR_MEM; - p->Free = Lzma2State_Free; - p->SetProps = Lzma2State_SetProps; - p->Init = Lzma2State_Init; - p->Code = Lzma2State_Code; - Lzma2Dec_Construct(decoder); + CLzma2Dec_Spec *spec = (CLzma2Dec_Spec *)p->p; + if (!spec) + { + spec = (CLzma2Dec_Spec *)ISzAlloc_Alloc(alloc, sizeof(CLzma2Dec_Spec)); + if (!spec) + return SZ_ERROR_MEM; + p->p = spec; + p->Free = Lzma2State_Free; + p->SetProps = Lzma2State_SetProps; + p->Init = Lzma2State_Init; + p->Code2 = Lzma2State_Code2; + p->Filter = NULL; + Lzma2Dec_Construct(&spec->decoder); + } + spec->outBufMode = False; + if (outBuf) + { + spec->outBufMode = True; + spec->decoder.decoder.dic = outBuf; + spec->decoder.decoder.dicBufSize = outBufSize; + } return SZ_OK; } -void MixCoder_Construct(CMixCoder *p, ISzAlloc *alloc) +static SRes Lzma2State_ResetOutBuf(IStateCoder *p, Byte *outBuf, size_t outBufSize) +{ + CLzma2Dec_Spec *spec = (CLzma2Dec_Spec *)p->p; + if ((spec->outBufMode && !outBuf) || (!spec->outBufMode && outBuf)) + return SZ_ERROR_FAIL; + if (outBuf) + { + spec->decoder.decoder.dic = outBuf; + spec->decoder.decoder.dicBufSize = outBufSize; + } + return SZ_OK; +} + + + +static void MixCoder_Construct(CMixCoder *p, ISzAllocPtr alloc) { unsigned i; p->alloc = alloc; p->buf = NULL; p->numCoders = 0; + + p->outBufSize = 0; + p->outBuf = NULL; + // p->SingleBufMode = False; + for (i = 0; i < MIXCODER_NUM_FILTERS_MAX; i++) p->coders[i].p = NULL; } -void MixCoder_Free(CMixCoder *p) + +static void MixCoder_Free(CMixCoder *p) { unsigned i; - for (i = 0; i < p->numCoders; i++) + p->numCoders = 0; + for (i = 0; i < MIXCODER_NUM_FILTERS_MAX; i++) { IStateCoder *sc = &p->coders[i]; - if (p->alloc && sc->p) + if (sc->p) + { sc->Free(sc->p, p->alloc); + sc->p = NULL; + } } - p->numCoders = 0; if (p->buf) { - p->alloc->Free(p->alloc, p->buf); + ISzAlloc_Free(p->alloc, p->buf); p->buf = NULL; /* 9.31: the BUG was fixed */ } } -void MixCoder_Init(CMixCoder *p) +static void MixCoder_Init(CMixCoder *p) { unsigned i; for (i = 0; i < MIXCODER_NUM_FILTERS_MAX - 1; i++) @@ -368,16 +496,22 @@ void MixCoder_Init(CMixCoder *p) { IStateCoder *coder = &p->coders[i]; coder->Init(coder->p); + p->results[i] = SZ_OK; } + p->outWritten = 0; + p->wasFinished = False; + p->res = SZ_OK; + p->status = CODER_STATUS_NOT_SPECIFIED; } -SRes MixCoder_SetFromMethod(CMixCoder *p, unsigned coderIndex, UInt64 methodId) + +static SRes MixCoder_SetFromMethod(CMixCoder *p, unsigned coderIndex, UInt64 methodId, Byte *outBuf, size_t outBufSize) { IStateCoder *sc = &p->coders[coderIndex]; p->ids[coderIndex] = methodId; switch (methodId) { - case XZ_ID_LZMA2: return Lzma2State_SetFromMethod(sc, p->alloc); + case XZ_ID_LZMA2: return Lzma2State_SetFromMethod(sc, outBuf, outBufSize, p->alloc); #ifdef USE_SUBBLOCK case XZ_ID_Subblock: return SbState_SetFromMethod(sc, p->alloc); #endif @@ -387,31 +521,128 @@ SRes MixCoder_SetFromMethod(CMixCoder *p, unsigned coderIndex, UInt64 methodId) return BraState_SetFromMethod(sc, methodId, 0, p->alloc); } -SRes MixCoder_Code(CMixCoder *p, Byte *dest, SizeT *destLen, + +static SRes MixCoder_ResetFromMethod(CMixCoder *p, unsigned coderIndex, UInt64 methodId, Byte *outBuf, size_t outBufSize) +{ + IStateCoder *sc = &p->coders[coderIndex]; + switch (methodId) + { + case XZ_ID_LZMA2: return Lzma2State_ResetOutBuf(sc, outBuf, outBufSize); + } + return SZ_ERROR_UNSUPPORTED; +} + + + +/* + if (destFinish) - then unpack data block is finished at (*destLen) position, + and we can return data that were not processed by filter + +output (status) can be : + CODER_STATUS_NOT_FINISHED + CODER_STATUS_FINISHED_WITH_MARK + CODER_STATUS_NEEDS_MORE_INPUT - not implemented still +*/ + +static SRes MixCoder_Code(CMixCoder *p, + Byte *dest, SizeT *destLen, int destFinish, const Byte *src, SizeT *srcLen, int srcWasFinished, - ECoderFinishMode finishMode, ECoderStatus *status) + ECoderFinishMode finishMode) { SizeT destLenOrig = *destLen; SizeT srcLenOrig = *srcLen; - Bool allFinished = True; + *destLen = 0; *srcLen = 0; - *status = CODER_STATUS_NOT_FINISHED; - if (!p->buf) + if (p->wasFinished) + return p->res; + + p->status = CODER_STATUS_NOT_FINISHED; + + // if (p->SingleBufMode) + if (p->outBuf) { - p->buf = (Byte *)p->alloc->Alloc(p->alloc, CODER_BUF_SIZE * (MIXCODER_NUM_FILTERS_MAX - 1)); - if (!p->buf) - return SZ_ERROR_MEM; + SRes res; + SizeT destLen2, srcLen2; + int wasFinished; + + PRF_STR("------- MixCoder Single ----------"); + + srcLen2 = srcLenOrig; + destLen2 = destLenOrig; + + { + IStateCoder *coder = &p->coders[0]; + res = coder->Code2(coder->p, NULL, &destLen2, src, &srcLen2, srcWasFinished, finishMode, + // &wasFinished, + &p->status); + wasFinished = (p->status == CODER_STATUS_FINISHED_WITH_MARK); + } + + p->res = res; + + /* + if (wasFinished) + p->status = CODER_STATUS_FINISHED_WITH_MARK; + else + { + if (res == SZ_OK) + if (destLen2 != destLenOrig) + p->status = CODER_STATUS_NEEDS_MORE_INPUT; + } + */ + + + *srcLen = srcLen2; + src += srcLen2; + p->outWritten += destLen2; + + if (res != SZ_OK || srcWasFinished || wasFinished) + p->wasFinished = True; + + if (p->numCoders == 1) + *destLen = destLen2; + else if (p->wasFinished) + { + unsigned i; + size_t processed = p->outWritten; + + for (i = 1; i < p->numCoders; i++) + { + IStateCoder *coder = &p->coders[i]; + processed = coder->Filter(coder->p, p->outBuf, processed); + if (wasFinished || (destFinish && p->outWritten == destLenOrig)) + processed = p->outWritten; + PRF_STR_INT("filter", i); + } + *destLen = processed; + } + return res; } + PRF_STR("standard mix"); + if (p->numCoders != 1) + { + if (!p->buf) + { + p->buf = (Byte *)ISzAlloc_Alloc(p->alloc, CODER_BUF_SIZE * (MIXCODER_NUM_FILTERS_MAX - 1)); + if (!p->buf) + return SZ_ERROR_MEM; + } + finishMode = CODER_FINISH_ANY; + } for (;;) { Bool processed = False; + Bool allFinished = True; + SRes resMain = SZ_OK; unsigned i; + + p->status = CODER_STATUS_NOT_FINISHED; /* if (p->numCoders == 1 && *destLen == destLenOrig && finishMode == LZMA_FINISH_ANY) break; @@ -421,79 +652,106 @@ SRes MixCoder_Code(CMixCoder *p, Byte *dest, SizeT *destLen, { SRes res; IStateCoder *coder = &p->coders[i]; - Byte *destCur; - SizeT destLenCur, srcLenCur; - const Byte *srcCur; - int srcFinishedCur; + Byte *dest2; + SizeT destLen2, srcLen2; // destLen2_Orig; + const Byte *src2; + int srcFinished2; int encodingWasFinished; + ECoderStatus status2; if (i == 0) { - srcCur = src; - srcLenCur = srcLenOrig - *srcLen; - srcFinishedCur = srcWasFinished; + src2 = src; + srcLen2 = srcLenOrig - *srcLen; + srcFinished2 = srcWasFinished; } else { - srcCur = p->buf + (CODER_BUF_SIZE * (i - 1)) + p->pos[i - 1]; - srcLenCur = p->size[i - 1] - p->pos[i - 1]; - srcFinishedCur = p->finished[i - 1]; + size_t k = i - 1; + src2 = p->buf + (CODER_BUF_SIZE * k) + p->pos[k]; + srcLen2 = p->size[k] - p->pos[k]; + srcFinished2 = p->finished[k]; } if (i == p->numCoders - 1) { - destCur = dest; - destLenCur = destLenOrig - *destLen; + dest2 = dest; + destLen2 = destLenOrig - *destLen; } else { if (p->pos[i] != p->size[i]) continue; - destCur = p->buf + (CODER_BUF_SIZE * i); - destLenCur = CODER_BUF_SIZE; + dest2 = p->buf + (CODER_BUF_SIZE * i); + destLen2 = CODER_BUF_SIZE; } - res = coder->Code(coder->p, destCur, &destLenCur, srcCur, &srcLenCur, srcFinishedCur, finishMode, &encodingWasFinished); + // destLen2_Orig = destLen2; + + if (p->results[i] != SZ_OK) + { + if (resMain == SZ_OK) + resMain = p->results[i]; + continue; + } + res = coder->Code2(coder->p, + dest2, &destLen2, + src2, &srcLen2, srcFinished2, + finishMode, + // &encodingWasFinished, + &status2); + + if (res != SZ_OK) + { + p->results[i] = res; + if (resMain == SZ_OK) + resMain = res; + } + + encodingWasFinished = (status2 == CODER_STATUS_FINISHED_WITH_MARK); + if (!encodingWasFinished) + { allFinished = False; + if (p->numCoders == 1 && res == SZ_OK) + p->status = status2; + } if (i == 0) { - *srcLen += srcLenCur; - src += srcLenCur; + *srcLen += srcLen2; + src += srcLen2; } else - { - p->pos[i - 1] += srcLenCur; - } + p->pos[(size_t)i - 1] += srcLen2; if (i == p->numCoders - 1) { - *destLen += destLenCur; - dest += destLenCur; + *destLen += destLen2; + dest += destLen2; } else { - p->size[i] = destLenCur; + p->size[i] = destLen2; p->pos[i] = 0; p->finished[i] = encodingWasFinished; } - if (res != SZ_OK) - return res; - - if (destLenCur != 0 || srcLenCur != 0) + if (destLen2 != 0 || srcLen2 != 0) processed = True; } + if (!processed) - break; + { + if (allFinished) + p->status = CODER_STATUS_FINISHED_WITH_MARK; + return resMain; + } } - if (allFinished) - *status = CODER_STATUS_FINISHED_WITH_MARK; - return SZ_OK; } + SRes Xz_ParseHeader(CXzStreamFlags *p, const Byte *buf) { *p = (CXzStreamFlags)GetBe16(buf + XZ_SIG_SIZE); @@ -505,11 +763,11 @@ SRes Xz_ParseHeader(CXzStreamFlags *p, const Byte *buf) static Bool Xz_CheckFooter(CXzStreamFlags flags, UInt64 indexSize, const Byte *buf) { - return - indexSize == (((UInt64)GetUi32(buf + 4) + 1) << 2) && - (GetUi32(buf) == CrcCalc(buf + 4, 6) && - flags == GetBe16(buf + 8) && - memcmp(buf + 10, XZ_FOOTER_SIG, XZ_FOOTER_SIG_SIZE) == 0); + return indexSize == (((UInt64)GetUi32(buf + 4) + 1) << 2) + && GetUi32(buf) == CrcCalc(buf + 4, 6) + && flags == GetBe16(buf + 8) + && buf[10] == XZ_FOOTER_SIG_0 + && buf[11] == XZ_FOOTER_SIG_1; } #define READ_VARINT_AND_CHECK(buf, pos, size, res) \ @@ -517,20 +775,48 @@ static Bool Xz_CheckFooter(CXzStreamFlags flags, UInt64 indexSize, const Byte *b if (s == 0) return SZ_ERROR_ARCHIVE; pos += s; } +static Bool XzBlock_AreSupportedFilters(const CXzBlock *p) +{ + unsigned numFilters = XzBlock_GetNumFilters(p) - 1; + unsigned i; + { + const CXzFilter *f = &p->filters[numFilters]; + if (f->id != XZ_ID_LZMA2 || f->propsSize != 1 || f->props[0] > 40) + return False; + } + + for (i = 0; i < numFilters; i++) + { + const CXzFilter *f = &p->filters[i]; + if (f->id == XZ_ID_Delta) + { + if (f->propsSize != 1) + return False; + } + else if (f->id < XZ_ID_Delta + || f->id > XZ_ID_SPARC + || (f->propsSize != 0 && f->propsSize != 4)) + return False; + } + return True; +} + + SRes XzBlock_Parse(CXzBlock *p, const Byte *header) { unsigned pos; unsigned numFilters, i; unsigned headerSize = (unsigned)header[0] << 2; + /* (headerSize != 0) : another code checks */ + if (CrcCalc(header, headerSize) != GetUi32(header + headerSize)) return SZ_ERROR_ARCHIVE; pos = 1; - if (pos == headerSize) - return SZ_ERROR_ARCHIVE; p->flags = header[pos++]; + p->packSize = (UInt64)(Int64)-1; if (XzBlock_HasPackSize(p)) { READ_VARINT_AND_CHECK(header, pos, headerSize, &p->packSize); @@ -538,6 +824,7 @@ SRes XzBlock_Parse(CXzBlock *p, const Byte *header) return SZ_ERROR_ARCHIVE; } + p->unpackSize = (UInt64)(Int64)-1; if (XzBlock_HasUnpackSize(p)) READ_VARINT_AND_CHECK(header, pos, headerSize, &p->unpackSize); @@ -564,37 +851,56 @@ SRes XzBlock_Parse(CXzBlock *p, const Byte *header) #endif } + if (XzBlock_HasUnsupportedFlags(p)) + return SZ_ERROR_UNSUPPORTED; + while (pos < headerSize) if (header[pos++] != 0) return SZ_ERROR_ARCHIVE; return SZ_OK; } -SRes XzDec_Init(CMixCoder *p, const CXzBlock *block) + + + +static SRes XzDecMix_Init(CMixCoder *p, const CXzBlock *block, Byte *outBuf, size_t outBufSize) { unsigned i; Bool needReInit = True; unsigned numFilters = XzBlock_GetNumFilters(block); - - if (numFilters == p->numCoders) + + if (numFilters == p->numCoders && ((p->outBuf && outBuf) || (!p->outBuf && !outBuf))) { + needReInit = False; for (i = 0; i < numFilters; i++) if (p->ids[i] != block->filters[numFilters - 1 - i].id) + { + needReInit = True; break; - needReInit = (i != numFilters); + } } + + // p->SingleBufMode = (outBuf != NULL); + p->outBuf = outBuf; + p->outBufSize = outBufSize; + + // p->SingleBufMode = False; + // outBuf = NULL; if (needReInit) { MixCoder_Free(p); - p->numCoders = numFilters; for (i = 0; i < numFilters; i++) { - const CXzFilter *f = &block->filters[numFilters - 1 - i]; - RINOK(MixCoder_SetFromMethod(p, i, f->id)); + RINOK(MixCoder_SetFromMethod(p, i, block->filters[numFilters - 1 - i].id, outBuf, outBufSize)); } + p->numCoders = numFilters; } - + else + { + RINOK(MixCoder_ResetFromMethod(p, 0, block->filters[numFilters - 1].id, outBuf, outBufSize)); + } + for (i = 0; i < numFilters; i++) { const CXzFilter *f = &block->filters[numFilters - 1 - i]; @@ -606,6 +912,8 @@ SRes XzDec_Init(CMixCoder *p, const CXzBlock *block) return SZ_OK; } + + void XzUnpacker_Init(CXzUnpacker *p) { p->state = XZ_STATE_STREAM_HEADER; @@ -614,75 +922,171 @@ void XzUnpacker_Init(CXzUnpacker *p) p->numFinishedStreams = 0; p->numTotalBlocks = 0; p->padSize = 0; + p->decodeOnlyOneBlock = 0; + + p->parseMode = False; + p->decodeToStreamSignature = False; + + // p->outBuf = NULL; + // p->outBufSize = 0; + p->outDataWritten = 0; } -void XzUnpacker_Construct(CXzUnpacker *p, ISzAlloc *alloc) + +void XzUnpacker_SetOutBuf(CXzUnpacker *p, Byte *outBuf, size_t outBufSize) +{ + p->outBuf = outBuf; + p->outBufSize = outBufSize; +} + + +void XzUnpacker_Construct(CXzUnpacker *p, ISzAllocPtr alloc) { MixCoder_Construct(&p->decoder, alloc); + p->outBuf = NULL; + p->outBufSize = 0; XzUnpacker_Init(p); } + void XzUnpacker_Free(CXzUnpacker *p) { MixCoder_Free(&p->decoder); } + +void XzUnpacker_PrepareToRandomBlockDecoding(CXzUnpacker *p) +{ + p->indexSize = 0; + p->numBlocks = 0; + Sha256_Init(&p->sha); + p->state = XZ_STATE_BLOCK_HEADER; + p->pos = 0; + p->decodeOnlyOneBlock = 1; +} + + +static void XzUnpacker_UpdateIndex(CXzUnpacker *p, UInt64 packSize, UInt64 unpackSize) +{ + Byte temp[32]; + unsigned num = Xz_WriteVarInt(temp, packSize); + num += Xz_WriteVarInt(temp + num, unpackSize); + Sha256_Update(&p->sha, temp, num); + p->indexSize += num; + p->numBlocks++; +} + + + SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, - const Byte *src, SizeT *srcLen, ECoderFinishMode finishMode, ECoderStatus *status) + const Byte *src, SizeT *srcLen, int srcFinished, + ECoderFinishMode finishMode, ECoderStatus *status) { SizeT destLenOrig = *destLen; SizeT srcLenOrig = *srcLen; *destLen = 0; *srcLen = 0; *status = CODER_STATUS_NOT_SPECIFIED; + for (;;) { - SizeT srcRem = srcLenOrig - *srcLen; + SizeT srcRem; if (p->state == XZ_STATE_BLOCK) { SizeT destLen2 = destLenOrig - *destLen; SizeT srcLen2 = srcLenOrig - *srcLen; SRes res; + + ECoderFinishMode finishMode2 = finishMode; + Bool srcFinished2 = srcFinished; + Bool destFinish = False; + + if (p->block.packSize != (UInt64)(Int64)-1) + { + UInt64 rem = p->block.packSize - p->packSize; + if (srcLen2 >= rem) + { + srcFinished2 = True; + srcLen2 = (SizeT)rem; + } + if (rem == 0 && p->block.unpackSize == p->unpackSize) + return SZ_ERROR_DATA; + } + + if (p->block.unpackSize != (UInt64)(Int64)-1) + { + UInt64 rem = p->block.unpackSize - p->unpackSize; + if (destLen2 >= rem) + { + destFinish = True; + finishMode2 = CODER_FINISH_END; + destLen2 = (SizeT)rem; + } + } + + /* if (srcLen2 == 0 && destLen2 == 0) { *status = CODER_STATUS_NOT_FINISHED; return SZ_OK; } + */ - res = MixCoder_Code(&p->decoder, dest, &destLen2, src, &srcLen2, False, finishMode, status); - XzCheck_Update(&p->check, dest, destLen2); + { + res = MixCoder_Code(&p->decoder, + (p->outBuf ? NULL : dest), &destLen2, destFinish, + src, &srcLen2, srcFinished2, + finishMode2); + + *status = p->decoder.status; + XzCheck_Update(&p->check, (p->outBuf ? p->outBuf + p->outDataWritten : dest), destLen2); + if (!p->outBuf) + dest += destLen2; + p->outDataWritten += destLen2; + } (*srcLen) += srcLen2; src += srcLen2; p->packSize += srcLen2; - (*destLen) += destLen2; - dest += destLen2; p->unpackSize += destLen2; - + RINOK(res); - - if (*status == CODER_STATUS_FINISHED_WITH_MARK) + + if (*status != CODER_STATUS_FINISHED_WITH_MARK) { - Byte temp[32]; - unsigned num = Xz_WriteVarInt(temp, p->packSize + p->blockHeaderSize + XzFlags_GetCheckSize(p->streamFlags)); - num += Xz_WriteVarInt(temp + num, p->unpackSize); - Sha256_Update(&p->sha, temp, num); - p->indexSize += num; - p->numBlocks++; + if (p->block.packSize == p->packSize + && *status == CODER_STATUS_NEEDS_MORE_INPUT) + { + PRF_STR("CODER_STATUS_NEEDS_MORE_INPUT"); + *status = CODER_STATUS_NOT_SPECIFIED; + return SZ_ERROR_DATA; + } + return SZ_OK; + } + { + XzUnpacker_UpdateIndex(p, XzUnpacker_GetPackSizeForIndex(p), p->unpackSize); p->state = XZ_STATE_BLOCK_FOOTER; p->pos = 0; p->alignPos = 0; + *status = CODER_STATUS_NOT_SPECIFIED; + + if ((p->block.packSize != (UInt64)(Int64)-1 && p->block.packSize != p->packSize) + || (p->block.unpackSize != (UInt64)(Int64)-1 && p->block.unpackSize != p->unpackSize)) + { + PRF_STR("ERROR: block.size mismatch"); + return SZ_ERROR_DATA; + } } - else if (srcLen2 == 0 && destLen2 == 0) - return SZ_OK; - - continue; + // continue; } - if (srcRem == 0) + srcRem = srcLenOrig - *srcLen; + + // XZ_STATE_BLOCK_FOOTER can transit to XZ_STATE_BLOCK_HEADER without input bytes + if (srcRem == 0 && p->state != XZ_STATE_BLOCK_FOOTER) { *status = CODER_STATUS_NEEDS_MORE_INPUT; return SZ_OK; @@ -696,6 +1100,8 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, { if (p->pos < XZ_SIG_SIZE && *src != XZ_SIG[p->pos]) return SZ_ERROR_NO_ARCHIVE; + if (p->decodeToStreamSignature) + return SZ_OK; p->buf[p->pos++] = *src++; (*srcLen)++; } @@ -703,10 +1109,10 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, { RINOK(Xz_ParseHeader(&p->streamFlags, p->buf)); p->numStartedStreams++; - p->state = XZ_STATE_BLOCK_HEADER; - Sha256_Init(&p->sha); p->indexSize = 0; p->numBlocks = 0; + Sha256_Init(&p->sha); + p->state = XZ_STATE_BLOCK_HEADER; p->pos = 0; } break; @@ -720,6 +1126,8 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, (*srcLen)++; if (p->buf[0] == 0) { + if (p->decodeOnlyOneBlock) + return SZ_ERROR_DATA; p->indexPreSize = 1 + Xz_WriteVarInt(p->buf + 1, p->numBlocks); p->indexPos = p->indexPreSize; p->indexSize += p->indexPreSize; @@ -727,10 +1135,13 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, Sha256_Init(&p->sha); p->crc = CrcUpdate(CRC_INIT_VAL, p->buf, p->indexPreSize); p->state = XZ_STATE_STREAM_INDEX; + break; } p->blockHeaderSize = ((UInt32)p->buf[0] << 2) + 4; + break; } - else if (p->pos != p->blockHeaderSize) + + if (p->pos != p->blockHeaderSize) { UInt32 cur = p->blockHeaderSize - p->pos; if (cur > srcRem) @@ -743,20 +1154,32 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, else { RINOK(XzBlock_Parse(&p->block, p->buf)); + if (!XzBlock_AreSupportedFilters(&p->block)) + return SZ_ERROR_UNSUPPORTED; p->numTotalBlocks++; p->state = XZ_STATE_BLOCK; p->packSize = 0; p->unpackSize = 0; XzCheck_Init(&p->check, XzFlags_GetCheckType(p->streamFlags)); - RINOK(XzDec_Init(&p->decoder, &p->block)); + if (p->parseMode) + { + p->headerParsedOk = True; + return SZ_OK; + } + RINOK(XzDecMix_Init(&p->decoder, &p->block, p->outBuf, p->outBufSize)); } break; } case XZ_STATE_BLOCK_FOOTER: { - if (((p->packSize + p->alignPos) & 3) != 0) + if ((((unsigned)p->packSize + p->alignPos) & 3) != 0) { + if (srcRem == 0) + { + *status = CODER_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } (*srcLen)++; p->alignPos++; if (*src++ != 0) @@ -768,20 +1191,31 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, UInt32 cur = checkSize - p->pos; if (cur != 0) { + if (srcRem == 0) + { + *status = CODER_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } if (cur > srcRem) cur = (UInt32)srcRem; memcpy(p->buf + p->pos, src, cur); p->pos += cur; (*srcLen) += cur; src += cur; + if (checkSize != p->pos) + break; } - else { Byte digest[XZ_CHECK_SIZE_MAX]; p->state = XZ_STATE_BLOCK_HEADER; p->pos = 0; if (XzCheck_Final(&p->check, digest) && memcmp(digest, p->buf, checkSize) != 0) return SZ_ERROR_CRC; + if (p->decodeOnlyOneBlock) + { + *status = CODER_STATUS_FINISHED_WITH_MARK; + return SZ_OK; + } } } break; @@ -897,17 +1331,1443 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, */ } -Bool XzUnpacker_IsStreamWasFinished(CXzUnpacker *p) + +SRes XzUnpacker_CodeFull(CXzUnpacker *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, + ECoderFinishMode finishMode, ECoderStatus *status) +{ + XzUnpacker_Init(p); + XzUnpacker_SetOutBuf(p, dest, *destLen); + + return XzUnpacker_Code(p, + NULL, destLen, + src, srcLen, True, + finishMode, status); +} + + +Bool XzUnpacker_IsBlockFinished(const CXzUnpacker *p) +{ + return (p->state == XZ_STATE_BLOCK_HEADER) && (p->pos == 0); +} + +Bool XzUnpacker_IsStreamWasFinished(const CXzUnpacker *p) { return (p->state == XZ_STATE_STREAM_PADDING) && (((UInt32)p->padSize & 3) == 0); } -UInt64 XzUnpacker_GetExtraSize(CXzUnpacker *p) +UInt64 XzUnpacker_GetExtraSize(const CXzUnpacker *p) { UInt64 num = 0; if (p->state == XZ_STATE_STREAM_PADDING) - num += p->padSize; + num = p->padSize; else if (p->state == XZ_STATE_STREAM_HEADER) - num += p->padSize + p->pos; + num = p->padSize + p->pos; return num; } + + + + + + + + + + + + + + + + + + + + + +#ifndef _7ZIP_ST +#include "MtDec.h" +#endif + + +void XzDecMtProps_Init(CXzDecMtProps *p) +{ + p->inBufSize_ST = 1 << 18; + p->outStep_ST = 1 << 20; + p->ignoreErrors = False; + + #ifndef _7ZIP_ST + p->numThreads = 1; + p->inBufSize_MT = 1 << 18; + p->memUseMax = sizeof(size_t) << 28; + #endif +} + + + +#ifndef _7ZIP_ST + +/* ---------- CXzDecMtThread ---------- */ + +typedef struct +{ + Byte *outBuf; + size_t outBufSize; + size_t outPreSize; + size_t inPreSize; + size_t inPreHeaderSize; + size_t blockPackSize_for_Index; // including block header and checksum. + size_t blockPackTotal; // including stream header, block header and checksum. + size_t inCodeSize; + size_t outCodeSize; + ECoderStatus status; + SRes codeRes; + Bool skipMode; + // Bool finishedWithMark; + EMtDecParseState parseState; + Bool parsing_Truncated; + Bool atBlockHeader; + CXzStreamFlags streamFlags; + // UInt64 numFinishedStreams + UInt64 numStreams; + UInt64 numTotalBlocks; + UInt64 numBlocks; + + Bool dec_created; + CXzUnpacker dec; + + Byte mtPad[1 << 7]; +} CXzDecMtThread; + +#endif + + +/* ---------- CXzDecMt ---------- */ + +typedef struct +{ + CAlignOffsetAlloc alignOffsetAlloc; + ISzAllocPtr allocMid; + + CXzDecMtProps props; + size_t unpackBlockMaxSize; + + ISeqInStream *inStream; + ISeqOutStream *outStream; + ICompressProgress *progress; + // CXzStatInfo *stat; + + Bool finishMode; + Bool outSize_Defined; + UInt64 outSize; + + UInt64 outProcessed; + UInt64 inProcessed; + UInt64 readProcessed; + Bool readWasFinished; + SRes readRes; + SRes writeRes; + + Byte *outBuf; + size_t outBufSize; + Byte *inBuf; + size_t inBufSize; + Bool dec_created; + CXzUnpacker dec; + + ECoderStatus status; + SRes codeRes; + + #ifndef _7ZIP_ST + Bool mainDecoderWasCalled; + // int statErrorDefined; + int finishedDecoderIndex; + + // global values that are used in Parse stage + CXzStreamFlags streamFlags; + // UInt64 numFinishedStreams + UInt64 numStreams; + UInt64 numTotalBlocks; + UInt64 numBlocks; + + // UInt64 numBadBlocks; + SRes mainErrorCode; + + Bool isBlockHeaderState_Parse; + Bool isBlockHeaderState_Write; + UInt64 outProcessed_Parse; + Bool parsing_Truncated; + + Bool mtc_WasConstructed; + CMtDec mtc; + CXzDecMtThread coders[MTDEC__THREADS_MAX]; + #endif + +} CXzDecMt; + + + +CXzDecMtHandle XzDecMt_Create(ISzAllocPtr alloc, ISzAllocPtr allocMid) +{ + CXzDecMt *p = (CXzDecMt *)ISzAlloc_Alloc(alloc, sizeof(CXzDecMt)); + if (!p) + return NULL; + + AlignOffsetAlloc_CreateVTable(&p->alignOffsetAlloc); + p->alignOffsetAlloc.baseAlloc = alloc; + p->alignOffsetAlloc.numAlignBits = 7; + p->alignOffsetAlloc.offset = 0; + + p->allocMid = allocMid; + + p->outBuf = NULL; + p->outBufSize = 0; + p->inBuf = NULL; + p->inBufSize = 0; + p->dec_created = False; + + p->unpackBlockMaxSize = 0; + + XzDecMtProps_Init(&p->props); + + #ifndef _7ZIP_ST + p->mtc_WasConstructed = False; + { + unsigned i; + for (i = 0; i < MTDEC__THREADS_MAX; i++) + { + CXzDecMtThread *coder = &p->coders[i]; + coder->dec_created = False; + coder->outBuf = NULL; + coder->outBufSize = 0; + } + } + #endif + + return p; +} + + +#ifndef _7ZIP_ST + +static void XzDecMt_FreeOutBufs(CXzDecMt *p) +{ + unsigned i; + for (i = 0; i < MTDEC__THREADS_MAX; i++) + { + CXzDecMtThread *coder = &p->coders[i]; + if (coder->outBuf) + { + ISzAlloc_Free(p->allocMid, coder->outBuf); + coder->outBuf = NULL; + coder->outBufSize = 0; + } + } + p->unpackBlockMaxSize = 0; +} + +#endif + + + +static void XzDecMt_FreeSt(CXzDecMt *p) +{ + if (p->dec_created) + { + XzUnpacker_Free(&p->dec); + p->dec_created = False; + } + + if (p->outBuf) + { + ISzAlloc_Free(p->allocMid, p->outBuf); + p->outBuf = NULL; + } + p->outBufSize = 0; + + if (p->inBuf) + { + ISzAlloc_Free(p->allocMid, p->inBuf); + p->inBuf = NULL; + } + p->inBufSize = 0; +} + + +void XzDecMt_Destroy(CXzDecMtHandle pp) +{ + CXzDecMt *p = (CXzDecMt *)pp; + + XzDecMt_FreeSt(p); + + #ifndef _7ZIP_ST + + if (p->mtc_WasConstructed) + { + MtDec_Destruct(&p->mtc); + p->mtc_WasConstructed = False; + } + { + unsigned i; + for (i = 0; i < MTDEC__THREADS_MAX; i++) + { + CXzDecMtThread *t = &p->coders[i]; + if (t->dec_created) + { + // we don't need to free dict here + XzUnpacker_Free(&t->dec); + t->dec_created = False; + } + } + } + XzDecMt_FreeOutBufs(p); + + #endif + + ISzAlloc_Free(p->alignOffsetAlloc.baseAlloc, pp); +} + + + +#ifndef _7ZIP_ST + +static void XzDecMt_Callback_Parse(void *obj, unsigned coderIndex, CMtDecCallbackInfo *cc) +{ + CXzDecMt *me = (CXzDecMt *)obj; + CXzDecMtThread *coder = &me->coders[coderIndex]; + size_t srcSize = cc->srcSize; + + cc->srcSize = 0; + cc->outPos = 0; + cc->state = MTDEC_PARSE_CONTINUE; + + cc->canCreateNewThread = True; + + if (cc->startCall) + { + coder->outPreSize = 0; + coder->inPreSize = 0; + coder->inPreHeaderSize = 0; + coder->parseState = MTDEC_PARSE_CONTINUE; + coder->parsing_Truncated = False; + coder->skipMode = False; + coder->codeRes = SZ_OK; + coder->status = CODER_STATUS_NOT_SPECIFIED; + coder->inCodeSize = 0; + coder->outCodeSize = 0; + + coder->numStreams = me->numStreams; + coder->numTotalBlocks = me->numTotalBlocks; + coder->numBlocks = me->numBlocks; + + if (!coder->dec_created) + { + XzUnpacker_Construct(&coder->dec, &me->alignOffsetAlloc.vt); + coder->dec_created = True; + } + + XzUnpacker_Init(&coder->dec); + + if (me->isBlockHeaderState_Parse) + { + coder->dec.streamFlags = me->streamFlags; + coder->atBlockHeader = True; + XzUnpacker_PrepareToRandomBlockDecoding(&coder->dec); + } + else + { + coder->atBlockHeader = False; + me->isBlockHeaderState_Parse = True; + } + + coder->dec.numStartedStreams = me->numStreams; + coder->dec.numTotalBlocks = me->numTotalBlocks; + coder->dec.numBlocks = me->numBlocks; + } + + while (!coder->skipMode) + { + ECoderStatus status; + SRes res; + size_t srcSize2 = srcSize; + size_t destSize = (size_t)0 - 1; + + coder->dec.parseMode = True; + coder->dec.headerParsedOk = False; + + PRF_STR_INT("Parse", srcSize2); + + res = XzUnpacker_Code(&coder->dec, + NULL, &destSize, + cc->src, &srcSize2, cc->srcFinished, + CODER_FINISH_END, &status); + + // PRF(printf(" res = %d, srcSize2 = %d", res, (unsigned)srcSize2)); + + coder->codeRes = res; + coder->status = status; + cc->srcSize += srcSize2; + srcSize -= srcSize2; + coder->inPreHeaderSize += srcSize2; + coder->inPreSize = coder->inPreHeaderSize; + + if (res != SZ_OK) + { + cc->state = + coder->parseState = MTDEC_PARSE_END; + /* + if (res == SZ_ERROR_MEM) + return res; + return SZ_OK; + */ + return; // res; + } + + if (coder->dec.headerParsedOk) + { + const CXzBlock *block = &coder->dec.block; + if (XzBlock_HasUnpackSize(block) + // && block->unpackSize <= me->props.outBlockMax + && XzBlock_HasPackSize(block)) + { + { + if (block->unpackSize * 2 * me->mtc.numStartedThreads > me->props.memUseMax) + { + cc->state = MTDEC_PARSE_OVERFLOW; + return; // SZ_OK; + } + } + { + UInt64 packSize = block->packSize; + UInt64 packSizeAligned = packSize + ((0 - (unsigned)packSize) & 3); + UInt32 checkSize = XzFlags_GetCheckSize(coder->dec.streamFlags); + UInt64 blockPackSum = coder->inPreSize + packSizeAligned + checkSize; + // if (blockPackSum <= me->props.inBlockMax) + // unpackBlockMaxSize + { + coder->blockPackSize_for_Index = (size_t)(coder->dec.blockHeaderSize + packSize + checkSize); + coder->blockPackTotal = (size_t)blockPackSum; + coder->outPreSize = (size_t)block->unpackSize; + coder->streamFlags = coder->dec.streamFlags; + me->streamFlags = coder->dec.streamFlags; + coder->skipMode = True; + break; + } + } + } + } + else + // if (coder->inPreSize <= me->props.inBlockMax) + { + if (!cc->srcFinished) + return; // SZ_OK; + cc->state = + coder->parseState = MTDEC_PARSE_END; + return; // SZ_OK; + } + cc->state = MTDEC_PARSE_OVERFLOW; + return; // SZ_OK; + } + + // ---------- skipMode ---------- + { + UInt64 rem = coder->blockPackTotal - coder->inPreSize; + size_t cur = srcSize; + if (cur > rem) + cur = (size_t)rem; + cc->srcSize += cur; + coder->inPreSize += cur; + srcSize -= cur; + + if (coder->inPreSize == coder->blockPackTotal) + { + if (srcSize == 0) + { + if (!cc->srcFinished) + return; // SZ_OK; + cc->state = MTDEC_PARSE_END; + } + else if ((cc->src)[cc->srcSize] == 0) // we check control byte of next block + cc->state = MTDEC_PARSE_END; + else + { + cc->state = MTDEC_PARSE_NEW; + + { + size_t blockMax = me->unpackBlockMaxSize; + if (blockMax < coder->outPreSize) + blockMax = coder->outPreSize; + { + UInt64 required = (UInt64)blockMax * (me->mtc.numStartedThreads + 1) * 2; + if (me->props.memUseMax < required) + cc->canCreateNewThread = False; + } + } + + if (me->outSize_Defined) + { + // next block can be zero size + const UInt64 rem2 = me->outSize - me->outProcessed_Parse; + if (rem2 < coder->outPreSize) + { + coder->parsing_Truncated = True; + cc->state = MTDEC_PARSE_END; + } + me->outProcessed_Parse += coder->outPreSize; + } + } + } + else if (cc->srcFinished) + cc->state = MTDEC_PARSE_END; + else + return; // SZ_OK; + + coder->parseState = cc->state; + cc->outPos = coder->outPreSize; + + me->numStreams = coder->dec.numStartedStreams; + me->numTotalBlocks = coder->dec.numTotalBlocks; + me->numBlocks = coder->dec.numBlocks + 1; + return; // SZ_OK; + } +} + + +static SRes XzDecMt_Callback_PreCode(void *pp, unsigned coderIndex) +{ + CXzDecMt *me = (CXzDecMt *)pp; + CXzDecMtThread *coder = &me->coders[coderIndex]; + Byte *dest; + + if (!coder->dec.headerParsedOk) + return SZ_OK; + + dest = coder->outBuf; + + if (!dest || coder->outBufSize < coder->outPreSize) + { + if (dest) + { + ISzAlloc_Free(me->allocMid, dest); + coder->outBuf = NULL; + coder->outBufSize = 0; + } + { + size_t outPreSize = coder->outPreSize; + if (outPreSize == 0) + outPreSize = 1; + dest = (Byte *)ISzAlloc_Alloc(me->allocMid, outPreSize); + } + if (!dest) + return SZ_ERROR_MEM; + coder->outBuf = dest; + coder->outBufSize = coder->outPreSize; + + if (coder->outBufSize > me->unpackBlockMaxSize) + me->unpackBlockMaxSize = coder->outBufSize; + } + + // return SZ_ERROR_MEM; + + XzUnpacker_SetOutBuf(&coder->dec, coder->outBuf, coder->outBufSize); + + { + SRes res = XzDecMix_Init(&coder->dec.decoder, &coder->dec.block, coder->outBuf, coder->outBufSize); + // res = SZ_ERROR_UNSUPPORTED; // to test + coder->codeRes = res; + if (res != SZ_OK) + { + // if (res == SZ_ERROR_MEM) return res; + if (me->props.ignoreErrors && res != SZ_ERROR_MEM) + return S_OK; + return res; + } + } + + return SZ_OK; +} + + +static SRes XzDecMt_Callback_Code(void *pp, unsigned coderIndex, + const Byte *src, size_t srcSize, int srcFinished, + // int finished, int blockFinished, + UInt64 *inCodePos, UInt64 *outCodePos, int *stop) +{ + CXzDecMt *me = (CXzDecMt *)pp; + CXzDecMtThread *coder = &me->coders[coderIndex]; + + *inCodePos = coder->inCodeSize; + *outCodePos = coder->outCodeSize; + *stop = True; + + if (coder->inCodeSize < coder->inPreHeaderSize) + { + UInt64 rem = coder->inPreHeaderSize - coder->inCodeSize; + size_t step = srcSize; + if (step > rem) + step = (size_t)rem; + src += step; + srcSize -= step; + coder->inCodeSize += step; + if (coder->inCodeSize < coder->inPreHeaderSize) + { + *stop = False; + return SZ_OK; + } + } + + if (!coder->dec.headerParsedOk) + return SZ_OK; + if (!coder->outBuf) + return SZ_OK; + + if (coder->codeRes == SZ_OK) + { + ECoderStatus status; + SRes res; + size_t srcProcessed = srcSize; + size_t outSizeCur = coder->outPreSize - coder->dec.outDataWritten; + + // PRF(printf("\nCallback_Code: Code %d %d\n", (unsigned)srcSize, (unsigned)outSizeCur)); + + res = XzUnpacker_Code(&coder->dec, + NULL, &outSizeCur, + src, &srcProcessed, srcFinished, + // coder->finishedWithMark ? CODER_FINISH_END : CODER_FINISH_ANY, + CODER_FINISH_END, + &status); + + // PRF(printf(" res = %d, srcSize2 = %d, outSizeCur = %d", res, (unsigned)srcProcessed, (unsigned)outSizeCur)); + + coder->codeRes = res; + coder->status = status; + coder->inCodeSize += srcProcessed; + coder->outCodeSize = coder->dec.outDataWritten; + *inCodePos = coder->inCodeSize; + *outCodePos = coder->outCodeSize; + + if (res == SZ_OK) + { + if (srcProcessed == srcSize) + *stop = False; + return SZ_OK; + } + } + + if (me->props.ignoreErrors && coder->codeRes != SZ_ERROR_MEM) + { + *inCodePos = coder->inPreSize; + *outCodePos = coder->outPreSize; + return S_OK; + } + return coder->codeRes; +} + + +#define XZDECMT_STREAM_WRITE_STEP (1 << 24) + +static SRes XzDecMt_Callback_Write(void *pp, unsigned coderIndex, + Bool needWriteToStream, + const Byte *src, size_t srcSize, + // int srcFinished, + Bool *needContinue, + Bool *canRecode) +{ + CXzDecMt *me = (CXzDecMt *)pp; + const CXzDecMtThread *coder = &me->coders[coderIndex]; + + // PRF(printf("\nWrite processed = %d srcSize = %d\n", (unsigned)me->mtc.inProcessed, (unsigned)srcSize)); + + *needContinue = False; + *canRecode = True; + + if (!needWriteToStream) + return SZ_OK; + + if (!coder->dec.headerParsedOk || !coder->outBuf) + { + if (me->finishedDecoderIndex < 0) + me->finishedDecoderIndex = coderIndex; + return SZ_OK; + } + + if (me->finishedDecoderIndex >= 0) + return SZ_OK; + + me->mtc.inProcessed += coder->inCodeSize; + + *canRecode = False; + + { + SRes res; + size_t size = coder->outCodeSize; + Byte *data = coder->outBuf; + + // we use in me->dec: sha, numBlocks, indexSize + + if (!me->isBlockHeaderState_Write) + { + XzUnpacker_PrepareToRandomBlockDecoding(&me->dec); + me->dec.decodeOnlyOneBlock = False; + me->dec.numStartedStreams = coder->dec.numStartedStreams; + me->dec.streamFlags = coder->streamFlags; + + me->isBlockHeaderState_Write = True; + } + + me->dec.numTotalBlocks = coder->dec.numTotalBlocks; + XzUnpacker_UpdateIndex(&me->dec, coder->blockPackSize_for_Index, coder->outPreSize); + + if (coder->outPreSize != size) + { + if (me->props.ignoreErrors) + { + memset(data + size, 0, coder->outPreSize - size); + size = coder->outPreSize; + } + // me->numBadBlocks++; + if (me->mainErrorCode == SZ_OK) + { + if ((int)coder->status == LZMA_STATUS_NEEDS_MORE_INPUT) + me->mainErrorCode = SZ_ERROR_INPUT_EOF; + else + me->mainErrorCode = SZ_ERROR_DATA; + } + } + + if (me->writeRes != SZ_OK) + return me->writeRes; + + res = SZ_OK; + { + if (me->outSize_Defined) + { + const UInt64 rem = me->outSize - me->outProcessed; + if (size > rem) + size = (SizeT)rem; + } + + for (;;) + { + size_t cur = size; + size_t written; + if (cur > XZDECMT_STREAM_WRITE_STEP) + cur = XZDECMT_STREAM_WRITE_STEP; + + written = ISeqOutStream_Write(me->outStream, data, cur); + + // PRF(printf("\nWritten ask = %d written = %d\n", (unsigned)cur, (unsigned)written)); + + me->outProcessed += written; + if (written != cur) + { + me->writeRes = SZ_ERROR_WRITE; + res = me->writeRes; + break; + } + data += cur; + size -= cur; + // PRF_STR_INT("Written size =", size); + if (size == 0) + break; + res = MtProgress_ProgressAdd(&me->mtc.mtProgress, 0, 0); + if (res != SZ_OK) + break; + } + } + + if (coder->codeRes != SZ_OK) + if (!me->props.ignoreErrors) + { + me->finishedDecoderIndex = coderIndex; + return res; + } + + RINOK(res); + + if (coder->inPreSize != coder->inCodeSize + || coder->blockPackTotal != coder->inCodeSize) + { + me->finishedDecoderIndex = coderIndex; + return SZ_OK; + } + + if (coder->parseState != MTDEC_PARSE_END) + { + *needContinue = True; + return SZ_OK; + } + } + + // (coder->state == MTDEC_PARSE_END) means that there are no other working threads + // so we can use mtc variables without lock + + PRF_STR_INT("Write MTDEC_PARSE_END", me->mtc.inProcessed); + + me->mtc.mtProgress.totalInSize = me->mtc.inProcessed; + { + CXzUnpacker *dec = &me->dec; + + PRF_STR_INT("PostSingle", srcSize); + + { + size_t srcProcessed = srcSize; + ECoderStatus status; + size_t outSizeCur = 0; + SRes res; + + // dec->decodeOnlyOneBlock = False; + dec->decodeToStreamSignature = True; + + me->mainDecoderWasCalled = True; + + if (coder->parsing_Truncated) + { + me->parsing_Truncated = True; + return SZ_OK; + } + + res = XzUnpacker_Code(dec, + NULL, &outSizeCur, + src, &srcProcessed, + me->mtc.readWasFinished, // srcFinished + CODER_FINISH_END, // CODER_FINISH_ANY, + &status); + + me->status = status; + me->codeRes = res; + + me->mtc.inProcessed += srcProcessed; + me->mtc.mtProgress.totalInSize = me->mtc.inProcessed; + + if (res != SZ_OK) + { + return S_OK; + // return res; + } + + if (dec->state == XZ_STATE_STREAM_HEADER) + { + *needContinue = True; + me->isBlockHeaderState_Parse = False; + me->isBlockHeaderState_Write = False; + { + Byte *crossBuf = MtDec_GetCrossBuff(&me->mtc); + if (!crossBuf) + return SZ_ERROR_MEM; + memcpy(crossBuf, src + srcProcessed, srcSize - srcProcessed); + } + me->mtc.crossStart = 0; + me->mtc.crossEnd = srcSize - srcProcessed; + return SZ_OK; + } + + if (status != CODER_STATUS_NEEDS_MORE_INPUT) + { + return E_FAIL; + } + + if (me->mtc.readWasFinished) + { + return SZ_OK; + } + } + + { + size_t inPos; + size_t inLim; + const Byte *inData; + UInt64 inProgressPrev = me->mtc.inProcessed; + + // XzDecMt_Prepare_InBuf_ST(p); + Byte *crossBuf = MtDec_GetCrossBuff(&me->mtc); + if (!crossBuf) + return SZ_ERROR_MEM; + + inPos = 0; + inLim = 0; + // outProcessed = 0; + + inData = crossBuf; + + for (;;) + { + SizeT inProcessed; + SizeT outProcessed; + ECoderStatus status; + SRes res; + + if (inPos == inLim) + { + if (!me->mtc.readWasFinished) + { + inPos = 0; + inLim = me->mtc.inBufSize; + me->mtc.readRes = ISeqInStream_Read(me->inStream, (void *)inData, &inLim); + me->mtc.readProcessed += inLim; + if (inLim == 0 || me->mtc.readRes != SZ_OK) + me->mtc.readWasFinished = True; + } + } + + inProcessed = inLim - inPos; + outProcessed = 0; + + res = XzUnpacker_Code(dec, + NULL, &outProcessed, + inData + inPos, &inProcessed, + (inProcessed == 0), // srcFinished + CODER_FINISH_END, &status); + + me->codeRes = res; + me->status = status; + inPos += inProcessed; + me->mtc.inProcessed += inProcessed; + me->mtc.mtProgress.totalInSize = me->mtc.inProcessed; + + if (res != SZ_OK) + { + return S_OK; + // return res; + } + + if (dec->state == XZ_STATE_STREAM_HEADER) + { + *needContinue = True; + me->mtc.crossStart = inPos; + me->mtc.crossEnd = inLim; + me->isBlockHeaderState_Parse = False; + me->isBlockHeaderState_Write = False; + return SZ_OK; + } + + if (status != CODER_STATUS_NEEDS_MORE_INPUT) + return E_FAIL; + + if (me->mtc.progress) + { + UInt64 inDelta = me->mtc.inProcessed - inProgressPrev; + if (inDelta >= (1 << 22)) + { + RINOK(MtProgress_Progress_ST(&me->mtc.mtProgress)); + inProgressPrev = me->mtc.inProcessed; + } + } + if (me->mtc.readWasFinished) + return SZ_OK; + } + } + } +} + + +#endif + + + +void XzStatInfo_Clear(CXzStatInfo *p) +{ + p->InSize = 0; + p->OutSize = 0; + + p->NumStreams = 0; + p->NumBlocks = 0; + + p->UnpackSize_Defined = False; + + p->NumStreams_Defined = False; + p->NumBlocks_Defined = False; + + // p->IsArc = False; + // p->UnexpectedEnd = False; + // p->Unsupported = False; + // p->HeadersError = False; + // p->DataError = False; + // p->CrcError = False; + + p->DataAfterEnd = False; + p->DecodingTruncated = False; + + p->DecodeRes = SZ_OK; + p->ReadRes = SZ_OK; + p->ProgressRes = SZ_OK; + + p->CombinedRes = SZ_OK; + p->CombinedRes_Type = SZ_OK; +} + + + + +static SRes XzDecMt_Decode_ST(CXzDecMt *p + #ifndef _7ZIP_ST + , Bool tMode + #endif + , CXzStatInfo *stat) +{ + size_t outPos; + size_t inPos, inLim; + const Byte *inData; + UInt64 inPrev, outPrev; + + CXzUnpacker *dec; + + #ifndef _7ZIP_ST + if (tMode) + { + XzDecMt_FreeOutBufs(p); + tMode = MtDec_PrepareRead(&p->mtc); + } + #endif + + if (!p->outBuf || p->outBufSize != p->props.outStep_ST) + { + ISzAlloc_Free(p->allocMid, p->outBuf); + p->outBufSize = 0; + p->outBuf = (Byte *)ISzAlloc_Alloc(p->allocMid, p->props.outStep_ST); + if (!p->outBuf) + return SZ_ERROR_MEM; + p->outBufSize = p->props.outStep_ST; + } + + if (!p->inBuf || p->inBufSize != p->props.inBufSize_ST) + { + ISzAlloc_Free(p->allocMid, p->inBuf); + p->inBufSize = 0; + p->inBuf = (Byte *)ISzAlloc_Alloc(p->allocMid, p->props.inBufSize_ST); + if (!p->inBuf) + return SZ_ERROR_MEM; + p->inBufSize = p->props.inBufSize_ST; + } + + dec = &p->dec; + dec->decodeToStreamSignature = False; + // dec->decodeOnlyOneBlock = False; + + XzUnpacker_SetOutBuf(dec, NULL, 0); + + inPrev = p->inProcessed; + outPrev = p->outProcessed; + + inPos = 0; + inLim = 0; + inData = NULL; + outPos = 0; + + for (;;) + { + SizeT outSize; + Bool finished; + ECoderFinishMode finishMode; + SizeT inProcessed; + ECoderStatus status; + SRes res; + + SizeT outProcessed; + + + + if (inPos == inLim) + { + #ifndef _7ZIP_ST + if (tMode) + { + inData = MtDec_Read(&p->mtc, &inLim); + inPos = 0; + if (inData) + continue; + tMode = False; + inLim = 0; + } + #endif + + if (!p->readWasFinished) + { + inPos = 0; + inLim = p->inBufSize; + inData = p->inBuf; + p->readRes = ISeqInStream_Read(p->inStream, (void *)inData, &inLim); + p->readProcessed += inLim; + if (inLim == 0 || p->readRes != SZ_OK) + p->readWasFinished = True; + } + } + + outSize = p->props.outStep_ST - outPos; + + finishMode = CODER_FINISH_ANY; + if (p->outSize_Defined) + { + const UInt64 rem = p->outSize - p->outProcessed; + if (outSize >= rem) + { + outSize = (SizeT)rem; + if (p->finishMode) + finishMode = CODER_FINISH_END; + } + } + + inProcessed = inLim - inPos; + outProcessed = outSize; + + res = XzUnpacker_Code(dec, p->outBuf + outPos, &outProcessed, + inData + inPos, &inProcessed, + (inPos == inLim), // srcFinished + finishMode, &status); + + p->codeRes = res; + p->status = status; + + inPos += inProcessed; + outPos += outProcessed; + p->inProcessed += inProcessed; + p->outProcessed += outProcessed; + + finished = ((inProcessed == 0 && outProcessed == 0) || res != SZ_OK); + + if (finished || outProcessed >= outSize) + if (outPos != 0) + { + size_t written = ISeqOutStream_Write(p->outStream, p->outBuf, outPos); + p->outProcessed += written; + if (written != outPos) + { + stat->CombinedRes_Type = SZ_ERROR_WRITE; + return SZ_ERROR_WRITE; + } + outPos = 0; + } + + if (p->progress && res == SZ_OK) + { + UInt64 inDelta = p->inProcessed - inPrev; + UInt64 outDelta = p->outProcessed - outPrev; + if (inDelta >= (1 << 22) || outDelta >= (1 << 22)) + { + res = ICompressProgress_Progress(p->progress, p->inProcessed, p->outProcessed); + if (res != SZ_OK) + { + stat->CombinedRes_Type = SZ_ERROR_PROGRESS; + stat->ProgressRes = res; + return res; + } + inPrev = p->inProcessed; + outPrev = p->outProcessed; + } + } + + if (finished) + return res; + } +} + +static SRes XzStatInfo_SetStat(const CXzUnpacker *dec, + int finishMode, + UInt64 readProcessed, UInt64 inProcessed, + SRes res, ECoderStatus status, + Bool decodingTruncated, + CXzStatInfo *stat) +{ + UInt64 extraSize; + + stat->DecodingTruncated = (Byte)(decodingTruncated ? 1 : 0); + stat->InSize = inProcessed; + stat->NumStreams = dec->numStartedStreams; + stat->NumBlocks = dec->numTotalBlocks; + + stat->UnpackSize_Defined = True; + stat->NumStreams_Defined = True; + stat->NumBlocks_Defined = True; + + extraSize = XzUnpacker_GetExtraSize(dec); + + if (res == SZ_OK) + { + if (status == CODER_STATUS_NEEDS_MORE_INPUT) + { + // CODER_STATUS_NEEDS_MORE_INPUT is expected status for correct xz streams + extraSize = 0; + if (!XzUnpacker_IsStreamWasFinished(dec)) + res = SZ_ERROR_INPUT_EOF; + } + else if (!decodingTruncated || finishMode) // (status == CODER_STATUS_NOT_FINISHED) + res = SZ_ERROR_DATA; + } + else if (res == SZ_ERROR_NO_ARCHIVE) + { + /* + SZ_ERROR_NO_ARCHIVE is possible for 2 states: + XZ_STATE_STREAM_HEADER - if bad signature or bad CRC + XZ_STATE_STREAM_PADDING - if non-zero padding data + extraSize / inProcessed don't include "bad" byte + */ + if (inProcessed != extraSize) // if good streams before error + if (extraSize != 0 || readProcessed != inProcessed) + { + stat->DataAfterEnd = True; + // there is some good xz stream before. So we set SZ_OK + res = SZ_OK; + } + } + + stat->DecodeRes = res; + + stat->InSize -= extraSize; + return res; +} + + +SRes XzDecMt_Decode(CXzDecMtHandle pp, + const CXzDecMtProps *props, + const UInt64 *outDataSize, int finishMode, + ISeqOutStream *outStream, + // Byte *outBuf, size_t *outBufSize, + ISeqInStream *inStream, + // const Byte *inData, size_t inDataSize, + CXzStatInfo *stat, + int *isMT, + ICompressProgress *progress) +{ + CXzDecMt *p = (CXzDecMt *)pp; + #ifndef _7ZIP_ST + Bool tMode; + #endif + + XzStatInfo_Clear(stat); + + p->props = *props; + + p->inStream = inStream; + p->outStream = outStream; + p->progress = progress; + // p->stat = stat; + + p->outSize = 0; + p->outSize_Defined = False; + if (outDataSize) + { + p->outSize_Defined = True; + p->outSize = *outDataSize; + } + + p->finishMode = finishMode; + + // p->outSize = 457; p->outSize_Defined = True; p->finishMode = False; // for test + + p->writeRes = SZ_OK; + p->outProcessed = 0; + p->inProcessed = 0; + p->readProcessed = 0; + p->readWasFinished = False; + + p->codeRes = 0; + p->status = CODER_STATUS_NOT_SPECIFIED; + + if (!p->dec_created) + { + XzUnpacker_Construct(&p->dec, &p->alignOffsetAlloc.vt); + p->dec_created = True; + } + XzUnpacker_Init(&p->dec); + + + *isMT = False; + + /* + p->outBuf = NULL; + p->outBufSize = 0; + if (!outStream) + { + p->outBuf = outBuf; + p->outBufSize = *outBufSize; + *outBufSize = 0; + } + */ + + + #ifndef _7ZIP_ST + + p->isBlockHeaderState_Parse = False; + p->isBlockHeaderState_Write = False; + // p->numBadBlocks = 0; + p->mainErrorCode = SZ_OK; + p->mainDecoderWasCalled = False; + + tMode = False; + + if (p->props.numThreads > 1) + { + IMtDecCallback vt; + + XzDecMt_FreeSt(p); + + p->outProcessed_Parse = 0; + p->parsing_Truncated = False; + + p->numStreams = 0; + p->numTotalBlocks = 0; + p->numBlocks = 0; + p->finishedDecoderIndex = -1; + + if (!p->mtc_WasConstructed) + { + p->mtc_WasConstructed = True; + MtDec_Construct(&p->mtc); + } + + p->mtc.mtCallback = &vt; + p->mtc.mtCallbackObject = p; + + p->mtc.progress = progress; + p->mtc.inStream = inStream; + p->mtc.alloc = &p->alignOffsetAlloc.vt; + // p->mtc.inData = inData; + // p->mtc.inDataSize = inDataSize; + p->mtc.inBufSize = p->props.inBufSize_MT; + // p->mtc.inBlockMax = p->props.inBlockMax; + p->mtc.numThreadsMax = p->props.numThreads; + + *isMT = True; + + vt.Parse = XzDecMt_Callback_Parse; + vt.PreCode = XzDecMt_Callback_PreCode; + vt.Code = XzDecMt_Callback_Code; + vt.Write = XzDecMt_Callback_Write; + + { + Bool needContinue; + + SRes res = MtDec_Code(&p->mtc); + + stat->InSize = p->mtc.inProcessed; + + p->inProcessed = p->mtc.inProcessed; + p->readRes = p->mtc.readRes; + p->readWasFinished = p->mtc.readWasFinished; + p->readProcessed = p->mtc.readProcessed; + + tMode = True; + needContinue = False; + + if (res == SZ_OK) + { + if (p->mtc.mtProgress.res != SZ_OK) + { + res = p->mtc.mtProgress.res; + stat->ProgressRes = res; + stat->CombinedRes_Type = SZ_ERROR_PROGRESS; + } + else + needContinue = p->mtc.needContinue; + } + + if (!needContinue) + { + SRes codeRes; + Bool truncated = False; + ECoderStatus status; + CXzUnpacker *dec; + + stat->OutSize = p->outProcessed; + + if (p->finishedDecoderIndex >= 0) + { + CXzDecMtThread *coder = &p->coders[(unsigned)p->finishedDecoderIndex]; + codeRes = coder->codeRes; + dec = &coder->dec; + status = coder->status; + } + else if (p->mainDecoderWasCalled) + { + codeRes = p->codeRes; + dec = &p->dec; + status = p->status; + truncated = p->parsing_Truncated; + } + else + return E_FAIL; + + XzStatInfo_SetStat(dec, p->finishMode, + p->mtc.readProcessed, p->mtc.inProcessed, + codeRes, status, + truncated, + stat); + + if (res == SZ_OK) + { + if (p->writeRes != SZ_OK) + { + res = p->writeRes; + stat->CombinedRes_Type = SZ_ERROR_WRITE; + } + else if (p->mtc.readRes != SZ_OK && p->mtc.inProcessed == p->mtc.readProcessed) + { + res = p->mtc.readRes; + stat->ReadRes = res; + stat->CombinedRes_Type = SZ_ERROR_READ; + } + else if (p->mainErrorCode != SZ_OK) + { + res = p->mainErrorCode; + } + } + + stat->CombinedRes = res; + if (stat->CombinedRes_Type == SZ_OK) + stat->CombinedRes_Type = res; + return res; + } + + PRF_STR("----- decoding ST -----"); + } + } + + #endif + + + *isMT = False; + + { + SRes res = XzDecMt_Decode_ST(p + #ifndef _7ZIP_ST + , tMode + #endif + , stat + ); + + XzStatInfo_SetStat(&p->dec, + p->finishMode, + p->readProcessed, p->inProcessed, + p->codeRes, p->status, + False, // truncated + stat); + + if (res == SZ_OK) + { + /* + if (p->writeRes != SZ_OK) + { + res = p->writeRes; + stat->CombinedRes_Type = SZ_ERROR_WRITE; + } + else + */ + if (p->readRes != SZ_OK && p->inProcessed == p->readProcessed) + { + res = p->readRes; + stat->ReadRes = res; + stat->CombinedRes_Type = SZ_ERROR_READ; + } + #ifndef _7ZIP_ST + else if (p->mainErrorCode != SZ_OK) + res = p->mainErrorCode; + #endif + } + + stat->CombinedRes = res; + if (stat->CombinedRes_Type == SZ_OK) + stat->CombinedRes_Type = res; + return res; + } +} diff --git a/code/ryzom/client/src/seven_zip/XzEnc.cpp b/code/ryzom/client/src/seven_zip/XzEnc.cpp index c56383754..9a67cb55e 100644 --- a/code/ryzom/client/src/seven_zip/XzEnc.cpp +++ b/code/ryzom/client/src/seven_zip/XzEnc.cpp @@ -1,5 +1,5 @@ /* XzEnc.c -- Xz Encode -2015-09-16 : Igor Pavlov : Public domain */ +2018-04-28 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -7,7 +7,6 @@ #include #include "7zCrc.h" -#include "Alloc.h" #include "Bra.h" #include "CpuArch.h" @@ -19,22 +18,41 @@ #include "XzEnc.h" +// #define _7ZIP_ST + +#ifndef _7ZIP_ST +#include "MtCoder.h" +#else +#define MTCODER__THREADS_MAX 1 +#define MTCODER__BLOCKS_MAX 1 +#endif + +#define XZ_GET_PAD_SIZE(dataSize) ((4 - ((unsigned)(dataSize) & 3)) & 3) + +/* max pack size for LZMA2 block + check-64bytrs: */ +#define XZ_GET_MAX_BLOCK_PACK_SIZE(unpackSize) ((unpackSize) + ((unpackSize) >> 10) + 16 + 64) + +#define XZ_GET_ESTIMATED_BLOCK_TOTAL_PACK_SIZE(unpackSize) (XZ_BLOCK_HEADER_SIZE_MAX + XZ_GET_MAX_BLOCK_PACK_SIZE(unpackSize)) + + #define XzBlock_ClearFlags(p) (p)->flags = 0; #define XzBlock_SetNumFilters(p, n) (p)->flags |= ((n) - 1); #define XzBlock_SetHasPackSize(p) (p)->flags |= XZ_BF_PACK_SIZE; #define XzBlock_SetHasUnpackSize(p) (p)->flags |= XZ_BF_UNPACK_SIZE; -static SRes WriteBytes(ISeqOutStream *s, const void *buf, UInt32 size) + +static SRes WriteBytes(ISeqOutStream *s, const void *buf, size_t size) { - return (s->Write(s, buf, size) == size) ? SZ_OK : SZ_ERROR_WRITE; + return (ISeqOutStream_Write(s, buf, size) == size) ? SZ_OK : SZ_ERROR_WRITE; } -static SRes WriteBytesAndCrc(ISeqOutStream *s, const void *buf, UInt32 size, UInt32 *crc) +static SRes WriteBytesUpdateCrc(ISeqOutStream *s, const void *buf, size_t size, UInt32 *crc) { *crc = CrcUpdate(*crc, buf, size); return WriteBytes(s, buf, size); } + static SRes Xz_WriteHeader(CXzStreamFlags f, ISeqOutStream *s) { UInt32 crc; @@ -78,98 +96,154 @@ static SRes XzBlock_WriteHeader(const CXzBlock *p, ISeqOutStream *s) } -static SRes Xz_WriteFooter(CXzStream *p, ISeqOutStream *s) + + +typedef struct +{ + size_t numBlocks; + size_t size; + size_t allocated; + Byte *blocks; +} CXzEncIndex; + + +static void XzEncIndex_Construct(CXzEncIndex *p) +{ + p->numBlocks = 0; + p->size = 0; + p->allocated = 0; + p->blocks = NULL; +} + +static void XzEncIndex_Init(CXzEncIndex *p) +{ + p->numBlocks = 0; + p->size = 0; +} + +static void XzEncIndex_Free(CXzEncIndex *p, ISzAllocPtr alloc) +{ + if (p->blocks) + { + ISzAlloc_Free(alloc, p->blocks); + p->blocks = NULL; + } + p->numBlocks = 0; + p->size = 0; + p->allocated = 0; +} + + +static SRes XzEncIndex_ReAlloc(CXzEncIndex *p, size_t newSize, ISzAllocPtr alloc) +{ + Byte *blocks = (Byte *)ISzAlloc_Alloc(alloc, newSize); + if (!blocks) + return SZ_ERROR_MEM; + if (p->size != 0) + memcpy(blocks, p->blocks, p->size); + if (p->blocks) + ISzAlloc_Free(alloc, p->blocks); + p->blocks = blocks; + p->allocated = newSize; + return SZ_OK; +} + + +static SRes XzEncIndex_PreAlloc(CXzEncIndex *p, UInt64 numBlocks, UInt64 unpackSize, UInt64 totalSize, ISzAllocPtr alloc) +{ + UInt64 pos; + { + Byte buf[32]; + unsigned pos2 = Xz_WriteVarInt(buf, totalSize); + pos2 += Xz_WriteVarInt(buf + pos2, unpackSize); + pos = numBlocks * pos2; + } + + if (pos <= p->allocated - p->size) + return SZ_OK; + { + UInt64 newSize64 = p->size + pos; + size_t newSize = (size_t)newSize64; + if (newSize != newSize64) + return SZ_ERROR_MEM; + return XzEncIndex_ReAlloc(p, newSize, alloc); + } +} + + +static SRes XzEncIndex_AddIndexRecord(CXzEncIndex *p, UInt64 unpackSize, UInt64 totalSize, ISzAllocPtr alloc) +{ + Byte buf[32]; + unsigned pos = Xz_WriteVarInt(buf, totalSize); + pos += Xz_WriteVarInt(buf + pos, unpackSize); + + if (pos > p->allocated - p->size) + { + size_t newSize = p->allocated * 2 + 16 * 2; + if (newSize < p->size + pos) + return SZ_ERROR_MEM; + RINOK(XzEncIndex_ReAlloc(p, newSize, alloc)); + } + memcpy(p->blocks + p->size, buf, pos); + p->size += pos; + p->numBlocks++; + return SZ_OK; +} + + +static SRes XzEncIndex_WriteFooter(const CXzEncIndex *p, CXzStreamFlags flags, ISeqOutStream *s) { Byte buf[32]; UInt64 globalPos; - { - UInt32 crc = CRC_INIT_VAL; - unsigned pos = 1 + Xz_WriteVarInt(buf + 1, p->numBlocks); - size_t i; - - globalPos = pos; - buf[0] = 0; - RINOK(WriteBytesAndCrc(s, buf, pos, &crc)); - - for (i = 0; i < p->numBlocks; i++) - { - const CXzBlockSizes *block = &p->blocks[i]; - pos = Xz_WriteVarInt(buf, block->totalSize); - pos += Xz_WriteVarInt(buf + pos, block->unpackSize); - globalPos += pos; - RINOK(WriteBytesAndCrc(s, buf, pos, &crc)); - } - - pos = ((unsigned)globalPos & 3); - - if (pos != 0) - { - buf[0] = buf[1] = buf[2] = 0; - RINOK(WriteBytesAndCrc(s, buf, 4 - pos, &crc)); - globalPos += 4 - pos; - } - { - SetUi32(buf, CRC_GET_DIGEST(crc)); - RINOK(WriteBytes(s, buf, 4)); - globalPos += 4; - } - } - - { - UInt32 indexSize = (UInt32)((globalPos >> 2) - 1); - SetUi32(buf + 4, indexSize); - buf[8] = (Byte)(p->flags >> 8); - buf[9] = (Byte)(p->flags & 0xFF); - SetUi32(buf, CrcCalc(buf + 4, 6)); - memcpy(buf + 10, XZ_FOOTER_SIG, XZ_FOOTER_SIG_SIZE); - return WriteBytes(s, buf, 12); - } + UInt32 crc = CRC_INIT_VAL; + unsigned pos = 1 + Xz_WriteVarInt(buf + 1, p->numBlocks); + + globalPos = pos; + buf[0] = 0; + RINOK(WriteBytesUpdateCrc(s, buf, pos, &crc)); + RINOK(WriteBytesUpdateCrc(s, p->blocks, p->size, &crc)); + globalPos += p->size; + + pos = XZ_GET_PAD_SIZE(globalPos); + buf[1] = 0; + buf[2] = 0; + buf[3] = 0; + globalPos += pos; + + crc = CrcUpdate(crc, buf + 4 - pos, pos); + SetUi32(buf + 4, CRC_GET_DIGEST(crc)); + + SetUi32(buf + 8 + 4, (UInt32)(globalPos >> 2)); + buf[8 + 8] = (Byte)(flags >> 8); + buf[8 + 9] = (Byte)(flags & 0xFF); + SetUi32(buf + 8, CrcCalc(buf + 8 + 4, 6)); + buf[8 + 10] = XZ_FOOTER_SIG_0; + buf[8 + 11] = XZ_FOOTER_SIG_1; + + return WriteBytes(s, buf + 4 - pos, pos + 4 + 12); } -static SRes Xz_AddIndexRecord(CXzStream *p, UInt64 unpackSize, UInt64 totalSize, ISzAlloc *alloc) -{ - if (!p->blocks || p->numBlocksAllocated == p->numBlocks) - { - size_t num = p->numBlocks * 2 + 1; - size_t newSize = sizeof(CXzBlockSizes) * num; - CXzBlockSizes *blocks; - if (newSize / sizeof(CXzBlockSizes) != num) - return SZ_ERROR_MEM; - blocks = (CXzBlockSizes *)alloc->Alloc(alloc, newSize); - if (!blocks) - return SZ_ERROR_MEM; - if (p->numBlocks != 0) - { - memcpy(blocks, p->blocks, p->numBlocks * sizeof(CXzBlockSizes)); - alloc->Free(alloc, p->blocks); - } - p->blocks = blocks; - p->numBlocksAllocated = num; - } - { - CXzBlockSizes *block = &p->blocks[p->numBlocks++]; - block->unpackSize = unpackSize; - block->totalSize = totalSize; - } - return SZ_OK; -} - /* ---------- CSeqCheckInStream ---------- */ typedef struct { - ISeqInStream p; + ISeqInStream vt; ISeqInStream *realStream; + const Byte *data; + UInt64 limit; UInt64 processed; + int realStreamFinished; CXzCheck check; } CSeqCheckInStream; -static void SeqCheckInStream_Init(CSeqCheckInStream *p, unsigned mode) +static void SeqCheckInStream_Init(CSeqCheckInStream *p, unsigned checkMode) { + p->limit = (UInt64)(Int64)-1; p->processed = 0; - XzCheck_Init(&p->check, mode); + p->realStreamFinished = 0; + XzCheck_Init(&p->check, checkMode); } static void SeqCheckInStream_GetDigest(CSeqCheckInStream *p, Byte *digest) @@ -177,12 +251,31 @@ static void SeqCheckInStream_GetDigest(CSeqCheckInStream *p, Byte *digest) XzCheck_Final(&p->check, digest); } -static SRes SeqCheckInStream_Read(void *pp, void *data, size_t *size) +static SRes SeqCheckInStream_Read(const ISeqInStream *pp, void *data, size_t *size) { - CSeqCheckInStream *p = (CSeqCheckInStream *)pp; - SRes res = p->realStream->Read(p->realStream, data, size); - XzCheck_Update(&p->check, data, *size); - p->processed += *size; + CSeqCheckInStream *p = CONTAINER_FROM_VTBL(pp, CSeqCheckInStream, vt); + size_t size2 = *size; + SRes res = SZ_OK; + + if (p->limit != (UInt64)(Int64)-1) + { + UInt64 rem = p->limit - p->processed; + if (size2 > rem) + size2 = (size_t)rem; + } + if (size2 != 0) + { + if (p->realStream) + { + res = ISeqInStream_Read(p->realStream, data, &size2); + p->realStreamFinished = (size2 == 0) ? 1 : 0; + } + else + memcpy(data, p->data + (size_t)p->processed, size2); + XzCheck_Update(&p->check, data, size2); + p->processed += size2; + } + *size = size2; return res; } @@ -191,15 +284,24 @@ static SRes SeqCheckInStream_Read(void *pp, void *data, size_t *size) typedef struct { - ISeqOutStream p; + ISeqOutStream vt; ISeqOutStream *realStream; + Byte *outBuf; + size_t outBufLimit; UInt64 processed; } CSeqSizeOutStream; -static size_t MyWrite(void *pp, const void *data, size_t size) +static size_t SeqSizeOutStream_Write(const ISeqOutStream *pp, const void *data, size_t size) { - CSeqSizeOutStream *p = (CSeqSizeOutStream *)pp; - size = p->realStream->Write(p->realStream, data, size); + CSeqSizeOutStream *p = CONTAINER_FROM_VTBL(pp, CSeqSizeOutStream, vt); + if (p->realStream) + size = ISeqOutStream_Write(p->realStream, data, size); + else + { + if (size > p->outBufLimit - (size_t)p->processed) + return 0; + memcpy(p->outBuf + (size_t)p->processed, data, size); + } p->processed += size; return size; } @@ -220,9 +322,29 @@ typedef struct int srcWasFinished; } CSeqInFilter; -static SRes SeqInFilter_Read(void *pp, void *data, size_t *size) + +SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAllocPtr alloc); + +static SRes SeqInFilter_Init(CSeqInFilter *p, const CXzFilter *props, ISzAllocPtr alloc) { - CSeqInFilter *p = (CSeqInFilter *)pp; + if (!p->buf) + { + p->buf = (Byte *)ISzAlloc_Alloc(alloc, FILTER_BUF_SIZE); + if (!p->buf) + return SZ_ERROR_MEM; + } + p->curPos = p->endPos = 0; + p->srcWasFinished = 0; + RINOK(BraState_SetFromMethod(&p->StateCoder, props->id, 1, alloc)); + RINOK(p->StateCoder.SetProps(p->StateCoder.p, props->props, props->propsSize, alloc)); + p->StateCoder.Init(p->StateCoder.p); + return SZ_OK; +} + + +static SRes SeqInFilter_Read(const ISeqInStream *pp, void *data, size_t *size) +{ + CSeqInFilter *p = CONTAINER_FROM_VTBL(pp, CSeqInFilter, p); size_t sizeOriginal = *size; if (sizeOriginal == 0) return SZ_OK; @@ -234,19 +356,22 @@ static SRes SeqInFilter_Read(void *pp, void *data, size_t *size) { p->curPos = 0; p->endPos = FILTER_BUF_SIZE; - RINOK(p->realStream->Read(p->realStream, p->buf, &p->endPos)); + RINOK(ISeqInStream_Read(p->realStream, p->buf, &p->endPos)); if (p->endPos == 0) p->srcWasFinished = 1; } { SizeT srcLen = p->endPos - p->curPos; - int wasFinished; + ECoderStatus status; SRes res; *size = sizeOriginal; - res = p->StateCoder.Code(p->StateCoder.p, (Byte*)data, size, p->buf + p->curPos, &srcLen, - p->srcWasFinished, CODER_FINISH_ANY, &wasFinished); + res = p->StateCoder.Code2(p->StateCoder.p, + (Byte *)data, size, + p->buf + p->curPos, &srcLen, + p->srcWasFinished, CODER_FINISH_ANY, + &status); p->curPos += srcLen; - if (*size != 0 || srcLen == 0 || res != 0) + if (*size != 0 || srcLen == 0 || res != SZ_OK) return res; } } @@ -255,36 +380,24 @@ static SRes SeqInFilter_Read(void *pp, void *data, size_t *size) static void SeqInFilter_Construct(CSeqInFilter *p) { p->buf = NULL; + p->StateCoder.p = NULL; p->p.Read = SeqInFilter_Read; } -static void SeqInFilter_Free(CSeqInFilter *p) +static void SeqInFilter_Free(CSeqInFilter *p, ISzAllocPtr alloc) { + if (p->StateCoder.p) + { + p->StateCoder.Free(p->StateCoder.p, alloc); + p->StateCoder.p = NULL; + } if (p->buf) { - g_Alloc.Free(&g_Alloc, p->buf); + ISzAlloc_Free(alloc, p->buf); p->buf = NULL; } } -SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAlloc *alloc); - -static SRes SeqInFilter_Init(CSeqInFilter *p, const CXzFilter *props) -{ - if (!p->buf) - { - p->buf = (Byte*)g_Alloc.Alloc(&g_Alloc, FILTER_BUF_SIZE); - if (!p->buf) - return SZ_ERROR_MEM; - } - p->curPos = p->endPos = 0; - p->srcWasFinished = 0; - RINOK(BraState_SetFromMethod(&p->StateCoder, props->id, 1, &g_Alloc)); - RINOK(p->StateCoder.SetProps(p->StateCoder.p, props->props, props->propsSize, &g_Alloc)); - p->StateCoder.Init(p->StateCoder.p); - return SZ_OK; -} - /* ---------- CSbEncInStream ---------- */ @@ -292,17 +405,17 @@ static SRes SeqInFilter_Init(CSeqInFilter *p, const CXzFilter *props) typedef struct { - ISeqInStream p; + ISeqInStream vt; ISeqInStream *inStream; CSbEnc enc; } CSbEncInStream; -static SRes SbEncInStream_Read(void *pp, void *data, size_t *size) +static SRes SbEncInStream_Read(const ISeqInStream *pp, void *data, size_t *size) { - CSbEncInStream *p = (CSbEncInStream *)pp; + CSbEncInStream *p = CONTAINER_FROM_VTBL(pp, CSbEncInStream, vt); size_t sizeOriginal = *size; if (sizeOriginal == 0) - return S_OK; + return SZ_OK; for (;;) { @@ -322,14 +435,14 @@ static SRes SbEncInStream_Read(void *pp, void *data, size_t *size) *size = sizeOriginal; RINOK(SbEnc_Read(&p->enc, data, size)); if (*size != 0 || !p->enc.needRead) - return S_OK; + return SZ_OK; } } -void SbEncInStream_Construct(CSbEncInStream *p, ISzAlloc *alloc) +void SbEncInStream_Construct(CSbEncInStream *p, ISzAllocPtr alloc) { SbEnc_Construct(&p->enc, alloc); - p->p.Read = SbEncInStream_Read; + p->vt.Read = SbEncInStream_Read; } SRes SbEncInStream_Init(CSbEncInStream *p) @@ -345,57 +458,9 @@ void SbEncInStream_Free(CSbEncInStream *p) #endif -typedef struct -{ - CLzma2EncHandle lzma2; - #ifdef USE_SUBBLOCK - CSbEncInStream sb; - #endif - CSeqInFilter filter; - ISzAlloc *alloc; - ISzAlloc *bigAlloc; -} CLzma2WithFilters; +/* ---------- CXzProps ---------- */ -static void Lzma2WithFilters_Construct(CLzma2WithFilters *p, ISzAlloc *alloc, ISzAlloc *bigAlloc) -{ - p->alloc = alloc; - p->bigAlloc = bigAlloc; - p->lzma2 = NULL; - #ifdef USE_SUBBLOCK - SbEncInStream_Construct(&p->sb, alloc); - #endif - SeqInFilter_Construct(&p->filter); -} - -static SRes Lzma2WithFilters_Create(CLzma2WithFilters *p) -{ - p->lzma2 = Lzma2Enc_Create(p->alloc, p->bigAlloc); - if (!p->lzma2) - return SZ_ERROR_MEM; - return SZ_OK; -} - -static void Lzma2WithFilters_Free(CLzma2WithFilters *p) -{ - SeqInFilter_Free(&p->filter); - #ifdef USE_SUBBLOCK - SbEncInStream_Free(&p->sb); - #endif - if (p->lzma2) - { - Lzma2Enc_Destroy(p->lzma2); - p->lzma2 = NULL; - } -} - - -void XzProps_Init(CXzProps *p) -{ - p->lzma2Props = NULL; - p->filterProps = NULL; - p->checkId = XZ_CHECK_CRC32; -} void XzFilterProps_Init(CXzFilterProps *p) { @@ -405,122 +470,848 @@ void XzFilterProps_Init(CXzFilterProps *p) p->ipDefined = False; } - -static SRes Xz_Compress(CXzStream *xz, CLzma2WithFilters *lzmaf, - ISeqOutStream *outStream, ISeqInStream *inStream, - const CXzProps *props, ICompressProgress *progress) +void XzProps_Init(CXzProps *p) { - xz->flags = (Byte)props->checkId; + p->checkId = XZ_CHECK_CRC32; + p->blockSize = XZ_PROPS__BLOCK_SIZE__AUTO; + p->numBlockThreads_Reduced = -1; + p->numBlockThreads_Max = -1; + p->numTotalThreads = -1; + p->reduceSize = (UInt64)(Int64)-1; + p->forceWriteSizesInHeader = 0; + // p->forceWriteSizesInHeader = 1; - RINOK(Lzma2Enc_SetProps(lzmaf->lzma2, props->lzma2Props)); - RINOK(Xz_WriteHeader(xz->flags, outStream)); - - { - CSeqCheckInStream checkInStream; - CSeqSizeOutStream seqSizeOutStream; - CXzBlock block; - unsigned filterIndex = 0; - CXzFilter *filter = NULL; - const CXzFilterProps *fp = props->filterProps; - - XzBlock_ClearFlags(&block); - XzBlock_SetNumFilters(&block, 1 + (fp ? 1 : 0)); - - if (fp) - { - filter = &block.filters[filterIndex++]; - filter->id = fp->id; - filter->propsSize = 0; - - if (fp->id == XZ_ID_Delta) - { - filter->props[0] = (Byte)(fp->delta - 1); - filter->propsSize = 1; - } - else if (fp->ipDefined) - { - SetUi32(filter->props, fp->ip); - filter->propsSize = 4; - } - } - - { - CXzFilter *f = &block.filters[filterIndex++]; - f->id = XZ_ID_LZMA2; - f->propsSize = 1; - f->props[0] = Lzma2Enc_WriteProperties(lzmaf->lzma2); - } - - seqSizeOutStream.p.Write = MyWrite; - seqSizeOutStream.realStream = outStream; - seqSizeOutStream.processed = 0; - - RINOK(XzBlock_WriteHeader(&block, &seqSizeOutStream.p)); - - checkInStream.p.Read = SeqCheckInStream_Read; - checkInStream.realStream = inStream; - SeqCheckInStream_Init(&checkInStream, XzFlags_GetCheckType(xz->flags)); - - if (fp) - { - #ifdef USE_SUBBLOCK - if (fp->id == XZ_ID_Subblock) - { - lzmaf->sb.inStream = &checkInStream.p; - RINOK(SbEncInStream_Init(&lzmaf->sb)); - } - else - #endif - { - lzmaf->filter.realStream = &checkInStream.p; - RINOK(SeqInFilter_Init(&lzmaf->filter, filter)); - } - } - - { - UInt64 packPos = seqSizeOutStream.processed; - - SRes res = Lzma2Enc_Encode(lzmaf->lzma2, &seqSizeOutStream.p, - fp ? - #ifdef USE_SUBBLOCK - (fp->id == XZ_ID_Subblock) ? &lzmaf->sb.p: - #endif - &lzmaf->filter.p: - &checkInStream.p, - progress); - - RINOK(res); - block.unpackSize = checkInStream.processed; - block.packSize = seqSizeOutStream.processed - packPos; - } - - { - unsigned padSize = 0; - Byte buf[128]; - while ((((unsigned)block.packSize + padSize) & 3) != 0) - buf[padSize++] = 0; - SeqCheckInStream_GetDigest(&checkInStream, buf + padSize); - RINOK(WriteBytes(&seqSizeOutStream.p, buf, padSize + XzFlags_GetCheckSize(xz->flags))); - RINOK(Xz_AddIndexRecord(xz, block.unpackSize, seqSizeOutStream.processed - padSize, &g_Alloc)); - } - } - return Xz_WriteFooter(xz, outStream); + XzFilterProps_Init(&p->filterProps); + Lzma2EncProps_Init(&p->lzma2Props); } +static void XzEncProps_Normalize_Fixed(CXzProps *p) +{ + UInt64 fileSize; + int t1, t1n, t2, t2r, t3; + { + CLzma2EncProps tp = p->lzma2Props; + if (tp.numTotalThreads <= 0) + tp.numTotalThreads = p->numTotalThreads; + Lzma2EncProps_Normalize(&tp); + t1n = tp.numTotalThreads; + } + + t1 = p->lzma2Props.numTotalThreads; + t2 = p->numBlockThreads_Max; + t3 = p->numTotalThreads; + + if (t2 > MTCODER__THREADS_MAX) + t2 = MTCODER__THREADS_MAX; + + if (t3 <= 0) + { + if (t2 <= 0) + t2 = 1; + t3 = t1n * t2; + } + else if (t2 <= 0) + { + t2 = t3 / t1n; + if (t2 == 0) + { + t1 = 1; + t2 = t3; + } + if (t2 > MTCODER__THREADS_MAX) + t2 = MTCODER__THREADS_MAX; + } + else if (t1 <= 0) + { + t1 = t3 / t2; + if (t1 == 0) + t1 = 1; + } + else + t3 = t1n * t2; + + p->lzma2Props.numTotalThreads = t1; + + t2r = t2; + + fileSize = p->reduceSize; + + if ((p->blockSize < fileSize || fileSize == (UInt64)(Int64)-1)) + p->lzma2Props.lzmaProps.reduceSize = p->blockSize; + + Lzma2EncProps_Normalize(&p->lzma2Props); + + t1 = p->lzma2Props.numTotalThreads; + + { + if (t2 > 1 && fileSize != (UInt64)(Int64)-1) + { + UInt64 numBlocks = fileSize / p->blockSize; + if (numBlocks * p->blockSize != fileSize) + numBlocks++; + if (numBlocks < (unsigned)t2) + { + t2r = (unsigned)numBlocks; + if (t2r == 0) + t2r = 1; + t3 = t1 * t2r; + } + } + } + + p->numBlockThreads_Max = t2; + p->numBlockThreads_Reduced = t2r; + p->numTotalThreads = t3; +} + + +static void XzProps_Normalize(CXzProps *p) +{ + /* we normalize xzProps properties, but we normalize only some of CXzProps::lzma2Props properties. + Lzma2Enc_SetProps() will normalize lzma2Props later. */ + + if (p->blockSize == XZ_PROPS__BLOCK_SIZE__SOLID) + { + p->lzma2Props.lzmaProps.reduceSize = p->reduceSize; + p->numBlockThreads_Reduced = 1; + p->numBlockThreads_Max = 1; + if (p->lzma2Props.numTotalThreads <= 0) + p->lzma2Props.numTotalThreads = p->numTotalThreads; + return; + } + else + { + CLzma2EncProps *lzma2 = &p->lzma2Props; + if (p->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO) + { + // xz-auto + p->lzma2Props.lzmaProps.reduceSize = p->reduceSize; + + if (lzma2->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID) + { + // if (xz-auto && lzma2-solid) - we use solid for both + p->blockSize = XZ_PROPS__BLOCK_SIZE__SOLID; + p->numBlockThreads_Reduced = 1; + p->numBlockThreads_Max = 1; + if (p->lzma2Props.numTotalThreads <= 0) + p->lzma2Props.numTotalThreads = p->numTotalThreads; + } + else + { + // if (xz-auto && (lzma2-auto || lzma2-fixed_) + // we calculate block size for lzma2 and use that block size for xz, lzma2 uses single-chunk per block + CLzma2EncProps tp = p->lzma2Props; + if (tp.numTotalThreads <= 0) + tp.numTotalThreads = p->numTotalThreads; + + Lzma2EncProps_Normalize(&tp); + + p->blockSize = tp.blockSize; // fixed or solid + p->numBlockThreads_Reduced = tp.numBlockThreads_Reduced; + p->numBlockThreads_Max = tp.numBlockThreads_Max; + if (lzma2->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO) + lzma2->blockSize = tp.blockSize; // fixed or solid, LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID + if (lzma2->lzmaProps.reduceSize > tp.blockSize && tp.blockSize != LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID) + lzma2->lzmaProps.reduceSize = tp.blockSize; + lzma2->numBlockThreads_Reduced = 1; + lzma2->numBlockThreads_Max = 1; + return; + } + } + else + { + // xz-fixed + // we can use xz::reduceSize or xz::blockSize as base for lzmaProps::reduceSize + + p->lzma2Props.lzmaProps.reduceSize = p->reduceSize; + { + UInt64 r = p->reduceSize; + if (r > p->blockSize || r == (UInt64)(Int64)-1) + r = p->blockSize; + lzma2->lzmaProps.reduceSize = r; + } + if (lzma2->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO) + lzma2->blockSize = LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID; + else if (lzma2->blockSize > p->blockSize && lzma2->blockSize != LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID) + lzma2->blockSize = p->blockSize; + + XzEncProps_Normalize_Fixed(p); + } + } +} + + +/* ---------- CLzma2WithFilters ---------- */ + +typedef struct +{ + CLzma2EncHandle lzma2; + CSeqInFilter filter; + + #ifdef USE_SUBBLOCK + CSbEncInStream sb; + #endif +} CLzma2WithFilters; + + +static void Lzma2WithFilters_Construct(CLzma2WithFilters *p) +{ + p->lzma2 = NULL; + SeqInFilter_Construct(&p->filter); + + #ifdef USE_SUBBLOCK + SbEncInStream_Construct(&p->sb, alloc); + #endif +} + + +static SRes Lzma2WithFilters_Create(CLzma2WithFilters *p, ISzAllocPtr alloc, ISzAllocPtr bigAlloc) +{ + if (!p->lzma2) + { + p->lzma2 = Lzma2Enc_Create(alloc, bigAlloc); + if (!p->lzma2) + return SZ_ERROR_MEM; + } + return SZ_OK; +} + + +static void Lzma2WithFilters_Free(CLzma2WithFilters *p, ISzAllocPtr alloc) +{ + #ifdef USE_SUBBLOCK + SbEncInStream_Free(&p->sb); + #endif + + SeqInFilter_Free(&p->filter, alloc); + if (p->lzma2) + { + Lzma2Enc_Destroy(p->lzma2); + p->lzma2 = NULL; + } +} + + +typedef struct +{ + UInt64 unpackSize; + UInt64 totalSize; + size_t headerSize; +} CXzEncBlockInfo; + + +static SRes Xz_CompressBlock( + CLzma2WithFilters *lzmaf, + + ISeqOutStream *outStream, + Byte *outBufHeader, + Byte *outBufData, size_t outBufDataLimit, + + ISeqInStream *inStream, + // UInt64 expectedSize, + const Byte *inBuf, // used if (!inStream) + size_t inBufSize, // used if (!inStream), it's block size, props->blockSize is ignored + + const CXzProps *props, + ICompressProgress *progress, + int *inStreamFinished, /* only for inStream version */ + CXzEncBlockInfo *blockSizes, + ISzAllocPtr alloc, + ISzAllocPtr allocBig) +{ + CSeqCheckInStream checkInStream; + CSeqSizeOutStream seqSizeOutStream; + CXzBlock block; + unsigned filterIndex = 0; + CXzFilter *filter = NULL; + const CXzFilterProps *fp = &props->filterProps; + if (fp->id == 0) + fp = NULL; + + *inStreamFinished = False; + + RINOK(Lzma2WithFilters_Create(lzmaf, alloc, allocBig)); + + RINOK(Lzma2Enc_SetProps(lzmaf->lzma2, &props->lzma2Props)); + + XzBlock_ClearFlags(&block); + XzBlock_SetNumFilters(&block, 1 + (fp ? 1 : 0)); + + if (fp) + { + filter = &block.filters[filterIndex++]; + filter->id = fp->id; + filter->propsSize = 0; + + if (fp->id == XZ_ID_Delta) + { + filter->props[0] = (Byte)(fp->delta - 1); + filter->propsSize = 1; + } + else if (fp->ipDefined) + { + SetUi32(filter->props, fp->ip); + filter->propsSize = 4; + } + } + + { + CXzFilter *f = &block.filters[filterIndex++]; + f->id = XZ_ID_LZMA2; + f->propsSize = 1; + f->props[0] = Lzma2Enc_WriteProperties(lzmaf->lzma2); + } + + seqSizeOutStream.vt.Write = SeqSizeOutStream_Write; + seqSizeOutStream.realStream = outStream; + seqSizeOutStream.outBuf = outBufData; + seqSizeOutStream.outBufLimit = outBufDataLimit; + seqSizeOutStream.processed = 0; + + /* + if (expectedSize != (UInt64)(Int64)-1) + { + block.unpackSize = expectedSize; + if (props->blockSize != (UInt64)(Int64)-1) + if (expectedSize > props->blockSize) + block.unpackSize = props->blockSize; + XzBlock_SetHasUnpackSize(&block); + } + */ + + if (outStream) + { + RINOK(XzBlock_WriteHeader(&block, &seqSizeOutStream.vt)); + } + + checkInStream.vt.Read = SeqCheckInStream_Read; + SeqCheckInStream_Init(&checkInStream, props->checkId); + + checkInStream.realStream = inStream; + checkInStream.data = inBuf; + checkInStream.limit = props->blockSize; + if (!inStream) + checkInStream.limit = inBufSize; + + if (fp) + { + #ifdef USE_SUBBLOCK + if (fp->id == XZ_ID_Subblock) + { + lzmaf->sb.inStream = &checkInStream.vt; + RINOK(SbEncInStream_Init(&lzmaf->sb)); + } + else + #endif + { + lzmaf->filter.realStream = &checkInStream.vt; + RINOK(SeqInFilter_Init(&lzmaf->filter, filter, alloc)); + } + } + + { + SRes res; + Byte *outBuf = NULL; + size_t outSize = 0; + Bool useStream = (fp || inStream); + // useStream = True; + + if (!useStream) + { + XzCheck_Update(&checkInStream.check, inBuf, inBufSize); + checkInStream.processed = inBufSize; + } + + if (!outStream) + { + outBuf = seqSizeOutStream.outBuf; // + (size_t)seqSizeOutStream.processed; + outSize = seqSizeOutStream.outBufLimit; // - (size_t)seqSizeOutStream.processed; + } + + res = Lzma2Enc_Encode2(lzmaf->lzma2, + outBuf ? NULL : &seqSizeOutStream.vt, + outBuf, + outBuf ? &outSize : NULL, + + useStream ? + (fp ? + ( + #ifdef USE_SUBBLOCK + (fp->id == XZ_ID_Subblock) ? &lzmaf->sb.vt: + #endif + &lzmaf->filter.p) : + &checkInStream.vt) : NULL, + + useStream ? NULL : inBuf, + useStream ? 0 : inBufSize, + + progress); + + if (outBuf) + seqSizeOutStream.processed += outSize; + + RINOK(res); + blockSizes->unpackSize = checkInStream.processed; + } + { + Byte buf[4 + 64]; + unsigned padSize = XZ_GET_PAD_SIZE(seqSizeOutStream.processed); + UInt64 packSize = seqSizeOutStream.processed; + + buf[0] = 0; + buf[1] = 0; + buf[2] = 0; + buf[3] = 0; + + SeqCheckInStream_GetDigest(&checkInStream, buf + 4); + RINOK(WriteBytes(&seqSizeOutStream.vt, buf + (4 - padSize), padSize + XzFlags_GetCheckSize((CXzStreamFlags)props->checkId))); + + blockSizes->totalSize = seqSizeOutStream.processed - padSize; + + if (!outStream) + { + seqSizeOutStream.outBuf = outBufHeader; + seqSizeOutStream.outBufLimit = XZ_BLOCK_HEADER_SIZE_MAX; + seqSizeOutStream.processed = 0; + + block.unpackSize = blockSizes->unpackSize; + XzBlock_SetHasUnpackSize(&block); + + block.packSize = packSize; + XzBlock_SetHasPackSize(&block); + + RINOK(XzBlock_WriteHeader(&block, &seqSizeOutStream.vt)); + + blockSizes->headerSize = (size_t)seqSizeOutStream.processed; + blockSizes->totalSize += seqSizeOutStream.processed; + } + } + + if (inStream) + *inStreamFinished = checkInStream.realStreamFinished; + else + { + *inStreamFinished = False; + if (checkInStream.processed != inBufSize) + return SZ_ERROR_FAIL; + } + + return SZ_OK; +} + + + +typedef struct +{ + ICompressProgress vt; + ICompressProgress *progress; + UInt64 inOffset; + UInt64 outOffset; +} CCompressProgress_XzEncOffset; + + +static SRes CompressProgress_XzEncOffset_Progress(const ICompressProgress *pp, UInt64 inSize, UInt64 outSize) +{ + const CCompressProgress_XzEncOffset *p = CONTAINER_FROM_VTBL(pp, CCompressProgress_XzEncOffset, vt); + inSize += p->inOffset; + outSize += p->outOffset; + return ICompressProgress_Progress(p->progress, inSize, outSize); +} + + + + +typedef struct +{ + ISzAllocPtr alloc; + ISzAllocPtr allocBig; + + CXzProps xzProps; + UInt64 expectedDataSize; + + CXzEncIndex xzIndex; + + CLzma2WithFilters lzmaf_Items[MTCODER__THREADS_MAX]; + + size_t outBufSize; /* size of allocated outBufs[i] */ + Byte *outBufs[MTCODER__BLOCKS_MAX]; + + #ifndef _7ZIP_ST + unsigned checkType; + ISeqOutStream *outStream; + Bool mtCoder_WasConstructed; + CMtCoder mtCoder; + CXzEncBlockInfo EncBlocks[MTCODER__BLOCKS_MAX]; + #endif + +} CXzEnc; + + +static void XzEnc_Construct(CXzEnc *p) +{ + unsigned i; + + XzEncIndex_Construct(&p->xzIndex); + + for (i = 0; i < MTCODER__THREADS_MAX; i++) + Lzma2WithFilters_Construct(&p->lzmaf_Items[i]); + + #ifndef _7ZIP_ST + p->mtCoder_WasConstructed = False; + { + for (i = 0; i < MTCODER__BLOCKS_MAX; i++) + p->outBufs[i] = NULL; + p->outBufSize = 0; + } + #endif +} + + +static void XzEnc_FreeOutBufs(CXzEnc *p) +{ + unsigned i; + for (i = 0; i < MTCODER__BLOCKS_MAX; i++) + if (p->outBufs[i]) + { + ISzAlloc_Free(p->alloc, p->outBufs[i]); + p->outBufs[i] = NULL; + } + p->outBufSize = 0; +} + + +static void XzEnc_Free(CXzEnc *p, ISzAllocPtr alloc) +{ + unsigned i; + + XzEncIndex_Free(&p->xzIndex, alloc); + + for (i = 0; i < MTCODER__THREADS_MAX; i++) + Lzma2WithFilters_Free(&p->lzmaf_Items[i], alloc); + + #ifndef _7ZIP_ST + if (p->mtCoder_WasConstructed) + { + MtCoder_Destruct(&p->mtCoder); + p->mtCoder_WasConstructed = False; + } + XzEnc_FreeOutBufs(p); + #endif +} + + +CXzEncHandle XzEnc_Create(ISzAllocPtr alloc, ISzAllocPtr allocBig) +{ + CXzEnc *p = (CXzEnc *)ISzAlloc_Alloc(alloc, sizeof(CXzEnc)); + if (!p) + return NULL; + XzEnc_Construct(p); + XzProps_Init(&p->xzProps); + XzProps_Normalize(&p->xzProps); + p->expectedDataSize = (UInt64)(Int64)-1; + p->alloc = alloc; + p->allocBig = allocBig; + return p; +} + + +void XzEnc_Destroy(CXzEncHandle pp) +{ + CXzEnc *p = (CXzEnc *)pp; + XzEnc_Free(p, p->alloc); + ISzAlloc_Free(p->alloc, p); +} + + +SRes XzEnc_SetProps(CXzEncHandle pp, const CXzProps *props) +{ + CXzEnc *p = (CXzEnc *)pp; + p->xzProps = *props; + XzProps_Normalize(&p->xzProps); + return SZ_OK; +} + + +void XzEnc_SetDataSize(CXzEncHandle pp, UInt64 expectedDataSiize) +{ + CXzEnc *p = (CXzEnc *)pp; + p->expectedDataSize = expectedDataSiize; +} + + + + +#ifndef _7ZIP_ST + +static SRes XzEnc_MtCallback_Code(void *pp, unsigned coderIndex, unsigned outBufIndex, + const Byte *src, size_t srcSize, int finished) +{ + CXzEnc *me = (CXzEnc *)pp; + SRes res; + CMtProgressThunk progressThunk; + + Byte *dest = me->outBufs[outBufIndex]; + + UNUSED_VAR(finished) + + { + CXzEncBlockInfo *bInfo = &me->EncBlocks[outBufIndex]; + bInfo->totalSize = 0; + bInfo->unpackSize = 0; + bInfo->headerSize = 0; + } + + if (!dest) + { + dest = (Byte *)ISzAlloc_Alloc(me->alloc, me->outBufSize); + if (!dest) + return SZ_ERROR_MEM; + me->outBufs[outBufIndex] = dest; + } + + MtProgressThunk_CreateVTable(&progressThunk); + progressThunk.mtProgress = &me->mtCoder.mtProgress; + MtProgressThunk_Init(&progressThunk); + + { + CXzEncBlockInfo blockSizes; + int inStreamFinished; + + res = Xz_CompressBlock( + &me->lzmaf_Items[coderIndex], + + NULL, + dest, + dest + XZ_BLOCK_HEADER_SIZE_MAX, me->outBufSize - XZ_BLOCK_HEADER_SIZE_MAX, + + NULL, + // srcSize, // expectedSize + src, srcSize, + + &me->xzProps, + &progressThunk.vt, + &inStreamFinished, + &blockSizes, + me->alloc, + me->allocBig); + + if (res == SZ_OK) + me->EncBlocks[outBufIndex] = blockSizes; + + return res; + } +} + + +static SRes XzEnc_MtCallback_Write(void *pp, unsigned outBufIndex) +{ + CXzEnc *me = (CXzEnc *)pp; + + const CXzEncBlockInfo *bInfo = &me->EncBlocks[outBufIndex]; + const Byte *data = me->outBufs[outBufIndex]; + + RINOK(WriteBytes(me->outStream, data, bInfo->headerSize)); + + { + UInt64 totalPackFull = bInfo->totalSize + XZ_GET_PAD_SIZE(bInfo->totalSize); + RINOK(WriteBytes(me->outStream, data + XZ_BLOCK_HEADER_SIZE_MAX, (size_t)totalPackFull - bInfo->headerSize)); + } + + return XzEncIndex_AddIndexRecord(&me->xzIndex, bInfo->unpackSize, bInfo->totalSize, me->alloc); +} + +#endif + + + +SRes XzEnc_Encode(CXzEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress) +{ + CXzEnc *p = (CXzEnc *)pp; + + const CXzProps *props = &p->xzProps; + + XzEncIndex_Init(&p->xzIndex); + { + UInt64 numBlocks = 1; + UInt64 blockSize = props->blockSize; + + if (blockSize != XZ_PROPS__BLOCK_SIZE__SOLID + && props->reduceSize != (UInt64)(Int64)-1) + { + numBlocks = props->reduceSize / blockSize; + if (numBlocks * blockSize != props->reduceSize) + numBlocks++; + } + else + blockSize = (UInt64)1 << 62; + + RINOK(XzEncIndex_PreAlloc(&p->xzIndex, numBlocks, blockSize, XZ_GET_ESTIMATED_BLOCK_TOTAL_PACK_SIZE(blockSize), p->alloc)); + } + + RINOK(Xz_WriteHeader((CXzStreamFlags)props->checkId, outStream)); + + + #ifndef _7ZIP_ST + if (props->numBlockThreads_Reduced > 1) + { + IMtCoderCallback2 vt; + + if (!p->mtCoder_WasConstructed) + { + p->mtCoder_WasConstructed = True; + MtCoder_Construct(&p->mtCoder); + } + + vt.Code = XzEnc_MtCallback_Code; + vt.Write = XzEnc_MtCallback_Write; + + p->checkType = props->checkId; + p->xzProps = *props; + + p->outStream = outStream; + + p->mtCoder.allocBig = p->allocBig; + p->mtCoder.progress = progress; + p->mtCoder.inStream = inStream; + p->mtCoder.inData = NULL; + p->mtCoder.inDataSize = 0; + p->mtCoder.mtCallback = &vt; + p->mtCoder.mtCallbackObject = p; + + if ( props->blockSize == XZ_PROPS__BLOCK_SIZE__SOLID + || props->blockSize == XZ_PROPS__BLOCK_SIZE__AUTO) + return SZ_ERROR_FAIL; + + p->mtCoder.blockSize = (size_t)props->blockSize; + if (p->mtCoder.blockSize != props->blockSize) + return SZ_ERROR_PARAM; /* SZ_ERROR_MEM */ + + { + size_t destBlockSize = XZ_BLOCK_HEADER_SIZE_MAX + XZ_GET_MAX_BLOCK_PACK_SIZE(p->mtCoder.blockSize); + if (destBlockSize < p->mtCoder.blockSize) + return SZ_ERROR_PARAM; + if (p->outBufSize != destBlockSize) + XzEnc_FreeOutBufs(p); + p->outBufSize = destBlockSize; + } + + p->mtCoder.numThreadsMax = props->numBlockThreads_Max; + p->mtCoder.expectedDataSize = p->expectedDataSize; + + RINOK(MtCoder_Code(&p->mtCoder)); + } + else + #endif + { + int writeStartSizes; + CCompressProgress_XzEncOffset progress2; + Byte *bufData = NULL; + size_t bufSize = 0; + + progress2.vt.Progress = CompressProgress_XzEncOffset_Progress; + progress2.inOffset = 0; + progress2.outOffset = 0; + progress2.progress = progress; + + writeStartSizes = 0; + + if (props->blockSize != XZ_PROPS__BLOCK_SIZE__SOLID) + { + writeStartSizes = (props->forceWriteSizesInHeader > 0); + + if (writeStartSizes) + { + size_t t2; + size_t t = (size_t)props->blockSize; + if (t != props->blockSize) + return SZ_ERROR_PARAM; + t = XZ_GET_MAX_BLOCK_PACK_SIZE(t); + if (t < props->blockSize) + return SZ_ERROR_PARAM; + t2 = XZ_BLOCK_HEADER_SIZE_MAX + t; + if (!p->outBufs[0] || t2 != p->outBufSize) + { + XzEnc_FreeOutBufs(p); + p->outBufs[0] = (Byte *)ISzAlloc_Alloc(p->alloc, t2); + if (!p->outBufs[0]) + return SZ_ERROR_MEM; + p->outBufSize = t2; + } + bufData = p->outBufs[0] + XZ_BLOCK_HEADER_SIZE_MAX; + bufSize = t; + } + } + + for (;;) + { + CXzEncBlockInfo blockSizes; + int inStreamFinished; + + /* + UInt64 rem = (UInt64)(Int64)-1; + if (props->reduceSize != (UInt64)(Int64)-1 + && props->reduceSize >= progress2.inOffset) + rem = props->reduceSize - progress2.inOffset; + */ + + blockSizes.headerSize = 0; // for GCC + + RINOK(Xz_CompressBlock( + &p->lzmaf_Items[0], + + writeStartSizes ? NULL : outStream, + writeStartSizes ? p->outBufs[0] : NULL, + bufData, bufSize, + + inStream, + // rem, + NULL, 0, + + props, + progress ? &progress2.vt : NULL, + &inStreamFinished, + &blockSizes, + p->alloc, + p->allocBig)); + + { + UInt64 totalPackFull = blockSizes.totalSize + XZ_GET_PAD_SIZE(blockSizes.totalSize); + + if (writeStartSizes) + { + RINOK(WriteBytes(outStream, p->outBufs[0], blockSizes.headerSize)); + RINOK(WriteBytes(outStream, bufData, (size_t)totalPackFull - blockSizes.headerSize)); + } + + RINOK(XzEncIndex_AddIndexRecord(&p->xzIndex, blockSizes.unpackSize, blockSizes.totalSize, p->alloc)); + + progress2.inOffset += blockSizes.unpackSize; + progress2.outOffset += totalPackFull; + } + + if (inStreamFinished) + break; + } + } + + return XzEncIndex_WriteFooter(&p->xzIndex, (CXzStreamFlags)props->checkId, outStream); +} + + +#include "Alloc.h" + SRes Xz_Encode(ISeqOutStream *outStream, ISeqInStream *inStream, const CXzProps *props, ICompressProgress *progress) { SRes res; - CXzStream xz; - CLzma2WithFilters lzmaf; - Xz_Construct(&xz); - Lzma2WithFilters_Construct(&lzmaf, &g_Alloc, &g_BigAlloc); - res = Lzma2WithFilters_Create(&lzmaf); + CXzEncHandle xz = XzEnc_Create(&g_Alloc, &g_BigAlloc); + if (!xz) + return SZ_ERROR_MEM; + res = XzEnc_SetProps(xz, props); if (res == SZ_OK) - res = Xz_Compress(&xz, &lzmaf, outStream, inStream, props, progress); - Lzma2WithFilters_Free(&lzmaf); - Xz_Free(&xz, &g_Alloc); + res = XzEnc_Encode(xz, outStream, inStream, progress); + XzEnc_Destroy(xz); return res; } @@ -528,11 +1319,11 @@ SRes Xz_Encode(ISeqOutStream *outStream, ISeqInStream *inStream, SRes Xz_EncodeEmpty(ISeqOutStream *outStream) { SRes res; - CXzStream xz; - Xz_Construct(&xz); - res = Xz_WriteHeader(xz.flags, outStream); + CXzEncIndex xzIndex; + XzEncIndex_Construct(&xzIndex); + res = Xz_WriteHeader((CXzStreamFlags)0, outStream); if (res == SZ_OK) - res = Xz_WriteFooter(&xz, outStream); - Xz_Free(&xz, &g_Alloc); + res = XzEncIndex_WriteFooter(&xzIndex, (CXzStreamFlags)0, outStream); + XzEncIndex_Free(&xzIndex, NULL); // g_Alloc return res; } diff --git a/code/ryzom/client/src/seven_zip/XzEnc.h b/code/ryzom/client/src/seven_zip/XzEnc.h index c3c19eca0..0c29e7e1e 100644 --- a/code/ryzom/client/src/seven_zip/XzEnc.h +++ b/code/ryzom/client/src/seven_zip/XzEnc.h @@ -1,5 +1,5 @@ /* XzEnc.h -- Xz Encode -2011-02-07 : Igor Pavlov : Public domain */ +2017-06-27 : Igor Pavlov : Public domain */ #ifndef __XZ_ENC_H #define __XZ_ENC_H @@ -10,6 +10,11 @@ EXTERN_C_BEGIN + +#define XZ_PROPS__BLOCK_SIZE__AUTO LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO +#define XZ_PROPS__BLOCK_SIZE__SOLID LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID + + typedef struct { UInt32 id; @@ -20,15 +25,31 @@ typedef struct void XzFilterProps_Init(CXzFilterProps *p); + typedef struct { - const CLzma2EncProps *lzma2Props; - const CXzFilterProps *filterProps; + CLzma2EncProps lzma2Props; + CXzFilterProps filterProps; unsigned checkId; + UInt64 blockSize; + int numBlockThreads_Reduced; + int numBlockThreads_Max; + int numTotalThreads; + int forceWriteSizesInHeader; + UInt64 reduceSize; } CXzProps; void XzProps_Init(CXzProps *p); + +typedef void * CXzEncHandle; + +CXzEncHandle XzEnc_Create(ISzAllocPtr alloc, ISzAllocPtr allocBig); +void XzEnc_Destroy(CXzEncHandle p); +SRes XzEnc_SetProps(CXzEncHandle p, const CXzProps *props); +void XzEnc_SetDataSize(CXzEncHandle p, UInt64 expectedDataSiize); +SRes XzEnc_Encode(CXzEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress); + SRes Xz_Encode(ISeqOutStream *outStream, ISeqInStream *inStream, const CXzProps *props, ICompressProgress *progress); diff --git a/code/ryzom/client/src/seven_zip/XzIn.cpp b/code/ryzom/client/src/seven_zip/XzIn.cpp index 82d67bb50..3a1b71dcf 100644 --- a/code/ryzom/client/src/seven_zip/XzIn.cpp +++ b/code/ryzom/client/src/seven_zip/XzIn.cpp @@ -1,5 +1,5 @@ /* XzIn.c - Xz input -2015-11-08 : Igor Pavlov : Public domain */ +2018-02-02 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -9,6 +9,12 @@ #include "CpuArch.h" #include "Xz.h" +/* +#define XZ_FOOTER_SIG_CHECK(p) (memcmp((p), XZ_FOOTER_SIG, XZ_FOOTER_SIG_SIZE) == 0) +*/ +#define XZ_FOOTER_SIG_CHECK(p) ((p)[0] == XZ_FOOTER_SIG_0 && (p)[1] == XZ_FOOTER_SIG_1) + + SRes Xz_ReadHeader(CXzStreamFlags *p, ISeqInStream *inStream) { Byte sig[XZ_STREAM_HEADER_SIZE]; @@ -28,7 +34,7 @@ SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, Bool *isIndex, UInt unsigned headerSize; *headerSizeRes = 0; RINOK(SeqInStream_ReadByte(inStream, &header[0])); - headerSize = ((unsigned)header[0] << 2) + 4; + headerSize = (unsigned)header[0]; if (headerSize == 0) { *headerSizeRes = 1; @@ -37,12 +43,13 @@ SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, Bool *isIndex, UInt } *isIndex = False; + headerSize = (headerSize << 2) + 4; *headerSizeRes = headerSize; RINOK(SeqInStream_Read(inStream, header + 1, headerSize - 1)); return XzBlock_Parse(p, header); } -#define ADD_SIZE_CHECH(size, val) \ +#define ADD_SIZE_CHECK(size, val) \ { UInt64 newSize = size + (val); if (newSize < size) return XZ_SIZE_OVERFLOW; size = newSize; } UInt64 Xz_GetUnpackSize(const CXzStream *p) @@ -50,7 +57,7 @@ UInt64 Xz_GetUnpackSize(const CXzStream *p) UInt64 size = 0; size_t i; for (i = 0; i < p->numBlocks; i++) - ADD_SIZE_CHECH(size, p->blocks[i].unpackSize); + ADD_SIZE_CHECK(size, p->blocks[i].unpackSize); return size; } @@ -59,7 +66,7 @@ UInt64 Xz_GetPackSize(const CXzStream *p) UInt64 size = 0; size_t i; for (i = 0; i < p->numBlocks; i++) - ADD_SIZE_CHECH(size, (p->blocks[i].totalSize + 3) & ~(UInt64)3); + ADD_SIZE_CHECK(size, (p->blocks[i].totalSize + 3) & ~(UInt64)3); return size; } @@ -70,7 +77,7 @@ SRes XzBlock_ReadFooter(CXzBlock *p, CXzStreamFlags f, ISeqInStream *inStream) } */ -static SRes Xz_ReadIndex2(CXzStream *p, const Byte *buf, size_t size, ISzAlloc *alloc) +static SRes Xz_ReadIndex2(CXzStream *p, const Byte *buf, size_t size, ISzAllocPtr alloc) { size_t numBlocks, pos = 1; UInt32 crc; @@ -96,9 +103,8 @@ static SRes Xz_ReadIndex2(CXzStream *p, const Byte *buf, size_t size, ISzAlloc * { size_t i; p->numBlocks = numBlocks; - p->numBlocksAllocated = numBlocks; - p->blocks = (CXzBlockSizes *)alloc->Alloc(alloc, sizeof(CXzBlockSizes) * numBlocks); - if (p->blocks == 0) + p->blocks = (CXzBlockSizes *)ISzAlloc_Alloc(alloc, sizeof(CXzBlockSizes) * numBlocks); + if (!p->blocks) return SZ_ERROR_MEM; for (i = 0; i < numBlocks; i++) { @@ -115,7 +121,7 @@ static SRes Xz_ReadIndex2(CXzStream *p, const Byte *buf, size_t size, ISzAlloc * return (pos == size) ? SZ_OK : SZ_ERROR_ARCHIVE; } -static SRes Xz_ReadIndex(CXzStream *p, ILookInStream *stream, UInt64 indexSize, ISzAlloc *alloc) +static SRes Xz_ReadIndex(CXzStream *p, ILookInStream *stream, UInt64 indexSize, ISzAllocPtr alloc) { SRes res; size_t size; @@ -125,13 +131,13 @@ static SRes Xz_ReadIndex(CXzStream *p, ILookInStream *stream, UInt64 indexSize, size = (size_t)indexSize; if (size != indexSize) return SZ_ERROR_UNSUPPORTED; - buf = (Byte*)alloc->Alloc(alloc, size); - if (buf == 0) + buf = (Byte *)ISzAlloc_Alloc(alloc, size); + if (!buf) return SZ_ERROR_MEM; res = LookInStream_Read2(stream, buf, size, SZ_ERROR_UNSUPPORTED); if (res == SZ_OK) res = Xz_ReadIndex2(p, buf, size, alloc); - alloc->Free(alloc, buf); + ISzAlloc_Free(alloc, buf); return res; } @@ -142,7 +148,7 @@ static SRes LookInStream_SeekRead_ForArc(ILookInStream *stream, UInt64 offset, v /* return LookInStream_Read2(stream, buf, size, SZ_ERROR_NO_ARCHIVE); */ } -static SRes Xz_ReadBackward(CXzStream *p, ILookInStream *stream, Int64 *startOffset, ISzAlloc *alloc) +static SRes Xz_ReadBackward(CXzStream *p, ILookInStream *stream, Int64 *startOffset, ISzAllocPtr alloc) { UInt64 indexSize; Byte buf[XZ_STREAM_FOOTER_SIZE]; @@ -154,7 +160,7 @@ static SRes Xz_ReadBackward(CXzStream *p, ILookInStream *stream, Int64 *startOff pos -= XZ_STREAM_FOOTER_SIZE; RINOK(LookInStream_SeekRead_ForArc(stream, pos, buf, XZ_STREAM_FOOTER_SIZE)); - if (memcmp(buf + 10, XZ_FOOTER_SIG, XZ_FOOTER_SIG_SIZE) != 0) + if (!XZ_FOOTER_SIG_CHECK(buf + 10)) { UInt32 total = 0; pos += XZ_STREAM_FOOTER_SIZE; @@ -187,7 +193,7 @@ static SRes Xz_ReadBackward(CXzStream *p, ILookInStream *stream, Int64 *startOff return SZ_ERROR_NO_ARCHIVE; pos -= XZ_STREAM_FOOTER_SIZE; RINOK(LookInStream_SeekRead_ForArc(stream, pos, buf, XZ_STREAM_FOOTER_SIZE)); - if (memcmp(buf + 10, XZ_FOOTER_SIG, XZ_FOOTER_SIG_SIZE) != 0) + if (!XZ_FOOTER_SIG_CHECK(buf + 10)) return SZ_ERROR_NO_ARCHIVE; } @@ -224,7 +230,7 @@ static SRes Xz_ReadBackward(CXzStream *p, ILookInStream *stream, Int64 *startOff SecToRead_CreateVTable(&secToRead); secToRead.realStream = stream; - RINOK(Xz_ReadHeader(&headerFlags, &secToRead.s)); + RINOK(Xz_ReadHeader(&headerFlags, &secToRead.vt)); return (p->flags == headerFlags) ? SZ_OK : SZ_ERROR_ARCHIVE; } } @@ -238,12 +244,12 @@ void Xzs_Construct(CXzs *p) p->streams = 0; } -void Xzs_Free(CXzs *p, ISzAlloc *alloc) +void Xzs_Free(CXzs *p, ISzAllocPtr alloc) { size_t i; for (i = 0; i < p->num; i++) Xz_Free(&p->streams[i], alloc); - alloc->Free(alloc, p->streams); + ISzAlloc_Free(alloc, p->streams); p->num = p->numAllocated = 0; p->streams = 0; } @@ -262,7 +268,7 @@ UInt64 Xzs_GetUnpackSize(const CXzs *p) UInt64 size = 0; size_t i; for (i = 0; i < p->num; i++) - ADD_SIZE_CHECH(size, Xz_GetUnpackSize(&p->streams[i])); + ADD_SIZE_CHECK(size, Xz_GetUnpackSize(&p->streams[i])); return size; } @@ -272,15 +278,15 @@ UInt64 Xzs_GetPackSize(const CXzs *p) UInt64 size = 0; size_t i; for (i = 0; i < p->num; i++) - ADD_SIZE_CHECH(size, Xz_GetTotalSize(&p->streams[i])); + ADD_SIZE_CHECK(size, Xz_GetTotalSize(&p->streams[i])); return size; } */ -SRes Xzs_ReadBackward(CXzs *p, ILookInStream *stream, Int64 *startOffset, ICompressProgress *progress, ISzAlloc *alloc) +SRes Xzs_ReadBackward(CXzs *p, ILookInStream *stream, Int64 *startOffset, ICompressProgress *progress, ISzAllocPtr alloc) { Int64 endOffset = 0; - RINOK(stream->Seek(stream, &endOffset, SZ_SEEK_END)); + RINOK(ILookInStream_Seek(stream, &endOffset, SZ_SEEK_END)); *startOffset = endOffset; for (;;) { @@ -293,20 +299,20 @@ SRes Xzs_ReadBackward(CXzs *p, ILookInStream *stream, Int64 *startOffset, ICompr if (p->num == p->numAllocated) { size_t newNum = p->num + p->num / 4 + 1; - Byte *data = (Byte *)alloc->Alloc(alloc, newNum * sizeof(CXzStream)); - if (data == 0) + Byte *data = (Byte *)ISzAlloc_Alloc(alloc, newNum * sizeof(CXzStream)); + if (!data) return SZ_ERROR_MEM; p->numAllocated = newNum; if (p->num != 0) memcpy(data, p->streams, p->num * sizeof(CXzStream)); - alloc->Free(alloc, p->streams); + ISzAlloc_Free(alloc, p->streams); p->streams = (CXzStream *)data; } p->streams[p->num++] = st; if (*startOffset == 0) break; RINOK(LookInStream_SeekTo(stream, *startOffset)); - if (progress && progress->Progress(progress, endOffset - *startOffset, (UInt64)(Int64)-1) != SZ_OK) + if (progress && ICompressProgress_Progress(progress, endOffset - *startOffset, (UInt64)(Int64)-1) != SZ_OK) return SZ_ERROR_PROGRESS; } return SZ_OK; diff --git a/code/ryzom/client/src/seven_zip/seven_zip.cpp b/code/ryzom/client/src/seven_zip/seven_zip.cpp index 602feffbd..c4e2f289e 100644 --- a/code/ryzom/client/src/seven_zip/seven_zip.cpp +++ b/code/ryzom/client/src/seven_zip/seven_zip.cpp @@ -51,7 +51,7 @@ public: } // the read function called by 7zip to read data - static SRes readFunc(void *object, void *buffer, size_t *size) + static SRes readFunc(const ISeekInStream *object, void *buffer, size_t *size) { try { @@ -67,7 +67,7 @@ public: } // the seek function called by seven zip to seek inside stream - static SRes seekFunc(void *object, Int64 *pos, ESzSeek origin) + static SRes seekFunc(const ISeekInStream *object, Int64 *pos, ESzSeek origin) { try { @@ -106,10 +106,23 @@ bool unpack7Zip(const std::string &sevenZipFile, const std::string &destFileName CIFile input(sevenZipFile); CNel7ZipInStream inStr(&input); - CLookToRead lookStream; + CLookToRead2 lookStream; lookStream.realStream = &inStr; - LookToRead_CreateVTable(&lookStream, False); - LookToRead_Init(&lookStream); + LookToRead2_CreateVTable(&lookStream, False); + + { + lookStream.buf = (Byte*)ISzAlloc_Alloc(&allocImp, 1024); + + if (!lookStream.buf) + { + } + else + { + lookStream.bufSize = 1024; + lookStream.realStream = &inStr; + LookToRead2_Init(&lookStream); + } + } CrcGenerateTable(); @@ -117,7 +130,7 @@ bool unpack7Zip(const std::string &sevenZipFile, const std::string &destFileName SzArEx_Init(&db); // unpack the file using the 7zip API - SRes res = SzArEx_Open(&db, &lookStream.s, &allocImp, &allocTempImp); + SRes res = SzArEx_Open(&db, &lookStream.vt, &allocImp, &allocTempImp); if (res != SZ_OK) { @@ -139,10 +152,7 @@ bool unpack7Zip(const std::string &sevenZipFile, const std::string &destFileName size_t outSizeProcessed = 0; // get the first file - res = SzArEx_Extract(&db, &lookStream.s, 0, - &blockIndex, &outBuffer, &outBufferSize, - &offset, &outSizeProcessed, - &allocImp, &allocTempImp); + res = SzArEx_Extract(&db, &lookStream.vt, 0, &blockIndex, &outBuffer, &outBufferSize, &offset, &outSizeProcessed, &allocImp, &allocTempImp); // get the length of first file size_t nameLen = SzArEx_GetFileNameUtf16(&db, 0, NULL); From 869a5f2b53cfdcf8339e1cc8ebddae4e08933607 Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 21 Apr 2019 14:18:09 +0200 Subject: [PATCH 05/14] Changed: Use new LZMA SDK --HG-- branch : develop --- .../ryzom_installer/src/filesextractor.cpp | 77 ++++++++++++++----- 1 file changed, 57 insertions(+), 20 deletions(-) diff --git a/code/ryzom/tools/client/ryzom_installer/src/filesextractor.cpp b/code/ryzom/tools/client/ryzom_installer/src/filesextractor.cpp index be740a1f7..c7dba1284 100644 --- a/code/ryzom/tools/client/ryzom_installer/src/filesextractor.cpp +++ b/code/ryzom/tools/client/ryzom_installer/src/filesextractor.cpp @@ -86,9 +86,11 @@ #define FILE_ATTRIBUTE_UNIX_EXTENSION 0x8000 /* trick for Unix */ -#define FILE_ATTRIBUTE_WINDOWS 0x5fff +#define FILE_ATTRIBUTE_WINDOWS 0x7fff #define FILE_ATTRIBUTE_UNIX 0xffff0000 +#define kInputBufSize ((size_t)1 << 18) + bool Set7zFileAttrib(const QString &filename, uint32 fileAttributes) { if (filename.isEmpty()) return false; @@ -192,7 +194,7 @@ public: } // the read function called by 7zip to read data - static SRes readFunc(void *object, void *buffer, size_t *size) + static SRes readFunc(const ISeekInStream *object, void *buffer, size_t *size) { Q7zFile *me = (Q7zFile*)object; qint64 len = *size; @@ -210,7 +212,7 @@ public: } // the seek function called by seven zip to seek inside stream - static SRes seekFunc(void *object, Int64 *pos, ESzSeek origin) + static SRes seekFunc(const ISeekInStream *object, Int64 *pos, ESzSeek origin) { Q7zFile *me = (Q7zFile*)object; qint64 newPos = 0; @@ -328,19 +330,6 @@ bool CFilesExtractor::extract7z() UInt16 *temp = NULL; size_t tempSize = 0; - // register the files read handlers - CLookToRead lookStream; - lookStream.realStream = &inFile; - LookToRead_CreateVTable(&lookStream, False); - LookToRead_Init(&lookStream); - - // init CRC table - CrcGenerateTable(); - - // init 7z - CSzArEx db; - SzArEx_Init(&db); - // register allocators ISzAlloc allocImp; allocImp.Alloc = SzAlloc; @@ -350,11 +339,37 @@ bool CFilesExtractor::extract7z() allocTempImp.Alloc = SzAllocTemp; allocTempImp.Free = SzFreeTemp; + // register the files read handlers + CLookToRead2 lookStream; + LookToRead2_CreateVTable(&lookStream, False); + lookStream.buf = (Byte*)ISzAlloc_Alloc(&allocImp, kInputBufSize); + + if (!lookStream.buf) + { + nlwarning("Unable to allocate %u bytes", (uint32)kInputBufSize); + + if (m_listener) m_listener->operationFail(QApplication::tr("Unable to allocate %1 bytes").arg(kInputBufSize)); + return false; + } + + LookToRead2_Init(&lookStream); + + lookStream.bufSize = kInputBufSize; + lookStream.realStream = &inFile; + LookToRead2_Init(&lookStream); + + // init CRC table + CrcGenerateTable(); + + // init 7z + CSzArEx db; + SzArEx_Init(&db); + qint64 total = 0, totalUncompressed = 0; QString error; - // open 7z acrhive - SRes res = SzArEx_Open(&db, &lookStream.s, &allocImp, &allocTempImp); + // open 7z archive + SRes res = SzArEx_Open(&db, &lookStream.vt, &allocImp, &allocTempImp); if (res == SZ_OK) { @@ -423,6 +438,27 @@ bool CFilesExtractor::extract7z() modificationTime = convertWindowsFileTimeToUnixTimestamp(db.MTime.Vals[i]); } + + FILETIME mtime, ctime; + FILETIME * mtimePtr = NULL; + FILETIME * ctimePtr = NULL; + + if (SzBitWithVals_Check(&db.MTime, i)) + { + const CNtfsFileTime *t = &db.MTime.Vals[i]; + mtime.dwLowDateTime = (DWORD)(t->Low); + mtime.dwHighDateTime = (DWORD)(t->High); + mtimePtr = &mtime; + } + + if (SzBitWithVals_Check(&db.CTime, i)) + { + const CNtfsFileTime *t = &db.CTime.Vals[i]; + ctime.dwLowDateTime = (DWORD)(t->Low); + ctime.dwHighDateTime = (DWORD)(t->High); + ctimePtr = &ctime; + } + if (isDir) { QDir().mkpath(destPath); @@ -448,7 +484,7 @@ bool CFilesExtractor::extract7z() if (m_listener) m_listener->operationProgress(totalUncompressed, filename); - res = SzArEx_Extract(&db, &lookStream.s, i, &blockIndex, &outBuffer, &outBufferSize, + res = SzArEx_Extract(&db, &lookStream.vt, i, &blockIndex, &outBuffer, &outBufferSize, &offset, &outSizeProcessed, &allocImp, &allocTempImp); if (res != SZ_OK) break; @@ -518,8 +554,9 @@ bool CFilesExtractor::extract7z() IAlloc_Free(&allocImp, outBuffer); } - SzArEx_Free(&db, &allocImp); SzFree(NULL, temp); + SzArEx_Free(&db, &allocImp); + ISzAlloc_Free(&allocImp, lookStream.buf); switch(res) { From 37dacba951692932594d778341ccee587c0b02b0 Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 21 Apr 2019 14:42:17 +0200 Subject: [PATCH 06/14] Changed: Remove useless code --HG-- branch : develop --- code/nel/src/3d/font_generator.cpp | 121 ----------------------------- 1 file changed, 121 deletions(-) diff --git a/code/nel/src/3d/font_generator.cpp b/code/nel/src/3d/font_generator.cpp index b0e917b6f..0342f3d2a 100644 --- a/code/nel/src/3d/font_generator.cpp +++ b/code/nel/src/3d/font_generator.cpp @@ -461,33 +461,6 @@ CFontGenerator::CFontGenerator (const std::string &fontFileName, const std::stri SetTextAlign (hdcDib, TA_TOP | TA_LEFT | TA_NOUPDATECP); SetBkColor (hdcDib, RGB (0,0,0)); SetTextColor (hdcDib, RGB (255, 255, 255)); - - /*FT_Error error; - - if (!_LibraryInit) - { - error = FT_Init_FreeType (&_Library); - if (error) - { - nlerror ("FT_Init_FreeType() failed: %s", getFT2Error(error)); - } - _LibraryInit = true; - } - - error = FT_New_Face (_Library, fontFileName.c_str (), 0, &_Face); - if (error) - { - nlerror ("FT_New_Face() failed with file '%s': %s", fontFileName.c_str(), getFT2Error(error)); - } - - if (!fontExFileName.empty()) - { - error = FT_Attach_File (_Face, fontExFileName.c_str ()); - if (error) - { - nlwarning ("FT_Attach_File() failed with file '%s': %s", fontExFileName.c_str(), getFT2Error(error)); - } - }*/ } CFontGenerator::~CFontGenerator () @@ -499,28 +472,6 @@ CFontGenerator::~CFontGenerator () void CFontGenerator::getSizes (ucchar c, uint32 size, uint32 &width, uint32 &height) { -/* FT_Error error; - - error = FT_Set_Pixel_Sizes (_Face, size, size); - if (error) - { - nlerror ("FT_Set_Pixel_Sizes() failed: %s", getFT2Error(error)); - } - - // retrieve glyph index from character code - FT_UInt glyph_index = FT_Get_Char_Index (_Face, c); - - // load glyph image into the slot (erase previous one) - error = FT_Load_Glyph (_Face, glyph_index, FT_LOAD_DEFAULT); - if (error) - { - nlerror ("FT_Load_Glyph() failed: %s", getFT2Error(error)); - } - - // convert 24.6 fixed point into integer - width = _Face->glyph->metrics.width >> 6; - height = _Face->glyph->metrics.height >> 6; - */ } HFONT hFont = NULL; @@ -528,57 +479,6 @@ uint32 CurrentFontSize = 0; uint8 *CFontGenerator::getBitmap (ucchar c, uint32 size, bool embolden, bool oblique, uint32 &width, uint32 &height, uint32 &pitch, sint32 &left, sint32 &top, sint32 &advx, uint32 &glyphIndex) { -/* FT_Error error; - - error = FT_Set_Pixel_Sizes (_Face, size, size); - if (error) - { - nlerror ("FT_Set_Pixel_Sizes() failed: %s", getFT2Error(error)); - } - - // retrieve glyph index from character code - FT_UInt glyph_index = FT_Get_Char_Index (_Face, c); - - // load glyph image into the slot (erase previous one) - error = FT_Load_Glyph (_Face, glyph_index, FT_LOAD_DEFAULT); - if (error) - { - nlerror ("FT_Load_Glyph() failed: %s", getFT2Error(error)); - } - - if (size == 0) - { - width = 0; - height = 0; - pitch = 0; - left = 0; - top = 0; - advx = 0; - glyphIndex = glyph_index; - return NULL; - } - - // convert to an anti-aliased bitmap - error = FT_Render_Glyph (_Face->glyph, ft_render_mode_normal); - if (error) - { - nlerror ("FT_Render_Glyph() failed: %s", getFT2Error(error)); - } - - width = _Face->glyph->bitmap.width; - height = _Face->glyph->bitmap.rows; - pitch = _Face->glyph->bitmap.pitch; - - left = _Face->glyph->bitmap_left; - top = _Face->glyph->bitmap_top; - - advx = _Face->glyph->advance.x >> 6; - - glyphIndex = glyph_index; - - return (uint8 *) _Face->glyph->bitmap.buffer; -*/ - if (size == 0) { width = 0; @@ -705,12 +605,6 @@ uint8 *CFontGenerator::getBitmap (ucchar c, uint32 size, bool embolden, bool obl advx = point.x; WORD ag = 0; - /*uint t = GetGlyphIndices (hdcDib, &cc, 1, &ag, 0); - if (t == GDI_ERROR) - { - nlstop; - } -*/ glyphIndex = ag; top = -_top; @@ -742,27 +636,12 @@ uint8 *CFontGenerator::getBitmap (ucchar c, uint32 size, bool embolden, bool obl void CFontGenerator::getKerning (ucchar left, ucchar right, sint32 &kernx) { -/* if (!FT_HAS_KERNING(_Face)) - { - kernx = 0; - } - else - { - FT_Vector kerning; - FT_Error error = FT_Get_Kerning (_Face, left, right, ft_kerning_default, &kerning); - if (error) - { - nlerror ("FT_Get_Kerning() failed: %s", getFT2Error(error)); - } - kernx = kerning.x; - }*/ } uint32 CFontGenerator::getCharIndex (ucchar c) { -// return FT_Get_Char_Index (_Face, c); return 0; } From 0d0a3ca97f24b2e5eee65e634919f6616bdd4080 Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 21 Apr 2019 15:24:13 +0200 Subject: [PATCH 07/14] Changed: Updated LZMA SDK to version 19.00 --HG-- branch : develop --- code/ryzom/client/src/seven_zip/7zArcIn.cpp | 8 +- code/ryzom/client/src/seven_zip/7zDec.cpp | 12 +- code/ryzom/client/src/seven_zip/7zMain.cpp | 9 +- code/ryzom/client/src/seven_zip/7zTypes.h | 5 +- code/ryzom/client/src/seven_zip/7zVersion.h | 8 +- code/ryzom/client/src/seven_zip/Bcj2Enc.cpp | 10 +- .../ryzom/client/src/seven_zip/CMakeLists.txt | 2 +- code/ryzom/client/src/seven_zip/CpuArch.cpp | 28 +- code/ryzom/client/src/seven_zip/CpuArch.h | 9 +- code/ryzom/client/src/seven_zip/LzFind.cpp | 164 ++-- code/ryzom/client/src/seven_zip/Lzma2Dec.cpp | 14 +- code/ryzom/client/src/seven_zip/Lzma2Enc.cpp | 8 +- code/ryzom/client/src/seven_zip/Lzma86Enc.cpp | 8 +- code/ryzom/client/src/seven_zip/LzmaDec.cpp | 32 +- code/ryzom/client/src/seven_zip/LzmaEnc.cpp | 739 +++++++++++------- code/ryzom/client/src/seven_zip/Ppmd7.cpp | 6 +- code/ryzom/client/src/seven_zip/Ppmd7.h | 6 +- code/ryzom/client/src/seven_zip/Ppmd7Dec.cpp | 4 +- code/ryzom/client/src/seven_zip/Precomp.h | 1 + code/ryzom/client/src/seven_zip/Xz.h | 20 +- code/ryzom/client/src/seven_zip/XzDec.cpp | 87 +-- code/ryzom/client/src/seven_zip/XzEnc.cpp | 6 +- code/ryzom/client/src/seven_zip/XzIn.cpp | 4 +- code/ryzom/client/src/seven_zip/seven_zip.cpp | 20 +- 24 files changed, 739 insertions(+), 471 deletions(-) diff --git a/code/ryzom/client/src/seven_zip/7zArcIn.cpp b/code/ryzom/client/src/seven_zip/7zArcIn.cpp index e1b03d879..f74d0fad5 100644 --- a/code/ryzom/client/src/seven_zip/7zArcIn.cpp +++ b/code/ryzom/client/src/seven_zip/7zArcIn.cpp @@ -1,5 +1,5 @@ /* 7zArcIn.c -- 7z Input functions -2017-04-03 : Igor Pavlov : Public domain */ +2018-12-31 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -19,7 +19,7 @@ { MY_ALLOC(Byte, to, size, alloc); memcpy(to, from, size); } #define MY_ALLOC_ZE_AND_CPY(to, size, from, alloc) \ - { if ((size) == 0) p = NULL; else { MY_ALLOC_AND_CPY(to, size, from, alloc) } } + { if ((size) == 0) to = NULL; else { MY_ALLOC_AND_CPY(to, size, from, alloc) } } #define k7zMajorVersion 0 @@ -666,7 +666,7 @@ static SRes ReadUnpackInfo(CSzAr *p, MY_ALLOC(size_t, p->FoCodersOffsets, (size_t)numFolders + 1, alloc); MY_ALLOC(UInt32, p->FoStartPackStreamIndex, (size_t)numFolders + 1, alloc); MY_ALLOC(UInt32, p->FoToCoderUnpackSizes, (size_t)numFolders + 1, alloc); - MY_ALLOC(Byte, p->FoToMainUnpackSizeIndex, (size_t)numFolders, alloc); + MY_ALLOC_ZE(Byte, p->FoToMainUnpackSizeIndex, (size_t)numFolders, alloc); startBufPtr = sd.Data; @@ -1744,7 +1744,7 @@ size_t SzArEx_GetFullNameLen(const CSzArEx *p, size_t fileIndex) UInt16 *SzArEx_GetFullNameUtf16_Back(const CSzArEx *p, size_t fileIndex, UInt16 *dest) { - Bool needSlash; + BoolInt needSlash; if (!p->FileNameOffsets) { *(--dest) = 0; diff --git a/code/ryzom/client/src/seven_zip/7zDec.cpp b/code/ryzom/client/src/seven_zip/7zDec.cpp index 1ddde0bcb..7c4635211 100644 --- a/code/ryzom/client/src/seven_zip/7zDec.cpp +++ b/code/ryzom/client/src/seven_zip/7zDec.cpp @@ -1,5 +1,5 @@ /* 7zDec.c -- Decoding from 7z folder -2017-04-03 : Igor Pavlov : Public domain */ +2019-02-02 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -44,7 +44,7 @@ typedef struct const Byte *end; const Byte *begin; UInt64 processed; - Bool extra; + BoolInt extra; SRes res; const ILookInStream *inStream; } CByteInToLook; @@ -156,7 +156,7 @@ static SRes SzDecodeLzma(const Byte *props, unsigned propsSize, UInt64 inSize, I { SizeT inProcessed = (SizeT)lookahead, dicPos = state.dicPos; ELzmaStatus status; - res = LzmaDec_DecodeToDic(&state, outSize, (const Byte*)inBuf, &inProcessed, LZMA_FINISH_END, &status); + res = LzmaDec_DecodeToDic(&state, outSize, (const Byte *)inBuf, &inProcessed, LZMA_FINISH_END, &status); lookahead -= inProcessed; inSize -= inProcessed; if (res != SZ_OK) @@ -218,7 +218,7 @@ static SRes SzDecodeLzma2(const Byte *props, unsigned propsSize, UInt64 inSize, { SizeT inProcessed = (SizeT)lookahead, dicPos = state.decoder.dicPos; ELzmaStatus status; - res = Lzma2Dec_DecodeToDic(&state, outSize, (const Byte*)inBuf, &inProcessed, LZMA_FINISH_END, &status); + res = Lzma2Dec_DecodeToDic(&state, outSize, (const Byte *)inBuf, &inProcessed, LZMA_FINISH_END, &status); lookahead -= inProcessed; inSize -= inProcessed; if (res != SZ_OK) @@ -269,7 +269,7 @@ static SRes SzDecodeCopy(UInt64 inSize, ILookInStream *inStream, Byte *outBuffer return SZ_OK; } -static Bool IS_MAIN_METHOD(UInt32 m) +static BoolInt IS_MAIN_METHOD(UInt32 m) { switch (m) { @@ -286,7 +286,7 @@ static Bool IS_MAIN_METHOD(UInt32 m) return False; } -static Bool IS_SUPPORTED_CODER(const CSzCoderInfo *c) +static BoolInt IS_SUPPORTED_CODER(const CSzCoderInfo *c) { return c->NumStreams == 1 diff --git a/code/ryzom/client/src/seven_zip/7zMain.cpp b/code/ryzom/client/src/seven_zip/7zMain.cpp index 0ec9a8ada..59ecd2885 100644 --- a/code/ryzom/client/src/seven_zip/7zMain.cpp +++ b/code/ryzom/client/src/seven_zip/7zMain.cpp @@ -1,5 +1,5 @@ /* 7zMain.c - Test application for 7z Decoder -2018-04-19 : Igor Pavlov : Public domain */ +2019-02-02 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -227,7 +227,7 @@ static WRes MyCreateDir(const UInt16 *name) static WRes OutFile_OpenUtf16(CSzFile *p, const UInt16 *name) { #ifdef USE_WINDOWS_FILE - return OutFile_OpenW(p, (const WCHAR *)name); + return OutFile_OpenW(p, (LPCWSTR)name); #else CBuf buf; WRes res; @@ -239,6 +239,7 @@ static WRes OutFile_OpenUtf16(CSzFile *p, const UInt16 *name) #endif } + static SRes PrintString(const UInt16 *s) { CBuf buf; @@ -353,7 +354,7 @@ static void PrintError(char *s) PrintLF(); } -static void GetAttribString(UInt32 wa, Bool isDir, char *s) +static void GetAttribString(UInt32 wa, BoolInt isDir, char *s) { #ifdef USE_WINDOWS_FILE s[0] = (char)(((wa & FILE_ATTRIBUTE_DIRECTORY) != 0 || isDir) ? 'D' : '.'); @@ -429,7 +430,7 @@ int MY_CDECL main(int numargs, char *args[]) res = SZ_OK; { - lookStream.buf = (Byte*)ISzAlloc_Alloc(&allocImp, kInputBufSize); + lookStream.buf = (Byte *)ISzAlloc_Alloc(&allocImp, kInputBufSize); if (!lookStream.buf) res = SZ_ERROR_MEM; else diff --git a/code/ryzom/client/src/seven_zip/7zTypes.h b/code/ryzom/client/src/seven_zip/7zTypes.h index 29244b23e..65b3af63c 100644 --- a/code/ryzom/client/src/seven_zip/7zTypes.h +++ b/code/ryzom/client/src/seven_zip/7zTypes.h @@ -1,5 +1,5 @@ /* 7zTypes.h -- Basic types -2017-07-17 : Igor Pavlov : Public domain */ +2018-08-04 : Igor Pavlov : Public domain */ #ifndef __7Z_TYPES_H #define __7Z_TYPES_H @@ -103,7 +103,8 @@ typedef UInt32 SizeT; typedef size_t SizeT; #endif -typedef int Bool; +typedef int BoolInt; +/* typedef BoolInt Bool; */ #define True 1 #define False 0 diff --git a/code/ryzom/client/src/seven_zip/7zVersion.h b/code/ryzom/client/src/seven_zip/7zVersion.h index f3fb623aa..c176823a4 100644 --- a/code/ryzom/client/src/seven_zip/7zVersion.h +++ b/code/ryzom/client/src/seven_zip/7zVersion.h @@ -1,7 +1,7 @@ -#define MY_VER_MAJOR 18 -#define MY_VER_MINOR 05 +#define MY_VER_MAJOR 19 +#define MY_VER_MINOR 00 #define MY_VER_BUILD 0 -#define MY_VERSION_NUMBERS "18.05" +#define MY_VERSION_NUMBERS "19.00" #define MY_VERSION MY_VERSION_NUMBERS #ifdef MY_CPU_NAME @@ -10,7 +10,7 @@ #define MY_VERSION_CPU MY_VERSION #endif -#define MY_DATE "2018-04-30" +#define MY_DATE "2019-02-21" #undef MY_COPYRIGHT #undef MY_VERSION_COPYRIGHT_DATE #define MY_AUTHOR_NAME "Igor Pavlov" diff --git a/code/ryzom/client/src/seven_zip/Bcj2Enc.cpp b/code/ryzom/client/src/seven_zip/Bcj2Enc.cpp index 0b76a7c2c..bfbeb8e49 100644 --- a/code/ryzom/client/src/seven_zip/Bcj2Enc.cpp +++ b/code/ryzom/client/src/seven_zip/Bcj2Enc.cpp @@ -1,5 +1,5 @@ /* Bcj2Enc.c -- BCJ2 Encoder (Converter for x86 code) -2017-04-28 : Igor Pavlov : Public domain */ +2019-02-02 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -52,7 +52,7 @@ void Bcj2Enc_Init(CBcj2Enc *p) p->probs[i] = kBitModelTotal >> 1; } -static Bool MY_FAST_CALL RangeEnc_ShiftLow(CBcj2Enc *p) +static BoolInt MY_FAST_CALL RangeEnc_ShiftLow(CBcj2Enc *p) { if ((UInt32)p->low < (UInt32)0xFF000000 || (UInt32)(p->low >> 32) != 0) { @@ -165,7 +165,7 @@ static void Bcj2Enc_Encode_2(CBcj2Enc *p) { Byte context = (Byte)(num == 0 ? p->prevByte : src[-1]); - Bool needConvert; + BoolInt needConvert; p->bufs[BCJ2_STREAM_MAIN] = dest + 1; p->ip += (UInt32)num + 1; @@ -253,7 +253,7 @@ void Bcj2Enc_Encode(CBcj2Enc *p) { const Byte *src = p->src; const Byte *srcLim = p->srcLim; - unsigned finishMode = p->finishMode; + EBcj2Enc_FinishMode finishMode = p->finishMode; p->src = p->temp; p->srcLim = p->temp + p->tempPos; @@ -274,7 +274,7 @@ void Bcj2Enc_Encode(CBcj2Enc *p) p->src = src; p->srcLim = srcLim; - p->finishMode = (EBcj2Enc_FinishMode)finishMode; + p->finishMode = finishMode; if (p->state != BCJ2_ENC_STATE_ORIG || src == srcLim) return; diff --git a/code/ryzom/client/src/seven_zip/CMakeLists.txt b/code/ryzom/client/src/seven_zip/CMakeLists.txt index 625544edb..d62750e17 100644 --- a/code/ryzom/client/src/seven_zip/CMakeLists.txt +++ b/code/ryzom/client/src/seven_zip/CMakeLists.txt @@ -5,7 +5,7 @@ FILE(GLOB LIB_SRC *.cpp *.h) LIST(REMOVE_ITEM LIB_SRC ${CMAKE_CURRENT_SOURCE_DIR}/7zMain.cpp) NL_TARGET_LIB(ryzom_sevenzip ${LIB_SRC}) -TARGET_LINK_LIBRARIES(ryzom_sevenzip nelmisc) +TARGET_LINK_LIBRARIES(ryzom_sevenzip ${NELMISC_LIBRARIES}) NL_DEFAULT_PROPS(ryzom_sevenzip "Ryzom, Library: Seven Zip") NL_ADD_RUNTIME_FLAGS(ryzom_sevenzip) NL_ADD_LIB_SUFFIX(ryzom_sevenzip) diff --git a/code/ryzom/client/src/seven_zip/CpuArch.cpp b/code/ryzom/client/src/seven_zip/CpuArch.cpp index 554ffa4fc..02e482e08 100644 --- a/code/ryzom/client/src/seven_zip/CpuArch.cpp +++ b/code/ryzom/client/src/seven_zip/CpuArch.cpp @@ -1,5 +1,5 @@ /* CpuArch.c -- CPU specific code -2016-02-25: Igor Pavlov : Public domain */ +2018-02-18: Igor Pavlov : Public domain */ #include "Precomp.h" @@ -115,7 +115,7 @@ void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d) #endif } -Bool x86cpuid_CheckAndRead(Cx86cpuid *p) +BoolInt x86cpuid_CheckAndRead(Cx86cpuid *p) { CHECK_CPUID_IS_SUPPORTED MyCPUID(0, &p->maxFunc, &p->vendor[0], &p->vendor[2], &p->vendor[1]); @@ -144,7 +144,7 @@ int x86cpuid_GetFirm(const Cx86cpuid *p) return -1; } -Bool CPU_Is_InOrder() +BoolInt CPU_Is_InOrder() { Cx86cpuid p; int firm; @@ -175,7 +175,7 @@ Bool CPU_Is_InOrder() #if !defined(MY_CPU_AMD64) && defined(_WIN32) #include -static Bool CPU_Sys_Is_SSE_Supported() +static BoolInt CPU_Sys_Is_SSE_Supported() { OSVERSIONINFO vi; vi.dwOSVersionInfoSize = sizeof(vi); @@ -188,7 +188,7 @@ static Bool CPU_Sys_Is_SSE_Supported() #define CHECK_SYS_SSE_SUPPORT #endif -Bool CPU_Is_Aes_Supported() +BoolInt CPU_Is_Aes_Supported() { Cx86cpuid p; CHECK_SYS_SSE_SUPPORT @@ -197,4 +197,22 @@ Bool CPU_Is_Aes_Supported() return (p.c >> 25) & 1; } +BoolInt CPU_IsSupported_PageGB() +{ + Cx86cpuid cpuid; + if (!x86cpuid_CheckAndRead(&cpuid)) + return False; + { + UInt32 d[4] = { 0 }; + MyCPUID(0x80000000, &d[0], &d[1], &d[2], &d[3]); + if (d[0] < 0x80000001) + return False; + } + { + UInt32 d[4] = { 0 }; + MyCPUID(0x80000001, &d[0], &d[1], &d[2], &d[3]); + return (d[3] >> 26) & 1; + } +} + #endif diff --git a/code/ryzom/client/src/seven_zip/CpuArch.h b/code/ryzom/client/src/seven_zip/CpuArch.h index 056116dde..bd4293880 100644 --- a/code/ryzom/client/src/seven_zip/CpuArch.h +++ b/code/ryzom/client/src/seven_zip/CpuArch.h @@ -1,5 +1,5 @@ /* CpuArch.h -- CPU specific code -2017-09-04 : Igor Pavlov : Public domain */ +2018-02-18 : Igor Pavlov : Public domain */ #ifndef __CPU_ARCH_H #define __CPU_ARCH_H @@ -318,15 +318,16 @@ enum void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d); -Bool x86cpuid_CheckAndRead(Cx86cpuid *p); +BoolInt x86cpuid_CheckAndRead(Cx86cpuid *p); int x86cpuid_GetFirm(const Cx86cpuid *p); #define x86cpuid_GetFamily(ver) (((ver >> 16) & 0xFF0) | ((ver >> 8) & 0xF)) #define x86cpuid_GetModel(ver) (((ver >> 12) & 0xF0) | ((ver >> 4) & 0xF)) #define x86cpuid_GetStepping(ver) (ver & 0xF) -Bool CPU_Is_InOrder(); -Bool CPU_Is_Aes_Supported(); +BoolInt CPU_Is_InOrder(); +BoolInt CPU_Is_Aes_Supported(); +BoolInt CPU_IsSupported_PageGB(); #endif diff --git a/code/ryzom/client/src/seven_zip/LzFind.cpp b/code/ryzom/client/src/seven_zip/LzFind.cpp index 18ef49dca..df55e86c1 100644 --- a/code/ryzom/client/src/seven_zip/LzFind.cpp +++ b/code/ryzom/client/src/seven_zip/LzFind.cpp @@ -1,5 +1,5 @@ /* LzFind.c -- Match finder for LZ algorithms -2017-06-10 : Igor Pavlov : Public domain */ +2018-07-08 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -138,7 +138,7 @@ static void MatchFinder_SetDefaultSettings(CMatchFinder *p) void MatchFinder_Construct(CMatchFinder *p) { - UInt32 i; + unsigned i; p->bufferBase = NULL; p->directInput = 0; p->hash = NULL; @@ -147,7 +147,7 @@ void MatchFinder_Construct(CMatchFinder *p) for (i = 0; i < 256; i++) { - UInt32 r = i; + UInt32 r = (UInt32)i; unsigned j; for (j = 0; j < 8; j++) r = (r >> 1) ^ (kCrcPoly & ((UInt32)0 - (r & 1))); @@ -368,6 +368,8 @@ static void MatchFinder_Normalize(CMatchFinder *p) MatchFinder_ReduceOffsets(p, subValue); } + +MY_NO_INLINE static void MatchFinder_CheckLimits(CMatchFinder *p) { if (p->pos == kMaxValForNormalize) @@ -379,10 +381,16 @@ static void MatchFinder_CheckLimits(CMatchFinder *p) MatchFinder_SetLimits(p); } -static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, + +/* + (lenLimit > maxLen) +*/ +MY_FORCE_INLINE +static UInt32 * Hc_GetMatchesSpec(unsigned lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, - UInt32 *distances, UInt32 maxLen) + UInt32 *distances, unsigned maxLen) { + /* son[_cyclicBufferPos] = curMatch; for (;;) { @@ -400,7 +408,8 @@ static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, break; if (maxLen < len) { - *distances++ = maxLen = len; + maxLen = len; + *distances++ = len; *distances++ = delta - 1; if (len == lenLimit) return distances; @@ -408,15 +417,58 @@ static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, } } } + */ + + const Byte *lim = cur + lenLimit; + son[_cyclicBufferPos] = curMatch; + do + { + UInt32 delta = pos - curMatch; + if (delta >= _cyclicBufferSize) + break; + { + ptrdiff_t diff; + curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)]; + diff = (ptrdiff_t)0 - delta; + if (cur[maxLen] == cur[maxLen + diff]) + { + const Byte *c = cur; + while (*c == c[diff]) + { + if (++c == lim) + { + distances[0] = (UInt32)(lim - cur); + distances[1] = delta - 1; + return distances + 2; + } + } + { + unsigned len = (unsigned)(c - cur); + if (maxLen < len) + { + maxLen = len; + distances[0] = (UInt32)len; + distances[1] = delta - 1; + distances += 2; + } + } + } + } + } + while (--cutValue); + + return distances; } + +MY_FORCE_INLINE UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, UInt32 *distances, UInt32 maxLen) { - CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; - CLzRef *ptr1 = son + (_cyclicBufferPos << 1); - UInt32 len0 = 0, len1 = 0; + CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1); + unsigned len0 = 0, len1 = 0; for (;;) { UInt32 delta = pos - curMatch; @@ -426,9 +478,10 @@ UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byt return distances; } { - CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); + CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); const Byte *pb = cur - delta; - UInt32 len = (len0 < len1 ? len0 : len1); + unsigned len = (len0 < len1 ? len0 : len1); + UInt32 pair0 = pair[0]; if (pb[len] == cur[len]) { if (++len != lenLimit && pb[len] == cur[len]) @@ -437,11 +490,12 @@ UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byt break; if (maxLen < len) { - *distances++ = maxLen = len; + maxLen = (UInt32)len; + *distances++ = (UInt32)len; *distances++ = delta - 1; if (len == lenLimit) { - *ptr1 = pair[0]; + *ptr1 = pair0; *ptr0 = pair[1]; return distances; } @@ -468,9 +522,9 @@ UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byt static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue) { - CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; - CLzRef *ptr1 = son + (_cyclicBufferPos << 1); - UInt32 len0 = 0, len1 = 0; + CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1); + unsigned len0 = 0, len1 = 0; for (;;) { UInt32 delta = pos - curMatch; @@ -480,9 +534,9 @@ static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const return; } { - CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); + CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); const Byte *pb = cur - delta; - UInt32 len = (len0 < len1 ? len0 : len1); + unsigned len = (len0 < len1 ? len0 : len1); if (pb[len] == cur[len]) { while (++len != lenLimit) @@ -520,13 +574,13 @@ static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const p->buffer++; \ if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p); -#define MOVE_POS_RET MOVE_POS return offset; +#define MOVE_POS_RET MOVE_POS return (UInt32)offset; static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; } #define GET_MATCHES_HEADER2(minLen, ret_op) \ - UInt32 lenLimit; UInt32 hv; const Byte *cur; UInt32 curMatch; \ - lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \ + unsigned lenLimit; UInt32 hv; const Byte *cur; UInt32 curMatch; \ + lenLimit = (unsigned)p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \ cur = p->buffer; #define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0) @@ -535,22 +589,22 @@ static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; } #define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue #define GET_MATCHES_FOOTER(offset, maxLen) \ - offset = (UInt32)(GetMatchesSpec1(lenLimit, curMatch, MF_PARAMS(p), \ - distances + offset, maxLen) - distances); MOVE_POS_RET; + offset = (unsigned)(GetMatchesSpec1((UInt32)lenLimit, curMatch, MF_PARAMS(p), \ + distances + offset, (UInt32)maxLen) - distances); MOVE_POS_RET; #define SKIP_FOOTER \ - SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS; + SkipMatchesSpec((UInt32)lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS; #define UPDATE_maxLen { \ ptrdiff_t diff = (ptrdiff_t)0 - d2; \ const Byte *c = cur + maxLen; \ const Byte *lim = cur + lenLimit; \ for (; c != lim; c++) if (*(c + diff) != *c) break; \ - maxLen = (UInt32)(c - cur); } + maxLen = (unsigned)(c - cur); } static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) { - UInt32 offset; + unsigned offset; GET_MATCHES_HEADER(2) HASH2_CALC; curMatch = p->hash[hv]; @@ -561,7 +615,7 @@ static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) { - UInt32 offset; + unsigned offset; GET_MATCHES_HEADER(3) HASH_ZIP_CALC; curMatch = p->hash[hv]; @@ -572,7 +626,8 @@ UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) { - UInt32 h2, d2, maxLen, offset, pos; + UInt32 h2, d2, pos; + unsigned maxLen, offset; UInt32 *hash; GET_MATCHES_HEADER(3) @@ -594,12 +649,12 @@ static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) { UPDATE_maxLen - distances[0] = maxLen; + distances[0] = (UInt32)maxLen; distances[1] = d2 - 1; offset = 2; if (maxLen == lenLimit) { - SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); + SkipMatchesSpec((UInt32)lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS_RET; } } @@ -609,7 +664,8 @@ static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) { - UInt32 h2, h3, d2, d3, maxLen, offset, pos; + UInt32 h2, h3, d2, d3, pos; + unsigned maxLen, offset; UInt32 *hash; GET_MATCHES_HEADER(4) @@ -618,12 +674,12 @@ static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) hash = p->hash; pos = p->pos; - d2 = pos - hash[ h2]; + d2 = pos - hash [h2]; d3 = pos - (hash + kFix3HashSize)[h3]; curMatch = (hash + kFix4HashSize)[hv]; - hash[ h2] = pos; + hash [h2] = pos; (hash + kFix3HashSize)[h3] = pos; (hash + kFix4HashSize)[hv] = pos; @@ -632,7 +688,8 @@ static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) { - distances[0] = maxLen = 2; + maxLen = 2; + distances[0] = 2; distances[1] = d2 - 1; offset = 2; } @@ -648,10 +705,10 @@ static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) if (offset != 0) { UPDATE_maxLen - distances[(size_t)offset - 2] = maxLen; + distances[(size_t)offset - 2] = (UInt32)maxLen; if (maxLen == lenLimit) { - SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); + SkipMatchesSpec((UInt32)lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS_RET; } } @@ -674,13 +731,13 @@ static UInt32 Bt5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) hash = p->hash; pos = p->pos; - d2 = pos - hash[ h2]; + d2 = pos - hash [h2]; d3 = pos - (hash + kFix3HashSize)[h3]; d4 = pos - (hash + kFix4HashSize)[h4]; curMatch = (hash + kFix5HashSize)[hv]; - hash[ h2] = pos; + hash [h2] = pos; (hash + kFix3HashSize)[h3] = pos; (hash + kFix4HashSize)[h4] = pos; (hash + kFix5HashSize)[hv] = pos; @@ -741,7 +798,8 @@ static UInt32 Bt5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) { - UInt32 h2, h3, d2, d3, maxLen, offset, pos; + UInt32 h2, h3, d2, d3, pos; + unsigned maxLen, offset; UInt32 *hash; GET_MATCHES_HEADER(4) @@ -750,12 +808,11 @@ static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) hash = p->hash; pos = p->pos; - d2 = pos - hash[ h2]; + d2 = pos - hash [h2]; d3 = pos - (hash + kFix3HashSize)[h3]; - curMatch = (hash + kFix4HashSize)[hv]; - hash[ h2] = pos; + hash [h2] = pos; (hash + kFix3HashSize)[h3] = pos; (hash + kFix4HashSize)[hv] = pos; @@ -764,7 +821,8 @@ static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) { - distances[0] = maxLen = 2; + maxLen = 2; + distances[0] = 2; distances[1] = d2 - 1; offset = 2; } @@ -780,7 +838,7 @@ static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) if (offset != 0) { UPDATE_maxLen - distances[(size_t)offset - 2] = maxLen; + distances[(size_t)offset - 2] = (UInt32)maxLen; if (maxLen == lenLimit) { p->son[p->cyclicBufferPos] = curMatch; @@ -791,7 +849,7 @@ static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) if (maxLen < 3) maxLen = 3; - offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), + offset = (unsigned)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), distances + offset, maxLen) - (distances)); MOVE_POS_RET } @@ -808,13 +866,13 @@ static UInt32 Hc5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) hash = p->hash; pos = p->pos; - d2 = pos - hash[ h2]; + d2 = pos - hash [h2]; d3 = pos - (hash + kFix3HashSize)[h3]; d4 = pos - (hash + kFix4HashSize)[h4]; curMatch = (hash + kFix5HashSize)[hv]; - hash[ h2] = pos; + hash [h2] = pos; (hash + kFix3HashSize)[h3] = pos; (hash + kFix4HashSize)[h4] = pos; (hash + kFix5HashSize)[hv] = pos; @@ -877,12 +935,12 @@ static UInt32 Hc5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) { - UInt32 offset; + unsigned offset; GET_MATCHES_HEADER(3) HASH_ZIP_CALC; curMatch = p->hash[hv]; p->hash[hv] = p->pos; - offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), + offset = (unsigned)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), distances, 2) - (distances)); MOVE_POS_RET } @@ -940,7 +998,7 @@ static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) HASH4_CALC; hash = p->hash; curMatch = (hash + kFix4HashSize)[hv]; - hash[ h2] = + hash [h2] = (hash + kFix3HashSize)[h3] = (hash + kFix4HashSize)[hv] = p->pos; SKIP_FOOTER @@ -959,7 +1017,7 @@ static void Bt5_MatchFinder_Skip(CMatchFinder *p, UInt32 num) HASH5_CALC; hash = p->hash; curMatch = (hash + kFix5HashSize)[hv]; - hash[ h2] = + hash [h2] = (hash + kFix3HashSize)[h3] = (hash + kFix4HashSize)[h4] = (hash + kFix5HashSize)[hv] = p->pos; @@ -979,7 +1037,7 @@ static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) HASH4_CALC; hash = p->hash; curMatch = (hash + kFix4HashSize)[hv]; - hash[ h2] = + hash [h2] = (hash + kFix3HashSize)[h3] = (hash + kFix4HashSize)[hv] = p->pos; p->son[p->cyclicBufferPos] = curMatch; @@ -999,7 +1057,7 @@ static void Hc5_MatchFinder_Skip(CMatchFinder *p, UInt32 num) HASH5_CALC; hash = p->hash; curMatch = hash + kFix5HashSize)[hv]; - hash[ h2] = + hash [h2] = (hash + kFix3HashSize)[h3] = (hash + kFix4HashSize)[h4] = (hash + kFix5HashSize)[hv] = p->pos; diff --git a/code/ryzom/client/src/seven_zip/Lzma2Dec.cpp b/code/ryzom/client/src/seven_zip/Lzma2Dec.cpp index 7904bb68d..4e138a4ae 100644 --- a/code/ryzom/client/src/seven_zip/Lzma2Dec.cpp +++ b/code/ryzom/client/src/seven_zip/Lzma2Dec.cpp @@ -1,5 +1,5 @@ /* Lzma2Dec.c -- LZMA2 Decoder -2018-02-19 : Igor Pavlov : Public domain */ +2019-02-02 : Igor Pavlov : Public domain */ /* #define SHOW_DEBUG_INFO */ @@ -169,7 +169,7 @@ static void LzmaDec_UpdateWithUncompressed(CLzmaDec *p, const Byte *src, SizeT s p->processedPos += (UInt32)size; } -void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState); +void LzmaDec_InitDicAndState(CLzmaDec *p, BoolInt initDic, BoolInt initState); SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, @@ -232,7 +232,7 @@ SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, if (p->state == LZMA2_STATE_DATA) { - Bool initDic = (p->control == LZMA2_CONTROL_COPY_RESET_DIC); + BoolInt initDic = (p->control == LZMA2_CONTROL_COPY_RESET_DIC); LzmaDec_InitDicAndState(&p->decoder, initDic, False); } @@ -254,8 +254,8 @@ SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, if (p->state == LZMA2_STATE_DATA) { - Bool initDic = (p->control >= 0xE0); - Bool initState = (p->control >= 0xA0); + BoolInt initDic = (p->control >= 0xE0); + BoolInt initState = (p->control >= 0xA0); LzmaDec_InitDicAndState(&p->decoder, initDic, initState); p->state = LZMA2_STATE_DATA_CONT; } @@ -331,7 +331,7 @@ ELzma2ParseStatus Lzma2Dec_Parse(CLzma2Dec *p, { // if (p->decoder.dicPos != 0) if (p->control == LZMA2_CONTROL_COPY_RESET_DIC || p->control >= 0xE0) - return (ELzma2ParseStatus)LZMA2_PARSE_STATUS_NEW_BLOCK; + return LZMA2_PARSE_STATUS_NEW_BLOCK; // if (outSize == 0) return LZMA_STATUS_NOT_FINISHED; } @@ -348,7 +348,7 @@ ELzma2ParseStatus Lzma2Dec_Parse(CLzma2Dec *p, } if (p->state == LZMA2_STATE_DATA) - return (ELzma2ParseStatus)LZMA2_PARSE_STATUS_NEW_CHUNK; + return LZMA2_PARSE_STATUS_NEW_CHUNK; continue; } diff --git a/code/ryzom/client/src/seven_zip/Lzma2Enc.cpp b/code/ryzom/client/src/seven_zip/Lzma2Enc.cpp index 4b06d9111..9af0622b0 100644 --- a/code/ryzom/client/src/seven_zip/Lzma2Enc.cpp +++ b/code/ryzom/client/src/seven_zip/Lzma2Enc.cpp @@ -1,5 +1,5 @@ /* Lzma2Enc.c -- LZMA2 Encoder -2018-04-27 : Igor Pavlov : Public domain */ +2018-07-04 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -115,7 +115,7 @@ SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, ISeqInStream *inStream, UInt32 k ISzAllocPtr alloc, ISzAllocPtr allocBig); SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig); -SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit, +SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, BoolInt reInit, Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize); const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp); void LzmaEnc_Finish(CLzmaEncHandle pp); @@ -133,7 +133,7 @@ static SRes Lzma2EncInt_EncodeSubblock(CLzma2EncInt *p, Byte *outBuf, size_t packSize = packSizeLimit; UInt32 unpackSize = LZMA2_UNPACK_SIZE_MAX; unsigned lzHeaderSize = 5 + (p->needInitProp ? 1 : 0); - Bool useCopyBlock; + BoolInt useCopyBlock; SRes res; *packSizeRes = 0; @@ -373,7 +373,7 @@ typedef struct size_t outBufSize; /* size of allocated outBufs[i] */ size_t outBufsDataSizes[MTCODER__BLOCKS_MAX]; - Bool mtCoder_WasConstructed; + BoolInt mtCoder_WasConstructed; CMtCoder mtCoder; Byte *outBufs[MTCODER__BLOCKS_MAX]; diff --git a/code/ryzom/client/src/seven_zip/Lzma86Enc.cpp b/code/ryzom/client/src/seven_zip/Lzma86Enc.cpp index a15b58d6c..2617bab8e 100644 --- a/code/ryzom/client/src/seven_zip/Lzma86Enc.cpp +++ b/code/ryzom/client/src/seven_zip/Lzma86Enc.cpp @@ -1,5 +1,5 @@ /* Lzma86Enc.c -- LZMA + x86 (BCJ) Filter Encoder -2016-05-16 : Igor Pavlov : Public domain */ +2018-07-04 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -18,7 +18,7 @@ int Lzma86_Encode(Byte *dest, size_t *destLen, const Byte *src, size_t srcLen, { size_t outSize2 = *destLen; Byte *filteredStream; - Bool useFilter; + BoolInt useFilter; int mainResult = SZ_ERROR_OUTPUT_EOF; CLzmaEncProps props; LzmaEncProps_Init(&props); @@ -56,7 +56,7 @@ int Lzma86_Encode(Byte *dest, size_t *destLen, const Byte *src, size_t srcLen, { size_t minSize = 0; - Bool bestIsFiltered = False; + BoolInt bestIsFiltered = False; /* passes for SZ_FILTER_AUTO: 0 - BCJ + LZMA @@ -71,7 +71,7 @@ int Lzma86_Encode(Byte *dest, size_t *destLen, const Byte *src, size_t srcLen, size_t outSizeProcessed = outSize2 - LZMA86_HEADER_SIZE; size_t outPropsSize = 5; SRes curRes; - Bool curModeIsFiltered = (numPasses > 1 && i == numPasses - 1); + BoolInt curModeIsFiltered = (numPasses > 1 && i == numPasses - 1); if (curModeIsFiltered && !bestIsFiltered) break; if (useFilter && i == 0) diff --git a/code/ryzom/client/src/seven_zip/LzmaDec.cpp b/code/ryzom/client/src/seven_zip/LzmaDec.cpp index cccb93267..ba3e1dd50 100644 --- a/code/ryzom/client/src/seven_zip/LzmaDec.cpp +++ b/code/ryzom/client/src/seven_zip/LzmaDec.cpp @@ -1,13 +1,13 @@ /* LzmaDec.c -- LZMA Decoder -2018-02-28 : Igor Pavlov : Public domain */ +2018-07-04 : Igor Pavlov : Public domain */ #include "Precomp.h" +#include + /* #include "CpuArch.h" */ #include "LzmaDec.h" -#include - #define kNumTopBits 24 #define kTopValue ((UInt32)1 << kNumTopBits) @@ -19,7 +19,7 @@ #define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); } -#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) +#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound) #define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); #define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); #define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \ @@ -66,7 +66,7 @@ #define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); } -#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) +#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound) #define UPDATE_0_CHECK range = bound; #define UPDATE_1_CHECK range -= bound; code -= bound; #define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \ @@ -539,7 +539,7 @@ int MY_FAST_CALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit curLen = ((rem < len) ? (unsigned)rem : len); pos = dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0); - processedPos += curLen; + processedPos += (UInt32)curLen; len -= curLen; if (curLen <= dicBufSize - pos) @@ -547,7 +547,7 @@ int MY_FAST_CALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit Byte *dest = dic + dicPos; ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos; const Byte *lim = dest + curLen; - dicPos += curLen; + dicPos += (SizeT)curLen; do *(dest) = (Byte)*(dest + src); while (++dest != lim); @@ -572,14 +572,14 @@ int MY_FAST_CALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit p->buf = buf; p->range = range; p->code = code; - p->remainLen = len; + p->remainLen = (UInt32)len; p->dicPos = dicPos; p->processedPos = processedPos; p->reps[0] = rep0; p->reps[1] = rep1; p->reps[2] = rep2; p->reps[3] = rep3; - p->state = state; + p->state = (UInt32)state; return SZ_OK; } @@ -601,8 +601,8 @@ static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len) p->checkDicSize = p->prop.dicSize; - p->processedPos += len; - p->remainLen -= len; + p->processedPos += (UInt32)len; + p->remainLen -= (UInt32)len; while (len != 0) { len--; @@ -850,7 +850,7 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inS } -void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState) +void LzmaDec_InitDicAndState(CLzmaDec *p, BoolInt initDic, BoolInt initState) { p->remainLen = kMatchSpecLenStart + 1; p->tempBufSize = 0; @@ -979,10 +979,10 @@ SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *sr p->tempBufSize = rem; if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) { - int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem); + int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, (SizeT)rem); if (dummyRes == DUMMY_ERROR) { - (*srcLen) += lookAhead; + (*srcLen) += (SizeT)lookAhead; *status = LZMA_STATUS_NEEDS_MORE_INPUT; return SZ_OK; } @@ -1005,9 +1005,9 @@ SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *sr return SZ_ERROR_FAIL; /* some internal error */ lookAhead -= rem; } - (*srcLen) += lookAhead; + (*srcLen) += (SizeT)lookAhead; src += lookAhead; - inSize -= lookAhead; + inSize -= (SizeT)lookAhead; p->tempBufSize = 0; } } diff --git a/code/ryzom/client/src/seven_zip/LzmaEnc.cpp b/code/ryzom/client/src/seven_zip/LzmaEnc.cpp index 69de5d12e..54d0d0507 100644 --- a/code/ryzom/client/src/seven_zip/LzmaEnc.cpp +++ b/code/ryzom/client/src/seven_zip/LzmaEnc.cpp @@ -1,5 +1,5 @@ /* LzmaEnc.c -- LZMA Encoder -2018-04-29 : Igor Pavlov : Public domain */ +2019-01-10: Igor Pavlov : Public domain */ #include "Precomp.h" @@ -40,6 +40,8 @@ static unsigned g_STAT_OFFSET = 0; #define kNumBitPriceShiftBits 4 #define kBitPrice (1 << kNumBitPriceShiftBits) +#define REP_LEN_COUNT 64 + void LzmaEncProps_Init(CLzmaEncProps *p) { p->level = 5; @@ -185,8 +187,11 @@ typedef struct } COptimal; -#define kNumOpts (1 << 12) -#define kPackReserve (1 + kNumOpts * 2) +// 18.06 +#define kNumOpts (1 << 11) +#define kPackReserve (kNumOpts * 8) +// #define kNumOpts (1 << 12) +// #define kPackReserve (1 + kNumOpts * 2) #define kNumLenToPosStates 4 #define kNumPosSlotBits 6 @@ -238,10 +243,18 @@ typedef struct typedef struct { unsigned tableSize; - unsigned counters[LZMA_NUM_PB_STATES_MAX]; UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal]; + // UInt32 prices1[LZMA_NUM_PB_STATES_MAX][kLenNumLowSymbols * 2]; + // UInt32 prices2[kLenNumSymbolsTotal]; } CLenPriceEnc; +#define GET_PRICE_LEN(p, posState, len) \ + ((p)->prices[posState][(size_t)(len) - LZMA_MATCH_LEN_MIN]) + +/* +#define GET_PRICE_LEN(p, posState, len) \ + ((p)->prices2[(size_t)(len) - 2] + ((p)->prices1[posState][((len) - 2) & (kLenNumLowSymbols * 2 - 1)] & (((len) - 2 - kLenNumLowSymbols * 2) >> 9))) +*/ typedef struct { @@ -310,16 +323,18 @@ typedef struct unsigned lc, lp, pb; unsigned lclp; - Bool fastMode; - Bool writeEndMark; - Bool finished; - Bool multiThread; - Bool needInit; + BoolInt fastMode; + BoolInt writeEndMark; + BoolInt finished; + BoolInt multiThread; + BoolInt needInit; + // BoolInt _maxMode; UInt64 nowPos64; unsigned matchPriceCount; - unsigned alignPriceCount; + // unsigned alignPriceCount; + int repLenEncCounter; unsigned distTableSize; @@ -327,7 +342,7 @@ typedef struct SRes result; #ifndef _7ZIP_ST - Bool mtMode; + BoolInt mtMode; // begin of CMatchFinderMt is used in LZ thread CMatchFinderMt matchFinderMt; // end of CMatchFinderMt is used in BT and HASH threads @@ -460,6 +475,7 @@ SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2) p->lp = props.lp; p->pb = props.pb; p->fastMode = (props.algo == 0); + // p->_maxMode = True; p->matchFinderBase.btMode = (Byte)(props.btMode ? 1 : 0); { unsigned numHashBytes = 4; @@ -620,9 +636,9 @@ static void RangeEnc_FlushData(CRangeEnc *p) #ifdef _LZMA_ENC_USE_BRANCH -#define RC_BIT(p, prob, symbol) { \ +#define RC_BIT(p, prob, bit) { \ RC_BIT_PRE(p, prob) \ - if (symbol == 0) { range = newBound; ttt += (kBitModelTotal - ttt) >> kNumMoveBits; } \ + if (bit == 0) { range = newBound; ttt += (kBitModelTotal - ttt) >> kNumMoveBits; } \ else { (p)->low += newBound; range -= newBound; ttt -= ttt >> kNumMoveBits; } \ *(prob) = (CLzmaProb)ttt; \ RC_NORM(p) \ @@ -630,15 +646,15 @@ static void RangeEnc_FlushData(CRangeEnc *p) #else -#define RC_BIT(p, prob, symbol) { \ +#define RC_BIT(p, prob, bit) { \ UInt32 mask; \ RC_BIT_PRE(p, prob) \ - mask = 0 - (UInt32)symbol; \ + mask = 0 - (UInt32)bit; \ range &= mask; \ mask &= newBound; \ range -= mask; \ (p)->low += mask; \ - mask = (UInt32)symbol - 1; \ + mask = (UInt32)bit - 1; \ range += newBound & mask; \ mask &= (kBitModelTotal - ((1 << kNumMoveBits) - 1)); \ mask += ((1 << kNumMoveBits) - 1); \ @@ -675,42 +691,42 @@ static void RangeEnc_EncodeBit_0(CRangeEnc *p, CLzmaProb *prob) p->range = range; } -static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol) +static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 sym) { UInt32 range = p->range; - symbol |= 0x100; + sym |= 0x100; do { UInt32 ttt, newBound; - // RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1); - CLzmaProb *prob = probs + (symbol >> 8); - UInt32 bit = (symbol >> 7) & 1; - symbol <<= 1; + // RangeEnc_EncodeBit(p, probs + (sym >> 8), (sym >> 7) & 1); + CLzmaProb *prob = probs + (sym >> 8); + UInt32 bit = (sym >> 7) & 1; + sym <<= 1; RC_BIT(p, prob, bit); } - while (symbol < 0x10000); + while (sym < 0x10000); p->range = range; } -static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol, UInt32 matchByte) +static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 sym, UInt32 matchByte) { UInt32 range = p->range; UInt32 offs = 0x100; - symbol |= 0x100; + sym |= 0x100; do { UInt32 ttt, newBound; CLzmaProb *prob; UInt32 bit; matchByte <<= 1; - // RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1); - prob = probs + (offs + (matchByte & offs) + (symbol >> 8)); - bit = (symbol >> 7) & 1; - symbol <<= 1; - offs &= ~(matchByte ^ symbol); + // RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (sym >> 8)), (sym >> 7) & 1); + prob = probs + (offs + (matchByte & offs) + (sym >> 8)); + bit = (sym >> 7) & 1; + sym <<= 1; + offs &= ~(matchByte ^ sym); RC_BIT(p, prob, bit); } - while (symbol < 0x10000); + while (sym < 0x10000); p->range = range; } @@ -741,11 +757,11 @@ static void LzmaEnc_InitPriceTables(CProbPrice *ProbPrices) } -#define GET_PRICE(prob, symbol) \ - p->ProbPrices[((prob) ^ (unsigned)(((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; +#define GET_PRICE(prob, bit) \ + p->ProbPrices[((prob) ^ (unsigned)(((-(int)(bit))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; -#define GET_PRICEa(prob, symbol) \ - ProbPrices[((prob) ^ (unsigned)((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; +#define GET_PRICEa(prob, bit) \ + ProbPrices[((prob) ^ (unsigned)((-((int)(bit))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; #define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits] #define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] @@ -754,48 +770,48 @@ static void LzmaEnc_InitPriceTables(CProbPrice *ProbPrices) #define GET_PRICEa_1(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] -static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, const CProbPrice *ProbPrices) +static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 sym, const CProbPrice *ProbPrices) { UInt32 price = 0; - symbol |= 0x100; + sym |= 0x100; do { - unsigned bit = symbol & 1; - symbol >>= 1; - price += GET_PRICEa(probs[symbol], bit); + unsigned bit = sym & 1; + sym >>= 1; + price += GET_PRICEa(probs[sym], bit); } - while (symbol >= 2); + while (sym >= 2); return price; } -static UInt32 LitEnc_Matched_GetPrice(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, const CProbPrice *ProbPrices) +static UInt32 LitEnc_Matched_GetPrice(const CLzmaProb *probs, UInt32 sym, UInt32 matchByte, const CProbPrice *ProbPrices) { UInt32 price = 0; UInt32 offs = 0x100; - symbol |= 0x100; + sym |= 0x100; do { matchByte <<= 1; - price += GET_PRICEa(probs[offs + (matchByte & offs) + (symbol >> 8)], (symbol >> 7) & 1); - symbol <<= 1; - offs &= ~(matchByte ^ symbol); + price += GET_PRICEa(probs[offs + (matchByte & offs) + (sym >> 8)], (sym >> 7) & 1); + sym <<= 1; + offs &= ~(matchByte ^ sym); } - while (symbol < 0x10000); + while (sym < 0x10000); return price; } -static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, unsigned numBits, UInt32 symbol) +static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, unsigned numBits, unsigned sym) { UInt32 range = rc->range; unsigned m = 1; do { UInt32 ttt, newBound; - unsigned bit = symbol & 1; + unsigned bit = sym & 1; // RangeEnc_EncodeBit(rc, probs + m, bit); - symbol >>= 1; + sym >>= 1; RC_BIT(rc, probs + m, bit); m = (m << 1) | bit; } @@ -814,37 +830,37 @@ static void LenEnc_Init(CLenEnc *p) p->high[i] = kProbInitValue; } -static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, unsigned symbol, unsigned posState) +static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, unsigned sym, unsigned posState) { UInt32 range, ttt, newBound; CLzmaProb *probs = p->low; range = rc->range; RC_BIT_PRE(rc, probs); - if (symbol >= kLenNumLowSymbols) + if (sym >= kLenNumLowSymbols) { RC_BIT_1(rc, probs); probs += kLenNumLowSymbols; RC_BIT_PRE(rc, probs); - if (symbol >= kLenNumLowSymbols * 2) + if (sym >= kLenNumLowSymbols * 2) { RC_BIT_1(rc, probs); rc->range = range; - // RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols * 2); - LitEnc_Encode(rc, p->high, symbol - kLenNumLowSymbols * 2); + // RcTree_Encode(rc, p->high, kLenNumHighBits, sym - kLenNumLowSymbols * 2); + LitEnc_Encode(rc, p->high, sym - kLenNumLowSymbols * 2); return; } - symbol -= kLenNumLowSymbols; + sym -= kLenNumLowSymbols; } - // RcTree_Encode(rc, probs + (posState << kLenNumLowBits), kLenNumLowBits, symbol); + // RcTree_Encode(rc, probs + (posState << kLenNumLowBits), kLenNumLowBits, sym); { unsigned m; unsigned bit; RC_BIT_0(rc, probs); probs += (posState << (1 + kLenNumLowBits)); - bit = (symbol >> 2) ; RC_BIT(rc, probs + 1, bit); m = (1 << 1) + bit; - bit = (symbol >> 1) & 1; RC_BIT(rc, probs + m, bit); m = (m << 1) + bit; - bit = symbol & 1; RC_BIT(rc, probs + m, bit); + bit = (sym >> 2) ; RC_BIT(rc, probs + 1, bit); m = (1 << 1) + bit; + bit = (sym >> 1) & 1; RC_BIT(rc, probs + m, bit); m = (m << 1) + bit; + bit = sym & 1; RC_BIT(rc, probs + m, bit); rc->range = range; } } @@ -865,51 +881,94 @@ static void SetPrices_3(const CLzmaProb *probs, UInt32 startPrice, UInt32 *price } -MY_NO_INLINE static void MY_FAST_CALL LenPriceEnc_UpdateTable( - CLenPriceEnc *p, unsigned posState, +MY_NO_INLINE static void MY_FAST_CALL LenPriceEnc_UpdateTables( + CLenPriceEnc *p, + unsigned numPosStates, const CLenEnc *enc, const CProbPrice *ProbPrices) { - // int y; for (y = 0; y < 100; y++) { - UInt32 a; - unsigned i, numSymbols; - - UInt32 *prices = p->prices[posState]; + UInt32 b; + { - const CLzmaProb *probs = enc->low + (posState << (1 + kLenNumLowBits)); - SetPrices_3(probs, GET_PRICEa_0(enc->low[0]), prices, ProbPrices); + unsigned prob = enc->low[0]; + UInt32 a, c; + unsigned posState; + b = GET_PRICEa_1(prob); + a = GET_PRICEa_0(prob); + c = b + GET_PRICEa_0(enc->low[kLenNumLowSymbols]); + for (posState = 0; posState < numPosStates; posState++) + { + UInt32 *prices = p->prices[posState]; + const CLzmaProb *probs = enc->low + (posState << (1 + kLenNumLowBits)); + SetPrices_3(probs, a, prices, ProbPrices); + SetPrices_3(probs + kLenNumLowSymbols, c, prices + kLenNumLowSymbols, ProbPrices); + } + } + + /* + { + unsigned i; + UInt32 b; + a = GET_PRICEa_0(enc->low[0]); + for (i = 0; i < kLenNumLowSymbols; i++) + p->prices2[i] = a; a = GET_PRICEa_1(enc->low[0]); - SetPrices_3(probs + kLenNumLowSymbols, a + GET_PRICEa_0(enc->low[kLenNumLowSymbols]), prices + kLenNumLowSymbols, ProbPrices); + b = a + GET_PRICEa_0(enc->low[kLenNumLowSymbols]); + for (i = kLenNumLowSymbols; i < kLenNumLowSymbols * 2; i++) + p->prices2[i] = b; a += GET_PRICEa_1(enc->low[kLenNumLowSymbols]); } - numSymbols = p->tableSize; - p->counters[posState] = numSymbols; - for (i = kLenNumLowSymbols * 2; i < numSymbols; i += 1) + */ + + // p->counter = numSymbols; + // p->counter = 64; + { - prices[i] = a + - // RcTree_GetPrice(enc->high, kLenNumHighBits, i - kLenNumLowSymbols * 2, ProbPrices); - LitEnc_GetPrice(enc->high, i - kLenNumLowSymbols * 2, ProbPrices); - /* - unsigned sym = (i - kLenNumLowSymbols * 2) >> 1; - UInt32 price = a + RcTree_GetPrice(enc->high, kLenNumHighBits - 1, sym, ProbPrices); - UInt32 prob = enc->high[(1 << 7) + sym]; - prices[i ] = price + GET_PRICEa_0(prob); - prices[i + 1] = price + GET_PRICEa_1(prob); - */ + unsigned i = p->tableSize; + + if (i > kLenNumLowSymbols * 2) + { + const CLzmaProb *probs = enc->high; + UInt32 *prices = p->prices[0] + kLenNumLowSymbols * 2; + i -= kLenNumLowSymbols * 2 - 1; + i >>= 1; + b += GET_PRICEa_1(enc->low[kLenNumLowSymbols]); + do + { + /* + p->prices2[i] = a + + // RcTree_GetPrice(enc->high, kLenNumHighBits, i - kLenNumLowSymbols * 2, ProbPrices); + LitEnc_GetPrice(probs, i - kLenNumLowSymbols * 2, ProbPrices); + */ + // UInt32 price = a + RcTree_GetPrice(probs, kLenNumHighBits - 1, sym, ProbPrices); + unsigned sym = --i + (1 << (kLenNumHighBits - 1)); + UInt32 price = b; + do + { + unsigned bit = sym & 1; + sym >>= 1; + price += GET_PRICEa(probs[sym], bit); + } + while (sym >= 2); + + { + unsigned prob = probs[(size_t)i + (1 << (kLenNumHighBits - 1))]; + prices[(size_t)i * 2 ] = price + GET_PRICEa_0(prob); + prices[(size_t)i * 2 + 1] = price + GET_PRICEa_1(prob); + } + } + while (i); + + { + unsigned posState; + size_t num = (p->tableSize - kLenNumLowSymbols * 2) * sizeof(p->prices[0][0]); + for (posState = 1; posState < numPosStates; posState++) + memcpy(p->prices[posState] + kLenNumLowSymbols * 2, p->prices[0] + kLenNumLowSymbols * 2, num); + } + } } - // } } -static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, unsigned numPosStates, - const CLenEnc *enc, - const CProbPrice *ProbPrices) -{ - unsigned posState; - for (posState = 0; posState < numPosStates; posState++) - LenPriceEnc_UpdateTable(p, posState, enc, ProbPrices); -} - - /* #ifdef SHOW_STAT g_STAT_OFFSET += num; @@ -919,7 +978,7 @@ static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, unsigned numPosStates, #define MOVE_POS(p, num) { \ p->additionalOffset += (num); \ - p->matchFinder.Skip(p->matchFinderObj, (num)); } + p->matchFinder.Skip(p->matchFinderObj, (UInt32)(num)); } static unsigned ReadMatchDistances(CLzmaEnc *p, unsigned *numPairsRes) @@ -956,7 +1015,8 @@ static unsigned ReadMatchDistances(CLzmaEnc *p, unsigned *numPairsRes) const Byte *p2 = p1 + len; ptrdiff_t dif = (ptrdiff_t)-1 - p->matches[(size_t)numPairs - 1]; const Byte *lim = p1 + numAvail; - for (; p2 != lim && *p2 == p2[dif]; p2++); + for (; p2 != lim && *p2 == p2[dif]; p2++) + {} return (unsigned)(p2 - p1); } } @@ -979,7 +1039,7 @@ static unsigned ReadMatchDistances(CLzmaEnc *p, unsigned *numPairsRes) + GET_PRICE_1(p->isRep[state]) \ + GET_PRICE_0(p->isRepG0[state]) - +MY_FORCE_INLINE static UInt32 GetPrice_PureRep(const CLzmaEnc *p, unsigned repIndex, size_t state, size_t posState) { UInt32 price; @@ -1013,14 +1073,14 @@ static unsigned Backward(CLzmaEnc *p, unsigned cur) for (;;) { UInt32 dist = p->opt[cur].dist; - UInt32 len = p->opt[cur].len; - UInt32 extra = p->opt[cur].extra; + unsigned len = (unsigned)p->opt[cur].len; + unsigned extra = (unsigned)p->opt[cur].extra; cur -= len; if (extra) { wr--; - p->opt[wr].len = len; + p->opt[wr].len = (UInt32)len; cur -= extra; len = extra; if (extra == 1) @@ -1047,7 +1107,7 @@ static unsigned Backward(CLzmaEnc *p, unsigned cur) wr--; p->opt[wr].dist = dist; - p->opt[wr].len = len; + p->opt[wr].len = (UInt32)len; } } @@ -1104,7 +1164,8 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) repLens[i] = 0; continue; } - for (len = 2; len < numAvail && data[len] == data2[len]; len++); + for (len = 2; len < numAvail && data[len] == data2[len]; len++) + {} repLens[i] = len; if (len > repLens[repMaxIndex]) repMaxIndex = i; @@ -1113,7 +1174,7 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) if (repLens[repMaxIndex] >= p->numFastBytes) { unsigned len; - p->backRes = repMaxIndex; + p->backRes = (UInt32)repMaxIndex; len = repLens[repMaxIndex]; MOVE_POS(p, len - 1) return len; @@ -1130,8 +1191,12 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) curByte = *data; matchByte = *(data - reps[0]); + + last = repLens[repMaxIndex]; + if (last <= mainLen) + last = mainLen; - if (mainLen < 2 && curByte != matchByte && repLens[repMaxIndex] < 2) + if (last < 2 && curByte != matchByte) { p->backRes = MARK_LIT; return 1; @@ -1148,13 +1213,14 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) LitEnc_Matched_GetPrice(probs, curByte, matchByte, p->ProbPrices) : LitEnc_GetPrice(probs, curByte, p->ProbPrices)); } - + MakeAs_Lit(&p->opt[1]); matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]); repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]); - if (matchByte == curByte) + // 18.06 + if (matchByte == curByte && repLens[0] == 0) { UInt32 shortRepPrice = repMatchPrice + GetPrice_ShortRep(p, p->state, posState); if (shortRepPrice < p->opt[1].price) @@ -1162,16 +1228,13 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) p->opt[1].price = shortRepPrice; MakeAs_ShortRep(&p->opt[1]); } + if (last < 2) + { + p->backRes = p->opt[1].dist; + return 1; + } } - - last = (mainLen >= repLens[repMaxIndex] ? mainLen : repLens[repMaxIndex]); - - if (last < 2) - { - p->backRes = p->opt[1].dist; - return 1; - } - + p->opt[1].len = 1; p->opt[0].reps[0] = reps[0]; @@ -1179,13 +1242,6 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) p->opt[0].reps[2] = reps[2]; p->opt[0].reps[3] = reps[3]; - { - unsigned len = last; - do - p->opt[len--].price = kInfinityPrice; - while (len >= 2); - } - // ---------- REP ---------- for (i = 0; i < LZMA_NUM_REPS; i++) @@ -1197,13 +1253,13 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) price = repMatchPrice + GetPrice_PureRep(p, i, p->state, posState); do { - UInt32 price2 = price + p->repLenEnc.prices[posState][(size_t)repLen - 2]; + UInt32 price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState, repLen); COptimal *opt = &p->opt[repLen]; if (price2 < opt->price) { opt->price = price2; - opt->len = repLen; - opt->dist = i; + opt->len = (UInt32)repLen; + opt->dist = (UInt32)i; opt->extra = 0; } } @@ -1213,38 +1269,41 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) // ---------- MATCH ---------- { - unsigned len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); + unsigned len = repLens[0] + 1; if (len <= mainLen) { unsigned offs = 0; UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]); - while (len > matches[offs]) - offs += 2; + if (len < 2) + len = 2; + else + while (len > matches[offs]) + offs += 2; for (; ; len++) { COptimal *opt; UInt32 dist = matches[(size_t)offs + 1]; - UInt32 price2 = normalMatchPrice + p->lenEnc.prices[posState][(size_t)len - LZMA_MATCH_LEN_MIN]; + UInt32 price = normalMatchPrice + GET_PRICE_LEN(&p->lenEnc, posState, len); unsigned lenToPosState = GetLenToPosState(len); if (dist < kNumFullDistances) - price2 += p->distancesPrices[lenToPosState][dist & (kNumFullDistances - 1)]; + price += p->distancesPrices[lenToPosState][dist & (kNumFullDistances - 1)]; else { unsigned slot; GetPosSlot2(dist, slot); - price2 += p->alignPrices[dist & kAlignMask]; - price2 += p->posSlotPrices[lenToPosState][slot]; + price += p->alignPrices[dist & kAlignMask]; + price += p->posSlotPrices[lenToPosState][slot]; } opt = &p->opt[len]; - if (price2 < opt->price) + if (price < opt->price) { - opt->price = price2; - opt->len = len; + opt->price = price; + opt->len = (UInt32)len; opt->dist = dist + LZMA_NUM_REPS; opt->extra = 0; } @@ -1279,16 +1338,43 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) for (;;) { - UInt32 numAvail, numAvailFull; + unsigned numAvail; + UInt32 numAvailFull; unsigned newLen, numPairs, prev, state, posState, startLen; - UInt32 curPrice, litPrice, matchPrice, repMatchPrice; - Bool nextIsLit; + UInt32 litPrice, matchPrice, repMatchPrice; + BoolInt nextIsLit; Byte curByte, matchByte; const Byte *data; COptimal *curOpt, *nextOpt; if (++cur == last) - return Backward(p, cur); + break; + + // 18.06 + if (cur >= kNumOpts - 64) + { + unsigned j, best; + UInt32 price = p->opt[cur].price; + best = cur; + for (j = cur + 1; j <= last; j++) + { + UInt32 price2 = p->opt[j].price; + if (price >= price2) + { + price = price2; + best = j; + } + } + { + unsigned delta = best - cur; + if (delta != 0) + { + MOVE_POS(p, delta); + } + } + cur = best; + break; + } newLen = ReadMatchDistances(p, &numPairs); @@ -1296,15 +1382,24 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) { p->numPairs = numPairs; p->longestMatchLen = newLen; - return Backward(p, cur); + break; } curOpt = &p->opt[cur]; + + position++; + + // we need that check here, if skip_items in p->opt are possible + /* + if (curOpt->price >= kInfinityPrice) + continue; + */ + prev = cur - curOpt->len; - + if (curOpt->len == 1) { - state = p->opt[prev].state; + state = (unsigned)p->opt[prev].state; if (IsShortRep(curOpt)) state = kShortRepNextStates[state]; else @@ -1318,14 +1413,14 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) if (curOpt->extra) { - prev -= curOpt->extra; + prev -= (unsigned)curOpt->extra; state = kState_RepAfterLit; if (curOpt->extra == 1) - state = (dist < LZMA_NUM_REPS) ? kState_RepAfterLit : kState_MatchAfterLit; + state = (dist < LZMA_NUM_REPS ? kState_RepAfterLit : kState_MatchAfterLit); } else { - state = p->opt[prev].state; + state = (unsigned)p->opt[prev].state; if (dist < LZMA_NUM_REPS) state = kRepNextStates[state]; else @@ -1381,7 +1476,6 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) curByte = *data; matchByte = *(data - reps[0]); - position++; posState = (position & p->pbMask); /* @@ -1393,13 +1487,25 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) < MATCH [ : LIT : REP_0 ] */ - curPrice = curOpt->price; - litPrice = curPrice + GET_PRICE_0(p->isMatch[state][posState]); + { + UInt32 curPrice = curOpt->price; + unsigned prob = p->isMatch[state][posState]; + matchPrice = curPrice + GET_PRICE_1(prob); + litPrice = curPrice + GET_PRICE_0(prob); + } nextOpt = &p->opt[(size_t)cur + 1]; nextIsLit = False; - // if (litPrice >= nextOpt->price) litPrice = 0; else // 18.new + // here we can allow skip_items in p->opt, if we don't check (nextOpt->price < kInfinityPrice) + // 18.new.06 + if ((nextOpt->price < kInfinityPrice + // && !IsLitState(state) + && matchByte == curByte) + || litPrice > nextOpt->price + ) + litPrice = 0; + else { const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); litPrice += (!IsLitState(state) ? @@ -1415,21 +1521,32 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) } } - matchPrice = curPrice + GET_PRICE_1(p->isMatch[state][posState]); repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]); + numAvailFull = p->numAvail; + { + unsigned temp = kNumOpts - 1 - cur; + if (numAvailFull > temp) + numAvailFull = (UInt32)temp; + } + + // 18.06 // ---------- SHORT_REP ---------- - // if (IsLitState(state)) // 18.new + if (IsLitState(state)) // 18.new if (matchByte == curByte) - // if (repMatchPrice < nextOpt->price) // 18.new - if (nextOpt->len < 2 + if (repMatchPrice < nextOpt->price) // 18.new + // if (numAvailFull < 2 || data[1] != *(data - reps[0] + 1)) + if ( + // nextOpt->price >= kInfinityPrice || + nextOpt->len < 2 // we can check nextOpt->len, if skip items are not allowed in p->opt || (nextOpt->dist != 0 - && nextOpt->extra <= 1 // 17.old - )) + // && nextOpt->extra <= 1 // 17.old + ) + ) { UInt32 shortRepPrice = repMatchPrice + GetPrice_ShortRep(p, state, posState); - if (shortRepPrice <= nextOpt->price) // 17.old - // if (shortRepPrice < nextOpt->price) // 18.new + // if (shortRepPrice <= nextOpt->price) // 17.old + if (shortRepPrice < nextOpt->price) // 18.new { nextOpt->price = shortRepPrice; nextOpt->len = 1; @@ -1438,13 +1555,6 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) } } - numAvailFull = p->numAvail; - { - UInt32 temp = kNumOpts - 1 - cur; - if (numAvailFull > temp) - numAvailFull = temp; - } - if (numAvailFull < 2) continue; numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes); @@ -1453,9 +1563,8 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) // ---------- LIT : REP_0 ---------- - if ( - // litPrice != 0 && // 18.new - !nextIsLit + if (!nextIsLit + && litPrice != 0 // 18.new && matchByte != curByte && numAvailFull > 2) { @@ -1466,7 +1575,8 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) unsigned limit = p->numFastBytes + 1; if (limit > numAvailFull) limit = numAvailFull; - for (len = 3; len < limit && data[len] == data2[len]; len++); + for (len = 3; len < limit && data[len] == data2[len]; len++) + {} { unsigned state2 = kLiteralNextStates[state]; @@ -1474,8 +1584,9 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) UInt32 price = litPrice + GetPrice_Rep_0(p, state2, posState2); { unsigned offset = cur + len; - while (last < offset) - p->opt[++last].price = kInfinityPrice; + + if (last < offset) + last = offset; // do { @@ -1483,14 +1594,14 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) COptimal *opt; len--; // price2 = price + GetPrice_Len_Rep_0(p, len, state2, posState2); - price2 = price + p->repLenEnc.prices[posState2][len - LZMA_MATCH_LEN_MIN]; + price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState2, len); opt = &p->opt[offset]; // offset--; if (price2 < opt->price) { opt->price = price2; - opt->len = len; + opt->len = (UInt32)len; opt->dist = 0; opt->extra = 1; } @@ -1502,6 +1613,7 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) } startLen = 2; /* speed optimization */ + { // ---------- REP ---------- unsigned repIndex = 0; // 17.old @@ -1514,24 +1626,28 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) if (data[0] != data2[0] || data[1] != data2[1]) continue; - for (len = 2; len < numAvail && data[len] == data2[len]; len++); + for (len = 2; len < numAvail && data[len] == data2[len]; len++) + {} // if (len < startLen) continue; // 18.new: speed optimization - while (last < cur + len) - p->opt[++last].price = kInfinityPrice; + { + unsigned offset = cur + len; + if (last < offset) + last = offset; + } { unsigned len2 = len; price = repMatchPrice + GetPrice_PureRep(p, repIndex, state, posState); do { - UInt32 price2 = price + p->repLenEnc.prices[posState][(size_t)len2 - 2]; + UInt32 price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState, len2); COptimal *opt = &p->opt[cur + len2]; if (price2 < opt->price) { opt->price = price2; - opt->len = len2; - opt->dist = repIndex; + opt->len = (UInt32)len2; + opt->dist = (UInt32)repIndex; opt->extra = 0; } } @@ -1551,15 +1667,14 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) if (limit > numAvailFull) limit = numAvailFull; - for (; len2 < limit && data[len2] == data2[len2]; len2++); - - len2 -= len; - if (len2 >= 3) + len2 += 2; + if (len2 <= limit) + if (data[len2 - 2] == data2[len2 - 2]) + if (data[len2 - 1] == data2[len2 - 1]) { unsigned state2 = kRepNextStates[state]; unsigned posState2 = (position + len) & p->pbMask; - price += - p->repLenEnc.prices[posState][(size_t)len - 2] + price += GET_PRICE_LEN(&p->repLenEnc, posState, len) + GET_PRICE_0(p->isMatch[state2][posState2]) + LitEnc_Matched_GetPrice(LIT_PROBS(position + len, data[(size_t)len - 1]), data[len], data2[len], p->ProbPrices); @@ -1570,31 +1685,40 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) price += GetPrice_Rep_0(p, state2, posState2); + + for (; len2 < limit && data[len2] == data2[len2]; len2++) + {} + + len2 -= len; + // if (len2 >= 3) + { { unsigned offset = cur + len + len2; - while (last < offset) - p->opt[++last].price = kInfinityPrice; + + if (last < offset) + last = offset; // do { - unsigned price2; + UInt32 price2; COptimal *opt; len2--; // price2 = price + GetPrice_Len_Rep_0(p, len2, state2, posState2); - price2 = price + p->repLenEnc.prices[posState2][len2 - LZMA_MATCH_LEN_MIN]; + price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState2, len2); opt = &p->opt[offset]; // offset--; if (price2 < opt->price) { opt->price = price2; - opt->len = len2; + opt->len = (UInt32)len2; opt->extra = (CExtra)(len + 1); - opt->dist = repIndex; + opt->dist = (UInt32)repIndex; } } // while (len2 >= 3); } } + } } } } @@ -1606,17 +1730,23 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) { newLen = numAvail; for (numPairs = 0; newLen > matches[numPairs]; numPairs += 2); - matches[numPairs] = newLen; + matches[numPairs] = (UInt32)newLen; numPairs += 2; } + // startLen = 2; /* speed optimization */ + if (newLen >= startLen) { UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]); UInt32 dist; unsigned offs, posSlot, len; - while (last < cur + newLen) - p->opt[++last].price = kInfinityPrice; + + { + unsigned offset = cur + newLen; + if (last < offset) + last = offset; + } offs = 0; while (startLen > matches[offs]) @@ -1628,27 +1758,29 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) for (len = /*2*/ startLen; ; len++) { - UInt32 price = normalMatchPrice + p->lenEnc.prices[posState][(size_t)len - LZMA_MATCH_LEN_MIN]; + UInt32 price = normalMatchPrice + GET_PRICE_LEN(&p->lenEnc, posState, len); { COptimal *opt; - unsigned lenToPosState = len - 2; lenToPosState = GetLenToPosState2(lenToPosState); + unsigned lenNorm = len - 2; + lenNorm = GetLenToPosState2(lenNorm); if (dist < kNumFullDistances) - price += p->distancesPrices[lenToPosState][dist & (kNumFullDistances - 1)]; + price += p->distancesPrices[lenNorm][dist & (kNumFullDistances - 1)]; else - price += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[dist & kAlignMask]; + price += p->posSlotPrices[lenNorm][posSlot] + p->alignPrices[dist & kAlignMask]; opt = &p->opt[cur + len]; if (price < opt->price) { opt->price = price; - opt->len = len; + opt->len = (UInt32)len; opt->dist = dist + LZMA_NUM_REPS; opt->extra = 0; } } - if (/*_maxMode && */ len == matches[offs]) + if (len == matches[offs]) { + // if (p->_maxMode) { // MATCH : LIT : REP_0 const Byte *data2 = data - dist - 1; @@ -1657,11 +1789,17 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) if (limit > numAvailFull) limit = numAvailFull; - for (; len2 < limit && data[len2] == data2[len2]; len2++); + len2 += 2; + if (len2 <= limit) + if (data[len2 - 2] == data2[len2 - 2]) + if (data[len2 - 1] == data2[len2 - 1]) + { + for (; len2 < limit && data[len2] == data2[len2]; len2++) + {} len2 -= len; - if (len2 >= 3) + // if (len2 >= 3) { unsigned state2 = kMatchNextStates[state]; unsigned posState2 = (position + len) & p->pbMask; @@ -1677,27 +1815,30 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) price += GetPrice_Rep_0(p, state2, posState2); offset = cur + len + len2; - while (last < offset) - p->opt[++last].price = kInfinityPrice; + + if (last < offset) + last = offset; // do { UInt32 price2; COptimal *opt; len2--; // price2 = price + GetPrice_Len_Rep_0(p, len2, state2, posState2); - price2 = price + p->repLenEnc.prices[posState2][len2 - LZMA_MATCH_LEN_MIN]; + price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState2, len2); opt = &p->opt[offset]; // offset--; if (price2 < opt->price) { opt->price = price2; - opt->len = len2; + opt->len = (UInt32)len2; opt->extra = (CExtra)(len + 1); opt->dist = dist + LZMA_NUM_REPS; } } // while (len2 >= 3); } + + } offs += 2; if (offs == numPairs) @@ -1709,6 +1850,12 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) } } } + + do + p->opt[last].price = kInfinityPrice; + while (--last); + + return Backward(p, cur); } @@ -1735,6 +1882,7 @@ static unsigned GetOptimumFast(CLzmaEnc *p) p->backRes = MARK_LIT; if (numAvail < 2) return 1; + // if (mainLen < 2 && p->state == 0) return 1; // 18.06.notused if (numAvail > LZMA_MATCH_LEN_MAX) numAvail = LZMA_MATCH_LEN_MAX; data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; @@ -1746,10 +1894,11 @@ static unsigned GetOptimumFast(CLzmaEnc *p) const Byte *data2 = data - p->reps[i]; if (data[0] != data2[0] || data[1] != data2[1]) continue; - for (len = 2; len < numAvail && data[len] == data2[len]; len++); + for (len = 2; len < numAvail && data[len] == data2[len]; len++) + {} if (len >= p->numFastBytes) { - p->backRes = i; + p->backRes = (UInt32)i; MOVE_POS(p, len - 1) return len; } @@ -1793,7 +1942,7 @@ static unsigned GetOptimumFast(CLzmaEnc *p) || (repLen + 2 >= mainLen && mainDist >= (1 << 9)) || (repLen + 3 >= mainLen && mainDist >= (1 << 15))) { - p->backRes = repIndex; + p->backRes = (UInt32)repIndex; MOVE_POS(p, repLen - 1) return repLen; } @@ -1932,23 +2081,22 @@ MY_NO_INLINE static SRes Flush(CLzmaEnc *p, UInt32 nowPos) } - -static void FillAlignPrices(CLzmaEnc *p) +MY_NO_INLINE static void FillAlignPrices(CLzmaEnc *p) { unsigned i; const CProbPrice *ProbPrices = p->ProbPrices; const CLzmaProb *probs = p->posAlignEncoder; - p->alignPriceCount = 0; + // p->alignPriceCount = 0; for (i = 0; i < kAlignTableSize / 2; i++) { UInt32 price = 0; - unsigned symbol = i; + unsigned sym = i; unsigned m = 1; unsigned bit; UInt32 prob; - bit = symbol & 1; symbol >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit; - bit = symbol & 1; symbol >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit; - bit = symbol & 1; symbol >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit; + bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit; + bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit; + bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit; prob = probs[m]; p->alignPrices[i ] = price + GET_PRICEa_0(prob); p->alignPrices[i + 8] = price + GET_PRICEa_1(prob); @@ -1957,78 +2105,97 @@ static void FillAlignPrices(CLzmaEnc *p) } -static void FillDistancesPrices(CLzmaEnc *p) +MY_NO_INLINE static void FillDistancesPrices(CLzmaEnc *p) { + // int y; for (y = 0; y < 100; y++) { + UInt32 tempPrices[kNumFullDistances]; - unsigned i, lenToPosState; + unsigned i, lps; const CProbPrice *ProbPrices = p->ProbPrices; p->matchPriceCount = 0; - for (i = kStartPosModelIndex; i < kNumFullDistances; i++) + for (i = kStartPosModelIndex / 2; i < kNumFullDistances / 2; i++) { unsigned posSlot = GetPosSlot1(i); - unsigned footerBits = ((posSlot >> 1) - 1); + unsigned footerBits = (posSlot >> 1) - 1; unsigned base = ((2 | (posSlot & 1)) << footerBits); + const CLzmaProb *probs = p->posEncoders + (size_t)base * 2; // tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base, footerBits, i - base, p->ProbPrices); - - const CLzmaProb *probs = p->posEncoders + base; UInt32 price = 0; unsigned m = 1; - unsigned symbol = i - base; + unsigned sym = i; + unsigned offset = (unsigned)1 << footerBits; + base += i; + + if (footerBits) do { - unsigned bit = symbol & 1; - symbol >>= 1; + unsigned bit = sym & 1; + sym >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit; } while (--footerBits); - tempPrices[i] = price; + + { + unsigned prob = probs[m]; + tempPrices[base ] = price + GET_PRICEa_0(prob); + tempPrices[base + offset] = price + GET_PRICEa_1(prob); + } } - for (lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++) + for (lps = 0; lps < kNumLenToPosStates; lps++) { - unsigned posSlot; - const CLzmaProb *encoder = p->posSlotEncoder[lenToPosState]; - UInt32 *posSlotPrices = p->posSlotPrices[lenToPosState]; - unsigned distTableSize = p->distTableSize; - const CLzmaProb *probs = encoder; - for (posSlot = 0; posSlot < distTableSize; posSlot += 2) + unsigned slot; + unsigned distTableSize2 = (p->distTableSize + 1) >> 1; + UInt32 *posSlotPrices = p->posSlotPrices[lps]; + const CLzmaProb *probs = p->posSlotEncoder[lps]; + + for (slot = 0; slot < distTableSize2; slot++) { - // posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices); - UInt32 price = 0; + // posSlotPrices[slot] = RcTree_GetPrice(encoder, kNumPosSlotBits, slot, p->ProbPrices); + UInt32 price; unsigned bit; - unsigned symbol = (posSlot >> 1) + (1 << (kNumPosSlotBits - 1)); - UInt32 prob; - bit = symbol & 1; symbol >>= 1; price += GET_PRICEa(probs[symbol], bit); - bit = symbol & 1; symbol >>= 1; price += GET_PRICEa(probs[symbol], bit); - bit = symbol & 1; symbol >>= 1; price += GET_PRICEa(probs[symbol], bit); - bit = symbol & 1; symbol >>= 1; price += GET_PRICEa(probs[symbol], bit); - bit = symbol & 1; symbol >>= 1; price += GET_PRICEa(probs[symbol], bit); - prob = probs[(posSlot >> 1) + (1 << (kNumPosSlotBits - 1))]; - posSlotPrices[posSlot ] = price + GET_PRICEa_0(prob); - posSlotPrices[posSlot + 1] = price + GET_PRICEa_1(prob); + unsigned sym = slot + (1 << (kNumPosSlotBits - 1)); + unsigned prob; + bit = sym & 1; sym >>= 1; price = GET_PRICEa(probs[sym], bit); + bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit); + bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit); + bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit); + bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit); + prob = probs[(size_t)slot + (1 << (kNumPosSlotBits - 1))]; + posSlotPrices[(size_t)slot * 2 ] = price + GET_PRICEa_0(prob); + posSlotPrices[(size_t)slot * 2 + 1] = price + GET_PRICEa_1(prob); + } + + { + UInt32 delta = ((UInt32)((kEndPosModelIndex / 2 - 1) - kNumAlignBits) << kNumBitPriceShiftBits); + for (slot = kEndPosModelIndex / 2; slot < distTableSize2; slot++) + { + posSlotPrices[(size_t)slot * 2 ] += delta; + posSlotPrices[(size_t)slot * 2 + 1] += delta; + delta += ((UInt32)1 << kNumBitPriceShiftBits); + } } - for (posSlot = kEndPosModelIndex; posSlot < distTableSize; posSlot++) - posSlotPrices[posSlot] += ((UInt32)(((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits); { - UInt32 *distancesPrices = p->distancesPrices[lenToPosState]; - { - distancesPrices[0] = posSlotPrices[0]; - distancesPrices[1] = posSlotPrices[1]; - distancesPrices[2] = posSlotPrices[2]; - distancesPrices[3] = posSlotPrices[3]; - } + UInt32 *dp = p->distancesPrices[lps]; + + dp[0] = posSlotPrices[0]; + dp[1] = posSlotPrices[1]; + dp[2] = posSlotPrices[2]; + dp[3] = posSlotPrices[3]; + for (i = 4; i < kNumFullDistances; i += 2) { UInt32 slotPrice = posSlotPrices[GetPosSlot1(i)]; - distancesPrices[i ] = slotPrice + tempPrices[i]; - distancesPrices[i + 1] = slotPrice + tempPrices[i + 1]; + dp[i ] = slotPrice + tempPrices[i]; + dp[i + 1] = slotPrice + tempPrices[i + 1]; } } } + // } } @@ -2245,10 +2412,7 @@ static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, UInt32 maxPackSize, UInt32 maxUnpa if (len != 1) { LenEnc_Encode(&p->repLenProbs, &p->rc, len - LZMA_MATCH_LEN_MIN, posState); - if (!p->fastMode) - if (--p->repLenEnc.counters[posState] == 0) - LenPriceEnc_UpdateTable(&p->repLenEnc, posState, &p->repLenProbs, p->ProbPrices); - + --p->repLenEncCounter; p->state = kRepNextStates[p->state]; } } @@ -2260,9 +2424,7 @@ static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, UInt32 maxPackSize, UInt32 maxUnpa p->state = kMatchNextStates[p->state]; LenEnc_Encode(&p->lenProbs, &p->rc, len - LZMA_MATCH_LEN_MIN, posState); - if (!p->fastMode) - if (--p->lenEnc.counters[posState] == 0) - LenPriceEnc_UpdateTable(&p->lenEnc, posState, &p->lenProbs, p->ProbPrices); + // --p->lenEnc.counter; dist -= LZMA_NUM_REPS; p->reps[3] = p->reps[2]; @@ -2274,17 +2436,17 @@ static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, UInt32 maxPackSize, UInt32 maxUnpa GetPosSlot(dist, posSlot); // RcTree_Encode_PosSlot(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], posSlot); { - UInt32 symbol = posSlot + (1 << kNumPosSlotBits); + UInt32 sym = (UInt32)posSlot + (1 << kNumPosSlotBits); range = p->rc.range; probs = p->posSlotEncoder[GetLenToPosState(len)]; do { - CLzmaProb *prob = probs + (symbol >> kNumPosSlotBits); - UInt32 bit = (symbol >> (kNumPosSlotBits - 1)) & 1; - symbol <<= 1; + CLzmaProb *prob = probs + (sym >> kNumPosSlotBits); + UInt32 bit = (sym >> (kNumPosSlotBits - 1)) & 1; + sym <<= 1; RC_BIT(&p->rc, prob, bit); } - while (symbol < (1 << kNumPosSlotBits * 2)); + while (sym < (1 << kNumPosSlotBits * 2)); p->rc.range = range; } @@ -2295,7 +2457,7 @@ static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, UInt32 maxPackSize, UInt32 maxUnpa if (dist < kNumFullDistances) { unsigned base = ((2 | (posSlot & 1)) << footerBits); - RcTree_ReverseEncode(&p->rc, p->posEncoders + base, footerBits, dist - base); + RcTree_ReverseEncode(&p->rc, p->posEncoders + base, footerBits, (unsigned)(dist /* - base */)); } else { @@ -2331,14 +2493,14 @@ static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, UInt32 maxPackSize, UInt32 maxUnpa bit = dist & 1; dist >>= 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit); m = (m << 1) + bit; bit = dist & 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit); p->rc.range = range; - p->alignPriceCount++; + // p->alignPriceCount++; } } } } } - nowPos32 += len; + nowPos32 += (UInt32)len; p->additionalOffset -= len; if (p->additionalOffset == 0) @@ -2347,10 +2509,27 @@ static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, UInt32 maxPackSize, UInt32 maxUnpa if (!p->fastMode) { - if (p->matchPriceCount >= (1 << 7)) - FillDistancesPrices(p); - if (p->alignPriceCount >= kAlignTableSize) + /* + if (p->alignPriceCount >= 16) // kAlignTableSize FillAlignPrices(p); + if (p->matchPriceCount >= 128) + FillDistancesPrices(p); + if (p->lenEnc.counter <= 0) + LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, &p->lenProbs, p->ProbPrices); + */ + if (p->matchPriceCount >= 64) + { + FillAlignPrices(p); + // { int y; for (y = 0; y < 100; y++) { + FillDistancesPrices(p); + // }} + LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, &p->lenProbs, p->ProbPrices); + } + if (p->repLenEncCounter <= 0) + { + p->repLenEncCounter = REP_LEN_COUNT; + LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, &p->repLenProbs, p->ProbPrices); + } } if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) @@ -2490,12 +2669,19 @@ void LzmaEnc_Init(CLzmaEnc *p) p->optEnd = 0; p->optCur = 0; + + { + for (i = 0; i < kNumOpts; i++) + p->opt[i].price = kInfinityPrice; + } + p->additionalOffset = 0; p->pbMask = (1 << p->pb) - 1; p->lpMask = ((UInt32)0x100 << p->lp) - ((unsigned)0x100 >> p->lc); } + void LzmaEnc_InitPrices(CLzmaEnc *p) { if (!p->fastMode) @@ -2507,6 +2693,9 @@ void LzmaEnc_InitPrices(CLzmaEnc *p) p->lenEnc.tableSize = p->repLenEnc.tableSize = p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN; + + p->repLenEncCounter = REP_LEN_COUNT; + LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, &p->lenProbs, p->ProbPrices); LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, &p->repLenProbs, p->ProbPrices); } @@ -2583,7 +2772,7 @@ typedef struct ISeqOutStream vt; Byte *data; SizeT rem; - Bool overflow; + BoolInt overflow; } CLzmaEnc_SeqOutStreamBuf; static size_t SeqOutStreamBuf_Write(const ISeqOutStream *pp, const void *data, size_t size) @@ -2615,7 +2804,7 @@ const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp) } -SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit, +SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, BoolInt reInit, Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize) { CLzmaEnc *p = (CLzmaEnc *)pp; diff --git a/code/ryzom/client/src/seven_zip/Ppmd7.cpp b/code/ryzom/client/src/seven_zip/Ppmd7.cpp index 0951a7c74..470aadccf 100644 --- a/code/ryzom/client/src/seven_zip/Ppmd7.cpp +++ b/code/ryzom/client/src/seven_zip/Ppmd7.cpp @@ -1,5 +1,5 @@ /* Ppmd7.c -- PPMdH codec -2017-04-03 : Igor Pavlov : Public domain +2018-07-04 : Igor Pavlov : Public domain This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ #include "Precomp.h" @@ -95,7 +95,7 @@ void Ppmd7_Free(CPpmd7 *p, ISzAllocPtr alloc) p->Base = 0; } -Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAllocPtr alloc) +BoolInt Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAllocPtr alloc) { if (!p->Base || p->Size != size) { @@ -342,7 +342,7 @@ void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder) p->DummySee.Count = 64; /* unused */ } -static CTX_PTR CreateSuccessors(CPpmd7 *p, Bool skip) +static CTX_PTR CreateSuccessors(CPpmd7 *p, BoolInt skip) { CPpmd_State upState; CTX_PTR c = p->MinContext; diff --git a/code/ryzom/client/src/seven_zip/Ppmd7.h b/code/ryzom/client/src/seven_zip/Ppmd7.h index 45002d95b..610539a04 100644 --- a/code/ryzom/client/src/seven_zip/Ppmd7.h +++ b/code/ryzom/client/src/seven_zip/Ppmd7.h @@ -1,5 +1,5 @@ /* Ppmd7.h -- PPMdH compression codec -2017-04-03 : Igor Pavlov : Public domain +2018-07-04 : Igor Pavlov : Public domain This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ /* This code supports virtual RangeDecoder and includes the implementation @@ -60,7 +60,7 @@ typedef struct } CPpmd7; void Ppmd7_Construct(CPpmd7 *p); -Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAllocPtr alloc); +BoolInt Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAllocPtr alloc); void Ppmd7_Free(CPpmd7 *p, ISzAllocPtr alloc); void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder); #define Ppmd7_WasAllocated(p) ((p)->Base != NULL) @@ -115,7 +115,7 @@ typedef struct } CPpmd7z_RangeDec; void Ppmd7z_RangeDec_CreateVTable(CPpmd7z_RangeDec *p); -Bool Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p); +BoolInt Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p); #define Ppmd7z_RangeDec_IsFinishedOK(p) ((p)->Code == 0) int Ppmd7_DecodeSymbol(CPpmd7 *p, const IPpmd7_RangeDec *rc); diff --git a/code/ryzom/client/src/seven_zip/Ppmd7Dec.cpp b/code/ryzom/client/src/seven_zip/Ppmd7Dec.cpp index 7953bb07c..311e9f9dd 100644 --- a/code/ryzom/client/src/seven_zip/Ppmd7Dec.cpp +++ b/code/ryzom/client/src/seven_zip/Ppmd7Dec.cpp @@ -1,5 +1,5 @@ /* Ppmd7Dec.c -- PPMdH Decoder -2017-04-03 : Igor Pavlov : Public domain +2018-07-04 : Igor Pavlov : Public domain This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ #include "Precomp.h" @@ -8,7 +8,7 @@ This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ #define kTopValue (1 << 24) -Bool Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p) +BoolInt Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p) { unsigned i; p->Code = 0; diff --git a/code/ryzom/client/src/seven_zip/Precomp.h b/code/ryzom/client/src/seven_zip/Precomp.h index fa36461bd..dcaf49475 100644 --- a/code/ryzom/client/src/seven_zip/Precomp.h +++ b/code/ryzom/client/src/seven_zip/Precomp.h @@ -8,6 +8,7 @@ #define _CRTDBG_MAP_ALLOC #include #include + #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) #endif #define _7ZIP_ST diff --git a/code/ryzom/client/src/seven_zip/Xz.h b/code/ryzom/client/src/seven_zip/Xz.h index ef067e0e4..544ee18f2 100644 --- a/code/ryzom/client/src/seven_zip/Xz.h +++ b/code/ryzom/client/src/seven_zip/Xz.h @@ -1,5 +1,5 @@ /* Xz.h - Xz interface -2018-02-28 : Igor Pavlov : Public domain */ +2018-07-04 : Igor Pavlov : Public domain */ #ifndef __XZ_H #define __XZ_H @@ -53,7 +53,7 @@ typedef struct #define XzBlock_HasUnsupportedFlags(p) (((p)->flags & ~(XZ_BF_NUM_FILTERS_MASK | XZ_BF_PACK_SIZE | XZ_BF_UNPACK_SIZE)) != 0) SRes XzBlock_Parse(CXzBlock *p, const Byte *header); -SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, Bool *isIndex, UInt32 *headerSizeRes); +SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, BoolInt *isIndex, UInt32 *headerSizeRes); /* ---------- xz stream ---------- */ @@ -186,10 +186,10 @@ typedef struct Byte *outBuf; size_t outBufSize; size_t outWritten; // is equal to lzmaDecoder.dicPos (in outBuf mode) - Bool wasFinished; + BoolInt wasFinished; SRes res; ECoderStatus status; - // Bool SingleBufMode; + // BoolInt SingleBufMode; int finished[MIXCODER_NUM_FILTERS_MAX - 1]; size_t pos[MIXCODER_NUM_FILTERS_MAX - 1]; @@ -241,9 +241,9 @@ typedef struct CXzCheck check; CSha256 sha; - Bool parseMode; - Bool headerParsedOk; - Bool decodeToStreamSignature; + BoolInt parseMode; + BoolInt headerParsedOk; + BoolInt decodeToStreamSignature; unsigned decodeOnlyOneBlock; Byte *outBuf; @@ -335,7 +335,7 @@ SRes XzUnpacker_CodeFull(CXzUnpacker *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ECoderFinishMode finishMode, ECoderStatus *status); -Bool XzUnpacker_IsStreamWasFinished(const CXzUnpacker *p); +BoolInt XzUnpacker_IsStreamWasFinished(const CXzUnpacker *p); /* XzUnpacker_GetExtraSize() returns then number of uncofirmed bytes, @@ -365,7 +365,7 @@ UInt64 XzUnpacker_GetExtraSize(const CXzUnpacker *p); */ void XzUnpacker_PrepareToRandomBlockDecoding(CXzUnpacker *p); -Bool XzUnpacker_IsBlockFinished(const CXzUnpacker *p); +BoolInt XzUnpacker_IsBlockFinished(const CXzUnpacker *p); #define XzUnpacker_GetPackSizeForIndex(p) ((p)->packSize + (p)->blockHeaderSize + XzFlags_GetCheckSize((p)->streamFlags)) @@ -378,7 +378,7 @@ typedef struct { size_t inBufSize_ST; size_t outStep_ST; - Bool ignoreErrors; + BoolInt ignoreErrors; #ifndef _7ZIP_ST unsigned numThreads; diff --git a/code/ryzom/client/src/seven_zip/XzDec.cpp b/code/ryzom/client/src/seven_zip/XzDec.cpp index e2c2a4667..395e83f67 100644 --- a/code/ryzom/client/src/seven_zip/XzDec.cpp +++ b/code/ryzom/client/src/seven_zip/XzDec.cpp @@ -1,5 +1,5 @@ /* XzDec.c -- Xz Decode -2018-04-24 : Igor Pavlov : Public domain */ +2019-02-02 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -245,7 +245,7 @@ SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAllocP CBraState *decoder; if (id < XZ_ID_Delta || id > XZ_ID_SPARC) return SZ_ERROR_UNSUPPORTED; - decoder = (CBraState*)p->p; + decoder = (CBraState *)p->p; if (!decoder) { decoder = (CBraState *)ISzAlloc_Alloc(alloc, sizeof(CBraState)); @@ -341,7 +341,7 @@ static SRes SbState_SetFromMethod(IStateCoder *p, ISzAllocPtr alloc) typedef struct { CLzma2Dec decoder; - Bool outBufMode; + BoolInt outBufMode; } CLzma2Dec_Spec; @@ -637,8 +637,8 @@ static SRes MixCoder_Code(CMixCoder *p, for (;;) { - Bool processed = False; - Bool allFinished = True; + BoolInt processed = False; + BoolInt allFinished = True; SRes resMain = SZ_OK; unsigned i; @@ -761,7 +761,7 @@ SRes Xz_ParseHeader(CXzStreamFlags *p, const Byte *buf) return XzFlags_IsSupported(*p) ? SZ_OK : SZ_ERROR_UNSUPPORTED; } -static Bool Xz_CheckFooter(CXzStreamFlags flags, UInt64 indexSize, const Byte *buf) +static BoolInt Xz_CheckFooter(CXzStreamFlags flags, UInt64 indexSize, const Byte *buf) { return indexSize == (((UInt64)GetUi32(buf + 4) + 1) << 2) && GetUi32(buf) == CrcCalc(buf + 4, 6) @@ -775,7 +775,7 @@ static Bool Xz_CheckFooter(CXzStreamFlags flags, UInt64 indexSize, const Byte *b if (s == 0) return SZ_ERROR_ARCHIVE; pos += s; } -static Bool XzBlock_AreSupportedFilters(const CXzBlock *p) +static BoolInt XzBlock_AreSupportedFilters(const CXzBlock *p) { unsigned numFilters = XzBlock_GetNumFilters(p) - 1; unsigned i; @@ -866,7 +866,7 @@ SRes XzBlock_Parse(CXzBlock *p, const Byte *header) static SRes XzDecMix_Init(CMixCoder *p, const CXzBlock *block, Byte *outBuf, size_t outBufSize) { unsigned i; - Bool needReInit = True; + BoolInt needReInit = True; unsigned numFilters = XzBlock_GetNumFilters(block); if (numFilters == p->numCoders && ((p->outBuf && outBuf) || (!p->outBuf && !outBuf))) @@ -999,8 +999,8 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, SRes res; ECoderFinishMode finishMode2 = finishMode; - Bool srcFinished2 = srcFinished; - Bool destFinish = False; + BoolInt srcFinished2 = srcFinished; + BoolInt destFinish = False; if (p->block.packSize != (UInt64)(Int64)-1) { @@ -1346,12 +1346,12 @@ SRes XzUnpacker_CodeFull(CXzUnpacker *p, Byte *dest, SizeT *destLen, } -Bool XzUnpacker_IsBlockFinished(const CXzUnpacker *p) +BoolInt XzUnpacker_IsBlockFinished(const CXzUnpacker *p) { return (p->state == XZ_STATE_BLOCK_HEADER) && (p->pos == 0); } -Bool XzUnpacker_IsStreamWasFinished(const CXzUnpacker *p) +BoolInt XzUnpacker_IsStreamWasFinished(const CXzUnpacker *p) { return (p->state == XZ_STATE_STREAM_PADDING) && (((UInt32)p->padSize & 3) == 0); } @@ -1423,18 +1423,18 @@ typedef struct size_t outCodeSize; ECoderStatus status; SRes codeRes; - Bool skipMode; - // Bool finishedWithMark; + BoolInt skipMode; + // BoolInt finishedWithMark; EMtDecParseState parseState; - Bool parsing_Truncated; - Bool atBlockHeader; + BoolInt parsing_Truncated; + BoolInt atBlockHeader; CXzStreamFlags streamFlags; // UInt64 numFinishedStreams UInt64 numStreams; UInt64 numTotalBlocks; UInt64 numBlocks; - Bool dec_created; + BoolInt dec_created; CXzUnpacker dec; Byte mtPad[1 << 7]; @@ -1458,14 +1458,14 @@ typedef struct ICompressProgress *progress; // CXzStatInfo *stat; - Bool finishMode; - Bool outSize_Defined; + BoolInt finishMode; + BoolInt outSize_Defined; UInt64 outSize; UInt64 outProcessed; UInt64 inProcessed; UInt64 readProcessed; - Bool readWasFinished; + BoolInt readWasFinished; SRes readRes; SRes writeRes; @@ -1473,14 +1473,14 @@ typedef struct size_t outBufSize; Byte *inBuf; size_t inBufSize; - Bool dec_created; + CXzUnpacker dec; ECoderStatus status; SRes codeRes; #ifndef _7ZIP_ST - Bool mainDecoderWasCalled; + BoolInt mainDecoderWasCalled; // int statErrorDefined; int finishedDecoderIndex; @@ -1494,12 +1494,12 @@ typedef struct // UInt64 numBadBlocks; SRes mainErrorCode; - Bool isBlockHeaderState_Parse; - Bool isBlockHeaderState_Write; + BoolInt isBlockHeaderState_Parse; + BoolInt isBlockHeaderState_Write; UInt64 outProcessed_Parse; - Bool parsing_Truncated; + BoolInt parsing_Truncated; - Bool mtc_WasConstructed; + BoolInt mtc_WasConstructed; CMtDec mtc; CXzDecMtThread coders[MTDEC__THREADS_MAX]; #endif @@ -1525,7 +1525,8 @@ CXzDecMtHandle XzDecMt_Create(ISzAllocPtr alloc, ISzAllocPtr allocMid) p->outBufSize = 0; p->inBuf = NULL; p->inBufSize = 0; - p->dec_created = False; + + XzUnpacker_Construct(&p->dec, &p->alignOffsetAlloc.vt); p->unpackBlockMaxSize = 0; @@ -1573,11 +1574,7 @@ static void XzDecMt_FreeOutBufs(CXzDecMt *p) static void XzDecMt_FreeSt(CXzDecMt *p) { - if (p->dec_created) - { - XzUnpacker_Free(&p->dec); - p->dec_created = False; - } + XzUnpacker_Free(&p->dec); if (p->outBuf) { @@ -1968,11 +1965,11 @@ static SRes XzDecMt_Callback_Code(void *pp, unsigned coderIndex, #define XZDECMT_STREAM_WRITE_STEP (1 << 24) static SRes XzDecMt_Callback_Write(void *pp, unsigned coderIndex, - Bool needWriteToStream, + BoolInt needWriteToStream, const Byte *src, size_t srcSize, // int srcFinished, - Bool *needContinue, - Bool *canRecode) + BoolInt *needContinue, + BoolInt *canRecode) { CXzDecMt *me = (CXzDecMt *)pp; const CXzDecMtThread *coder = &me->coders[coderIndex]; @@ -2302,7 +2299,7 @@ void XzStatInfo_Clear(CXzStatInfo *p) static SRes XzDecMt_Decode_ST(CXzDecMt *p #ifndef _7ZIP_ST - , Bool tMode + , BoolInt tMode #endif , CXzStatInfo *stat) { @@ -2358,7 +2355,7 @@ static SRes XzDecMt_Decode_ST(CXzDecMt *p for (;;) { SizeT outSize; - Bool finished; + BoolInt finished; ECoderFinishMode finishMode; SizeT inProcessed; ECoderStatus status; @@ -2466,7 +2463,7 @@ static SRes XzStatInfo_SetStat(const CXzUnpacker *dec, int finishMode, UInt64 readProcessed, UInt64 inProcessed, SRes res, ECoderStatus status, - Bool decodingTruncated, + BoolInt decodingTruncated, CXzStatInfo *stat) { UInt64 extraSize; @@ -2531,7 +2528,7 @@ SRes XzDecMt_Decode(CXzDecMtHandle pp, { CXzDecMt *p = (CXzDecMt *)pp; #ifndef _7ZIP_ST - Bool tMode; + BoolInt tMode; #endif XzStatInfo_Clear(stat); @@ -2564,13 +2561,7 @@ SRes XzDecMt_Decode(CXzDecMtHandle pp, p->codeRes = 0; p->status = CODER_STATUS_NOT_SPECIFIED; - if (!p->dec_created) - { - XzUnpacker_Construct(&p->dec, &p->alignOffsetAlloc.vt); - p->dec_created = True; - } XzUnpacker_Init(&p->dec); - *isMT = False; @@ -2600,6 +2591,8 @@ SRes XzDecMt_Decode(CXzDecMtHandle pp, { IMtDecCallback vt; + // we just free ST buffers here + // but we still keep state variables, that was set in XzUnpacker_Init() XzDecMt_FreeSt(p); p->outProcessed_Parse = 0; @@ -2636,7 +2629,7 @@ SRes XzDecMt_Decode(CXzDecMtHandle pp, vt.Write = XzDecMt_Callback_Write; { - Bool needContinue; + BoolInt needContinue; SRes res = MtDec_Code(&p->mtc); @@ -2665,7 +2658,7 @@ SRes XzDecMt_Decode(CXzDecMtHandle pp, if (!needContinue) { SRes codeRes; - Bool truncated = False; + BoolInt truncated = False; ECoderStatus status; CXzUnpacker *dec; diff --git a/code/ryzom/client/src/seven_zip/XzEnc.cpp b/code/ryzom/client/src/seven_zip/XzEnc.cpp index 9a67cb55e..d0a8b4489 100644 --- a/code/ryzom/client/src/seven_zip/XzEnc.cpp +++ b/code/ryzom/client/src/seven_zip/XzEnc.cpp @@ -1,5 +1,5 @@ /* XzEnc.c -- Xz Encode -2018-04-28 : Igor Pavlov : Public domain */ +2019-02-02 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -814,7 +814,7 @@ static SRes Xz_CompressBlock( SRes res; Byte *outBuf = NULL; size_t outSize = 0; - Bool useStream = (fp || inStream); + BoolInt useStream = (fp || inStream); // useStream = True; if (!useStream) @@ -940,7 +940,7 @@ typedef struct #ifndef _7ZIP_ST unsigned checkType; ISeqOutStream *outStream; - Bool mtCoder_WasConstructed; + BoolInt mtCoder_WasConstructed; CMtCoder mtCoder; CXzEncBlockInfo EncBlocks[MTCODER__BLOCKS_MAX]; #endif diff --git a/code/ryzom/client/src/seven_zip/XzIn.cpp b/code/ryzom/client/src/seven_zip/XzIn.cpp index 3a1b71dcf..ff48e2dd4 100644 --- a/code/ryzom/client/src/seven_zip/XzIn.cpp +++ b/code/ryzom/client/src/seven_zip/XzIn.cpp @@ -1,5 +1,5 @@ /* XzIn.c - Xz input -2018-02-02 : Igor Pavlov : Public domain */ +2018-07-04 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -28,7 +28,7 @@ SRes Xz_ReadHeader(CXzStreamFlags *p, ISeqInStream *inStream) { unsigned s = Xz_ReadVarInt(buf + pos, size - pos, res); \ if (s == 0) return SZ_ERROR_ARCHIVE; pos += s; } -SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, Bool *isIndex, UInt32 *headerSizeRes) +SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, BoolInt *isIndex, UInt32 *headerSizeRes) { Byte header[XZ_BLOCK_HEADER_SIZE_MAX]; unsigned headerSize; diff --git a/code/ryzom/client/src/seven_zip/seven_zip.cpp b/code/ryzom/client/src/seven_zip/seven_zip.cpp index c4e2f289e..c52c790e9 100644 --- a/code/ryzom/client/src/seven_zip/seven_zip.cpp +++ b/code/ryzom/client/src/seven_zip/seven_zip.cpp @@ -35,6 +35,10 @@ using namespace std; using namespace NLMISC; +#ifdef DEBUG_NEW +#define new DEBUG_NEW +#endif + /// Input stream class for 7zip archive class CNel7ZipInStream : public ISeekInStream @@ -110,18 +114,20 @@ bool unpack7Zip(const std::string &sevenZipFile, const std::string &destFileName lookStream.realStream = &inStr; LookToRead2_CreateVTable(&lookStream, False); + size_t bufferSize = 1024; + { - lookStream.buf = (Byte*)ISzAlloc_Alloc(&allocImp, 1024); + lookStream.buf = (Byte*)ISzAlloc_Alloc(&allocImp, bufferSize); if (!lookStream.buf) { + nlerror("Unable to allocate %zu bytes", bufferSize); + return false; } - else - { - lookStream.bufSize = 1024; - lookStream.realStream = &inStr; - LookToRead2_Init(&lookStream); - } + + lookStream.bufSize = bufferSize; + lookStream.realStream = &inStr; + LookToRead2_Init(&lookStream); } CrcGenerateTable(); From 4a87a3f30b3b8c11e7774edbc05bef38be3ae368 Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 21 Apr 2019 15:25:09 +0200 Subject: [PATCH 08/14] Fixed: Wrong operator (should be = instead of ==) --HG-- branch : develop --- code/ryzom/client/src/user_entity.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ryzom/client/src/user_entity.cpp b/code/ryzom/client/src/user_entity.cpp index 6d905521c..e9167aa1d 100644 --- a/code/ryzom/client/src/user_entity.cpp +++ b/code/ryzom/client/src/user_entity.cpp @@ -3213,7 +3213,7 @@ void CUserEntity::viewMode(CUserEntity::TView viewMode, bool changeView) if(mount) mount->displayable(true); - _HiddenMount == CLFECOMMON::INVALID_SLOT; + _HiddenMount = CLFECOMMON::INVALID_SLOT; } // Change Controls. UserControls.mode(CUserControls::ThirdMode); From 0ef3f3f5a719bde61abd708cf91303143626034b Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 21 Apr 2019 15:25:31 +0200 Subject: [PATCH 09/14] Changed: Creation time --HG-- branch : develop --- .../ryzom_installer/src/filesextractor.cpp | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/code/ryzom/tools/client/ryzom_installer/src/filesextractor.cpp b/code/ryzom/tools/client/ryzom_installer/src/filesextractor.cpp index c7dba1284..e71bd1dc9 100644 --- a/code/ryzom/tools/client/ryzom_installer/src/filesextractor.cpp +++ b/code/ryzom/tools/client/ryzom_installer/src/filesextractor.cpp @@ -431,32 +431,16 @@ bool CFilesExtractor::extract7z() quint64 uncompressedSize = SzArEx_GetFileSize(&db, i); // get modification time - quint32 modificationTime = 0; + quint32 modificationTime = 0, creationTime = 0; if (SzBitWithVals_Check(&db.MTime, i)) { modificationTime = convertWindowsFileTimeToUnixTimestamp(db.MTime.Vals[i]); } - - FILETIME mtime, ctime; - FILETIME * mtimePtr = NULL; - FILETIME * ctimePtr = NULL; - - if (SzBitWithVals_Check(&db.MTime, i)) - { - const CNtfsFileTime *t = &db.MTime.Vals[i]; - mtime.dwLowDateTime = (DWORD)(t->Low); - mtime.dwHighDateTime = (DWORD)(t->High); - mtimePtr = &mtime; - } - if (SzBitWithVals_Check(&db.CTime, i)) { - const CNtfsFileTime *t = &db.CTime.Vals[i]; - ctime.dwLowDateTime = (DWORD)(t->Low); - ctime.dwHighDateTime = (DWORD)(t->High); - ctimePtr = &ctime; + creationTime = convertWindowsFileTimeToUnixTimestamp(db.CTime.Vals[i]); } if (isDir) From 6f545aedd5638e093f35f1e156d3ed4f9a91cb18 Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 21 Apr 2019 16:15:59 +0200 Subject: [PATCH 10/14] Changed: Use PCH in World Editor Primitive Plugin --HG-- branch : develop --- .../world_editor/world_editor_primitive_plugin/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/ryzom/tools/leveldesign/world_editor/world_editor_primitive_plugin/CMakeLists.txt b/code/ryzom/tools/leveldesign/world_editor/world_editor_primitive_plugin/CMakeLists.txt index eb559898b..56a7c1597 100644 --- a/code/ryzom/tools/leveldesign/world_editor/world_editor_primitive_plugin/CMakeLists.txt +++ b/code/ryzom/tools/leveldesign/world_editor/world_editor_primitive_plugin/CMakeLists.txt @@ -14,6 +14,9 @@ NL_ADD_LIB_SUFFIX(world_editor_primitive_plugin) ADD_DEFINITIONS(${MFC_DEFINITIONS} -DWIN32_DLL_EXPORTS) +IF(WITH_PCH) + ADD_NATIVE_PRECOMPILED_HEADER(world_editor_primitive_plugin ${CMAKE_CURRENT_SOURCE_DIR}/StdAfx.h ${CMAKE_CURRENT_SOURCE_DIR}/StdAfx.cpp) +ENDIF() INSTALL(TARGETS world_editor_primitive_plugin LIBRARY DESTINATION ${RYZOM_LIB_PREFIX} RUNTIME DESTINATION ${RYZOM_BIN_PREFIX} ARCHIVE DESTINATION ${RYZOM_LIB_PREFIX} COMPONENT tools3d) From a0902365aee92b18c2ec0a9941cb52cfb85280d2 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Tue, 23 Apr 2019 01:20:14 +0800 Subject: [PATCH 11/14] Add unbuild_interface --- code/nel/tools/3d/CMakeLists.txt | 1 + .../tools/3d/unbuild_interface/CMakeLists.txt | 11 ++ .../unbuild_interface/unbuild_interface.cpp | 155 ++++++++++++++++++ 3 files changed, 167 insertions(+) create mode 100644 code/nel/tools/3d/unbuild_interface/CMakeLists.txt create mode 100644 code/nel/tools/3d/unbuild_interface/unbuild_interface.cpp diff --git a/code/nel/tools/3d/CMakeLists.txt b/code/nel/tools/3d/CMakeLists.txt index 08fd9e776..683f2589a 100644 --- a/code/nel/tools/3d/CMakeLists.txt +++ b/code/nel/tools/3d/CMakeLists.txt @@ -34,6 +34,7 @@ IF(WITH_NEL_TOOLS) ENDIF() SUBDIRS( build_interface + unbuild_interface get_neighbors textures_optimizer textures_tool diff --git a/code/nel/tools/3d/unbuild_interface/CMakeLists.txt b/code/nel/tools/3d/unbuild_interface/CMakeLists.txt new file mode 100644 index 000000000..2a10976d3 --- /dev/null +++ b/code/nel/tools/3d/unbuild_interface/CMakeLists.txt @@ -0,0 +1,11 @@ +FILE(GLOB SRC *.cpp *.h) + +SOURCE_GROUP("" FILES ${SRC}) + +ADD_EXECUTABLE(unbuild_interface ${SRC}) + +TARGET_LINK_LIBRARIES(unbuild_interface nelmisc) +NL_DEFAULT_PROPS(unbuild_interface "NeL, Tools, 3D: unbuild_interface") +NL_ADD_RUNTIME_FLAGS(unbuild_interface) + +INSTALL(TARGETS unbuild_interface RUNTIME DESTINATION bin COMPONENT tools3d) diff --git a/code/nel/tools/3d/unbuild_interface/unbuild_interface.cpp b/code/nel/tools/3d/unbuild_interface/unbuild_interface.cpp new file mode 100644 index 000000000..48443cae7 --- /dev/null +++ b/code/nel/tools/3d/unbuild_interface/unbuild_interface.cpp @@ -0,0 +1,155 @@ +/** + * \file unbuild_interface.cpp + * \brief Unbuild Interface + * \date 2009-03-14 13:25GMT + * \author Jan Boon (Kaetemi) + * Unbuild Interface + */ + +/* + * Copyright (C) 2009 by authors + * + * This file is part of NEVRAX NEL. + * NEVRAX NEL is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 2 of the License, + * or (at your option) any later version. + * + * NEVRAX NEL is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NEVRAX NEL; see the file COPYING. If not, see + * . + */ + +#include + +// STL includes +#include +#include +#include +#include +#include + +// NeL includes +#include +#include +#include +#include +#include +#include +#include + +// Project includes +// ... + +using namespace std; +using namespace NLMISC; + +namespace { + +} /* anonymous namespace */ + +int main(int nNbArg, char **ppArgs) +{ + // create debug stuff + createDebug(); + + // verify all params + if (nNbArg < 3) + { + nlinfo("ERROR : Wrong number of arguments\n"); + nlinfo("USAGE : unbuild_interface \n"); + return EXIT_FAILURE; + } + string in_tga_name = string(ppArgs[1]); + if (!CFile::fileExists(in_tga_name)) + { + nlerrornoex("File %s does not exist", in_tga_name.c_str()); + return EXIT_FAILURE; + } + string in_txt_name = in_tga_name.substr(0, in_tga_name.size() - 4) + ".txt"; + if (!CFile::fileExists(in_txt_name)) + { + nlerrornoex("File %s does not exist", in_txt_name.c_str()); + return EXIT_FAILURE; + } + string out_path_maps = ppArgs[2]; + if (!CFile::isDirectory(out_path_maps)) + { + nlerrornoex("Directory %s does not exist", out_path_maps.c_str()); + return EXIT_FAILURE; + } + + // read in the tga + CBitmap in_bitmap; + try + { + CIFile in_file; + in_file.open(in_tga_name); + in_bitmap.load(in_file); + in_file.close(); + } + catch (NLMISC::Exception &e) + { + nlerrornoex("(NLMISC::Exception : %s", e.what()); + return EXIT_FAILURE; + } + + // read maps infos from txt + try + { + ifstream in_file; + in_file.open(in_txt_name.c_str()); + string line; + vector line_expl; + line_expl.reserve(5); + while (getline(in_file, line)) + { + // parse from file + line_expl.clear(); + explode(line, " ", line_expl, false); + nlassertex((line_expl.size() == 5), ("Bad line entry count")); + CVectorH vh; // x, y, z, w; + if (!fromString(line_expl[1], vh.x) + || !fromString(line_expl[2], vh.y) + || !fromString(line_expl[3], vh.z) + || !fromString(line_expl[4], vh.w)) + nlerror("Bad line formatting '%s'", line.c_str()); + vh.x *= (float)in_bitmap.getWidth(); + nlassertex((vh.x == (float)(int)vh.x), ("Bad coordinate")); + vh.y *= (float)in_bitmap.getHeight(); + nlassertex((vh.y == (float)(int)vh.y), ("Bad coordinate")); + vh.z *= (float)in_bitmap.getWidth(); + nlassertex((vh.z == (float)(int)vh.z), ("Bad coordinate")); + vh.w *= (float)in_bitmap.getHeight(); + nlassertex((vh.w == (float)(int)vh.w), ("Bad coordinate")); + nlinfo("%s %f %f %f %f", line_expl[0].c_str(), vh.x, vh.y, vh.z, vh.w); + + // write to tga + CBitmap out_bitmap; + out_bitmap.resize((sint32)vh.z - (sint32)vh.x, (sint32)vh.w - (sint32)vh.y, CBitmap::RGBA, true); + out_bitmap.blit(in_bitmap, (sint)vh.x, (sint)vh.y, (sint)vh.z - (sint)vh.x, (sint)vh.w - (sint)vh.y, 0, 0); + COFile out_file; + if (out_file.open(out_path_maps + "/" + line_expl[0])) + { + out_bitmap.writeTGA(out_file, 32); + out_file.close(); + } + else nlerror("Cannot write tga file '%s/%s'", out_path_maps.c_str(), line_expl[0].c_str()); + } + in_file.close(); + } + catch (std::exception &e) + { + nlerrornoex("std::exception : %s", e.what()); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + +/* end of file */ From c73f0d944917d8d51860430591450f490ce2635a Mon Sep 17 00:00:00 2001 From: kaetemi Date: Tue, 23 Apr 2019 01:26:35 +0800 Subject: [PATCH 12/14] Add max file library --- code/CMakeModules/FindGLIB2.cmake | 217 + code/CMakeModules/FindLIBGSF.cmake | 57 + code/CMakeModules/nel.cmake | 1 + code/nel/include/nel/misc/class_id.h | 8 + code/nel/src/misc/class_id.cpp | 36 + code/nel/tools/3d/CMakeLists.txt | 6 + .../tools/3d/build_interface/CMakeLists.txt | 2 + code/nel/tools/3d/pipeline_max/CMakeLists.txt | 39 + .../3d/pipeline_max/builtin/animatable.cpp | 173 + .../3d/pipeline_max/builtin/animatable.h | 103 + .../3d/pipeline_max/builtin/base_object.cpp | 113 + .../3d/pipeline_max/builtin/base_object.h | 89 + .../3d/pipeline_max/builtin/bitmap_tex.cpp | 59 + .../3d/pipeline_max/builtin/bitmap_tex.h | 63 + .../tools/3d/pipeline_max/builtin/builtin.cpp | 338 + .../tools/3d/pipeline_max/builtin/builtin.h | 68 + .../pipeline_max/builtin/editable_patch.cpp | 111 + .../3d/pipeline_max/builtin/editable_patch.h | 86 + .../3d/pipeline_max/builtin/geom_object.cpp | 269 + .../3d/pipeline_max/builtin/geom_object.h | 103 + .../tools/3d/pipeline_max/builtin/i_node.cpp | 218 + .../tools/3d/pipeline_max/builtin/i_node.h | 107 + .../3d/pipeline_max/builtin/modifier.cpp | 59 + .../tools/3d/pipeline_max/builtin/modifier.h | 63 + .../nel/tools/3d/pipeline_max/builtin/mtl.cpp | 59 + code/nel/tools/3d/pipeline_max/builtin/mtl.h | 63 + .../3d/pipeline_max/builtin/mtl_base.cpp | 59 + .../tools/3d/pipeline_max/builtin/mtl_base.h | 63 + .../3d/pipeline_max/builtin/multi_mtl.cpp | 59 + .../tools/3d/pipeline_max/builtin/multi_mtl.h | 67 + .../3d/pipeline_max/builtin/node_impl.cpp | 195 + .../tools/3d/pipeline_max/builtin/node_impl.h | 102 + .../tools/3d/pipeline_max/builtin/object.cpp | 113 + .../tools/3d/pipeline_max/builtin/object.h | 89 + .../3d/pipeline_max/builtin/param_block.cpp | 59 + .../3d/pipeline_max/builtin/param_block.h | 63 + .../3d/pipeline_max/builtin/param_block_2.cpp | 59 + .../3d/pipeline_max/builtin/param_block_2.h | 63 + .../3d/pipeline_max/builtin/patch_object.cpp | 111 + .../3d/pipeline_max/builtin/patch_object.h | 90 + .../3d/pipeline_max/builtin/poly_object.cpp | 147 + .../3d/pipeline_max/builtin/poly_object.h | 90 + .../pipeline_max/builtin/reference_maker.cpp | 320 + .../3d/pipeline_max/builtin/reference_maker.h | 110 + .../pipeline_max/builtin/reference_target.cpp | 113 + .../pipeline_max/builtin/reference_target.h | 90 + .../3d/pipeline_max/builtin/root_node.cpp | 117 + .../tools/3d/pipeline_max/builtin/root_node.h | 89 + .../3d/pipeline_max/builtin/scene_impl.cpp | 209 + .../3d/pipeline_max/builtin/scene_impl.h | 112 + .../tools/3d/pipeline_max/builtin/std_mat.cpp | 59 + .../tools/3d/pipeline_max/builtin/std_mat.h | 63 + .../3d/pipeline_max/builtin/std_mat_2.cpp | 59 + .../tools/3d/pipeline_max/builtin/std_mat_2.h | 68 + .../pipeline_max/builtin/storage/app_data.cpp | 507 + .../pipeline_max/builtin/storage/app_data.h | 275 + .../builtin/storage/geom_buffers.cpp | 332 + .../builtin/storage/geom_buffers.h | 134 + .../builtin/super_class_unknown.cpp | 59 + .../builtin/super_class_unknown.h | 67 + .../tools/3d/pipeline_max/builtin/texmap.cpp | 59 + .../tools/3d/pipeline_max/builtin/texmap.h | 63 + .../pipeline_max/builtin/track_view_node.cpp | 192 + .../3d/pipeline_max/builtin/track_view_node.h | 109 + .../3d/pipeline_max/builtin/tri_object.cpp | 147 + .../3d/pipeline_max/builtin/tri_object.h | 90 + code/nel/tools/3d/pipeline_max/class_data.cpp | 203 + code/nel/tools/3d/pipeline_max/class_data.h | 122 + .../3d/pipeline_max/class_directory_3.cpp | 430 + .../tools/3d/pipeline_max/class_directory_3.h | 160 + code/nel/tools/3d/pipeline_max/config.cpp | 553 + code/nel/tools/3d/pipeline_max/config.h | 245 + .../tools/3d/pipeline_max/derived_object.cpp | 55 + .../tools/3d/pipeline_max/derived_object.h | 63 + .../tools/3d/pipeline_max/dll_directory.cpp | 420 + .../nel/tools/3d/pipeline_max/dll_directory.h | 135 + .../tools/3d/pipeline_max/dll_plugin_desc.cpp | 75 + .../tools/3d/pipeline_max/dll_plugin_desc.h | 109 + .../3d/pipeline_max/epoly/editable_poly.cpp | 158 + .../3d/pipeline_max/epoly/editable_poly.h | 89 + .../nel/tools/3d/pipeline_max/epoly/epoly.cpp | 81 + code/nel/tools/3d/pipeline_max/epoly/epoly.h | 84 + code/nel/tools/3d/pipeline_max/scene.cpp | 237 + code/nel/tools/3d/pipeline_max/scene.h | 146 + .../nel/tools/3d/pipeline_max/scene_class.cpp | 288 + code/nel/tools/3d/pipeline_max/scene_class.h | 231 + .../3d/pipeline_max/scene_class_registry.cpp | 176 + .../3d/pipeline_max/scene_class_registry.h | 98 + .../3d/pipeline_max/scene_class_unknown.cpp | 114 + .../3d/pipeline_max/scene_class_unknown.h | 115 + .../tools/3d/pipeline_max/storage_array.cpp | 49 + .../nel/tools/3d/pipeline_max/storage_array.h | 217 + .../tools/3d/pipeline_max/storage_chunks.cpp | 202 + .../tools/3d/pipeline_max/storage_chunks.h | 107 + .../tools/3d/pipeline_max/storage_file.cpp | 55 + code/nel/tools/3d/pipeline_max/storage_file.h | 63 + .../tools/3d/pipeline_max/storage_object.cpp | 386 + .../tools/3d/pipeline_max/storage_object.h | 174 + .../tools/3d/pipeline_max/storage_stream.cpp | 193 + .../tools/3d/pipeline_max/storage_stream.h | 84 + .../tools/3d/pipeline_max/storage_value.cpp | 89 + .../nel/tools/3d/pipeline_max/storage_value.h | 124 + .../3d/pipeline_max/super_class_desc.cpp | 49 + .../tools/3d/pipeline_max/super_class_desc.h | 107 + code/nel/tools/3d/pipeline_max/typedefs.cpp | 49 + code/nel/tools/3d/pipeline_max/typedefs.h | 61 + .../3d/pipeline_max/update1/editable_mesh.cpp | 196 + .../3d/pipeline_max/update1/editable_mesh.h | 89 + .../tools/3d/pipeline_max/update1/update1.cpp | 81 + .../tools/3d/pipeline_max/update1/update1.h | 84 + .../3d/pipeline_max/wsm_derived_object.cpp | 55 + .../3d/pipeline_max/wsm_derived_object.h | 63 + .../tools/3d/pipeline_max_dump/CMakeLists.txt | 36 + .../class_directory_3_2010.c | 352 + .../pipeline_max_dump/class_directory_3_3.c | 346 + .../tools/3d/pipeline_max_dump/config_2010.c | 3691 +++ .../3d/pipeline_max_dump/config_2010.txt | 7192 ++++++ .../nel/tools/3d/pipeline_max_dump/config_3.c | 1798 ++ code/nel/tools/3d/pipeline_max_dump/info.txt | 1184 + code/nel/tools/3d/pipeline_max_dump/main.cpp | 374 + .../tools/3d/pipeline_max_dump/scene_2010.c | 19166 ++++++++++++++++ .../3d/pipeline_max_dump/scene_graph_5.txt | 172 + .../CMakeLists.txt | 36 + .../3d/pipeline_max_rewrite_assets/main.cpp | 1518 ++ 124 files changed, 50211 insertions(+) create mode 100644 code/CMakeModules/FindGLIB2.cmake create mode 100644 code/CMakeModules/FindLIBGSF.cmake create mode 100644 code/nel/tools/3d/pipeline_max/CMakeLists.txt create mode 100644 code/nel/tools/3d/pipeline_max/builtin/animatable.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/animatable.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/base_object.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/base_object.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/bitmap_tex.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/bitmap_tex.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/builtin.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/builtin.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/editable_patch.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/editable_patch.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/geom_object.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/geom_object.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/i_node.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/i_node.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/modifier.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/modifier.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/mtl.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/mtl.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/mtl_base.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/mtl_base.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/multi_mtl.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/multi_mtl.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/node_impl.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/node_impl.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/object.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/object.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/param_block.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/param_block.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/param_block_2.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/param_block_2.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/patch_object.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/patch_object.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/poly_object.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/poly_object.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/reference_maker.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/reference_maker.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/reference_target.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/reference_target.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/root_node.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/root_node.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/scene_impl.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/scene_impl.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/std_mat.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/std_mat.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/std_mat_2.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/std_mat_2.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/storage/app_data.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/storage/app_data.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/storage/geom_buffers.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/storage/geom_buffers.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/super_class_unknown.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/super_class_unknown.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/texmap.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/texmap.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/track_view_node.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/track_view_node.h create mode 100644 code/nel/tools/3d/pipeline_max/builtin/tri_object.cpp create mode 100644 code/nel/tools/3d/pipeline_max/builtin/tri_object.h create mode 100644 code/nel/tools/3d/pipeline_max/class_data.cpp create mode 100644 code/nel/tools/3d/pipeline_max/class_data.h create mode 100644 code/nel/tools/3d/pipeline_max/class_directory_3.cpp create mode 100644 code/nel/tools/3d/pipeline_max/class_directory_3.h create mode 100644 code/nel/tools/3d/pipeline_max/config.cpp create mode 100644 code/nel/tools/3d/pipeline_max/config.h create mode 100644 code/nel/tools/3d/pipeline_max/derived_object.cpp create mode 100644 code/nel/tools/3d/pipeline_max/derived_object.h create mode 100644 code/nel/tools/3d/pipeline_max/dll_directory.cpp create mode 100644 code/nel/tools/3d/pipeline_max/dll_directory.h create mode 100644 code/nel/tools/3d/pipeline_max/dll_plugin_desc.cpp create mode 100644 code/nel/tools/3d/pipeline_max/dll_plugin_desc.h create mode 100644 code/nel/tools/3d/pipeline_max/epoly/editable_poly.cpp create mode 100644 code/nel/tools/3d/pipeline_max/epoly/editable_poly.h create mode 100644 code/nel/tools/3d/pipeline_max/epoly/epoly.cpp create mode 100644 code/nel/tools/3d/pipeline_max/epoly/epoly.h create mode 100644 code/nel/tools/3d/pipeline_max/scene.cpp create mode 100644 code/nel/tools/3d/pipeline_max/scene.h create mode 100644 code/nel/tools/3d/pipeline_max/scene_class.cpp create mode 100644 code/nel/tools/3d/pipeline_max/scene_class.h create mode 100644 code/nel/tools/3d/pipeline_max/scene_class_registry.cpp create mode 100644 code/nel/tools/3d/pipeline_max/scene_class_registry.h create mode 100644 code/nel/tools/3d/pipeline_max/scene_class_unknown.cpp create mode 100644 code/nel/tools/3d/pipeline_max/scene_class_unknown.h create mode 100644 code/nel/tools/3d/pipeline_max/storage_array.cpp create mode 100644 code/nel/tools/3d/pipeline_max/storage_array.h create mode 100644 code/nel/tools/3d/pipeline_max/storage_chunks.cpp create mode 100644 code/nel/tools/3d/pipeline_max/storage_chunks.h create mode 100644 code/nel/tools/3d/pipeline_max/storage_file.cpp create mode 100644 code/nel/tools/3d/pipeline_max/storage_file.h create mode 100644 code/nel/tools/3d/pipeline_max/storage_object.cpp create mode 100644 code/nel/tools/3d/pipeline_max/storage_object.h create mode 100644 code/nel/tools/3d/pipeline_max/storage_stream.cpp create mode 100644 code/nel/tools/3d/pipeline_max/storage_stream.h create mode 100644 code/nel/tools/3d/pipeline_max/storage_value.cpp create mode 100644 code/nel/tools/3d/pipeline_max/storage_value.h create mode 100644 code/nel/tools/3d/pipeline_max/super_class_desc.cpp create mode 100644 code/nel/tools/3d/pipeline_max/super_class_desc.h create mode 100644 code/nel/tools/3d/pipeline_max/typedefs.cpp create mode 100644 code/nel/tools/3d/pipeline_max/typedefs.h create mode 100644 code/nel/tools/3d/pipeline_max/update1/editable_mesh.cpp create mode 100644 code/nel/tools/3d/pipeline_max/update1/editable_mesh.h create mode 100644 code/nel/tools/3d/pipeline_max/update1/update1.cpp create mode 100644 code/nel/tools/3d/pipeline_max/update1/update1.h create mode 100644 code/nel/tools/3d/pipeline_max/wsm_derived_object.cpp create mode 100644 code/nel/tools/3d/pipeline_max/wsm_derived_object.h create mode 100644 code/nel/tools/3d/pipeline_max_dump/CMakeLists.txt create mode 100644 code/nel/tools/3d/pipeline_max_dump/class_directory_3_2010.c create mode 100644 code/nel/tools/3d/pipeline_max_dump/class_directory_3_3.c create mode 100644 code/nel/tools/3d/pipeline_max_dump/config_2010.c create mode 100644 code/nel/tools/3d/pipeline_max_dump/config_2010.txt create mode 100644 code/nel/tools/3d/pipeline_max_dump/config_3.c create mode 100644 code/nel/tools/3d/pipeline_max_dump/info.txt create mode 100644 code/nel/tools/3d/pipeline_max_dump/main.cpp create mode 100644 code/nel/tools/3d/pipeline_max_dump/scene_2010.c create mode 100644 code/nel/tools/3d/pipeline_max_dump/scene_graph_5.txt create mode 100644 code/nel/tools/3d/pipeline_max_rewrite_assets/CMakeLists.txt create mode 100644 code/nel/tools/3d/pipeline_max_rewrite_assets/main.cpp diff --git a/code/CMakeModules/FindGLIB2.cmake b/code/CMakeModules/FindGLIB2.cmake new file mode 100644 index 000000000..942b04530 --- /dev/null +++ b/code/CMakeModules/FindGLIB2.cmake @@ -0,0 +1,217 @@ +# - Try to find GLib2 +# Once done this will define +# +# GLIB2_FOUND - system has GLib2 +# GLIB2_INCLUDE_DIRS - the GLib2 include directory +# GLIB2_LIBRARIES - Link these to use GLib2 +# +# HAVE_GLIB_GREGEX_H glib has gregex.h header and +# supports g_regex_match_simple +# +# Copyright (c) 2006 Andreas Schneider +# Copyright (c) 2006 Philippe Bernery +# Copyright (c) 2007 Daniel Gollub +# Copyright (c) 2007 Alban Browaeys +# Copyright (c) 2008 Michael Bell +# Copyright (c) 2008 Bjoern Ricks +# +# Redistribution and use is allowed according to the terms of the New +# BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +# + + +IF (GLIB2_LIBRARIES AND GLIB2_INCLUDE_DIRS ) + # in cache already + SET(GLIB2_FOUND TRUE) +ELSE (GLIB2_LIBRARIES AND GLIB2_INCLUDE_DIRS ) + + INCLUDE(FindPkgConfig) + + ## Glib + IF ( GLIB2_FIND_REQUIRED ) + SET( _pkgconfig_REQUIRED "REQUIRED" ) + ELSE ( GLIB2_FIND_REQUIRED ) + SET( _pkgconfig_REQUIRED "" ) + ENDIF ( GLIB2_FIND_REQUIRED ) + + IF ( GLIB2_MIN_VERSION ) + PKG_SEARCH_MODULE( GLIB2 ${_pkgconfig_REQUIRED} glib-2.0>=${GLIB2_MIN_VERSION} ) + ELSE ( GLIB2_MIN_VERSION ) + PKG_SEARCH_MODULE( GLIB2 ${_pkgconfig_REQUIRED} glib-2.0 ) + ENDIF ( GLIB2_MIN_VERSION ) + IF ( PKG_CONFIG_FOUND ) + IF ( GLIB2_FOUND ) + SET ( GLIB2_CORE_FOUND TRUE ) + ELSE ( GLIB2_FOUND ) + SET ( GLIB2_CORE_FOUND FALSE ) + ENDIF ( GLIB2_FOUND ) + ENDIF ( PKG_CONFIG_FOUND ) + + # Look for glib2 include dir and libraries w/o pkgconfig + IF ( NOT GLIB2_FOUND AND NOT PKG_CONFIG_FOUND ) + FIND_PATH( + _glibconfig_include_DIR + NAMES + glibconfig.h + PATHS + /opt/gnome/lib64 + /opt/gnome/lib + /opt/lib/ + /opt/local/lib + /sw/lib/ + /usr/lib64 + /usr/lib + /usr/local/include + ${CMAKE_LIBRARY_PATH} + PATH_SUFFIXES + glib-2.0/include + ) + + FIND_PATH( + _glib2_include_DIR + NAMES + glib.h + PATHS + /opt/gnome/include + /opt/local/include + /sw/include + /usr/include + /usr/local/include + PATH_SUFFIXES + glib-2.0 + ) + + #MESSAGE(STATUS "Glib headers: ${_glib2_include_DIR}") + + FIND_LIBRARY( + _glib2_link_DIR + NAMES + glib-2.0 + glib + PATHS + /opt/gnome/lib + /opt/local/lib + /sw/lib + /usr/lib + /usr/local/lib + ) + IF ( _glib2_include_DIR AND _glib2_link_DIR ) + SET ( _glib2_FOUND TRUE ) + ENDIF ( _glib2_include_DIR AND _glib2_link_DIR ) + + + IF ( _glib2_FOUND ) + SET ( GLIB2_INCLUDE_DIRS ${_glib2_include_DIR} ${_glibconfig_include_DIR} ) + SET ( GLIB2_LIBRARIES ${_glib2_link_DIR} ) + SET ( GLIB2_CORE_FOUND TRUE ) + ELSE ( _glib2_FOUND ) + SET ( GLIB2_CORE_FOUND FALSE ) + ENDIF ( _glib2_FOUND ) + + # Handle dependencies + # libintl + IF ( NOT LIBINTL_FOUND ) + FIND_PATH(LIBINTL_INCLUDE_DIR + NAMES + libintl.h + PATHS + /opt/gnome/include + /opt/local/include + /sw/include + /usr/include + /usr/local/include + ) + + FIND_LIBRARY(LIBINTL_LIBRARY + NAMES + intl + PATHS + /opt/gnome/lib + /opt/local/lib + /sw/lib + /usr/local/lib + /usr/lib + ) + + IF (LIBINTL_LIBRARY AND LIBINTL_INCLUDE_DIR) + SET (LIBINTL_FOUND TRUE) + ENDIF (LIBINTL_LIBRARY AND LIBINTL_INCLUDE_DIR) + ENDIF ( NOT LIBINTL_FOUND ) + + # libiconv + IF ( NOT LIBICONV_FOUND ) + FIND_PATH(LIBICONV_INCLUDE_DIR + NAMES + iconv.h + PATHS + /opt/gnome/include + /opt/local/include + /opt/local/include + /sw/include + /sw/include + /usr/local/include + /usr/include + PATH_SUFFIXES + glib-2.0 + ) + + FIND_LIBRARY(LIBICONV_LIBRARY + NAMES + iconv + PATHS + /opt/gnome/lib + /opt/local/lib + /sw/lib + /usr/lib + /usr/local/lib + ) + + IF (LIBICONV_LIBRARY AND LIBICONV_INCLUDE_DIR) + SET (LIBICONV_FOUND TRUE) + ENDIF (LIBICONV_LIBRARY AND LIBICONV_INCLUDE_DIR) + ENDIF ( NOT LIBICONV_FOUND ) + + IF (LIBINTL_FOUND) + SET (GLIB2_LIBRARIES ${GLIB2_LIBRARIES} ${LIBINTL_LIBRARY}) + SET (GLIB2_INCLUDE_DIRS ${GLIB2_INCLUDE_DIRS} ${LIBINTL_INCLUDE_DIR}) + ENDIF (LIBINTL_FOUND) + + IF (LIBICONV_FOUND) + SET (GLIB2_LIBRARIES ${GLIB2_LIBRARIES} ${LIBICONV_LIBRARY}) + SET (GLIB2_INCLUDE_DIRS ${GLIB2_INCLUDE_DIRS} ${LIBICONV_INCLUDE_DIR}) + ENDIF (LIBICONV_FOUND) + + ENDIF ( NOT GLIB2_FOUND AND NOT PKG_CONFIG_FOUND ) + ## + + IF (GLIB2_CORE_FOUND AND GLIB2_INCLUDE_DIRS AND GLIB2_LIBRARIES) + SET (GLIB2_FOUND TRUE) + ENDIF (GLIB2_CORE_FOUND AND GLIB2_INCLUDE_DIRS AND GLIB2_LIBRARIES) + + IF (GLIB2_FOUND) + IF (NOT GLIB2_FIND_QUIETLY) + MESSAGE (STATUS "Found GLib2: ${GLIB2_LIBRARIES} ${GLIB2_INCLUDE_DIRS}") + ENDIF (NOT GLIB2_FIND_QUIETLY) + ELSE (GLIB2_FOUND) + IF (GLIB2_FIND_REQUIRED) + MESSAGE (SEND_ERROR "Could not find GLib2") + ENDIF (GLIB2_FIND_REQUIRED) + ENDIF (GLIB2_FOUND) + + # show the GLIB2_INCLUDE_DIRS and GLIB2_LIBRARIES variables only in the advanced view + MARK_AS_ADVANCED(GLIB2_INCLUDE_DIRS GLIB2_LIBRARIES) + MARK_AS_ADVANCED(LIBICONV_INCLUDE_DIR LIBICONV_LIBRARY) + MARK_AS_ADVANCED(LIBINTL_INCLUDE_DIR LIBINTL_LIBRARY) + +ENDIF (GLIB2_LIBRARIES AND GLIB2_INCLUDE_DIRS) + +IF ( GLIB2_FOUND ) + # Check if system has a newer version of glib + # which supports g_regex_match_simple + INCLUDE( CheckIncludeFiles ) + SET( CMAKE_REQUIRED_INCLUDES ${GLIB2_INCLUDE_DIRS} ) + CHECK_INCLUDE_FILES ( glib/gregex.h HAVE_GLIB_GREGEX_H ) + # Reset CMAKE_REQUIRED_INCLUDES + SET( CMAKE_REQUIRED_INCLUDES "" ) +ENDIF( GLIB2_FOUND ) diff --git a/code/CMakeModules/FindLIBGSF.cmake b/code/CMakeModules/FindLIBGSF.cmake new file mode 100644 index 000000000..8d749a87d --- /dev/null +++ b/code/CMakeModules/FindLIBGSF.cmake @@ -0,0 +1,57 @@ +# - Try to find libGSF +# +# Once done this will define +# +# LIBGSF_FOUND - System has LibGSF +# LIBGSF_INCLUDE_DIR - The LibGSF include directory +# LIBGSF_LIBRARIES - The libraries needed to use LibGSF +# LIBGSF_DEFINITIONS - Compiler switches required for using LibGSF +# LIBGSF_GSF_EXECUTABLE - The archive utility +# LIBGSF_GSFOFFICETHUMBNAILER_EXECUTABLE - The office files thumbnailer for the GNOME desktop +# LIBGSF_GSFVBADUMP_EXECUTABLE - The utility to extract Visual Basic for Applications macros + +# Copyright (c) 2009, Pau Garcia i Quiles +# Based off FindLibXml2.cmake from CMake 2.6.4 by Alexander Neundorf +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +IF (LIBGSF_INCLUDE_DIR AND LIBGSF_LIBRARIES) + # in cache already + SET(LIBGSF_FIND_QUIETLY TRUE) +ENDIF (LIBGSF_INCLUDE_DIR AND LIBGSF_LIBRARIES) + +IF (NOT WIN32) + # use pkg-config to get the directories and then use these values + # in the FIND_PATH() and FIND_LIBRARY() calls + FIND_PACKAGE(PkgConfig) + PKG_CHECK_MODULES(PC_LIBGSF libgsf-1) + SET(LIBGSF_DEFINITIONS ${PC_LIBGSF_CFLAGS_OTHER}) +ENDIF (NOT WIN32) + +FIND_PATH(LIBGSF_INCLUDE_DIR gsf/gsf.h + HINTS + ${PC_LIBGSF_INCLUDEDIR} + ${PC_LIBGSF_INCLUDE_DIRS} + PATH_SUFFIXES libgsf-1 + ) + +FIND_LIBRARY(LIBGSF_LIBRARIES NAMES gsf-1 libgsf-1 + HINTS + ${PC_LIBGSF_LIBDIR} + ${PC_LIBGSF_LIBRARY_DIRS} + ) + +FIND_PROGRAM(LIBGSF_GSF_EXECUTABLE gsf) +FIND_PROGRAM(LIBGSF_GSFOFFICETHUMBNAILER_EXECUTABLE gsf-office-thumbnailer) +FIND_PROGRAM(LIBGSF_GSFVBADUMP_EXECUTABLE gsf-vba-dump) + +INCLUDE(FindPackageHandleStandardArgs) + +# handle the QUIETLY and REQUIRED arguments and set LIBGSF_FOUND to TRUE if +# all listed variables are TRUE +FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIBGSF DEFAULT_MSG LIBGSF_LIBRARIES LIBGSF_INCLUDE_DIR) + +MARK_AS_ADVANCED(LIBGSF_INCLUDE_DIR LIBGSF_LIBRARIES LIBGSF_GSF_EXECUTABLE LIBGSF_GSFOFFICETHUMBNAILER_EXECUTABLE LIBGSF_GSFVBADUMP_EXECUTABLE ) + diff --git a/code/CMakeModules/nel.cmake b/code/CMakeModules/nel.cmake index abe41ca1f..b216eb1e4 100644 --- a/code/CMakeModules/nel.cmake +++ b/code/CMakeModules/nel.cmake @@ -247,6 +247,7 @@ MACRO(NL_SETUP_DEFAULT_OPTIONS) OPTION(WITH_INSTALL_LIBRARIES "Install development files." ON ) OPTION(WITH_ASSIMP "Use assimp exporter" OFF) + OPTION(WITH_LIBGSF "Use libgsf for max file library" OFF) ### # GUI toolkits diff --git a/code/nel/include/nel/misc/class_id.h b/code/nel/include/nel/misc/class_id.h index c24ba8538..5222bad49 100644 --- a/code/nel/include/nel/misc/class_id.h +++ b/code/nel/include/nel/misc/class_id.h @@ -23,6 +23,7 @@ namespace NLMISC { + class IStream; // *************************************************************************** /** @@ -52,6 +53,13 @@ public: //CClassId& operator=(const CClassId &o) { Uid = o.Uid; return *this;} operator uint64() const {return Uid;} + inline uint32 a() const { return (uint32)(Uid >> 32); } + inline uint32 b() const { return (uint32)(Uid & 0xFFFFFFFFL); } + inline void setA(uint32 a) { Uid = ((uint64)a<<32) | (Uid & 0xFFFFFFFFL); } + inline void setB(uint32 b) { Uid = (Uid & 0xFFFFFFFF00000000L) | b; } + + void serial(NLMISC::IStream &s); + std::string toString() const; }; /** diff --git a/code/nel/src/misc/class_id.cpp b/code/nel/src/misc/class_id.cpp index 72d9cc43b..35a2e4b0e 100644 --- a/code/nel/src/misc/class_id.cpp +++ b/code/nel/src/misc/class_id.cpp @@ -18,7 +18,10 @@ #include "nel/misc/class_id.h" +#include +#include +#include "nel/misc/stream.h" #ifdef DEBUG_NEW #define new DEBUG_NEW @@ -30,6 +33,39 @@ namespace NLMISC const CClassId CClassId::Null(0); +void CClassId::serial(NLMISC::IStream &s) +{ + // s.serial(Uid); + // Backwards. + uint32 va = a(); + uint32 vb = b(); + s.serial(va); + s.serial(vb); + setA(va); + setB(vb); +} + +std::string CClassId::toString() const +{ + std::stringstream ss; + ss << "(0x"; + { + std::stringstream ss1; + ss1 << std::hex << std::setfill('0'); + ss1 << std::setw(8) << a(); + ss << ss1.str(); + } + ss << ", 0x"; + { + std::stringstream ss1; + ss1 << std::hex << std::setfill('0'); + ss1 << std::setw(8) << b(); + ss << ss1.str(); + } + ss << ")"; + return ss.str(); +} + } diff --git a/code/nel/tools/3d/CMakeLists.txt b/code/nel/tools/3d/CMakeLists.txt index 683f2589a..0b6f6540d 100644 --- a/code/nel/tools/3d/CMakeLists.txt +++ b/code/nel/tools/3d/CMakeLists.txt @@ -6,6 +6,12 @@ IF(WITH_NEL_TOOLS) mesh_utils mesh_export) ENDIF() + IF(WITH_LIBGSF) + SUBDIRS( + pipeline_max + pipeline_max_dump + pipeline_max_rewrite_assets) + ENDIF() SUBDIRS( anim_builder animation_set_builder diff --git a/code/nel/tools/3d/build_interface/CMakeLists.txt b/code/nel/tools/3d/build_interface/CMakeLists.txt index 243bc326d..113fe2b84 100644 --- a/code/nel/tools/3d/build_interface/CMakeLists.txt +++ b/code/nel/tools/3d/build_interface/CMakeLists.txt @@ -1,5 +1,7 @@ FILE(GLOB SRC *.cpp *.h) +SOURCE_GROUP("" FILES ${SRC}) + ADD_EXECUTABLE(build_interface ${SRC}) TARGET_LINK_LIBRARIES(build_interface nelmisc) diff --git a/code/nel/tools/3d/pipeline_max/CMakeLists.txt b/code/nel/tools/3d/pipeline_max/CMakeLists.txt new file mode 100644 index 000000000..f80176150 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/CMakeLists.txt @@ -0,0 +1,39 @@ + +FIND_PACKAGE(LIBGSF) + +IF (NOT (LIBGSF_INCLUDE_DIR AND LIBGSF_LIBRARIES)) + MESSAGE(FATAL_ERROR "LIBGSF not found!") +ENDIF (NOT (LIBGSF_INCLUDE_DIR AND LIBGSF_LIBRARIES)) + +FIND_PACKAGE(GLIB2) + +if (NOT GLIB2_FOUND) + MESSAGE(FATAL_ERROR "GLIB2 not found!") +ENDIF (NOT GLIB2_FOUND) + +INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS}) +INCLUDE_DIRECTORIES(${LIBGSF_INCLUDE_DIR}) + +FILE(GLOB SRCS *.cpp builtin/*.cpp builtin/storage/*.cpp update1/*.cpp epoly/*.cpp) +FILE(GLOB HDRS *.h builtin/*.h builtin/storage/*.h update1/*.h epoly/*.h) + +NL_TARGET_LIB(pipeline_max + ${SRCS} + ${HDRS} + ) + +TARGET_LINK_LIBRARIES(pipeline_max + ${LIBGSF_LIBRARIES} + ${GLIB2_LIBRARIES} + nelmisc +) + +SET_TARGET_PROPERTIES(pipeline_max PROPERTIES LINK_INTERFACE_LIBRARIES "") + +NL_DEFAULT_PROPS(pipeline_max "NeL, Tools, 3D: Pipeline Max (Library)") +NL_ADD_LIB_SUFFIX(pipeline_max) +NL_ADD_RUNTIME_FLAGS(pipeline_max) + +IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) + INSTALL(TARGETS pipeline_max LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) +ENDIF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) diff --git a/code/nel/tools/3d/pipeline_max/builtin/animatable.cpp b/code/nel/tools/3d/pipeline_max/builtin/animatable.cpp new file mode 100644 index 000000000..3bc65c181 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/animatable.cpp @@ -0,0 +1,173 @@ +/** + * \file animatable.cpp + * \brief CAnimatable + * \date 2012-08-22 08:52GMT + * \author Jan Boon (Kaetemi) + * CAnimatable + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "animatable.h" + +// STL includes + +// NeL includes +// #include + +// Project includes +#include "storage/app_data.h" + +using namespace std; +// using namespace NLMISC; + +#define PBM_ANIMATABLE_UNKNOWN2140_CHUNK_ID 0x2140 + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CAnimatable::CAnimatable(CScene *scene) : CSceneClass(scene), m_AppData(NULL) +{ + +} + +CAnimatable::~CAnimatable() +{ + if (!m_ChunksOwnsPointers) + { + delete m_Unknown2140; + m_Unknown2140 = NULL; + delete m_AppData; + m_AppData = NULL; + } +} + +const ucstring CAnimatable::DisplayName = ucstring("Animatable"); +const char *CAnimatable::InternalName = "Animatable"; +const char *CAnimatable::InternalNameUnknown = "AnimatableUnknown"; +const NLMISC::CClassId CAnimatable::ClassId = NLMISC::CClassId(0x3101497b, 0x24af711b); /* Not official, please correct */ +const TSClassId CAnimatable::SuperClassId = 0x77a60fbd; /* Not official, please correct */ +const CAnimatableClassDesc AnimatableClassDesc(&DllPluginDescBuiltin); +const CAnimatableSuperClassDesc AnimatableSuperClassDesc(&AnimatableClassDesc); + +void CAnimatable::parse(uint16 version, uint filter) +{ + CSceneClass::parse(version); + if (!m_ChunksOwnsPointers) + { + m_Unknown2140 = getChunk(PBM_ANIMATABLE_UNKNOWN2140_CHUNK_ID); + if (m_Unknown2140) + { + // nldebug("Found unknown 0x2140"); + // TODO: Put std::cout code here + } + m_AppData = static_cast(getChunk(PMBS_APP_DATA_CHUNK_ID)); + } +} + +void CAnimatable::clean() +{ + CSceneClass::clean(); + if (m_AppData) m_AppData->clean(); +} + +void CAnimatable::build(uint16 version, uint filter) +{ + CSceneClass::build(version); + if (m_Unknown2140) + { + putChunk(PBM_ANIMATABLE_UNKNOWN2140_CHUNK_ID, m_Unknown2140); + } + if (m_AppData) + { + if (m_AppData->entries().size() == 0) + { + // Discard appdata if it has no entries + delete m_AppData; + m_AppData = NULL; + } + else + { + putChunk(PMBS_APP_DATA_CHUNK_ID, m_AppData); + } + } +} + +void CAnimatable::disown() +{ + m_Unknown2140 = NULL; + m_AppData = NULL; + CSceneClass::disown(); +} + +void CAnimatable::init() +{ + CSceneClass::init(); +} + +bool CAnimatable::inherits(const NLMISC::CClassId classId) const +{ + if (classId == classDesc()->classId()) return true; + return CSceneClass::inherits(classId); +} + +const ISceneClassDesc *CAnimatable::classDesc() const +{ + return &AnimatableClassDesc; +} + +void CAnimatable::toStringLocal(std::ostream &ostream, const std::string &pad, uint filter) const +{ + CSceneClass::toStringLocal(ostream, pad); + if (m_AppData && m_AppData->entries().size() != 0) + { + ostream << "\n" << pad << "AppData: "; + m_AppData->toString(ostream, pad + "\t"); + } +} + +STORAGE::CAppData *CAnimatable::appData() +{ + if (m_ChunksOwnsPointers) { nlerror("Not parsed"); return NULL; } + if (!m_AppData) + { + m_AppData = new STORAGE::CAppData(); + m_AppData->init(); + } + return m_AppData; +} + +IStorageObject *CAnimatable::createChunkById(uint16 id, bool container) +{ + switch (id) + { + case PMBS_APP_DATA_CHUNK_ID: + return new STORAGE::CAppData; + } + return CSceneClass::createChunkById(id, container); +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/animatable.h b/code/nel/tools/3d/pipeline_max/builtin/animatable.h new file mode 100644 index 000000000..cee7e1362 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/animatable.h @@ -0,0 +1,103 @@ +/** + * \file animatable.h + * \brief CAnimatable + * \date 2012-08-22 08:52GMT + * \author Jan Boon (Kaetemi) + * CAnimatable + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_ANIMATABLE_H +#define PIPELINE_ANIMATABLE_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "../scene.h" +#include "../scene_class.h" +#include "../super_class_desc.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { +namespace STORAGE { + +class CAppData; + +} + +/** + * \brief CAnimatable + * \date 2012-08-22 08:52GMT + * \author Jan Boon (Kaetemi) + * This scene class owns the AppData chunk + */ +class CAnimatable : public CSceneClass +{ +public: + CAnimatable(CScene *scene); + virtual ~CAnimatable(); + + // class desc + static const ucstring DisplayName; + static const char *InternalName; + static const char *InternalNameUnknown; + static const NLMISC::CClassId ClassId; + static const TSClassId SuperClassId; + + // inherited + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + virtual void init(); + virtual bool inherits(const NLMISC::CClassId classId) const; + virtual const ISceneClassDesc *classDesc() const; + virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "", uint filter = 0) const; + + // public + STORAGE::CAppData *appData(); + +protected: + // inherited + virtual IStorageObject *createChunkById(uint16 id, bool container); + +private: + IStorageObject *m_Unknown2140; + STORAGE::CAppData *m_AppData; + +}; /* class CAnimatable */ + +typedef CSceneClassDesc CAnimatableClassDesc; +extern const CAnimatableClassDesc AnimatableClassDesc; +typedef CSuperClassDesc CAnimatableSuperClassDesc; +extern const CAnimatableSuperClassDesc AnimatableSuperClassDesc; + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_ANIMATABLE_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/base_object.cpp b/code/nel/tools/3d/pipeline_max/builtin/base_object.cpp new file mode 100644 index 000000000..2dfa30fbd --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/base_object.cpp @@ -0,0 +1,113 @@ +/** + * \file base_object.cpp + * \brief CBaseObject + * \date 2012-08-22 08:53GMT + * \author Jan Boon (Kaetemi) + * CBaseObject + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "base_object.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CBaseObject::CBaseObject(CScene *scene) : CReferenceTarget(scene) +{ + +} + +CBaseObject::~CBaseObject() +{ + +} + +const ucstring CBaseObject::DisplayName = ucstring("BaseObject"); +const char *CBaseObject::InternalName = "BaseObject"; +// const char *CBaseObject::InternalNameUnknown = "BaseObjectUnknown"; +const NLMISC::CClassId CBaseObject::ClassId = NLMISC::CClassId(0x71c8167a, 0x5a9f57b2); /* Not official, please correct */ +const TSClassId CBaseObject::SuperClassId = CReferenceTarget::SuperClassId; +const CBaseObjectClassDesc BaseObjectClassDesc(&DllPluginDescBuiltin); +// const CBaseObjectSuperClassDesc BaseObjectSuperClassDesc(&BaseObjectClassDesc); + +void CBaseObject::parse(uint16 version, uint filter) +{ + CReferenceTarget::parse(version); +} + +void CBaseObject::clean() +{ + CReferenceTarget::clean(); +} + +void CBaseObject::build(uint16 version, uint filter) +{ + CReferenceTarget::build(version); +} + +void CBaseObject::disown() +{ + CReferenceTarget::disown(); +} + +void CBaseObject::init() +{ + CReferenceTarget::init(); +} + +bool CBaseObject::inherits(const NLMISC::CClassId classId) const +{ + if (classId == classDesc()->classId()) return true; + return CReferenceTarget::inherits(classId); +} + +const ISceneClassDesc *CBaseObject::classDesc() const +{ + return &BaseObjectClassDesc; +} + +void CBaseObject::toStringLocal(std::ostream &ostream, const std::string &pad, uint filter) const +{ + CReferenceTarget::toStringLocal(ostream, pad); +} + +IStorageObject *CBaseObject::createChunkById(uint16 id, bool container) +{ + return CReferenceTarget::createChunkById(id, container); +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/base_object.h b/code/nel/tools/3d/pipeline_max/builtin/base_object.h new file mode 100644 index 000000000..ecd5bdb68 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/base_object.h @@ -0,0 +1,89 @@ +/** + * \file base_object.h + * \brief CBaseObject + * \date 2012-08-22 08:53GMT + * \author Jan Boon (Kaetemi) + * CBaseObject + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_BASE_OBJECT_H +#define PIPELINE_BASE_OBJECT_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "reference_target.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CBaseObject + * \date 2012-08-22 08:53GMT + * \author Jan Boon (Kaetemi) + * CBaseObject + */ +class CBaseObject : public CReferenceTarget +{ +public: + CBaseObject(CScene *scene); + virtual ~CBaseObject(); + + // class desc + static const ucstring DisplayName; + static const char *InternalName; + // static const char *InternalNameUnknown; + static const NLMISC::CClassId ClassId; + static const TSClassId SuperClassId; + + // inherited + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + virtual void init(); + virtual bool inherits(const NLMISC::CClassId classId) const; + virtual const ISceneClassDesc *classDesc() const; + virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "", uint filter = 0) const; + +protected: + // inherited + virtual IStorageObject *createChunkById(uint16 id, bool container); + +}; /* class CBaseObject */ + +typedef CSceneClassDesc CBaseObjectClassDesc; +extern const CBaseObjectClassDesc BaseObjectClassDesc; +// typedef CSuperClassDesc CBaseObjectSuperClassDesc; +// extern const CBaseObjectSuperClassDesc BaseObjectSuperClassDesc; + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_BASE_OBJECT_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/bitmap_tex.cpp b/code/nel/tools/3d/pipeline_max/builtin/bitmap_tex.cpp new file mode 100644 index 000000000..2a451279b --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/bitmap_tex.cpp @@ -0,0 +1,59 @@ +/** + * \file bitmap_tex.cpp + * \brief CBitmapTex + * \date 2012-08-22 08:56GMT + * \author Jan Boon (Kaetemi) + * CBitmapTex + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "bitmap_tex.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CBitmapTex::CBitmapTex(CScene *scene) : CTexmap(scene) +{ + +} + +CBitmapTex::~CBitmapTex() +{ + +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/bitmap_tex.h b/code/nel/tools/3d/pipeline_max/builtin/bitmap_tex.h new file mode 100644 index 000000000..559d46a3a --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/bitmap_tex.h @@ -0,0 +1,63 @@ +/** + * \file bitmap_tex.h + * \brief CBitmapTex + * \date 2012-08-22 08:56GMT + * \author Jan Boon (Kaetemi) + * CBitmapTex + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_BITMAP_TEX_H +#define PIPELINE_BITMAP_TEX_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "texmap.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CBitmapTex + * \date 2012-08-22 08:56GMT + * \author Jan Boon (Kaetemi) + * CBitmapTex + */ +class CBitmapTex : public CTexmap +{ +public: + CBitmapTex(CScene *scene); + virtual ~CBitmapTex(); + +}; /* class CBitmapTex */ + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_BITMAP_TEX_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/builtin.cpp b/code/nel/tools/3d/pipeline_max/builtin/builtin.cpp new file mode 100644 index 000000000..dafe1d5e8 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/builtin.cpp @@ -0,0 +1,338 @@ +/** + * \file builtin.cpp + * \brief CBuiltin + * \date 2012-08-22 09:42GMT + * \author Jan Boon (Kaetemi) + * CBuiltin + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "builtin.h" + +// STL includes + +// NeL includes +// #include + +// Project includes +#include "../scene_class_registry.h" + +#include "animatable.h" +#include "reference_maker.h" +#include "reference_target.h" + +#include "scene_impl.h" + +#include "i_node.h" +#include "node_impl.h" +#include "root_node.h" + +#include "track_view_node.h" + +#include "base_object.h" +#include "object.h" +#include "geom_object.h" +#include "tri_object.h" +#include "poly_object.h" +#include "patch_object.h" +#include "editable_patch.h" + +// using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +namespace { + +// 0x0 - invalid, default to reftarget +typedef CSuperClassDescUnknown CNullSuperClassDesc; +const CNullSuperClassDesc NullSuperClassDesc(&ReferenceTargetClassDesc, "NullSuperClassUnknown"); + +// 0x9003 bezier float control, subclass under control???; control is under reftarget +typedef CSuperClassDescUnknown CControlFloatSuperClassDesc; +const CControlFloatSuperClassDesc ControlFloatSuperClassDesc(&ReferenceTargetClassDesc, "ControlFloatSuperClassUnknown"); + +// 0x8 param block, under reftarget directly +typedef CSuperClassDescUnknown CParamBlockSuperClassDesc; +const CParamBlockSuperClassDesc ParamBlockSuperClassDesc(&ReferenceTargetClassDesc, "ParamBlockSuperClassUnknown"); + +// 0xc20 uv gen, sub of mtlbase +typedef CSuperClassDescUnknown CUVGenSuperClassDesc; +const CUVGenSuperClassDesc UVGenSuperClassDesc(&ReferenceTargetClassDesc, "UVGenSuperClassUnknown"); + +// 0x82 param block 2, under reftarget directly +typedef CSuperClassDescUnknown CParamBlock2SuperClassDesc; +const CParamBlock2SuperClassDesc ParamBlock2SuperClassDesc(&ReferenceTargetClassDesc, "ParamBlock2SuperClassUnknown"); + +// 0xc40 output, textureoutput???, under mtlbase +typedef CSuperClassDescUnknown CTextureOutputSuperClassDesc; +const CTextureOutputSuperClassDesc TextureOutputSuperClassDesc(&ReferenceTargetClassDesc, "TextureOutputSuperClassUnknown"); + +// 0xc10 texmap, under mtlbase +typedef CSuperClassDescUnknown CTexmapSuperClassDesc; +const CTexmapSuperClassDesc TexmapSuperClassDesc(&ReferenceTargetClassDesc, "TexmapSuperClassUnknown"); + +// 0x1080 texmap_container, 'Texmaps' under reftarget directly +typedef CSuperClassDescUnknown CTexmapContainerSuperClassDesc; +const CTexmapContainerSuperClassDesc TexmapContainerSuperClassDesc(&ReferenceTargetClassDesc, "TexmapContainerSuperClassUnknown"); + +// 0x10b0, shader, under baseshader, under special_Fx +typedef CSuperClassDescUnknown CShaderSuperClassDesc; +const CShaderSuperClassDesc ShaderSuperClassDesc(&ReferenceTargetClassDesc, "ShaderSuperClassUnknown"); + +// 0x1110, sampler, under special_fx +typedef CSuperClassDescUnknown CSamplerSuperClassDesc; +const CSamplerSuperClassDesc SamplerSuperClassDesc(&ReferenceTargetClassDesc, "SamplerSuperClassUnknown"); + +// 0xc00, mtl 'materials', under mtlbase +typedef CSuperClassDescUnknown CMtlSuperClassDesc; +const CMtlSuperClassDesc MtlSuperClassDesc(&ReferenceTargetClassDesc, "MtlSuperClassUnknown"); + +// 0xd00, soundobj, under reftarget directly +typedef CSuperClassDescUnknown CSoundObjSuperClassDesc; +const CSoundObjSuperClassDesc SoundObjSuperClassDesc(&ReferenceTargetClassDesc, "SoundObjSuperClassUnknown"); +/* +// 0x1, node; under reftarget directly; classid 1 is node, 2 is rootnode +typedef CSuperClassDescUnknown CNodeSuperClassDesc; +const CNodeSuperClassDesc NodeSuperClassDesc(&ReferenceTargetClassDesc, "NodeSuperClassUnknown"); +*/ +// 0x900b, controlposition, under control??? +typedef CSuperClassDescUnknown CControlPositionSuperClassDesc; +const CControlPositionSuperClassDesc ControlPositionSuperClassDesc(&ReferenceTargetClassDesc, "ControlPositionSuperClassUnknown"); + +// 0x900c, controlrotation, under control??? +typedef CSuperClassDescUnknown CControlRotationSuperClassDesc; +const CControlRotationSuperClassDesc ControlRotationSuperClassDesc(&ReferenceTargetClassDesc, "ControlRotationSuperClassUnknown"); + +// 0x900d, control_scale, under control??? +typedef CSuperClassDescUnknown CControlScaleSuperClassDesc; +const CControlScaleSuperClassDesc ControlScaleSuperClassDesc(&ReferenceTargetClassDesc, "ControlScaleSuperClassUnknown"); + +// 0x9008, pos/rot/scale; controltransform; matrix3; under control??? +typedef CSuperClassDescUnknown CControlTransformSuperClassDesc; +const CControlTransformSuperClassDesc ControlTransformSuperClassDesc(&ReferenceTargetClassDesc, "ControlTransformSuperClassUnknown"); + +// 0x810 - osmodifier, under modifier (physique etc, necessary for skinning) +typedef CSuperClassDescUnknown COSModifierSuperClassDesc; +const COSModifierSuperClassDesc OSModifierSuperClassDesc(&ReferenceTargetClassDesc, "OSModifierSuperClassUnknown"); + +// 0x9010 - master point controller +typedef CSuperClassDescUnknown CMasterPointControllerSuperClassDesc; +const CMasterPointControllerSuperClassDesc MasterPointControllerSuperClassDesc(&ReferenceTargetClassDesc, "MasterPointControllerSuperClassUnknown"); +/* +// 0x10 - geom object +typedef CSuperClassDescUnknown CGeomObjectSuperClassDesc; +const CGeomObjectSuperClassDesc GeomObjectSuperClassDesc(&ReferenceTargetClassDesc, "GeomObjectSuperClassUnknown"); +*/ +// 0x10f0 - layer, under reftarget directly +typedef CSuperClassDescUnknown CLayerSuperClassDesc; +const CLayerSuperClassDesc LayerSuperClassDesc(&ReferenceTargetClassDesc, "LayerSuperClassUnknown"); +/* +// 0x60 - object???, under base object +typedef CSuperClassDescUnknown CObjectSuperClassDesc; +const CObjectSuperClassDesc ObjectSuperClassDesc(&ReferenceTargetClassDesc, "ObjectSuperClassUnknown"); +*/ +// 0x50 helperobject, under object... +typedef CSuperClassDescUnknown CHelperObjectSuperClassDesc; +const CHelperObjectSuperClassDesc HelperObjectSuperClassDesc(&ReferenceTargetClassDesc, "HelperObjectSuperClassUnknown"); + +// 0x10a0 filterkernel, under specialfx (example: area filter) +typedef CSuperClassDescUnknown CFilterKernelSuperClassDesc; +const CFilterKernelSuperClassDesc FilterKernelSuperClassDesc(&ReferenceTargetClassDesc, "FilterKernelSuperClassUnknown"); + +// 0xf00 - renderer ,direct sub of reftarget +typedef CSuperClassDescUnknown CRendererSuperClassDesc; +const CRendererSuperClassDesc RendererSuperClassDesc(&ReferenceTargetClassDesc, "RendererSuperClassUnknown"); + +// 0x9005 - control point3 (also color), under control??? +typedef CSuperClassDescUnknown CControlPoint3SuperClassDesc; +const CControlPoint3SuperClassDesc ControlPoint3SuperClassDesc(&ReferenceTargetClassDesc, "ControlPoint3SuperClassUnknown"); + +// 0x1010 - atmospheric, under special effects +typedef CSuperClassDescUnknown CAtmosphericSuperClassDesc; +const CAtmosphericSuperClassDesc AtmosphericSuperClassDesc(&ReferenceTargetClassDesc, "AtmosphericSuperClassUnknown"); + +// 0x9011 - control master block 'block control', under control??? +typedef CSuperClassDescUnknown CControlMasterBlockSuperClassDesc; +const CControlMasterBlockSuperClassDesc ControlMasterBlockSuperClassDesc(&ReferenceTargetClassDesc, "ControlMasterBlockSuperClassUnknown"); + +// 0xfffffe00 - grid reference, not sure where, probably directly under reftarget +typedef CSuperClassDescUnknown CGridReferenceSuperClassDesc; +const CGridReferenceSuperClassDesc GridReferenceSuperClassDesc(&ReferenceTargetClassDesc, "GridReferenceSuperClassUnknown"); + +// 0x1090 - render effect, possibly under special fx +typedef CSuperClassDescUnknown CRenderEffectSuperClassDesc; +const CRenderEffectSuperClassDesc RenderEffectSuperClassDesc(&ReferenceTargetClassDesc, "RenderEffectSuperClassUnknown"); + +// 0x10d0 - shadow type, directly under ref target +typedef CSuperClassDescUnknown CShadowTypeSuperClassDesc; +const CShadowTypeSuperClassDesc ShadowTypeSuperClassDesc(&ReferenceTargetClassDesc, "ShadowTypeSuperClassUnknown"); + +// 0x1160 - CustAttrib, directly under ref target +typedef CSuperClassDescUnknown CCustAttribSuperClassDesc; +const CCustAttribSuperClassDesc CustAttribSuperClassDesc(&ReferenceTargetClassDesc, "CustAttribSuperClassUnknown"); + +// 0x9012 - point4list, controlpoint4, also rgba, under controll??? +typedef CSuperClassDescUnknown CControlPoint4SuperClassDesc; +const CControlPoint4SuperClassDesc ControlPoint4SuperClassDesc(&ReferenceTargetClassDesc, "ControlPoint4SuperClassUnknown"); + +// 0xb60 - userdatatype, deprecated, don't care +typedef CSuperClassDescUnknown CUserDataTypeSuperClassDesc; +const CUserDataTypeSuperClassDesc UserDataTypeSuperClassDesc(&ReferenceTargetClassDesc, "UserDataTypeSuperClassUnknown"); + +// 0x900f - usertype, don't care +typedef CSuperClassDescUnknown CUserTypeSuperClassDesc; +const CUserTypeSuperClassDesc UserTypeSuperClassDesc(&ReferenceTargetClassDesc, "UserTypeSuperClassUnknown"); + +// 0x40 - shape object (text, ...) +typedef CSuperClassDescUnknown CShapeObjectSuperClassDesc; +const CShapeObjectSuperClassDesc ShapeObjectSuperClassDesc(&GeomObjectClassDesc, "ShapeObjectSuperClassUnknown"); + +// 0x30 - light object (omni, ...) +typedef CSuperClassDescUnknown CLightObjectSuperClassDesc; +const CLightObjectSuperClassDesc LightObjectSuperClassDesc(&ObjectClassDesc, "LightObjectSuperClassUnknown"); + +// 0x20 camera - (target, ...) +typedef CSuperClassDescUnknown CCameraObjectSuperClassDesc; +const CCameraObjectSuperClassDesc CameraObjectSuperClassDesc(&ObjectClassDesc, "CameraObjectSuperClassUnknown"); + +// Creating superclass 0x820 (FFD Binding) (0xd6636ea2, 0x9aa42bf3) that does not exist = WSM, sub of modifier (under baseobj) +typedef CSuperClassDescUnknown CWSModifierSuperClassDesc; +const CWSModifierSuperClassDesc WSModifierSuperClassDesc(&BaseObjectClassDesc, "WSModifierSuperClassUnknown"); + +// Creating superclass 0x830 (FFD(Cyl)) (0xfa4700be, 0xbbe85051) that does not exist = WSMObject, sub of object +typedef CSuperClassDescUnknown CWSMObjectSuperClassDesc; +const CWSMObjectSuperClassDesc WSMObjectSuperClassDesc(&ObjectClassDesc, "WSMObjectSuperClassUnknown"); + +// Creating superclass 0xc30 (Placement) (0x00000100, 0x00000000) that does not exist | xyzgen, sub of mtlbase +typedef CSuperClassDescUnknown CXYZGenSuperClassDesc; +const CXYZGenSuperClassDesc XYZGenSuperClassDesc(&ReferenceTargetClassDesc, "XYZGenSuperClassUnknown"); + +} /* anonymous namespace */ + +CBuiltin::CBuiltin() +{ + +} + +CBuiltin::~CBuiltin() +{ + +} + + +void CBuiltin::registerClasses(CSceneClassRegistry *registry) +{ + // invalid + registry->add(&NullSuperClassDesc); + + // available + registry->add(&AnimatableClassDesc); + registry->add(&AnimatableSuperClassDesc); + registry->add(&ReferenceMakerClassDesc); + registry->add(&ReferenceMakerSuperClassDesc); + registry->add(&ReferenceTargetClassDesc); + registry->add(&ReferenceTargetSuperClassDesc); + + // scene (inh ReferenceMaker) + registry->add(&SceneImplClassDesc); + + // node (inh ReferenceTarget) + registry->add(&NodeSuperClassDesc); + registry->add(&NodeClassDesc); + { + registry->add(&NodeImplClassDesc); + registry->add(&RootNodeClassDesc); + } + + // tvnode (inh ReferenceTarget) + registry->add(&TrackViewNodeClassDesc); + + // object (inh ReferenceMaker) + registry->add(&BaseObjectClassDesc); + { + registry->add(&ObjectSuperClassDesc); + registry->add(&ObjectClassDesc); + { + registry->add(&GeomObjectSuperClassDesc); + registry->add(&GeomObjectClassDesc); + { + registry->add(&TriObjectClassDesc); + registry->add(&PolyObjectClassDesc); + registry->add(&PatchObjectClassDesc); + { + registry->add(&EditablePatchClassDesc); + } + } + } + } + + // unimplemented + registry->add(&ControlFloatSuperClassDesc); + registry->add(&ParamBlockSuperClassDesc); + registry->add(&UVGenSuperClassDesc); + registry->add(&ParamBlock2SuperClassDesc); + registry->add(&TextureOutputSuperClassDesc); + registry->add(&TexmapSuperClassDesc); + registry->add(&TexmapContainerSuperClassDesc); + registry->add(&ShaderSuperClassDesc); + registry->add(&SamplerSuperClassDesc); + registry->add(&MtlSuperClassDesc); + registry->add(&SoundObjSuperClassDesc); + // registry->add(&NodeSuperClassDesc); + registry->add(&ControlPositionSuperClassDesc); + registry->add(&ControlRotationSuperClassDesc); + registry->add(&ControlScaleSuperClassDesc); + registry->add(&ControlTransformSuperClassDesc); + registry->add(&OSModifierSuperClassDesc); + registry->add(&MasterPointControllerSuperClassDesc); + //registry->add(&GeomObjectSuperClassDesc); + registry->add(&LayerSuperClassDesc); + //registry->add(&ObjectSuperClassDesc); + registry->add(&HelperObjectSuperClassDesc); + registry->add(&FilterKernelSuperClassDesc); + registry->add(&RendererSuperClassDesc); + registry->add(&ControlPoint3SuperClassDesc); + registry->add(&AtmosphericSuperClassDesc); + registry->add(&ControlMasterBlockSuperClassDesc); + registry->add(&GridReferenceSuperClassDesc); + registry->add(&RenderEffectSuperClassDesc); + registry->add(&ShadowTypeSuperClassDesc); + registry->add(&CustAttribSuperClassDesc); + registry->add(&ControlPoint4SuperClassDesc); + registry->add(&UserDataTypeSuperClassDesc); + registry->add(&UserTypeSuperClassDesc); + registry->add(&ShapeObjectSuperClassDesc); + registry->add(&LightObjectSuperClassDesc); + registry->add(&CameraObjectSuperClassDesc); + registry->add(&WSModifierSuperClassDesc); + registry->add(&WSMObjectSuperClassDesc); + registry->add(&XYZGenSuperClassDesc); +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/builtin.h b/code/nel/tools/3d/pipeline_max/builtin/builtin.h new file mode 100644 index 000000000..8a65a223a --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/builtin.h @@ -0,0 +1,68 @@ +/** + * \file builtin.h + * \brief CBuiltin + * \date 2012-08-22 09:42GMT + * \author Jan Boon (Kaetemi) + * CBuiltin + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_BUILTIN_H +#define PIPELINE_BUILTIN_H +#include + +// STL includes + +// NeL includes + +// Project includes + +namespace PIPELINE { +namespace MAX { + +class CSceneClassRegistry; + +namespace BUILTIN { + +/** + * \brief CBuiltin + * \date 2012-08-22 09:42GMT + * \author Jan Boon (Kaetemi) + * CBuiltin + */ +class CBuiltin +{ +public: + static void registerClasses(CSceneClassRegistry *registry); + +private: + CBuiltin(); + virtual ~CBuiltin(); + +}; /* class CBuiltin */ + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_BUILTIN_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/editable_patch.cpp b/code/nel/tools/3d/pipeline_max/builtin/editable_patch.cpp new file mode 100644 index 000000000..27f427a02 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/editable_patch.cpp @@ -0,0 +1,111 @@ +/** + * \file editable_patch.cpp + * \brief CEditablePatch + * \date 2012-08-26 12:12GMT + * \author Jan Boon (Kaetemi) + * CEditablePatch + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "editable_patch.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +// using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CEditablePatch::CEditablePatch(CScene *scene) : CPatchObject(scene) +{ + +} + +CEditablePatch::~CEditablePatch() +{ + +} + +const ucstring CEditablePatch::DisplayName = ucstring("EditablePatch"); +const char *CEditablePatch::InternalName = "EditablePatch"; +const NLMISC::CClassId CEditablePatch::ClassId = NLMISC::CClassId(0x00001030, 0x00000000); +const TSClassId CEditablePatch::SuperClassId = CPatchObject::SuperClassId; +const CEditablePatchClassDesc EditablePatchClassDesc(&DllPluginDescBuiltin); + +void CEditablePatch::parse(uint16 version, uint filter) +{ + CPatchObject::parse(version); +} + +void CEditablePatch::clean() +{ + CPatchObject::clean(); +} + +void CEditablePatch::build(uint16 version, uint filter) +{ + CPatchObject::build(version); +} + +void CEditablePatch::disown() +{ + CPatchObject::disown(); +} + +void CEditablePatch::init() +{ + CPatchObject::init(); +} + +bool CEditablePatch::inherits(const NLMISC::CClassId classId) const +{ + if (classId == classDesc()->classId()) return true; + return CPatchObject::inherits(classId); +} + +const ISceneClassDesc *CEditablePatch::classDesc() const +{ + return &EditablePatchClassDesc; +} + +void CEditablePatch::toStringLocal(std::ostream &ostream, const std::string &pad, uint filter) const +{ + CPatchObject::toStringLocal(ostream, pad); +} + +IStorageObject *CEditablePatch::createChunkById(uint16 id, bool container) +{ + return CPatchObject::createChunkById(id, container); +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/editable_patch.h b/code/nel/tools/3d/pipeline_max/builtin/editable_patch.h new file mode 100644 index 000000000..60ed8dc4d --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/editable_patch.h @@ -0,0 +1,86 @@ +/** + * \file editable_patch.h + * \brief CEditablePatch + * \date 2012-08-26 12:12GMT + * \author Jan Boon (Kaetemi) + * CEditablePatch + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_EDITABLE_PATCH_H +#define PIPELINE_EDITABLE_PATCH_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "patch_object.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CEditablePatch + * \date 2012-08-26 12:12GMT + * \author Jan Boon (Kaetemi) + * CEditablePatch + */ +class CEditablePatch : public CPatchObject +{ +public: + CEditablePatch(CScene *scene); + virtual ~CEditablePatch(); + + // class desc + static const ucstring DisplayName; + static const char *InternalName; + static const NLMISC::CClassId ClassId; + static const TSClassId SuperClassId; + + // inherited + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + virtual void init(); + virtual bool inherits(const NLMISC::CClassId classId) const; + virtual const ISceneClassDesc *classDesc() const; + virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "", uint filter = 0) const; + +protected: + // inherited + virtual IStorageObject *createChunkById(uint16 id, bool container); + +}; /* class CEditablePatch */ + +typedef CSceneClassDesc CEditablePatchClassDesc; +extern const CEditablePatchClassDesc EditablePatchClassDesc; + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_EDITABLE_PATCH_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/geom_object.cpp b/code/nel/tools/3d/pipeline_max/builtin/geom_object.cpp new file mode 100644 index 000000000..76bb5a4aa --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/geom_object.cpp @@ -0,0 +1,269 @@ +/** + * \file geom_object.cpp + * \brief CGeomGeomObject + * \date 2012-08-22 08:58GMT + * \author Jan Boon (Kaetemi) + * CGeomGeomObject + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "geom_object.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +// using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +#define PMB_GEOM_UNKNOWN0900_CHUNK_ID 0x0900 +#define PMB_GEOM_BUFFERS_CHUNK_ID 0x08fe + +CGeomObject::CGeomObject(CScene *scene) : CObject(scene), m_Unknown0900(NULL), m_GeomBuffers(NULL) +{ + +} + +CGeomObject::~CGeomObject() +{ + if (!m_ChunksOwnsPointers) + { + m_Unknown0900 = NULL; + m_GeomBuffers = NULL; + } +} + +const ucstring CGeomObject::DisplayName = ucstring("GeomObject"); +const char *CGeomObject::InternalName = "GeomObject"; +const char *CGeomObject::InternalNameUnknown = "GeomObjectUnknown"; +const NLMISC::CClassId CGeomObject::ClassId = NLMISC::CClassId(0x37097c44, 0x38aa3f24); /* Not official, please correct */ +const TSClassId CGeomObject::SuperClassId = 0x00000010; +const CGeomObjectClassDesc GeomObjectClassDesc(&DllPluginDescBuiltin); +const CGeomObjectSuperClassDesc GeomObjectSuperClassDesc(&GeomObjectClassDesc); + +void CGeomObject::parse(uint16 version, uint filter) +{ + if (filter == 0) + { + CObject::parse(version); + } + else if (filter == PMB_GEOM_OBJECT_PARSE_FILTER) + { + if (!m_ChunksOwnsPointers) + { + m_Unknown0900 = getChunk(PMB_GEOM_UNKNOWN0900_CHUNK_ID); + m_GeomBuffers = static_cast(getChunk(PMB_GEOM_BUFFERS_CHUNK_ID)); + } + } +} + +void CGeomObject::clean() +{ + CObject::clean(); +} + +void CGeomObject::build(uint16 version, uint filter) +{ + if (filter == 0) + { + CObject::build(version); + } + else if (filter == PMB_GEOM_OBJECT_PARSE_FILTER) + { + if (m_Unknown0900) putChunk(PMB_GEOM_UNKNOWN0900_CHUNK_ID, m_Unknown0900); + if (m_GeomBuffers) putChunk(PMB_GEOM_BUFFERS_CHUNK_ID, m_GeomBuffers); + } +} + +void CGeomObject::disown() +{ + m_Unknown0900 = NULL; + m_GeomBuffers = NULL; + CObject::disown(); +} + +void CGeomObject::init() +{ + CObject::init(); +} + +bool CGeomObject::inherits(const NLMISC::CClassId classId) const +{ + if (classId == classDesc()->classId()) return true; + return CObject::inherits(classId); +} + +const ISceneClassDesc *CGeomObject::classDesc() const +{ + return &GeomObjectClassDesc; +} + +void CGeomObject::toStringLocal(std::ostream &ostream, const std::string &pad, uint filter) const +{ + if (filter == 0) + { + CObject::toStringLocal(ostream, pad); + } + else if (filter == PMB_GEOM_OBJECT_PARSE_FILTER) + { + std::string padpad = pad + "\t"; + if (m_Unknown0900) + { + ostream << "\n" << pad << "GeomObject Unknown 0x0900: "; + m_Unknown0900->toString(ostream, padpad); + } + if (m_GeomBuffers) + { + ostream << "\n" << pad << "GeomBuffers: "; + m_GeomBuffers->toString(ostream, padpad); + } + } +} + +inline uint32 rrsub(uint32 v, uint32 size) +{ + if (v) return v - 1; + return size - 1; +} + +inline uint32 rradd(uint32 v, uint32 size) +{ + uint32 vp = v + 1; + if (vp != size) return vp; + return 0; +} + +void CGeomObject::triangulatePolyFace(std::vector &triangles, const STORAGE::CGeomPolyFaceInfo &polyFace) +{ + nlassert(polyFace.Vertices.size() >= 3); + nlassert(polyFace.Triangulation.size() == polyFace.Vertices.size() - 3); + uint nbVert = polyFace.Vertices.size(); + uint nbCuts = polyFace.Triangulation.size(); + uint nbTriangles = 0; + + // This code creates a matrix, aka a table, of all possible paths + // that can be traveled to get directly from one vertex to another + // over an egde. + // Outer edges of the polygon are one-way, backwards. + // Cut edges can be traveled both ways. + // Each edge direction can only be traveled by one triangle. + // Ingenious, if I may say so myself. + // Bad performance by std::vector, though. + std::vector > from_to; + from_to.resize(nbVert); + for (uint i = 0; i < nbVert; ++i) + { + from_to[i].resize(nbVert); + for (uint j = 0; j < nbVert; ++j) + { + from_to[i][j] = false; + } + // Can travel backwards over the outer edge + from_to[i][rrsub(i, nbVert)] = true; + } + for (uint i = 0; i < nbCuts; ++i) + { + // Can travel both ways over cuts, but the first direction is handled directly! + // from_to[polyFace.Triangulation[i].first][polyFace.Triangulation[i].second] = true; + from_to[polyFace.Triangulation[i].second][polyFace.Triangulation[i].first] = true; + } + // Triangulate all cuts, this assumes cuts are in the direction + // of a triangle that is not already handled by another cut... + for (uint i = 0; i < nbCuts; ++i) + { + uint32 a = polyFace.Triangulation[i].first; + uint32 b = polyFace.Triangulation[i].second; + // from_to[polyFace.Triangulation[i].first][polyFace.Triangulation[i].second] = false; // handled! + // Try to find a path that works + for (uint c = 0; c < nbVert; ++c) + { + // Can we make a triangle + if (from_to[b][c] && from_to[c][a]) + { + STORAGE::CGeomTriIndex tri; + tri.a = polyFace.Vertices[c]; + tri.b = polyFace.Vertices[b]; + tri.c = polyFace.Vertices[a]; + triangles.push_back(tri); + ++nbTriangles; + // nldebug("add tri from cut"); + from_to[b][c] = false; + from_to[c][a] = false; + break; + } + } + } + // Find... The Last Triangle + for (uint a = 0; a < nbVert; ++a) + { + uint b = rrsub(a, nbVert); + // Can we still travel backwards over the outer edge? + if (from_to[a][b]) + { + for (uint c = 0; c < nbVert; ++c) + { + // Can we make a triangle + if (from_to[b][c] && from_to[c][a]) + { + STORAGE::CGeomTriIndex tri; + tri.a = polyFace.Vertices[c]; + tri.b = polyFace.Vertices[b]; + tri.c = polyFace.Vertices[a]; + triangles.push_back(tri); + ++nbTriangles; + // nldebug("add final tri"); + from_to[b][c] = false; + from_to[c][a] = false; + break; + } + } + } + } + // nldebug("triangles: %i", nbTriangles); + // nldebug("cuts: %i", nbCuts); + nlassert(nbTriangles == nbCuts + 1); +} + +IStorageObject *CGeomObject::createChunkById(uint16 id, bool container) +{ + switch (id) + { + case PMB_GEOM_UNKNOWN0900_CHUNK_ID: + return new CStorageArray(); + case PMB_GEOM_BUFFERS_CHUNK_ID: + return new STORAGE::CGeomBuffers(); + } + return CObject::createChunkById(id, container); +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/geom_object.h b/code/nel/tools/3d/pipeline_max/builtin/geom_object.h new file mode 100644 index 000000000..5415ddca3 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/geom_object.h @@ -0,0 +1,103 @@ +/** + * \file geom_object.h + * \brief CGeomGeomObject + * \date 2012-08-22 08:58GMT + * \author Jan Boon (Kaetemi) + * CGeomGeomObject + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_GEOM_OBJECT_H +#define PIPELINE_GEOM_OBJECT_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "object.h" +#include "storage/geom_buffers.h" + +/// Must be passed to the parse and build functions by +/// inheriting classes to parse the actual geom object. +#define PMB_GEOM_OBJECT_PARSE_FILTER 0x432a4da6 + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CGeomGeomObject + * \date 2012-08-22 08:58GMT + * \author Jan Boon (Kaetemi) + * CGeomGeomObject + */ +class CGeomObject : public CObject +{ +public: + CGeomObject(CScene *scene); + virtual ~CGeomObject(); + + // class desc + static const ucstring DisplayName; + static const char *InternalName; + static const char *InternalNameUnknown; + static const NLMISC::CClassId ClassId; + static const TSClassId SuperClassId; + + // inherited + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + virtual void init(); + virtual bool inherits(const NLMISC::CClassId classId) const; + virtual const ISceneClassDesc *classDesc() const; + virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "", uint filter = 0) const; + + static void triangulatePolyFace(std::vector &triangles, const STORAGE::CGeomPolyFaceInfo &polyFace); + + // read access + inline STORAGE::CGeomBuffers *geomBuffers() const { return m_GeomBuffers; } + +protected: + // inherited + virtual IStorageObject *createChunkById(uint16 id, bool container); + +private: + IStorageObject *m_Unknown0900; + STORAGE::CGeomBuffers *m_GeomBuffers; + +}; /* class CGeomObject */ + +typedef CSceneClassDesc CGeomObjectClassDesc; +extern const CGeomObjectClassDesc GeomObjectClassDesc; +typedef CSuperClassDesc CGeomObjectSuperClassDesc; +extern const CGeomObjectSuperClassDesc GeomObjectSuperClassDesc; + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_GEOM_OBJECT_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/i_node.cpp b/code/nel/tools/3d/pipeline_max/builtin/i_node.cpp new file mode 100644 index 000000000..b24825c26 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/i_node.cpp @@ -0,0 +1,218 @@ +/** + * \file i_node.cpp + * \brief INode + * \date 2012-08-22 19:45GMT + * \author Jan Boon (Kaetemi) + * INode + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "i_node.h" + +// STL includes +#include + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +INode::INode(CScene *scene) : CReferenceTarget(scene) +{ + +} + +INode::~INode() +{ + +} + +const ucstring INode::DisplayName = ucstring("Node Interface"); +const char *INode::InternalName = "Node"; +const char *INode::InternalNameUnknown = "NodeUnknown"; +const NLMISC::CClassId INode::ClassId = NLMISC::CClassId(0x8f5b13, 0x624d477d); /* Not official, please correct */ +const TSClassId INode::SuperClassId = 0x00000001; +const CNodeClassDesc NodeClassDesc(&DllPluginDescBuiltin); +const CNodeSuperClassDesc NodeSuperClassDesc(&NodeClassDesc); + +void INode::parse(uint16 version, uint filter) +{ + CReferenceTarget::parse(version); +} + +void INode::clean() +{ + CReferenceTarget::clean(); +} + +void INode::build(uint16 version, uint filter) +{ + CReferenceTarget::build(version); +} + +void INode::disown() +{ + CReferenceTarget::disown(); +} + +void INode::init() +{ + CReferenceTarget::init(); +} + +bool INode::inherits(const NLMISC::CClassId classId) const +{ + if (classId == classDesc()->classId()) return true; + return CReferenceTarget::inherits(classId); +} + +const ISceneClassDesc *INode::classDesc() const +{ + return &NodeClassDesc; +} + +void INode::toStringLocal(std::ostream &ostream, const std::string &pad, uint filter) const +{ + CReferenceTarget::toStringLocal(ostream, pad); + // Print the implied connected children + ostream << "\n" << pad << "Children: IMPLICIT { "; + uint i = 0; + for (std::set >::iterator it = m_Children.begin(), end = m_Children.end(); it != end; ++it) + { + INode *node = (*it); + nlassert(node); + if (node) + { + ostream << "\n" << pad << "\t" << i << ": "; + ostream << "(" << ucstring(node->classDesc()->displayName()).toUtf8() << ", " << node->classDesc()->classId().toString() << ") "; + ostream << node->userName().toUtf8() << " "; + } + else + { + ostream << "\n" << pad << "\t" << i << ": NULL "; + } + ++i; + } + ostream << "} "; +} + +INode *INode::parent() +{ + nlerror("Unkown node class, cannot get parent node"); + return NULL; +} + +void INode::setParent(INode *node) +{ + nlerror("Unkown node class, cannot set parent node"); +} + +void INode::addChild(INode *node) +{ + m_Children.insert(node); +} + +void INode::removeChild(INode *node) +{ + m_Children.erase(node); +} + +const ucstring &INode::userName() const +{ + static const ucstring v = ucstring("Invalid INode"); + return v; +} + +INode *INode::find(const ucstring &userName) const +{ + ucstring unl = NLMISC::toLower(userName); + for (std::set >::iterator it = m_Children.begin(), end = m_Children.end(); it != end; ++it) + { + INode *node = (*it); + nlassert(node); + if (NLMISC::toLower(node->userName()) == unl) + return node; + } + return NULL; +} + +void INode::dumpNodes(std::ostream &ostream, const std::string &pad) const +{ + ostream << " " << userName().toUtf8() << " [" << m_Children.size() << "] { "; + CReferenceMaker *object = getReference(1); + if (object) // TODO: Implement! + { + ostream << "\n" << pad << "Object: "; + ostream << " "; + ostream << ucstring(object->classDesc()->displayName()).toUtf8() << " "; + } + uint i = 0 ; + std::string padpad = pad + "\t"; + for (std::set >::iterator it = m_Children.begin(), end = m_Children.end(); it != end; ++it) + { + INode *node = (*it); + nlassert(node); + ostream << "\n" << pad << i << ": "; + node->dumpNodes(ostream, padpad); + ++i; + } + ostream << "} "; +} + +IStorageObject *INode::createChunkById(uint16 id, bool container) +{ + return CReferenceTarget::createChunkById(id, container); +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/i_node.h b/code/nel/tools/3d/pipeline_max/builtin/i_node.h new file mode 100644 index 000000000..1e033a5ca --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/i_node.h @@ -0,0 +1,107 @@ +/** + * \file i_node.h + * \brief INode + * \date 2012-08-22 19:45GMT + * \author Jan Boon (Kaetemi) + * INode + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_I_NODE_H +#define PIPELINE_I_NODE_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "reference_target.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief INode + * \date 2012-08-22 19:45GMT + * \author Jan Boon (Kaetemi) + * INode + */ +class INode : public CReferenceTarget +{ +public: + INode(CScene *scene); + virtual ~INode(); + + // class desc + static const ucstring DisplayName; + static const char *InternalName; + static const char *InternalNameUnknown; + static const NLMISC::CClassId ClassId; + static const TSClassId SuperClassId; + + // inherited + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + virtual void init(); + virtual bool inherits(const NLMISC::CClassId classId) const; + virtual const ISceneClassDesc *classDesc() const; + virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "", uint filter = 0) const; + + // node interface + virtual INode *parent(); + virtual void setParent(INode *node); + virtual void addChild(INode *node); + virtual void removeChild(INode *node); // does not delete + virtual const ucstring &userName() const; + INode *find(const ucstring &userName) const; + + // dump + void dumpNodes(std::ostream &ostream, const std::string &pad = "") const; + + // read access + /// The children that are linked to this node by the parent tag + inline const std::set > &children() const { return m_Children; } + +protected: + // inherited + virtual IStorageObject *createChunkById(uint16 id, bool container); + +protected: + std::set > m_Children; + +}; /* class INode */ + +typedef CSceneClassDesc CNodeClassDesc; +extern const CNodeClassDesc NodeClassDesc; +typedef CSuperClassDesc CNodeSuperClassDesc; +extern const CNodeSuperClassDesc NodeSuperClassDesc; + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_I_NODE_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/modifier.cpp b/code/nel/tools/3d/pipeline_max/builtin/modifier.cpp new file mode 100644 index 000000000..d21db02da --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/modifier.cpp @@ -0,0 +1,59 @@ +/** + * \file modifier.cpp + * \brief CModifier + * \date 2012-08-22 08:59GMT + * \author Jan Boon (Kaetemi) + * CModifier + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "modifier.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CModifier::CModifier(CScene *scene) : CBaseObject(scene) +{ + +} + +CModifier::~CModifier() +{ + +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/modifier.h b/code/nel/tools/3d/pipeline_max/builtin/modifier.h new file mode 100644 index 000000000..4e7ab45b3 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/modifier.h @@ -0,0 +1,63 @@ +/** + * \file modifier.h + * \brief CModifier + * \date 2012-08-22 08:59GMT + * \author Jan Boon (Kaetemi) + * CModifier + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_MODIFIER_H +#define PIPELINE_MODIFIER_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "base_object.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CModifier + * \date 2012-08-22 08:59GMT + * \author Jan Boon (Kaetemi) + * CModifier + */ +class CModifier : public CBaseObject +{ +public: + CModifier(CScene *scene); + virtual ~CModifier(); + +}; /* class CModifier */ + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_MODIFIER_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/mtl.cpp b/code/nel/tools/3d/pipeline_max/builtin/mtl.cpp new file mode 100644 index 000000000..431b978f5 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/mtl.cpp @@ -0,0 +1,59 @@ +/** + * \file mtl.cpp + * \brief CMtl + * \date 2012-08-22 08:54GMT + * \author Jan Boon (Kaetemi) + * CMtl + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "mtl.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CMtl::CMtl(CScene *scene) : CMtlBase(scene) +{ + +} + +CMtl::~CMtl() +{ + +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/mtl.h b/code/nel/tools/3d/pipeline_max/builtin/mtl.h new file mode 100644 index 000000000..ec7e927fa --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/mtl.h @@ -0,0 +1,63 @@ +/** + * \file mtl.h + * \brief CMtl + * \date 2012-08-22 08:54GMT + * \author Jan Boon (Kaetemi) + * CMtl + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_MTL_H +#define PIPELINE_MTL_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "mtl_base.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CMtl + * \date 2012-08-22 08:54GMT + * \author Jan Boon (Kaetemi) + * CMtl + */ +class CMtl : public CMtlBase +{ +public: + CMtl(CScene *scene); + virtual ~CMtl(); + +}; /* class CMtl */ + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_MTL_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/mtl_base.cpp b/code/nel/tools/3d/pipeline_max/builtin/mtl_base.cpp new file mode 100644 index 000000000..6cbb25319 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/mtl_base.cpp @@ -0,0 +1,59 @@ +/** + * \file mtl_base.cpp + * \brief CMtlBase + * \date 2012-08-22 08:53GMT + * \author Jan Boon (Kaetemi) + * CMtlBase + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "mtl_base.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CMtlBase::CMtlBase(CScene *scene) : CReferenceTarget(scene) +{ + +} + +CMtlBase::~CMtlBase() +{ + +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/mtl_base.h b/code/nel/tools/3d/pipeline_max/builtin/mtl_base.h new file mode 100644 index 000000000..f5fd0e646 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/mtl_base.h @@ -0,0 +1,63 @@ +/** + * \file mtl_base.h + * \brief CMtlBase + * \date 2012-08-22 08:53GMT + * \author Jan Boon (Kaetemi) + * CMtlBase + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_MTL_BASE_H +#define PIPELINE_MTL_BASE_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "reference_target.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CMtlBase + * \date 2012-08-22 08:53GMT + * \author Jan Boon (Kaetemi) + * CMtlBase + */ +class CMtlBase : public CReferenceTarget +{ +public: + CMtlBase(CScene *scene); + virtual ~CMtlBase(); + +}; /* class CMtlBase */ + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_MTL_BASE_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/multi_mtl.cpp b/code/nel/tools/3d/pipeline_max/builtin/multi_mtl.cpp new file mode 100644 index 000000000..ca9c8c9d2 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/multi_mtl.cpp @@ -0,0 +1,59 @@ +/** + * \file multi_mtl.cpp + * \brief CMultiMtl + * \date 2012-08-22 08:55GMT + * \author Jan Boon (Kaetemi) + * CMultiMtl + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "multi_mtl.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CMultiMtl::CMultiMtl() +{ + +} + +CMultiMtl::~CMultiMtl() +{ + +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/multi_mtl.h b/code/nel/tools/3d/pipeline_max/builtin/multi_mtl.h new file mode 100644 index 000000000..6cfe11ab2 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/multi_mtl.h @@ -0,0 +1,67 @@ +/** + * \file multi_mtl.h + * \brief CMultiMtl + * \date 2012-08-22 08:55GMT + * \author Jan Boon (Kaetemi) + * CMultiMtl + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_MULTI_MTL_H +#define PIPELINE_MULTI_MTL_H +#include + +// STL includes + +// NeL includes + +// Project includes + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CMultiMtl + * \date 2012-08-22 08:55GMT + * \author Jan Boon (Kaetemi) + * CMultiMtl + */ +class CMultiMtl +{ +protected: + // pointers + // ... + + // instances + // ... +public: + CMultiMtl(); + virtual ~CMultiMtl(); +}; /* class CMultiMtl */ + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_MULTI_MTL_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/node_impl.cpp b/code/nel/tools/3d/pipeline_max/builtin/node_impl.cpp new file mode 100644 index 000000000..4adc4bc4f --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/node_impl.cpp @@ -0,0 +1,195 @@ +/** + * \file node_impl.cpp + * \brief CNodeImpl + * \date 2012-08-22 20:01GMT + * \author Jan Boon (Kaetemi) + * CNodeImpl + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "node_impl.h" + +// STL includes +#include + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +#define PMB_NODE_VERSION_CHUNK_ID 0x09ce +#define PMB_NODE_PARENT_CHUNK_ID 0x0960 +#define PMB_NODE_NAME_CHUNK_ID 0x0962 + +CNodeImpl::CNodeImpl(CScene *scene) : INode(scene), m_NodeVersion(0), m_ParentFlags(0), m_UserName(ucstring("Untitled Node")) +{ + +} + +CNodeImpl::~CNodeImpl() +{ + +} + +const ucstring CNodeImpl::DisplayName = ucstring("Node"); +const char *CNodeImpl::InternalName = "NodeImpl"; +const NLMISC::CClassId CNodeImpl::ClassId = NLMISC::CClassId(0x00000001, 0x00000000); +const TSClassId CNodeImpl::SuperClassId = INode::SuperClassId; +const CNodeImplClassDesc NodeImplClassDesc(&DllPluginDescBuiltin); + +void CNodeImpl::parse(uint16 version, uint filter) +{ + INode::parse(version); + if (!m_ChunksOwnsPointers) + { + m_NodeVersion = getChunkValue(PMB_NODE_VERSION_CHUNK_ID); + + CStorageArray *parent = static_cast *>(getChunk(PMB_NODE_PARENT_CHUNK_ID)); + nlassert(parent); + nlassert(parent->Value.size() == 2); + setParent(dynamic_cast(container()->getByStorageIndex((sint32)parent->Value[0]))); + nlassert(m_Parent); + m_ParentFlags = parent->Value[1]; + m_ArchivedChunks.push_back(parent); + + m_UserName = getChunkValue(PMB_NODE_NAME_CHUNK_ID); + } +} + +void CNodeImpl::clean() +{ + INode::clean(); +} + +void CNodeImpl::build(uint16 version, uint filter) +{ + INode::build(version); + + putChunkValue(PMB_NODE_VERSION_CHUNK_ID, m_NodeVersion); + + CStorageArray *parent = new CStorageArray(); + parent->Value.resize(2); + parent->Value[0] = container()->getOrCreateStorageIndex(m_Parent); + parent->Value[1] = m_ParentFlags; + m_ArchivedChunks.push_back(parent); + putChunk(PMB_NODE_PARENT_CHUNK_ID, parent); + + putChunkValue(PMB_NODE_NAME_CHUNK_ID, m_UserName); +} + +void CNodeImpl::disown() +{ + m_NodeVersion = 0; + setParent(NULL); + m_ParentFlags = 0; + m_UserName = ucstring("Untitled Node"); + + INode::disown(); +} + +void CNodeImpl::init() +{ + INode::init(); +} + +bool CNodeImpl::inherits(const NLMISC::CClassId classId) const +{ + if (classId == classDesc()->classId()) return true; + return INode::inherits(classId); +} + +const ISceneClassDesc *CNodeImpl::classDesc() const +{ + return &NodeImplClassDesc; +} + +void CNodeImpl::toStringLocal(std::ostream &ostream, const std::string &pad, uint filter) const +{ + INode::toStringLocal(ostream, pad); + ostream << "\n" << pad << "NodeVersion: " << m_NodeVersion; + ostream << "\n" << pad << "Parent: "; + INode *parent = m_Parent; + nlassert(parent); + if (parent) + { + ostream << " "; + ostream << "(" << ucstring(parent->classDesc()->displayName()).toUtf8() << ", " << parent->classDesc()->classId().toString() << ") "; + ostream << parent->userName().toUtf8(); + } + else + { + ostream << "NULL"; + } + ostream << "\n" << pad << "ParentFlags: " << m_ParentFlags; + ostream << "\n" << pad << "UserName: " << m_UserName.toUtf8() << " "; +} + +INode *CNodeImpl::parent() +{ + return m_Parent; +} + +void CNodeImpl::setParent(INode *node) +{ + if (m_Parent) m_Parent->removeChild(this); + m_Parent = node; + if (node) node->addChild(this); +} + +const ucstring &CNodeImpl::userName() const +{ + return m_UserName; +} + +IStorageObject *CNodeImpl::createChunkById(uint16 id, bool container) +{ + switch (id) + { + case PMB_NODE_VERSION_CHUNK_ID: + return new CStorageValue(); + case PMB_NODE_PARENT_CHUNK_ID: + return new CStorageArray(); + case PMB_NODE_NAME_CHUNK_ID: + return new CStorageValue(); + } + return INode::createChunkById(id, container); +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/node_impl.h b/code/nel/tools/3d/pipeline_max/builtin/node_impl.h new file mode 100644 index 000000000..69a70fd7d --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/node_impl.h @@ -0,0 +1,102 @@ +/** + * \file node_impl.h + * \brief CNodeImpl + * \date 2012-08-22 20:01GMT + * \author Jan Boon (Kaetemi) + * CNodeImpl + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_NODE_IMPL_H +#define PIPELINE_NODE_IMPL_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "i_node.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CNodeImpl + * \date 2012-08-22 20:01GMT + * \author Jan Boon (Kaetemi) + * CNodeImpl + */ +class CNodeImpl : public INode +{ +public: + CNodeImpl(CScene *scene); + virtual ~CNodeImpl(); + + // class desc + static const ucstring DisplayName; + static const char *InternalName; + static const NLMISC::CClassId ClassId; + static const TSClassId SuperClassId; + + // inherited + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + virtual void init(); + virtual bool inherits(const NLMISC::CClassId classId) const; + virtual const ISceneClassDesc *classDesc() const; + virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "", uint filter = 0) const; + + // node interface + virtual INode *parent(); + virtual void setParent(INode *node); + // virtual void addChild(INode *node); + // virtual void removeChild(INode *node); // does not delete + virtual const ucstring &userName() const; + + // read access + inline uint32 nodeVersion() const { return m_NodeVersion; } + +protected: + // inherited + virtual IStorageObject *createChunkById(uint16 id, bool container); + +private: + uint32 m_NodeVersion; + NLMISC::CRefPtr m_Parent; + uint32 m_ParentFlags; + ucstring m_UserName; + +}; /* class CNodeImpl */ + +typedef CSceneClassDesc CNodeImplClassDesc; +extern const CNodeImplClassDesc NodeImplClassDesc; + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_NODE_IMPL_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/object.cpp b/code/nel/tools/3d/pipeline_max/builtin/object.cpp new file mode 100644 index 000000000..d44df1c13 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/object.cpp @@ -0,0 +1,113 @@ +/** + * \file object.cpp + * \brief CObject + * \date 2012-08-22 09:13GMT + * \author Jan Boon (Kaetemi) + * CObject + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "object.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CObject::CObject(CScene *scene) : CBaseObject(scene) +{ + +} + +CObject::~CObject() +{ + +} + +const ucstring CObject::DisplayName = ucstring("Object"); +const char *CObject::InternalName = "Object"; +const char *CObject::InternalNameUnknown = "ObjectUnknown"; +const NLMISC::CClassId CObject::ClassId = NLMISC::CClassId(0x14021ed1, 0x33837a80); /* Not official, please correct */ +const TSClassId CObject::SuperClassId = 0x00000060; +const CObjectClassDesc ObjectClassDesc(&DllPluginDescBuiltin); +const CObjectSuperClassDesc ObjectSuperClassDesc(&ObjectClassDesc); + +void CObject::parse(uint16 version, uint filter) +{ + CBaseObject::parse(version); +} + +void CObject::clean() +{ + CBaseObject::clean(); +} + +void CObject::build(uint16 version, uint filter) +{ + CBaseObject::build(version); +} + +void CObject::disown() +{ + CBaseObject::disown(); +} + +void CObject::init() +{ + CBaseObject::init(); +} + +bool CObject::inherits(const NLMISC::CClassId classId) const +{ + if (classId == classDesc()->classId()) return true; + return CBaseObject::inherits(classId); +} + +const ISceneClassDesc *CObject::classDesc() const +{ + return &ObjectClassDesc; +} + +void CObject::toStringLocal(std::ostream &ostream, const std::string &pad, uint filter) const +{ + CBaseObject::toStringLocal(ostream, pad); +} + +IStorageObject *CObject::createChunkById(uint16 id, bool container) +{ + return CBaseObject::createChunkById(id, container); +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/object.h b/code/nel/tools/3d/pipeline_max/builtin/object.h new file mode 100644 index 000000000..0beddb361 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/object.h @@ -0,0 +1,89 @@ +/** + * \file object.h + * \brief CObject + * \date 2012-08-22 09:13GMT + * \author Jan Boon (Kaetemi) + * CObject + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_OBJECT_H +#define PIPELINE_OBJECT_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "base_object.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CObject + * \date 2012-08-22 09:13GMT + * \author Jan Boon (Kaetemi) + * CObject + */ +class CObject : public CBaseObject +{ +public: + CObject(CScene *scene); + virtual ~CObject(); + + // class desc + static const ucstring DisplayName; + static const char *InternalName; + static const char *InternalNameUnknown; + static const NLMISC::CClassId ClassId; + static const TSClassId SuperClassId; + + // inherited + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + virtual void init(); + virtual bool inherits(const NLMISC::CClassId classId) const; + virtual const ISceneClassDesc *classDesc() const; + virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "", uint filter = 0) const; + +protected: + // inherited + virtual IStorageObject *createChunkById(uint16 id, bool container); + +}; /* class CObject */ + +typedef CSceneClassDesc CObjectClassDesc; +extern const CObjectClassDesc ObjectClassDesc; +typedef CSuperClassDesc CObjectSuperClassDesc; +extern const CObjectSuperClassDesc ObjectSuperClassDesc; + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_OBJECT_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/param_block.cpp b/code/nel/tools/3d/pipeline_max/builtin/param_block.cpp new file mode 100644 index 000000000..a6321f716 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/param_block.cpp @@ -0,0 +1,59 @@ +/** + * \file param_block.cpp + * \brief CParamBlock + * \date 2012-08-22 08:57GMT + * \author Jan Boon (Kaetemi) + * CParamBlock + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "param_block.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CParamBlock::CParamBlock(CScene *scene) : CReferenceTarget(scene) +{ + +} + +CParamBlock::~CParamBlock() +{ + +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/param_block.h b/code/nel/tools/3d/pipeline_max/builtin/param_block.h new file mode 100644 index 000000000..76cfa0e76 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/param_block.h @@ -0,0 +1,63 @@ +/** + * \file param_block.h + * \brief CParamBlock + * \date 2012-08-22 08:57GMT + * \author Jan Boon (Kaetemi) + * CParamBlock + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_PARAM_BLOCK_H +#define PIPELINE_PARAM_BLOCK_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "reference_target.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CParamBlock + * \date 2012-08-22 08:57GMT + * \author Jan Boon (Kaetemi) + * CParamBlock + */ +class CParamBlock : public CReferenceTarget +{ +public: + CParamBlock(CScene *scene); + virtual ~CParamBlock(); + +}; /* class CParamBlock */ + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_PARAM_BLOCK_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/param_block_2.cpp b/code/nel/tools/3d/pipeline_max/builtin/param_block_2.cpp new file mode 100644 index 000000000..e450c1aa4 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/param_block_2.cpp @@ -0,0 +1,59 @@ +/** + * \file param_block_2.cpp + * \brief CParamBlock2 + * \date 2012-08-22 08:57GMT + * \author Jan Boon (Kaetemi) + * CParamBlock2 + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "param_block_2.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CParamBlock2::CParamBlock2(CScene *scene) : CReferenceTarget(scene) +{ + +} + +CParamBlock2::~CParamBlock2() +{ + +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/param_block_2.h b/code/nel/tools/3d/pipeline_max/builtin/param_block_2.h new file mode 100644 index 000000000..f70506b8e --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/param_block_2.h @@ -0,0 +1,63 @@ +/** + * \file param_block_2.h + * \brief CParamBlock2 + * \date 2012-08-22 08:57GMT + * \author Jan Boon (Kaetemi) + * CParamBlock2 + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_PARAM_BLOCK_2_H +#define PIPELINE_PARAM_BLOCK_2_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "reference_target.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CParamBlock2 + * \date 2012-08-22 08:57GMT + * \author Jan Boon (Kaetemi) + * CParamBlock2 + */ +class CParamBlock2 : public CReferenceTarget +{ +public: + CParamBlock2(CScene *scene); + virtual ~CParamBlock2(); + +}; /* class CParamBlock2 */ + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_PARAM_BLOCK_2_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/patch_object.cpp b/code/nel/tools/3d/pipeline_max/builtin/patch_object.cpp new file mode 100644 index 000000000..fecba7640 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/patch_object.cpp @@ -0,0 +1,111 @@ +/** + * \file patch_object.cpp + * \brief CPatchObject + * \date 2012-08-22 08:58GMT + * \author Jan Boon (Kaetemi) + * CPatchObject + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "patch_object.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +// using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CPatchObject::CPatchObject(CScene *scene) : CGeomObject(scene) +{ + +} + +CPatchObject::~CPatchObject() +{ + +} + +const ucstring CPatchObject::DisplayName = ucstring("PatchObject"); +const char *CPatchObject::InternalName = "PatchObject"; +const NLMISC::CClassId CPatchObject::ClassId = NLMISC::CClassId(0xd0a6b36, 0x7dce4b64); /* Not official, please correct */ +const TSClassId CPatchObject::SuperClassId = CGeomObject::SuperClassId; +const CPatchObjectClassDesc PatchObjectClassDesc(&DllPluginDescBuiltin); + +void CPatchObject::parse(uint16 version, uint filter) +{ + CGeomObject::parse(version); +} + +void CPatchObject::clean() +{ + CGeomObject::clean(); +} + +void CPatchObject::build(uint16 version, uint filter) +{ + CGeomObject::build(version); +} + +void CPatchObject::disown() +{ + CGeomObject::disown(); +} + +void CPatchObject::init() +{ + CGeomObject::init(); +} + +bool CPatchObject::inherits(const NLMISC::CClassId classId) const +{ + if (classId == classDesc()->classId()) return true; + return CGeomObject::inherits(classId); +} + +const ISceneClassDesc *CPatchObject::classDesc() const +{ + return &PatchObjectClassDesc; +} + +void CPatchObject::toStringLocal(std::ostream &ostream, const std::string &pad, uint filter) const +{ + CGeomObject::toStringLocal(ostream, pad); +} + +IStorageObject *CPatchObject::createChunkById(uint16 id, bool container) +{ + return CGeomObject::createChunkById(id, container); +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/patch_object.h b/code/nel/tools/3d/pipeline_max/builtin/patch_object.h new file mode 100644 index 000000000..78b6524cc --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/patch_object.h @@ -0,0 +1,90 @@ +/** + * \file patch_object.h + * \brief CPatchObject + * \date 2012-08-22 08:58GMT + * \author Jan Boon (Kaetemi) + * CPatchObject + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_PATCH_OBJECT_H +#define PIPELINE_PATCH_OBJECT_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "geom_object.h" + +/// Must be passed to the parse and build functions by +/// inheriting classes to parse the actual patch object. +#define PMB_PATCH_OBJECT_PARSE_FILTER 0x2a611c9 + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CPatchObject + * \date 2012-08-22 08:58GMT + * \author Jan Boon (Kaetemi) + * CPatchObject + */ +class CPatchObject : public CGeomObject +{ +public: + CPatchObject(CScene *scene); + virtual ~CPatchObject(); + + // class desc + static const ucstring DisplayName; + static const char *InternalName; + static const NLMISC::CClassId ClassId; + static const TSClassId SuperClassId; + + // inherited + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + virtual void init(); + virtual bool inherits(const NLMISC::CClassId classId) const; + virtual const ISceneClassDesc *classDesc() const; + virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "", uint filter = 0) const; + +protected: + // inherited + virtual IStorageObject *createChunkById(uint16 id, bool container); + +}; /* class CPatchObject */ + +typedef CSceneClassDesc CPatchObjectClassDesc; +extern const CPatchObjectClassDesc PatchObjectClassDesc; + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_PATCH_OBJECT_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/poly_object.cpp b/code/nel/tools/3d/pipeline_max/builtin/poly_object.cpp new file mode 100644 index 000000000..25cd334d4 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/poly_object.cpp @@ -0,0 +1,147 @@ +/** + * \file poly_object.cpp + * \brief CPolyObject + * \date 2012-08-22 08:58GMT + * \author Jan Boon (Kaetemi) + * CPolyObject + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "poly_object.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CPolyObject::CPolyObject(CScene *scene) : CGeomObject(scene) +{ + +} + +CPolyObject::~CPolyObject() +{ + +} + +const ucstring CPolyObject::DisplayName = ucstring("PolyObject"); +const char *CPolyObject::InternalName = "PolyObject"; +const NLMISC::CClassId CPolyObject::ClassId = NLMISC::CClassId(0x59772461, 0x6e1141e8); /* Not official, please correct */ +const TSClassId CPolyObject::SuperClassId = CGeomObject::SuperClassId; +const CPolyObjectClassDesc PolyObjectClassDesc(&DllPluginDescBuiltin); + +void CPolyObject::parse(uint16 version, uint filter) +{ + if (filter == 0) + { + CGeomObject::parse(version); + } + else if (filter == PMB_POLY_OBJECT_PARSE_FILTER) + { + if (!m_ChunksOwnsPointers) + { + CGeomObject::parse(version, PMB_GEOM_OBJECT_PARSE_FILTER); + // 0x0906 + // 0x0908 + // 0x090a + // 0x090c + } + } +} + +void CPolyObject::clean() +{ + CGeomObject::clean(); +} + +void CPolyObject::build(uint16 version, uint filter) +{ + if (filter == 0) + { + CGeomObject::build(version); + } + else if (filter == PMB_POLY_OBJECT_PARSE_FILTER) + { + CGeomObject::build(version, PMB_GEOM_OBJECT_PARSE_FILTER); + // 0x0906 + // 0x0908 + // 0x090a + // 0x090c + } +} + +void CPolyObject::disown() +{ + CGeomObject::disown(); +} + +void CPolyObject::init() +{ + CGeomObject::init(); +} + +bool CPolyObject::inherits(const NLMISC::CClassId classId) const +{ + if (classId == classDesc()->classId()) return true; + return CGeomObject::inherits(classId); +} + +const ISceneClassDesc *CPolyObject::classDesc() const +{ + return &PolyObjectClassDesc; +} + +void CPolyObject::toStringLocal(std::ostream &ostream, const std::string &pad, uint filter) const +{ + if (filter == 0) + { + CGeomObject::toStringLocal(ostream, pad); + } + else if (filter == PMB_POLY_OBJECT_PARSE_FILTER) + { + CGeomObject::toStringLocal(ostream, pad, PMB_GEOM_OBJECT_PARSE_FILTER); + // 0x0906 + // 0x0908 + // 0x090a + // 0x090c + } +} + +IStorageObject *CPolyObject::createChunkById(uint16 id, bool container) +{ + return CGeomObject::createChunkById(id, container); +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/poly_object.h b/code/nel/tools/3d/pipeline_max/builtin/poly_object.h new file mode 100644 index 000000000..23b3c09f9 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/poly_object.h @@ -0,0 +1,90 @@ +/** + * \file poly_object.h + * \brief CPolyObject + * \date 2012-08-22 08:58GMT + * \author Jan Boon (Kaetemi) + * CPolyObject + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_POLY_OBJECT_H +#define PIPELINE_POLY_OBJECT_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "geom_object.h" + +/// Must be passed to the parse and build functions by +/// inheriting classes to parse the actual poly object. +#define PMB_POLY_OBJECT_PARSE_FILTER 0x127d3a04 + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CPolyObject + * \date 2012-08-22 08:58GMT + * \author Jan Boon (Kaetemi) + * CPolyObject + */ +class CPolyObject : public CGeomObject +{ +public: + CPolyObject(CScene *scene); + virtual ~CPolyObject(); + + // class desc + static const ucstring DisplayName; + static const char *InternalName; + static const NLMISC::CClassId ClassId; + static const TSClassId SuperClassId; + + // inherited + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + virtual void init(); + virtual bool inherits(const NLMISC::CClassId classId) const; + virtual const ISceneClassDesc *classDesc() const; + virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "", uint filter = 0) const; + +protected: + // inherited + virtual IStorageObject *createChunkById(uint16 id, bool container); + +}; /* class CPolyObject */ + +typedef CSceneClassDesc CPolyObjectClassDesc; +extern const CPolyObjectClassDesc PolyObjectClassDesc; + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_POLY_OBJECT_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/reference_maker.cpp b/code/nel/tools/3d/pipeline_max/builtin/reference_maker.cpp new file mode 100644 index 000000000..4b684d543 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/reference_maker.cpp @@ -0,0 +1,320 @@ +/** + * \file reference_maker.cpp + * \brief CReferenceMaker + * \date 2012-08-22 08:52GMT + * \author Jan Boon (Kaetemi) + * CReferenceMaker + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "reference_maker.h" + +// STL includes +#include + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +// Elevate warnings to errors in this file for stricter reading +#undef nlwarning +#define nlwarning nlerror + +// Elevate debug to error in this file for debugging +// #undef nldebug +// #define nldebug nlerror + +// Chunk identifiers +#define PMB_REFERENCES_2034_CHUNK_ID 0x2034 +#define PMB_REFERENCES_2035_CHUNK_ID 0x2035 +#define PMB_204B_EQUALS_2E_CHUNK_ID 0x204B +#define PMB_UNKNOWN2045_CHUNK_ID 0x2045 +#define PMB_UNKNOWN2047_CHUNK_ID 0x2047 +#define PMB_UNKNOWN21B0_CHUNK_ID 0x21B0 + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CReferenceMaker::CReferenceMaker(CScene *scene) : CAnimatable(scene), m_ReferenceMap(false), m_204B_Equals_2E(NULL), m_References2035Value0(0), m_Unknown2045(NULL), m_Unknown2047(NULL), m_Unknown21B0(NULL) +{ + +} + +CReferenceMaker::~CReferenceMaker() +{ + if (!m_ChunksOwnsPointers) + { + delete m_204B_Equals_2E; + m_204B_Equals_2E = NULL; + delete m_Unknown2045; + m_Unknown2045 = NULL; + delete m_Unknown2047; + m_Unknown2047 = NULL; + delete m_Unknown21B0; + m_Unknown21B0 = NULL; + } +} + +const ucstring CReferenceMaker::DisplayName = ucstring("ReferenceMaker"); +const char *CReferenceMaker::InternalName = "ReferenceMaker"; +const char *CReferenceMaker::InternalNameUnknown = "ReferenceMakerUnknown"; +const NLMISC::CClassId CReferenceMaker::ClassId = NLMISC::CClassId(0x2ec43d15, 0x10a270ad); /* Not official, please correct */ +const TSClassId CReferenceMaker::SuperClassId = 0x00000100; +const CReferenceMakerClassDesc ReferenceMakerClassDesc(&DllPluginDescBuiltin); +const CReferenceMakerSuperClassDesc ReferenceMakerSuperClassDesc(&ReferenceMakerClassDesc); + +void CReferenceMaker::parse(uint16 version, uint filter) +{ + CAnimatable::parse(version); + if (!m_ChunksOwnsPointers) + { + CStorageArray *references2034 = static_cast *>(getChunk(PMB_REFERENCES_2034_CHUNK_ID)); + CStorageArray *references2035 = static_cast *>(getChunk(PMB_REFERENCES_2035_CHUNK_ID)); + if (references2034) nlassert(references2035 == NULL); // Apparently, there can be only one. + if (references2035) nlassert(references2034 == NULL); + m_204B_Equals_2E = static_cast *>(getChunk(PMB_204B_EQUALS_2E_CHUNK_ID)); + if (m_204B_Equals_2E) nlassert(m_204B_Equals_2E->Value == 0x2e); // Really, let me know when it has another value. + + // Parse contents + if (references2034) + { + m_ReferenceMap = false; // NOTE: Plugins may check after parse if they parsed with the correct type, to find a pattern + m_ArchivedChunks.push_back(references2034); + for (std::vector::size_type i = 0; i < references2034->Value.size(); ++i) + { + if (references2034->Value[i] > 0) + { + CReferenceMaker *referenceMaker = dynamic_cast(container()->getByStorageIndex(references2034->Value[i])); + if (!referenceMaker) nlerror("Reference maker %s %s, 0x%x is not a reference maker", ucstring(container()->getByStorageIndex(references2034->Value[i])->classDesc()->displayName()).toUtf8().c_str(), container()->getByStorageIndex(references2034->Value[i])->classDesc()->classId().toString().c_str(), container()->getByStorageIndex(references2034->Value[i])->classDesc()->superClassId()); + setReference(i, referenceMaker); + } + } + } + if (references2035) + { + m_ReferenceMap = true; + m_ArchivedChunks.push_back(references2035); + std::vector::iterator it = references2035->Value.begin(); + m_References2035Value0 = (*it); + ++it; + std::vector::iterator end = references2035->Value.end(); + while (it != end) + { + sint32 index = (*it); + ++it; + sint32 referenceindex = (*it); + ++it; + CReferenceMaker *referenceMaker = dynamic_cast(container()->getByStorageIndex(referenceindex)); + if (!referenceMaker) nlerror("Reference maker %s, 0x%x is not a reference maker", container()->getByStorageIndex(referenceindex)->classDesc()->classId().toString().c_str(), container()->getByStorageIndex(referenceindex)->classDesc()->superClassId()); + setReference(index, referenceMaker); + } + } + + m_Unknown2045 = static_cast(getChunk(PMB_UNKNOWN2045_CHUNK_ID)); // not sure if this is part of maker or target + m_Unknown2047 = static_cast(getChunk(PMB_UNKNOWN2047_CHUNK_ID)); // not sure if this is part of maker or target + m_Unknown21B0 = static_cast(getChunk(PMB_UNKNOWN21B0_CHUNK_ID)); // not sure if this is part of maker or target + } +} + +void CReferenceMaker::clean() +{ + CAnimatable::clean(); // Nothing to do here, m_ArchivedChunks is cleaned (deleted) for us! +} + +void CReferenceMaker::build(uint16 version, uint filter) +{ + CAnimatable::build(version); + // TODO: Build contents + //if (m_References2034) putChunk(PMB_REFERENCES_2034_CHUNK_ID, m_References2034); + //if (m_References2035) putChunk(PMB_REFERENCES_2035_CHUNK_ID, m_References2035); + if (!m_ReferenceMap) + { + CStorageArray *references2034 = new CStorageArray(); + uint nb = nbReferences(); + references2034->Value.resize(nb); + for (uint i = 0; i < nb; ++i) + { + CReferenceMaker *referenceMaker = getReference(i); + if (referenceMaker) references2034->Value[i] = container()->getOrCreateStorageIndex(referenceMaker); + else references2034->Value[i] = -1; + } + putChunk(PMB_REFERENCES_2034_CHUNK_ID, references2034); + m_ArchivedChunks.push_back(references2034); + } + else + { + CStorageArray *references2035 = new CStorageArray(); + uint nb = nbReferences(); + references2035->Value.push_back(m_References2035Value0); + for (uint i = 0; i < nb; ++i) + { + CReferenceMaker *referenceMaker = getReference(i); + if (referenceMaker) + { + references2035->Value.push_back(i); + references2035->Value.push_back(container()->getOrCreateStorageIndex(referenceMaker)); + } + } + putChunk(PMB_REFERENCES_2035_CHUNK_ID, references2035); + m_ArchivedChunks.push_back(references2035); + } + if (m_204B_Equals_2E) putChunk(PMB_204B_EQUALS_2E_CHUNK_ID, m_204B_Equals_2E); + if (m_Unknown2045) putChunk(PMB_UNKNOWN2045_CHUNK_ID, m_Unknown2045); + if (m_Unknown2047) putChunk(PMB_UNKNOWN2047_CHUNK_ID, m_Unknown2047); + if (m_Unknown21B0) putChunk(PMB_UNKNOWN21B0_CHUNK_ID, m_Unknown21B0); +} + +void CReferenceMaker::disown() +{ + m_References.clear(); + m_ReferenceMap = false; + m_References2035Value0 = 0; + m_204B_Equals_2E = NULL; + m_Unknown2045 = NULL; + m_Unknown2047 = NULL; + m_Unknown21B0 = NULL; + CAnimatable::disown(); +} + +void CReferenceMaker::init() +{ + CAnimatable::init(); +} + +bool CReferenceMaker::inherits(const NLMISC::CClassId classId) const +{ + if (classId == classDesc()->classId()) return true; + return CAnimatable::inherits(classId); +} + +const ISceneClassDesc *CReferenceMaker::classDesc() const +{ + return &ReferenceMakerClassDesc; +} + +void CReferenceMaker::toStringLocal(std::ostream &ostream, const std::string &pad, uint filter) const +{ + CAnimatable::toStringLocal(ostream, pad); + uint nb = nbReferences(); + if (nb) + { + if (!m_ReferenceMap) ostream << "\n" << pad << "References 0x2034: "; + else ostream << "\n" << pad << "References 0x2035: "; + std::string padpad = pad + "\t"; + ostream << "PARSED "; + if (!m_References.size()) ostream << "VIRTUAL "; + ostream << "{ "; + for (uint i = 0; i < nb; ++i) + { + CReferenceMaker *referenceMaker = getReference(i); + if (referenceMaker) + { + ostream << "\n" << padpad << i << ": "; + ostream << "(" << ucstring(referenceMaker->classDesc()->displayName()).toUtf8() << ", " << referenceMaker->classDesc()->classId().toString() << ") "; + } + } + ostream << "} "; + } + if (m_204B_Equals_2E) + { + ostream << "\n" << pad << "0x204B Equals 0x2E (46): "; + m_204B_Equals_2E->toString(ostream, pad + "\t"); + } + if (m_Unknown2045) + { + ostream << "\n" << pad << "Unknown 0x2045: "; + m_Unknown2045->toString(ostream, pad + "\t"); + } + if (m_Unknown2047) + { + ostream << "\n" << pad << "Unknown 0x2047: "; + m_Unknown2047->toString(ostream, pad + "\t"); + } + if (m_Unknown21B0) + { + ostream << "\n" << pad << "Unknown 0x21B0: "; + m_Unknown21B0->toString(ostream, pad + "\t"); + } +} + +CReferenceMaker *CReferenceMaker::getReference(uint index) const +{ + if (m_References.size() <= index) return NULL; + return m_References[index]; +} + +void CReferenceMaker::setReference(uint index, CReferenceMaker *reference) +{ + if (m_References.size() <= index) m_References.resize(index + 1); + m_References[index] = reference; +} + +uint CReferenceMaker::nbReferences() const +{ + return m_References.size(); +} + +IStorageObject *CReferenceMaker::createChunkById(uint16 id, bool container) +{ + switch (id) + { + case PMB_REFERENCES_2034_CHUNK_ID: + return new CStorageArray(); + case PMB_REFERENCES_2035_CHUNK_ID: + return new CStorageArray(); + case PMB_204B_EQUALS_2E_CHUNK_ID: + return new CStorageValue(); + case PMB_UNKNOWN21B0_CHUNK_ID: + return new CStorageRaw(); + } + return CAnimatable::createChunkById(id, container); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/reference_maker.h b/code/nel/tools/3d/pipeline_max/builtin/reference_maker.h new file mode 100644 index 000000000..b32c0c97b --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/reference_maker.h @@ -0,0 +1,110 @@ +/** + * \file reference_maker.h + * \brief CReferenceMaker + * \date 2012-08-22 08:52GMT + * \author Jan Boon (Kaetemi) + * CReferenceMaker + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_REFERENCE_MAKER_H +#define PIPELINE_REFERENCE_MAKER_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "../storage_array.h" +#include "animatable.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CReferenceMaker + * \date 2012-08-22 08:52GMT + * \author Jan Boon (Kaetemi) + * This class implements references + */ +class CReferenceMaker : public CAnimatable +{ +public: + CReferenceMaker(CScene *scene); + virtual ~CReferenceMaker(); + + // class desc + static const ucstring DisplayName; + static const char *InternalName; + static const char *InternalNameUnknown; + static const NLMISC::CClassId ClassId; + static const TSClassId SuperClassId; + + // inherited + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + virtual void init(); + virtual bool inherits(const NLMISC::CClassId classId) const; + virtual const ISceneClassDesc *classDesc() const; + virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "", uint filter = 0) const; + + // child classes should inherit, default implementation stores in a vector + /// Get a reference + virtual CReferenceMaker *getReference(uint index) const; + virtual void setReference(uint index, CReferenceMaker *reference); + virtual uint nbReferences() const; + +protected: + // inherited + virtual IStorageObject *createChunkById(uint16 id, bool container); + /// Storage method + bool m_ReferenceMap; + +private: + CStorageValue *m_204B_Equals_2E; + + /// Default implementation, should preferably not use this, no direct read access will be provided + std::vector > m_References; + /// Unknown value + uint32 m_References2035Value0; + + CStorageRaw *m_Unknown2045; + CStorageRaw *m_Unknown2047; + CStorageRaw *m_Unknown21B0; + +}; /* class CReferenceMaker */ + +typedef CSceneClassDesc CReferenceMakerClassDesc; +extern const CReferenceMakerClassDesc ReferenceMakerClassDesc; +typedef CSuperClassDesc CReferenceMakerSuperClassDesc; +extern const CReferenceMakerSuperClassDesc ReferenceMakerSuperClassDesc; + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_REFERENCE_MAKER_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/reference_target.cpp b/code/nel/tools/3d/pipeline_max/builtin/reference_target.cpp new file mode 100644 index 000000000..a571b524b --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/reference_target.cpp @@ -0,0 +1,113 @@ +/** + * \file reference_target.cpp + * \brief CReferenceTarget + * \date 2012-08-22 08:53GMT + * \author Jan Boon (Kaetemi) + * CReferenceTarget + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "reference_target.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CReferenceTarget::CReferenceTarget(CScene *scene) : CReferenceMaker(scene) +{ + +} + +CReferenceTarget::~CReferenceTarget() +{ + +} + +const ucstring CReferenceTarget::DisplayName = ucstring("ReferenceTarget"); +const char *CReferenceTarget::InternalName = "ReferenceTarget"; +const char *CReferenceTarget::InternalNameUnknown = "ReferenceTargetUnknown"; +const NLMISC::CClassId CReferenceTarget::ClassId = NLMISC::CClassId(0x5d545dd9, 0xa422e4); /* Not official, please correct */ +const TSClassId CReferenceTarget::SuperClassId = 0x00000200; +const CReferenceTargetClassDesc ReferenceTargetClassDesc(&DllPluginDescBuiltin); +const CReferenceTargetSuperClassDesc ReferenceTargetSuperClassDesc(&ReferenceTargetClassDesc); + +void CReferenceTarget::parse(uint16 version, uint filter) +{ + CReferenceMaker::parse(version); +} + +void CReferenceTarget::clean() +{ + CReferenceMaker::clean(); +} + +void CReferenceTarget::build(uint16 version, uint filter) +{ + CReferenceMaker::build(version); +} + +void CReferenceTarget::disown() +{ + CReferenceMaker::disown(); +} + +void CReferenceTarget::init() +{ + CReferenceMaker::init(); +} + +bool CReferenceTarget::inherits(const NLMISC::CClassId classId) const +{ + if (classId == classDesc()->classId()) return true; + return CReferenceMaker::inherits(classId); +} + +const ISceneClassDesc *CReferenceTarget::classDesc() const +{ + return &ReferenceTargetClassDesc; +} + +void CReferenceTarget::toStringLocal(std::ostream &ostream, const std::string &pad, uint filter) const +{ + CReferenceMaker::toStringLocal(ostream, pad); +} + +IStorageObject *CReferenceTarget::createChunkById(uint16 id, bool container) +{ + return CReferenceMaker::createChunkById(id, container); +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/reference_target.h b/code/nel/tools/3d/pipeline_max/builtin/reference_target.h new file mode 100644 index 000000000..69ad6ee34 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/reference_target.h @@ -0,0 +1,90 @@ +/** + * \file reference_target.h + * \brief CReferenceTarget + * \date 2012-08-22 08:53GMT + * \author Jan Boon (Kaetemi) + * CReferenceTarget + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_REFERENCE_TARGET_H +#define PIPELINE_REFERENCE_TARGET_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "reference_maker.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CReferenceTarget + * \date 2012-08-22 08:53GMT + * \author Jan Boon (Kaetemi) + * Dummy class, supposed to send or receive events or something. + * Nice for copy pasting the basic class layout. + */ +class CReferenceTarget : public CReferenceMaker +{ +public: + CReferenceTarget(CScene *scene); + virtual ~CReferenceTarget(); + + // class desc + static const ucstring DisplayName; + static const char *InternalName; + static const char *InternalNameUnknown; + static const NLMISC::CClassId ClassId; + static const TSClassId SuperClassId; + + // inherited + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + virtual void init(); + virtual bool inherits(const NLMISC::CClassId classId) const; + virtual const ISceneClassDesc *classDesc() const; + virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "", uint filter = 0) const; + +protected: + // inherited + virtual IStorageObject *createChunkById(uint16 id, bool container); + +}; /* class CReferenceTarget */ + +typedef CSceneClassDesc CReferenceTargetClassDesc; +extern const CReferenceTargetClassDesc ReferenceTargetClassDesc; +typedef CSuperClassDesc CReferenceTargetSuperClassDesc; +extern const CReferenceTargetSuperClassDesc ReferenceTargetSuperClassDesc; + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_REFERENCE_TARGET_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/root_node.cpp b/code/nel/tools/3d/pipeline_max/builtin/root_node.cpp new file mode 100644 index 000000000..b9c76b1c0 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/root_node.cpp @@ -0,0 +1,117 @@ +/** + * \file root_node.cpp + * \brief CRootNode + * \date 2012-08-22 19:45GMT + * \author Jan Boon (Kaetemi) + * CRootNode + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "root_node.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CRootNode::CRootNode(CScene *scene) : INode(scene) +{ + +} + +CRootNode::~CRootNode() +{ + +} + +const ucstring CRootNode::DisplayName = ucstring("RootNode"); +const char *CRootNode::InternalName = "RootNode"; +const NLMISC::CClassId CRootNode::ClassId = NLMISC::CClassId(0x00000002, 0x00000000); +const TSClassId CRootNode::SuperClassId = INode::SuperClassId; +const CRootNodeClassDesc RootNodeClassDesc(&DllPluginDescBuiltin); + +void CRootNode::parse(uint16 version, uint filter) +{ + INode::parse(version); +} + +void CRootNode::clean() +{ + INode::clean(); +} + +void CRootNode::build(uint16 version, uint filter) +{ + INode::build(version); +} + +void CRootNode::disown() +{ + INode::disown(); +} + +void CRootNode::init() +{ + INode::init(); +} + +bool CRootNode::inherits(const NLMISC::CClassId classId) const +{ + if (classId == classDesc()->classId()) return true; + return INode::inherits(classId); +} + +const ISceneClassDesc *CRootNode::classDesc() const +{ + return &RootNodeClassDesc; +} + +void CRootNode::toStringLocal(std::ostream &ostream, const std::string &pad, uint filter) const +{ + INode::toStringLocal(ostream, pad); +} + +const ucstring &CRootNode::userName() const +{ + static const ucstring v = ucstring("Root Node"); + return v; +} + +IStorageObject *CRootNode::createChunkById(uint16 id, bool container) +{ + return INode::createChunkById(id, container); +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/root_node.h b/code/nel/tools/3d/pipeline_max/builtin/root_node.h new file mode 100644 index 000000000..df673a532 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/root_node.h @@ -0,0 +1,89 @@ +/** + * \file root_node.h + * \brief CRootNode + * \date 2012-08-22 19:45GMT + * \author Jan Boon (Kaetemi) + * CRootNode + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_ROOT_NODE_H +#define PIPELINE_ROOT_NODE_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "i_node.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CRootNode + * \date 2012-08-22 20:01GMT + * \author Jan Boon (Kaetemi) + * CRootNode + */ +class CRootNode : public INode +{ +public: + CRootNode(CScene *scene); + virtual ~CRootNode(); + + // class desc + static const ucstring DisplayName; + static const char *InternalName; + static const NLMISC::CClassId ClassId; + static const TSClassId SuperClassId; + + // inherited + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + virtual void init(); + virtual bool inherits(const NLMISC::CClassId classId) const; + virtual const ISceneClassDesc *classDesc() const; + virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "", uint filter = 0) const; + + // node interface + virtual const ucstring &userName() const; + +protected: + // inherited + virtual IStorageObject *createChunkById(uint16 id, bool container); + +}; /* class CRootNode */ + +typedef CSceneClassDesc CRootNodeClassDesc; +extern const CRootNodeClassDesc RootNodeClassDesc; + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_ROOT_NODE_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/scene_impl.cpp b/code/nel/tools/3d/pipeline_max/builtin/scene_impl.cpp new file mode 100644 index 000000000..75c9fa5cf --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/scene_impl.cpp @@ -0,0 +1,209 @@ +/** + * \file scene_impl.cpp + * \brief CSceneImpl + * \date 2012-08-24 12:33GMT + * \author Jan Boon (Kaetemi) + * CSceneImpl + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "scene_impl.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CSceneImpl::CSceneImpl(CScene *scene) : CReferenceMaker(scene) +{ + +} + +CSceneImpl::~CSceneImpl() +{ + +} + +const ucstring CSceneImpl::DisplayName = ucstring("Scene"); +const char *CSceneImpl::InternalName = "SceneImpl"; +const NLMISC::CClassId CSceneImpl::ClassId = NLMISC::CClassId(0x00002222, 0x00000000); +const TSClassId CSceneImpl::SuperClassId = CReferenceMaker::SuperClassId; +const CSceneImplClassDesc SceneImplClassDesc(&DllPluginDescBuiltin); + +void CSceneImpl::parse(uint16 version, uint filter) +{ + CReferenceMaker::parse(version); + nlassert(m_MaterialEditor); + nlassert(m_MtlBaseLib); + nlassert(m_Sound); + nlassert(m_RootNode); + nlassert(m_RenderEnvironment); + nlassert(m_NamedSelSetList); + nlassert(m_TrackViewNode); + nlassert(m_GridReference); + nlassert(m_RenderEffects); + nlassert(m_ShadowMap); + nlassert(m_LayerManager); + if (version > Version3) nlassert(m_TrackSetList); +} + +void CSceneImpl::clean() +{ + CReferenceMaker::clean(); +} + +void CSceneImpl::build(uint16 version, uint filter) +{ + CReferenceMaker::build(version); +} + +void CSceneImpl::disown() +{ + CReferenceMaker::disown(); +} + +void CSceneImpl::init() +{ + CReferenceMaker::init(); +} + +bool CSceneImpl::inherits(const NLMISC::CClassId classId) const +{ + if (classId == classDesc()->classId()) return true; + return CReferenceMaker::inherits(classId); +} + +const ISceneClassDesc *CSceneImpl::classDesc() const +{ + return &SceneImplClassDesc; +} + +void CSceneImpl::toStringLocal(std::ostream &ostream, const std::string &pad, uint filter) const +{ + CReferenceMaker::toStringLocal(ostream, pad); +} + +CReferenceMaker *CSceneImpl::getReference(uint index) const +{ + switch (index) + { + case 0: + return m_MaterialEditor; + case 1: + return m_MtlBaseLib; + case 2: + return m_Sound; + case 3: + return m_RootNode; + case 4: + return m_RenderEnvironment; + case 5: + return m_NamedSelSetList; + case 6: + return m_TrackViewNode; + case 7: + return m_GridReference; + case 8: + return m_RenderEffects; + case 9: + return m_ShadowMap; + case 10: + return m_LayerManager; + case 11: + return m_TrackSetList; + default: + if (index > 0) + nlerror("Invalid index %i", index); + return NULL; + } +} + +void CSceneImpl::setReference(uint index, CReferenceMaker *reference) +{ + switch (index) + { + case 0: + m_MaterialEditor = reference; + break; + case 1: + m_MtlBaseLib = reference; + break; + case 2: + m_Sound = reference; + break; + case 3: + m_RootNode = dynamic_cast(reference); + break; + case 4: + m_RenderEnvironment = reference; + break; + case 5: + m_NamedSelSetList = reference; + break; + case 6: + m_TrackViewNode = dynamic_cast(reference); + break; + case 7: + m_GridReference = reference; + break; + case 8: + m_RenderEffects = reference; + break; + case 9: + m_ShadowMap = reference; + break; + case 10: + m_LayerManager = reference; + break; + case 11: + m_TrackSetList = reference; + break; + default: + nlerror("Unknown reference index %i entry (%s, 0x%x)", index, (uint32)(uint64)(void *)reference, reference->classDesc()->classId().toString().c_str(), reference->classDesc()->superClassId()); + break; + } +} + +uint CSceneImpl::nbReferences() const +{ + return m_TrackSetList ? 12 : 11; +} + +IStorageObject *CSceneImpl::createChunkById(uint16 id, bool container) +{ + return CReferenceMaker::createChunkById(id, container); +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/scene_impl.h b/code/nel/tools/3d/pipeline_max/builtin/scene_impl.h new file mode 100644 index 000000000..437f0c7ea --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/scene_impl.h @@ -0,0 +1,112 @@ +/** + * \file scene_impl.h + * \brief CSceneImpl + * \date 2012-08-24 12:33GMT + * \author Jan Boon (Kaetemi) + * CSceneImpl + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_SCENE_IMPL_H +#define PIPELINE_SCENE_IMPL_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "reference_maker.h" + +#include "root_node.h" +#include "track_view_node.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CSceneImpl + * \date 2012-08-22 08:53GMT + * \author Jan Boon (Kaetemi) + * Scene implementation + */ +class CSceneImpl : public CReferenceMaker +{ +public: + CSceneImpl(CScene *scene); + virtual ~CSceneImpl(); + + // class desc + static const ucstring DisplayName; + static const char *InternalName; + static const NLMISC::CClassId ClassId; + static const TSClassId SuperClassId; + + // inherited + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + virtual void init(); + virtual bool inherits(const NLMISC::CClassId classId) const; + virtual const ISceneClassDesc *classDesc() const; + virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "", uint filter = 0) const; + + // reference maker + virtual CReferenceMaker *getReference(uint index) const; + virtual void setReference(uint index, CReferenceMaker *reference); + virtual uint nbReferences() const; + + // read access + inline CRootNode *rootNode() const { return m_RootNode; } + inline CTrackViewNode *trackViewNode() const { return m_TrackViewNode; } + +protected: + // inherited + virtual IStorageObject *createChunkById(uint16 id, bool container); + +private: + NLMISC::CRefPtr m_MaterialEditor; + NLMISC::CRefPtr m_MtlBaseLib; + NLMISC::CRefPtr m_Sound; + NLMISC::CRefPtr m_RootNode; + NLMISC::CRefPtr m_RenderEnvironment; + NLMISC::CRefPtr m_NamedSelSetList; + NLMISC::CRefPtr m_TrackViewNode; + NLMISC::CRefPtr m_GridReference; + NLMISC::CRefPtr m_RenderEffects; + NLMISC::CRefPtr m_ShadowMap; + NLMISC::CRefPtr m_LayerManager; + NLMISC::CRefPtr m_TrackSetList; // Does not exist in R3 + +}; /* class CSceneImpl */ + +typedef CSceneClassDesc CSceneImplClassDesc; +extern const CSceneImplClassDesc SceneImplClassDesc; + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_SCENE_IMPL_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/std_mat.cpp b/code/nel/tools/3d/pipeline_max/builtin/std_mat.cpp new file mode 100644 index 000000000..dae98c4c9 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/std_mat.cpp @@ -0,0 +1,59 @@ +/** + * \file std_mat.cpp + * \brief CStdMat + * \date 2012-08-22 08:55GMT + * \author Jan Boon (Kaetemi) + * CStdMat + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "std_mat.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CStdMat::CStdMat(CScene *scene) : CMtl(scene) +{ + +} + +CStdMat::~CStdMat() +{ + +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/std_mat.h b/code/nel/tools/3d/pipeline_max/builtin/std_mat.h new file mode 100644 index 000000000..f3d9e7b69 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/std_mat.h @@ -0,0 +1,63 @@ +/** + * \file std_mat.h + * \brief CStdMat + * \date 2012-08-22 08:55GMT + * \author Jan Boon (Kaetemi) + * CStdMat + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_STD_MAT_H +#define PIPELINE_STD_MAT_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "mtl.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CStdMat + * \date 2012-08-22 08:55GMT + * \author Jan Boon (Kaetemi) + * CStdMat + */ +class CStdMat : public CMtl +{ +public: + CStdMat(CScene *scene); + virtual ~CStdMat(); + +}; /* class CStdMat */ + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_STD_MAT_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/std_mat_2.cpp b/code/nel/tools/3d/pipeline_max/builtin/std_mat_2.cpp new file mode 100644 index 000000000..45e17d868 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/std_mat_2.cpp @@ -0,0 +1,59 @@ +/** + * \file std_mat_2.cpp + * \brief CStdMat2 + * \date 2012-08-22 08:55GMT + * \author Jan Boon (Kaetemi) + * CStdMat2 + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "std_mat_2.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CStdMat2::CStdMat2(CScene *scene) : CStdMat(scene) +{ + +} + +CStdMat2::~CStdMat2() +{ + +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/std_mat_2.h b/code/nel/tools/3d/pipeline_max/builtin/std_mat_2.h new file mode 100644 index 000000000..331ca7978 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/std_mat_2.h @@ -0,0 +1,68 @@ +/** + * \file std_mat_2.h + * \brief CStdMat2 + * \date 2012-08-22 08:55GMT + * \author Jan Boon (Kaetemi) + * CStdMat2 + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_STD_MAT_2_H +#define PIPELINE_STD_MAT_2_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "std_mat.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CStdMat2 + * \date 2012-08-22 08:55GMT + * \author Jan Boon (Kaetemi) + * CStdMat2 + */ +class CStdMat2 : public CStdMat +{ +protected: + // pointers + // ... + + // instances + // ... +public: + CStdMat2(CScene *scene); + virtual ~CStdMat2(); +}; /* class CStdMat2 */ + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_STD_MAT_2_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/storage/app_data.cpp b/code/nel/tools/3d/pipeline_max/builtin/storage/app_data.cpp new file mode 100644 index 000000000..7bc72f151 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/storage/app_data.cpp @@ -0,0 +1,507 @@ +/** + * \file app_data.cpp + * \brief CAppData + * \date 2012-08-21 11:47GMT + * \author Jan Boon (Kaetemi) + * CAppData + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "app_data.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { +namespace STORAGE { + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +#define PMBS_APP_DATA_PARSE 1 + +// Elevate warnings to errors in this file for stricter reading +#undef nlwarning +#define nlwarning nlerror + +// Elevate debug to error in this file for debugging +// #undef nldebug +// #define nldebug nlerror + +// Chunk identifiers +#define PMBS_APP_DATA_HEADER_CHUNK_ID 0x0100 +#define PMBS_APP_DATA_ENTRY_CHUNK_ID 0x0110 +#define PMBS_APP_DATA_ENTRY_KEY_CHUNK_ID 0x0120 + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CAppData::TKey::TKey(NLMISC::CClassId classId, TSClassId superClassId, uint32 subId) : ClassId(classId), SuperClassId(superClassId), SubId(subId) +{ + +} + +bool CAppData::TKey::operator<(const CAppData::TKey &right) const +{ + if (ClassId < right.ClassId) + return true; + if (ClassId > right.ClassId) + return false; + if (SuperClassId < right.SuperClassId) + return true; + if (SuperClassId > right.SuperClassId) + return false; + if (SubId < right.SubId) + return true; + if (SubId > right.SubId) + return false; + return false; +} + +bool CAppData::TKey::operator>(const CAppData::TKey &right) const +{ + if (ClassId > right.ClassId) + return true; + if (ClassId < right.ClassId) + return false; + if (SuperClassId > right.SuperClassId) + return true; + if (SuperClassId < right.SuperClassId) + return false; + if (SubId > right.SubId) + return true; + if (SubId < right.SubId) + return false; + return false; +} + +bool CAppData::TKey::operator==(const CAppData::TKey &right) const +{ + return ClassId == right.ClassId && SuperClassId == right.SuperClassId && SubId == right.SubId; +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CAppData::CAppData() +{ + +} + +CAppData::~CAppData() +{ + if (!m_ChunksOwnsPointers) + { + for (TMap::const_iterator subit = m_Entries.begin(), subend = m_Entries.end(); subit != subend; ++subit) + delete subit->second; + m_Entries.clear(); + } +} + +std::string CAppData::className() const +{ + return "AppData"; +} + +void CAppData::toString(std::ostream &ostream, const std::string &pad) const +{ + if (m_ChunksOwnsPointers) + { + CStorageContainer::toString(ostream, pad); + } + else + { + ostream << "(" << className() << ") [" << m_Entries.size() << "] PARSED { "; + std::string padpad = pad + "\t"; + uint subi = 0; + for (TMap::const_iterator subit = m_Entries.begin(), subend = m_Entries.end(); subit != subend; ++subit) + { + ostream << "\n" << pad << "Entries[" << subi << "]: "; + subit->second->toString(ostream, padpad); + ++subi; + } + ostream << "} "; + } +} + +void CAppData::parse(uint16 version, uint filter) +{ +#if PMBS_APP_DATA_PARSE + // Cannot be parsed yet + if (!m_ChunksOwnsPointers) { nlerror("Already parsed"); return; } + + // First parse all the child nodes + CStorageContainer::parse(version); + + // Verify + if (m_Chunks.size() < 2) { nlwarning("Bad container size %i", m_Chunks.size()); disown(); return; } + + // Header + TStorageObjectContainer::iterator it = m_Chunks.begin(); + if (it->first != PMBS_APP_DATA_HEADER_CHUNK_ID) { nlwarning("Bad id %x, expected %x", (uint32)it->first, PMBS_APP_DATA_HEADER_CHUNK_ID); disown(); return; } + uint32 headerSize = static_cast *>(it->second)->Value; + ++it; + + // Entries + for (TStorageObjectContainer::iterator end = m_Chunks.end(); it != end; ++it) + { + if (it->first != PMBS_APP_DATA_ENTRY_CHUNK_ID) { nlwarning("Bad id %x, expected %x", (uint32)it->first, PMBS_APP_DATA_ENTRY_CHUNK_ID); disown(); return; } + CAppDataEntry *entry = static_cast(it->second); + TKey key(entry->key()->ClassId, entry->key()->SuperClassId, entry->key()->SubId); + if (m_Entries.find(key) != m_Entries.end()) { nlwarning("Duplicate entry"); disown(); return; } + m_Entries[key] = entry; + } + + // Verify or fail + if (m_Entries.size() != headerSize) { nlwarning("Entry count %i does not match header %i", m_Entries.size(), headerSize); disown(); return; } + + // Take local ownership + m_ChunksOwnsPointers = false; +#else + CStorageContainer::parse(version); +#endif +} + +void CAppData::clean() +{ +#if PMBS_APP_DATA_PARSE + if (m_ChunksOwnsPointers) { nldebug("Not parsed, or disowned"); return; } // Must have local ownership + if (m_Chunks.size() == 0) { nlwarning("Already cleaned (or did not build due to coding error)"); return; } // Already cleaned + if (m_Chunks.begin()->first != PMBS_APP_DATA_HEADER_CHUNK_ID) { nlerror("Bad id %x, expected %x", (uint32)m_Chunks.begin()->first, PMBS_APP_DATA_HEADER_CHUNK_ID); return; } // Cannot happen, because we won't have local ownership if parsing failed + delete m_Chunks.begin()->second; // Delete the header chunk, since we own it + m_Chunks.clear(); // Clear the remaining chunks + + // Clean raw storage + for (TMap::const_iterator subit = m_Entries.begin(), subend = m_Entries.end(); subit != subend; ++subit) + subit->second->clean(); + +#else + CStorageContainer::clean(); +#endif +} + +void CAppData::build(uint16 version, uint filter) +{ +#if PMBS_APP_DATA_PARSE + // Must be clean first + if (!m_ChunksOwnsPointers && m_Chunks.size() != 0) { nlerror("Not cleaned"); return; } + if (m_Chunks.size() != 0) { nldebug("Not parsed, or disowned"); return; } + + // Set up the header in the chunks container + CStorageValue *headerSize = new CStorageValue(); // Owned locally, not by m_Chunks + headerSize->Value = m_Entries.size(); + m_Chunks.push_back(TStorageObjectWithId(PMBS_APP_DATA_HEADER_CHUNK_ID, headerSize)); + + // Set up the entries + for (TMap::iterator it = m_Entries.begin(), end = m_Entries.end(); it != end; ++it) + m_Chunks.push_back(TStorageObjectWithId(PMBS_APP_DATA_ENTRY_CHUNK_ID, it->second)); + + // Rebuild raw storage + CStorageContainer::build(version); +#else + CStorageContainer::build(version); +#endif +} + +void CAppData::disown() +{ +#if PMBS_APP_DATA_PARSE + if (m_ChunksOwnsPointers) { nldebug("Not parsed"); } + if (!m_ChunksOwnsPointers && (m_Chunks.size() != (m_Entries.size() + 1))) { nlerror("Not built"); return; } // If chunks is not the owner, built chunks must match the parsed data + // NOTE: m_Chunks must be valid at this point! + + // Disown locally + m_Entries.clear(); + + // Give ownership back + m_ChunksOwnsPointers = true; + + // Disown all the child chunks + CStorageContainer::disown(); +#else + CStorageContainer::disown(); +#endif +} + +void CAppData::init() +{ + // Cannot be init yet + if (!m_ChunksOwnsPointers) { nlerror("Already parsed"); return; } + if (m_Chunks.size() != 0) { nlerror("Already built or serialized"); return; } + + // We own this + m_ChunksOwnsPointers = false; +} +/* +const uint8 *CAppData::read(NLMISC::CClassId classId, TSClassId superClassId, uint32 subId, uint32 &size) const +{ + if (m_ChunksOwnsPointers) { nlwarning("Not parsed"); return NULL; } + TKey key(classId, superClassId, subId); + TMap::const_iterator it = m_Entries.find(key); + if (it == m_Entries.end()) { nldebug("Trying to read non-existant key, this is allowed, returning NULL"); return NULL; } + size = it->second->value()->Value.size(); + return &it->second->value()->Value[0]; +} + +uint8 *CAppData::lock(NLMISC::CClassId classId, TSClassId superClassId, uint32 subId, uint32 capacity) +{ + if (m_ChunksOwnsPointers) { nlwarning("Not parsed"); return NULL; } + TKey key(classId, superClassId, subId); + TMap::const_iterator it = m_Entries.find(key); + CAppDataEntry *appDataEntry; + if (it == m_Entries.end()) + { + appDataEntry = new CAppDataEntry(); + m_Entries[key] = appDataEntry; + appDataEntry->key()->ClassId = classId; + appDataEntry->key()->SuperClassId = superClassId; + appDataEntry->key()->SubId = subId; + } + else + { + appDataEntry = it->second; + } + appDataEntry->key()->Size = capacity; + appDataEntry->value()->Value.resize(capacity); + return &appDataEntry->value()->Value[0]; +} + +void CAppData::unlock(NLMISC::CClassId classId, TSClassId superClassId, uint32 subId, uint32 size) +{ + if (m_ChunksOwnsPointers) { nlwarning("Not parsed"); return; } + TKey key(classId, superClassId, subId); + TMap::const_iterator it = m_Entries.find(key); + if (it == m_Entries.end()) { nlerror("Unlocking non-existant key"); return; } + CAppDataEntry *appDataEntry = it->second; + appDataEntry->key()->Size = size; + appDataEntry->value()->Value.resize(size); +} + +void CAppData::fill(NLMISC::CClassId classId, TSClassId superClassId, uint32 subId, uint8 *buffer, uint32 size) +{ + uint8 *dest = lock(classId, superClassId, subId, size); + memcpy(dest, buffer, size); + + // Internally not necessary, since we sent the correct size. + // Outside classes should unlock in case the implementation changes. + // unlock(classId, superClassId, subId, size); +} +*/ +void CAppData::erase(NLMISC::CClassId classId, TSClassId superClassId, uint32 subId) +{ + if (m_ChunksOwnsPointers) { nlwarning("Not parsed"); return; } + TKey key(classId, superClassId, subId); + TMap::const_iterator it = m_Entries.find(key); + if (it == m_Entries.end()) { nldebug("Trying to erase non-existant key, this is allowed, doing nothing"); return; } + m_Entries.erase(key); +} + +IStorageObject *CAppData::createChunkById(uint16 id, bool container) +{ + switch (id) + { + case PMBS_APP_DATA_HEADER_CHUNK_ID: + nlassert(!container); + return new CStorageValue(); + break; + case PMBS_APP_DATA_ENTRY_CHUNK_ID: + nlassert(container); + return new CAppDataEntry(); + break; + } + return CStorageContainer::createChunkById(id, container); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CAppDataEntryKey::CAppDataEntryKey() +{ + +} + +CAppDataEntryKey::~CAppDataEntryKey() +{ + +} + +std::string CAppDataEntryKey::className() const +{ + return "AppDataEntryKey"; +} + +void CAppDataEntryKey::serial(NLMISC::IStream &stream) +{ + stream.serial(ClassId); + stream.serial(SuperClassId); + stream.serial(SubId); + stream.serial(Size); +} + +void CAppDataEntryKey::toString(std::ostream &ostream, const std::string &pad) const +{ + ostream << "(" << className() << ") { "; + ostream << "\n" << pad << "ClassId: " << NLMISC::toString(ClassId); + ostream << "\n" << pad << "SuperClassId: " << SuperClassId; + ostream << "\n" << pad << "SubId: " << SubId; + ostream << "\n" << pad << "Size: " << Size; + ostream << " } "; +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CAppDataEntry::CAppDataEntry() : m_Key(NULL), m_Raw(NULL), m_Value(NULL) +{ + +} + +CAppDataEntry::~CAppDataEntry() +{ + delete m_Value; + m_Value = NULL; +} + +std::string CAppDataEntry::className() const +{ + return "AppDataEntry"; +} + +void CAppDataEntry::toString(std::ostream &ostream, const std::string &pad) const +{ + if (m_Key && m_Value) + { + ostream << "(" << className() << ") [" << m_Chunks.size() << "] PARSED { "; + std::string padpad = pad + "\t"; + ostream << "\n" << pad << "Key: "; + m_Key->toString(ostream, padpad); + ostream << "\n" << pad << "Value: "; + m_Value->toString(ostream, padpad); + ostream << "} "; + } + else + { + CStorageContainer::toString(ostream, pad); + } +} + +void CAppDataEntry::parse(uint16 version, uint filter) +{ + // CStorageContainer::parse(version); + // if (!m_ChunksOwnsPointers) { nlwarning("Already parsed"); return; } + if (m_Chunks.size() != 2) { nlwarning("Bad container size"); disown(); return; } + + TStorageObjectContainer::iterator it = m_Chunks.begin(); + if (it->first != PMBS_APP_DATA_ENTRY_KEY_CHUNK_ID) { nlwarning("Bad id %x, expected %x", (uint32)it->first, PMBS_APP_DATA_ENTRY_KEY_CHUNK_ID); disown(); return; } + m_Key = static_cast(it->second); + + ++it; + if (it->first != PMBS_APP_DATA_ENTRY_VALUE_CHUNK_ID) { nlwarning("Bad id %x, expected %x", (uint32)it->first, PMBS_APP_DATA_ENTRY_VALUE_CHUNK_ID); disown(); return; } + m_Raw = static_cast(it->second); + + // m_ChunksOwnsPointers = false; + nlassert(m_ChunksOwnsPointers); // Never set false here +} + +void CAppDataEntry::clean() +{ + // CStorageContainer::clean(); + if (m_Value) + { + nlassert(m_Raw); + m_Raw->Value.resize(0); + m_Key->Size = 0xFFFFFFFF; + } +} + +void CAppDataEntry::build(uint16 version, uint filter) +{ + // CStorageContainer::build(version); + if (m_Value) + { + nlassert(m_Raw); + NLMISC::CMemStream mem; + m_Value->serial(mem); + m_Raw->setSize(mem.getPos()); + mem.invert(); + m_Raw->serial(mem); + m_Key->Size = m_Raw->Value.size(); + } +} + +void CAppDataEntry::disown() +{ + // CStorageContainer::disown(); + if (m_Chunks.size() != 2) { nlerror("Not built"); return; } // Built chunks must match the parsed data + m_Key = NULL; + m_Raw = NULL; + delete m_Value; + m_Value = NULL; +} + +void CAppDataEntry::init() +{ + nlassert(m_Chunks.size() == 0); + m_Key = new CAppDataEntryKey(); + m_Chunks.push_back(TStorageObjectWithId(PMBS_APP_DATA_ENTRY_KEY_CHUNK_ID, m_Key)); + m_Raw = new CStorageRaw(); + m_Chunks.push_back(TStorageObjectWithId(PMBS_APP_DATA_ENTRY_VALUE_CHUNK_ID, m_Raw)); +} + +IStorageObject *CAppDataEntry::createChunkById(uint16 id, bool container) +{ + switch (id) + { + case PMBS_APP_DATA_ENTRY_KEY_CHUNK_ID: + nlassert(!container); + return new CAppDataEntryKey(); + case PMBS_APP_DATA_ENTRY_VALUE_CHUNK_ID: + nlassert(!container); + return new CStorageRaw(); + } + return CStorageContainer::createChunkById(id, container); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +} /* namespace STORAGE */ +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/storage/app_data.h b/code/nel/tools/3d/pipeline_max/builtin/storage/app_data.h new file mode 100644 index 000000000..4cdbb01e8 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/storage/app_data.h @@ -0,0 +1,275 @@ +/** + * \file app_data.h + * \brief CAppData + * \date 2012-08-21 11:47GMT + * \author Jan Boon (Kaetemi) + * CAppData + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_APP_DATA_H +#define PIPELINE_APP_DATA_H +#include + +// STL includes + +// NeL includes +#include +#include + +// Project includes +#include "../../typedefs.h" +#include "../../storage_object.h" +#include "../../storage_value.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { +namespace STORAGE { + +#define PMBS_APP_DATA_CHUNK_ID 0x2150 +#define PMBS_APP_DATA_ENTRY_VALUE_CHUNK_ID 0x0130 + +class CAppDataEntry; + +/** + * \brief CAppData + * \date 2012-08-21 11:47GMT + * \author Jan Boon (Kaetemi) + * This implements the AppData chunk in the storage + */ +class CAppData : public CStorageContainer +{ +public: + struct TKey + { + TKey(NLMISC::CClassId classId, TSClassId superClassId, uint32 subId); + NLMISC::CClassId ClassId; + TSClassId SuperClassId; + uint32 SubId; + bool operator<(const TKey &right) const; + bool operator>(const TKey &right) const; + bool operator==(const TKey &right) const; + }; + typedef std::map TMap; + +public: + CAppData(); + virtual ~CAppData(); + + // inherited + virtual std::string className() const; + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + + // init + /// Initialize a new instance of this chunk + void init(); + + // public // TODO: Simplify using templates and returning a specialized storage object, auto-converted to the requested type. + /*/// Gets a pointer to an appdata chunk buffer. Returns NULL if it does not exist. Size is returned in the size parameter. + const uint8 *read(NLMISC::CClassId classId, TSClassId superClassId, uint32 subId, uint32 &size) const; + /// Locks a pointer to an appdata chunk buffer for writing to with specified capacity. May return NULL if this chunk is unparsable or no memory can be allocated. + uint8 *lock(NLMISC::CClassId classId, TSClassId superClassId, uint32 subId, uint32 capacity); + /// Unlocks a pointer to an appdata chunk buffer, setting the final written size. + void unlock(NLMISC::CClassId classId, TSClassId superClassId, uint32 subId, uint32 size); + /// Fills an appdata chunk buffer with specified data, which will be copied. + void fill(NLMISC::CClassId classId, TSClassId superClassId, uint32 subId, uint8 *buffer, uint32 size); + /// Erases an appdata chunk. + void erase(NLMISC::CClassId classId, TSClassId superClassId, uint32 subId);*/ + + // public + /// Gets an appdata chunk storage object, returns NULL if it does not exist + template + T *get(NLMISC::CClassId classId, TSClassId superClassId, uint32 subId); + /// Gets or creates a chunk storage object + template + T *getOrCreate(NLMISC::CClassId classId, TSClassId superClassId, uint32 subId); + /// Erases an appdata chunk. + void erase(NLMISC::CClassId classId, TSClassId superClassId, uint32 subId); + + // read access + /// Return the entries map, do not modify directly + inline const TMap &entries() const { return m_Entries; } + +protected: + virtual IStorageObject *createChunkById(uint16 id, bool container); + +private: + TMap m_Entries; + +}; /* class CAppData */ + +/** + * \brief CAppDataEntryKey + * \date 2012-08-18 18:01GMT + * \author Jan Boon (Kaetemi) + * CAppDataEntryKey + */ +class CAppDataEntryKey : public IStorageObject +{ +public: + CAppDataEntryKey(); + virtual ~CAppDataEntryKey(); + + // public data + NLMISC::CClassId ClassId; + TSClassId SuperClassId; + uint32 SubId; + uint32 Size; + + // inherited + virtual std::string className() const; + virtual void serial(NLMISC::IStream &stream); + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + +}; /* class CAppDataEntryKey */ + +/** + * \brief CAppDataEntry + * \date 2012-08-21 11:47GMT + * \author Jan Boon (Kaetemi) + * This implements an entry in the AppData chunk in the storage + */ +class CAppDataEntry : public CStorageContainer +{ +public: + friend class CAppData; + +public: + CAppDataEntry(); + virtual ~CAppDataEntry(); + + // inherited + virtual std::string className() const; + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + + // public + // Initializes a new entry + void init(); + // Returns the key + inline CAppDataEntryKey *key() { return m_Key; } + // Returns the value + template + T *value(); + +protected: + virtual IStorageObject *createChunkById(uint16 id, bool container); + +private: + CAppDataEntryKey *m_Key; + CStorageRaw *m_Raw; + IStorageObject *m_Value; + +}; /* class CAppDataEntry */ + +template +T *CAppDataEntry::value() +{ + if (m_Value) + { + T *result = dynamic_cast(m_Value); + if (result) + { + return result; + } + else + { + nlwarning("AppData value has already been cast to another type, recasting, the previous chunk becomes invalid, this may not be intended"); + NLMISC::CMemStream mem; + m_Value->serial(mem); + result = new T(); + result->setSize(mem.getPos()); + mem.invert(); + delete m_Value; + m_Value = result; + result->serial(mem); + return result; + } + } + else + { + nlassert(!m_Value); + nlassert(m_Raw); + // nldebug("Casting raw to user type"); + NLMISC::CMemStream mem; + m_Raw->serial(mem); + T *result = new T(); + result->setSize(mem.getPos()); + // nldebug("Read %i", mem.getPos()); + mem.invert(); + m_Raw->Value.resize(0); + m_Key->Size = 0xFFFFFFFF; + m_Value = result; + result->serial(mem); + // nldebug("Wrote %i", mem.getPos()); + return result; + } +} + +template +T *CAppData::get(NLMISC::CClassId classId, TSClassId superClassId, uint32 subId) +{ + if (m_ChunksOwnsPointers) { nlwarning("Not parsed"); return NULL; } + TKey key(classId, superClassId, subId); + TMap::const_iterator it = m_Entries.find(key); + if (it == m_Entries.end()) { nldebug("Trying to read non-existant key, this is allowed, returning NULL"); return NULL; } + return it->second->value(); +} + +template +T *CAppData::getOrCreate(NLMISC::CClassId classId, TSClassId superClassId, uint32 subId) +{ + if (m_ChunksOwnsPointers) { nlwarning("Not parsed"); return NULL; } + TKey key(classId, superClassId, subId); + TMap::const_iterator it = m_Entries.find(key); + CAppDataEntry *appDataEntry; + if (it == m_Entries.end()) + { + appDataEntry = new CAppDataEntry(); + appDataEntry->init(); + m_Entries[key] = appDataEntry; + appDataEntry->key()->ClassId = classId; + appDataEntry->key()->SuperClassId = superClassId; + appDataEntry->key()->SubId = subId; + } + else + { + appDataEntry = it->second; + } + return appDataEntry->value(); +} + +} /* namespace STORAGE */ +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_APP_DATA_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/storage/geom_buffers.cpp b/code/nel/tools/3d/pipeline_max/builtin/storage/geom_buffers.cpp new file mode 100644 index 000000000..54a04fd8d --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/storage/geom_buffers.cpp @@ -0,0 +1,332 @@ +/** + * \file geom_buffers.cpp + * \brief CGeomBuffers + * \date 2012-08-25 07:55GMT + * \author Jan Boon (Kaetemi) + * CGeomBuffers + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "geom_buffers.h" + +// STL includes +#include + +// NeL includes +// #include s + +// Project includes +#include "../../storage_array.h" + +// using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { +namespace STORAGE { + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +#define PMBS_GEOM_BUFFERS_PARSE 0 + +// Elevate warnings to errors in this file for stricter reading +#undef nlwarning +#define nlwarning nlerror + +// Elevate debug to error in this file for debugging +// #undef nldebug +// #define nldebug nlerror + +// Chunk identifiers +#define PMBS_GEOM_BUFFERS_TRI_A_VERTEX_CHUNK_ID 0x0914 +#define PMBS_GEOM_BUFFERS_TRI_A_INDEX_CHUNK_ID 0x0912 +#define PMBS_GEOM_BUFFERS_TRI_B_VERTEX_CHUNK_ID 0x0916 +#define PMBS_GEOM_BUFFERS_TRI_B_INDEX_CHUNK_ID 0x0918 +#define PMBS_GEOM_BUFFERS_TRI_C_VERTEX_CHUNK_ID 0x0938 +#define PMBS_GEOM_BUFFERS_TRI_C_INDEX_CHUNK_ID 0x0942 +#define PBMS_GEOM_BUFFERS_POLY_A_VERTEX_CHUNK_ID 0x0100 +#define PBMS_GEOM_BUFFERS_POLY_A_EDGE_CHUNK_ID 0x010a +#define PBMS_GEOM_BUFFERS_POLY_A_FACE_CHUNK_ID 0x011a + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +void CGeomTriIndex::serial(NLMISC::IStream &stream) +{ + stream.serial(a); + stream.serial(b); + stream.serial(c); +} + +std::string CGeomTriIndex::toString() const +{ + std::stringstream ss; + ss << a << " " << b << " " << c; + return ss.str(); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +void CGeomTriIndexInfo::serial(NLMISC::IStream &stream) +{ + stream.serial(a); + stream.serial(b); + stream.serial(c); + stream.serial(alwaysOne); + stream.serial(smoothingGroups); +} + +std::string CGeomTriIndexInfo::toString() const +{ + std::stringstream ss; + ss << a << " " << b << " " << c << ", " << alwaysOne << " " << smoothingGroups; + return ss.str(); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +void CGeomPolyVertexInfo::serial(NLMISC::IStream &stream) +{ + stream.serial(i1); + stream.serial(v); +} + +std::string CGeomPolyVertexInfo::toString() const +{ + std::stringstream ss; + ss << "0x" << NLMISC::toString("%x", i1) << ", " << v.toString(); + return ss.str(); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +void CGeomPolyEdgeInfo::serial(NLMISC::IStream &stream) +{ + stream.serial(i1); + stream.serial(a); + stream.serial(b); +} + +std::string CGeomPolyEdgeInfo::toString() const +{ + std::stringstream ss; + ss << "0x" << NLMISC::toString("%x", i1) << ", " << a << " " << b; + return ss.str(); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CGeomPolyFaceInfo::CGeomPolyFaceInfo() : I1(0), Material(0), SmoothingGroups(0) +{ + +} + +void CGeomPolyFaceInfo::serial(NLMISC::IStream &stream) +{ + // nldebug("go"); + stream.serialCont(Vertices); + // nldebug("%i vertices", Vertices.size()); + uint16 bitfield; + if (!stream.isReading()) + { + /*nldebug("writing");*/ + bitfield = 0x0000; + if (I1) bitfield |= 0x0001; + // bitfield |= 0x0002; + // bitfield |= 0x0004; + if (Material) bitfield |= 0x0008; + if (SmoothingGroups) bitfield |= 0x0010; + if (Triangulation.size()) bitfield |= 0x0020; + // bitfield |= 0x0040; + // bitfield |= 0x0080; + } + stream.serial(bitfield); + // nldebug("bitfield 0x%x", (uint32)bitfield); + if (bitfield & 0x0001) { /*nldebug("i1");*/ stream.serial(I1); nlassert(I1); bitfield &= ~0x0001; } + else I1 = 0; + if (bitfield & 0x0008) { /*nldebug("material");*/ stream.serial(Material); nlassert(Material); bitfield &= ~0x0008; } + else Material = 0; + if (bitfield & 0x0010) { /*nldebug("smoothing");*/ stream.serial(SmoothingGroups); nlassert(SmoothingGroups); bitfield &= ~0x0010; } + else SmoothingGroups = 0; + if (bitfield & 0x0020) + { + /*nldebug("triangles");*/ + if (stream.isReading()) Triangulation.resize(Vertices.size() - 3); + else nlassert(Triangulation.size() == Vertices.size() - 3); + for (std::vector >::size_type i = 0; i < Triangulation.size(); ++i) + { + stream.serial(Triangulation[i].first); + /*nldebug("cut from %i", Triangulation[i].first);*/ + nlassert(Triangulation[i].first < Vertices.size()); + stream.serial(Triangulation[i].second); + /*nldebug("to %i", Triangulation[i].second);*/ + nlassert(Triangulation[i].second < Vertices.size()); + } + nlassert(Triangulation.size()); + bitfield &= ~0x0020; + } + if (bitfield) nlerror("Remaining bitfield value 0x%x, please debug and implement", (uint32)bitfield); +} + +std::string CGeomPolyFaceInfo::toString() const +{ + std::stringstream ss; + ss << "( "; + for (std::vector::size_type i = 0; i < Vertices.size(); ++i) + { + ss << Vertices[i] << " "; + } + ss << ")"; + if (I1) ss << ", I1: " << "0x" << NLMISC::toString("%x", I1); + if (Material) ss << ", M: " << Material; + if (SmoothingGroups) ss << ", S: " << SmoothingGroups; + if (Triangulation.size()) + { + ss << ", ( "; + for (std::vector >::size_type i = 0; i < Triangulation.size(); ++i) + { + ss << Triangulation[i].first << ":" << Triangulation[i].second << " "; + } + ss << ")"; + } + ss << " "; + return ss.str(); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CGeomBuffers::CGeomBuffers() +{ + +} + +CGeomBuffers::~CGeomBuffers() +{ + +} + +std::string CGeomBuffers::className() const +{ + return "GeomBuffers"; +} + +void CGeomBuffers::toString(std::ostream &ostream, const std::string &pad) const +{ + CStorageContainer::toString(ostream, pad); +} + +void CGeomBuffers::parse(uint16 version, uint filter) +{ +#if PMBS_GEOM_BUFFERS_PARSE + CStorageContainer::parse(version); +#else + CStorageContainer::parse(version); +#endif +} + +void CGeomBuffers::clean() +{ +#if PMBS_GEOM_BUFFERS_PARSE + CStorageContainer::clean(); +#else + CStorageContainer::clean(); +#endif +} + +void CGeomBuffers::build(uint16 version, uint filter) +{ +#if PMBS_GEOM_BUFFERS_PARSE + CStorageContainer::build(version); +#else + CStorageContainer::build(version); +#endif +} + +void CGeomBuffers::disown() +{ +#if PMBS_GEOM_BUFFERS_PARSE + CStorageContainer::disown(); +#else + CStorageContainer::disown(); +#endif +} + +IStorageObject *CGeomBuffers::createChunkById(uint16 id, bool container) +{ +#if PMBS_GEOM_BUFFERS_PARSE + switch (id) + { + // nlassert(!container); + // return new CStorageArray(); + //case PBMS_GEOM_BUFFERS_POLY_A_INDEX_B_CHUNK_ID: + // nlassert(!container); + // return new CStorageArray(); + case PBMS_GEOM_BUFFERS_POLY_A_VERTEX_CHUNK_ID: + nlassert(!container); + return new CStorageArraySizePre(); + case PBMS_GEOM_BUFFERS_POLY_A_EDGE_CHUNK_ID: + nlassert(!container); + return new CStorageArraySizePre(); + case PBMS_GEOM_BUFFERS_POLY_A_FACE_CHUNK_ID: + nlassert(!container); + return new CStorageArrayDynSize(); + case PMBS_GEOM_BUFFERS_TRI_B_INDEX_CHUNK_ID: + case PMBS_GEOM_BUFFERS_TRI_C_INDEX_CHUNK_ID: + nlassert(!container); + return new CStorageArray(); // nb: parse should check if the sizes match with tri_a size (which is the master index buffer) + case PMBS_GEOM_BUFFERS_TRI_A_INDEX_CHUNK_ID: + nlassert(!container); + return new CStorageArraySizePre(); + case PMBS_GEOM_BUFFERS_TRI_A_VERTEX_CHUNK_ID: + case PMBS_GEOM_BUFFERS_TRI_B_VERTEX_CHUNK_ID: + case PMBS_GEOM_BUFFERS_TRI_C_VERTEX_CHUNK_ID: + nlassert(!container); + return new CStorageArraySizePre(); + } +#endif + return CStorageContainer::createChunkById(id, container); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +} /* namespace STORAGE */ +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/storage/geom_buffers.h b/code/nel/tools/3d/pipeline_max/builtin/storage/geom_buffers.h new file mode 100644 index 000000000..3d4cd99a7 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/storage/geom_buffers.h @@ -0,0 +1,134 @@ +/** + * \file geom_buffers.h + * \brief CGeomBuffers + * \date 2012-08-25 07:55GMT + * \author Jan Boon (Kaetemi) + * CGeomBuffers + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_GEOM_BUFFERS_H +#define PIPELINE_GEOM_BUFFERS_H +#include + +// STL includes + +// NeL includes +#include + +// Project includes +#include "../../storage_object.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { +namespace STORAGE { + +struct CGeomTriIndex +{ + uint32 a; + uint32 b; + uint32 c; + void serial(NLMISC::IStream &stream); + std::string toString() const; +}; + +struct CGeomTriIndexInfo +{ + uint32 a; + uint32 b; + uint32 c; + uint32 alwaysOne; + uint32 smoothingGroups; + void serial(NLMISC::IStream &stream); + std::string toString() const; +}; + +struct CGeomPolyVertexInfo +{ + uint32 i1; + NLMISC::CVector v; + void serial(NLMISC::IStream &stream); + std::string toString() const; +}; + +struct CGeomPolyEdgeInfo +{ + uint32 i1; + uint32 a; + uint32 b; + void serial(NLMISC::IStream &stream); + std::string toString() const; +}; + +struct CGeomPolyFaceInfo +{ + CGeomPolyFaceInfo(); + /// Vertex indices in the vertex buffer + std::vector Vertices; + // Bitfield (implicitly stored) + /// Unknown 01 00 01 00 + uint32 I1; + // Unknown? + // Unknown? + /// Material index in multi-submat + uint16 Material; + /// Bitfield with smoothing groups + uint32 SmoothingGroups; + /// Cuts at local vertex index to local vertex index + std::vector > Triangulation; + void serial(NLMISC::IStream &stream); + std::string toString() const; +}; + +/** + * \brief CGeomBuffers + * \date 2012-08-25 07:55GMT + * \author Jan Boon (Kaetemi) + * CGeomBuffers + */ +class CGeomBuffers : public CStorageContainer +{ +public: + CGeomBuffers(); + virtual ~CGeomBuffers(); + + // inherited + virtual std::string className() const; + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + +protected: + virtual IStorageObject *createChunkById(uint16 id, bool container); + +}; /* class CGeomBuffers */ + +} /* namespace STORAGE */ +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_GEOM_BUFFERS_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/super_class_unknown.cpp b/code/nel/tools/3d/pipeline_max/builtin/super_class_unknown.cpp new file mode 100644 index 000000000..da0c38ae0 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/super_class_unknown.cpp @@ -0,0 +1,59 @@ +/** + * \file super_class_unknown.cpp + * \brief CSuperClassUnknown + * \date 2012-08-22 08:59GMT + * \author Jan Boon (Kaetemi) + * CSuperClassUnknown + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "super_class_unknown.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CSuperClassUnknown::CSuperClassUnknown() +{ + +} + +CSuperClassUnknown::~CSuperClassUnknown() +{ + +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/super_class_unknown.h b/code/nel/tools/3d/pipeline_max/builtin/super_class_unknown.h new file mode 100644 index 000000000..81944aec7 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/super_class_unknown.h @@ -0,0 +1,67 @@ +/** + * \file super_class_unknown.h + * \brief CSuperClassUnknown + * \date 2012-08-22 08:59GMT + * \author Jan Boon (Kaetemi) + * CSuperClassUnknown + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_SUPER_CLASS_UNKNOWN_H +#define PIPELINE_SUPER_CLASS_UNKNOWN_H +#include + +// STL includes + +// NeL includes + +// Project includes + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CSuperClassUnknown + * \date 2012-08-22 08:59GMT + * \author Jan Boon (Kaetemi) + * CSuperClassUnknown + */ +class CSuperClassUnknown +{ +protected: + // pointers + // ... + + // instances + // ... +public: + CSuperClassUnknown(); + virtual ~CSuperClassUnknown(); +}; /* class CSuperClassUnknown */ + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_SUPER_CLASS_UNKNOWN_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/texmap.cpp b/code/nel/tools/3d/pipeline_max/builtin/texmap.cpp new file mode 100644 index 000000000..600542bb7 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/texmap.cpp @@ -0,0 +1,59 @@ +/** + * \file texmap.cpp + * \brief CTexmap + * \date 2012-08-22 08:56GMT + * \author Jan Boon (Kaetemi) + * CTexmap + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "texmap.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CTexmap::CTexmap(CScene *scene) : CMtlBase(scene) +{ + +} + +CTexmap::~CTexmap() +{ + +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/texmap.h b/code/nel/tools/3d/pipeline_max/builtin/texmap.h new file mode 100644 index 000000000..da2fc376a --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/texmap.h @@ -0,0 +1,63 @@ +/** + * \file texmap.h + * \brief CTexmap + * \date 2012-08-22 08:56GMT + * \author Jan Boon (Kaetemi) + * CTexmap + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_TEXMAP_H +#define PIPELINE_TEXMAP_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "mtl_base.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CTexmap + * \date 2012-08-22 08:56GMT + * \author Jan Boon (Kaetemi) + * CTexmap + */ +class CTexmap : public CMtlBase +{ +public: + CTexmap(CScene *scene); + virtual ~CTexmap(); + +}; /* class CTexmap */ + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_TEXMAP_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/track_view_node.cpp b/code/nel/tools/3d/pipeline_max/builtin/track_view_node.cpp new file mode 100644 index 000000000..3a4b8978b --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/track_view_node.cpp @@ -0,0 +1,192 @@ +/** + * \file track_view_node.cpp + * \brief CTrackViewNode + * \date 2012-08-24 09:44GMT + * \author Jan Boon (Kaetemi) + * CTrackViewNode + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "track_view_node.h" + +// STL includes +#include + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +#define PMB_TVNODE_EMPTY0140_CHUNK_ID 0x0140 +#define PMB_TVNODE_EMPTY0150_CHUNK_ID 0x0150 + +#define PMB_TVNODE_DISPLAYNAME_CHUNK_ID 0x0110 +#define PMB_TVNODE_IDENTIFIER_CHUNK_ID 0x0120 +#define PMB_TVNODE_ISNOTNODE_CHUNK_ID 0x0130 + +CTrackViewNode::CTrackViewNode(CScene *scene) : CReferenceTarget(scene), m_Empty0140(NULL), m_Empty0150(NULL) +{ + +} + +CTrackViewNode::~CTrackViewNode() +{ + +} + +const ucstring CTrackViewNode::DisplayName = ucstring("TVNode"); +const char *CTrackViewNode::InternalName = "TrackViewNode"; +const NLMISC::CClassId CTrackViewNode::ClassId = NLMISC::CClassId(0x8d73b8aa, 0x90f2ee71); +const TSClassId CTrackViewNode::SuperClassId = CReferenceTarget::SuperClassId; +const CTrackViewNodeClassDesc TrackViewNodeClassDesc(&DllPluginDescBuiltin); + +void CTrackViewNode::parse(uint16 version, uint filter) +{ + CReferenceTarget::parse(version); + if (!m_ChunksOwnsPointers) + { + // Read unknown chunks + m_Empty0140 = static_cast(getChunk(PMB_TVNODE_EMPTY0140_CHUNK_ID)); + if (m_Empty0140) nlassert(m_Empty0140->Value.empty()); + m_Empty0150 = static_cast(getChunk(PMB_TVNODE_EMPTY0150_CHUNK_ID)); + if (m_Empty0150) nlassert(m_Empty0140->Value.empty()); + + // Read child nodes + for (std::vector::size_type i = 0; i < m_Children.size(); ++i) + { + m_Children[i].DisplayName = getChunkValue(PMB_TVNODE_DISPLAYNAME_CHUNK_ID); + m_Children[i].Identifier = getChunkValue(PMB_TVNODE_IDENTIFIER_CHUNK_ID); + m_Children[i].IsNotAnotherNode = getChunkValue(PMB_TVNODE_ISNOTNODE_CHUNK_ID); + } + } +} + +void CTrackViewNode::clean() +{ + CReferenceTarget::clean(); +} + +void CTrackViewNode::build(uint16 version, uint filter) +{ + CReferenceTarget::build(version); + + // Write unknown chunks + if (m_Empty0140) putChunk(PMB_TVNODE_EMPTY0140_CHUNK_ID, m_Empty0140); + if (m_Empty0150) putChunk(PMB_TVNODE_EMPTY0150_CHUNK_ID, m_Empty0150); + + // Write child nodes + for (std::vector::size_type i = 0; i < m_Children.size(); ++i) + { + putChunkValue(PMB_TVNODE_DISPLAYNAME_CHUNK_ID, m_Children[i].DisplayName); + putChunkValue(PMB_TVNODE_IDENTIFIER_CHUNK_ID, m_Children[i].Identifier); + putChunkValue(PMB_TVNODE_ISNOTNODE_CHUNK_ID, m_Children[i].IsNotAnotherNode); + } +} + +void CTrackViewNode::disown() +{ + m_Children.clear(); + CReferenceTarget::disown(); +} + +void CTrackViewNode::init() +{ + CReferenceTarget::init(); +} + +bool CTrackViewNode::inherits(const NLMISC::CClassId classId) const +{ + if (classId == classDesc()->classId()) return true; + return CReferenceTarget::inherits(classId); +} + +const ISceneClassDesc *CTrackViewNode::classDesc() const +{ + return &TrackViewNodeClassDesc; +} + +void CTrackViewNode::toStringLocal(std::ostream &ostream, const std::string &pad, uint filter) const +{ + CReferenceTarget::toStringLocal(ostream, pad); + if (m_Empty0140) ostream << "\n" << pad << "Empty 0x0140 "; + if (m_Empty0150) ostream << "\n" << pad << "Empty 0x0150 "; + // std::string padpad = pad + "\t"; + for (std::vector::size_type i = 0; i < m_Children.size(); ++i) + { + CReferenceMaker *referenceMaker = m_Children[i].Reference; + nlassert(referenceMaker); + ostream << "\n" << pad << i << ": "; + ostream << "(" << ucstring(referenceMaker->classDesc()->displayName()).toUtf8() << ", " << referenceMaker->classDesc()->classId().toString() << ") "; + ostream << "(" << m_Children[i].DisplayName.toUtf8() << ", " << m_Children[i].Identifier.toString() << ", " << (m_Children[i].IsNotAnotherNode ? "ENTRY" : "TVNODE") << ") "; + } +} + +CReferenceMaker *CTrackViewNode::getReference(uint index) const +{ + if (m_Children.size() <= index) return NULL; + return m_Children[index].Reference; +} + +void CTrackViewNode::setReference(uint index, CReferenceMaker *reference) +{ + if (m_Children.size() <= index) m_Children.resize(index + 1); + m_Children[index].Reference = reference; +} + +uint CTrackViewNode::nbReferences() const +{ + return m_Children.size(); +} + +IStorageObject *CTrackViewNode::createChunkById(uint16 id, bool container) +{ + switch (id) + { + case PMB_TVNODE_DISPLAYNAME_CHUNK_ID: + return new CStorageValue(); + case PMB_TVNODE_IDENTIFIER_CHUNK_ID: + return new CStorageValue(); + case PMB_TVNODE_ISNOTNODE_CHUNK_ID: + return new CStorageValue(); + } + return CReferenceTarget::createChunkById(id, container); +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/track_view_node.h b/code/nel/tools/3d/pipeline_max/builtin/track_view_node.h new file mode 100644 index 000000000..4aca39c0d --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/track_view_node.h @@ -0,0 +1,109 @@ +/** + * \file track_view_node.h + * \brief CTrackViewNode + * \date 2012-08-24 09:44GMT + * \author Jan Boon (Kaetemi) + * CTrackViewNode + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_TRACK_VIEW_NODE_H +#define PIPELINE_TRACK_VIEW_NODE_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "reference_target.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CTrackViewNode + * \date 2012-08-24 09:44GMT + * \author Jan Boon (Kaetemi) + * TVNode + */ +class CTrackViewNode : public CReferenceTarget +{ +public: + struct TChild + { + TChild() : IsNotAnotherNode(0) { } + NLMISC::CRefPtr Reference; + ucstring DisplayName; + NLMISC::CClassId Identifier; + sint32 IsNotAnotherNode; + }; + + CTrackViewNode(CScene *scene); + virtual ~CTrackViewNode(); + + // class desc + static const ucstring DisplayName; + static const char *InternalName; + static const NLMISC::CClassId ClassId; + static const TSClassId SuperClassId; + + // inherited + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + virtual void init(); + virtual bool inherits(const NLMISC::CClassId classId) const; + virtual const ISceneClassDesc *classDesc() const; + virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "", uint filter = 0) const; + + // reference maker + virtual CReferenceMaker *getReference(uint index) const; + virtual void setReference(uint index, CReferenceMaker *reference); + virtual uint nbReferences() const; + + // read access + inline const std::vector &children() const { return m_Children; } + +protected: + // inherited + virtual IStorageObject *createChunkById(uint16 id, bool container); + +private: + CStorageRaw *m_Empty0140; + CStorageRaw *m_Empty0150; + + std::vector m_Children; + +}; /* class CTrackViewNode */ + +typedef CSceneClassDesc CTrackViewNodeClassDesc; +extern const CTrackViewNodeClassDesc TrackViewNodeClassDesc; + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_TRACK_VIEW_NODE_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/tri_object.cpp b/code/nel/tools/3d/pipeline_max/builtin/tri_object.cpp new file mode 100644 index 000000000..71184d038 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/tri_object.cpp @@ -0,0 +1,147 @@ +/** + * \file tri_object.cpp + * \brief CTriObject + * \date 2012-08-22 08:58GMT + * \author Jan Boon (Kaetemi) + * CTriObject + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "tri_object.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +CTriObject::CTriObject(CScene *scene) : CGeomObject(scene) +{ + +} + +CTriObject::~CTriObject() +{ + +} + +const ucstring CTriObject::DisplayName = ucstring("TriObject"); +const char *CTriObject::InternalName = "TriObject"; +const NLMISC::CClassId CTriObject::ClassId = NLMISC::CClassId(0x4553fa6, 0x30f8421e); /* Not official, please correct */ +const TSClassId CTriObject::SuperClassId = CGeomObject::SuperClassId; +const CTriObjectClassDesc TriObjectClassDesc(&DllPluginDescBuiltin); + +void CTriObject::parse(uint16 version, uint filter) +{ + if (filter == 0) + { + CGeomObject::parse(version); + } + else if (filter == PMB_TRI_OBJECT_PARSE_FILTER) + { + if (!m_ChunksOwnsPointers) + { + CGeomObject::parse(version, PMB_GEOM_OBJECT_PARSE_FILTER); + // 0x0901 + // 0x0902 + // 0x0904 + // 0x0903 + } + } +} + +void CTriObject::clean() +{ + CGeomObject::clean(); +} + +void CTriObject::build(uint16 version, uint filter) +{ + if (filter == 0) + { + CGeomObject::build(version); + } + else if (filter == PMB_TRI_OBJECT_PARSE_FILTER) + { + CGeomObject::build(version, PMB_GEOM_OBJECT_PARSE_FILTER); + // 0x0901 + // 0x0902 + // 0x0904 + // 0x0903 + } +} + +void CTriObject::disown() +{ + CGeomObject::disown(); +} + +void CTriObject::init() +{ + CGeomObject::init(); +} + +bool CTriObject::inherits(const NLMISC::CClassId classId) const +{ + if (classId == classDesc()->classId()) return true; + return CGeomObject::inherits(classId); +} + +const ISceneClassDesc *CTriObject::classDesc() const +{ + return &TriObjectClassDesc; +} + +void CTriObject::toStringLocal(std::ostream &ostream, const std::string &pad, uint filter) const +{ + if (filter == 0) + { + CGeomObject::toStringLocal(ostream, pad); + } + else if (filter == PMB_TRI_OBJECT_PARSE_FILTER) + { + CGeomObject::toStringLocal(ostream, pad, PMB_GEOM_OBJECT_PARSE_FILTER); + // 0x0901 + // 0x0902 + // 0x0904 + // 0x0903 + } +} + +IStorageObject *CTriObject::createChunkById(uint16 id, bool container) +{ + return CGeomObject::createChunkById(id, container); +} + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/builtin/tri_object.h b/code/nel/tools/3d/pipeline_max/builtin/tri_object.h new file mode 100644 index 000000000..fafdab2a0 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/builtin/tri_object.h @@ -0,0 +1,90 @@ +/** + * \file tri_object.h + * \brief CTriObject + * \date 2012-08-22 08:58GMT + * \author Jan Boon (Kaetemi) + * CTriObject + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_TRI_OBJECT_H +#define PIPELINE_TRI_OBJECT_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "geom_object.h" + +/// Must be passed to the parse and build functions by +/// inheriting classes to parse the actual tri object. +#define PMB_TRI_OBJECT_PARSE_FILTER 0x38f55e43 + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +/** + * \brief CTriObject + * \date 2012-08-22 08:58GMT + * \author Jan Boon (Kaetemi) + * CTriObject + */ +class CTriObject : public CGeomObject +{ +public: + CTriObject(CScene *scene); + virtual ~CTriObject(); + + // class desc + static const ucstring DisplayName; + static const char *InternalName; + static const NLMISC::CClassId ClassId; + static const TSClassId SuperClassId; + + // inherited + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + virtual void init(); + virtual bool inherits(const NLMISC::CClassId classId) const; + virtual const ISceneClassDesc *classDesc() const; + virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "", uint filter = 0) const; + +protected: + // inherited + virtual IStorageObject *createChunkById(uint16 id, bool container); + +}; /* class CTriObject */ + +typedef CSceneClassDesc CTriObjectClassDesc; +extern const CTriObjectClassDesc TriObjectClassDesc; + +} /* namespace BUILTIN */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_TRI_OBJECT_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/class_data.cpp b/code/nel/tools/3d/pipeline_max/class_data.cpp new file mode 100644 index 000000000..05c3688d3 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/class_data.cpp @@ -0,0 +1,203 @@ +/** + * \file class_data.cpp + * \brief CClassData + * \date 2012-08-18 19:24GMT + * \author Jan Boon (Kaetemi) + * CClassData + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "class_data.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CClassData::CClassData() +{ + +} + +CClassData::~CClassData() +{ + +} + +std::string CClassData::className() const +{ + return "ClassData"; +} + +void CClassData::toString(std::ostream &ostream, const std::string &pad) const +{ + CStorageContainer::toString(ostream, pad); +} + +void CClassData::parse(uint16 version, uint filter) +{ + CStorageContainer::parse(version); +} + +void CClassData::clean() +{ + CStorageContainer::clean(); +} + +void CClassData::build(uint16 version, uint filter) +{ + CStorageContainer::build(version); +} + +void CClassData::disown() +{ + CStorageContainer::disown(); +} + +IStorageObject *CClassData::createChunkById(uint16 id, bool container) +{ + if (container) + { + switch (id) + { + case 0x2100: // ClassDataEntry + return new CClassDataEntry(); + } + } + return CStorageContainer::createChunkById(id, container); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CClassDataEntry::CClassDataEntry() +{ + +} + +CClassDataEntry::~CClassDataEntry() +{ + +} + +std::string CClassDataEntry::className() const +{ + return "ClassDataEntry"; +} + +void CClassDataEntry::toString(std::ostream &ostream, const std::string &pad) const +{ + CStorageContainer::toString(ostream, pad); +} + +void CClassDataEntry::parse(uint16 version, uint filter) +{ + CStorageContainer::parse(version); +} + +void CClassDataEntry::clean() +{ + CStorageContainer::clean(); +} + +void CClassDataEntry::build(uint16 version, uint filter) +{ + CStorageContainer::build(version); +} + +void CClassDataEntry::disown() +{ + CStorageContainer::disown(); +} + +IStorageObject *CClassDataEntry::createChunkById(uint16 id, bool container) +{ + if (!container) + { + switch (id) + { + case 0x2110: // ClassDataHeader + return new CClassDataHeader(); + } + } + switch (id) + { + case 0x2120: // ClassDataBody: Depends on the ClassDataHeader: TODO + return CStorageContainer::createChunkById(id, container); + } + return CStorageContainer::createChunkById(id, container); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CClassDataHeader::CClassDataHeader() +{ + +} + +CClassDataHeader::~CClassDataHeader() +{ + +} + +std::string CClassDataHeader::className() const +{ + return "ClassDataHeader"; +} + +void CClassDataHeader::serial(NLMISC::IStream &stream) +{ + stream.serial(ClassID); + stream.serial(SuperClassID); +} + +void CClassDataHeader::toString(std::ostream &ostream, const std::string &pad) const +{ + ostream << "(" << className() << ") { "; + ostream << "\n" << pad << "ClassID: " << NLMISC::toString(ClassID); + ostream << "\n" << pad << "SuperClassID: " << SuperClassID; + ostream << " } "; +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/class_data.h b/code/nel/tools/3d/pipeline_max/class_data.h new file mode 100644 index 000000000..1515f4062 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/class_data.h @@ -0,0 +1,122 @@ +/** + * \file class_data.h + * \brief CClassData + * \date 2012-08-18 19:24GMT + * \author Jan Boon (Kaetemi) + * CClassData + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_CLASS_DATA_H +#define PIPELINE_CLASS_DATA_H +#include + +// STL includes + +// NeL includes +#include + +// Project includes +#include "storage_object.h" +#include "storage_value.h" + +namespace PIPELINE { +namespace MAX { + +/** + * \brief CClassData + * \date 2012-08-18 19:24GMT + * \author Jan Boon (Kaetemi) + * CClassData + */ +class CClassData : public CStorageContainer +{ +public: + CClassData(); + virtual ~CClassData(); + + // inherited + virtual std::string className() const; + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + +protected: + virtual IStorageObject *createChunkById(uint16 id, bool container); + +}; /* class CClassData */ + +/** + * \brief CClassDataEntry + * \date 2012-08-18 18:01GMT + * \author Jan Boon (Kaetemi) + * CClassDataEntry + */ +class CClassDataEntry : public CStorageContainer +{ +public: + CClassDataEntry(); + virtual ~CClassDataEntry(); + + // inherited + virtual std::string className() const; + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + +protected: + virtual IStorageObject *createChunkById(uint16 id, bool container); + +}; /* class CClassDataEntry */ + +/** + * \brief CClassDataHeader + * \date 2012-08-18 18:01GMT + * \author Jan Boon (Kaetemi) + * CClassDataHeader + */ +class CClassDataHeader : public IStorageObject +{ +public: + CClassDataHeader(); + virtual ~CClassDataHeader(); + + // public data + NLMISC::CClassId ClassID; + uint32 SuperClassID; + + // inherited + virtual std::string className() const; + virtual void serial(NLMISC::IStream &stream); + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + +}; /* class CClassDataHeader */ + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_CLASS_DATA_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/class_directory_3.cpp b/code/nel/tools/3d/pipeline_max/class_directory_3.cpp new file mode 100644 index 000000000..bbe46eefe --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/class_directory_3.cpp @@ -0,0 +1,430 @@ +/** + * \file class_directory_3.cpp + * \brief CClassDirectory3 + * \date 2012-08-18 18:01GMT + * \author Jan Boon (Kaetemi) + * CClassDirectory3 + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "class_directory_3.h" + +// STL includes +#include + +// NeL includes +// #include + +// Project includes +#include "dll_directory.h" + +// using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CClassDirectory3::CClassDirectory3(CDllDirectory *dllDirectory) : m_DllDirectory(dllDirectory) +{ + +} + +// Parallel to CDllDirectory +CClassDirectory3::~CClassDirectory3() +{ + // Delete m_ChunkCache and m_Entries when !m_ChunksOwnsPointers + if (!m_ChunksOwnsPointers) + { + for (TStorageObjectContainer::iterator it = m_ChunkCache.begin(), end = m_ChunkCache.end(); it != end; ++it) + { + delete it->second; + } + for (std::vector::iterator subit = m_Entries.begin(), subend = m_Entries.end(); subit != subend; ++subit) + { + delete (*subit); + } + } + m_ChunkCache.clear(); + m_Entries.clear(); + m_ClassIdToIndex.clear(); +} + +std::string CClassDirectory3::className() const +{ + return "ClassDirectory3"; +} + +// Parallel to CDllDirectory +void CClassDirectory3::toString(std::ostream &ostream, const std::string &pad) const +{ + if (m_ChunksOwnsPointers) + { + CStorageContainer::toString(ostream, pad); + } + else + { + ostream << "(" << className() << ") [" << m_Chunks.size() << "] PARSED { "; + std::string padpad = pad + "\t"; + sint i = 0; + for (TStorageObjectContainer::const_iterator it = m_ChunkCache.begin(), end = m_ChunkCache.end(); it != end; ++it) + { + uint16 id = it->first; + switch (id) + { + case 0x2040: // ClassEntry + { + uint subi = 0; + for (std::vector::const_iterator subit = m_Entries.begin(), subend = m_Entries.end(); subit != subend; ++subit) + { + ostream << "\n" << pad << "Entries[" << subi << "]: "; + (*subit)->toString(ostream, padpad); + ++subi; + } + } + break; + default: + std::stringstream ss; + ss << std::hex << std::setfill('0'); + ss << std::setw(4) << it->first; + ostream << "\n" << pad << "0x" << ss.str() << ": "; + it->second->toString(ostream, padpad); + ++i; + break; + } + } + ostream << "} "; + } +} + +// Parallel to CDllDirectory +void CClassDirectory3::parse(uint16 version, uint filter) +{ + // Ensure not yet parsed + nlassert(m_ChunkCache.empty()); + nlassert(m_Entries.empty()); + + // Parse entries first + CStorageContainer::parse(version); + + // Initialize + uint16 lastCached = 0xFFFF; + bool parsedDllEntry = false; + + // Parse chunks + for (TStorageObjectContainer::iterator it = m_Chunks.begin(), end = m_Chunks.end(); it != end; ++it) + { + uint16 id = it->first; + switch (id) + { + case 0x2040: // ClassEntry + { + if (parsedDllEntry && (lastCached != id)) + throw EStorageParse(); // There were chunks inbetween + if (!parsedDllEntry) + { + m_ChunkCache.push_back(TStorageObjectWithId(id, NULL)); // Dummy entry to know the location + lastCached = id; + parsedDllEntry = true; + } + CClassEntry *classEntry = static_cast(it->second); + m_ClassIdToIndex[classEntry->classId()] = m_Entries.size(); + m_Entries.push_back(classEntry); + break; + } + default: + m_ChunkCache.push_back(*it); // Dummy entry to know the location + lastCached = id; + break; + } + } + + // Now ownership of the pointers lies in m_ChunkCache and m_Entries + m_ChunksOwnsPointers = false; +} + +// Parallel to CDllDirectory +void CClassDirectory3::clean() +{ + // Ensure parsed + nlassert(!m_ChunksOwnsPointers); + + // Clear m_Chunks + m_Chunks.clear(); + + // Clean chunks + for (TStorageObjectContainer::iterator it = m_ChunkCache.begin(), end = m_ChunkCache.end(); it != end; ++it) + { + if (it->second != NULL && it->second->isContainer()) + { + static_cast(it->second)->clean(); + } + } + for (std::vector::iterator subit = m_Entries.begin(), subend = m_Entries.end(); subit != subend; ++subit) + { + (*subit)->clean(); + } +} + +// Parallel to CDllDirectory +void CClassDirectory3::build(uint16 version, uint filter) +{ + // Ensure parsed + nlassert(!m_ChunksOwnsPointers); + + // Initialize + nlassert(m_Chunks.empty()); + + // Set up the m_Chunks list, when (CClassEntry::ID, NULL) is found write out all of the entries. + for (TStorageObjectContainer::iterator it = m_ChunkCache.begin(), end = m_ChunkCache.end(); it != end; ++it) + { + uint16 id = it->first; + switch (id) + { + case 0x2040: // ClassEntry + for (std::vector::iterator subit = m_Entries.begin(), subend = m_Entries.end(); subit != subend; ++subit) + m_Chunks.push_back(TStorageObjectWithId(id, (*subit))); + break; + default: + m_Chunks.push_back(*it); + break; + } + } + + // Build the entries last (after m_Chunks is built) + CStorageContainer::build(version); + + // NOTE: Ownership remains with m_ChunkCache and m_Entries +} + +// Parallel to CDllDirectory +void CClassDirectory3::disown() +{ + m_ChunkCache.clear(); + m_Entries.clear(); + m_ClassIdToIndex.clear(); + + // Ownership goes back to m_Chunks + m_ChunksOwnsPointers = true; + + // Disown child chunks + CStorageContainer::disown(); +} + +// Parallel to CDllDirectory +const CClassEntry *CClassDirectory3::get(uint16 index) const +{ + nlassert(!m_ChunksOwnsPointers); + if (index >= m_Entries.size()) { nlerror("Index 0x%x is above the number of entries %i", (uint32)index, (uint32)m_Entries.size()); return NULL; } + return m_Entries[index]; +} + +// Parallel to CDllDirectory +void CClassDirectory3::reset() +{ + nlassert(!m_ChunksOwnsPointers); + for (std::vector::iterator subit = m_Entries.begin(), subend = m_Entries.end(); subit != subend; ++subit) + { + delete (*subit); + } + m_Entries.clear(); + m_ClassIdToIndex.clear(); +} + +// Parallel to CDllDirectory +uint16 CClassDirectory3::getOrCreateIndex(const ISceneClassDesc *sceneClassDesc) +{ + nlassert(!m_ChunksOwnsPointers); + std::map::iterator it = m_ClassIdToIndex.find(sceneClassDesc->classId()); + + // Return existing index + if (it != m_ClassIdToIndex.end()) + return it->second; + + // Create new entry + CClassEntry *classEntry = new CClassEntry(m_DllDirectory, sceneClassDesc); + uint16 index = m_Entries.size(); + m_ClassIdToIndex[classEntry->classId()] = index; + m_Entries.push_back(classEntry); + return index; +} + +IStorageObject *CClassDirectory3::createChunkById(uint16 id, bool container) +{ + if (container) + { + switch (id) + { + case 0x2040: // ClassEntry + return new CClassEntry(); + } + } + return CStorageContainer::createChunkById(id, container); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +// Entries[13]: (ClassEntry) [2] { +// 0 0x2060: (ClassEntryHeader) { +// DllIndex: -2 +// ClassID: (0x222b9eb9, 0x64c75fec) +// SuperClassID: 3072 } +// 1 0x2042: (CStorageValue) { NeL Material } } + +CClassEntry::CClassEntry() : m_Header(NULL), m_Name(NULL) +{ + +} + +CClassEntry::CClassEntry(CDllDirectory *dllDirectory, const ISceneClassDesc *sceneClassDesc) : m_Header(new CClassEntryHeader()), m_Name(new CStorageValue()) +{ + m_Chunks.push_back(TStorageObjectWithId(0x2060, m_Header)); + m_Chunks.push_back(TStorageObjectWithId(0x2042, m_Name)); + m_Header->DllIndex = dllDirectory->getOrCreateIndex(sceneClassDesc->dllPluginDesc()); + m_Header->ClassId = sceneClassDesc->classId(); + m_Header->SuperClassId = sceneClassDesc->superClassId(); + m_Name->Value = sceneClassDesc->displayName(); +} + +CClassEntry::~CClassEntry() +{ + +} + +std::string CClassEntry::className() const +{ + return "ClassEntry"; +} + +void CClassEntry::toString(std::ostream &ostream, const std::string &pad) const +{ + if (m_Header && m_Name) + { + ostream << "(" << className() << ") [" << m_Chunks.size() << "] PARSED { "; + std::string padpad = pad + "\t"; + ostream << "\n" << pad << "Header: "; + m_Header->toString(ostream, padpad); + ostream << "\n" << pad << "Name: " << m_Name->Value.toUtf8(); + ostream << " } "; + } + else + { + CStorageContainer::toString(ostream, pad); + } +} + +void CClassEntry::parse(uint16 version, uint filter) +{ + // CStorageContainer::parse(version); + nlassert(m_ChunksOwnsPointers); + nlassert(m_Chunks.size() == 2); + TStorageObjectContainer::iterator it = m_Chunks.begin(); + nlassert(it->first == 0x2060); // ClassEntryHeader + m_Header = static_cast(it->second); + ++it; + nlassert(it->first == 0x2042); // ClassEntryName + m_Name = static_cast *>(it->second); + // ++it; +} + +void CClassEntry::clean() +{ + // Nothing to do here! (m_Chunks retains ownership) + // CStorageContainer::clean(); +} + +void CClassEntry::build(uint16 version, uint filter) +{ + // Nothing to do here! + // CStorageContainer::build(version); +} + +void CClassEntry::disown() +{ + // CStorageContainer::disown(); + m_Header = NULL; + m_Name = NULL; + nlassert(m_ChunksOwnsPointers); +} + +IStorageObject *CClassEntry::createChunkById(uint16 id, bool container) +{ + if (!container) + { + switch (id) + { + case 0x2060: // ClassEntryHeader + return new CClassEntryHeader(); + case 0x2042: // ClassEntryName + return new CStorageValue(); + } + } + return CStorageContainer::createChunkById(id, container); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CClassEntryHeader::CClassEntryHeader() +{ + +} + +CClassEntryHeader::~CClassEntryHeader() +{ + +} + +std::string CClassEntryHeader::className() const +{ + return "ClassEntryHeader"; +} + +void CClassEntryHeader::serial(NLMISC::IStream &stream) +{ + stream.serial(DllIndex); + stream.serial(ClassId); + stream.serial(SuperClassId); +} + +void CClassEntryHeader::toString(std::ostream &ostream, const std::string &pad) const +{ + ostream << "(" << className() << ") { "; + ostream << "\n" << pad << "DllIndex: " << DllIndex; + ostream << "\n" << pad << "ClassId: " << NLMISC::toString(ClassId); + ostream << "\n" << pad << "SuperClassId: " << SuperClassId; + ostream << " } "; +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/class_directory_3.h b/code/nel/tools/3d/pipeline_max/class_directory_3.h new file mode 100644 index 000000000..30780d724 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/class_directory_3.h @@ -0,0 +1,160 @@ +/** + * \file class_directory_3.h + * \brief CClassDirectory3 + * \date 2012-08-18 18:01GMT + * \author Jan Boon (Kaetemi) + * CClassDirectory3 + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_CLASS_DIRECTORY_3_H +#define PIPELINE_CLASS_DIRECTORY_3_H +#include + +// STL includes + +// NeL includes +#include +#include + +// Project includes +#include "storage_object.h" +#include "storage_value.h" +#include "scene_class.h" + +namespace PIPELINE { +namespace MAX { + +class CDllDirectory; + +class CClassEntry; + +/** + * \brief CClassDirectory3 + * \date 2012-08-18 18:01GMT + * \author Jan Boon (Kaetemi) + * This class is used for parsing the local class indices in a max file, + * both reading and writing is supported. It is not used at runtime, + * and should be reset when no longer necessary. Plugins have their own + * static copy of the actual ISceneClassDesc. This class only contains + * CClassEntry instances, which should not be used directly. + */ +class CClassDirectory3 : public CStorageContainer +{ +public: + CClassDirectory3(CDllDirectory *dllDirectory); + virtual ~CClassDirectory3(); + + // inherited + virtual std::string className() const; + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + + // public + // Get a class entry corresponding to a chunk index, pointers become invalid after reset + const CClassEntry *get(uint16 index) const; + // Reset the class directory, all class entry pointers become invalid, use class id and scene class registry + void reset(); + // Get or create the chunk index for a class by class description + uint16 getOrCreateIndex(const ISceneClassDesc *sceneClassDesc); + +protected: + virtual IStorageObject *createChunkById(uint16 id, bool container); + +private: + TStorageObjectContainer m_ChunkCache; + std::vector m_Entries; + std::map m_ClassIdToIndex; + + CDllDirectory *m_DllDirectory; + +}; /* class CClassDirectory3 */ + +/** + * \brief CClassEntryHeader + * \date 2012-08-18 18:01GMT + * \author Jan Boon (Kaetemi) + * CClassEntryHeader + */ +class CClassEntryHeader : public IStorageObject +{ +public: + CClassEntryHeader(); + virtual ~CClassEntryHeader(); + + // public data + sint32 DllIndex; + NLMISC::CClassId ClassId; + uint32 SuperClassId; + + // inherited + virtual std::string className() const; + virtual void serial(NLMISC::IStream &stream); + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + +}; /* class CClassEntryHeader */ + +/** + * \brief CClassEntry + * \date 2012-08-18 18:01GMT + * \author Jan Boon (Kaetemi) + * CClassEntry + */ +class CClassEntry : public CStorageContainer +{ +public: + CClassEntry(); + CClassEntry(CDllDirectory *dllDirectory, const ISceneClassDesc *sceneClassDesc); + virtual ~CClassEntry(); + + // inherited + virtual std::string className() const; + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + + // read access + const ucstring &displayName() const { return m_Name->Value; } + sint32 dllIndex() const { return m_Header->DllIndex; } + NLMISC::CClassId classId() const { return m_Header->ClassId; } + uint32 superClassId() const { return m_Header->SuperClassId; } + + // debug + void overrideClassId(NLMISC::CClassId classId) { m_Header->ClassId = classId; } + +protected: + virtual IStorageObject *createChunkById(uint16 id, bool container); + CClassEntryHeader *m_Header; + CStorageValue *m_Name; + +}; /* class CClassEntry */ + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_CLASS_DIRECTORY_3_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/config.cpp b/code/nel/tools/3d/pipeline_max/config.cpp new file mode 100644 index 000000000..440b74e17 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/config.cpp @@ -0,0 +1,553 @@ +/** + * \file config.cpp + * \brief CConfig + * \date 2012-08-18 19:25GMT + * \author Jan Boon (Kaetemi) + * CConfig + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "config.h" + +// STL includes + +// NeL includes +// #include +#include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CConfig::CConfig() +{ + +} + +CConfig::~CConfig() +{ + +} + +std::string CConfig::className() const +{ + return "Config"; +} + +void CConfig::toString(std::ostream &ostream, const std::string &pad) const +{ + CStorageContainer::toString(ostream, pad); +} + +void CConfig::parse(uint16 version, uint filter) +{ + CStorageContainer::parse(version); +} + +void CConfig::clean() +{ + CStorageContainer::clean(); +} + +void CConfig::build(uint16 version, uint filter) +{ + CStorageContainer::build(version); +} + +void CConfig::disown() +{ + CStorageContainer::disown(); +} + +IStorageObject *CConfig::createChunkById(uint16 id, bool container) +{ + if (container) + { + switch (id) + { + case 0x20a0: // unknown + return new CConfig20a0(); + case 0x2180: // CConfigScript + return new CConfigScript(); + } + } + else + { + switch (id) + { + case 0x2090: // unknown; known values: 1 (m3), 0 (m9, m2008, m2010) + return new CStorageValue(); + } + } + return CStorageContainer::createChunkById(id, container); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CConfig20a0::CConfig20a0() +{ + +} + +CConfig20a0::~CConfig20a0() +{ + +} + +std::string CConfig20a0::className() const +{ + return "Config20a0"; +} + +void CConfig20a0::toString(std::ostream &ostream, const std::string &pad) const +{ + CStorageContainer::toString(ostream, pad); +} + +void CConfig20a0::parse(uint16 version, uint filter) +{ + CStorageContainer::parse(version); +} + +void CConfig20a0::clean() +{ + CStorageContainer::clean(); +} + +void CConfig20a0::build(uint16 version, uint filter) +{ + CStorageContainer::build(version); +} + +void CConfig20a0::disown() +{ + CStorageContainer::disown(); +} + +IStorageObject *CConfig20a0::createChunkById(uint16 id, bool container) +{ + if (container) + { + switch (id) + { + case 0x0110: // CConfig20a0Entry + return new CConfig20a0Entry(); + } + } + else + { + switch (id) + { + case 0x0100: // CConfig20a0Header: Number of entries + return new CStorageValue(); + } + } + return CStorageContainer::createChunkById(id, container); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CConfig20a0Entry::CConfig20a0Entry() +{ + +} + +CConfig20a0Entry::~CConfig20a0Entry() +{ + +} + +std::string CConfig20a0Entry::className() const +{ + return "Config20a0Entry"; +} + +void CConfig20a0Entry::toString(std::ostream &ostream, const std::string &pad) const +{ + CStorageContainer::toString(ostream, pad); +} + +void CConfig20a0Entry::parse(uint16 version, uint filter) +{ + CStorageContainer::parse(version); +} + +void CConfig20a0Entry::clean() +{ + CStorageContainer::clean(); +} + +void CConfig20a0Entry::build(uint16 version, uint filter) +{ + CStorageContainer::build(version); +} + +void CConfig20a0Entry::disown() +{ + CStorageContainer::disown(); +} + +IStorageObject *CConfig20a0Entry::createChunkById(uint16 id, bool container) +{ + if (container) + { + switch (id) + { + case 0x0300: // unknown, contains 0x0100 with 4 bytes int value + return CStorageContainer::createChunkById(id, container); + } + } + else + { + switch (id) + { + case 0x0100: // unknown + case 0x0110: // unknown + case 0x0120: // unknown + case 0x0130: // unknown + case 0x0140: // unknown + case 0x0150: // unknown + case 0x0160: // unknown + case 0x0161: // unknown + case 0x0170: // unknown + case 0x0180: // unknown + case 0x0190: // unknown + case 0x0200: // unknown + case 0x0210: // unknown + case 0x0220: // unknown + case 0x0230: // unknown + case 0x0240: // unknown + case 0x0250: // unknown + case 0x0270: // unknown + case 0x0280: // unknown + case 0x0310: // unknown + case 0x0320: // unknown + return new CStorageValue(); + case 0x0260: // unknown + return new CStorageValue(); + case 0x0330: // unknown, 16 bytes + return CStorageContainer::createChunkById(id, container); + case 0x0290: // unknown + case 0x0390: // unknown + return new CStorageValue(); + } + } + return CStorageContainer::createChunkById(id, container); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CConfigScript::CConfigScript() +{ + +} + +CConfigScript::~CConfigScript() +{ + +} + +std::string CConfigScript::className() const +{ + return "ConfigScript"; +} + +void CConfigScript::toString(std::ostream &ostream, const std::string &pad) const +{ + CStorageContainer::toString(ostream, pad); +} + +void CConfigScript::parse(uint16 version, uint filter) +{ + CStorageContainer::parse(version); +} + +void CConfigScript::clean() +{ + CStorageContainer::clean(); +} + +void CConfigScript::build(uint16 version, uint filter) +{ + CStorageContainer::build(version); +} + +void CConfigScript::disown() +{ + CStorageContainer::disown(); +} + +IStorageObject *CConfigScript::createChunkById(uint16 id, bool container) +{ + if (container) + { + switch (id) + { + case 0x0040: // ConfigScriptEntry + return new CConfigScriptEntry(); + } + } + return CStorageContainer::createChunkById(id, container); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CConfigScriptEntry::CConfigScriptEntry() +{ + +} + +CConfigScriptEntry::~CConfigScriptEntry() +{ + +} + +std::string CConfigScriptEntry::className() const +{ + return "ConfigScriptEntry"; +} + +void CConfigScriptEntry::toString(std::ostream &ostream, const std::string &pad) const +{ + CStorageContainer::toString(ostream, pad); +} + +void CConfigScriptEntry::parse(uint16 version, uint filter) +{ + CStorageContainer::parse(version); +} + +void CConfigScriptEntry::clean() +{ + CStorageContainer::clean(); +} + +void CConfigScriptEntry::build(uint16 version, uint filter) +{ + CStorageContainer::build(version); +} + +void CConfigScriptEntry::disown() +{ + CStorageContainer::disown(); +} + +IStorageObject *CConfigScriptEntry::createChunkById(uint16 id, bool container) +{ + if (container) + { + switch (id) + { + case 0x0007: // ConfigScriptMetaContainer + return new CConfigScriptMetaContainer(); + } + } + else + { + switch (id) + { + case 0x0050: // ConfigScriptHeader + return new CConfigScriptHeader(); + } + } + return CStorageContainer::createChunkById(id, container); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CConfigScriptHeader::CConfigScriptHeader() +{ + +} + +CConfigScriptHeader::~CConfigScriptHeader() +{ + +} + +std::string CConfigScriptHeader::className() const +{ + return "ConfigScriptHeader"; +} + +void CConfigScriptHeader::serial(NLMISC::IStream &stream) +{ + stream.serial(SuperClassID); + stream.serial(ClassID); +} + +void CConfigScriptHeader::toString(std::ostream &ostream, const std::string &pad) const +{ + ostream << "(" << className() << ") { "; + ostream << "\n" << pad << "SuperClassID: " << SuperClassID; + ostream << "\n" << pad << "ClassID: " << NLMISC::toString(ClassID); + ostream << " } "; +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CConfigScriptMetaContainer::CConfigScriptMetaContainer() +{ + +} + +CConfigScriptMetaContainer::~CConfigScriptMetaContainer() +{ + +} + +std::string CConfigScriptMetaContainer::className() const +{ + return "ConfigScriptMetaContainer"; +} + +void CConfigScriptMetaContainer::toString(std::ostream &ostream, const std::string &pad) const +{ + CStorageContainer::toString(ostream, pad); +} + +void CConfigScriptMetaContainer::parse(uint16 version, uint filter) +{ + CStorageContainer::parse(version); +} + +void CConfigScriptMetaContainer::clean() +{ + CStorageContainer::clean(); +} + +void CConfigScriptMetaContainer::build(uint16 version, uint filter) +{ + CStorageContainer::build(version); +} + +void CConfigScriptMetaContainer::disown() +{ + CStorageContainer::disown(); +} + +IStorageObject *CConfigScriptMetaContainer::createChunkById(uint16 id, bool container) +{ + if (container) + { + switch (id) + { + case 0x0007: // ConfigScriptMetaContainer + return new CConfigScriptMetaContainer(); + } + } + else + { + switch (id) + { + case 0x0001: // type: boolean (stored in four bytes, yes) + return new CStorageValue(); + case 0x0002: // ??? + nlerror("0x0002 found, please implement"); + break; + case 0x0003: // type: integer (not sure if signed) + return new CStorageValue(); + case 0x0004: // type: float + return new CStorageValue(); + case 0x0005: // type: string (same format as the meta string) + case 0x0006: // ConfigScriptMetaString + return new CConfigScriptMetaString(); + case 0x0008: // type: color (stored as 3 float vector) + return new CStorageValue; + case 0x0060: // ConfigScriptMetaContainerHeader (contains the number of entries, amusingly) + return new CStorageValue(); + } + } + return CStorageContainer::createChunkById(id, container); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CConfigScriptMetaString::CConfigScriptMetaString() +{ + +} + +CConfigScriptMetaString::~CConfigScriptMetaString() +{ + +} + +std::string CConfigScriptMetaString::className() const +{ + return "ConfigScriptMetaString"; +} + +void CConfigScriptMetaString::serial(NLMISC::IStream &stream) +{ + if (stream.isReading()) + { + uint32 size; + stream.serial(size); + Value.resize(size - 1); + } + else + { + uint32 size = Value.size() + 1; + stream.serial(size); + } + stream.serialBuffer(static_cast(static_cast(&Value[0])), Value.size()); + uint8 endByte = 0; + stream.serial(endByte); + nlassert(endByte == 0); +} + +void CConfigScriptMetaString::toString(std::ostream &ostream, const std::string &pad) const +{ + ostream << "(" << className() << ") { " << Value << " } "; +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/config.h b/code/nel/tools/3d/pipeline_max/config.h new file mode 100644 index 000000000..c96d1ce2a --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/config.h @@ -0,0 +1,245 @@ +/** + * \file config.h + * \brief CConfig + * \date 2012-08-18 19:25GMT + * \author Jan Boon (Kaetemi) + * CConfig + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_CONFIG_H +#define PIPELINE_CONFIG_H +#include + +// STL includes + +// NeL includes +#include + +// Project includes +#include "storage_object.h" +#include "storage_value.h" + +namespace PIPELINE { +namespace MAX { + +/** + * \brief CConfig + * \date 2012-08-18 19:25GMT + * \author Jan Boon (Kaetemi) + * CConfig + */ +class CConfig : public CStorageContainer +{ +public: + CConfig(); + virtual ~CConfig(); + + // inherited + virtual std::string className() const; + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + +protected: + virtual IStorageObject *createChunkById(uint16 id, bool container); + +}; /* class CConfig */ + +/** + * \brief CConfig20a0 + * \date 2012-08-18 19:25GMT + * \author Jan Boon (Kaetemi) + * CConfig + */ +class CConfig20a0 : public CStorageContainer +{ +public: + CConfig20a0(); + virtual ~CConfig20a0(); + + // inherited + virtual std::string className() const; + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + +protected: + virtual IStorageObject *createChunkById(uint16 id, bool container); + +}; /* class CConfig20a0 */ + +/** + * \brief CConfig20a0Entry + * \date 2012-08-18 19:25GMT + * \author Jan Boon (Kaetemi) + * CConfig20a0Entry + */ +class CConfig20a0Entry : public CStorageContainer +{ +public: + CConfig20a0Entry(); + virtual ~CConfig20a0Entry(); + + // inherited + virtual std::string className() const; + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + +protected: + virtual IStorageObject *createChunkById(uint16 id, bool container); + +}; /* class CConfig20a0Entry */ + +/** + * \brief CConfigScript + * \date 2012-08-18 19:25GMT + * \author Jan Boon (Kaetemi) + * CConfig + */ +class CConfigScript : public CStorageContainer +{ +public: + CConfigScript(); + virtual ~CConfigScript(); + + // inherited + virtual std::string className() const; + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + +protected: + virtual IStorageObject *createChunkById(uint16 id, bool container); + +}; /* class CConfigScript */ + +/** + * \brief CConfigScriptEntry + * \date 2012-08-18 19:25GMT + * \author Jan Boon (Kaetemi) + * CConfig + */ +class CConfigScriptEntry : public CStorageContainer +{ +public: + CConfigScriptEntry(); + virtual ~CConfigScriptEntry(); + + // inherited + virtual std::string className() const; + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + +protected: + virtual IStorageObject *createChunkById(uint16 id, bool container); + +}; /* class CConfigScriptEntry */ + +/** + * \brief CConfigScriptHeader + * \date 2012-08-18 19:25GMT + * \author Jan Boon (Kaetemi) + * CConfigScriptHeader + */ +class CConfigScriptHeader : public IStorageObject +{ +public: + CConfigScriptHeader(); + virtual ~CConfigScriptHeader(); + + // public data + uint32 SuperClassID; + NLMISC::CClassId ClassID; + + // inherited + virtual std::string className() const; + virtual void serial(NLMISC::IStream &stream); + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + +}; /* class CConfigScriptHeader */ + +/** + * \brief CConfigScriptMetaContainer + * \date 2012-08-18 19:25GMT + * \author Jan Boon (Kaetemi) + * CConfigScriptMetaContainer + * This is totally hilarious. + */ +class CConfigScriptMetaContainer : public CStorageContainer +{ +public: + CConfigScriptMetaContainer(); + virtual ~CConfigScriptMetaContainer(); + + // inherited + virtual std::string className() const; + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + +protected: + virtual IStorageObject *createChunkById(uint16 id, bool container); + +}; /* class CConfigScriptMetaContainer */ + +/** + * \brief CConfigScriptMetaString + * \date 2012-08-18 19:25GMT + * \author Jan Boon (Kaetemi) + * CConfigScriptMetaString + */ +class CConfigScriptMetaString : public IStorageObject +{ +public: + CConfigScriptMetaString(); + virtual ~CConfigScriptMetaString(); + + // public data + std::string Value; + + // inherited + virtual std::string className() const; + virtual void serial(NLMISC::IStream &stream); + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + +}; /* class CConfigScriptMetaString */ + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_CONFIG_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/derived_object.cpp b/code/nel/tools/3d/pipeline_max/derived_object.cpp new file mode 100644 index 000000000..21f26e074 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/derived_object.cpp @@ -0,0 +1,55 @@ +/** + * \file derived_object.cpp + * \brief CDerivedObject + * \date 2012-08-26 12:04GMT + * \author Jan Boon (Kaetemi) + * CDerivedObject + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "derived_object.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { + +CDerivedObject::CDerivedObject() +{ + +} + +CDerivedObject::~CDerivedObject() +{ + +} + +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/derived_object.h b/code/nel/tools/3d/pipeline_max/derived_object.h new file mode 100644 index 000000000..273dbdfd6 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/derived_object.h @@ -0,0 +1,63 @@ +/** + * \file derived_object.h + * \brief CDerivedObject + * \date 2012-08-26 12:04GMT + * \author Jan Boon (Kaetemi) + * CDerivedObject + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_DERIVED_OBJECT_H +#define PIPELINE_DERIVED_OBJECT_H +#include + +// STL includes + +// NeL includes + +// Project includes + +namespace PIPELINE { + +/** + * \brief CDerivedObject + * \date 2012-08-26 12:04GMT + * \author Jan Boon (Kaetemi) + * CDerivedObject + */ +class CDerivedObject +{ +protected: + // pointers + // ... + + // instances + // ... +public: + CDerivedObject(); + virtual ~CDerivedObject(); +}; /* class CDerivedObject */ + +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_DERIVED_OBJECT_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/dll_directory.cpp b/code/nel/tools/3d/pipeline_max/dll_directory.cpp new file mode 100644 index 000000000..8f60c459c --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/dll_directory.cpp @@ -0,0 +1,420 @@ +/** + * \file dll_directory.cpp + * \brief CDllDirectory + * \date 2012-08-18 09:01GMT + * \author Jan Boon (Kaetemi) + * CDllDirectory + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "dll_directory.h" + +// STL includes +#include + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CDllDirectory::CDllDirectory() : m_DllEntryBuiltin(&DllPluginDescBuiltin), m_DllEntryScript(&DllPluginDescScript) +{ + +} + +// Parallel to CClassDirectory3 +CDllDirectory::~CDllDirectory() +{ + // Delete m_ChunkCache and m_Entries when !m_ChunksOwnsPointers + if (!m_ChunksOwnsPointers) + { + for (TStorageObjectContainer::iterator it = m_ChunkCache.begin(), end = m_ChunkCache.end(); it != end; ++it) + { + delete it->second; + } + for (std::vector::iterator subit = m_Entries.begin(), subend = m_Entries.end(); subit != subend; ++subit) + { + delete (*subit); + } + } + m_ChunkCache.clear(); + m_Entries.clear(); +} + +std::string CDllDirectory::className() const +{ + return "DllDirectory"; +} + +// Parallel to CClassDirectory3 +void CDllDirectory::toString(std::ostream &ostream, const std::string &pad) const +{ + if (m_ChunksOwnsPointers) + { + CStorageContainer::toString(ostream, pad); + } + else + { + ostream << "(" << className() << ") [" << m_Chunks.size() << "] PARSED { "; + std::string padpad = pad + "\t"; + sint i = 0; + for (TStorageObjectContainer::const_iterator it = m_ChunkCache.begin(), end = m_ChunkCache.end(); it != end; ++it) + { + uint16 id = it->first; + switch (id) + { + case 0x2038: // DllEntry + { + uint subi = 0; + for (std::vector::const_iterator subit = m_Entries.begin(), subend = m_Entries.end(); subit != subend; ++subit) + { + ostream << "\n" << pad << "Entries[" << subi << "]: "; + (*subit)->toString(ostream, padpad); + ++subi; + } + } + break; + default: + std::stringstream ss; + ss << std::hex << std::setfill('0'); + ss << std::setw(4) << it->first; + ostream << "\n" << pad << "0x" << ss.str() << ": "; + it->second->toString(ostream, padpad); + ++i; + break; + } + } + ostream << "} "; + } +} + +// Parallel to CClassDirectory3 +void CDllDirectory::parse(uint16 version, uint filter) +{ + // Ensure not yet parsed + nlassert(m_ChunkCache.empty()); + nlassert(m_Entries.empty()); + + // Parse entries first + CStorageContainer::parse(version); + + // Initialize + addInternalIndices(); + uint16 lastCached = 0xFFFF; + bool parsedDllEntry = false; + + // Parse chunks + for (TStorageObjectContainer::iterator it = m_Chunks.begin(), end = m_Chunks.end(); it != end; ++it) + { + uint16 id = it->first; + switch (id) + { + case 0x2038: // DllEntry + { + if (parsedDllEntry && (lastCached != id)) + throw EStorageParse(); // There were chunks inbetween + if (!parsedDllEntry) + { + m_ChunkCache.push_back(TStorageObjectWithId(id, NULL)); // Dummy entry to know the location + lastCached = id; + parsedDllEntry = true; + } + CDllEntry *dllEntry = static_cast(it->second); + m_InternalNameToIndex[NLMISC::toLower(dllEntry->dllFilename())] = m_Entries.size(); + m_Entries.push_back(dllEntry); + } + break; + default: + m_ChunkCache.push_back(*it); // Dummy entry to know the location + lastCached = id; + break; + } + } + + // Now ownership of the pointers lies in m_ChunkCache and m_Entries + m_ChunksOwnsPointers = false; +} + +// Parallel to CClassDirectory3 +void CDllDirectory::clean() +{ + // Ensure parsed + nlassert(!m_ChunksOwnsPointers); + + // Clear m_Chunks + m_Chunks.clear(); + + // Clean chunks + for (TStorageObjectContainer::iterator it = m_ChunkCache.begin(), end = m_ChunkCache.end(); it != end; ++it) + { + if (it->second != NULL && it->second->isContainer()) + { + static_cast(it->second)->clean(); + } + } + for (std::vector::iterator subit = m_Entries.begin(), subend = m_Entries.end(); subit != subend; ++subit) + { + (*subit)->clean(); + } +} + +// Parallel to CClassDirectory3 +void CDllDirectory::build(uint16 version, uint filter) +{ + // Ensure parsed + nlassert(!m_ChunksOwnsPointers); + + // Initialize + nlassert(m_Chunks.empty()); + + // Set up the m_Chunks list, when (CDllEntry::ID, NULL) is found write out all of the entries. + for (TStorageObjectContainer::iterator it = m_ChunkCache.begin(), end = m_ChunkCache.end(); it != end; ++it) + { + uint16 id = it->first; + switch (id) + { + case 0x2038: // DllEntry + for (std::vector::iterator subit = m_Entries.begin(), subend = m_Entries.end(); subit != subend; ++subit) + m_Chunks.push_back(TStorageObjectWithId(id, (*subit))); + break; + default: + m_Chunks.push_back(*it); + break; + } + } + + // Build the entries last (after m_Chunks is built) + CStorageContainer::build(version); + + // NOTE: Ownership remains with m_ChunkCache and m_Entries +} + +// Parallel to CClassDirectory3 +void CDllDirectory::disown() +{ + m_ChunkCache.clear(); + m_Entries.clear(); + m_InternalNameToIndex.clear(); + + // Ownership goes back to m_Chunks + m_ChunksOwnsPointers = true; + + // Disown child chunks + CStorageContainer::disown(); +} + +// Parallel to CClassDirectory3 +const CDllEntry *CDllDirectory::get(sint32 index) const +{ + nlassert(!m_ChunksOwnsPointers); + if (index < 0) + { + // Handle internal dummy values + switch (index) + { + case -1: + return &m_DllEntryBuiltin; + case -2: + return &m_DllEntryScript; + default: + nlerror("Bad dll entry index"); + } + } + else + { + nlassert(index < (sint32)m_Entries.size()); + return m_Entries[index]; + } + nlassert(false); + return NULL; +} + +// Parallel to CClassDirectory3 +void CDllDirectory::reset() +{ + nlassert(!m_ChunksOwnsPointers); + for (std::vector::iterator subit = m_Entries.begin(), subend = m_Entries.end(); subit != subend; ++subit) + { + delete (*subit); + } + m_Entries.clear(); + m_InternalNameToIndex.clear(); + addInternalIndices(); +} + +// Parallel to CClassDirectory3 +sint32 CDllDirectory::getOrCreateIndex(const IDllPluginDescInternal *dllPluginDesc) +{ + nlassert(!m_ChunksOwnsPointers); + std::map::iterator it = m_InternalNameToIndex.find(NLMISC::toLower(ucstring(dllPluginDesc->internalName()))); + + // Return existing index + if (it != m_InternalNameToIndex.end()) + return it->second; + + // Create new entry + CDllEntry *dllEntry = new CDllEntry(dllPluginDesc); + sint32 index = m_Entries.size(); + m_InternalNameToIndex[NLMISC::toLower(dllEntry->dllFilename())] = index; + m_Entries.push_back(dllEntry); + return index; +} + +void CDllDirectory::addInternalIndices() +{ + m_InternalNameToIndex[NLMISC::toLower(ucstring(DllPluginDescBuiltin.internalName()))] = -1; + m_InternalNameToIndex[NLMISC::toLower(ucstring(DllPluginDescScript.internalName()))] = -2; +} + +IStorageObject *CDllDirectory::createChunkById(uint16 id, bool container) +{ + if (container) + { + switch (id) + { + case 0x2038: // DllEntry + return new CDllEntry(); + } + } + else + { + switch (id) + { + case 0x21C0: // DllDirectoryHeader + return new CStorageValue(); + } + } + return CStorageContainer::createChunkById(id, container); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +// Entries[5]: (DllEntry) [2] PARSED { +// DllDescription: ... +// DllFilename: ... } + +CDllEntry::CDllEntry() : m_DllDescription(NULL), m_DllFilename(NULL) +{ + +} + +CDllEntry::CDllEntry(const IDllPluginDescInternal *dllPluginDesc) : m_DllDescription(new CStorageValue()), m_DllFilename(new CStorageValue()) +{ + m_Chunks.push_back(TStorageObjectWithId(0x2039, m_DllDescription)); + m_Chunks.push_back(TStorageObjectWithId(0x2037, m_DllFilename)); + m_DllDescription->Value = dllPluginDesc->displayName(); + m_DllFilename->Value = dllPluginDesc->internalName(); +} + +CDllEntry::~CDllEntry() +{ + +} + +std::string CDllEntry::className() const +{ + return "DllEntry"; +} + +void CDllEntry::toString(std::ostream &ostream, const std::string &pad) const +{ + if (m_DllDescription && m_DllFilename) + { + ostream << "(" << className() << ") [" << m_Chunks.size() << "] PARSED { "; + std::string padpad = pad + "\t"; + ostream << "\n" << pad << "DllDescription: " << m_DllDescription->Value.toUtf8(); + ostream << "\n" << pad << "DllFilename: " << m_DllFilename->Value.toUtf8(); + ostream << " } "; + } + else + { + CStorageContainer::toString(ostream, pad); + } +} + +void CDllEntry::parse(uint16 version, uint filter) +{ + // CStorageContainer::parse(version); + nlassert(m_ChunksOwnsPointers); + nlassert(m_Chunks.size() == 2); + TStorageObjectContainer::iterator it = m_Chunks.begin(); + nlassert(it->first == 0x2039); // DllDescription + m_DllDescription = static_cast *>(it->second); + ++it; + nlassert(it->first == 0x2037); // DllFilename + m_DllFilename = static_cast *>(it->second); + // ++it; +} + +void CDllEntry::clean() +{ + // Nothing to do here! (m_Chunks retains ownership) + // CStorageContainer::clean(); +} + +void CDllEntry::build(uint16 version, uint filter) +{ + // Nothing to do here! + // CStorageContainer::build(version); +} + +void CDllEntry::disown() +{ + // CStorageContainer::disown(); + m_DllDescription = NULL; + m_DllFilename = NULL; + nlassert(m_ChunksOwnsPointers); +} + +IStorageObject *CDllEntry::createChunkById(uint16 id, bool container) +{ + if (!container) + { + switch (id) + { + case 0x2039: // DllDescription + case 0x2037: // DllFilename + return new CStorageValue(); + } + } + return CStorageContainer::createChunkById(id, container); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/dll_directory.h b/code/nel/tools/3d/pipeline_max/dll_directory.h new file mode 100644 index 000000000..b30feef5a --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/dll_directory.h @@ -0,0 +1,135 @@ +/** + * \file dll_directory.h + * \brief CDllDirectory + * \date 2012-08-18 09:01GMT + * \author Jan Boon (Kaetemi) + * CDllDirectory + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_DLL_DIRECTORY_H +#define PIPELINE_DLL_DIRECTORY_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "storage_object.h" +#include "storage_value.h" +#include "dll_plugin_desc.h" + +namespace PIPELINE { +namespace MAX { + +/** + * \brief CDllEntry + * \date 2012-08-18 09:01GMT + * \author Jan Boon (Kaetemi) + * CDllEntry + */ +class CDllEntry : public CStorageContainer +{ +public: + CDllEntry(); + CDllEntry(const IDllPluginDescInternal *dllPluginDesc); + virtual ~CDllEntry(); + + // inherited + virtual std::string className() const; + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + + // read access + const ucstring &dllDescription() const { return m_DllDescription->Value; } + const ucstring &dllFilename() const { return m_DllFilename->Value; } + + // debug + void overrideDllFilename(const ucstring &dllFilename) { m_DllFilename->Value = dllFilename; } + +protected: + virtual IStorageObject *createChunkById(uint16 id, bool container); + CStorageValue *m_DllDescription; + CStorageValue *m_DllFilename; + +}; /* class CDllDirectory */ + +/** + * \brief CDllDirectory + * \date 2012-08-18 09:01GMT + * \author Jan Boon (Kaetemi) + * This class is used for parsing the local dll indices in a max file, + * both reading and writing is supported. It is not used at runtime, + * and should be reset when no longer necessary. Plugins have their own + * copy of the actual IDllPluginDescInternal. This class only contains + * CDllEntry instances, which should not be used directly. The instance + * of this class used to parse the max file should be kept, as there + * might be chunks that were not parsed, which should be rewritten to + * the stream. + */ +class CDllDirectory : public CStorageContainer +{ +public: + CDllDirectory(); + virtual ~CDllDirectory(); + + // inherited + virtual std::string className() const; + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + + // public + // Get a dll entry corresponding to a chunk index, pointers become invalid after reset + const CDllEntry *get(sint32 index) const; + // Reset the dll directory, all dll entry pointers become invalid, use internal name and dll plugin registry + void reset(); + // Get or create the chunk index for a dll by dll plugin description + sint32 getOrCreateIndex(const IDllPluginDescInternal *dllPluginDesc); + +private: + void addInternalIndices(); + +protected: + virtual IStorageObject *createChunkById(uint16 id, bool container); + +private: + TStorageObjectContainer m_ChunkCache; + std::vector m_Entries; + std::map m_InternalNameToIndex; + + const CDllEntry m_DllEntryBuiltin; + const CDllEntry m_DllEntryScript; + +}; /* class CDllDirectory */ + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_DLL_DIRECTORY_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/dll_plugin_desc.cpp b/code/nel/tools/3d/pipeline_max/dll_plugin_desc.cpp new file mode 100644 index 000000000..01308a1c7 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/dll_plugin_desc.cpp @@ -0,0 +1,75 @@ +/** + * \file dll_plugin_desc.cpp + * \brief CDllPluginDesc + * \date 2012-08-20 09:59GMT + * \author Jan Boon (Kaetemi) + * CDllPluginDesc + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "dll_plugin_desc.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +// using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { + +const ucchar *CDllPluginDescBuiltin::displayName() const +{ + static const ucstring value = ucstring("Builtin"); + return value.c_str(); +} + +const ucchar *CDllPluginDescBuiltin::internalName() const +{ + static const ucstring value = ucstring("Builtin"); + return value.c_str(); +} + +const CDllPluginDescBuiltin DllPluginDescBuiltin; + +const ucchar *CDllPluginDescScript::displayName() const +{ + static const ucstring value = ucstring("Script"); + return value.c_str(); +} + +const ucchar *CDllPluginDescScript::internalName() const +{ + static const ucstring value = ucstring("Script"); + return value.c_str(); +} + +const CDllPluginDescScript DllPluginDescScript; + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/dll_plugin_desc.h b/code/nel/tools/3d/pipeline_max/dll_plugin_desc.h new file mode 100644 index 000000000..3aa76cd39 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/dll_plugin_desc.h @@ -0,0 +1,109 @@ +/** + * \file dll_plugin_desc.h + * \brief CDllPluginDesc + * \date 2012-08-20 09:59GMT + * \author Jan Boon (Kaetemi) + * CDllPluginDesc + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_DLL_PLUGIN_DESC_H +#define PIPELINE_DLL_PLUGIN_DESC_H +#include + +// STL includes + +// NeL includes +#include + +// Project includes + +namespace PIPELINE { +namespace MAX { + +/** + * \brief IDllPluginDescInternal + * \date 2012-08-20 09:59GMT + * \author Jan Boon (Kaetemi) + * Used for internal plugin descriptions that have no actual plugin + * associated with them. + */ +class IDllPluginDescInternal +{ +public: + virtual const ucchar *displayName() const = 0; + virtual const ucchar *internalName() const = 0; + +}; /* class IDllPluginDescInternal */ + +/** + * \brief IDllPluginDesc + * \date 2012-08-20 09:59GMT + * \author Jan Boon (Kaetemi) + * Inherit from this when making a plugin + */ +class IDllPluginDesc : public IDllPluginDescInternal +{ +public: + // virtual const ucchar *displayName() const = 0; + // virtual const ucchar *internalName() const = 0; + // TODO: list scene classes + +}; /* class IDllPluginDesc */ + +/** + * \brief CDllPluginDescBuiltin + * \date 2012-08-20 09:59GMT + * \author Jan Boon (Kaetemi) + * Use only internally for builtin classes + * TODO: Move to separate header? + */ +class CDllPluginDescBuiltin : public IDllPluginDescInternal +{ +public: + virtual const ucchar *displayName() const; + virtual const ucchar *internalName() const; +}; /* class CDllPluginDescBuiltin */ + +extern const CDllPluginDescBuiltin DllPluginDescBuiltin; + +/** + * \brief CDllPluginDescScript + * \date 2012-08-20 09:59GMT + * \author Jan Boon (Kaetemi) + * Use only internally for scripts + * TODO: Move to separate header? + */ +class CDllPluginDescScript : public IDllPluginDescInternal +{ +public: + virtual const ucchar *displayName() const; + virtual const ucchar *internalName() const; +}; /* class CDllPluginDescScript */ + +extern const CDllPluginDescScript DllPluginDescScript; + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_DLL_PLUGIN_DESC_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/epoly/editable_poly.cpp b/code/nel/tools/3d/pipeline_max/epoly/editable_poly.cpp new file mode 100644 index 000000000..0d8f92f69 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/epoly/editable_poly.cpp @@ -0,0 +1,158 @@ +/** + * \file editable_poly.cpp + * \brief CEditablePoly + * \date 2012-08-26 12:02GMT + * \author Jan Boon (Kaetemi) + * CEditablePoly + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "editable_poly.h" + +// STL includes +#include + +// NeL includes +// #include + +// Project includes +#include "epoly.h" + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace EPOLY { + +CEditablePoly::CEditablePoly(CScene *scene) : CPolyObject(scene) +{ + +} + +CEditablePoly::~CEditablePoly() +{ + if (!m_ChunksOwnsPointers) + { + for (TStorageObjectContainer::iterator it = m_EditablePolyUnknown.begin(), end = m_EditablePolyUnknown.end(); it != end; ++it) + delete it->second; + m_EditablePolyUnknown.clear(); + } +} + +const ucstring CEditablePoly::DisplayName = ucstring("EditablePoly"); +const char *CEditablePoly::InternalName = "EditablePoly"; +const NLMISC::CClassId CEditablePoly::ClassId = NLMISC::CClassId(0x1bf8338d, 0x192f6098); +const TSClassId CEditablePoly::SuperClassId = CPolyObject::SuperClassId; +const CEditablePolyClassDesc EditablePolyClassDesc(&DllPluginDescEPoly); + +void CEditablePoly::parse(uint16 version, uint filter) +{ + CPolyObject::parse(version); + + IStorageObject *so; + so = getChunk(0x4039); + if (so) m_EditablePolyUnknown.push_back(TStorageObjectWithId(0x4039, so)); + so = getChunk(0x403a); + if (so) m_EditablePolyUnknown.push_back(TStorageObjectWithId(0x403a, so)); + for (; ; ) + { // note: also in editable mesh, copy paste or related somehow? / use a common parser class inbetween? + so = getChunk(0x3003); + if (so) m_EditablePolyUnknown.push_back(TStorageObjectWithId(0x3003, so)); + else break; + so = getChunk(0x3004); + if (so) m_EditablePolyUnknown.push_back(TStorageObjectWithId(0x3004, so)); + } + so = getChunk(0x3002); + if (so) m_EditablePolyUnknown.push_back(TStorageObjectWithId(0x3002, so)); + so = getChunk(0x4038); + if (so) m_EditablePolyUnknown.push_back(TStorageObjectWithId(0x4038, so)); + + CPolyObject::parse(version, PMB_POLY_OBJECT_PARSE_FILTER); +} + +void CEditablePoly::clean() +{ + CPolyObject::clean(); +} + +void CEditablePoly::build(uint16 version, uint filter) +{ + CPolyObject::build(version); + + for (TStorageObjectContainer::iterator it = m_EditablePolyUnknown.begin(), end = m_EditablePolyUnknown.end(); it != end; ++it) + putChunk(it->first, it->second); + + CPolyObject::build(version, PMB_POLY_OBJECT_PARSE_FILTER); +} + +void CEditablePoly::disown() +{ + m_EditablePolyUnknown.clear(); + CPolyObject::disown(); +} + +void CEditablePoly::init() +{ + CPolyObject::init(); +} + +bool CEditablePoly::inherits(const NLMISC::CClassId classId) const +{ + if (classId == classDesc()->classId()) return true; + return CPolyObject::inherits(classId); +} + +const ISceneClassDesc *CEditablePoly::classDesc() const +{ + return &EditablePolyClassDesc; +} + +void CEditablePoly::toStringLocal(std::ostream &ostream, const std::string &pad, uint filter) const +{ + CPolyObject::toStringLocal(ostream, pad); + + std::string padpad = pad + "\t"; + sint i = 0; + for (TStorageObjectContainer::const_iterator it = m_EditablePolyUnknown.begin(), end = m_EditablePolyUnknown.end(); it != end; ++it) + { + std::stringstream ss; + ss << std::hex << std::setfill('0'); + ss << std::setw(4) << it->first; + ostream << "\n" << pad << "EditablePolyUnkown[" << i << "] 0x" << ss.str() << ": "; + it->second->toString(ostream, padpad); + ++i; + } + + CPolyObject::toStringLocal(ostream, pad, PMB_POLY_OBJECT_PARSE_FILTER); +} + +IStorageObject *CEditablePoly::createChunkById(uint16 id, bool container) +{ + return CPolyObject::createChunkById(id, container); +} + +} /* namespace EPOLY */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/epoly/editable_poly.h b/code/nel/tools/3d/pipeline_max/epoly/editable_poly.h new file mode 100644 index 000000000..6a5232c20 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/epoly/editable_poly.h @@ -0,0 +1,89 @@ +/** + * \file editable_poly.h + * \brief CEditablePoly + * \date 2012-08-26 12:02GMT + * \author Jan Boon (Kaetemi) + * CEditablePoly + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_EDITABLE_POLY_H +#define PIPELINE_EDITABLE_POLY_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "../builtin/poly_object.h" + +namespace PIPELINE { +namespace MAX { +namespace EPOLY { + +/** + * \brief CEditablePoly + * \date 2012-08-26 12:02GMT + * \author Jan Boon (Kaetemi) + * CEditablePoly + */ +class CEditablePoly : public PIPELINE::MAX::BUILTIN::CPolyObject +{ +public: + CEditablePoly(CScene *scene); + virtual ~CEditablePoly(); + + // class desc + static const ucstring DisplayName; + static const char *InternalName; + static const NLMISC::CClassId ClassId; + static const TSClassId SuperClassId; + + // inherited + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + virtual void init(); + virtual bool inherits(const NLMISC::CClassId classId) const; + virtual const ISceneClassDesc *classDesc() const; + virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "", uint filter = 0) const; + +protected: + // inherited + virtual IStorageObject *createChunkById(uint16 id, bool container); + +private: + TStorageObjectContainer m_EditablePolyUnknown; + +}; /* class CEditablePoly */ + +typedef CSceneClassDesc CEditablePolyClassDesc; +extern const CEditablePolyClassDesc EditablePolyClassDesc; + +} /* namespace EPOLY */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_EDITABLE_POLY_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/epoly/epoly.cpp b/code/nel/tools/3d/pipeline_max/epoly/epoly.cpp new file mode 100644 index 000000000..120605fa7 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/epoly/epoly.cpp @@ -0,0 +1,81 @@ +/** + * \file epoly.cpp + * \brief CEPoly + * \date 2012-08-26 12:03GMT + * \author Jan Boon (Kaetemi) + * CEPoly + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "epoly.h" + +// STL includes + +// NeL includes +// #include + +// Project includes +#include "../scene_class_registry.h" + +#include "editable_poly.h" + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace EPOLY { + +CEPoly::CEPoly() +{ + +} + +CEPoly::~CEPoly() +{ + +} + +void CEPoly::registerClasses(CSceneClassRegistry *registry) +{ + registry->add(&EditablePolyClassDesc); +} + +const ucchar *CDllPluginDescEPoly::displayName() const +{ + static const ucstring value = ucstring("Editable Poly Object (Ryzom Core)"); + return value.c_str(); +} + +const ucchar *CDllPluginDescEPoly::internalName() const +{ + static const ucstring value = ucstring("EPoly.dlo"); + return value.c_str(); +} + +const CDllPluginDescEPoly DllPluginDescEPoly; + +} /* namespace EPOLY */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/epoly/epoly.h b/code/nel/tools/3d/pipeline_max/epoly/epoly.h new file mode 100644 index 000000000..7d0823bce --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/epoly/epoly.h @@ -0,0 +1,84 @@ +/** + * \file epoly.h + * \brief CEPoly + * \date 2012-08-26 12:03GMT + * \author Jan Boon (Kaetemi) + * CEPoly + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_EPOLY_H +#define PIPELINE_EPOLY_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "../dll_plugin_desc.h" + +namespace PIPELINE { +namespace MAX { + +class CSceneClassRegistry; + +namespace EPOLY { + +/** + * \brief CEPoly + * \date 2012-08-26 12:03GMT + * \author Jan Boon (Kaetemi) + * CEPoly + */ +class CEPoly +{ +public: + static void registerClasses(CSceneClassRegistry *registry); + +public: + CEPoly(); + virtual ~CEPoly(); + +}; /* class CEPoly */ + +/** + * \brief CDllPluginDescEPoly + * \date 2012-08-26 12:03GMT + * \author Jan Boon (Kaetemi) + * CDllPluginDescEPoly + */ +class CDllPluginDescEPoly : public IDllPluginDescInternal +{ +public: + virtual const ucchar *displayName() const; + virtual const ucchar *internalName() const; +}; /* class CDllPluginDescScript */ + +extern const CDllPluginDescEPoly DllPluginDescEPoly; + +} /* namespace EPOLY */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_EPOLY_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/scene.cpp b/code/nel/tools/3d/pipeline_max/scene.cpp new file mode 100644 index 000000000..85293e680 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/scene.cpp @@ -0,0 +1,237 @@ +/** + * \file scene.cpp + * \brief CScene + * \date 2012-08-18 19:25GMT + * \author Jan Boon (Kaetemi) + * CScene + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "scene.h" + +// STL includes +#include + +// NeL includes +// #include +#include + +// Project includes +#include "dll_directory.h" +#include "class_directory_3.h" +#include "scene_class_registry.h" +#include "scene_class_unknown.h" +#include "builtin/scene_impl.h" + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CScene::CScene(const CSceneClassRegistry *sceneClassRegistry, CDllDirectory *dllDirectory, CClassDirectory3 *classDirectory3) : m_SceneClassRegistry(sceneClassRegistry), m_DllDirectory(dllDirectory), m_ClassDirectory3(classDirectory3) +{ + +} + +CScene::~CScene() +{ + +} + +std::string CScene::className() const +{ + return "Scene"; +} + +void CScene::toString(std::ostream &ostream, const std::string &pad) const +{ + CStorageContainer::toString(ostream, pad); +} + +void CScene::parse(uint16 version, uint filter) +{ + CStorageContainer::parse(version); + nlassert(m_Chunks.size() == 1); +} + +void CScene::clean() +{ + CStorageContainer::clean(); +} + +void CScene::build(uint16 version, uint filter) +{ + nlassert(m_Chunks.size() == 1); + CStorageContainer::build(this->version()); +} + +void CScene::disown() +{ + CStorageContainer::disown(); +} + +uint16 CScene::version() +{ + nlassert(m_Chunks.size() == 1); + return m_Chunks.begin()->first; +} + +CSceneClassContainer *CScene::container() +{ + nlassert(m_Chunks.size() == 1); + return static_cast(m_Chunks.begin()->second); +} + +IStorageObject *CScene::createChunkById(uint16 id, bool container) +{ + if (container) + { + // Return the scene class container. There can be only one. + return new CSceneClassContainer(this, m_SceneClassRegistry, m_DllDirectory, m_ClassDirectory3); + } + return CStorageContainer::createChunkById(id, container); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CSceneClassContainer::CSceneClassContainer(CScene *scene, const CSceneClassRegistry *sceneClassRegistry, CDllDirectory *dllDirectory, CClassDirectory3 *classDirectory3) : m_Scene(scene), m_SceneClassRegistry(sceneClassRegistry), m_DllDirectory(dllDirectory), m_ClassDirectory3(classDirectory3), m_BuiltinScene(NULL) +{ + +} + +CSceneClassContainer::~CSceneClassContainer() +{ + +} + +std::string CSceneClassContainer::className() const +{ + return "SceneClassContainer"; +} + +void CSceneClassContainer::toString(std::ostream &ostream, const std::string &pad) const +{ + CStorageContainer::toString(ostream, pad); +} + +void CSceneClassContainer::parse(uint16 version, uint filter) +{ + // Temporary 'readonly' implementation, not modifying m_Chunks! + m_StorageObjectByIndex.resize(m_Chunks.size()); + TStorageObjectIterator it = m_Chunks.begin(); + for (std::vector::size_type i = 0; i < m_StorageObjectByIndex.size(); ++i) + { + m_StorageObjectByIndex[i] = static_cast(it->second); + ++it; + } + CSceneClass *builtinScene = m_StorageObjectByIndex[m_StorageObjectByIndex.size() - 1]; + nlassert(builtinScene); + m_BuiltinScene = dynamic_cast(builtinScene); + nlassert(m_BuiltinScene); + CStorageContainer::parse(version); +} + +void CSceneClassContainer::clean() +{ + // Temporary 'readonly' implementation, not modifying m_Chunks! + CStorageContainer::clean(); +} + +void CSceneClassContainer::build(uint16 version, uint filter) +{ + // Temporary 'readonly' implementation, not modifying m_Chunks! + for (std::vector::size_type i = 0; i < m_StorageObjectByIndex.size(); ++i) + { + m_StorageObjectToIndex[m_StorageObjectByIndex[i]] = i; + } + CStorageContainer::build(version); +} + +void CSceneClassContainer::disown() +{ + // Temporary 'readonly' implementation, not modifying m_Chunks! + CStorageContainer::disown(); +} + +CSceneClass *CSceneClassContainer::getByStorageIndex(uint32 index) const +{ + // Temporary 'readonly' implementation, not modifying m_Chunks! + if (index >= m_StorageObjectByIndex.size()) { nlerror("Index %i is outside size %i", index, m_StorageObjectByIndex.size()); return NULL; } + return m_StorageObjectByIndex[index]; +} + +uint32 CSceneClassContainer::getOrCreateStorageIndex(CSceneClass *storageObject) +{ + // Temporary 'readonly' implementation, not modifying m_Chunks! + return m_StorageObjectToIndex[storageObject]; +} + +IStorageObject *CSceneClassContainer::createChunkById(uint16 id, bool container) +{ + // nldebug("Scene class id %x (%i)", (uint32)id, (uint32)id); + switch (id) + { + // Known unknown special identifiers... + case 0x2032: + return m_SceneClassRegistry->createUnknown(m_Scene, 0x0, NLMISC::CClassId(0x29263a68, 0x405f22f5), ucstring("OSM Derived"), ucstring("Internal"), ucstring("Internal")); + case 0x2033: + return m_SceneClassRegistry->createUnknown(m_Scene, 0x0, NLMISC::CClassId(0x4ec13906, 0x5578130e), ucstring("WSM Derived"), ucstring("Internal"), ucstring("Internal")); + // return new CSceneClass(m_Scene); // TODO: Make dummy dllentry and classentry for these... + // return static_cast(new CSceneClassUnknown(dllEntry, classEntry)); + } + const CClassEntry *classEntry = m_ClassDirectory3->get(id); + CSceneClass *sceneClass = m_SceneClassRegistry->create(m_Scene, classEntry->superClassId(), classEntry->classId()); + if (sceneClass) + { + return static_cast(sceneClass); + } + else + { + const CDllEntry *dllEntry = m_DllDirectory->get(classEntry->dllIndex()); + sceneClass = m_SceneClassRegistry->createUnknown(m_Scene, classEntry->superClassId(), classEntry->classId(), classEntry->displayName(), dllEntry->dllFilename(), dllEntry->dllDescription()); + if (sceneClass) + { + return static_cast(sceneClass); + } + else + { + // Create an invalid unknown scene class + return static_cast(new CSceneClassUnknown(m_Scene,classEntry->classId(), classEntry->superClassId(), classEntry->displayName(), "SceneClassUnknown", dllEntry->dllFilename(), dllEntry->dllDescription())); + } + } +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/scene.h b/code/nel/tools/3d/pipeline_max/scene.h new file mode 100644 index 000000000..89153368f --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/scene.h @@ -0,0 +1,146 @@ +/** + * \file scene.h + * \brief CScene + * \date 2012-08-18 19:25GMT + * \author Jan Boon (Kaetemi) + * CScene + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_SCENE_H +#define PIPELINE_SCENE_H +#include + +// STL includes + +// NeL includes +#include + +// Project includes +#include "storage_object.h" +#include "storage_value.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +class CSceneImpl; + +} + +class CSceneClass; + +// Registry containing available scene classes +class CSceneClassRegistry; + +// Storage +class CDllDirectory; +class CClassDirectory3; +class CSceneClassContainer; + +/** + * \brief CScene + * \date 2012-08-19 19:25GMT + * \author Jan Boon (Kaetemi) + * CScene + */ +class CScene : public CStorageContainer +{ +public: + CScene(const CSceneClassRegistry *sceneClassRegistry, CDllDirectory *dllDirectory, CClassDirectory3 *classDirectory3); + virtual ~CScene(); + + // inherited + virtual std::string className() const; + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + + // public + uint16 version(); + CSceneClassContainer *container(); + +protected: + virtual IStorageObject *createChunkById(uint16 id, bool container); + +private: + const CSceneClassRegistry *m_SceneClassRegistry; + CDllDirectory *m_DllDirectory; + CClassDirectory3 *m_ClassDirectory3; + +}; /* class CScene */ + +/** + * \brief CSceneClassContainer + * \date 2012-08-19 19:25GMT + * \author Jan Boon (Kaetemi) + * CSceneClassContainer + */ +class CSceneClassContainer : public CStorageContainer +{ +public: + CSceneClassContainer(CScene *scene, const CSceneClassRegistry *sceneClassRegistry, CDllDirectory *dllDirectory, CClassDirectory3 *classDirectory3); + virtual ~CSceneClassContainer(); + + // inherited + virtual std::string className() const; + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + + /// Use while parsing to get an object by it's index + CSceneClass *getByStorageIndex(uint32 index) const; + /// Use while building to get an index for an object + uint32 getOrCreateStorageIndex(CSceneClass *storageObject); + + /// TODO: Evaluate the references tree to build new indexes. + +protected: + virtual IStorageObject *createChunkById(uint16 id, bool container); + +public: + /// Return the single instance of the builtin scene class + inline BUILTIN::CSceneImpl *scene() const { return m_BuiltinScene; } + +private: + CScene *m_Scene; + + const CSceneClassRegistry *m_SceneClassRegistry; + CDllDirectory *m_DllDirectory; + CClassDirectory3 *m_ClassDirectory3; + + std::vector m_StorageObjectByIndex; + std::map m_StorageObjectToIndex; + + BUILTIN::CSceneImpl *m_BuiltinScene; + +}; /* class CSceneClassContainer */ + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_SCENE_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/scene_class.cpp b/code/nel/tools/3d/pipeline_max/scene_class.cpp new file mode 100644 index 000000000..61527d854 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/scene_class.cpp @@ -0,0 +1,288 @@ +/** + * \file scene_class.cpp + * \brief CSceneClass + * \date 2012-08-20 09:07GMT + * \author Jan Boon (Kaetemi) + * CSceneClass + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "scene_class.h" + +// STL includes +#include + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +// Elevate warnings to errors in this file for stricter reading +#undef nlwarning +#define nlwarning nlerror + +// Elevate debug to error in this file for debugging +// #undef nldebug +// #define nldebug nlerror + +// Chunk identifiers +// #define ... + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CSceneClass::CSceneClass(CScene *scene) : m_Scene(scene) +{ + +} + +CSceneClass::~CSceneClass() +{ + if (!m_ChunksOwnsPointers) + { + for (TStorageObjectContainer::iterator it = m_OrphanedChunks.begin(), end = m_OrphanedChunks.end(); it != end; ++it) + delete it->second; + m_OrphanedChunks.clear(); + for (std::vector::iterator it = m_ArchivedChunks.begin(), end = m_ArchivedChunks.end(); it != end; ++it) + delete (*it); + m_ArchivedChunks.clear(); + } +} + +std::string CSceneClass::className() const +{ + return classDesc()->internalName(); +} + +void CSceneClass::toString(std::ostream &ostream, const std::string &pad) const +{ + if (m_ChunksOwnsPointers) + { + CStorageContainer::toString(ostream, pad); + } + else + { + ostream << " "; + ostream << "(" << className() << ": " << ucstring(classDesc()->displayName()).toUtf8() << ", " << classDesc()->classId().toString() << ", 0x"; + { + std::stringstream ss; + ss << std::hex << std::setfill('0'); + ss << std::setw(8) << classDesc()->superClassId(); + ostream << ss.str(); + } + ostream << ", " << ucstring(classDesc()->dllPluginDesc()->internalName()).toUtf8() << ") [" << m_OrphanedChunks.size() << "] { "; + toStringLocal(ostream, pad); + // Append orphans + std::string padpad = pad + "\t"; + sint i = 0; + for (TStorageObjectContainer::const_iterator it = m_OrphanedChunks.begin(), end = m_OrphanedChunks.end(); it != end; ++it) + { + std::stringstream ss; + ss << std::hex << std::setfill('0'); + ss << std::setw(4) << it->first; + ostream << "\n" << pad << "Orphan[" << i << "] 0x" << ss.str() << ": "; + it->second->toString(ostream, padpad); + ++i; + } + ostream << "} "; + } +} + +void CSceneClass::parse(uint16 version, uint filter) +{ + // Cannot be parsed yet + if (!m_ChunksOwnsPointers) { nlerror("Already parsed"); return; } // Already parsed, illegal to call twice + + // Parse all child chunks + CStorageContainer::parse(version); + + // Orphanize all child chunk + m_OrphanedChunks.insert(m_OrphanedChunks.end(), m_Chunks.begin(), m_Chunks.end()); + + // Take ownership + m_ChunksOwnsPointers = false; + + // Inheriting classes take control from here on, they should check + // m_ChunksOwnsPointers to be false before taking action, in case + // a subclass called disown due to failure. +} + +void CSceneClass::clean() +{ + if (m_ChunksOwnsPointers) { nldebug("Not parsed, or disowned"); return; } // Must have local ownership, parsing may have failed + if (m_Chunks.size() == 0 && m_OrphanedChunks.size() != 0) { nlwarning("Already cleaned"); return; } // Already cleaned, should not call twice, not reliable because not all chunks have child chunks + + // Clear unneeded references from the parent + m_Chunks.clear(); + + // Clean owned child chunks + for (TStorageObjectContainer::const_iterator it = m_OrphanedChunks.begin(), end = m_OrphanedChunks.end(); it != end; ++it) + { + if (it->second->isContainer()) + { + static_cast(it->second)->clean(); + } + } + + // Erase archived chunks, they must have been parsed perfectly + for (std::vector::iterator it = m_ArchivedChunks.begin(), end = m_ArchivedChunks.end(); it != end; ++it) + delete (*it); + m_ArchivedChunks.clear(); +} + +void CSceneClass::build(uint16 version, uint filter) +{ + // Must be clean first + if (!m_ChunksOwnsPointers && m_Chunks.size() != 0) { nlerror("Not cleaned"); return; } // Cannot call twice, illegal call + if (m_Chunks.size() != 0) { nldebug("Not parsed, or disowned"); return; } // Don't have local ownership, parsing may have failed, the built version is implicitly up to date + + // Store orphan chunks + m_Chunks.insert(m_Chunks.end(), m_OrphanedChunks.begin(), m_OrphanedChunks.end()); + + // Build the orphan chunks (this is a little trick to do it this + // way here, don't do this from subclasses) + CStorageContainer::build(version); + + // Set the insertion pointer before the orphans + m_PutChunkInsert = m_Chunks.begin(); + + // Inheriting classes take control from here on, so the build is + // called to owned subclasses from the putChunk function. +} + +void CSceneClass::disown() +{ + if (m_ChunksOwnsPointers) { nldebug("Not parsed"); } + if (!m_ChunksOwnsPointers && (m_Chunks.size() < m_OrphanedChunks.size())) { nlerror("Not built"); return; } // If chunks is not the owner, built chunks must match the parsed data. This check is not fully reliable + + // Clear local references + m_OrphanedChunks.clear(); + m_ArchivedChunks.clear(); + + // Return ownership + m_ChunksOwnsPointers = true; + + // Disown children + CStorageContainer::disown(); +} + +void CSceneClass::init() +{ + // Nothing to do here! +} + +IStorageObject *CSceneClass::createChunkById(uint16 id, bool container) +{ + return CStorageContainer::createChunkById(id, container); +} + +const ucstring CSceneClass::DisplayName = ucstring("Invalid Scene Class"); +const char *CSceneClass::InternalName = "SceneClass"; +const NLMISC::CClassId CSceneClass::ClassId = NLMISC::CClassId::Null; // This class is invalid +const TSClassId CSceneClass::SuperClassId = 0x0000; // This class is invalid + +namespace { +static const CSceneClassDesc SceneClassDesc(static_cast(&DllPluginDescBuiltin)); +} /* anonymous namespace */ + +bool CSceneClass::inherits(const NLMISC::CClassId classId) const +{ + return false; +} + +const ISceneClassDesc *CSceneClass::classDesc() const +{ + return static_cast(&SceneClassDesc); +} + +void CSceneClass::toStringLocal(std::ostream &ostream, const std::string &pad, uint filter) const +{ + // Nothing to do here... +} + +IStorageObject *CSceneClass::getChunk(uint16 id) +{ + if (m_OrphanedChunks.begin()->first == id) + { + IStorageObject *result = m_OrphanedChunks.begin()->second; + m_OrphanedChunks.pop_front(); + return result; + } + else + { + for (TStorageObjectContainer::iterator it = m_OrphanedChunks.begin(), end = m_OrphanedChunks.end(); it != end; ++it) + { + if (it->first == id) + { + nlwarning("Try to get chunk with 0x%x id, but found 0x%x instead. Found the correct chunk at a different position. Unknown chunks, or chunks out of order", (uint32)id, (uint32)m_OrphanedChunks.begin()->first); + IStorageObject *result = it->second; + m_OrphanedChunks.erase(it); + return result; + } + } + } + // nldebug("Chunk 0x%x not found, this is allowed, returning NULL", (uint32)id); + return NULL; +} + +void CSceneClass::putChunk(uint16 id, IStorageObject *storageObject) +{ + if (storageObject->isContainer()) + { + static_cast(storageObject)->build(VersionUnknown); // FIXME + } + m_OrphanedChunks.insert(m_PutChunkInsert, TStorageObjectWithId(id, storageObject)); +} + +uint16 CSceneClass::peekChunk() +{ + if (m_OrphanedChunks.size()) + return m_OrphanedChunks.begin()->first; + return 0x0000; +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/scene_class.h b/code/nel/tools/3d/pipeline_max/scene_class.h new file mode 100644 index 000000000..75c84ba08 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/scene_class.h @@ -0,0 +1,231 @@ +/** + * \file scene_class.h + * \brief CSceneClass + * \date 2012-08-20 09:07GMT + * \author Jan Boon (Kaetemi) + * CSceneClass + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_SCENE_CLASS_H +#define PIPELINE_SCENE_CLASS_H +#include + +// STL includes + +// NeL includes +#include +#include + +// Project includes +#include "typedefs.h" +#include "storage_object.h" +#include "storage_value.h" +#include "dll_plugin_desc.h" +#include "scene.h" + +namespace PIPELINE { +namespace MAX { +namespace BUILTIN { + +class CSceneImpl; + +} + +class ISceneClassDesc; + +/** + * \brief CSceneClass + * \date 2012-08-19 19:25GMT + * \author Jan Boon (Kaetemi) + * It is recommended to use CRefPtr to refer to any pointers to + * classes inherited from this class. + * NOTE: CRefPtr does not delete the class when references go to + * zero. When you remove a class from the scene, the class will be + * deleted if the reference count is zero. Otherwise, you are + * responsible for deleting it (for example, if you keep the class + * backed up in an undo stack for undeletion). You may use CSmartPtr + * when the class is no longer owned by the scene container. + * CRefPtr is a safe handle, which you can use to verify if the class + * has been deleted or not, similar to AnimHandle in max. + */ +class CSceneClass : public CStorageContainer, public NLMISC::CVirtualRefCount +{ +public: + CSceneClass(CScene *scene); + virtual ~CSceneClass(); + + //! \name Inherited functions that are implemented by wrapping around other virtual functions in this class + //@{ + virtual std::string className() const; // do not override, implemented using classDesc + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; // do not override, implemented using toStringLocal + //@} + + //! \name Inherited functions called through the storage loading and saving system + //@{ + /// Override this to read a chunk from the chunks stream. Call the parent's parse function first. Get the necessary chunks implemented by your class using getChunk. See the getChunk function for further information. In case of failure, call disown. If m_ChunksOwnsPointers is true, the parsing has failed, warnings have already been printed, and nothing should happen. Chunks are already parsed when you get them from getChunk + virtual void parse(uint16 version, uint filter = 0); + /// Override this if the chunks you are using are not needed after they have been parsed. You may delete any chunks you own. Call the parent's clean first. You must call clean on any chunks you own if they implement this function + virtual void clean(); + /// Override this to write a chunk to the chunks stream. If you create a new chunk, the creating class owns it, and should delete it when clean is called. You no longer own any created chunks when disown has been called. Use putChunk to add the chunk. Call the parent's build first. The putChunk function calls build on added chunks + virtual void build(uint16 version, uint filter = 0); + /// Remove any references to chunks that are owned by the inheriting class (those that were acquired using getChunk during parse or created using putChunk during build). You no longer have ownership over these chunks, and should not use them anymore. This function may be called after build to disable any functionality from the loaded storage. Call the parent's disown after disowning your own chunks. Disown is called on the disowned child chunks for you + virtual void disown(); + //@} + + //! \name Virtual functionality for inheriting classes to implement + //@{ + /// Initialize this class from scratch, call the parent first + virtual void init(); + //@} + + //! \name Static const variables for the class description + //@{ + static const ucstring DisplayName; + static const char *InternalName; + static const NLMISC::CClassId ClassId; + static const TSClassId SuperClassId; + //@} + + //! \name More virtual functionality for inheriting classes to implement + //@{ + /// Returns whether the class inherits from a class with given class id + virtual bool inherits(const NLMISC::CClassId classId) const; + /// Return the class description of the inheriting class + virtual const ISceneClassDesc *classDesc() const; + /// Create a readable representation of this class + virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "", uint filter = 0) const; + //@} + +public: + //! \name Read access to internal data, provided for browsing trough the file from code + //@{ + inline const TStorageObjectContainer &orphanedChunks() const { return m_OrphanedChunks; } + //@} + + //! \name Scene utility access + //@{ + /// Return the scene scene class + inline BUILTIN::CSceneImpl *scene() const { return m_Scene->container()->scene(); } + /// Return the scene version + inline uint16 version() const { return m_Scene->version(); } + /// Return the scene container + inline CSceneClassContainer *container() const { return m_Scene->container(); } + //@} + +protected: + //! \name Methods used by inheriting classes to read and write to the storage safely + //@{ + /// Use during parsing. Gets the chunk with specified id. Warnings when chunks are skipped may be elevated to errors. Remaining orphaned chunks will be appended after chunks that are written by the classes. Returns NULL when the chunk does not exist. Empty chunks are often not written by classes. You have ownership over the chunk until it is disowned. In case that the chunk cannot be parsed, call disown and abort parsing, or you may keep the chunk as is without modifications and put it back as is during build with putChunk. If this function returns NULL it is also possible that the parsing has been aborted when m_ChunksOwnsPointers is true + IStorageObject *getChunk(uint16 id); + /// Use during file build. Adds a chunk to the chunks that will be written to the file. Build is called when a chunk is passed through + void putChunk(uint16 id, IStorageObject *storageObject); + /// Same as getChunk but for lazy programmers, must use together with putChunkValue + template + const T &getChunkValue(uint16 id); + /// Same as putChunk but for lazy programmers, must use together with getChunkValue + template + void putChunkValue(uint16 id, const T &value); + /// See the next chunk id + uint16 peekChunk(); + //@} + +protected: + virtual IStorageObject *createChunkById(uint16 id, bool container); + + /// Chunks which have been parsed, kept unmodified, and which are no longer necessary, should be placed here + std::vector m_ArchivedChunks; + +private: + TStorageObjectContainer m_OrphanedChunks; + TStorageObjectIterator m_PutChunkInsert; + + CScene *m_Scene; + +}; /* class CSceneClass */ + +template +const T &CSceneClass::getChunkValue(uint16 id) +{ + CStorageValue *chunk = static_cast *>(getChunk(id)); + if (!chunk) { nlerror("Try to get required chunk value 0x%x but it does not exist, bad file format"); } + m_ArchivedChunks.push_back(chunk); + return chunk->Value; +} + +template +void CSceneClass::putChunkValue(uint16 id, const T &value) +{ + CStorageValue *chunk = new CStorageValue(); + chunk->Value = value; + m_ArchivedChunks.push_back(chunk); + putChunk(id, chunk); +} + +/** + * \brief ISceneClassDesc + * \date 2012-08-19 19:25GMT + * \author Jan Boon (Kaetemi) + * ISceneClassDesc + */ +class ISceneClassDesc +{ +public: + virtual CSceneClass *create(CScene *scene) const = 0; + virtual void destroy(CSceneClass *sc) const = 0; + virtual const ucchar *displayName() const = 0; + virtual const char *internalName() const = 0; + virtual NLMISC::CClassId classId() const = 0; + virtual TSClassId superClassId() const = 0; + virtual const IDllPluginDescInternal *dllPluginDesc() const = 0; + +}; /* class ISceneClassDesc */ + +/** + * \brief CSceneClassDesc + * \date 2012-08-19 19:25GMT + * \author Jan Boon (Kaetemi) + * CSceneClassDesc + * Use in a cpp when registering the CClassId. + */ +template +class CSceneClassDesc : public ISceneClassDesc +{ +public: + CSceneClassDesc(const IDllPluginDescInternal *dllPluginDesc) : m_DllPluginDesc(dllPluginDesc) { } + virtual CSceneClass *create(CScene *scene) const { return static_cast(new T(scene)); } + virtual void destroy(CSceneClass *sc) const { delete static_cast(sc); } + virtual const ucchar *displayName() const { return T::DisplayName.c_str(); } + virtual const char *internalName() const { return T::InternalName; } + virtual NLMISC::CClassId classId() const { return T::ClassId; } + virtual TSClassId superClassId() const { return T::SuperClassId; } + virtual const IDllPluginDescInternal *dllPluginDesc() const { return m_DllPluginDesc; } +private: + const IDllPluginDescInternal *m_DllPluginDesc; + +}; /* class CSceneClassDesc */ + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_SCENE_CLASS_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/scene_class_registry.cpp b/code/nel/tools/3d/pipeline_max/scene_class_registry.cpp new file mode 100644 index 000000000..d5b63bd78 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/scene_class_registry.cpp @@ -0,0 +1,176 @@ +/** + * \file scene_class_registry.cpp + * \brief CSceneClassRegistry + * \date 2012-08-20 09:57GMT + * \author Jan Boon (Kaetemi) + * CSceneClassRegistry + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "scene_class_registry.h" + +// STL includes +#include + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +// Elevate warnings to errors in this file for stricter reading +#undef nlwarning +#define nlwarning nlerror + +// Elevate debug to error in this file for debugging +// #undef nldebug +// #define nldebug nlerror + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CSceneClassRegistry::CSceneClassRegistry() +{ + +} + +CSceneClassRegistry::~CSceneClassRegistry() +{ + +} + +void CSceneClassRegistry::add(const ISceneClassDesc *desc) +{ + TKey key(desc->superClassId(), desc->classId()); + if (m_ClassDescriptions.find(key) != m_ClassDescriptions.end()) { nlerror("Already added this class to the registry"); return; } + m_ClassDescriptions[key] = desc; +} + +void CSceneClassRegistry::remove(const TSClassId superClassId, const NLMISC::CClassId classId) +{ + TKey key(superClassId, classId); + if (m_ClassDescriptions.find(key) == m_ClassDescriptions.end()) { nlwarning("Try to remove class that is not found"); return; } + m_ClassDescriptions.erase(key); +} + +/// Add a superclass to the registry +void CSceneClassRegistry::add(const ISuperClassDesc *desc) +{ + // nldebug("Register superclass 0x%x", desc->superClassId()); + if (m_SuperClassDescriptions.find(desc->superClassId()) != m_SuperClassDescriptions.end()) { nlerror("Already added this superclass to the registry"); return; } + m_SuperClassDescriptions[desc->superClassId()] = desc; +} + +/// Remove a superclass from the registry +void CSceneClassRegistry::remove(const TSClassId superClassId) +{ + if (m_SuperClassDescriptions.find(superClassId) == m_SuperClassDescriptions.end()) { nlwarning("Try to remove superclass that is not found"); return; } + m_SuperClassDescriptions.erase(superClassId); +} + +/// Create a class by class id +CSceneClass *CSceneClassRegistry::create(CScene *scene, const TSClassId superClassId, const NLMISC::CClassId classId) const +{ + TKey key(superClassId, classId); + if (m_ClassDescriptions.find(key) == m_ClassDescriptions.end()) { /* nldebug("Try to create class that does not exist"); */ return NULL; } + return m_ClassDescriptions.find(key)->second->create(scene); +} + +/// Create an unknown class by superclass id +CSceneClass *CSceneClassRegistry::createUnknown(CScene *scene, TSClassId superClassId, const NLMISC::CClassId classId, const ucstring &displayName, const ucstring &dllFilename, const ucstring &dllDescription) const +{ + if (m_SuperClassDescriptions.find(superClassId) == m_SuperClassDescriptions.end()) { nlwarning("Creating superclass 0x%x (%s) %s that does not exist", superClassId, displayName.toUtf8().c_str(), classId.toString().c_str()); return NULL; } + return m_SuperClassDescriptions.find(superClassId)->second->createUnknown(scene, classId, displayName, dllFilename, dllDescription); +} + +/// Destroy a class by pointer +void CSceneClassRegistry::destroy(CSceneClass *sceneClass) const +{ + sceneClass->classDesc()->destroy(sceneClass); +} + +/// Return the description of a class by class id +const ISceneClassDesc *CSceneClassRegistry::describe(const TSClassId superClassId, const NLMISC::CClassId classId) const +{ + TKey key(superClassId, classId); + if (m_ClassDescriptions.find(key) == m_ClassDescriptions.end()) { nldebug("Try to describe class that does not exist"); return NULL; } + return m_ClassDescriptions.find(key)->second; +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CSceneClassRegistry::TKey::TKey(TSClassId superClassId, NLMISC::CClassId classId) : SuperClassId(superClassId), ClassId(classId) +{ + +} + +bool CSceneClassRegistry::TKey::operator<(const CSceneClassRegistry::TKey &right) const +{ + if (SuperClassId < right.SuperClassId) + return true; + if (SuperClassId > right.SuperClassId) + return false; + if (ClassId < right.ClassId) + return true; + if (ClassId > right.ClassId) + return false; + return false; +} + +bool CSceneClassRegistry::TKey::operator>(const CSceneClassRegistry::TKey &right) const +{ + if (SuperClassId > right.SuperClassId) + return true; + if (SuperClassId < right.SuperClassId) + return false; + if (ClassId > right.ClassId) + return true; + if (ClassId < right.ClassId) + return false; + return false; +} + +bool CSceneClassRegistry::TKey::operator==(const CSceneClassRegistry::TKey &right) const +{ + return ClassId == right.ClassId && SuperClassId == right.SuperClassId; +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/scene_class_registry.h b/code/nel/tools/3d/pipeline_max/scene_class_registry.h new file mode 100644 index 000000000..af954c533 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/scene_class_registry.h @@ -0,0 +1,98 @@ +/** + * \file scene_class_registry.h + * \brief CSceneClassRegistry + * \date 2012-08-20 09:57GMT + * \author Jan Boon (Kaetemi) + * CSceneClassRegistry + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_SCENE_CLASS_REGISTRY_H +#define PIPELINE_SCENE_CLASS_REGISTRY_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "scene_class.h" +#include "super_class_desc.h" + +namespace PIPELINE { +namespace MAX { + +/** + * \brief CSceneClassRegistry + * \date 2012-08-20 09:57GMT + * \author Jan Boon (Kaetemi) + * CSceneClassRegistry + */ +class CSceneClassRegistry +{ +public: + CSceneClassRegistry(); + virtual ~CSceneClassRegistry(); + + /// Add a class to the registry + void add(const ISceneClassDesc *desc); + /// Remove a class from the registry + void remove(TSClassId superClassId, const NLMISC::CClassId classId); + + /// Add a superclass to the registry + void add(const ISuperClassDesc *desc); + /// Remove a superclass from the registry + void remove(const TSClassId superClassId); + + /// Create a class by class id + CSceneClass *create(CScene *scene, TSClassId superClassId, const NLMISC::CClassId classId) const; + + /// Create an unknown class by superclass id + CSceneClass *createUnknown(CScene *scene, TSClassId superClassId, const NLMISC::CClassId classId, const ucstring &displayName, const ucstring &dllFilename, const ucstring &dllDescription) const; + + /// Destroy a class by pointer + void destroy(CSceneClass *sceneClass) const; + + /// Return the description of a class by class id + const ISceneClassDesc *describe(TSClassId superClassId, const NLMISC::CClassId classId) const; + +private: + struct TKey + { + TKey(TSClassId superClassId, NLMISC::CClassId classId); + TSClassId SuperClassId; + NLMISC::CClassId ClassId; + bool operator<(const TKey &right) const; + bool operator>(const TKey &right) const; + bool operator==(const TKey &right) const; + }; + + std::map m_ClassDescriptions; + std::map m_SuperClassDescriptions; + +}; /* class CSceneClassRegistry */ + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_SCENE_CLASS_REGISTRY_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/scene_class_unknown.cpp b/code/nel/tools/3d/pipeline_max/scene_class_unknown.cpp new file mode 100644 index 000000000..f5179a7d3 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/scene_class_unknown.cpp @@ -0,0 +1,114 @@ +/** + * \file scene_class_unknown.cpp + * \brief CSceneClassUnknown + * \date 2012-08-20 13:23GMT + * \author Jan Boon (Kaetemi) + * CSceneClassUnknown + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "scene_class_unknown.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +// using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CSceneClassUnknownDllPluginDesc::CSceneClassUnknownDllPluginDesc(const ucstring &dllFilename, const ucstring &dllDescription) : m_InternalName(dllFilename), m_DisplayName(dllDescription) +{ + +} + +const ucchar *CSceneClassUnknownDllPluginDesc::internalName() const +{ + return m_InternalName.c_str(); +} + +const ucchar *CSceneClassUnknownDllPluginDesc::displayName() const +{ + return m_DisplayName.c_str(); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CSceneClassUnknownDesc::CSceneClassUnknownDesc(const NLMISC::CClassId classId, const TSClassId superClassId, const ucstring &displayName, const std::string &internalName, const ucstring &dllFilename, const ucstring &dllDescription) : m_DisplayName(displayName), m_InternalName(internalName), m_ClassId(classId), m_SuperClassId(superClassId), m_DllPluginDesc(dllFilename, dllDescription) +{ + +} + +CSceneClass *CSceneClassUnknownDesc::create(CScene *scene) const +{ + nlassert(false); +} + +void CSceneClassUnknownDesc::destroy(CSceneClass *sc) const +{ + delete sc; +} + +const ucchar *CSceneClassUnknownDesc::displayName() const +{ + return m_DisplayName.c_str(); +} + +const char *CSceneClassUnknownDesc::internalName() const +{ + return m_InternalName.c_str(); +} + +NLMISC::CClassId CSceneClassUnknownDesc::classId() const +{ + return m_ClassId; +} + +TSClassId CSceneClassUnknownDesc::superClassId() const +{ + return m_SuperClassId; +} + +const IDllPluginDescInternal *CSceneClassUnknownDesc::dllPluginDesc() const +{ + return &m_DllPluginDesc; +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/scene_class_unknown.h b/code/nel/tools/3d/pipeline_max/scene_class_unknown.h new file mode 100644 index 000000000..46fb44a39 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/scene_class_unknown.h @@ -0,0 +1,115 @@ +/** + * \file scene_class_unknown.h + * \brief CSceneClassUnknown + * \date 2012-08-20 13:23GMT + * \author Jan Boon (Kaetemi) + * CSceneClassUnknown + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_SCENE_CLASS_UNKNOWN_H +#define PIPELINE_SCENE_CLASS_UNKNOWN_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "scene_class.h" + +namespace PIPELINE { +namespace MAX { + +/** + * \brief CSceneClassUnknownDllPluginDesc + * \date 2012-08-20 13:23GMT + * \author Jan Boon (Kaetemi) + * CSceneClassUnknownDllPluginDesc + */ +class CSceneClassUnknownDllPluginDesc : public IDllPluginDescInternal +{ +public: + CSceneClassUnknownDllPluginDesc(const ucstring &dllFilename, const ucstring &dllDescription); + virtual const ucchar *internalName() const; + virtual const ucchar *displayName() const; + +private: + ucstring m_InternalName; + ucstring m_DisplayName; + +}; + +/** + * \brief CSceneClassUnknownDesc + * \date 2012-08-20 13:23GMT + * \author Jan Boon (Kaetemi) + * CSceneClassUnknownDesc + */ +class CSceneClassUnknownDesc : public ISceneClassDesc +{ +public: + CSceneClassUnknownDesc(const NLMISC::CClassId classId, const TSClassId superClassId, const ucstring &displayName, const std::string &internalName, const ucstring &dllFilename, const ucstring &dllDescription); + virtual CSceneClass *create(CScene *scene) const; + virtual void destroy(CSceneClass *sc) const; + virtual const ucchar *displayName() const; + virtual const char *internalName() const; + virtual NLMISC::CClassId classId() const; + virtual TSClassId superClassId() const; + virtual const IDllPluginDescInternal *dllPluginDesc() const; + +private: + ucstring m_DisplayName; + std::string m_InternalName; + NLMISC::CClassId m_ClassId; + TSClassId m_SuperClassId; + CSceneClassUnknownDllPluginDesc m_DllPluginDesc; + +}; /* class ISceneClassDesc */ + +/** + * \brief CSceneClassUnknown + * \date 2012-08-20 13:23GMT + * \author Jan Boon (Kaetemi) + * Utility class for parsing unknown scene classes and keeping them + * in storage as is. + */ +template +class CSceneClassUnknown : public TSuperClass +{ +public: + CSceneClassUnknown(CScene *scene, const NLMISC::CClassId classId, const TSClassId superClassId, const ucstring &displayName, const std::string &internalName, const ucstring &dllFilename, const ucstring &dllDescription) : TSuperClass(scene), m_Desc(classId, superClassId, displayName, internalName, dllFilename, dllDescription) { } + virtual ~CSceneClassUnknown() { } + + // inherited + virtual const ISceneClassDesc *classDesc() const { return &m_Desc; } + +private: + CSceneClassUnknownDesc m_Desc; + +}; /* class CSceneClass */ + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_SCENE_CLASS_UNKNOWN_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/storage_array.cpp b/code/nel/tools/3d/pipeline_max/storage_array.cpp new file mode 100644 index 000000000..acd0326c7 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/storage_array.cpp @@ -0,0 +1,49 @@ +/** + * \file storage_array.cpp + * \brief CStorageArray + * \date 2012-08-21 11:33GMT + * \author Jan Boon (Kaetemi) + * CStorageArray + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "storage_array.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { + +void blahblahblah() { } + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/storage_array.h b/code/nel/tools/3d/pipeline_max/storage_array.h new file mode 100644 index 000000000..1f72f8213 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/storage_array.h @@ -0,0 +1,217 @@ +/** + * \file storage_array.h + * \brief CStorageArray + * \date 2012-08-21 11:33GMT + * \author Jan Boon (Kaetemi) + * CStorageArray + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_STORAGE_ARRAY_H +#define PIPELINE_STORAGE_ARRAY_H +#include + +// STL includes +#include + +// NeL includes +#include +#include + +// Project includes +#include "storage_object.h" + +namespace PIPELINE { +namespace MAX { + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +/** + * \brief CStorageArray + * \date 2012-08-21 11:33GMT + * \author Jan Boon (Kaetemi) + * WARNING: sizeof(TType) should match the serialized size, + * otherwise you must specialize the getSize and setSize functions! + */ +template +class CStorageArray : public IStorageObject +{ +public: + // public data + typedef T TType; + typedef std::vector TTypeArray; + TTypeArray Value; + + // inherited + virtual std::string className() const; + virtual void serial(NLMISC::IStream &stream); + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + +public: // should be protected but that doesn't compile, nice c++! + // Sets size when reading + virtual void setSize(sint32 size); + // Gets the size when writing, return false if unknown + virtual bool getSize(sint32 &size) const; +}; /* class CStorageArray */ + +template +std::string CStorageArray::className() const +{ + return "StorageArray"; +} + +template +void CStorageArray::serial(NLMISC::IStream &stream) +{ + for (typename TTypeArray::iterator it = Value.begin(), end = Value.end(); it != end; ++it) + { + stream.serial(*it); + } +} + +template +void CStorageArray::toString(std::ostream &ostream, const std::string &pad) const +{ + ostream << "(" << className() << ") [" << Value.size() << "] { "; // << s << " } "; + uint i = 0; + for (typename TTypeArray::const_iterator it = Value.begin(), end = Value.end(); it != end; ++it) + { + std::string s = NLMISC::toString(*it); + //ostream << "\n" << pad << i << ": " << s; + ostream << "{ " << s << " } "; + ++i; + } + ostream << "} "; +} + +template +void CStorageArray::setSize(sint32 size) +{ + if (size % (sizeof(TType)) != 0) + nlerror("Size %i is not a multiple of value type size %i", size, sizeof(TType)); + Value.resize(size / sizeof(TType)); +} + +template +bool CStorageArray::getSize(sint32 &size) const +{ + size = Value.size() * sizeof(TType); + return true; +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +template +class CStorageArraySizePre : public CStorageArray +{ +public: + virtual std::string className() const; + virtual void serial(NLMISC::IStream &stream); + virtual void setSize(sint32 size); + virtual bool getSize(sint32 &size) const; +}; + +template +std::string CStorageArraySizePre::className() const +{ + return "StorageArraySizePre"; +} + +template +void CStorageArraySizePre::serial(NLMISC::IStream &stream) +{ + uint32 size = this->Value.size(); + stream.serial(size); + nlassert(this->Value.size() == size); + CStorageArray::serial(stream); +} + +template +void CStorageArraySizePre::setSize(sint32 size) +{ + CStorageArray::setSize(size - sizeof(uint32)); +} + +template +bool CStorageArraySizePre::getSize(sint32 &size) const +{ + size = CStorageArray::getSize(size) + sizeof(uint32); + return true; +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +/// Same as CStorageArraySizePre but with no sizeof checks. +/// Use when serializing variable sizes in type T. +template +class CStorageArrayDynSize : public CStorageArray +{ +public: + virtual std::string className() const; + virtual void serial(NLMISC::IStream &stream); + virtual void setSize(sint32 size); + virtual bool getSize(sint32 &size) const; +}; + +template +std::string CStorageArrayDynSize::className() const +{ + return "StorageArrayDynSize"; +} + +template +void CStorageArrayDynSize::serial(NLMISC::IStream &stream) +{ + uint32 size = this->Value.size(); + stream.serial(size); + this->Value.resize(size); + CStorageArray::serial(stream); +} + +template +void CStorageArrayDynSize::setSize(sint32 size) +{ + // Nothing to do here! +} + +template +bool CStorageArrayDynSize::getSize(sint32 &size) const +{ + // Nothing to do here! + return false; +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_STORAGE_ARRAY_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/storage_chunks.cpp b/code/nel/tools/3d/pipeline_max/storage_chunks.cpp new file mode 100644 index 000000000..b8cfbbd03 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/storage_chunks.cpp @@ -0,0 +1,202 @@ +/** + * \file storage_chunks.cpp + * \brief CStorageChunks + * \date 2012-08-18 09:20GMT + * \author Jan Boon (Kaetemi) + * CStorageChunks + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "storage_chunks.h" + +// STL includes + +// NeL includes +#include + +// Project includes + +// using namespace std; +// using namespace NLMISC; + +// #define NL_DEBUG_STORAGE + +namespace PIPELINE { +namespace MAX { + +CStorageChunks::CStorageChunks(NLMISC::IStream &stream, sint64 size) : m_Stream(stream), m_Is64Bit(false) +{ + if (size >= 2147483647L) + throw NLMISC::EStream("64bit chunks not supported"); + m_Chunks.reserve(64); + m_Chunks.resize(1); + m_Chunks[0].HeaderSize = 0; + m_Chunks[0].OffsetBegin = stream.getPos(); + if (stream.isReading()) + { + m_Chunks[0].Id = 0; + m_Chunks[0].Size = 0x80000000 | (uint32)(size); + } + else + { + m_Chunks[0].Id = 1; + m_Chunks[0].Size = 0; + } +} + +CStorageChunks::~CStorageChunks() +{ +#ifdef NL_DEBUG_STORAGE + if (m_Chunks.size() != 1) + nldebug("Not all chunks were closed"); +#endif +} + +bool CStorageChunks::enterChunk() +{ + if (m_Stream.isReading()) + { + // input logic + if (!isChunkContainer()) + { +#ifdef NL_DEBUG_STORAGE + nldebug("Current chunk is not a container, cannot enter"); +#endif + return false; + } + if (endOfChunk()) + { +#ifdef NL_DEBUG_STORAGE + nldebug("End of chunk, cannot enter"); +#endif + return false; + } + m_Chunks.resize(m_Chunks.size() + 1); + CChunk *chunk = currentChunk(); + chunk->OffsetBegin = m_Stream.getPos(); + m_Stream.serial(chunk->Id); + m_Stream.serial(chunk->Size); + chunk->HeaderSize = 6; + if (chunk->Size == 0) + { + // this is a 64bit chunk + uint64 size64; + m_Stream.serial(size64); + chunk->HeaderSize += 8; + bool iscont = (size64 & 0x8000000000000000) == 0x8000000000000000; + size64 &= 0x7FFFFFFFFFFFFFFF; + if (size64 >= 2147483647L) + throw NLMISC::EStream("64bit chunks not supported"); + // downgrade to 32 bit chunk + chunk->Size = (uint32)size64; + if (iscont) chunk->Size |= 0x80000000; + m_Is64Bit = true; // it's true + } +#ifdef NL_DEBUG_STORAGE + nldebug("Entered reading chunk of size %i", chunk->Size); +#endif + return true; + } + else + { +#ifdef NL_DEBUG_STORAGE + nldebug("No input, this function cannot output, throw exception"); +#endif + throw NLMISC::EStream(); + } +} + +bool CStorageChunks::enterChunk(uint16 id, bool container) +{ + if (!m_Stream.isReading()) + { +#ifdef NL_DEBUG_STORAGE + nldebug("Writing, enter chunk"); +#endif + + if (m_Is64Bit) + throw NLMISC::EStream("64bit chunks not supported"); + + // enter the new chunk + m_Chunks.resize(m_Chunks.size() + 1); + CChunk *chunk = currentChunk(); + uint32 sizeDummy = 0xFFFFFFFF; + chunk->Id = container ? 1 : 0; + chunk->OffsetBegin = m_Stream.getPos(); // store current pos + + // write header + m_Stream.serial(id); // write the id + m_Stream.serial(sizeDummy); // write 32 bit size placeholder + return true; + } + else // input or exception + { + while (enterChunk()) + { + if (getChunkId() == id) + return true; + leaveChunk(); // skip data + } + return false; + } +} + +sint32 CStorageChunks::leaveChunk() +{ + if (m_Stream.isReading()) + { + // input logic + sint32 skipped = currentChunk()->endOfChunk() - m_Stream.getPos(); + if (skipped) + { + m_Stream.seek(currentChunk()->endOfChunk(), NLMISC::IStream::begin); +#ifdef NL_DEBUG_STORAGE + nldebug("Skipped %i bytes in the current chunk", skipped); +#endif + } + m_Chunks.resize(m_Chunks.size() - 1); + return skipped; + } + else + { +#ifdef NL_DEBUG_STORAGE + nldebug("Writing, leave chunk"); +#endif + sint32 pos = m_Stream.getPos(); + sint32 sizeWithHeader = pos - currentChunk()->OffsetBegin; + sint32 sizePos = currentChunk()->OffsetBegin + 2; + m_Stream.seek(sizePos, NLMISC::IStream::begin); // hopefully this correctly overwrites!!! + uint32 sizeField = (uint32)sizeWithHeader | (uint32)currentChunk()->Id << 31; // add container flag + m_Stream.serial(sizeField); + m_Stream.seek(pos, NLMISC::IStream::begin); + m_Chunks.resize(m_Chunks.size() - 1); +#ifdef NL_DEBUG_STORAGE + nldebug("Size: %i, Field: %x", sizeWithHeader, sizeField); +#endif + return sizeWithHeader; + } +} + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/storage_chunks.h b/code/nel/tools/3d/pipeline_max/storage_chunks.h new file mode 100644 index 000000000..45d72fb87 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/storage_chunks.h @@ -0,0 +1,107 @@ +/** + * \file storage_chunks.h + * \brief CStorageChunks + * \date 2012-08-18 09:20GMT + * \author Jan Boon (Kaetemi) + * CStorageChunks + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_STORAGE_CHUNKS_H +#define PIPELINE_STORAGE_CHUNKS_H +#include + +// STL includes + +// NeL includes +#include + +// Project includes + +namespace PIPELINE { +namespace MAX { + +/** + * \brief CStorageChunks + * \date 2012-08-18 09:20GMT + * \author Jan Boon (Kaetemi) + * CStorageChunks + */ +class CStorageChunks +{ +private: + struct CChunk + { + // Size of the chunk header, 6 for 32 bit, 14 for 64 bit + uint8 HeaderSize; + // Where the header starts + sint32 OffsetBegin; + + // Identifier + uint16 Id; + // Size including header size + uint32 Size; + + inline sint32 getSizeWithHeader() const { return (sint32)(Size & 0x7FFFFFFF); } + inline sint32 getSize() const { return getSizeWithHeader() - (sint32)HeaderSize; } + inline bool isContainer() const { return (Size & 0x80000000) == 0x80000000; } + inline sint32 endOfChunk() const { return OffsetBegin + getSizeWithHeader(); } + inline sint32 getDataBegin() const { return OffsetBegin + (sint32)HeaderSize; } + }; + +public: + CStorageChunks(NLMISC::IStream &stream, sint64 size = 0); + virtual ~CStorageChunks(); + + // Returns true if there's another chunk, false if no more chunks in this container or if the current chunk is not a container + bool enterChunk(); + // Reads and skips chunks until the one with given id is found, or writes a chunk with this id + bool enterChunk(uint16 id, bool container); + // Returns the number of skipped bytes in read more, returns chunk size including header in write mode + sint32 leaveChunk(); + + inline bool is64Bit() const { return m_Is64Bit; } + inline void set64Bit(bool enabled = true) { m_Is64Bit = enabled; } + + inline uint16 getChunkId() const { return currentChunk()->Id; } + inline sint32 getChunkSize() const { return currentChunk()->getSize(); } + inline bool isChunkContainer() const { return currentChunk()->isContainer(); } + inline bool endOfChunk() const { return /*m_Chunks.size() == 1 ? eof() :*/ m_Stream.getPos() >= currentChunk()->endOfChunk(); } + + inline NLMISC::IStream &stream() { return m_Stream; } + +private: + inline const CChunk *currentChunk() const { return &m_Chunks[m_Chunks.size() - 1]; } + inline CChunk *currentChunk() { return &m_Chunks[m_Chunks.size() - 1]; } + +private: + NLMISC::IStream &m_Stream; + std::vector m_Chunks; + bool m_Is64Bit; + +}; /* class CStorageChunks */ + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_STORAGE_CHUNKS_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/storage_file.cpp b/code/nel/tools/3d/pipeline_max/storage_file.cpp new file mode 100644 index 000000000..083075424 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/storage_file.cpp @@ -0,0 +1,55 @@ +/** + * \file storage_file.cpp + * \brief CStorageFile + * \date 2012-08-20 13:35GMT + * \author Jan Boon (Kaetemi) + * CStorageFile + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "storage_file.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { + +CStorageFile::CStorageFile() +{ + +} + +CStorageFile::~CStorageFile() +{ + +} + +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/storage_file.h b/code/nel/tools/3d/pipeline_max/storage_file.h new file mode 100644 index 000000000..596016e16 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/storage_file.h @@ -0,0 +1,63 @@ +/** + * \file storage_file.h + * \brief CStorageFile + * \date 2012-08-20 13:35GMT + * \author Jan Boon (Kaetemi) + * CStorageFile + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_STORAGE_FILE_H +#define PIPELINE_STORAGE_FILE_H +#include + +// STL includes + +// NeL includes + +// Project includes + +namespace PIPELINE { + +/** + * \brief CStorageFile + * \date 2012-08-20 13:35GMT + * \author Jan Boon (Kaetemi) + * CStorageFile + */ +class CStorageFile +{ +protected: + // pointers + // ... + + // instances + // ... +public: + CStorageFile(); + virtual ~CStorageFile(); +}; /* class CStorageFile */ + +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_STORAGE_FILE_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/storage_object.cpp b/code/nel/tools/3d/pipeline_max/storage_object.cpp new file mode 100644 index 000000000..c580caab4 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/storage_object.cpp @@ -0,0 +1,386 @@ +/** + * \file storage_object.cpp + * \brief CStorageObject + * \date 2012-08-18 09:02GMT + * \author Jan Boon (Kaetemi) + * CStorageObject + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "storage_object.h" + +// STL includes +#include + +// NeL includes +// #include + +// Project includes +#include "storage_stream.h" +#include "storage_chunks.h" + +// using namespace std; +// using namespace NLMISC; + +// #define NL_DEBUG_STORAGE + +namespace PIPELINE { +namespace MAX { + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +IStorageObject::IStorageObject() +{ + +} + +IStorageObject::~IStorageObject() +{ + +} + +std::string IStorageObject::toString() +{ + std::stringstream ss; + toString(ss); + return ss.str(); +} + +void IStorageObject::setSize(sint32 size) +{ + // ignore +} + +bool IStorageObject::getSize(sint32 &size) const +{ + return false; +} + +bool IStorageObject::isContainer() const +{ + return false; +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CStorageContainer::CStorageContainer() : m_ChunksOwnsPointers(true) +{ + +} + +CStorageContainer::~CStorageContainer() +{ + if (m_ChunksOwnsPointers) + { + for (TStorageObjectContainer::iterator it = m_Chunks.begin(), end = m_Chunks.end(); it != end; ++it) + { + delete it->second; + } + } + m_Chunks.clear(); +} + +std::string CStorageContainer::className() const // why is this not const in IClassable? +{ + return "StorageContainer"; +} + +void CStorageContainer::serial(NLMISC::IStream &stream) +{ + if (stream.isReading()) + { + nlassert(m_ChunksOwnsPointers); + nlassert(m_Chunks.empty()); + } + if (stream.getPos() == 0) + { + CStorageStream *storageStream = dynamic_cast(&stream); + if (storageStream) + { +#ifdef NL_DEBUG_STORAGE + nldebug("Implicitly assume the entire stream is the container"); +#endif + CStorageChunks chunks(stream, stream.isReading() ? storageStream->size() : 0); + serial(chunks); + return; + } + } +#ifdef NL_DEBUG_STORAGE + nldebug("Wrap the container inside a chunk, as the size is not known"); +#endif + { + // Use dummy size value so the system can at least read the header + CStorageChunks chunks(stream, stream.isReading() ? 0xFF : 0); + bool ok = chunks.enterChunk(0x4352, true); + nlassert(ok); + serial(chunks); + chunks.leaveChunk(); + } +} + +void CStorageContainer::serial(NLMISC::IStream &stream, uint size) +{ + CStorageChunks chunks(stream, size); + serial(chunks); + return; +} + +void CStorageContainer::toString(std::ostream &ostream, const std::string &pad) const +{ + // note: only use pad when multi-lining + // like Blah: (Something) "SingleValue" + // Blahblah: (Container) { + // Moo: (Foo) "What" } + // only increase pad when multi-lining sub-items + nlassert(m_ChunksOwnsPointers); + ostream << "(" << className() << ") [" << m_Chunks.size() << "] { "; + std::string padpad = pad + "\t"; + sint i = 0; + for (TStorageObjectContainer::const_iterator it = m_Chunks.begin(), end = m_Chunks.end(); it != end; ++it) + { + std::stringstream ss; + ss << std::hex << std::setfill('0'); + ss << std::setw(4) << it->first; + ostream << "\n" << pad << i << " 0x" << ss.str() << ": "; + it->second->toString(ostream, padpad); + ++i; + } + ostream << "} "; +} + +void CStorageContainer::parse(uint16 version, uint filter) +{ + nlassert(m_ChunksOwnsPointers); // Can only use this when m_Chunks still has ownership. + for (TStorageObjectContainer::const_iterator it = m_Chunks.begin(), end = m_Chunks.end(); it != end; ++it) + { + if (it->second->isContainer()) + { + static_cast(it->second)->parse(version); + } + } +} + +void CStorageContainer::clean() +{ + nlassert(m_ChunksOwnsPointers); // Can only use the default when m_Chunks retains ownership. + for (TStorageObjectContainer::const_iterator it = m_Chunks.begin(), end = m_Chunks.end(); it != end; ++it) + { + if (it->second->isContainer()) + { + static_cast(it->second)->clean(); + } + } +} + +void CStorageContainer::build(uint16 version, uint filter) +{ + for (TStorageObjectContainer::const_iterator it = m_Chunks.begin(), end = m_Chunks.end(); it != end; ++it) + { + if (it->second->isContainer()) + { + static_cast(it->second)->build(version); + } + } +} + +void CStorageContainer::disown() +{ + nlassert(m_ChunksOwnsPointers); // Can only use this when m_Chunks has been given ownership. + for (TStorageObjectContainer::const_iterator it = m_Chunks.begin(), end = m_Chunks.end(); it != end; ++it) + { + if (it->second->isContainer()) + { + static_cast(it->second)->disown(); + } + } +} + +IStorageObject *CStorageContainer::findStorageObject(uint16 id, uint nb) const +{ + uint c = 0; + for (TStorageObjectContainer::const_iterator it = m_Chunks.begin(), end = m_Chunks.end(); it != end; ++it) + { + if (it->first == id) + { + if (c == nb) return it->second; + else ++c; + } + } + return NULL; +} + +IStorageObject *CStorageContainer::findLastStorageObject(uint16 id) const +{ + for (TStorageObjectContainer::const_reverse_iterator it = m_Chunks.rbegin(), end = m_Chunks.rend(); it != end; ++it) + { + if (it->first == id) + return it->second; + } + return NULL; +} + +bool CStorageContainer::isContainer() const +{ + return true; +} + +void CStorageContainer::serial(CStorageChunks &chunks) +{ + if (chunks.stream().isReading()) + { +#ifdef NL_DEBUG_STORAGE + nldebug("Reading container chunk"); +#endif + nlassert(m_ChunksOwnsPointers); + nlassert(m_Chunks.empty()); + while (chunks.enterChunk()) + { + uint16 id = chunks.getChunkId(); + bool cont = chunks.isChunkContainer(); + IStorageObject *storageObject = createChunkById(id, cont); + storageObject->setSize(chunks.getChunkSize()); + if (storageObject->isContainer()) static_cast(storageObject)->serial(chunks); + else storageObject->serial(chunks.stream()); + m_Chunks.push_back(TStorageObjectWithId(id, storageObject)); + if (chunks.leaveChunk()) // bytes were skipped while reading + throw EStorage(); + /*TStorageObjectContainer::iterator soit = m_Chunks.end(); + --soit; + serialized(soit, cont);*/ + } + } + else + { +#ifdef NL_DEBUG_STORAGE + nldebug("Writing container chunk"); +#endif + for (TStorageObjectContainer::iterator it = m_Chunks.begin(), end = m_Chunks.end(); it != end; ++it) + { + chunks.enterChunk(it->first, it->second->isContainer()); + IStorageObject *storageObject = it->second; + if (storageObject->isContainer()) static_cast(storageObject)->serial(chunks); + else storageObject->serial(chunks.stream()); + chunks.leaveChunk(); + } + } +} + +IStorageObject *CStorageContainer::createChunkById(uint16 id, bool container) +{ + if (container) + { + return new CStorageContainer(); + } + else + { + return new CStorageRaw(); + } +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +CStorageRaw::CStorageRaw() +{ + +} + +CStorageRaw::~CStorageRaw() +{ + +} + +std::string CStorageRaw::className() const +{ + return "StorageRaw"; +} + +void CStorageRaw::serial(NLMISC::IStream &stream) +{ + stream.serialBuffer(&Value[0], Value.size()); +} + +void CStorageRaw::toString(std::ostream &ostream, const std::string &pad) const +{ + // note: only use pad when multi-lining + // like Blah: (Something) "SingleValue" + // Blahblah: (Container) { + // Moo: (Foo) "What" } + // only increase pad when multi-lining sub-items + ostream << "(" << className() << ") { "; + ostream << "\n" << pad << "Size: " << Value.size(); + bool isString = true; + ostream << "\n" << pad << "String: "; + for (TType::size_type i = 0; i < Value.size(); ++i) + { + char c = Value[i]; + if (c == 0 || c == 123 || c == 125) ostream << "."; + else if (c >= 32 && c <= 126) ostream << c; + else + { + ostream << "."; + isString = false; + } + } + ostream << " "; + if (!isString || Value.size() <= 4) + { + ostream << "\n" << pad << "Hex: "; + for (TType::size_type i = 0; i < Value.size(); ++i) + { + std::stringstream ss; + ss << std::hex << std::setfill('0') << std::setw(2) << (int)Value[i]; + ostream << ss.str() << " "; + } + } + if (Value.size() == 4) + { + ostream << "\n" << pad << "Int: " << (*(sint32 *)(void *)(&Value[0])) << " "; + ostream << "\n" << pad << "Float: " << (*(float *)(void *)(&Value[0])) << " "; + } + ostream << "} "; +} + +void CStorageRaw::setSize(sint32 size) +{ + Value.resize(size); +} + +bool CStorageRaw::getSize(sint32 &size) const +{ + size = Value.size(); + return true; +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/storage_object.h b/code/nel/tools/3d/pipeline_max/storage_object.h new file mode 100644 index 000000000..e05fb755b --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/storage_object.h @@ -0,0 +1,174 @@ +/** + * \file storage_object.h + * \brief CStorageObject + * \date 2012-08-18 09:02GMT + * \author Jan Boon (Kaetemi) + * CStorageObject + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_STORAGE_OBJECT_H +#define PIPELINE_STORAGE_OBJECT_H +#include + +// STL includes +#include + +// NeL includes +#include + +// Project includes + +namespace PIPELINE { +namespace MAX { + +class CStorageChunks; + +struct EStorage : public NLMISC::Exception +{ + EStorage() : NLMISC::Exception("PIPELINE::MAX::EStorage") { } + EStorage(const char *msg) : NLMISC::Exception(msg) { } + virtual ~EStorage() throw() { } +}; + +struct EStorageParse : public EStorage +{ + EStorageParse() : EStorage("PIPELINE::MAX::EStorageParse") { } + EStorageParse(const char *msg) : EStorage(msg) { } + virtual ~EStorageParse() throw() { } +}; + +enum TParseLevel +{ + PARSE_INTERNAL = 0x00000001, // Directly parse basic class formats + PARSE_BUILTIN = 0x00000002, // Parse all builtin classes + // PARSE_NELDATA = 0x00000004, // Parse all structures related to nel specific data (nel material, node properties, etcetera) + // PARSE_NEL3D = 0x00000008, // Parse classes to initialize their nel3d equivalent classes +}; + +// IStorageObject : exposes serial(CStorageStream &stream) and dump(const std::string &pad) +class IStorageObject : public NLMISC::IStreamable +{ +public: + IStorageObject(); + virtual ~IStorageObject(); + + virtual std::string getClassName() { return className(); } // inherited from NLMISC::IClassable through NLMISC::IStreamable + virtual std::string className() const = 0; // renamed for constness + // virtual void serial(NLMISC::IStream &stream); // inherited from NLMISC::IStreamable + std::string toString(); + virtual void toString(std::ostream &ostream, const std::string &pad = "") const = 0; + +public: // should be protected but that doesn't compile, nice c++! + // Sets size when reading + virtual void setSize(sint32 size); + // Gets the size when writing, return false if unknown + virtual bool getSize(sint32 &size) const; + // Only true when inherting from CStorageContainer + virtual bool isContainer() const; +}; + +// CStorageContainer : serializes a container chunk +class CStorageContainer : public IStorageObject +{ +public: + // public data + typedef std::pair TStorageObjectWithId; + typedef std::list TStorageObjectContainer; + typedef TStorageObjectContainer::iterator TStorageObjectIterator; + typedef TStorageObjectContainer::const_iterator TStorageObjectConstIt; + +protected: + // protected data + TStorageObjectContainer m_Chunks; + bool m_ChunksOwnsPointers; + +public: + CStorageContainer(); + virtual ~CStorageContainer(); + + // inherited + virtual std::string className() const; + virtual void serial(NLMISC::IStream &stream); // only used to wrap a container inside another stream + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + + // utility + void serial(NLMISC::IStream &stream, uint size); // without wrapping, known size + + // virtual + // Parse this class with given version and parse level filter + virtual void parse(uint16 version, uint filter = 0); + // Clean up built data or duplicate unparsed source data, call after serializing build and after parse + virtual void clean(); + // Build the storage structure needed to store the parsed data back + virtual void build(uint16 version, uint filter = 0); + // Give ownership of the chunks back to the m_Chunks, must call build first, call instead of clean, reduces the parse level back to 0 + virtual void disown(); + +public: + // read access + inline const TStorageObjectContainer &chunks() const { return m_Chunks; } + IStorageObject *findStorageObject(uint16 id, uint nb = 0) const; // find storage object with given id, nb count in case there are more + IStorageObject *findLastStorageObject(uint16 id) const; + +public: // should be protected but that doesn't compile, nice c++! + // inherited + virtual bool isContainer() const; + +protected: + // override in subclasses, default to parent if not handled + virtual void serial(CStorageChunks &chunks); + // Create a storage object by id, override to provide custom serialization + virtual IStorageObject *createChunkById(uint16 id, bool container); + +}; + +// CStorageRaw : serializes raw data, use for unknown data +class CStorageRaw : public IStorageObject +{ +public: + // public data + typedef std::vector TType; + TType Value; + +public: + CStorageRaw(); + virtual ~CStorageRaw(); + + // inherited + virtual std::string className() const; + virtual void serial(NLMISC::IStream &stream); + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + +public: // should be protected but that doesn't compile, nice c++! + // Sets size when reading + virtual void setSize(sint32 size); + // Gets the size when writing, return false if unknown + virtual bool getSize(sint32 &size) const; + +}; + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_STORAGE_OBJECT_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/storage_stream.cpp b/code/nel/tools/3d/pipeline_max/storage_stream.cpp new file mode 100644 index 000000000..d9e27153e --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/storage_stream.cpp @@ -0,0 +1,193 @@ +/** + * \file storage_stream.cpp + * \brief CStorageStream + * \date 2012-08-16 22:06GMT + * \author Jan Boon (Kaetemi) + * CStorageStream + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "storage_stream.h" + +// STL includes + +// 3rd Party includes +#include +#include + +// NeL includes +// #include + +// Project includes + +// using namespace std; +// using namespace NLMISC; + +// #define NL_DEBUG_STORAGE + +namespace PIPELINE { +namespace MAX { + +CStorageStream::CStorageStream(GsfInput *input) : NLMISC::IStream(true), m_Input(input), m_Output(NULL) +{ + +} + +CStorageStream::CStorageStream(GsfOutput *output) : NLMISC::IStream(false), m_Input(NULL), m_Output(output) +{ + +} + +CStorageStream::~CStorageStream() +{ + if (m_Output) + { + gsf_output_seek(m_Output, 0, G_SEEK_END); + } +} + +bool CStorageStream::seek(sint32 offset, NLMISC::IStream::TSeekOrigin origin) const +{ + if (m_Input) + { + switch (origin) + { + case begin: + return gsf_input_seek(m_Input, offset, G_SEEK_SET); + case current: + return gsf_input_seek(m_Input, offset, G_SEEK_CUR); + case end: + return gsf_input_seek(m_Input, offset, G_SEEK_END); + } + } + else if (m_Output) + { + switch (origin) + { + case begin: + return gsf_output_seek(m_Output, offset, G_SEEK_SET); + case current: + return gsf_output_seek(m_Output, offset, G_SEEK_CUR); + case end: + return gsf_output_seek(m_Output, offset, G_SEEK_END); + } + } + return NLMISC::IStream::seek(offset, origin); +} + +sint32 CStorageStream::getPos() const +{ + if (m_Input) + { + gsf_off_t res = gsf_input_tell(m_Input); + if (res < 2147483647L) // exception when larger + return (sint32)res; + } + else if (m_Output) + { + gsf_off_t res = gsf_output_tell(m_Output); + if (res < 2147483647L) // exception when larger + return (sint32)res; + } + return NLMISC::IStream::getPos(); +} + +void CStorageStream::serialBuffer(uint8 *buf, uint len) +{ + if (!len) + { +#ifdef NL_DEBUG_STORAGE + nldebug("Serial 0 size buffer"); +#endif + return; + } + if (m_Input) + { + if (!gsf_input_read(m_Input, len, buf)) + { +#ifdef NL_DEBUG_STORAGE + nldebug("Cannot read from input, throw exception"); +#endif + throw NLMISC::EStream(); + } + } + else if (m_Output) + { + if (!gsf_output_write(m_Output, len, buf)) + { + nlwarning("Cannot write %i bytes to output at pos %i, throw exception", len, getPos()); + throw NLMISC::EStream(); + } + } + else + { +#ifdef NL_DEBUG_STORAGE + nldebug("No input or output, should not happen, throw exception"); +#endif + throw NLMISC::EStream(); + } +} + +void CStorageStream::serialBit(bool &bit) +{ + uint8 var = (uint8)bit; + serial(var); + bit = (bool)var; +} + +bool CStorageStream::eof() +{ + if (m_Input) + { + return gsf_input_eof(m_Input); + } + else + { +#ifdef NL_DEBUG_STORAGE + nldebug("No input, this function cannot output, throw exception"); +#endif + throw NLMISC::EStream(); + } +} + +sint32 CStorageStream::size() +{ + if (m_Input) + { + gsf_off_t res = gsf_input_size(m_Input); + if (res < 2147483647L) // exception when larger + return (sint32)res; + } + else + { +#ifdef NL_DEBUG_STORAGE + nldebug("No input, this function cannot output, throw exception"); +#endif + throw NLMISC::EStream(); + } + throw NLMISC::EStream(); +} + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/storage_stream.h b/code/nel/tools/3d/pipeline_max/storage_stream.h new file mode 100644 index 000000000..e50a611d0 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/storage_stream.h @@ -0,0 +1,84 @@ +/** + * \file storage_stream.h + * \brief CStorageStream + * \date 2012-08-16 22:06GMT + * \author Jan Boon (Kaetemi) + * CStorageStream + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_STORAGE_STREAM_H +#define PIPELINE_STORAGE_STREAM_H +#include + +// STL includes +#include + +// 3rd Party includes +#include +#include + +// NeL includes +#include + +// Project includes + +namespace PIPELINE { +namespace MAX { + +/** + * \brief CStorageStream + * \date 2012-08-16 22:06GMT + * \author Jan Boon (Kaetemi) + * CStorageStream + */ +class CStorageStream : public NLMISC::IStream +{ +public: + CStorageStream(GsfInput *input); + CStorageStream(GsfOutput *output); + virtual ~CStorageStream(); + + virtual bool seek(sint32 offset, TSeekOrigin origin) const; + virtual sint32 getPos() const; + // virtual std::string getStreamName() const; // char const * gsf_input_name (GsfInput *input); + virtual void serialBuffer(uint8 *buf, uint len); + virtual void serialBit(bool &bit); + + sint32 size(); + bool eof(); + +private: + GsfInput *m_Input; + GsfOutput *m_Output; + +/* there exist compressed max files, so maybe we will need this at some point +GsfInput * gsf_input_uncompress (GsfInput *src); +*/ + +}; /* class CStorageStream */ + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_STORAGE_STREAM_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/storage_value.cpp b/code/nel/tools/3d/pipeline_max/storage_value.cpp new file mode 100644 index 000000000..3927be681 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/storage_value.cpp @@ -0,0 +1,89 @@ +/** + * \file storage_value.cpp + * \brief CStorageValue + * \date 2012-08-18 15:00GMT + * \author Jan Boon (Kaetemi) + * CStorageValue + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "storage_value.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { + +template <> +void CStorageValue::serial(NLMISC::IStream &stream) +{ + stream.serialBuffer(static_cast(static_cast(&Value[0])), Value.size()); +} + +template <> +void CStorageValue::serial(NLMISC::IStream &stream) +{ + stream.serialBuffer(static_cast(static_cast(&Value[0])), Value.size() * 2); +} + +template <> +void CStorageValue::toString(std::ostream &ostream, const std::string &pad) const +{ + ostream << "(" << className() << ") { " << Value.toUtf8() << " } "; +} + +template <> +void CStorageValue::setSize(sint32 size) +{ + Value.resize(size); +} + +template <> +void CStorageValue::setSize(sint32 size) +{ + Value.resize(size / 2); +} + +template <> +bool CStorageValue::getSize(sint32 &size) const +{ + return Value.size(); +} + +template <> +bool CStorageValue::getSize(sint32 &size) const +{ + return Value.size() * 2; +} + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/storage_value.h b/code/nel/tools/3d/pipeline_max/storage_value.h new file mode 100644 index 000000000..cce8c4bce --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/storage_value.h @@ -0,0 +1,124 @@ +/** + * \file storage_value.h + * \brief CStorageValue + * \date 2012-08-18 15:00GMT + * \author Jan Boon (Kaetemi) + * CStorageValue + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_STORAGE_VALUE_H +#define PIPELINE_STORAGE_VALUE_H +#include + +// STL includes + +// NeL includes +#include +#include + +// Project includes +#include "storage_object.h" + +namespace PIPELINE { +namespace MAX { + +template +class CStorageValue : public IStorageObject +{ +public: + // public data + typedef T TType; + TType Value; + + // inherited + virtual std::string className() const; + virtual void serial(NLMISC::IStream &stream); + virtual void toString(std::ostream &ostream, const std::string &pad = "") const; + +public: // should be protected but that doesn't compile, nice c++! + // Sets size when reading + virtual void setSize(sint32 size); + // Gets the size when writing, return false if unknown + virtual bool getSize(sint32 &size) const; +}; + +template +std::string CStorageValue::className() const +{ + return "CStorageValue"; +} + +template +void CStorageValue::serial(NLMISC::IStream &stream) +{ + stream.serial(Value); +} + +template <> +void CStorageValue::serial(NLMISC::IStream &stream); + +template <> +void CStorageValue::serial(NLMISC::IStream &stream); + +template +void CStorageValue::toString(std::ostream &ostream, const std::string &pad) const +{ + std::string s = NLMISC::toString(Value); + ostream << "(" << className() << ") { " << s << " } "; +} + +template <> +void CStorageValue::toString(std::ostream &ostream, const std::string &pad) const; + +template +void CStorageValue::setSize(sint32 size) +{ + if (size != sizeof(Value)) + nlerror("Size does not match value type"); + IStorageObject::setSize(size); +} + +template <> +void CStorageValue::setSize(sint32 size); + +template <> +void CStorageValue::setSize(sint32 size); + +template +bool CStorageValue::getSize(sint32 &size) const +{ + size = sizeof(Value); + return true; +} + +template <> +bool CStorageValue::getSize(sint32 &size) const; + +template <> +bool CStorageValue::getSize(sint32 &size) const; + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_STORAGE_VALUE_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/super_class_desc.cpp b/code/nel/tools/3d/pipeline_max/super_class_desc.cpp new file mode 100644 index 000000000..934a04eea --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/super_class_desc.cpp @@ -0,0 +1,49 @@ +/** + * \file super_class_desc.cpp + * \brief CSuperClassDesc + * \date 2012-08-22 11:19GMT + * \author Jan Boon (Kaetemi) + * CSuperClassDesc + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "super_class_desc.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +// using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { + +void nyannyannyan() { } + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/super_class_desc.h b/code/nel/tools/3d/pipeline_max/super_class_desc.h new file mode 100644 index 000000000..f4df5e857 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/super_class_desc.h @@ -0,0 +1,107 @@ +/** + * \file super_class_desc.h + * \brief CSuperClassDesc + * \date 2012-08-22 11:19GMT + * \author Jan Boon (Kaetemi) + * CSuperClassDesc + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_SUPER_CLASS_DESC_H +#define PIPELINE_SUPER_CLASS_DESC_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "scene_class_unknown.h" + +namespace PIPELINE { +namespace MAX { + +/** + * \brief ISuperClassDesc + * \date 2012-08-22 09:42GMT + * \author Jan Boon (Kaetemi) + * ISuperClassDesc + */ +class ISuperClassDesc +{ +public: + /// Create an unknown class that inherits from this superclass + virtual CSceneClass *createUnknown(CScene *scene, const NLMISC::CClassId classId, const ucstring &displayName, const ucstring &dllFilename, const ucstring &dllDescription) const = 0; + /// Get an internal name associated with unknown classes of this superclass + virtual const char *internalNameUnknown() const = 0; + /// Gets the associated super class id, may be different from classDesc()->superClassId() for non-implemented superclasses + virtual TSClassId superClassId() const = 0; + /// Return the class description that directly implements this superclass + virtual const ISceneClassDesc *classDesc() const = 0; + +}; /* class ISceneClassDesc */ + +/** + * \brief CSuperClassDesc + * \date 2012-08-22 09:42GMT + * \author Jan Boon (Kaetemi) + * ISuperClassDesc + */ +template +class CSuperClassDesc : public ISuperClassDesc +{ +public: + CSuperClassDesc(const ISceneClassDesc *classDesc) : m_ClassDesc(classDesc) { } + virtual CSceneClass *createUnknown(CScene *scene, const NLMISC::CClassId classId, const ucstring &displayName, const ucstring &dllFilename, const ucstring &dllDescription) const { return static_cast(new CSceneClassUnknown(scene, classId, m_ClassDesc->superClassId(), displayName,internalNameUnknown(), dllFilename, dllDescription)); } + virtual const char *internalNameUnknown() const { return T::InternalNameUnknown; } + virtual TSClassId superClassId() const { return m_ClassDesc->superClassId(); } + virtual const ISceneClassDesc *classDesc() const { return m_ClassDesc; } +private: + const ISceneClassDesc *m_ClassDesc; +}; /* class ISceneClassDesc */ + +/** + * \brief CSuperClassDescUnknown + * \date 2012-08-22 09:42GMT + * \author Jan Boon (Kaetemi) + * Template for non-implemented superclass descriptions + */ +template +class CSuperClassDescUnknown : public ISuperClassDesc +{ +public: + CSuperClassDescUnknown(const ISceneClassDesc *classDesc, const char *internalNameUnknown) : m_ClassDesc(classDesc), m_InternalNameUnknown(internalNameUnknown) { } + virtual CSceneClass *createUnknown(CScene *scene, const NLMISC::CClassId classId, const ucstring &displayName, const ucstring &dllFilename, const ucstring &dllDescription) const { return static_cast(new CSceneClassUnknown(scene, classId, SuperClassId, displayName,internalNameUnknown(), dllFilename, dllDescription)); } + virtual const char *internalNameUnknown() const { return m_InternalNameUnknown; } + virtual TSClassId superClassId() const { return SuperClassId; } + virtual const ISceneClassDesc *classDesc() const { return m_ClassDesc; } +private: + const ISceneClassDesc *m_ClassDesc; + const char *m_InternalNameUnknown; + +}; /* class ISceneClassDesc */ + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_SUPER_CLASS_DESC_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/typedefs.cpp b/code/nel/tools/3d/pipeline_max/typedefs.cpp new file mode 100644 index 000000000..175eb4e57 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/typedefs.cpp @@ -0,0 +1,49 @@ +/** + * \file typedefs.cpp + * \brief CTypeDefs + * \date 2012-08-21 12:14GMT + * \author Jan Boon (Kaetemi) + * CTypeDefs + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "typedefs.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { + +void blahblahblah_typedefs() { } + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/typedefs.h b/code/nel/tools/3d/pipeline_max/typedefs.h new file mode 100644 index 000000000..d88a7d8c1 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/typedefs.h @@ -0,0 +1,61 @@ +/** + * \file typedefs.h + * \brief CTypeDefs + * \date 2012-08-21 12:14GMT + * \author Jan Boon (Kaetemi) + * CTypeDefs + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_TYPEDEFS_H +#define PIPELINE_TYPEDEFS_H +#include + +// STL includes + +// NeL includes + +// Project includes + +namespace PIPELINE { +namespace MAX { + +// Don't really care about superclass IDs right now, but we have to. +typedef uint32 TSClassId; + +// Application versions +const uint16 VersionUnknown = 0x0000; +const uint16 Version3 = 0x2004; +const uint16 Version4 = 0x2006; +const uint16 Version5 = 0x2008; +const uint16 Version6 = 0x2009; +const uint16 Version7 = 0x200A; +const uint16 Version8 = 0x200B; +const uint16 Version9 = 0x200E; +const uint16 Version2008 = 0x200F; +const uint16 Version2010 = 0x2012; + +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_TYPEDEFS_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/update1/editable_mesh.cpp b/code/nel/tools/3d/pipeline_max/update1/editable_mesh.cpp new file mode 100644 index 000000000..303cf9123 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/update1/editable_mesh.cpp @@ -0,0 +1,196 @@ +/** + * \file editable_mesh.cpp + * \brief CEditableMesh + * \date 2012-08-26 12:11GMT + * \author Jan Boon (Kaetemi) + * CEditableMesh + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "editable_mesh.h" + +// STL includes +#include + +// NeL includes +// #include + +// Project includes +#include "update1.h" + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace UPDATE1 { + +CEditableMesh::CEditableMesh(CScene *scene) : CTriObject(scene) +{ + +} + +CEditableMesh::~CEditableMesh() +{ + if (!m_ChunksOwnsPointers) + { + for (TStorageObjectContainer::iterator it = m_EditableMeshUnknown.begin(), end = m_EditableMeshUnknown.end(); it != end; ++it) + delete it->second; + m_EditableMeshUnknown.clear(); + } +} + +const ucstring CEditableMesh::DisplayName = ucstring("EditableMesh"); +const char *CEditableMesh::InternalName = "EditableMesh"; +const NLMISC::CClassId CEditableMesh::ClassId = NLMISC::CClassId(0xe44f10b3, 0x00000000); +const TSClassId CEditableMesh::SuperClassId = CTriObject::SuperClassId; +const CEditableMeshClassDesc EditableMeshClassDesc(&DllPluginDescUpdate1); + +void CEditableMesh::parse(uint16 version, uint filter) +{ + CTriObject::parse(version); + + IStorageObject *so; + so = getChunk(0x3001); + if (so) + { + m_EditableMeshUnknown.push_back(TStorageObjectWithId(0x3001, so)); + for (; ; ) + { + if (peekChunk() == 0x2845) + { + so = getChunk(0x2845); + m_EditableMeshUnknown.push_back(TStorageObjectWithId(0x2845, so)); + } + else if (peekChunk() == 0x2846) + { + so = getChunk(0x2846); + m_EditableMeshUnknown.push_back(TStorageObjectWithId(0x2846, so)); + } + else if (peekChunk() == 0x2847) + { + so = getChunk(0x2847); + m_EditableMeshUnknown.push_back(TStorageObjectWithId(0x2847, so)); + } + else break; + } + } + for (; ; ) + { + so = getChunk(0x3003); + if (so) m_EditableMeshUnknown.push_back(TStorageObjectWithId(0x3003, so)); + else break; + so = getChunk(0x3004); + if (so) m_EditableMeshUnknown.push_back(TStorageObjectWithId(0x3004, so)); + } + so = getChunk(0x3002); + if (so) m_EditableMeshUnknown.push_back(TStorageObjectWithId(0x3002, so)); + so = getChunk(0x4020); + if (so) m_EditableMeshUnknown.push_back(TStorageObjectWithId(0x4020, so)); + so = getChunk(0x4024); + if (so) m_EditableMeshUnknown.push_back(TStorageObjectWithId(0x4024, so)); + so = getChunk(0x4025); + if (so) m_EditableMeshUnknown.push_back(TStorageObjectWithId(0x4025, so)); + so = getChunk(0x4026); + if (so) m_EditableMeshUnknown.push_back(TStorageObjectWithId(0x4026, so)); + so = getChunk(0x402c); + if (so) m_EditableMeshUnknown.push_back(TStorageObjectWithId(0x402c, so)); + so = getChunk(0x402d); + if (so) m_EditableMeshUnknown.push_back(TStorageObjectWithId(0x402d, so)); + so = getChunk(0x4030); + if (so) m_EditableMeshUnknown.push_back(TStorageObjectWithId(0x4030, so)); + so = getChunk(0x4034); + if (so) m_EditableMeshUnknown.push_back(TStorageObjectWithId(0x4034, so)); + so = getChunk(0x4038); + if (so) m_EditableMeshUnknown.push_back(TStorageObjectWithId(0x4038, so)); + so = getChunk(0x403b); + if (so) m_EditableMeshUnknown.push_back(TStorageObjectWithId(0x403b, so)); + + CTriObject::parse(version, PMB_TRI_OBJECT_PARSE_FILTER); +} + +void CEditableMesh::clean() +{ + CTriObject::clean(); +} + +void CEditableMesh::build(uint16 version, uint filter) +{ + CTriObject::build(version); + + for (TStorageObjectContainer::iterator it = m_EditableMeshUnknown.begin(), end = m_EditableMeshUnknown.end(); it != end; ++it) + putChunk(it->first, it->second); + + CTriObject::build(version, PMB_TRI_OBJECT_PARSE_FILTER); +} + +void CEditableMesh::disown() +{ + m_EditableMeshUnknown.clear(); + CTriObject::disown(); +} + +void CEditableMesh::init() +{ + CTriObject::init(); +} + +bool CEditableMesh::inherits(const NLMISC::CClassId classId) const +{ + if (classId == classDesc()->classId()) return true; + return CTriObject::inherits(classId); +} + +const ISceneClassDesc *CEditableMesh::classDesc() const +{ + return &EditableMeshClassDesc; +} + +void CEditableMesh::toStringLocal(std::ostream &ostream, const std::string &pad, uint filter) const +{ + CTriObject::toStringLocal(ostream, pad); + + std::string padpad = pad + "\t"; + sint i = 0; + for (TStorageObjectContainer::const_iterator it = m_EditableMeshUnknown.begin(), end = m_EditableMeshUnknown.end(); it != end; ++it) + { + std::stringstream ss; + ss << std::hex << std::setfill('0'); + ss << std::setw(4) << it->first; + ostream << "\n" << pad << "EditableMeshUnkown[" << i << "] 0x" << ss.str() << ": "; + it->second->toString(ostream, padpad); + ++i; + } + + CTriObject::toStringLocal(ostream, pad, PMB_TRI_OBJECT_PARSE_FILTER); +} + +IStorageObject *CEditableMesh::createChunkById(uint16 id, bool container) +{ + return CTriObject::createChunkById(id, container); +} + +} /* namespace UPDATE1 */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/update1/editable_mesh.h b/code/nel/tools/3d/pipeline_max/update1/editable_mesh.h new file mode 100644 index 000000000..9af1e4660 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/update1/editable_mesh.h @@ -0,0 +1,89 @@ +/** + * \file editable_mesh.h + * \brief CEditableMesh + * \date 2012-08-26 12:11GMT + * \author Jan Boon (Kaetemi) + * CEditableMesh + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_EDITABLE_MESH_H +#define PIPELINE_EDITABLE_MESH_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "../builtin/tri_object.h" + +namespace PIPELINE { +namespace MAX { +namespace UPDATE1 { + +/** + * \brief CEditableMesh + * \date 2012-08-26 12:11GMT + * \author Jan Boon (Kaetemi) + * CEditableMesh + */ +class CEditableMesh : public PIPELINE::MAX::BUILTIN::CTriObject +{ +public: + CEditableMesh(CScene *scene); + virtual ~CEditableMesh(); + + // class desc + static const ucstring DisplayName; + static const char *InternalName; + static const NLMISC::CClassId ClassId; + static const TSClassId SuperClassId; + + // inherited + virtual void parse(uint16 version, uint filter = 0); + virtual void clean(); + virtual void build(uint16 version, uint filter = 0); + virtual void disown(); + virtual void init(); + virtual bool inherits(const NLMISC::CClassId classId) const; + virtual const ISceneClassDesc *classDesc() const; + virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "", uint filter = 0) const; + +protected: + // inherited + virtual IStorageObject *createChunkById(uint16 id, bool container); + +private: + TStorageObjectContainer m_EditableMeshUnknown; + +}; /* class CEditableMesh */ + +typedef CSceneClassDesc CEditableMeshClassDesc; +extern const CEditableMeshClassDesc EditableMeshClassDesc; + +} /* namespace UPDATE1 */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_EDITABLE_MESH_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/update1/update1.cpp b/code/nel/tools/3d/pipeline_max/update1/update1.cpp new file mode 100644 index 000000000..d4c923e9d --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/update1/update1.cpp @@ -0,0 +1,81 @@ +/** + * \file update1.cpp + * \brief CUpdate1 + * \date 2012-08-26 12:11GMT + * \author Jan Boon (Kaetemi) + * CUpdate1 + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "update1.h" + +// STL includes + +// NeL includes +// #include + +// Project includes +#include "../scene_class_registry.h" + +#include "editable_mesh.h" + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { +namespace MAX { +namespace UPDATE1 { + +CUpdate1::CUpdate1() +{ + +} + +CUpdate1::~CUpdate1() +{ + +} + +void CUpdate1::registerClasses(CSceneClassRegistry *registry) +{ + registry->add(&EditableMeshClassDesc); +} + +const ucchar *CDllPluginDescUpdate1::displayName() const +{ + static const ucstring value = ucstring("Editable Mesh Object (Ryzom Core)"); + return value.c_str(); +} + +const ucchar *CDllPluginDescUpdate1::internalName() const +{ + static const ucstring value = ucstring("update1.dlo"); + return value.c_str(); +} + +const CDllPluginDescUpdate1 DllPluginDescUpdate1; + +} /* namespace UPDATE1 */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/update1/update1.h b/code/nel/tools/3d/pipeline_max/update1/update1.h new file mode 100644 index 000000000..a3727e982 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/update1/update1.h @@ -0,0 +1,84 @@ +/** + * \file update1.h + * \brief CUpdate1 + * \date 2012-08-26 12:11GMT + * \author Jan Boon (Kaetemi) + * CUpdate1 + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_UPDATE1_H +#define PIPELINE_UPDATE1_H +#include + +// STL includes + +// NeL includes + +// Project includes +#include "../dll_plugin_desc.h" + +namespace PIPELINE { +namespace MAX { + +class CSceneClassRegistry; + +namespace UPDATE1 { + +/** + * \brief CUpdate1 + * \date 2012-08-26 12:11GMT + * \author Jan Boon (Kaetemi) + * CUpdate1 + */ +class CUpdate1 +{ +public: + static void registerClasses(CSceneClassRegistry *registry); + +public: + CUpdate1(); + virtual ~CUpdate1(); + +}; /* class CUpdate1 */ + +/** + * \brief CDllPluginDescUpdate1 + * \date 2012-08-26 12:03GMT + * \author Jan Boon (Kaetemi) + * CDllPluginDescUpdate1 + */ +class CDllPluginDescUpdate1 : public IDllPluginDescInternal +{ +public: + virtual const ucchar *displayName() const; + virtual const ucchar *internalName() const; +}; /* class CDllPluginDescScript */ + +extern const CDllPluginDescUpdate1 DllPluginDescUpdate1; + +} /* namespace UPDATE1 */ +} /* namespace MAX */ +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_UPDATE1_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/wsm_derived_object.cpp b/code/nel/tools/3d/pipeline_max/wsm_derived_object.cpp new file mode 100644 index 000000000..864d3a4f4 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/wsm_derived_object.cpp @@ -0,0 +1,55 @@ +/** + * \file wsm_derived_object.cpp + * \brief CWSMDerivedObject + * \date 2012-08-26 12:05GMT + * \author Jan Boon (Kaetemi) + * CWSMDerivedObject + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include "wsm_derived_object.h" + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace PIPELINE { + +CWSMDerivedObject::CWSMDerivedObject() +{ + +} + +CWSMDerivedObject::~CWSMDerivedObject() +{ + +} + +} /* namespace PIPELINE */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max/wsm_derived_object.h b/code/nel/tools/3d/pipeline_max/wsm_derived_object.h new file mode 100644 index 000000000..fe0984733 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max/wsm_derived_object.h @@ -0,0 +1,63 @@ +/** + * \file wsm_derived_object.h + * \brief CWSMDerivedObject + * \date 2012-08-26 12:05GMT + * \author Jan Boon (Kaetemi) + * CWSMDerivedObject + */ + +/* + * Copyright (C) 2012 by authors + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#ifndef PIPELINE_WSM_DERIVED_OBJECT_H +#define PIPELINE_WSM_DERIVED_OBJECT_H +#include + +// STL includes + +// NeL includes + +// Project includes + +namespace PIPELINE { + +/** + * \brief CWSMDerivedObject + * \date 2012-08-26 12:05GMT + * \author Jan Boon (Kaetemi) + * CWSMDerivedObject + */ +class CWSMDerivedObject +{ +protected: + // pointers + // ... + + // instances + // ... +public: + CWSMDerivedObject(); + virtual ~CWSMDerivedObject(); +}; /* class CWSMDerivedObject */ + +} /* namespace PIPELINE */ + +#endif /* #ifndef PIPELINE_WSM_DERIVED_OBJECT_H */ + +/* end of file */ diff --git a/code/nel/tools/3d/pipeline_max_dump/CMakeLists.txt b/code/nel/tools/3d/pipeline_max_dump/CMakeLists.txt new file mode 100644 index 000000000..d079d9000 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max_dump/CMakeLists.txt @@ -0,0 +1,36 @@ + +FIND_PACKAGE(LIBGSF) + +IF (NOT (LIBGSF_INCLUDE_DIR AND LIBGSF_LIBRARIES)) + MESSAGE(FATAL_ERROR "LIBGSF not found!") +ENDIF (NOT (LIBGSF_INCLUDE_DIR AND LIBGSF_LIBRARIES)) + +FIND_PACKAGE(GLIB2) + +if (NOT GLIB2_FOUND) + MESSAGE(FATAL_ERROR "GLIB2 not found!") +ENDIF (NOT GLIB2_FOUND) + +INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS}) +INCLUDE_DIRECTORIES(${LIBGSF_INCLUDE_DIR}) + +FILE(GLOB SRCS *.cpp) +FILE(GLOB HDRS *.h) + +ADD_EXECUTABLE(pipeline_max_dump + ${SRCS} + ${HDRS} + ) + +TARGET_LINK_LIBRARIES(pipeline_max_dump + ${LIBGSF_LIBRARIES} + ${GLIB2_LIBRARIES} + pipeline_max + nelmisc +) + +NL_DEFAULT_PROPS(pipeline_max_dump "NeL, Tools, 3D: Pipeline Max Dump (Temporary Tool)") +NL_ADD_RUNTIME_FLAGS(pipeline_max_dump) + +INSTALL(TARGETS pipeline_max_dump RUNTIME DESTINATION bin COMPONENT toolsmisc) + diff --git a/code/nel/tools/3d/pipeline_max_dump/class_directory_3_2010.c b/code/nel/tools/3d/pipeline_max_dump/class_directory_3_2010.c new file mode 100644 index 000000000..e1bb93e8d --- /dev/null +++ b/code/nel/tools/3d/pipeline_max_dump/class_directory_3_2010.c @@ -0,0 +1,352 @@ +Pipeline Max Dump (Temporary Tool) +/home/kaetemi/source/minimax/GE_Acc_MikotoBaniere.max +ClassDirectory3 +(ClassDirectory3) [57] { +0 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00000082) + SuperClassID: 130 } + 1 0x2042: (CStorageValue) { ParamBlock2 } } +1 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 0 + ClassID: (0x30420c1e, 0x5a06293c) + SuperClassID: 4448 } + 1 0x2042: (CStorageValue) { ViewportManager } } +2 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 1 + ClassID: (0x25dc8980, 0x218ab459) + SuperClassID: 4448 } + 1 0x2042: (CStorageValue) { mental ray: material custom attribute } } +3 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 2 + ClassID: (0x23b708db, 0x5ddb3626) + SuperClassID: 256 } + 1 0x2042: (CStorageValue) { CustAttribContainer } } +4 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 3 + ClassID: (0x00000000, 0x00001200) + SuperClassID: 4224 } + 1 0x2042: (CStorageValue) { Texmaps } } +5 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 3 + ClassID: (0x00000000, 0x00000038) + SuperClassID: 4272 } + 1 0x2042: (CStorageValue) { Blinn } } +6 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00000008) + SuperClassID: 8 } + 1 0x2042: (CStorageValue) { ParamBlock } } +7 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 4 + ClassID: (0x00000000, 0x25773211) + SuperClassID: 4368 } + 1 0x2042: (CStorageValue) { Max 2.5 Star } } +8 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 3 + ClassID: (0x00000000, 0x00000002) + SuperClassID: 3072 } + 1 0x2042: (CStorageValue) { Standard } } +9 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00002007) + SuperClassID: 36867 } + 1 0x2042: (CStorageValue) { Bezier Float } } +10 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 5 + ClassID: (0x00000000, 0x00000100) + SuperClassID: 3104 } + 1 0x2042: (CStorageValue) { Placement } } +11 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 5 + ClassID: (0x00000000, 0x00000100) + SuperClassID: 3136 } + 1 0x2042: (CStorageValue) { Output } } +12 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 3 + ClassID: (0x00000000, 0x00000240) + SuperClassID: 3088 } + 1 0x2042: (CStorageValue) { Bitmap } } +13 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -2 + ClassID: (0x222b9eb9, 0x64c75fec) + SuperClassID: 3072 } + 1 0x2042: (CStorageValue) { NeL Material } } +14 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00000c80) + SuperClassID: 256 } + 1 0x2042: (CStorageValue) { Material Editor } } +15 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00003333) + SuperClassID: 256 } + 1 0x2042: (CStorageValue) { MtlBaseLib } } +16 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 6 + ClassID: (0x5b918e4e, 0x476fa9de) + SuperClassID: 3328 } + 1 0x2042: (CStorageValue) { WaveMaster } } +17 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 6 + ClassID: (0x5b918e4a, 0x476fa9de) + SuperClassID: 3328 } + 1 0x2042: (CStorageValue) { ProSound } } +18 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00000002) + SuperClassID: 1 } + 1 0x2042: (CStorageValue) { RootNode } } +19 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00002008) + SuperClassID: 36875 } + 1 0x2042: (CStorageValue) { Bezier Position } } +20 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00442313) + SuperClassID: 36876 } + 1 0x2042: (CStorageValue) { TCB Rotation } } +21 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00002010) + SuperClassID: 36877 } + 1 0x2042: (CStorageValue) { Bezier Scale } } +22 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00002005) + SuperClassID: 36872 } + 1 0x2042: (CStorageValue) { Position/Rotation/Scale } } +23 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x0d9c20ff) + SuperClassID: 36880 } + 1 0x2042: (CStorageValue) { Master Point Controller } } +24 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 7 + ClassID: (0x192f6098, 0x1bf8338d) + SuperClassID: 16 } + 1 0x2042: (CStorageValue) { Editable Poly } } +25 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x1dba1df0, 0x7e9858fe) + SuperClassID: 4336 } + 1 0x2042: (CStorageValue) { Base Layer } } +26 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00000001) + SuperClassID: 1 } + 1 0x2042: (CStorageValue) { Node } } +27 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 8 + ClassID: (0x00000000, 0x77912301) + SuperClassID: 4256 } + 1 0x2042: (CStorageValue) { Area } } +28 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 9 + ClassID: (0x00000000, 0x00000001) + SuperClassID: 3840 } + 1 0x2042: (CStorageValue) { Default Scanline Renderer } } +29 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x06546546, 0x46576167) + SuperClassID: 512 } + 1 0x2042: (CStorageValue) { RenderElementMgr } } +30 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00002011) + SuperClassID: 36869 } + 1 0x2042: (CStorageValue) { Bezier Color } } +31 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0xee448b23) + SuperClassID: 4112 } + 1 0x2042: (CStorageValue) { RenderEnvironment } } +32 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00008d52) + SuperClassID: 256 } + 1 0x2042: (CStorageValue) { NamedSelSetList } } +33 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x90f2ee71, 0x8d73b8aa) + SuperClassID: 512 } + 1 0x2042: (CStorageValue) { TVNode } } +34 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 10 + ClassID: (0x00000000, 0x4b4b1000) + SuperClassID: 36867 } + 1 0x2042: (CStorageValue) { Float List } } +35 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 10 + ClassID: (0x00000000, 0x4b4b1001) + SuperClassID: 36869 } + 1 0x2042: (CStorageValue) { Point3 List } } +36 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 10 + ClassID: (0x00000000, 0x4b4b1005) + SuperClassID: 36882 } + 1 0x2042: (CStorageValue) { Point4 List } } +37 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 10 + ClassID: (0x00000000, 0x4b4b1002) + SuperClassID: 36875 } + 1 0x2042: (CStorageValue) { Position List } } +38 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 10 + ClassID: (0x00000000, 0x4b4b1003) + SuperClassID: 36876 } + 1 0x2042: (CStorageValue) { Rotation List } } +39 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 10 + ClassID: (0x00000000, 0x4b4b1004) + SuperClassID: 36877 } + 1 0x2042: (CStorageValue) { Scale List } } +40 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 10 + ClassID: (0x00000000, 0x4b4b1015) + SuperClassID: 36881 } + 1 0x2042: (CStorageValue) { Block Control } } +41 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 11 + ClassID: (0x11793bed, 0x1f8c3646) + SuperClassID: 36867 } + 1 0x2042: (CStorageValue) { Block Manager Wrapper } } +42 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 12 + ClassID: (0x7620792b, 0x5a1b661e) + SuperClassID: 36867 } + 1 0x2042: (CStorageValue) { Propagation Manager Wrapper } } +43 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 13 + ClassID: (0xf4044794, 0x368d1139) + SuperClassID: 36867 } + 1 0x2042: (CStorageValue) { Scene Effect Loader } } +44 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 14 + ClassID: (0x087906d7, 0x294a389c) + SuperClassID: 256 } + 1 0x2042: (CStorageValue) { Reaction Manager } } +45 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 15 + ClassID: (0x265a2326, 0x28250b30) + SuperClassID: 4448 } + 1 0x2042: (CStorageValue) { ParameterCollectorCA } } +46 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 16 + ClassID: (0x01513165, 0x4a0c66e1) + SuperClassID: 2912 } + 1 0x2042: (CStorageValue) { } } +47 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x2c1a0a7b, 0x0c6f6387) + SuperClassID: 36879 } + 1 0x2042: (CStorageValue) { SceneAppData Latch } } +48 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 17 + ClassID: (0x68c22d6f, 0x5bf94f11) + SuperClassID: 2912 } + 1 0x2042: (CStorageValue) { BitmapPagerData } } +49 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 10 + ClassID: (0x781f1430, 0x0f4871a5) + SuperClassID: 36879 } + 1 0x2042: (CStorageValue) { MasterLayerControlManager } } +50 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 18 + ClassID: (0x30935afc, 0x57a52b8c) + SuperClassID: 36879 } + 1 0x2042: (CStorageValue) { Max Mixer Clip } } +51 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00000001) + SuperClassID: 4294966784 } + 1 0x2042: (CStorageValue) { Grid Reference } } +52 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x17356912) + SuperClassID: 4240 } + 1 0x2042: (CStorageValue) { RenderEffects } } +53 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: 9 + ClassID: (0x00000000, 0x00000100) + SuperClassID: 4304 } + 1 0x2042: (CStorageValue) { Shadow Map } } +54 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x51ff028e, 0x0d7374fc) + SuperClassID: 512 } + 1 0x2042: (CStorageValue) { Layer Manager } } +55 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x2cf03595) + SuperClassID: 256 } + 1 0x2042: (CStorageValue) { TrackSetList } } +56 0x2040: (ClassEntry) [2] { + 0 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00002222) + SuperClassID: 256 } + 1 0x2042: (CStorageValue) { Scene } } } + + +------------------ +(program exited with code: 0) +Press return to continue + diff --git a/code/nel/tools/3d/pipeline_max_dump/class_directory_3_3.c b/code/nel/tools/3d/pipeline_max_dump/class_directory_3_3.c new file mode 100644 index 000000000..65907682d --- /dev/null +++ b/code/nel/tools/3d/pipeline_max_dump/class_directory_3_3.c @@ -0,0 +1,346 @@ +Pipeline Max Dump (Temporary Tool) +/srv/work/database/interfaces/anims_max/cp_fy_hof_species.max +ClassDirectory3 +(ClassDirectory3) { +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00002007) + SuperClassID: 36867 } + 0x2042: (CStorageValue) { Bezier Float } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00000008) + SuperClassID: 8 } + 0x2042: (CStorageValue) { ParamBlock } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 0 + ClassID: (0x00000000, 0x00000100) + SuperClassID: 3104 } + 0x2042: (CStorageValue) { Placement } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00000082) + SuperClassID: 130 } + 0x2042: (CStorageValue) { ParamBlock2 } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 0 + ClassID: (0x00000000, 0x00000100) + SuperClassID: 3136 } + 0x2042: (CStorageValue) { Output } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 1 + ClassID: (0x00000000, 0x00000240) + SuperClassID: 3088 } + 0x2042: (CStorageValue) { Bitmap } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 1 + ClassID: (0x00000000, 0x00001200) + SuperClassID: 4224 } + 0x2042: (CStorageValue) { Texmaps } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 1 + ClassID: (0x00000000, 0x00000037) + SuperClassID: 4272 } + 0x2042: (CStorageValue) { Phong } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 2 + ClassID: (0x00000000, 0x25773211) + SuperClassID: 4368 } + 0x2042: (CStorageValue) { Max 2.5 Star } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 1 + ClassID: (0x00000000, 0x00000002) + SuperClassID: 3072 } + 0x2042: (CStorageValue) { Standard } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -2 + ClassID: (0x043e0955, 0x5a8003f9) + SuperClassID: 3088 } + 0x2042: (CStorageValue) { Nel Multi Bitmap } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 1 + ClassID: (0x00000000, 0x00000038) + SuperClassID: 4272 } + 0x2042: (CStorageValue) { Blinn } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 3 + ClassID: (0x938f3e43, 0x984b8d27) + SuperClassID: 36867 } + 0x2042: (CStorageValue) { On/Off } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -2 + ClassID: (0x222b9eb9, 0x64c75fec) + SuperClassID: 3072 } + 0x2042: (CStorageValue) { NeL Material } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 1 + ClassID: (0x00000000, 0x00000200) + SuperClassID: 3072 } + 0x2042: (CStorageValue) { Multi/Sub-Object } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00000c80) + SuperClassID: 256 } + 0x2042: (CStorageValue) { Material Editor } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00003333) + SuperClassID: 256 } + 0x2042: (CStorageValue) { MtlBaseLib } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00000001) + SuperClassID: 3328 } + 0x2042: (CStorageValue) { Default Sound } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00000002) + SuperClassID: 1 } + 0x2042: (CStorageValue) { RootNode } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00002008) + SuperClassID: 36875 } + 0x2042: (CStorageValue) { Bezier Position } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00442313) + SuperClassID: 36876 } + 0x2042: (CStorageValue) { TCB Rotation } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00002010) + SuperClassID: 36877 } + 0x2042: (CStorageValue) { Bezier Scale } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00002005) + SuperClassID: 36872 } + 0x2042: (CStorageValue) { Position/Rotation/Scale } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 4 + ClassID: (0x00000000, 0x00000100) + SuperClassID: 2064 } + 0x2042: (CStorageValue) { Physique } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x0d9c20ff) + SuperClassID: 36880 } + 0x2042: (CStorageValue) { Master Point Controller } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 5 + ClassID: (0x00000000, 0xe44f10b3) + SuperClassID: 16 } + 0x2042: (CStorageValue) { Editable Mesh } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x1dba1df0, 0x7e9858fe) + SuperClassID: 4336 } + 0x2042: (CStorageValue) { Base Layer } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00000001) + SuperClassID: 1 } + 0x2042: (CStorageValue) { Node } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 6 + ClassID: (0x00000000, 0x00009155) + SuperClassID: 96 } + 0x2042: (CStorageValue) { Biped } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 6 + ClassID: (0x00000000, 0x00009154) + SuperClassID: 36872 } + 0x2042: (CStorageValue) { BipSlave Control } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 6 + ClassID: (0x00000000, 0x00009156) + SuperClassID: 36872 } + 0x2042: (CStorageValue) { Vertical/Horizontal/Turn } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 6 + ClassID: (0x00000000, 0x00009125) + SuperClassID: 16 } + 0x2042: (CStorageValue) { Biped Object } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 6 + ClassID: (0x00000000, 0x00003011) + SuperClassID: 36872 } + 0x2042: (CStorageValue) { Footsteps } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00876234) + SuperClassID: 80 } + 0x2042: (CStorageValue) { Dummy } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00002002) + SuperClassID: 36875 } + 0x2042: (CStorageValue) { Linear Position } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00442312) + SuperClassID: 36875 } + 0x2042: (CStorageValue) { TCB Position } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00442315) + SuperClassID: 36877 } + 0x2042: (CStorageValue) { TCB Scale } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 7 + ClassID: (0x045a6271, 0x2ec82081) + SuperClassID: 2064 } + 0x2042: (CStorageValue) { Map Extender } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 8 + ClassID: (0x00000000, 0x77912301) + SuperClassID: 4256 } + 0x2042: (CStorageValue) { Area } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 9 + ClassID: (0x00000000, 0x00000001) + SuperClassID: 3840 } + 0x2042: (CStorageValue) { Default Scanline Renderer } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00002011) + SuperClassID: 36869 } + 0x2042: (CStorageValue) { Bezier Color } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0xee448b23) + SuperClassID: 4112 } + 0x2042: (CStorageValue) { RenderEnvironment } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00008d51) + SuperClassID: 256 } + 0x2042: (CStorageValue) { NodeNamedSelSet } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00008d52) + SuperClassID: 256 } + 0x2042: (CStorageValue) { NamedSelSetList } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x4b4b1000) + SuperClassID: 36867 } + 0x2042: (CStorageValue) { Float List } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x4b4b1001) + SuperClassID: 36869 } + 0x2042: (CStorageValue) { Point3 List } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x4b4b1002) + SuperClassID: 36875 } + 0x2042: (CStorageValue) { Position List } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x4b4b1003) + SuperClassID: 36876 } + 0x2042: (CStorageValue) { Rotation List } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x4b4b1004) + SuperClassID: 36877 } + 0x2042: (CStorageValue) { Scale List } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x4b4b1015) + SuperClassID: 36881 } + 0x2042: (CStorageValue) { Block Control } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x90f2ee71, 0x8d73b8aa) + SuperClassID: 512 } + 0x2042: (CStorageValue) { TVNode } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00000001) + SuperClassID: 4294966784 } + 0x2042: (CStorageValue) { Grid Reference } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x17356912) + SuperClassID: 4240 } + 0x2042: (CStorageValue) { RenderEffects } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 9 + ClassID: (0x00000000, 0x00000100) + SuperClassID: 4304 } + 0x2042: (CStorageValue) { Shadow Map } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x51ff028e, 0x0d7374fc) + SuperClassID: 0 } + 0x2042: (CStorageValue) { Layer Manager } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00002222) + SuperClassID: 256 } + 0x2042: (CStorageValue) { Scene } } } + + +------------------ +(program exited with code: 0) +Press return to continue + diff --git a/code/nel/tools/3d/pipeline_max_dump/config_2010.c b/code/nel/tools/3d/pipeline_max_dump/config_2010.c new file mode 100644 index 000000000..1cd9fed4a --- /dev/null +++ b/code/nel/tools/3d/pipeline_max_dump/config_2010.c @@ -0,0 +1,3691 @@ +Pipeline Max Dump (Temporary Tool) +/home/kaetemi/source/minimax/GE_Acc_MikotoBaniere.max +Config +(Config) [15] { +0x2090: (CStorageValue) { 0 } +0x20e0: (StorageContainer) [4] { + 0x0100: (StorageRaw) { + Size: 12 + String: .. A........ + Hex: 00 00 20 41 0a 00 00 00 01 00 00 00 } + 0x0400: (StorageRaw) { + Size: 8 + String: ........ + Hex: 07 00 00 00 01 00 00 00 } + 0x0200: (StorageRaw) { + Size: 40 + String: ...@.. A................................ + Hex: 00 00 a0 40 00 00 20 41 00 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 } + 0x0300: (StorageRaw) { + Size: 0 + String: + Hex: } } +0x20a0: (Config20a0) [2] { + 0x0100: (CStorageValue) { 1 } + 0x0110: (Config20a0Entry) [25] { + 0x0100: (CStorageValue) { 220 } + 0x0110: (CStorageValue) { 0 } + 0x0120: (CStorageValue) { 1 } + 0x0130: (CStorageValue) { 0 } + 0x0140: (CStorageValue) { 0 } + 0x0150: (CStorageValue) { 0 } + 0x0160: (CStorageValue) { 1 } + 0x0161: (CStorageValue) { 1 } + 0x0170: (CStorageValue) { 1 } + 0x0180: (CStorageValue) { 0 } + 0x0190: (CStorageValue) { 0 } + 0x0200: (CStorageValue) { 0 } + 0x0210: (CStorageValue) { 0 } + 0x0220: (CStorageValue) { 994352038 } + 0x0230: (CStorageValue) { 1041059807 } + 0x0240: (CStorageValue) { 266338296 } + 0x0250: (CStorageValue) { 131008 } + 0x0260: (CStorageValue) { 0 } + 0x0270: (CStorageValue) { 1 } + 0x0280: (CStorageValue) { 0 } + 0x0310: (CStorageValue) { 0 } + 0x0290: (CStorageValue) { } + 0x0390: (CStorageValue) { default } + 0x0300: (StorageContainer) [1] { + 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } } + 0x0330: (StorageRaw) { + Size: 16 + String: ................ } } } +0x20a5: (StorageContainer) [2] { + 0x0000: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0001: (StorageContainer) [87] { + 0x0000: (StorageRaw) { + Size: 4 + String: *... + Hex: 2a 00 00 00 } + 0x0001: (StorageRaw) { + Size: 9 + String: StateName } + 0x0002: (StorageRaw) { + Size: 10 + String: FormStates } + 0x0003: (StorageRaw) { + Size: 12 + String: InstanceName } + 0x0004: (StorageRaw) { + Size: 18 + String: Container Explorer } + 0x0005: (StorageRaw) { + Size: 19 + String: VisibleColumnsCount } + 0x0006: (StorageRaw) { + Size: 1 + String: 7 + Hex: 37 } + 0x0007: (StorageRaw) { + Size: 14 + String: VisibleColumns } + 0x0008: (StorageRaw) { + Size: 133 + String: Name,Container Open,Container Loaded,Container Override,Container Local Definition,Container Source Definition,Container Source Rules } + 0x0009: (StorageRaw) { + Size: 11 + String: ColumnWidth } + 0x000a: (StorageRaw) { + Size: 25 + String: 165,52,63,116,153,169,114 } + 0x000b: (StorageRaw) { + Size: 14 + String: SelectChildren } + 0x000c: (StorageRaw) { + Size: 5 + String: False } + 0x000d: (StorageRaw) { + Size: 14 + String: EditingEnabled } + 0x000e: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x000f: (StorageRaw) { + Size: 13 + String: ShowHierarchy } + 0x0010: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x0011: (StorageRaw) { + Size: 24 + String: AdvancedFilterDataSource } + 0x0012: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x0013: (StorageRaw) { + Size: 21 + String: AdvancedFilterEnabled } + 0x0014: (StorageRaw) { + Size: 5 + String: False } + 0x0015: (StorageRaw) { + Size: 22 + String: AdvancedFilterMatchAll } + 0x0016: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x0017: (StorageRaw) { + Size: 16 + String: FindToolbarState } + 0x0018: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x0019: (StorageRaw) { + Size: 24 + String: ViewSelectorToolbarState } + 0x001a: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x001b: (StorageRaw) { + Size: 21 + String: SelectionToolbarState } + 0x001c: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x001d: (StorageRaw) { + Size: 17 + String: ToolsToolbarState } + 0x001e: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x001f: (StorageRaw) { + Size: 17 + String: DisplayInfluences } + 0x0020: (StorageRaw) { + Size: 5 + String: False } + 0x0021: (StorageRaw) { + Size: 16 + String: SelectInfluences } + 0x0022: (StorageRaw) { + Size: 5 + String: False } + 0x0023: (StorageRaw) { + Size: 16 + String: SelectDependents } + 0x0024: (StorageRaw) { + Size: 5 + String: False } + 0x0025: (StorageRaw) { + Size: 15 + String: FindStyleOption } + 0x0026: (StorageRaw) { + Size: 9 + String: Wildcards } + 0x0027: (StorageRaw) { + Size: 13 + String: ToolBarLayout } + 0x0028: (StorageRaw) { + Size: 10 + String: Horizontal } + 0x0029: (StorageRaw) { + Size: 17 + String: FindCaseSensitive } + 0x002a: (StorageRaw) { + Size: 5 + String: False } + 0x002b: (StorageRaw) { + Size: 13 + String: SyncSelection } + 0x002c: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x002d: (StorageRaw) { + Size: 23 + String: ShowDependenciesEnabled } + 0x002e: (StorageRaw) { + Size: 5 + String: False } + 0x002f: (StorageRaw) { + Size: 25 + String: FilterSelectionSetEnabled } + 0x0030: (StorageRaw) { + Size: 5 + String: False } + 0x0031: (StorageRaw) { + Size: 19 + String: DisplayToolbarState } + 0x0032: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x0033: (StorageRaw) { + Size: 21 + String: ContainerToolbarState } + 0x0034: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x0035: (StorageRaw) { + Size: 15 + String: FormWindowState } + 0x0036: (StorageRaw) { + Size: 6 + String: Normal } + 0x0037: (StorageRaw) { + Size: 8 + String: FormSize } + 0x0038: (StorageRaw) { + Size: 7 + String: 844,355 } + 0x0039: (StorageRaw) { + Size: 12 + String: FormLocation } + 0x003a: (StorageRaw) { + Size: 7 + String: 100,100 } + 0x003b: (StorageRaw) { + Size: 16 + String: ColumnSortStates } + 0x003c: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x003d: (StorageRaw) { + Size: 8 + String: Geometry } + 0x003e: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x003f: (StorageRaw) { + Size: 5 + String: Shape } + 0x0040: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x0041: (StorageRaw) { + Size: 5 + String: Light } + 0x0042: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x0043: (StorageRaw) { + Size: 6 + String: Camera } + 0x0044: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x0045: (StorageRaw) { + Size: 6 + String: Helper } + 0x0046: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x0047: (StorageRaw) { + Size: 9 + String: SpaceWarp } + 0x0048: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x0049: (StorageRaw) { + Size: 5 + String: Group } + 0x004a: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x004b: (StorageRaw) { + Size: 4 + String: Xref + Hex: 58 72 65 66 } + 0x004c: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x004d: (StorageRaw) { + Size: 4 + String: Bone + Hex: 42 6f 6e 65 } + 0x004e: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x004f: (StorageRaw) { + Size: 9 + String: Container } + 0x0050: (StorageRaw) { + Size: 4 + String: True + Hex: 54 72 75 65 } + 0x0051: (StorageRaw) { + Size: 6 + String: Frozen } + 0x0052: (StorageRaw) { + Size: 5 + String: False } + 0x0053: (StorageRaw) { + Size: 6 + String: Hidden } + 0x0054: (StorageRaw) { + Size: 5 + String: False } + 0x0002: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + 0x0003: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } } +0x20a6: (StorageContainer) [1] { + 0x0000: (StorageContainer) [1] { + 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } } } +0x2190: (StorageContainer) [2] { + 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0110: (StorageContainer) [27] { + 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 0e 08 00 00 } + 0x0410: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0420: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0510: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 } + 0x0440: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0530: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0110: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x0120: (StorageRaw) { + Size: 16 + String: ................ } + 0x0140: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x0150: (StorageRaw) { + Size: 8 + String: ........ } + 0x0160: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0170: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0210: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0520: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0250: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0260: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0270: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0280: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0290: (StorageRaw) { + Size: 4 + String: .... + Hex: 0a 00 00 00 } + 0x0300: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0310: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0320: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x0380: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x0390: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0400: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0540: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0550: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } } } +0x20b0: (StorageContainer) [10] { + 0x0010: (StorageRaw) { + Size: 4 + String: .... + Hex: 1e 00 00 00 } + 0x0020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0030: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0050: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0060: (StorageRaw) { + Size: 4 + String: .%.. + Hex: 80 25 00 00 } + 0x0070: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0100: (StorageContainer) [1] { + 0x0090: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } } + 0x0110: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0120: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } +0x2130: (StorageContainer) [3] { + 0x0100: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x0120: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x0110: (StorageContainer) [4] { + 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0400: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0300: (StorageContainer) [8] { + 0x0100: (StorageRaw) { + Size: 11 + String: ........... + Hex: 07 00 00 00 df f8 fc e8 f0 f8 9d } + 0x0110: (StorageRaw) { + Size: 12 + String: ............ + Hex: 08 00 00 00 dc cf d3 dc c8 d9 df 9d } + 0x0120: (StorageRaw) { + Size: 17 + String: ................. + Hex: 0d 00 00 00 ab a9 ad b0 ad ac ad aa a9 ae ac a8 9d } + 0x0130: (StorageRaw) { + Size: 12 + String: ..,.:.{...J. + Hex: 94 b5 2c 0f 3a c5 7b 02 e9 a7 4a d8 } + 0x0140: (StorageRaw) { + Size: 12 + String: ............ + Hex: 08 00 00 00 d6 fc f8 e9 f8 f0 f4 9d } + 0x0150: (StorageRaw) { + Size: 12 + String: ............ + Hex: 08 00 00 00 d6 dc d8 d9 d8 d1 d1 9d } + 0x0160: (StorageRaw) { + Size: 17 + String: ................. + Hex: 0d 00 00 00 ae a8 a4 b0 ad ab ad aa a9 ab a5 ac 9d } + 0x0170: (StorageRaw) { + Size: 12 + String: %%%-%%%%%%%% } } } } +0x2080: (StorageContainer) [213] { + 0x2801: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x2900: (StorageRaw) { + Size: 4 + String: c... + Hex: 63 00 00 00 } + 0x2954: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x2827: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 0a 00 00 } + 0x2828: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 0a 00 00 } + 0x3010: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x3011: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x3012: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x3013: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x3014: (StorageRaw) { + Size: 4 + String: fff? + Hex: 66 66 66 3f } + 0x3015: (StorageRaw) { + Size: 4 + String: fff? + Hex: 66 66 66 3f } + 0x3016: (StorageRaw) { + Size: 4 + String: fff? + Hex: 66 66 66 3f } + 0x3017: (StorageRaw) { + Size: 4 + String: ..L? + Hex: cd cc 4c 3f } + 0x3018: (StorageRaw) { + Size: 4 + String: ..L? + Hex: cd cc 4c 3f } + 0x3019: (StorageRaw) { + Size: 4 + String: ..L? + Hex: cd cc 4c 3f } + 0x301a: (StorageRaw) { + Size: 4 + String: 333? + Hex: 33 33 33 3f } + 0x301b: (StorageRaw) { + Size: 4 + String: 333? + Hex: 33 33 33 3f } + 0x301c: (StorageRaw) { + Size: 4 + String: 333? + Hex: 33 33 33 3f } + 0x301d: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x301e: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x301f: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x3020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x3022: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28fa: (StorageRaw) { + Size: 896 + String: ...............?...............?...............?...............................................................................?...............?...............?...............................................................................?...............?...............?...............................................................................?...............?...............?...............................................................................?...............?...............?...............................................................................?...............?...............?...............................................................................?...............?...............?...............................................................................?...............?...............?................................................................ + Hex: 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x2910: (StorageRaw) { + Size: 80 + String: ...........?...............?...............?.................................... + Hex: 01 00 00 00 0b 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x2911: (StorageRaw) { + Size: 80 + String: ...........?...............?...............?...............?.................... + Hex: 01 00 00 00 02 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x2912: (StorageRaw) { + Size: 80 + String: ..........5?...>q.....5....>q.........]?...>..........z...I?..zC................ + Hex: 00 00 00 00 07 00 00 00 f3 04 35 3f f2 04 b5 3e 71 c4 1c bf f3 04 35 bf f2 04 b5 3e 71 c4 1c bf 00 00 00 00 d8 b3 5d 3f ff ff ff 3e 00 00 00 00 00 00 00 00 00 00 7a c3 db 0f 49 3f 00 00 7a 43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x2930: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x2931: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x2932: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x2800: (StorageRaw) { + Size: 4 + String: t... + Hex: 74 00 00 00 } + 0x2810: (StorageRaw) { + Size: 80 + String: ...........?...............?...............?..Z:..........C9.................... + Hex: 01 00 00 00 02 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 b4 5a 3a 00 ed 1f ba 00 00 00 00 00 89 43 39 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x2811: (StorageRaw) { + Size: 80 + String: ...........?..............;............?..;................?.................... + Hex: 01 00 00 00 04 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 80 00 00 00 00 2e bd 3b b3 00 00 80 bf 00 00 00 00 00 00 80 3f 2e bd 3b b3 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x2812: (StorageRaw) { + Size: 80 + String: ..........;...............;...;3..;....?...'.x_;M.......H.%9.................... + Hex: 01 00 00 00 00 00 00 00 2e bd 3b b3 00 00 00 00 00 00 80 bf 00 00 80 bf 2e bd 3b b3 2e bd 3b 33 2e bd 3b b3 00 00 80 3f ed ad 09 27 00 78 5f 3b 4d b0 c1 bf 00 00 00 00 48 b0 25 39 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x2813: (StorageRaw) { + Size: 80 + String: ..............6.8.:..:;..z*=TD.?.. 78..?W.y.1.R>Qu....k...I?[.n@................ + Hex: 00 00 00 00 07 00 00 00 90 97 2e bf c3 c4 36 bd 38 e1 3a bf a1 3a 3b bf c8 7a 2a 3d 54 44 2e 3f 00 00 20 37 38 86 7f 3f 57 ee 79 bd 31 da 52 3e 51 75 19 bf a4 97 6b c0 db 0f 49 3f 5b 9d 6e 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x3040: (StorageRaw) { + Size: 12 + String: ...@...?...? } + 0x2876: (StorageRaw) { + Size: 76 + String: {.0.0.0.0.0.0.0.0.-.0.0.0.0.-.0.0.0.0.-.0.0.0.0.-.0.0.0.0.0.0.0.0.0.0.0.0.}. } + 0x3000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x2830: (StorageRaw) { + Size: 4 + String: .... + Hex: 08 00 00 00 } + 0x283a: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x2836: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x2840: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28f4: (StorageRaw) { + Size: 4 + String: .... + Hex: ff ff ff ff } + 0x2846: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0002: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0000: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0005: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x4270: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x2870: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x2861: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x2890: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 0x28a0: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 0x28b1: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x28b5: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28c1: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28c5: (StorageRaw) { + Size: 4 + String: .... + Hex: 10 00 00 00 } + 0x28c9: (StorageRaw) { + Size: 4 + String: ... + Hex: 20 00 00 00 } + 0x3030: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 00 05 00 00 00 } + 0x28cd: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x3054: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x305c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x3058: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 01 00 } + 0x3060: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x3064: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x3068: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4080: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x4000: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x4040: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4100: (StorageRaw) { + Size: 40 + String: ........................................ + Hex: 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 1e 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x3004: (StorageRaw) { + Size: 12 + String: ..d......... + Hex: d6 cd 64 c0 fa cf c0 c0 00 00 00 00 } + 0x3008: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4110: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x3041: (StorageRaw) { + Size: 12 + String: ...@...?...? } + 0x2877: (StorageRaw) { + Size: 76 + String: {.0.0.0.0.0.0.0.0.-.0.0.0.0.-.0.0.0.0.-.0.0.0.0.-.0.0.0.0.0.0.0.0.0.0.0.0.}. } + 0x3001: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x2831: (StorageRaw) { + Size: 4 + String: .... + Hex: 08 00 00 00 } + 0x283b: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x2837: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x2841: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28f5: (StorageRaw) { + Size: 4 + String: .... + Hex: ff ff ff ff } + 0x2847: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0002: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0000: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0005: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x4271: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x2871: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x2862: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x2891: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 0x28a1: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 0x28b2: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x28b6: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28c2: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28c6: (StorageRaw) { + Size: 4 + String: .... + Hex: 10 00 00 00 } + 0x28ca: (StorageRaw) { + Size: 4 + String: ... + Hex: 20 00 00 00 } + 0x3031: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 00 05 00 00 00 } + 0x28ce: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x3055: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x305d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x3059: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 01 00 } + 0x3061: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x3065: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x3069: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4081: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x4001: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x4041: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4101: (StorageRaw) { + Size: 40 + String: ........................................ + Hex: 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 1e 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x3005: (StorageRaw) { + Size: 12 + String: S...Y.&..... + Hex: 53 ea c5 c4 59 c8 26 c5 00 00 00 00 } + 0x3009: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4111: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x3042: (StorageRaw) { + Size: 12 + String: ...@...?...? } + 0x2878: (StorageRaw) { + Size: 76 + String: {.0.0.0.0.0.0.0.0.-.0.0.0.0.-.0.0.0.0.-.0.0.0.0.-.0.0.0.0.0.0.0.0.0.0.0.0.}. } + 0x3002: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x2832: (StorageRaw) { + Size: 4 + String: .... + Hex: 08 00 00 00 } + 0x283c: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x2838: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x2842: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28f6: (StorageRaw) { + Size: 4 + String: .... + Hex: ff ff ff ff } + 0x2848: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0002: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0000: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0005: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x4272: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x2872: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x2863: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x2892: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 0x28a2: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 0x28b3: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x28b7: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28c3: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28c7: (StorageRaw) { + Size: 4 + String: .... + Hex: 10 00 00 00 } + 0x28cb: (StorageRaw) { + Size: 4 + String: ... + Hex: 20 00 00 00 } + 0x3032: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 00 05 00 00 00 } + 0x28cf: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x3056: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x305e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x305a: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 01 00 } + 0x3062: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x3066: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x306a: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4082: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x4002: (StorageRaw) { + Size: 4 + String: .... + Hex: 10 00 00 00 } + 0x4042: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4102: (StorageRaw) { + Size: 40 + String: ........................................ + Hex: 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 1e 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x3006: (StorageRaw) { + Size: 12 + String: ............ + Hex: 8f 02 87 c0 84 8b e3 c0 00 00 00 00 } + 0x300a: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4112: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x3043: (StorageRaw) { + Size: 12 + String: ...@...?...? } + 0x2879: (StorageRaw) { + Size: 76 + String: {.0.0.0.0.0.0.0.0.-.0.0.0.0.-.0.0.0.0.-.0.0.0.0.-.0.0.0.0.0.0.0.0.0.0.0.0.}. } + 0x3003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x2833: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x283d: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x2839: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x2843: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28f7: (StorageRaw) { + Size: 4 + String: .... + Hex: ff ff ff ff } + 0x2849: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0002: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0000: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0005: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x4273: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x2873: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x2864: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x2893: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 0x28a3: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 0x28b4: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x28b8: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28c4: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28c8: (StorageRaw) { + Size: 4 + String: .... + Hex: 10 00 00 00 } + 0x28cc: (StorageRaw) { + Size: 4 + String: ... + Hex: 20 00 00 00 } + 0x3033: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 00 05 00 00 00 } + 0x28d0: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x3057: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x305f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x305b: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 01 00 } + 0x3063: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x3067: (StorageRaw) { + Size: 4 + String: .... + Hex: a9 f1 83 bd } + 0x306b: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4083: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 10 00 00 00 } + 0x4043: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4103: (StorageRaw) { + Size: 40 + String: ........................................ + Hex: 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 1e 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x3007: (StorageRaw) { + Size: 12 + String: >....G...... + Hex: 3e c3 2e ba e9 47 93 ba 00 00 00 00 } + 0x300b: (StorageRaw) { + Size: 4 + String: ...? + Hex: 83 f9 a2 3f } + 0x4113: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x2820: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 } + 0x2821: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x2826: (StorageRaw) { + Size: 4 + String: F.L. + Hex: 46 00 4c 00 } + 0x2825: (StorageRaw) { + Size: 28 + String: ......................%D.... + Hex: 00 00 00 00 02 00 00 00 04 00 00 00 06 00 00 00 00 00 00 00 00 00 25 44 01 00 00 00 } + 0x3038: (StorageRaw) { + Size: 60 + String: ....................2...>................................... + Hex: 00 00 00 00 00 00 00 00 ff ff ff ff 01 00 00 00 00 00 00 00 32 00 00 00 3e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 } + 0x4114: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x4115: (StorageRaw) { + Size: 12 + String: ...?...?...? } + 0x4300: (StorageRaw) { + Size: 8 + String: .......? + Hex: 02 00 00 00 00 00 80 3f } + 0x4600: (StorageRaw) { + Size: 32 + String: .. A................(......=fff? + Hex: 00 00 20 41 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 28 00 00 00 cd cc cc 3d 66 66 66 3f } + 0x4620: (StorageRaw) { + Size: 4 + String: o..: + Hex: 6f 12 83 3a } + 0x4630: (StorageContainer) [1] { + 0x0001: (StorageContainer) [10] { + 0x0002: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0005: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 4 + String: ...A + Hex: 00 00 f0 41 } + 0x000c: (StorageRaw) { + Size: 4 + String: ...= + Hex: cd cc cc 3d } + 0x0008: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0009: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + 0x000a: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + 0x000b: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } } + 0x4620: (StorageRaw) { + Size: 4 + String: o..: + Hex: 6f 12 83 3a } + 0x4630: (StorageContainer) [1] { + 0x0001: (StorageContainer) [10] { + 0x0002: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0005: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 4 + String: ...A + Hex: 00 00 f0 41 } + 0x000c: (StorageRaw) { + Size: 4 + String: ...= + Hex: cd cc cc 3d } + 0x0008: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0009: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + 0x000a: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + 0x000b: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } } + 0x4620: (StorageRaw) { + Size: 4 + String: o..: + Hex: 6f 12 83 3a } + 0x4630: (StorageContainer) [1] { + 0x0001: (StorageContainer) [10] { + 0x0002: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0005: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 4 + String: ...A + Hex: 00 00 f0 41 } + 0x000c: (StorageRaw) { + Size: 4 + String: ...= + Hex: cd cc cc 3d } + 0x0008: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0009: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + 0x000a: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + 0x000b: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } } + 0x4620: (StorageRaw) { + Size: 4 + String: o..: + Hex: 6f 12 83 3a } + 0x4630: (StorageContainer) [1] { + 0x0001: (StorageContainer) [10] { + 0x0002: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0005: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 4 + String: ...A + Hex: 00 00 f0 41 } + 0x000c: (StorageRaw) { + Size: 4 + String: ...= + Hex: cd cc cc 3d } + 0x0008: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0009: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + 0x000a: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + 0x000b: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } } + 0x4640: (StorageRaw) { + Size: 5 + String: ....? + Hex: 01 00 00 80 3f } } +0x20d0: (StorageContainer) [9] { + 0x0005: (StorageRaw) { + Size: 20 + String: .................... + Hex: 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0002: (StorageRaw) { + Size: 4 + String: ... + Hex: 20 12 00 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: ... + Hex: 20 12 00 00 } + 0x0010: (StorageRaw) { + Size: 4 + String: .... + Hex: 80 02 00 00 } + 0x0020: (StorageRaw) { + Size: 4 + String: .... + Hex: e0 01 00 00 } + 0x0030: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x0031: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } } +0x2160: (StorageContainer) [5] { + 0x0100: (StorageRaw) { + Size: 12 + String: .......@...@ + Hex: 00 00 00 00 cd cc 0c 40 cd cc 0c 40 } + 0x0200: (StorageRaw) { + Size: 8 + String: ........ + Hex: 01 00 00 00 01 00 00 00 } + 0x0300: (StorageRaw) { + Size: 28 + String: ............................ + Hex: 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 0f 00 00 00 00 00 00 00 00 00 00 00 } + 0x0400: (StorageRaw) { + Size: 4 + String: .... + Hex: 10 00 00 00 } + 0x0500: (StorageRaw) { + Size: 4 + String: .... + Hex: 14 00 00 00 } } +0x21a0: (StorageContainer) [82] { + 0x1a00: (StorageRaw) { + Size: 8 + String: .[&<...9 + Hex: e3 5b 26 3c 1d 15 cd 39 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: ..8J$.D: + Hex: bc 04 38 4a 24 06 44 3a } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .{.d.C.. + Hex: 0d 7b c4 64 00 43 b3 1e } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: lL.8.C.. + Hex: 6c 4c e6 38 00 43 b3 1e } + 0x1a02: (StorageContainer) [1] { + 0x1e61: (StorageRaw) { + Size: 4 + String: .... + Hex: 07 00 00 00 } } + 0x1a00: (StorageRaw) { + Size: 8 + String: .+@...,f + Hex: 9d 2b 40 2e 80 14 2c 66 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .6).I@,I + Hex: 14 36 29 01 49 40 2c 49 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: ..e[...T + Hex: f1 01 65 5b fc 14 96 54 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .:.Am..M + Hex: e5 3a 89 41 6d 0c 95 4d } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .s.r.w.( + Hex: 11 73 cd 72 0f 77 fb 28 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .Fhi.x.B + Hex: fd 46 68 69 ab 78 9c 42 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .=.=.nH. + Hex: 1b 3d d9 3d 19 6e 48 0e } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: `{.{a... + Hex: 60 7b f7 7b 61 09 13 16 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: _..i\.E` + Hex: 5f ea ad 69 5c 2e 45 60 } + 0x1a02: (StorageContainer) [1] { + 0x0001: (StorageContainer) [23] { + 0x0002: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x001a: (StorageRaw) { + Size: 8 + String: ........ } + 0x001b: (StorageRaw) { + Size: 8 + String: ........ } + 0x001c: (StorageRaw) { + Size: 8 + String: ........ } + 0x001d: (StorageRaw) { + Size: 8 + String: ..... c. + Hex: 00 00 00 00 00 20 63 c0 } + 0x001e: (StorageRaw) { + Size: 8 + String: .....@_@ } + 0x001f: (StorageRaw) { + Size: 8 + String: ..... c@ } + 0x0020: (StorageRaw) { + Size: 8 + String: ........ } + 0x0021: (StorageRaw) { + Size: 8 + String: .......? + Hex: 00 00 00 00 00 00 f0 3f } + 0x0022: (StorageRaw) { + Size: 8 + String: ........ } + 0x0023: (StorageRaw) { + Size: 8 + String: ........ } + 0x0024: (StorageRaw) { + Size: 8 + String: ........ } + 0x0025: (StorageRaw) { + Size: 8 + String: ........ } + 0x0026: (StorageRaw) { + Size: 8 + String: ......F@ + Hex: 00 00 00 00 00 80 46 40 } + 0x0027: (StorageRaw) { + Size: 8 + String: ......F@ + Hex: 00 00 00 00 00 80 46 40 } + 0x0028: (StorageRaw) { + Size: 8 + String: .....@.@ + Hex: 00 00 00 00 00 40 7f 40 } + 0x0029: (StorageRaw) { + Size: 8 + String: .....@.@ + Hex: 00 00 00 00 00 40 7f 40 } + 0x002a: (StorageRaw) { + Size: 8 + String: ........ } + 0x002b: (StorageRaw) { + Size: 8 + String: ........ } + 0x002c: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 00 00 00 f0 bf } + 0x002d: (StorageRaw) { + Size: 8 + String: ........ } + 0x002e: (StorageRaw) { + Size: 8 + String: .......? + Hex: 00 00 00 00 00 00 f0 3f } + 0x002f: (StorageRaw) { + Size: 8 + String: ........ } } } + 0x1a00: (StorageRaw) { + Size: 8 + String: .....J2 + Hex: 95 87 c1 b0 04 4a 32 20 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .kHE&... + Hex: d4 6b 48 45 26 8a a3 85 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: EULB..KR + Hex: 45 55 4c 42 04 00 4b 52 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .$.X.._h + Hex: c8 24 14 58 b5 0f 5f 68 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .Z.J.d.H + Hex: f4 5a 81 4a 03 64 c5 48 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: s<.j.!.E + Hex: 73 3c 1e 6a 92 21 b7 45 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .54F8He. + Hex: 1d 35 34 46 38 48 65 11 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .oa..r.7 + Hex: db 6f 61 12 9d 72 ef 37 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: $5.z...I + Hex: 24 35 9f 7a b5 04 c8 49 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .{m..'.& + Hex: c3 7b 6d 11 b6 27 82 26 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: En.9$P.. + Hex: 45 6e ba 39 24 50 cf 1f } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: D..TW.+J + Hex: 44 1f dd 54 57 0b 2b 4a } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .=+..Q.o + Hex: 07 3d 2b 1c 04 51 ab 6f } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: F.L1.... + Hex: 46 0d 4c 31 ab 10 07 1c } + 0x1a02: (StorageContainer) [6] { + 0x5000: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + 0x5004: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + 0x5001: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + 0x5002: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x5003: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x5005: (StorageRaw) { + Size: 0 + String: + Hex: } } + 0x1a00: (StorageRaw) { + Size: 8 + String: .....K3! + Hex: 06 97 c1 c0 c4 4b 33 21 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: z+-..~Uk + Hex: 7a 2b 2d 05 b1 7e 55 6b } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: e..D.~J. + Hex: 65 ab d1 44 b4 7e 4a 2e } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: Td.w...g + Hex: 54 64 eb 77 09 dc 05 67 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: I..2G..% + Hex: 49 b4 8e 32 47 89 dc 25 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: ...-./.\ + Hex: c1 0a c0 2d 13 2f 9f 5c } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: M[.9~..t + Hex: 4d 5b aa 39 7e 15 c1 74 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: ...?tQ.r + Hex: eb c9 b6 3f 74 51 bd 72 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .x.a_..m + Hex: 9d 78 c2 61 5f 02 c3 6d } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: oK.`Y..) + Hex: 6f 4b b7 60 59 08 8c 29 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: a*...... + Hex: 61 2a eb c8 85 c6 c3 8a } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: ...W...Y + Hex: dc dc ab 57 dc dc 05 59 } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: ..c(A.0[ + Hex: e0 08 63 28 41 9c 30 5b } + 0x1a02: (StorageRaw) { + Size: 0 + String: + Hex: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .<.:..=] + Hex: f3 3c 1c 3a e7 b5 3d 5d } + 0x1a02: (StorageContainer) [1] { + 0x0001: (StorageContainer) [6] { + 0x0002: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0010: (StorageRaw) { + Size: 4 + String: ..pA + Hex: 00 00 70 41 } + 0x0013: (StorageRaw) { + Size: 4 + String: ..HB + Hex: 00 00 48 42 } + 0x0014: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + 0x0015: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + 0x0016: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } } } +0x2180: (ConfigScript) [1] { + 0x0040: (ConfigScriptEntry) [2] { + 0x0050: (ConfigScriptHeader) { + SuperClassID: 3072 + ClassID: (0x222b9eb9, 0x64c75fec) } + 0x0007: (ConfigScriptMetaContainer) [10] { + 0x0060: (CStorageValue) { 9 } + 0x0007: (ConfigScriptMetaContainer) [15] { + 0x0060: (CStorageValue) { 14 } + 0x0006: (ConfigScriptMetaString) { nlbp } + 0x0003: (CStorageValue) { 0 } + 0x0003: (CStorageValue) { 1 } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { rollout } + 0x0006: (ConfigScriptMetaString) { nelBasicParameters } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bTwoSided } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { cAmbient } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { color } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { cDiffuse } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { color } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { pOpacity } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { percent } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { cSpecular } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { color } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { pSpecularLevel } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { percent } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { pGlossiness } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { percent } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { cSelfIllumColor } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { color } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { pSelfIllumAmount } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { percent } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bUseSelfIllumColor } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } } } } + 0x0007: (ConfigScriptMetaContainer) [42] { + 0x0060: (CStorageValue) { 41 } + 0x0006: (ConfigScriptMetaString) { main } + 0x0003: (CStorageValue) { 1 } + 0x0003: (CStorageValue) { 2 } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { rollout } + 0x0006: (ConfigScriptMetaString) { NelParams } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bLightMap } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bUnlighted } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbUnlighted } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bStainedGlassWindow } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbStainedGlassWindow } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bAlphaTest } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbAlphaTest } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bForceZWrite } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbForceZWrite } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bForceNoZWrite } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbForceNoZWrite } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bWater } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bWaterUseSceneEnvMapAbove } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbWaterUseSceneEnvMapAbove } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bWaterUseSceneEnvMapUnder } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbWaterUseSceneEnvMapUnder } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { fBumpUScale } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { float } + 0x0006: (ConfigScriptMetaString) { default } + 0x0004: (CStorageValue) { 0.010000 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cfBumpUScale } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { fBumpVScale } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { float } + 0x0006: (ConfigScriptMetaString) { default } + 0x0004: (CStorageValue) { 0.010000 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cfBumpVScale } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { fBumpUSpeed } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { float } + 0x0006: (ConfigScriptMetaString) { default } + 0x0004: (CStorageValue) { 0.010000 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cfBumpUSpeed } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { fBumpVSpeed } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { float } + 0x0006: (ConfigScriptMetaString) { default } + 0x0004: (CStorageValue) { 0.010000 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cfBumpVSpeed } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { fDisplaceMapUScale } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { float } + 0x0006: (ConfigScriptMetaString) { default } + 0x0004: (CStorageValue) { 0.005000 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cfDisplaceMapUScale } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { fDisplaceMapVScale } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { float } + 0x0006: (ConfigScriptMetaString) { default } + 0x0004: (CStorageValue) { 0.005000 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cfDisplaceMapVScale } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { fDisplaceMapUSpeed } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { float } + 0x0006: (ConfigScriptMetaString) { default } + 0x0004: (CStorageValue) { 0.005000 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cfDisplaceMapUSpeed } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { fDisplaceMapVSpeed } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { float } + 0x0006: (ConfigScriptMetaString) { default } + 0x0004: (CStorageValue) { 0.005000 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cfDisplaceMapVSpeed } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { fWaterHeightFactor } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { float } + 0x0006: (ConfigScriptMetaString) { default } + 0x0004: (CStorageValue) { 1.000000 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cfWaterHeightFactor } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iWaterPoolID } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { ciWaterPoolID } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bCalcWaterLightmap } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbCalcWaterLightmap } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bEnableWaterSplash } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbEnableWaterSplash } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bColorVertex } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbColorVertex } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bAlphaVertex } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbAlphaVertex } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaVertexChannel } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { ciAlphaVertexChannel } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bAlphaBlend } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbAlphaBlend } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iBlendSrcFunc } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iBlendDestFunc } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iShader } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { fZBias } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { float } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cfZBias } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iLightMapChannel } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { ciLightMapChannel } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iShaderType } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bUserColor } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bSpecular } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bNormalShader } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bPerPixelLightingShader } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { cUserColor } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { color } + 0x0006: (ConfigScriptMetaString) { default } + 0x0008: (CStorageValue) { 255.000000 0.000000 255.000000 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cpUserColor } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bExportTextureMatrix } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbExportTextureMatrix } } } } } + 0x0007: (ConfigScriptMetaContainer) [29] { + 0x0060: (CStorageValue) { 28 } + 0x0006: (ConfigScriptMetaString) { textures } + 0x0003: (CStorageValue) { 2 } + 0x0003: (CStorageValue) { 3 } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { rollout } + 0x0006: (ConfigScriptMetaString) { NelTexture } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bEnableSlot_1 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbEnableSlot_1 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bEnableSlot_2 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbEnableSlot_2 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bEnableSlot_3 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbEnableSlot_3 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bEnableSlot_4 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbEnableSlot_4 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bEnableSlot_5 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbEnableSlot_5 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bEnableSlot_6 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbEnableSlot_6 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bEnableSlot_7 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbEnableSlot_7 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bEnableSlot_8 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbEnableSlot_8 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bTexGen_1 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbTexGen_1 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bTexGen_2 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbTexGen_2 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bTexGen_3 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbTexGen_3 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bTexGen_4 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbTexGen_4 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bTexGen_5 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbTexGen_5 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bTexGen_6 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbTexGen_6 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bTexGen_7 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbTexGen_7 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { bTexGen_8 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { boolean } + 0x0006: (ConfigScriptMetaString) { default } + 0x0001: (CStorageValue) { 0 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cbTexGen_8 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { tTexture_1 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { textureMap } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { mbTexture_1 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { tTexture_2 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { textureMap } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { mbTexture_2 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { tTexture_3 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { textureMap } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { mbTexture_3 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { tTexture_4 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { textureMap } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { mbTexture_4 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { tTexture_5 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { textureMap } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { mbTexture_5 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { tTexture_6 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { textureMap } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { mbTexture_6 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { tTexture_7 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { textureMap } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { mbTexture_7 } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { tTexture_8 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { textureMap } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { mbTexture_8 } } } } } + 0x0007: (ConfigScriptMetaContainer) [24] { + 0x0060: (CStorageValue) { 23 } + 0x0006: (ConfigScriptMetaString) { slot1 } + 0x0003: (CStorageValue) { 3 } + 0x0003: (CStorageValue) { 4 } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { rollout } + 0x0006: (ConfigScriptMetaString) { NelMultitextureSlot1 } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { cConstant_1 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { color } + 0x0006: (ConfigScriptMetaString) { default } + 0x0008: (CStorageValue) { 255.000000 255.000000 255.000000 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cpConstant } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbOperation_1 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbBlendSource_1 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg0_1 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg1_1 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg2_1 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg0Operand_1 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg1Operand_1 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg2Operand_1 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaOperation_1 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaBlendSource_1 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg0_1 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg1_1 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg2_1 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg0Operand_1 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 3 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg1Operand_1 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 3 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg2Operand_1 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 3 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iTextureShader_1 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iConstantAlpha_1 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 255 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { sdConstantAlpha } } } } } + 0x0007: (ConfigScriptMetaContainer) [24] { + 0x0060: (CStorageValue) { 23 } + 0x0006: (ConfigScriptMetaString) { slot2 } + 0x0003: (CStorageValue) { 4 } + 0x0003: (CStorageValue) { 5 } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { rollout } + 0x0006: (ConfigScriptMetaString) { NelMultitextureSlot2 } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { cConstant_2 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { color } + 0x0006: (ConfigScriptMetaString) { default } + 0x0008: (CStorageValue) { 255.000000 255.000000 255.000000 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cpConstant } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbOperation_2 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbBlendSource_2 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg0_2 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg1_2 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg2_2 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg0Operand_2 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg1Operand_2 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg2Operand_2 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaOperation_2 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaBlendSource_2 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg0_2 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg1_2 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg2_2 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg0Operand_2 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 3 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg1Operand_2 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 3 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg2Operand_2 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 3 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iTextureShader_2 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iConstantAlpha_2 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 255 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { sdConstantAlpha } } } } } + 0x0007: (ConfigScriptMetaContainer) [24] { + 0x0060: (CStorageValue) { 23 } + 0x0006: (ConfigScriptMetaString) { slot3 } + 0x0003: (CStorageValue) { 5 } + 0x0003: (CStorageValue) { 6 } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { rollout } + 0x0006: (ConfigScriptMetaString) { NelMultitextureSlot3 } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { cConstant_3 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { color } + 0x0006: (ConfigScriptMetaString) { default } + 0x0008: (CStorageValue) { 255.000000 255.000000 255.000000 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cpConstant } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbOperation_3 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbBlendSource_3 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg0_3 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg1_3 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg2_3 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg0Operand_3 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg1Operand_3 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg2Operand_3 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaOperation_3 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaBlendSource_3 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg0_3 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg1_3 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg2_3 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg0Operand_3 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 3 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg1Operand_3 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 3 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg2Operand_3 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 3 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iTextureShader_3 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iConstantAlpha_3 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 255 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { sdConstantAlpha } } } } } + 0x0007: (ConfigScriptMetaContainer) [24] { + 0x0060: (CStorageValue) { 23 } + 0x0006: (ConfigScriptMetaString) { slot4 } + 0x0003: (CStorageValue) { 6 } + 0x0003: (CStorageValue) { 7 } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { rollout } + 0x0006: (ConfigScriptMetaString) { NelMultitextureSlot4 } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { cConstant_4 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { color } + 0x0006: (ConfigScriptMetaString) { default } + 0x0008: (CStorageValue) { 255.000000 255.000000 255.000000 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { cpConstant } } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbOperation_4 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbBlendSource_4 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg0_4 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg1_4 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg2_4 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg0Operand_4 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg1Operand_4 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iRgbArg2Operand_4 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaOperation_4 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaBlendSource_4 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg0_4 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg1_4 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg2_4 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg0Operand_4 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 3 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg1Operand_4 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 3 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iAlphaArg2Operand_4 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 3 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iTextureShader_4 } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 1 } } } + 0x0007: (ConfigScriptMetaContainer) [3] { + 0x0060: (CStorageValue) { 2 } + 0x0006: (ConfigScriptMetaString) { iConstantAlpha_4 } + 0x0007: (ConfigScriptMetaContainer) [7] { + 0x0060: (CStorageValue) { 6 } + 0x0006: (ConfigScriptMetaString) { type } + 0x0006: (ConfigScriptMetaString) { integer } + 0x0006: (ConfigScriptMetaString) { default } + 0x0003: (CStorageValue) { 255 } + 0x0006: (ConfigScriptMetaString) { ui } + 0x0007: (ConfigScriptMetaContainer) [2] { + 0x0060: (CStorageValue) { 1 } + 0x0006: (ConfigScriptMetaString) { sdConstantAlpha } } } } } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { slot5 } + 0x0003: (CStorageValue) { 7 } + 0x0003: (CStorageValue) { 8 } + 0x0007: (ConfigScriptMetaContainer) [1] { + 0x0060: (CStorageValue) { 0 } } } + 0x0007: (ConfigScriptMetaContainer) [5] { + 0x0060: (CStorageValue) { 4 } + 0x0006: (ConfigScriptMetaString) { slot6 } + 0x0003: (CStorageValue) { 8 } + 0x0003: (CStorageValue) { 9 } + 0x0007: (ConfigScriptMetaContainer) [1] { + 0x0060: (CStorageValue) { 0 } } } } } } +0x2007: (StorageContainer) [1] { + 0x0010: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 00 1e 01 00 00 } } +0x2008: (StorageContainer) [3] { + 0x0010: (StorageRaw) { + Size: 52 + String: ...?...............?...............?................ + Hex: 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 } + 0x0020: (StorageRaw) { + Size: 4 + String: ...A + Hex: 00 00 a0 41 } + 0x0030: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + + +------------------ +(program exited with code: 0) +Press return to continue + diff --git a/code/nel/tools/3d/pipeline_max_dump/config_2010.txt b/code/nel/tools/3d/pipeline_max_dump/config_2010.txt new file mode 100644 index 000000000..e00602ed3 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max_dump/config_2010.txt @@ -0,0 +1,7192 @@ +Pipeline Max Dump (Temporary Tool) +/home/kaetemi/source/minimax/GE_Acc_MikotoBaniere.max +Config +(Config) { +0x2090: (StorageRaw) { + Size: 4 + String: .... } +0x20e0: (StorageContainer) { + 0x0100: (StorageRaw) { + Size: 12 + String: .. A........ + Hex: 00 00 20 41 0a 00 00 00 01 00 00 00 } + 0x0400: (StorageRaw) { + Size: 8 + String: ........ + Hex: 07 00 00 00 01 00 00 00 } + 0x0200: (StorageRaw) { + Size: 40 + String: ...@.. A................................ + Hex: 00 00 a0 40 00 00 20 41 00 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 } + 0x0300: (StorageRaw) { + Size: 0 + String: } } +0x20a0: (StorageContainer) { + 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0110: (StorageContainer) { + 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: dc 00 00 00 } + 0x0110: (StorageRaw) { + Size: 4 + String: .... } + 0x0120: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0130: (StorageRaw) { + Size: 4 + String: .... } + 0x0140: (StorageRaw) { + Size: 4 + String: .... } + 0x0150: (StorageRaw) { + Size: 4 + String: .... } + 0x0160: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0161: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0170: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0180: (StorageRaw) { + Size: 4 + String: .... } + 0x0190: (StorageRaw) { + Size: 4 + String: .... } + 0x0200: (StorageRaw) { + Size: 4 + String: .... } + 0x0210: (StorageRaw) { + Size: 4 + String: .... } + 0x0220: (StorageRaw) { + Size: 4 + String: ..D; + Hex: a6 9b 44 3b } + 0x0230: (StorageRaw) { + Size: 4 + String: .O.> + Hex: df 4f 0d 3e } + 0x0240: (StorageRaw) { + Size: 4 + String: .... + Hex: f8 ff df 0f } + 0x0250: (StorageRaw) { + Size: 4 + String: .... + Hex: c0 ff 01 00 } + 0x0260: (StorageRaw) { + Size: 8 + String: ........ } + 0x0270: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0280: (StorageRaw) { + Size: 4 + String: .... } + 0x0310: (StorageRaw) { + Size: 4 + String: .... } + 0x0290: (StorageRaw) { + Size: 0 + String: } + 0x0390: (StorageRaw) { + Size: 14 + String: d.e.f.a.u.l.t. } + 0x0300: (StorageContainer) { + 0x0100: (StorageRaw) { + Size: 4 + String: .... } } + 0x0330: (StorageRaw) { + Size: 16 + String: ................ } } } +0x20a5: (StorageContainer) { + 0x0000: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0001: (StorageContainer) { + 0x0000: (StorageRaw) { + Size: 4 + String: *... } + 0x0001: (StorageRaw) { + Size: 9 + String: StateName } + 0x0002: (StorageRaw) { + Size: 10 + String: FormStates } + 0x0003: (StorageRaw) { + Size: 12 + String: InstanceName } + 0x0004: (StorageRaw) { + Size: 18 + String: Container Explorer } + 0x0005: (StorageRaw) { + Size: 19 + String: VisibleColumnsCount } + 0x0006: (StorageRaw) { + Size: 1 + String: 7 } + 0x0007: (StorageRaw) { + Size: 14 + String: VisibleColumns } + 0x0008: (StorageRaw) { + Size: 133 + String: Name,Container Open,Container Loaded,Container Override,Container Local Definition,Container Source Definition,Container Source Rules } + 0x0009: (StorageRaw) { + Size: 11 + String: ColumnWidth } + 0x000a: (StorageRaw) { + Size: 25 + String: 165,52,63,116,153,169,114 } + 0x000b: (StorageRaw) { + Size: 14 + String: SelectChildren } + 0x000c: (StorageRaw) { + Size: 5 + String: False } + 0x000d: (StorageRaw) { + Size: 14 + String: EditingEnabled } + 0x000e: (StorageRaw) { + Size: 4 + String: True } + 0x000f: (StorageRaw) { + Size: 13 + String: ShowHierarchy } + 0x0010: (StorageRaw) { + Size: 4 + String: True } + 0x0011: (StorageRaw) { + Size: 24 + String: AdvancedFilterDataSource } + 0x0012: (StorageRaw) { + Size: 0 + String: } + 0x0013: (StorageRaw) { + Size: 21 + String: AdvancedFilterEnabled } + 0x0014: (StorageRaw) { + Size: 5 + String: False } + 0x0015: (StorageRaw) { + Size: 22 + String: AdvancedFilterMatchAll } + 0x0016: (StorageRaw) { + Size: 4 + String: True } + 0x0017: (StorageRaw) { + Size: 16 + String: FindToolbarState } + 0x0018: (StorageRaw) { + Size: 4 + String: True } + 0x0019: (StorageRaw) { + Size: 24 + String: ViewSelectorToolbarState } + 0x001a: (StorageRaw) { + Size: 4 + String: True } + 0x001b: (StorageRaw) { + Size: 21 + String: SelectionToolbarState } + 0x001c: (StorageRaw) { + Size: 4 + String: True } + 0x001d: (StorageRaw) { + Size: 17 + String: ToolsToolbarState } + 0x001e: (StorageRaw) { + Size: 4 + String: True } + 0x001f: (StorageRaw) { + Size: 17 + String: DisplayInfluences } + 0x0020: (StorageRaw) { + Size: 5 + String: False } + 0x0021: (StorageRaw) { + Size: 16 + String: SelectInfluences } + 0x0022: (StorageRaw) { + Size: 5 + String: False } + 0x0023: (StorageRaw) { + Size: 16 + String: SelectDependents } + 0x0024: (StorageRaw) { + Size: 5 + String: False } + 0x0025: (StorageRaw) { + Size: 15 + String: FindStyleOption } + 0x0026: (StorageRaw) { + Size: 9 + String: Wildcards } + 0x0027: (StorageRaw) { + Size: 13 + String: ToolBarLayout } + 0x0028: (StorageRaw) { + Size: 10 + String: Horizontal } + 0x0029: (StorageRaw) { + Size: 17 + String: FindCaseSensitive } + 0x002a: (StorageRaw) { + Size: 5 + String: False } + 0x002b: (StorageRaw) { + Size: 13 + String: SyncSelection } + 0x002c: (StorageRaw) { + Size: 4 + String: True } + 0x002d: (StorageRaw) { + Size: 23 + String: ShowDependenciesEnabled } + 0x002e: (StorageRaw) { + Size: 5 + String: False } + 0x002f: (StorageRaw) { + Size: 25 + String: FilterSelectionSetEnabled } + 0x0030: (StorageRaw) { + Size: 5 + String: False } + 0x0031: (StorageRaw) { + Size: 19 + String: DisplayToolbarState } + 0x0032: (StorageRaw) { + Size: 4 + String: True } + 0x0033: (StorageRaw) { + Size: 21 + String: ContainerToolbarState } + 0x0034: (StorageRaw) { + Size: 4 + String: True } + 0x0035: (StorageRaw) { + Size: 15 + String: FormWindowState } + 0x0036: (StorageRaw) { + Size: 6 + String: Normal } + 0x0037: (StorageRaw) { + Size: 8 + String: FormSize } + 0x0038: (StorageRaw) { + Size: 7 + String: 844,355 } + 0x0039: (StorageRaw) { + Size: 12 + String: FormLocation } + 0x003a: (StorageRaw) { + Size: 7 + String: 100,100 } + 0x003b: (StorageRaw) { + Size: 16 + String: ColumnSortStates } + 0x003c: (StorageRaw) { + Size: 0 + String: } + 0x003d: (StorageRaw) { + Size: 8 + String: Geometry } + 0x003e: (StorageRaw) { + Size: 4 + String: True } + 0x003f: (StorageRaw) { + Size: 5 + String: Shape } + 0x0040: (StorageRaw) { + Size: 4 + String: True } + 0x0041: (StorageRaw) { + Size: 5 + String: Light } + 0x0042: (StorageRaw) { + Size: 4 + String: True } + 0x0043: (StorageRaw) { + Size: 6 + String: Camera } + 0x0044: (StorageRaw) { + Size: 4 + String: True } + 0x0045: (StorageRaw) { + Size: 6 + String: Helper } + 0x0046: (StorageRaw) { + Size: 4 + String: True } + 0x0047: (StorageRaw) { + Size: 9 + String: SpaceWarp } + 0x0048: (StorageRaw) { + Size: 4 + String: True } + 0x0049: (StorageRaw) { + Size: 5 + String: Group } + 0x004a: (StorageRaw) { + Size: 4 + String: True } + 0x004b: (StorageRaw) { + Size: 4 + String: Xref } + 0x004c: (StorageRaw) { + Size: 4 + String: True } + 0x004d: (StorageRaw) { + Size: 4 + String: Bone } + 0x004e: (StorageRaw) { + Size: 4 + String: True } + 0x004f: (StorageRaw) { + Size: 9 + String: Container } + 0x0050: (StorageRaw) { + Size: 4 + String: True } + 0x0051: (StorageRaw) { + Size: 6 + String: Frozen } + 0x0052: (StorageRaw) { + Size: 5 + String: False } + 0x0053: (StorageRaw) { + Size: 6 + String: Hidden } + 0x0054: (StorageRaw) { + Size: 5 + String: False } + 0x0002: (StorageRaw) { + Size: 1 + String: . } + 0x0003: (StorageRaw) { + Size: 1 + String: . } } } +0x20a6: (StorageContainer) { + 0x0000: (StorageContainer) { + 0x0001: (StorageRaw) { + Size: 4 + String: .... } } } +0x2190: (StorageContainer) { + 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0110: (StorageContainer) { + 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 0e 08 00 00 } + 0x0410: (StorageRaw) { + Size: 4 + String: .... } + 0x0420: (StorageRaw) { + Size: 4 + String: .... } + 0x0510: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 } + 0x0440: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0530: (StorageRaw) { + Size: 4 + String: .... } + 0x0110: (StorageRaw) { + Size: 0 + String: } + 0x0120: (StorageRaw) { + Size: 16 + String: ................ } + 0x0140: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x0150: (StorageRaw) { + Size: 8 + String: ........ } + 0x0160: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0170: (StorageRaw) { + Size: 4 + String: .... } + 0x0210: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0520: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0250: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0260: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0270: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0280: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0290: (StorageRaw) { + Size: 4 + String: .... + Hex: 0a 00 00 00 } + 0x0300: (StorageRaw) { + Size: 4 + String: .... } + 0x0310: (StorageRaw) { + Size: 4 + String: .... } + 0x0320: (StorageRaw) { + Size: 0 + String: } + 0x0380: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x0390: (StorageRaw) { + Size: 4 + String: .... } + 0x0400: (StorageRaw) { + Size: 4 + String: .... } + 0x0540: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0550: (StorageRaw) { + Size: 4 + String: .... } } } +0x20b0: (StorageContainer) { + 0x0010: (StorageRaw) { + Size: 4 + String: .... + Hex: 1e 00 00 00 } + 0x0020: (StorageRaw) { + Size: 4 + String: .... } + 0x0030: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0050: (StorageRaw) { + Size: 4 + String: .... } + 0x0060: (StorageRaw) { + Size: 4 + String: .%.. + Hex: 80 25 00 00 } + 0x0070: (StorageRaw) { + Size: 4 + String: .... } + 0x0100: (StorageContainer) { + 0x0090: (StorageRaw) { + Size: 4 + String: .... } } + 0x0110: (StorageRaw) { + Size: 4 + String: .... } + 0x0120: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } +0x2130: (StorageContainer) { + 0x0100: (StorageRaw) { + Size: 0 + String: } + 0x0120: (StorageRaw) { + Size: 0 + String: } + 0x0110: (StorageContainer) { + 0x0100: (StorageRaw) { + Size: 4 + String: .... } + 0x0200: (StorageRaw) { + Size: 4 + String: .... } + 0x0400: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0300: (StorageContainer) { + 0x0100: (StorageRaw) { + Size: 11 + String: ........... + Hex: 07 00 00 00 df f8 fc e8 f0 f8 9d } + 0x0110: (StorageRaw) { + Size: 12 + String: ............ + Hex: 08 00 00 00 dc cf d3 dc c8 d9 df 9d } + 0x0120: (StorageRaw) { + Size: 17 + String: ................. + Hex: 0d 00 00 00 ab a9 ad b0 ad ac ad aa a9 ae ac a8 9d } + 0x0130: (StorageRaw) { + Size: 12 + String: ..,.:.{...J. + Hex: 94 b5 2c 0f 3a c5 7b 02 e9 a7 4a d8 } + 0x0140: (StorageRaw) { + Size: 12 + String: ............ + Hex: 08 00 00 00 d6 fc f8 e9 f8 f0 f4 9d } + 0x0150: (StorageRaw) { + Size: 12 + String: ............ + Hex: 08 00 00 00 d6 dc d8 d9 d8 d1 d1 9d } + 0x0160: (StorageRaw) { + Size: 17 + String: ................. + Hex: 0d 00 00 00 ae a8 a4 b0 ad ab ad aa a9 ab a5 ac 9d } + 0x0170: (StorageRaw) { + Size: 12 + String: %%%-%%%%%%%% } } } } +0x2080: (StorageContainer) { + 0x2801: (StorageRaw) { + Size: 4 + String: .... } + 0x2900: (StorageRaw) { + Size: 4 + String: c... } + 0x2954: (StorageRaw) { + Size: 0 + String: } + 0x2827: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 0a 00 00 } + 0x2828: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 0a 00 00 } + 0x3010: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x3011: (StorageRaw) { + Size: 4 + String: .... } + 0x3012: (StorageRaw) { + Size: 4 + String: .... } + 0x3013: (StorageRaw) { + Size: 4 + String: .... } + 0x3014: (StorageRaw) { + Size: 4 + String: fff? } + 0x3015: (StorageRaw) { + Size: 4 + String: fff? } + 0x3016: (StorageRaw) { + Size: 4 + String: fff? } + 0x3017: (StorageRaw) { + Size: 4 + String: ..L? + Hex: cd cc 4c 3f } + 0x3018: (StorageRaw) { + Size: 4 + String: ..L? + Hex: cd cc 4c 3f } + 0x3019: (StorageRaw) { + Size: 4 + String: ..L? + Hex: cd cc 4c 3f } + 0x301a: (StorageRaw) { + Size: 4 + String: 333? } + 0x301b: (StorageRaw) { + Size: 4 + String: 333? } + 0x301c: (StorageRaw) { + Size: 4 + String: 333? } + 0x301d: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x301e: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x301f: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x3020: (StorageRaw) { + Size: 4 + String: .... } + 0x3022: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28fa: (StorageRaw) { + Size: 896 + String: ...............?...............?...............?...............................................................................?...............?...............?...............................................................................?...............?...............?...............................................................................?...............?...............?...............................................................................?...............?...............?...............................................................................?...............?...............?...............................................................................?...............?...............?...............................................................................?...............?...............?................................................................ + Hex: 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x2910: (StorageRaw) { + Size: 80 + String: ...........?...............?...............?.................................... + Hex: 01 00 00 00 0b 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x2911: (StorageRaw) { + Size: 80 + String: ...........?...............?...............?...............?.................... + Hex: 01 00 00 00 02 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x2912: (StorageRaw) { + Size: 80 + String: ..........5?...>q.....5....>q.........]?...>..........z...I?..zC................ + Hex: 00 00 00 00 07 00 00 00 f3 04 35 3f f2 04 b5 3e 71 c4 1c bf f3 04 35 bf f2 04 b5 3e 71 c4 1c bf 00 00 00 00 d8 b3 5d 3f ff ff ff 3e 00 00 00 00 00 00 00 00 00 00 7a c3 db 0f 49 3f 00 00 7a 43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x2930: (StorageRaw) { + Size: 4 + String: .... } + 0x2931: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x2932: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x2800: (StorageRaw) { + Size: 4 + String: t... } + 0x2810: (StorageRaw) { + Size: 80 + String: ...........?...............?...............?..Z:..........C9.................... + Hex: 01 00 00 00 02 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 b4 5a 3a 00 ed 1f ba 00 00 00 00 00 89 43 39 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x2811: (StorageRaw) { + Size: 80 + String: ...........?..............;............?..;................?.................... + Hex: 01 00 00 00 04 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 80 00 00 00 00 2e bd 3b b3 00 00 80 bf 00 00 00 00 00 00 80 3f 2e bd 3b b3 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x2812: (StorageRaw) { + Size: 80 + String: ..........;...............;...;3..;....?...'.x_;M.......H.%9.................... + Hex: 01 00 00 00 00 00 00 00 2e bd 3b b3 00 00 00 00 00 00 80 bf 00 00 80 bf 2e bd 3b b3 2e bd 3b 33 2e bd 3b b3 00 00 80 3f ed ad 09 27 00 78 5f 3b 4d b0 c1 bf 00 00 00 00 48 b0 25 39 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x2813: (StorageRaw) { + Size: 80 + String: ..............6.8.:..:;..z*=TD.?.. 78..?W.y.1.R>Qu....k...I?[.n@................ + Hex: 00 00 00 00 07 00 00 00 90 97 2e bf c3 c4 36 bd 38 e1 3a bf a1 3a 3b bf c8 7a 2a 3d 54 44 2e 3f 00 00 20 37 38 86 7f 3f 57 ee 79 bd 31 da 52 3e 51 75 19 bf a4 97 6b c0 db 0f 49 3f 5b 9d 6e 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x3040: (StorageRaw) { + Size: 12 + String: ...@...?...? } + 0x2876: (StorageRaw) { + Size: 76 + String: {.0.0.0.0.0.0.0.0.-.0.0.0.0.-.0.0.0.0.-.0.0.0.0.-.0.0.0.0.0.0.0.0.0.0.0.0.}. } + 0x3000: (StorageRaw) { + Size: 4 + String: .... } + 0x2830: (StorageRaw) { + Size: 4 + String: .... + Hex: 08 00 00 00 } + 0x283a: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x2836: (StorageRaw) { + Size: 4 + String: .... } + 0x2840: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28f4: (StorageRaw) { + Size: 4 + String: .... + Hex: ff ff ff ff } + 0x2846: (StorageRaw) { + Size: 4 + String: .... } + 0x0002: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0000: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0005: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x4270: (StorageRaw) { + Size: 4 + String: .... } + 0x2870: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x2861: (StorageRaw) { + Size: 4 + String: .... } + 0x2890: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 0x28a0: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 0x28b1: (StorageRaw) { + Size: 4 + String: .... } + 0x28b5: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28c1: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28c5: (StorageRaw) { + Size: 4 + String: .... + Hex: 10 00 00 00 } + 0x28c9: (StorageRaw) { + Size: 4 + String: ... } + 0x3030: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 00 05 00 00 00 } + 0x28cd: (StorageRaw) { + Size: 4 + String: .... } + 0x3054: (StorageRaw) { + Size: 4 + String: .... } + 0x305c: (StorageRaw) { + Size: 4 + String: .... } + 0x3058: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 01 00 } + 0x3060: (StorageRaw) { + Size: 4 + String: .... } + 0x3064: (StorageRaw) { + Size: 4 + String: .... } + 0x3068: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4080: (StorageRaw) { + Size: 4 + String: .... } + 0x4000: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x4040: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4100: (StorageRaw) { + Size: 40 + String: ........................................ + Hex: 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 1e 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x3004: (StorageRaw) { + Size: 12 + String: ..d......... + Hex: d6 cd 64 c0 fa cf c0 c0 00 00 00 00 } + 0x3008: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4110: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x3041: (StorageRaw) { + Size: 12 + String: ...@...?...? } + 0x2877: (StorageRaw) { + Size: 76 + String: {.0.0.0.0.0.0.0.0.-.0.0.0.0.-.0.0.0.0.-.0.0.0.0.-.0.0.0.0.0.0.0.0.0.0.0.0.}. } + 0x3001: (StorageRaw) { + Size: 4 + String: .... } + 0x2831: (StorageRaw) { + Size: 4 + String: .... + Hex: 08 00 00 00 } + 0x283b: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x2837: (StorageRaw) { + Size: 4 + String: .... } + 0x2841: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28f5: (StorageRaw) { + Size: 4 + String: .... + Hex: ff ff ff ff } + 0x2847: (StorageRaw) { + Size: 4 + String: .... } + 0x0002: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0000: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0005: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x4271: (StorageRaw) { + Size: 4 + String: .... } + 0x2871: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x2862: (StorageRaw) { + Size: 4 + String: .... } + 0x2891: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 0x28a1: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 0x28b2: (StorageRaw) { + Size: 4 + String: .... } + 0x28b6: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28c2: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28c6: (StorageRaw) { + Size: 4 + String: .... + Hex: 10 00 00 00 } + 0x28ca: (StorageRaw) { + Size: 4 + String: ... } + 0x3031: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 00 05 00 00 00 } + 0x28ce: (StorageRaw) { + Size: 4 + String: .... } + 0x3055: (StorageRaw) { + Size: 4 + String: .... } + 0x305d: (StorageRaw) { + Size: 4 + String: .... } + 0x3059: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 01 00 } + 0x3061: (StorageRaw) { + Size: 4 + String: .... } + 0x3065: (StorageRaw) { + Size: 4 + String: .... } + 0x3069: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4081: (StorageRaw) { + Size: 4 + String: .... } + 0x4001: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x4041: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4101: (StorageRaw) { + Size: 40 + String: ........................................ + Hex: 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 1e 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x3005: (StorageRaw) { + Size: 12 + String: S...Y.&..... + Hex: 53 ea c5 c4 59 c8 26 c5 00 00 00 00 } + 0x3009: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4111: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x3042: (StorageRaw) { + Size: 12 + String: ...@...?...? } + 0x2878: (StorageRaw) { + Size: 76 + String: {.0.0.0.0.0.0.0.0.-.0.0.0.0.-.0.0.0.0.-.0.0.0.0.-.0.0.0.0.0.0.0.0.0.0.0.0.}. } + 0x3002: (StorageRaw) { + Size: 4 + String: .... } + 0x2832: (StorageRaw) { + Size: 4 + String: .... + Hex: 08 00 00 00 } + 0x283c: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x2838: (StorageRaw) { + Size: 4 + String: .... } + 0x2842: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28f6: (StorageRaw) { + Size: 4 + String: .... + Hex: ff ff ff ff } + 0x2848: (StorageRaw) { + Size: 4 + String: .... } + 0x0002: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0000: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0005: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x4272: (StorageRaw) { + Size: 4 + String: .... } + 0x2872: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x2863: (StorageRaw) { + Size: 4 + String: .... } + 0x2892: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 0x28a2: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 0x28b3: (StorageRaw) { + Size: 4 + String: .... } + 0x28b7: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28c3: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28c7: (StorageRaw) { + Size: 4 + String: .... + Hex: 10 00 00 00 } + 0x28cb: (StorageRaw) { + Size: 4 + String: ... } + 0x3032: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 00 05 00 00 00 } + 0x28cf: (StorageRaw) { + Size: 4 + String: .... } + 0x3056: (StorageRaw) { + Size: 4 + String: .... } + 0x305e: (StorageRaw) { + Size: 4 + String: .... } + 0x305a: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 01 00 } + 0x3062: (StorageRaw) { + Size: 4 + String: .... } + 0x3066: (StorageRaw) { + Size: 4 + String: .... } + 0x306a: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4082: (StorageRaw) { + Size: 4 + String: .... } + 0x4002: (StorageRaw) { + Size: 4 + String: .... + Hex: 10 00 00 00 } + 0x4042: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4102: (StorageRaw) { + Size: 40 + String: ........................................ + Hex: 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 1e 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x3006: (StorageRaw) { + Size: 12 + String: ............ + Hex: 8f 02 87 c0 84 8b e3 c0 00 00 00 00 } + 0x300a: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4112: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x3043: (StorageRaw) { + Size: 12 + String: ...@...?...? } + 0x2879: (StorageRaw) { + Size: 76 + String: {.0.0.0.0.0.0.0.0.-.0.0.0.0.-.0.0.0.0.-.0.0.0.0.-.0.0.0.0.0.0.0.0.0.0.0.0.}. } + 0x3003: (StorageRaw) { + Size: 4 + String: .... } + 0x2833: (StorageRaw) { + Size: 4 + String: .... } + 0x283d: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x2839: (StorageRaw) { + Size: 4 + String: .... } + 0x2843: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28f7: (StorageRaw) { + Size: 4 + String: .... + Hex: ff ff ff ff } + 0x2849: (StorageRaw) { + Size: 4 + String: .... } + 0x0002: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0000: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0005: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x4273: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x2873: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x2864: (StorageRaw) { + Size: 4 + String: .... } + 0x2893: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 0x28a3: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 0x28b4: (StorageRaw) { + Size: 4 + String: .... } + 0x28b8: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28c4: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x28c8: (StorageRaw) { + Size: 4 + String: .... + Hex: 10 00 00 00 } + 0x28cc: (StorageRaw) { + Size: 4 + String: ... } + 0x3033: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 00 05 00 00 00 } + 0x28d0: (StorageRaw) { + Size: 4 + String: .... } + 0x3057: (StorageRaw) { + Size: 4 + String: .... } + 0x305f: (StorageRaw) { + Size: 4 + String: .... } + 0x305b: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 01 00 } + 0x3063: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x3067: (StorageRaw) { + Size: 4 + String: .... + Hex: a9 f1 83 bd } + 0x306b: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4083: (StorageRaw) { + Size: 4 + String: .... } + 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 10 00 00 00 } + 0x4043: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x4103: (StorageRaw) { + Size: 40 + String: ........................................ + Hex: 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 1e 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x3007: (StorageRaw) { + Size: 12 + String: >....G...... + Hex: 3e c3 2e ba e9 47 93 ba 00 00 00 00 } + 0x300b: (StorageRaw) { + Size: 4 + String: ...? + Hex: 83 f9 a2 3f } + 0x4113: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x2820: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 } + 0x2821: (StorageRaw) { + Size: 0 + String: } + 0x2826: (StorageRaw) { + Size: 4 + String: F.L. } + 0x2825: (StorageRaw) { + Size: 28 + String: ......................%D.... + Hex: 00 00 00 00 02 00 00 00 04 00 00 00 06 00 00 00 00 00 00 00 00 00 25 44 01 00 00 00 } + 0x3038: (StorageRaw) { + Size: 60 + String: ....................2...>................................... + Hex: 00 00 00 00 00 00 00 00 ff ff ff ff 01 00 00 00 00 00 00 00 32 00 00 00 3e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 } + 0x4114: (StorageRaw) { + Size: 4 + String: .... } + 0x4115: (StorageRaw) { + Size: 12 + String: ...?...?...? } + 0x4300: (StorageRaw) { + Size: 8 + String: .......? + Hex: 02 00 00 00 00 00 80 3f } + 0x4600: (StorageRaw) { + Size: 32 + String: .. A................(......=fff? + Hex: 00 00 20 41 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 28 00 00 00 cd cc cc 3d 66 66 66 3f } + 0x4620: (StorageRaw) { + Size: 4 + String: o..: + Hex: 6f 12 83 3a } + 0x4630: (StorageContainer) { + 0x0001: (StorageContainer) { + 0x0002: (StorageRaw) { + Size: 1 + String: . } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: .... } + 0x0005: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 4 + String: ...A + Hex: 00 00 f0 41 } + 0x000c: (StorageRaw) { + Size: 4 + String: ...= + Hex: cd cc cc 3d } + 0x0008: (StorageRaw) { + Size: 4 + String: .... } + 0x0009: (StorageRaw) { + Size: 1 + String: . } + 0x000a: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + 0x000b: (StorageRaw) { + Size: 1 + String: . } } } + 0x4620: (StorageRaw) { + Size: 4 + String: o..: + Hex: 6f 12 83 3a } + 0x4630: (StorageContainer) { + 0x0001: (StorageContainer) { + 0x0002: (StorageRaw) { + Size: 1 + String: . } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: .... } + 0x0005: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 4 + String: ...A + Hex: 00 00 f0 41 } + 0x000c: (StorageRaw) { + Size: 4 + String: ...= + Hex: cd cc cc 3d } + 0x0008: (StorageRaw) { + Size: 4 + String: .... } + 0x0009: (StorageRaw) { + Size: 1 + String: . } + 0x000a: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + 0x000b: (StorageRaw) { + Size: 1 + String: . } } } + 0x4620: (StorageRaw) { + Size: 4 + String: o..: + Hex: 6f 12 83 3a } + 0x4630: (StorageContainer) { + 0x0001: (StorageContainer) { + 0x0002: (StorageRaw) { + Size: 1 + String: . } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: .... } + 0x0005: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 4 + String: ...A + Hex: 00 00 f0 41 } + 0x000c: (StorageRaw) { + Size: 4 + String: ...= + Hex: cd cc cc 3d } + 0x0008: (StorageRaw) { + Size: 4 + String: .... } + 0x0009: (StorageRaw) { + Size: 1 + String: . } + 0x000a: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + 0x000b: (StorageRaw) { + Size: 1 + String: . } } } + 0x4620: (StorageRaw) { + Size: 4 + String: o..: + Hex: 6f 12 83 3a } + 0x4630: (StorageContainer) { + 0x0001: (StorageContainer) { + 0x0002: (StorageRaw) { + Size: 1 + String: . } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: .... } + 0x0005: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 4 + String: ...A + Hex: 00 00 f0 41 } + 0x000c: (StorageRaw) { + Size: 4 + String: ...= + Hex: cd cc cc 3d } + 0x0008: (StorageRaw) { + Size: 4 + String: .... } + 0x0009: (StorageRaw) { + Size: 1 + String: . } + 0x000a: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + 0x000b: (StorageRaw) { + Size: 1 + String: . } } } + 0x4640: (StorageRaw) { + Size: 5 + String: ....? + Hex: 01 00 00 80 3f } } +0x20d0: (StorageContainer) { + 0x0005: (StorageRaw) { + Size: 20 + String: .................... + Hex: 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0002: (StorageRaw) { + Size: 4 + String: ... + Hex: 20 12 00 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... } + 0x0004: (StorageRaw) { + Size: 4 + String: ... + Hex: 20 12 00 00 } + 0x0010: (StorageRaw) { + Size: 4 + String: .... + Hex: 80 02 00 00 } + 0x0020: (StorageRaw) { + Size: 4 + String: .... + Hex: e0 01 00 00 } + 0x0030: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x0031: (StorageRaw) { + Size: 4 + String: .... } } +0x2160: (StorageContainer) { + 0x0100: (StorageRaw) { + Size: 12 + String: .......@...@ + Hex: 00 00 00 00 cd cc 0c 40 cd cc 0c 40 } + 0x0200: (StorageRaw) { + Size: 8 + String: ........ + Hex: 01 00 00 00 01 00 00 00 } + 0x0300: (StorageRaw) { + Size: 28 + String: ............................ + Hex: 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 0f 00 00 00 00 00 00 00 00 00 00 00 } + 0x0400: (StorageRaw) { + Size: 4 + String: .... + Hex: 10 00 00 00 } + 0x0500: (StorageRaw) { + Size: 4 + String: .... + Hex: 14 00 00 00 } } +0x21a0: (StorageContainer) { + 0x1a00: (StorageRaw) { + Size: 8 + String: .[&<...9 + Hex: e3 5b 26 3c 1d 15 cd 39 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: ..8J$.D: + Hex: bc 04 38 4a 24 06 44 3a } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .{.d.C.. + Hex: 0d 7b c4 64 00 43 b3 1e } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: lL.8.C.. + Hex: 6c 4c e6 38 00 43 b3 1e } + 0x1a02: (StorageContainer) { + 0x1e61: (StorageRaw) { + Size: 4 + String: .... + Hex: 07 00 00 00 } } + 0x1a00: (StorageRaw) { + Size: 8 + String: .+@...,f + Hex: 9d 2b 40 2e 80 14 2c 66 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .6).I@,I + Hex: 14 36 29 01 49 40 2c 49 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: ..e[...T + Hex: f1 01 65 5b fc 14 96 54 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .:.Am..M + Hex: e5 3a 89 41 6d 0c 95 4d } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .s.r.w.( + Hex: 11 73 cd 72 0f 77 fb 28 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .Fhi.x.B + Hex: fd 46 68 69 ab 78 9c 42 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .=.=.nH. + Hex: 1b 3d d9 3d 19 6e 48 0e } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: `{.{a... + Hex: 60 7b f7 7b 61 09 13 16 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: _..i\.E` + Hex: 5f ea ad 69 5c 2e 45 60 } + 0x1a02: (StorageContainer) { + 0x0001: (StorageContainer) { + 0x0002: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x001a: (StorageRaw) { + Size: 8 + String: ........ } + 0x001b: (StorageRaw) { + Size: 8 + String: ........ } + 0x001c: (StorageRaw) { + Size: 8 + String: ........ } + 0x001d: (StorageRaw) { + Size: 8 + String: ..... c. + Hex: 00 00 00 00 00 20 63 c0 } + 0x001e: (StorageRaw) { + Size: 8 + String: .....@_@ } + 0x001f: (StorageRaw) { + Size: 8 + String: ..... c@ } + 0x0020: (StorageRaw) { + Size: 8 + String: ........ } + 0x0021: (StorageRaw) { + Size: 8 + String: .......? + Hex: 00 00 00 00 00 00 f0 3f } + 0x0022: (StorageRaw) { + Size: 8 + String: ........ } + 0x0023: (StorageRaw) { + Size: 8 + String: ........ } + 0x0024: (StorageRaw) { + Size: 8 + String: ........ } + 0x0025: (StorageRaw) { + Size: 8 + String: ........ } + 0x0026: (StorageRaw) { + Size: 8 + String: ......F@ + Hex: 00 00 00 00 00 80 46 40 } + 0x0027: (StorageRaw) { + Size: 8 + String: ......F@ + Hex: 00 00 00 00 00 80 46 40 } + 0x0028: (StorageRaw) { + Size: 8 + String: .....@.@ + Hex: 00 00 00 00 00 40 7f 40 } + 0x0029: (StorageRaw) { + Size: 8 + String: .....@.@ + Hex: 00 00 00 00 00 40 7f 40 } + 0x002a: (StorageRaw) { + Size: 8 + String: ........ } + 0x002b: (StorageRaw) { + Size: 8 + String: ........ } + 0x002c: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 00 00 00 f0 bf } + 0x002d: (StorageRaw) { + Size: 8 + String: ........ } + 0x002e: (StorageRaw) { + Size: 8 + String: .......? + Hex: 00 00 00 00 00 00 f0 3f } + 0x002f: (StorageRaw) { + Size: 8 + String: ........ } } } + 0x1a00: (StorageRaw) { + Size: 8 + String: .....J2 + Hex: 95 87 c1 b0 04 4a 32 20 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .kHE&... + Hex: d4 6b 48 45 26 8a a3 85 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: EULB..KR + Hex: 45 55 4c 42 04 00 4b 52 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .$.X.._h + Hex: c8 24 14 58 b5 0f 5f 68 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .Z.J.d.H + Hex: f4 5a 81 4a 03 64 c5 48 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: s<.j.!.E + Hex: 73 3c 1e 6a 92 21 b7 45 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .54F8He. + Hex: 1d 35 34 46 38 48 65 11 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .oa..r.7 + Hex: db 6f 61 12 9d 72 ef 37 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: $5.z...I + Hex: 24 35 9f 7a b5 04 c8 49 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .{m..'.& + Hex: c3 7b 6d 11 b6 27 82 26 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: En.9$P.. + Hex: 45 6e ba 39 24 50 cf 1f } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: D..TW.+J + Hex: 44 1f dd 54 57 0b 2b 4a } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .=+..Q.o + Hex: 07 3d 2b 1c 04 51 ab 6f } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: F.L1.... + Hex: 46 0d 4c 31 ab 10 07 1c } + 0x1a02: (StorageContainer) { + 0x5000: (StorageRaw) { + Size: 1 + String: . } + 0x5004: (StorageRaw) { + Size: 1 + String: . } + 0x5001: (StorageRaw) { + Size: 1 + String: . } + 0x5002: (StorageRaw) { + Size: 0 + String: } + 0x5003: (StorageRaw) { + Size: 0 + String: } + 0x5005: (StorageRaw) { + Size: 0 + String: } } + 0x1a00: (StorageRaw) { + Size: 8 + String: .....K3! + Hex: 06 97 c1 c0 c4 4b 33 21 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: z+-..~Uk + Hex: 7a 2b 2d 05 b1 7e 55 6b } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: e..D.~J. + Hex: 65 ab d1 44 b4 7e 4a 2e } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: Td.w...g + Hex: 54 64 eb 77 09 dc 05 67 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: I..2G..% + Hex: 49 b4 8e 32 47 89 dc 25 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: ...-./.\ + Hex: c1 0a c0 2d 13 2f 9f 5c } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: M[.9~..t + Hex: 4d 5b aa 39 7e 15 c1 74 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: ...?tQ.r + Hex: eb c9 b6 3f 74 51 bd 72 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .x.a_..m + Hex: 9d 78 c2 61 5f 02 c3 6d } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: oK.`Y..) + Hex: 6f 4b b7 60 59 08 8c 29 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: a*...... + Hex: 61 2a eb c8 85 c6 c3 8a } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: ...W...Y + Hex: dc dc ab 57 dc dc 05 59 } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: ..c(A.0[ + Hex: e0 08 63 28 41 9c 30 5b } + 0x1a02: (StorageRaw) { + Size: 0 + String: } + 0x1a00: (StorageRaw) { + Size: 8 + String: .<.:..=] + Hex: f3 3c 1c 3a e7 b5 3d 5d } + 0x1a02: (StorageContainer) { + 0x0001: (StorageContainer) { + 0x0002: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0010: (StorageRaw) { + Size: 4 + String: ..pA } + 0x0013: (StorageRaw) { + Size: 4 + String: ..HB } + 0x0014: (StorageRaw) { + Size: 1 + String: . } + 0x0015: (StorageRaw) { + Size: 1 + String: . } + 0x0016: (StorageRaw) { + Size: 1 + String: . } } } } +0x2180: (StorageContainer) { + 0x0040: (StorageContainer) { + 0x0050: (StorageRaw) { + Size: 12 + String: ....._.d..+" + Hex: 00 0c 00 00 ec 5f c7 64 b9 9e 2b 22 } // 4 bytes superclassid, 12 bytes classid + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 09 00 00 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 0e 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....nlbp. + Hex: 05 00 00 00 6e 6c 62 70 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....rollout. + Hex: 08 00 00 00 72 6f 6c 6c 6f 75 74 00 } + 0x0006: (StorageRaw) { + Size: 23 + String: ....nelBasicParameters. + Hex: 13 00 00 00 6e 65 6c 42 61 73 69 63 50 61 72 61 6d 65 74 65 72 73 00 } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 14 + String: ....bTwoSided. + Hex: 0a 00 00 00 62 54 77 6f 53 69 64 65 64 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 13 + String: ....cAmbient. + Hex: 09 00 00 00 63 41 6d 62 69 65 6e 74 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....color. + Hex: 06 00 00 00 63 6f 6c 6f 72 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 13 + String: ....cDiffuse. + Hex: 09 00 00 00 63 44 69 66 66 75 73 65 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....color. + Hex: 06 00 00 00 63 6f 6c 6f 72 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 13 + String: ....pOpacity. + Hex: 09 00 00 00 70 4f 70 61 63 69 74 79 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....percent. + Hex: 08 00 00 00 70 65 72 63 65 6e 74 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 14 + String: ....cSpecular. + Hex: 0a 00 00 00 63 53 70 65 63 75 6c 61 72 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....color. + Hex: 06 00 00 00 63 6f 6c 6f 72 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 19 + String: ....pSpecularLevel. + Hex: 0f 00 00 00 70 53 70 65 63 75 6c 61 72 4c 65 76 65 6c 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....percent. + Hex: 08 00 00 00 70 65 72 63 65 6e 74 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....pGlossiness. + Hex: 0c 00 00 00 70 47 6c 6f 73 73 69 6e 65 73 73 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....percent. + Hex: 08 00 00 00 70 65 72 63 65 6e 74 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 20 + String: ....cSelfIllumColor. + Hex: 10 00 00 00 63 53 65 6c 66 49 6c 6c 75 6d 43 6f 6c 6f 72 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....color. + Hex: 06 00 00 00 63 6f 6c 6f 72 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 21 + String: ....pSelfIllumAmount. + Hex: 11 00 00 00 70 53 65 6c 66 49 6c 6c 75 6d 41 6d 6f 75 6e 74 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....percent. + Hex: 08 00 00 00 70 65 72 63 65 6e 74 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 23 + String: ....bUseSelfIllumColor. + Hex: 13 00 00 00 62 55 73 65 53 65 6c 66 49 6c 6c 75 6d 43 6f 6c 6f 72 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: )... } + 0x0006: (StorageRaw) { + Size: 9 + String: ....main. + Hex: 05 00 00 00 6d 61 69 6e 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....rollout. + Hex: 08 00 00 00 72 6f 6c 6c 6f 75 74 00 } + 0x0006: (StorageRaw) { + Size: 14 + String: ....NelParams. + Hex: 0a 00 00 00 4e 65 6c 50 61 72 61 6d 73 00 } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 14 + String: ....bLightMap. + Hex: 0a 00 00 00 62 4c 69 67 68 74 4d 61 70 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....bUnlighted. + Hex: 0b 00 00 00 62 55 6e 6c 69 67 68 74 65 64 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....cbUnlighted. + Hex: 0c 00 00 00 63 62 55 6e 6c 69 67 68 74 65 64 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....bStainedGlassWindow. + Hex: 14 00 00 00 62 53 74 61 69 6e 65 64 47 6c 61 73 73 57 69 6e 64 6f 77 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 25 + String: ....cbStainedGlassWindow. + Hex: 15 00 00 00 63 62 53 74 61 69 6e 65 64 47 6c 61 73 73 57 69 6e 64 6f 77 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....bAlphaTest. + Hex: 0b 00 00 00 62 41 6c 70 68 61 54 65 73 74 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....cbAlphaTest. + Hex: 0c 00 00 00 63 62 41 6c 70 68 61 54 65 73 74 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....bForceZWrite. + Hex: 0d 00 00 00 62 46 6f 72 63 65 5a 57 72 69 74 65 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 18 + String: ....cbForceZWrite. + Hex: 0e 00 00 00 63 62 46 6f 72 63 65 5a 57 72 69 74 65 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 19 + String: ....bForceNoZWrite. + Hex: 0f 00 00 00 62 46 6f 72 63 65 4e 6f 5a 57 72 69 74 65 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 20 + String: ....cbForceNoZWrite. + Hex: 10 00 00 00 63 62 46 6f 72 63 65 4e 6f 5a 57 72 69 74 65 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 11 + String: ....bWater. + Hex: 07 00 00 00 62 57 61 74 65 72 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 30 + String: ....bWaterUseSceneEnvMapAbove. + Hex: 1a 00 00 00 62 57 61 74 65 72 55 73 65 53 63 65 6e 65 45 6e 76 4d 61 70 41 62 6f 76 65 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 31 + String: ....cbWaterUseSceneEnvMapAbove. + Hex: 1b 00 00 00 63 62 57 61 74 65 72 55 73 65 53 63 65 6e 65 45 6e 76 4d 61 70 41 62 6f 76 65 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 30 + String: ....bWaterUseSceneEnvMapUnder. + Hex: 1a 00 00 00 62 57 61 74 65 72 55 73 65 53 63 65 6e 65 45 6e 76 4d 61 70 55 6e 64 65 72 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 31 + String: ....cbWaterUseSceneEnvMapUnder. + Hex: 1b 00 00 00 63 62 57 61 74 65 72 55 73 65 53 63 65 6e 65 45 6e 76 4d 61 70 55 6e 64 65 72 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....fBumpUScale. + Hex: 0c 00 00 00 66 42 75 6d 70 55 53 63 61 6c 65 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....float. + Hex: 06 00 00 00 66 6c 6f 61 74 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: ..#< + Hex: 0a d7 23 3c } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....cfBumpUScale. + Hex: 0d 00 00 00 63 66 42 75 6d 70 55 53 63 61 6c 65 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....fBumpVScale. + Hex: 0c 00 00 00 66 42 75 6d 70 56 53 63 61 6c 65 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....float. + Hex: 06 00 00 00 66 6c 6f 61 74 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: ..#< + Hex: 0a d7 23 3c } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....cfBumpVScale. + Hex: 0d 00 00 00 63 66 42 75 6d 70 56 53 63 61 6c 65 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....fBumpUSpeed. + Hex: 0c 00 00 00 66 42 75 6d 70 55 53 70 65 65 64 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....float. + Hex: 06 00 00 00 66 6c 6f 61 74 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: ..#< + Hex: 0a d7 23 3c } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....cfBumpUSpeed. + Hex: 0d 00 00 00 63 66 42 75 6d 70 55 53 70 65 65 64 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....fBumpVSpeed. + Hex: 0c 00 00 00 66 42 75 6d 70 56 53 70 65 65 64 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....float. + Hex: 06 00 00 00 66 6c 6f 61 74 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: ..#< + Hex: 0a d7 23 3c } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....cfBumpVSpeed. + Hex: 0d 00 00 00 63 66 42 75 6d 70 56 53 70 65 65 64 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 23 + String: ....fDisplaceMapUScale. + Hex: 13 00 00 00 66 44 69 73 70 6c 61 63 65 4d 61 70 55 53 63 61 6c 65 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....float. + Hex: 06 00 00 00 66 6c 6f 61 74 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: ...; + Hex: 0a d7 a3 3b } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....cfDisplaceMapUScale. + Hex: 14 00 00 00 63 66 44 69 73 70 6c 61 63 65 4d 61 70 55 53 63 61 6c 65 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 23 + String: ....fDisplaceMapVScale. + Hex: 13 00 00 00 66 44 69 73 70 6c 61 63 65 4d 61 70 56 53 63 61 6c 65 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....float. + Hex: 06 00 00 00 66 6c 6f 61 74 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: ...; + Hex: 0a d7 a3 3b } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....cfDisplaceMapVScale. + Hex: 14 00 00 00 63 66 44 69 73 70 6c 61 63 65 4d 61 70 56 53 63 61 6c 65 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 23 + String: ....fDisplaceMapUSpeed. + Hex: 13 00 00 00 66 44 69 73 70 6c 61 63 65 4d 61 70 55 53 70 65 65 64 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....float. + Hex: 06 00 00 00 66 6c 6f 61 74 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: ...; + Hex: 0a d7 a3 3b } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....cfDisplaceMapUSpeed. + Hex: 14 00 00 00 63 66 44 69 73 70 6c 61 63 65 4d 61 70 55 53 70 65 65 64 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 23 + String: ....fDisplaceMapVSpeed. + Hex: 13 00 00 00 66 44 69 73 70 6c 61 63 65 4d 61 70 56 53 70 65 65 64 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....float. + Hex: 06 00 00 00 66 6c 6f 61 74 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: ...; + Hex: 0a d7 a3 3b } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....cfDisplaceMapVSpeed. + Hex: 14 00 00 00 63 66 44 69 73 70 6c 61 63 65 4d 61 70 56 53 70 65 65 64 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 23 + String: ....fWaterHeightFactor. + Hex: 13 00 00 00 66 57 61 74 65 72 48 65 69 67 68 74 46 61 63 74 6f 72 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....float. + Hex: 06 00 00 00 66 6c 6f 61 74 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0004: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....cfWaterHeightFactor. + Hex: 14 00 00 00 63 66 57 61 74 65 72 48 65 69 67 68 74 46 61 63 74 6f 72 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....iWaterPoolID. + Hex: 0d 00 00 00 69 57 61 74 65 72 50 6f 6f 6c 49 44 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 18 + String: ....ciWaterPoolID. + Hex: 0e 00 00 00 63 69 57 61 74 65 72 50 6f 6f 6c 49 44 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 23 + String: ....bCalcWaterLightmap. + Hex: 13 00 00 00 62 43 61 6c 63 57 61 74 65 72 4c 69 67 68 74 6d 61 70 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....cbCalcWaterLightmap. + Hex: 14 00 00 00 63 62 43 61 6c 63 57 61 74 65 72 4c 69 67 68 74 6d 61 70 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 23 + String: ....bEnableWaterSplash. + Hex: 13 00 00 00 62 45 6e 61 62 6c 65 57 61 74 65 72 53 70 6c 61 73 68 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....cbEnableWaterSplash. + Hex: 14 00 00 00 63 62 45 6e 61 62 6c 65 57 61 74 65 72 53 70 6c 61 73 68 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....bColorVertex. + Hex: 0d 00 00 00 62 43 6f 6c 6f 72 56 65 72 74 65 78 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 18 + String: ....cbColorVertex. + Hex: 0e 00 00 00 63 62 43 6f 6c 6f 72 56 65 72 74 65 78 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....bAlphaVertex. + Hex: 0d 00 00 00 62 41 6c 70 68 61 56 65 72 74 65 78 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 18 + String: ....cbAlphaVertex. + Hex: 0e 00 00 00 63 62 41 6c 70 68 61 56 65 72 74 65 78 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....iAlphaVertexChannel. + Hex: 14 00 00 00 69 41 6c 70 68 61 56 65 72 74 65 78 43 68 61 6e 6e 65 6c 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 25 + String: ....ciAlphaVertexChannel. + Hex: 15 00 00 00 63 69 41 6c 70 68 61 56 65 72 74 65 78 43 68 61 6e 6e 65 6c 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....bAlphaBlend. + Hex: 0c 00 00 00 62 41 6c 70 68 61 42 6c 65 6e 64 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....cbAlphaBlend. + Hex: 0d 00 00 00 63 62 41 6c 70 68 61 42 6c 65 6e 64 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 18 + String: ....iBlendSrcFunc. + Hex: 0e 00 00 00 69 42 6c 65 6e 64 53 72 63 46 75 6e 63 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 19 + String: ....iBlendDestFunc. + Hex: 0f 00 00 00 69 42 6c 65 6e 64 44 65 73 74 46 75 6e 63 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....iShader. + Hex: 08 00 00 00 69 53 68 61 64 65 72 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 11 + String: ....fZBias. + Hex: 07 00 00 00 66 5a 42 69 61 73 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....float. + Hex: 06 00 00 00 66 6c 6f 61 74 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....cfZBias. + Hex: 08 00 00 00 63 66 5a 42 69 61 73 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 21 + String: ....iLightMapChannel. + Hex: 11 00 00 00 69 4c 69 67 68 74 4d 61 70 43 68 61 6e 6e 65 6c 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....ciLightMapChannel. + Hex: 12 00 00 00 63 69 4c 69 67 68 74 4d 61 70 43 68 61 6e 6e 65 6c 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....iShaderType. + Hex: 0c 00 00 00 69 53 68 61 64 65 72 54 79 70 65 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....bUserColor. + Hex: 0b 00 00 00 62 55 73 65 72 43 6f 6c 6f 72 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 14 + String: ....bSpecular. + Hex: 0a 00 00 00 62 53 70 65 63 75 6c 61 72 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 18 + String: ....bNormalShader. + Hex: 0e 00 00 00 62 4e 6f 72 6d 61 6c 53 68 61 64 65 72 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 28 + String: ....bPerPixelLightingShader. + Hex: 18 00 00 00 62 50 65 72 50 69 78 65 6c 4c 69 67 68 74 69 6e 67 53 68 61 64 65 72 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....cUserColor. + Hex: 0b 00 00 00 63 55 73 65 72 43 6f 6c 6f 72 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....color. + Hex: 06 00 00 00 63 6f 6c 6f 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0008: (StorageRaw) { + Size: 12 + String: ...C.......C + Hex: 00 00 7f 43 00 00 00 00 00 00 7f 43 } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....cpUserColor. + Hex: 0c 00 00 00 63 70 55 73 65 72 43 6f 6c 6f 72 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 25 + String: ....bExportTextureMatrix. + Hex: 15 00 00 00 62 45 78 70 6f 72 74 54 65 78 74 75 72 65 4d 61 74 72 69 78 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 26 + String: ....cbExportTextureMatrix. + Hex: 16 00 00 00 63 62 45 78 70 6f 72 74 54 65 78 74 75 72 65 4d 61 74 72 69 78 00 } } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 1c 00 00 00 } + 0x0006: (StorageRaw) { + Size: 13 + String: ....textures. + Hex: 09 00 00 00 74 65 78 74 75 72 65 73 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....rollout. + Hex: 08 00 00 00 72 6f 6c 6c 6f 75 74 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....NelTexture. + Hex: 0b 00 00 00 4e 65 6c 54 65 78 74 75 72 65 00 } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 18 + String: ....bEnableSlot_1. + Hex: 0e 00 00 00 62 45 6e 61 62 6c 65 53 6c 6f 74 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 19 + String: ....cbEnableSlot_1. + Hex: 0f 00 00 00 63 62 45 6e 61 62 6c 65 53 6c 6f 74 5f 31 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 18 + String: ....bEnableSlot_2. + Hex: 0e 00 00 00 62 45 6e 61 62 6c 65 53 6c 6f 74 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 19 + String: ....cbEnableSlot_2. + Hex: 0f 00 00 00 63 62 45 6e 61 62 6c 65 53 6c 6f 74 5f 32 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 18 + String: ....bEnableSlot_3. + Hex: 0e 00 00 00 62 45 6e 61 62 6c 65 53 6c 6f 74 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 19 + String: ....cbEnableSlot_3. + Hex: 0f 00 00 00 63 62 45 6e 61 62 6c 65 53 6c 6f 74 5f 33 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 18 + String: ....bEnableSlot_4. + Hex: 0e 00 00 00 62 45 6e 61 62 6c 65 53 6c 6f 74 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 19 + String: ....cbEnableSlot_4. + Hex: 0f 00 00 00 63 62 45 6e 61 62 6c 65 53 6c 6f 74 5f 34 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 18 + String: ....bEnableSlot_5. + Hex: 0e 00 00 00 62 45 6e 61 62 6c 65 53 6c 6f 74 5f 35 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 19 + String: ....cbEnableSlot_5. + Hex: 0f 00 00 00 63 62 45 6e 61 62 6c 65 53 6c 6f 74 5f 35 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 18 + String: ....bEnableSlot_6. + Hex: 0e 00 00 00 62 45 6e 61 62 6c 65 53 6c 6f 74 5f 36 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 19 + String: ....cbEnableSlot_6. + Hex: 0f 00 00 00 63 62 45 6e 61 62 6c 65 53 6c 6f 74 5f 36 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 18 + String: ....bEnableSlot_7. + Hex: 0e 00 00 00 62 45 6e 61 62 6c 65 53 6c 6f 74 5f 37 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 19 + String: ....cbEnableSlot_7. + Hex: 0f 00 00 00 63 62 45 6e 61 62 6c 65 53 6c 6f 74 5f 37 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 18 + String: ....bEnableSlot_8. + Hex: 0e 00 00 00 62 45 6e 61 62 6c 65 53 6c 6f 74 5f 38 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 19 + String: ....cbEnableSlot_8. + Hex: 0f 00 00 00 63 62 45 6e 61 62 6c 65 53 6c 6f 74 5f 38 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 14 + String: ....bTexGen_1. + Hex: 0a 00 00 00 62 54 65 78 47 65 6e 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....cbTexGen_1. + Hex: 0b 00 00 00 63 62 54 65 78 47 65 6e 5f 31 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 14 + String: ....bTexGen_2. + Hex: 0a 00 00 00 62 54 65 78 47 65 6e 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....cbTexGen_2. + Hex: 0b 00 00 00 63 62 54 65 78 47 65 6e 5f 32 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 14 + String: ....bTexGen_3. + Hex: 0a 00 00 00 62 54 65 78 47 65 6e 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....cbTexGen_3. + Hex: 0b 00 00 00 63 62 54 65 78 47 65 6e 5f 33 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 14 + String: ....bTexGen_4. + Hex: 0a 00 00 00 62 54 65 78 47 65 6e 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....cbTexGen_4. + Hex: 0b 00 00 00 63 62 54 65 78 47 65 6e 5f 34 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 14 + String: ....bTexGen_5. + Hex: 0a 00 00 00 62 54 65 78 47 65 6e 5f 35 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....cbTexGen_5. + Hex: 0b 00 00 00 63 62 54 65 78 47 65 6e 5f 35 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 14 + String: ....bTexGen_6. + Hex: 0a 00 00 00 62 54 65 78 47 65 6e 5f 36 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....cbTexGen_6. + Hex: 0b 00 00 00 63 62 54 65 78 47 65 6e 5f 36 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 14 + String: ....bTexGen_7. + Hex: 0a 00 00 00 62 54 65 78 47 65 6e 5f 37 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....cbTexGen_7. + Hex: 0b 00 00 00 63 62 54 65 78 47 65 6e 5f 37 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 14 + String: ....bTexGen_8. + Hex: 0a 00 00 00 62 54 65 78 47 65 6e 5f 38 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....boolean. + Hex: 08 00 00 00 62 6f 6f 6c 65 61 6e 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0001: (StorageRaw) { + Size: 4 + String: .... } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....cbTexGen_8. + Hex: 0b 00 00 00 63 62 54 65 78 47 65 6e 5f 38 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....tTexture_1. + Hex: 0b 00 00 00 74 54 65 78 74 75 72 65 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....textureMap. + Hex: 0b 00 00 00 74 65 78 74 75 72 65 4d 61 70 00 } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....mbTexture_1. + Hex: 0c 00 00 00 6d 62 54 65 78 74 75 72 65 5f 31 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....tTexture_2. + Hex: 0b 00 00 00 74 54 65 78 74 75 72 65 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....textureMap. + Hex: 0b 00 00 00 74 65 78 74 75 72 65 4d 61 70 00 } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....mbTexture_2. + Hex: 0c 00 00 00 6d 62 54 65 78 74 75 72 65 5f 32 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....tTexture_3. + Hex: 0b 00 00 00 74 54 65 78 74 75 72 65 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....textureMap. + Hex: 0b 00 00 00 74 65 78 74 75 72 65 4d 61 70 00 } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....mbTexture_3. + Hex: 0c 00 00 00 6d 62 54 65 78 74 75 72 65 5f 33 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....tTexture_4. + Hex: 0b 00 00 00 74 54 65 78 74 75 72 65 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....textureMap. + Hex: 0b 00 00 00 74 65 78 74 75 72 65 4d 61 70 00 } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....mbTexture_4. + Hex: 0c 00 00 00 6d 62 54 65 78 74 75 72 65 5f 34 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....tTexture_5. + Hex: 0b 00 00 00 74 54 65 78 74 75 72 65 5f 35 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....textureMap. + Hex: 0b 00 00 00 74 65 78 74 75 72 65 4d 61 70 00 } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....mbTexture_5. + Hex: 0c 00 00 00 6d 62 54 65 78 74 75 72 65 5f 35 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....tTexture_6. + Hex: 0b 00 00 00 74 54 65 78 74 75 72 65 5f 36 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....textureMap. + Hex: 0b 00 00 00 74 65 78 74 75 72 65 4d 61 70 00 } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....mbTexture_6. + Hex: 0c 00 00 00 6d 62 54 65 78 74 75 72 65 5f 36 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....tTexture_7. + Hex: 0b 00 00 00 74 54 65 78 74 75 72 65 5f 37 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....textureMap. + Hex: 0b 00 00 00 74 65 78 74 75 72 65 4d 61 70 00 } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....mbTexture_7. + Hex: 0c 00 00 00 6d 62 54 65 78 74 75 72 65 5f 37 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....tTexture_8. + Hex: 0b 00 00 00 74 54 65 78 74 75 72 65 5f 38 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....textureMap. + Hex: 0b 00 00 00 74 65 78 74 75 72 65 4d 61 70 00 } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....mbTexture_8. + Hex: 0c 00 00 00 6d 62 54 65 78 74 75 72 65 5f 38 00 } } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 17 00 00 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....slot1. + Hex: 06 00 00 00 73 6c 6f 74 31 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....rollout. + Hex: 08 00 00 00 72 6f 6c 6c 6f 75 74 00 } + 0x0006: (StorageRaw) { + Size: 25 + String: ....NelMultitextureSlot1. + Hex: 15 00 00 00 4e 65 6c 4d 75 6c 74 69 74 65 78 74 75 72 65 53 6c 6f 74 31 00 } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....cConstant_1. + Hex: 0c 00 00 00 63 43 6f 6e 73 74 61 6e 74 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....color. + Hex: 06 00 00 00 63 6f 6c 6f 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0008: (StorageRaw) { + Size: 12 + String: ...C...C...C + Hex: 00 00 7f 43 00 00 7f 43 00 00 7f 43 } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....cpConstant. + Hex: 0b 00 00 00 63 70 43 6f 6e 73 74 61 6e 74 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 20 + String: ....iRgbOperation_1. + Hex: 10 00 00 00 69 52 67 62 4f 70 65 72 61 74 69 6f 6e 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iRgbBlendSource_1. + Hex: 12 00 00 00 69 52 67 62 42 6c 65 6e 64 53 6f 75 72 63 65 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....iRgbArg0_1. + Hex: 0b 00 00 00 69 52 67 62 41 72 67 30 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....iRgbArg1_1. + Hex: 0b 00 00 00 69 52 67 62 41 72 67 31 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....iRgbArg2_1. + Hex: 0b 00 00 00 69 52 67 62 41 72 67 32 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iRgbArg0Operand_1. + Hex: 12 00 00 00 69 52 67 62 41 72 67 30 4f 70 65 72 61 6e 64 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iRgbArg1Operand_1. + Hex: 12 00 00 00 69 52 67 62 41 72 67 31 4f 70 65 72 61 6e 64 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iRgbArg2Operand_1. + Hex: 12 00 00 00 69 52 67 62 41 72 67 32 4f 70 65 72 61 6e 64 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iAlphaOperation_1. + Hex: 12 00 00 00 69 41 6c 70 68 61 4f 70 65 72 61 74 69 6f 6e 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....iAlphaBlendSource_1. + Hex: 14 00 00 00 69 41 6c 70 68 61 42 6c 65 6e 64 53 6f 75 72 63 65 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....iAlphaArg0_1. + Hex: 0d 00 00 00 69 41 6c 70 68 61 41 72 67 30 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....iAlphaArg1_1. + Hex: 0d 00 00 00 69 41 6c 70 68 61 41 72 67 31 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....iAlphaArg2_1. + Hex: 0d 00 00 00 69 41 6c 70 68 61 41 72 67 32 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....iAlphaArg0Operand_1. + Hex: 14 00 00 00 69 41 6c 70 68 61 41 72 67 30 4f 70 65 72 61 6e 64 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....iAlphaArg1Operand_1. + Hex: 14 00 00 00 69 41 6c 70 68 61 41 72 67 31 4f 70 65 72 61 6e 64 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....iAlphaArg2Operand_1. + Hex: 14 00 00 00 69 41 6c 70 68 61 41 72 67 32 4f 70 65 72 61 6e 64 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 21 + String: ....iTextureShader_1. + Hex: 11 00 00 00 69 54 65 78 74 75 72 65 53 68 61 64 65 72 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 21 + String: ....iConstantAlpha_1. + Hex: 11 00 00 00 69 43 6f 6e 73 74 61 6e 74 41 6c 70 68 61 5f 31 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: ff 00 00 00 } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 20 + String: ....sdConstantAlpha. + Hex: 10 00 00 00 73 64 43 6f 6e 73 74 61 6e 74 41 6c 70 68 61 00 } } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 17 00 00 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....slot2. + Hex: 06 00 00 00 73 6c 6f 74 32 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 05 00 00 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....rollout. + Hex: 08 00 00 00 72 6f 6c 6c 6f 75 74 00 } + 0x0006: (StorageRaw) { + Size: 25 + String: ....NelMultitextureSlot2. + Hex: 15 00 00 00 4e 65 6c 4d 75 6c 74 69 74 65 78 74 75 72 65 53 6c 6f 74 32 00 } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....cConstant_2. + Hex: 0c 00 00 00 63 43 6f 6e 73 74 61 6e 74 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....color. + Hex: 06 00 00 00 63 6f 6c 6f 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0008: (StorageRaw) { + Size: 12 + String: ...C...C...C + Hex: 00 00 7f 43 00 00 7f 43 00 00 7f 43 } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....cpConstant. + Hex: 0b 00 00 00 63 70 43 6f 6e 73 74 61 6e 74 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 20 + String: ....iRgbOperation_2. + Hex: 10 00 00 00 69 52 67 62 4f 70 65 72 61 74 69 6f 6e 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iRgbBlendSource_2. + Hex: 12 00 00 00 69 52 67 62 42 6c 65 6e 64 53 6f 75 72 63 65 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....iRgbArg0_2. + Hex: 0b 00 00 00 69 52 67 62 41 72 67 30 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....iRgbArg1_2. + Hex: 0b 00 00 00 69 52 67 62 41 72 67 31 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....iRgbArg2_2. + Hex: 0b 00 00 00 69 52 67 62 41 72 67 32 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iRgbArg0Operand_2. + Hex: 12 00 00 00 69 52 67 62 41 72 67 30 4f 70 65 72 61 6e 64 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iRgbArg1Operand_2. + Hex: 12 00 00 00 69 52 67 62 41 72 67 31 4f 70 65 72 61 6e 64 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iRgbArg2Operand_2. + Hex: 12 00 00 00 69 52 67 62 41 72 67 32 4f 70 65 72 61 6e 64 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iAlphaOperation_2. + Hex: 12 00 00 00 69 41 6c 70 68 61 4f 70 65 72 61 74 69 6f 6e 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....iAlphaBlendSource_2. + Hex: 14 00 00 00 69 41 6c 70 68 61 42 6c 65 6e 64 53 6f 75 72 63 65 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....iAlphaArg0_2. + Hex: 0d 00 00 00 69 41 6c 70 68 61 41 72 67 30 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....iAlphaArg1_2. + Hex: 0d 00 00 00 69 41 6c 70 68 61 41 72 67 31 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....iAlphaArg2_2. + Hex: 0d 00 00 00 69 41 6c 70 68 61 41 72 67 32 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....iAlphaArg0Operand_2. + Hex: 14 00 00 00 69 41 6c 70 68 61 41 72 67 30 4f 70 65 72 61 6e 64 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....iAlphaArg1Operand_2. + Hex: 14 00 00 00 69 41 6c 70 68 61 41 72 67 31 4f 70 65 72 61 6e 64 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....iAlphaArg2Operand_2. + Hex: 14 00 00 00 69 41 6c 70 68 61 41 72 67 32 4f 70 65 72 61 6e 64 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 21 + String: ....iTextureShader_2. + Hex: 11 00 00 00 69 54 65 78 74 75 72 65 53 68 61 64 65 72 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 21 + String: ....iConstantAlpha_2. + Hex: 11 00 00 00 69 43 6f 6e 73 74 61 6e 74 41 6c 70 68 61 5f 32 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: ff 00 00 00 } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 20 + String: ....sdConstantAlpha. + Hex: 10 00 00 00 73 64 43 6f 6e 73 74 61 6e 74 41 6c 70 68 61 00 } } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 17 00 00 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....slot3. + Hex: 06 00 00 00 73 6c 6f 74 33 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 05 00 00 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....rollout. + Hex: 08 00 00 00 72 6f 6c 6c 6f 75 74 00 } + 0x0006: (StorageRaw) { + Size: 25 + String: ....NelMultitextureSlot3. + Hex: 15 00 00 00 4e 65 6c 4d 75 6c 74 69 74 65 78 74 75 72 65 53 6c 6f 74 33 00 } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....cConstant_3. + Hex: 0c 00 00 00 63 43 6f 6e 73 74 61 6e 74 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....color. + Hex: 06 00 00 00 63 6f 6c 6f 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0008: (StorageRaw) { + Size: 12 + String: ...C...C...C + Hex: 00 00 7f 43 00 00 7f 43 00 00 7f 43 } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....cpConstant. + Hex: 0b 00 00 00 63 70 43 6f 6e 73 74 61 6e 74 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 20 + String: ....iRgbOperation_3. + Hex: 10 00 00 00 69 52 67 62 4f 70 65 72 61 74 69 6f 6e 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iRgbBlendSource_3. + Hex: 12 00 00 00 69 52 67 62 42 6c 65 6e 64 53 6f 75 72 63 65 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....iRgbArg0_3. + Hex: 0b 00 00 00 69 52 67 62 41 72 67 30 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....iRgbArg1_3. + Hex: 0b 00 00 00 69 52 67 62 41 72 67 31 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....iRgbArg2_3. + Hex: 0b 00 00 00 69 52 67 62 41 72 67 32 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iRgbArg0Operand_3. + Hex: 12 00 00 00 69 52 67 62 41 72 67 30 4f 70 65 72 61 6e 64 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iRgbArg1Operand_3. + Hex: 12 00 00 00 69 52 67 62 41 72 67 31 4f 70 65 72 61 6e 64 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iRgbArg2Operand_3. + Hex: 12 00 00 00 69 52 67 62 41 72 67 32 4f 70 65 72 61 6e 64 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iAlphaOperation_3. + Hex: 12 00 00 00 69 41 6c 70 68 61 4f 70 65 72 61 74 69 6f 6e 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....iAlphaBlendSource_3. + Hex: 14 00 00 00 69 41 6c 70 68 61 42 6c 65 6e 64 53 6f 75 72 63 65 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....iAlphaArg0_3. + Hex: 0d 00 00 00 69 41 6c 70 68 61 41 72 67 30 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....iAlphaArg1_3. + Hex: 0d 00 00 00 69 41 6c 70 68 61 41 72 67 31 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....iAlphaArg2_3. + Hex: 0d 00 00 00 69 41 6c 70 68 61 41 72 67 32 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....iAlphaArg0Operand_3. + Hex: 14 00 00 00 69 41 6c 70 68 61 41 72 67 30 4f 70 65 72 61 6e 64 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....iAlphaArg1Operand_3. + Hex: 14 00 00 00 69 41 6c 70 68 61 41 72 67 31 4f 70 65 72 61 6e 64 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....iAlphaArg2Operand_3. + Hex: 14 00 00 00 69 41 6c 70 68 61 41 72 67 32 4f 70 65 72 61 6e 64 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 21 + String: ....iTextureShader_3. + Hex: 11 00 00 00 69 54 65 78 74 75 72 65 53 68 61 64 65 72 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 21 + String: ....iConstantAlpha_3. + Hex: 11 00 00 00 69 43 6f 6e 73 74 61 6e 74 41 6c 70 68 61 5f 33 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: ff 00 00 00 } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 20 + String: ....sdConstantAlpha. + Hex: 10 00 00 00 73 64 43 6f 6e 73 74 61 6e 74 41 6c 70 68 61 00 } } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 17 00 00 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....slot4. + Hex: 06 00 00 00 73 6c 6f 74 34 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 07 00 00 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....rollout. + Hex: 08 00 00 00 72 6f 6c 6c 6f 75 74 00 } + 0x0006: (StorageRaw) { + Size: 25 + String: ....NelMultitextureSlot4. + Hex: 15 00 00 00 4e 65 6c 4d 75 6c 74 69 74 65 78 74 75 72 65 53 6c 6f 74 34 00 } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 16 + String: ....cConstant_4. + Hex: 0c 00 00 00 63 43 6f 6e 73 74 61 6e 74 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....color. + Hex: 06 00 00 00 63 6f 6c 6f 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0008: (StorageRaw) { + Size: 12 + String: ...C...C...C + Hex: 00 00 7f 43 00 00 7f 43 00 00 7f 43 } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....cpConstant. + Hex: 0b 00 00 00 63 70 43 6f 6e 73 74 61 6e 74 00 } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 20 + String: ....iRgbOperation_4. + Hex: 10 00 00 00 69 52 67 62 4f 70 65 72 61 74 69 6f 6e 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iRgbBlendSource_4. + Hex: 12 00 00 00 69 52 67 62 42 6c 65 6e 64 53 6f 75 72 63 65 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....iRgbArg0_4. + Hex: 0b 00 00 00 69 52 67 62 41 72 67 30 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....iRgbArg1_4. + Hex: 0b 00 00 00 69 52 67 62 41 72 67 31 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 15 + String: ....iRgbArg2_4. + Hex: 0b 00 00 00 69 52 67 62 41 72 67 32 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iRgbArg0Operand_4. + Hex: 12 00 00 00 69 52 67 62 41 72 67 30 4f 70 65 72 61 6e 64 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iRgbArg1Operand_4. + Hex: 12 00 00 00 69 52 67 62 41 72 67 31 4f 70 65 72 61 6e 64 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iRgbArg2Operand_4. + Hex: 12 00 00 00 69 52 67 62 41 72 67 32 4f 70 65 72 61 6e 64 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 22 + String: ....iAlphaOperation_4. + Hex: 12 00 00 00 69 41 6c 70 68 61 4f 70 65 72 61 74 69 6f 6e 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....iAlphaBlendSource_4. + Hex: 14 00 00 00 69 41 6c 70 68 61 42 6c 65 6e 64 53 6f 75 72 63 65 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....iAlphaArg0_4. + Hex: 0d 00 00 00 69 41 6c 70 68 61 41 72 67 30 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....iAlphaArg1_4. + Hex: 0d 00 00 00 69 41 6c 70 68 61 41 72 67 31 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 17 + String: ....iAlphaArg2_4. + Hex: 0d 00 00 00 69 41 6c 70 68 61 41 72 67 32 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....iAlphaArg0Operand_4. + Hex: 14 00 00 00 69 41 6c 70 68 61 41 72 67 30 4f 70 65 72 61 6e 64 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....iAlphaArg1Operand_4. + Hex: 14 00 00 00 69 41 6c 70 68 61 41 72 67 31 4f 70 65 72 61 6e 64 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 24 + String: ....iAlphaArg2Operand_4. + Hex: 14 00 00 00 69 41 6c 70 68 61 41 72 67 32 4f 70 65 72 61 6e 64 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 21 + String: ....iTextureShader_4. + Hex: 11 00 00 00 69 54 65 78 74 75 72 65 53 68 61 64 65 72 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + 0x0006: (StorageRaw) { + Size: 21 + String: ....iConstantAlpha_4. + Hex: 11 00 00 00 69 43 6f 6e 73 74 61 6e 74 41 6c 70 68 61 5f 34 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....type. + Hex: 05 00 00 00 74 79 70 65 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....integer. + Hex: 08 00 00 00 69 6e 74 65 67 65 72 00 } + 0x0006: (StorageRaw) { + Size: 12 + String: ....default. + Hex: 08 00 00 00 64 65 66 61 75 6c 74 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: ff 00 00 00 } + 0x0006: (StorageRaw) { + Size: 7 + String: ....ui. + Hex: 03 00 00 00 75 69 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0006: (StorageRaw) { + Size: 20 + String: ....sdConstantAlpha. + Hex: 10 00 00 00 73 64 43 6f 6e 73 74 61 6e 74 41 6c 70 68 61 00 } } } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....slot5. + Hex: 06 00 00 00 73 6c 6f 74 35 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 07 00 00 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 08 00 00 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... } } } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 0x0006: (StorageRaw) { + Size: 10 + String: ....slot6. + Hex: 06 00 00 00 73 6c 6f 74 36 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 08 00 00 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 09 00 00 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... } } } } } } +0x2007: (StorageContainer) { + 0x0010: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 00 1e 01 00 00 } } +0x2008: (StorageContainer) { + 0x0010: (StorageRaw) { + Size: 52 + String: ...?...............?...............?................ + Hex: 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 } + 0x0020: (StorageRaw) { + Size: 4 + String: ...A + Hex: 00 00 a0 41 } + 0x0030: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } } } + + +------------------ +(program exited with code: 0) +Press return to continue + diff --git a/code/nel/tools/3d/pipeline_max_dump/config_3.c b/code/nel/tools/3d/pipeline_max_dump/config_3.c new file mode 100644 index 000000000..cbdd4899d --- /dev/null +++ b/code/nel/tools/3d/pipeline_max_dump/config_3.c @@ -0,0 +1,1798 @@ +Pipeline Max Dump (Temporary Tool) +/srv/work/database/interfaces/anims_max/cp_fy_hof_species.max +Config +(Config) [11] { +0 0x2090: (CStorageValue) { 16 } +1 0x20e0: (StorageContainer) [3] { + 0 0x0100: (StorageRaw) { + Size: 12 + String: ...=........ + Hex: cd cc cc 3d 0a 00 00 00 01 00 00 00 } + 1 0x0200: (StorageRaw) { + Size: 48 + String: ...@.. A........................................ + Hex: 00 00 a0 40 00 00 20 41 01 00 00 00 03 00 00 00 08 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 2 0x0300: (StorageRaw) { + Size: 0 + String: + Hex: } } +2 0x20a0: (Config20a0) [3] { + 0 0x0100: (CStorageValue) { 2 } + 1 0x0110: (Config20a0Entry) [24] { + 0 0x0100: (CStorageValue) { 138 } + 1 0x0110: (CStorageValue) { 92 } + 2 0x0120: (CStorageValue) { 1 } + 3 0x0130: (CStorageValue) { 58 } + 4 0x0140: (CStorageValue) { 58 } + 5 0x0150: (CStorageValue) { 0 } + 6 0x0160: (CStorageValue) { 1 } + 7 0x0170: (CStorageValue) { 1 } + 8 0x0180: (CStorageValue) { 0 } + 9 0x0190: (CStorageValue) { 0 } + 10 0x0200: (CStorageValue) { 0 } + 11 0x0210: (CStorageValue) { 0 } + 12 0x0220: (CStorageValue) { 1007192200 } + 13 0x0230: (CStorageValue) { 1002053544 } + 14 0x0240: (CStorageValue) { 33554424 } + 15 0x0250: (CStorageValue) { 65472 } + 16 0x0260: (CStorageValue) { 0 } + 17 0x0270: (CStorageValue) { 0 } + 18 0x0280: (CStorageValue) { 0 } + 19 0x0310: (CStorageValue) { 0 } + 20 0x0320: (CStorageValue) { 0 } + 21 0x0290: (CStorageValue) { } + 22 0x0300: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } } + 23 0x0330: (StorageRaw) { + Size: 16 + String: ...._.../....... + Hex: 96 05 00 00 5f 00 00 00 2f 06 00 00 e3 00 00 00 } } + 2 0x0110: (Config20a0Entry) [24] { + 0 0x0100: (CStorageValue) { 300 } + 1 0x0110: (CStorageValue) { 905 } + 2 0x0120: (CStorageValue) { 1 } + 3 0x0130: (CStorageValue) { 7 } + 4 0x0140: (CStorageValue) { 58 } + 5 0x0150: (CStorageValue) { 0 } + 6 0x0160: (CStorageValue) { 1 } + 7 0x0170: (CStorageValue) { 1 } + 8 0x0180: (CStorageValue) { 0 } + 9 0x0190: (CStorageValue) { 0 } + 10 0x0200: (CStorageValue) { 0 } + 11 0x0210: (CStorageValue) { 0 } + 12 0x0220: (CStorageValue) { 1007192200 } + 13 0x0230: (CStorageValue) { 1041638793 } + 14 0x0240: (CStorageValue) { 524276 } + 15 0x0250: (CStorageValue) { 57216 } + 16 0x0260: (CStorageValue) { 0 } + 17 0x0270: (CStorageValue) { 1 } + 18 0x0280: (CStorageValue) { 0 } + 19 0x0310: (CStorageValue) { 0 } + 20 0x0320: (CStorageValue) { 0 } + 21 0x0290: (CStorageValue) { Untitled 1 } + 22 0x0300: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } } + 23 0x0330: (StorageRaw) { + Size: 16 + String: ....Y.......'... + Hex: f4 ff ff ff 59 00 00 00 00 05 00 00 27 04 00 00 } } } +3 0x2190: (StorageRaw) { + Size: 0 + String: + Hex: } +4 0x20b0: (StorageContainer) [9] { + 0 0x0010: (StorageRaw) { + Size: 4 + String: .... + Hex: 1e 00 00 00 } + 1 0x0020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 2 0x0030: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 3 0x0040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 4 0x0050: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 5 0x0060: (StorageRaw) { + Size: 4 + String: .%.. + Hex: 80 25 00 00 } + 6 0x0070: (StorageRaw) { + Size: 4 + String: .... + Hex: e0 0b 00 00 } + 7 0x0100: (StorageContainer) [1] { + 0 0x0090: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } } + 8 0x0110: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } } +5 0x2130: (StorageContainer) [3] { + 0 0x0100: (StorageRaw) { + Size: 0 + String: + Hex: } + 1 0x0120: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0110: (StorageContainer) [4] { + 0 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 1 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 2 0x0400: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 3 0x0300: (StorageContainer) [4] { + 0 0x0100: (StorageRaw) { + Size: 11 + String: ........... + Hex: 07 00 00 00 df f8 fc e8 f0 f8 9d } + 1 0x0110: (StorageRaw) { + Size: 12 + String: ............ + Hex: 08 00 00 00 dc cf d3 dc c8 d9 df 9d } + 2 0x0120: (StorageRaw) { + Size: 17 + String: ................. + Hex: 0d 00 00 00 ab a9 ad b0 ad ac ad aa a9 ae ac a8 9d } + 3 0x0130: (StorageRaw) { + Size: 12 + String: ..,.:.....J. + Hex: 94 b5 2c 0f 3a c5 7b 02 e9 a7 4a d8 } } } } +6 0x2080: (StorageContainer) [100] { + 0 0x2801: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 1 0x2900: (StorageRaw) { + Size: 4 + String: c... + Hex: 63 00 00 00 } + 2 0x2954: (StorageRaw) { + Size: 0 + String: + Hex: } + 3 0x2827: (StorageRaw) { + Size: 4 + String: .... + Hex: 80 00 00 00 } + 4 0x2828: (StorageRaw) { + Size: 4 + String: ... + Hex: 20 00 00 00 } + 5 0x3010: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 6 0x3011: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 7 0x3012: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 8 0x3013: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 9 0x3014: (StorageRaw) { + Size: 4 + String: fff? + Hex: 66 66 66 3f } + 10 0x3015: (StorageRaw) { + Size: 4 + String: fff? + Hex: 66 66 66 3f } + 11 0x3016: (StorageRaw) { + Size: 4 + String: fff? + Hex: 66 66 66 3f } + 12 0x3017: (StorageRaw) { + Size: 4 + String: ..L? + Hex: cd cc 4c 3f } + 13 0x3018: (StorageRaw) { + Size: 4 + String: ..L? + Hex: cd cc 4c 3f } + 14 0x3019: (StorageRaw) { + Size: 4 + String: ..L? + Hex: cd cc 4c 3f } + 15 0x301a: (StorageRaw) { + Size: 4 + String: 333? + Hex: 33 33 33 3f } + 16 0x301b: (StorageRaw) { + Size: 4 + String: 333? + Hex: 33 33 33 3f } + 17 0x301c: (StorageRaw) { + Size: 4 + String: 333? + Hex: 33 33 33 3f } + 18 0x301d: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 19 0x301e: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 20 0x301f: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 21 0x3020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 22 0x28fa: (StorageRaw) { + Size: 896 + String: ...............?...............?...............?...............................................................................?...............?...............?...............................................................................?...............?...............?...............................................................................?...............?...............?...............................................................................?...............?...............?...............................................................................?...............?...............?...............................................................................?...............?...............?...............................................................................?...............?...............?................................................................ + Hex: 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 23 0x2910: (StorageRaw) { + Size: 80 + String: ...........?...............?...............?.................................... + Hex: 01 00 00 00 0b 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 24 0x2911: (StorageRaw) { + Size: 80 + String: ...........?...............?...............?...............?.................... + Hex: 01 00 00 00 02 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 25 0x2912: (StorageRaw) { + Size: 80 + String: ...........?...............>.Fw......Fw?...>..........z...I?..zC................ + Hex: 00 00 00 00 07 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 ef 83 84 3e ea 46 77 bf 00 00 00 00 ea 46 77 3f ef 83 84 3e 00 00 00 00 00 00 00 00 00 00 7a c3 db 0f 49 3f 00 00 7a 43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 26 0x2930: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 27 0x2931: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 28 0x2932: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 } + 29 0x2800: (StorageRaw) { + Size: 4 + String: .... + Hex: 12 00 00 00 } + 30 0x2810: (StorageRaw) { + Size: 80 + String: ........\.|?s.J=D~*...1..4.>..q.....6uu?uj.>..N...O.u!....I?1..@................ + Hex: 00 00 00 00 07 00 00 00 5c 1c 7c 3f 73 02 4a 3d 44 7e 2a be d4 d0 31 be e7 34 8f 3e 92 ba 71 bf 7f bc 19 af 36 75 75 3f 75 6a 91 3e 10 ff 4e bc f4 a0 4f bf 75 21 90 c0 da 0f 49 3f 31 e4 81 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 31 0x2811: (StorageRaw) { + Size: 80 + String: ...........?..............;............?..;..@.>..Y........;.................... + Hex: 01 00 00 00 04 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 80 00 00 00 00 2e bd 3b b3 00 00 80 bf 00 00 00 00 00 00 80 3f 2e bd 3b b3 00 40 11 3e 00 df 59 bf 00 00 00 00 e6 1c ea 3b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 32 0x3040: (StorageRaw) { + Size: 12 + String: ...@...?...? } + 33 0x2876: (StorageRaw) { + Size: 0 + String: + Hex: } + 34 0x3000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 35 0x2830: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 36 0x2836: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 37 0x2840: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 38 0x28f4: (StorageRaw) { + Size: 4 + String: .... + Hex: ff ff ff ff } + 39 0x2846: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 40 0x2870: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 41 0x2861: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 42 0x2890: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 43 0x28a0: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 44 0x28b1: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 45 0x28b5: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 46 0x28c1: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 47 0x28c5: (StorageRaw) { + Size: 4 + String: .... + Hex: 10 00 00 00 } + 48 0x28c9: (StorageRaw) { + Size: 4 + String: ... + Hex: 20 00 00 00 } + 49 0x3030: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 00 05 00 00 00 } + 50 0x28cd: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 51 0x3054: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 52 0x3058: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 01 00 } + 53 0x3060: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 54 0x3064: (StorageRaw) { + Size: 4 + String: .... + Hex: cd cc cc bd } + 55 0x3068: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 56 0x4080: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 57 0x4000: (StorageRaw) { + Size: 4 + String: .... + Hex: 10 00 00 00 } + 58 0x4040: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 59 0x4100: (StorageRaw) { + Size: 40 + String: ........................................ + Hex: 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 1e 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 60 0x3004: (StorageRaw) { + Size: 12 + String: ............ + Hex: 00 00 80 ff 00 00 80 ff 00 00 c0 ff } + 61 0x3008: (StorageRaw) { + Size: 4 + String: ..(@ + Hex: b4 9a 28 40 } + 62 0x4110: (StorageRaw) { + Size: 4 + String: ...? + Hex: ff ff 7f 3f } + 63 0x3041: (StorageRaw) { + Size: 12 + String: ...@...?...? } + 64 0x2877: (StorageRaw) { + Size: 0 + String: + Hex: } + 65 0x3001: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 66 0x2831: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 67 0x2837: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 68 0x2841: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 69 0x28f5: (StorageRaw) { + Size: 4 + String: .... + Hex: ff ff ff ff } + 70 0x2847: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 71 0x2871: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 72 0x2862: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 73 0x2891: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 74 0x28a1: (StorageRaw) { + Size: 16 + String: ...=...=fff?fff? + Hex: cd cc cc 3d cd cc cc 3d 66 66 66 3f 66 66 66 3f } + 75 0x28b2: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 76 0x28b6: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 77 0x28c2: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 78 0x28c6: (StorageRaw) { + Size: 4 + String: .... + Hex: 10 00 00 00 } + 79 0x28ca: (StorageRaw) { + Size: 4 + String: ... + Hex: 20 00 00 00 } + 80 0x3031: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 00 05 00 00 00 } + 81 0x28ce: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 82 0x3055: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 83 0x3059: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 84 0x3061: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 85 0x3065: (StorageRaw) { + Size: 4 + String: .... + Hex: cd cc cc bd } + 86 0x3069: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 87 0x4081: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 88 0x4001: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 } + 89 0x4041: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 90 0x4101: (StorageRaw) { + Size: 40 + String: ........................................ + Hex: 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 1e 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 91 0x3005: (StorageRaw) { + Size: 12 + String: ............ + Hex: 00 00 80 7f 00 00 80 ff 00 00 00 00 } + 92 0x3009: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 93 0x4111: (StorageRaw) { + Size: 4 + String: .q.? + Hex: 02 71 c2 3f } + 94 0x2820: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 95 0x2821: (StorageRaw) { + Size: 0 + String: + Hex: } + 96 0x2826: (StorageRaw) { + Size: 4 + String: F.L. + Hex: 46 00 4c 00 } + 97 0x2825: (StorageRaw) { + Size: 28 + String: ......................%D.... + Hex: 00 00 00 00 02 00 00 00 05 00 00 00 03 00 00 00 00 00 00 00 00 00 25 44 01 00 00 00 } + 98 0x3038: (StorageRaw) { + Size: 56 + String: ........ ...........d...>............................... + Hex: 00 00 00 00 00 00 00 00 20 00 00 00 01 00 00 00 1e 00 00 00 64 00 00 00 3e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 } + 99 0x4114: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } } +7 0x20d0: (StorageContainer) [9] { + 0 0x0005: (StorageRaw) { + Size: 20 + String: .................... + Hex: 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 1 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 2 0x0002: (StorageRaw) { + Size: 4 + String: ... + Hex: 20 12 00 00 } + 3 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } + 4 0x0004: (StorageRaw) { + Size: 4 + String: ... + Hex: 20 12 00 00 } + 5 0x0010: (StorageRaw) { + Size: 4 + String: .... + Hex: 80 02 00 00 } + 6 0x0020: (StorageRaw) { + Size: 4 + String: .... + Hex: e0 01 00 00 } + 7 0x0030: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f } + 8 0x0031: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 } } +8 0x2160: (StorageContainer) [5] { + 0 0x0100: (StorageRaw) { + Size: 12 + String: .......?...? + Hex: 00 00 00 00 00 00 80 3f 00 00 80 3f } + 1 0x0200: (StorageRaw) { + Size: 8 + String: ........ + Hex: 01 00 00 00 01 00 00 00 } + 2 0x0300: (StorageRaw) { + Size: 28 + String: ............................ + Hex: 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 0f 00 00 00 00 00 00 00 00 00 00 00 } + 3 0x0400: (StorageRaw) { + Size: 4 + String: .... + Hex: 10 00 00 00 } + 4 0x0500: (StorageRaw) { + Size: 4 + String: .... + Hex: 0a 00 00 00 } } +9 0x21a0: (StorageRaw) { + Size: 0 + String: + Hex: } +10 0x2180: (ConfigScript) [2] { + 0 0x0040: (ConfigScriptEntry) [2] { + 0 0x0050: (ConfigScriptHeader) { + SuperClassID: 3072 + ClassID: (0x222b9eb9, 0x64c75fec) } + 1 0x0007: (ConfigScriptMetaContainer) [9] { + 0 0x0060: (CStorageValue) { 8 } + 1 0x0007: (ConfigScriptMetaContainer) [39] { + 0 0x0060: (CStorageValue) { 38 } + 1 0x0006: (ConfigScriptMetaString) { main } + 2 0x0003: (CStorageValue) { 0 } + 3 0x0003: (CStorageValue) { 1 } + 4 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { rollout } + 2 0x0006: (ConfigScriptMetaString) { NelParams } } + 5 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bLightMap } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } } } + 6 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bUnlighted } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbUnlighted } } } } + 7 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bStainedGlassWindow } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbStainedGlassWindow } } } } + 8 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bAlphaTest } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbAlphaTest } } } } + 9 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bForceZWrite } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbForceZWrite } } } } + 10 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bForceNoZWrite } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbForceNoZWrite } } } } + 11 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bWater } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } } } + 12 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { fBumpUScale } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { float } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0004: (CStorageValue) { 0.010000 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cfBumpUScale } } } } + 13 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { fBumpVScale } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { float } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0004: (CStorageValue) { 0.010000 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cfBumpVScale } } } } + 14 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { fBumpUSpeed } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { float } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0004: (CStorageValue) { 0.010000 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cfBumpUSpeed } } } } + 15 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { fBumpVSpeed } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { float } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0004: (CStorageValue) { 0.010000 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cfBumpVSpeed } } } } + 16 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { fDisplaceMapUScale } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { float } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0004: (CStorageValue) { 0.005000 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cfDisplaceMapUScale } } } } + 17 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { fDisplaceMapVScale } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { float } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0004: (CStorageValue) { 0.005000 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cfDisplaceMapVScale } } } } + 18 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { fDisplaceMapUSpeed } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { float } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0004: (CStorageValue) { 0.005000 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cfDisplaceMapUSpeed } } } } + 19 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { fDisplaceMapVSpeed } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { float } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0004: (CStorageValue) { 0.005000 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cfDisplaceMapVSpeed } } } } + 20 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { fWaterHeightFactor } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { float } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0004: (CStorageValue) { 1.000000 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cfWaterHeightFactor } } } } + 21 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iWaterPoolID } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { ciWaterPoolID } } } } + 22 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bCalcWaterLightmap } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbCalcWaterLightmap } } } } + 23 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bColorVertex } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbColorVertex } } } } + 24 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bAlphaVertex } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbAlphaVertex } } } } + 25 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iAlphaVertexChannel } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { ciAlphaVertexChannel } } } } + 26 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bAlphaBlend } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbAlphaBlend } } } } + 27 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iBlendSrcFunc } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 28 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iBlendDestFunc } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 29 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iShader } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 30 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { fZBias } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { float } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cfZBias } } } } + 31 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iLightMapChannel } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 2 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { ciLightMapChannel } } } } + 32 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iShaderType } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 33 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bUserColor } + 2 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } } } + 34 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bSpecular } + 2 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } } } + 35 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bNormalShader } + 2 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } } } + 36 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bPerPixelLightingShader } + 2 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } } } + 37 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { cUserColor } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { color } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0008: (CStorageValue) { 255.000000 0.000000 255.000000 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cpUserColor } } } } + 38 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bExportTextureMatrix } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbExportTextureMatrix } } } } } + 2 0x0007: (ConfigScriptMetaContainer) [29] { + 0 0x0060: (CStorageValue) { 28 } + 1 0x0006: (ConfigScriptMetaString) { textures } + 2 0x0003: (CStorageValue) { 1 } + 3 0x0003: (CStorageValue) { 2 } + 4 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { rollout } + 2 0x0006: (ConfigScriptMetaString) { NelTexture } } + 5 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bEnableSlot_1 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbEnableSlot_1 } } } } + 6 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bEnableSlot_2 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbEnableSlot_2 } } } } + 7 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bEnableSlot_3 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbEnableSlot_3 } } } } + 8 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bEnableSlot_4 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbEnableSlot_4 } } } } + 9 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bEnableSlot_5 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbEnableSlot_5 } } } } + 10 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bEnableSlot_6 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbEnableSlot_6 } } } } + 11 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bEnableSlot_7 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbEnableSlot_7 } } } } + 12 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bEnableSlot_8 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbEnableSlot_8 } } } } + 13 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bTexGen_1 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbTexGen_1 } } } } + 14 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bTexGen_2 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbTexGen_2 } } } } + 15 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bTexGen_3 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbTexGen_3 } } } } + 16 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bTexGen_4 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbTexGen_4 } } } } + 17 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bTexGen_5 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbTexGen_5 } } } } + 18 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bTexGen_6 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbTexGen_6 } } } } + 19 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bTexGen_7 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbTexGen_7 } } } } + 20 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bTexGen_8 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { Boolean } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0001: (CStorageValue) { 0 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cbTexGen_8 } } } } + 21 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { tTexture_1 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { textureMap } + 3 0x0006: (ConfigScriptMetaString) { ui } + 4 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { mbTexture_1 } } } } + 22 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { tTexture_2 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { textureMap } + 3 0x0006: (ConfigScriptMetaString) { ui } + 4 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { mbTexture_2 } } } } + 23 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { tTexture_3 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { textureMap } + 3 0x0006: (ConfigScriptMetaString) { ui } + 4 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { mbTexture_3 } } } } + 24 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { tTexture_4 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { textureMap } + 3 0x0006: (ConfigScriptMetaString) { ui } + 4 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { mbTexture_4 } } } } + 25 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { tTexture_5 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { textureMap } + 3 0x0006: (ConfigScriptMetaString) { ui } + 4 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { mbTexture_5 } } } } + 26 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { tTexture_6 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { textureMap } + 3 0x0006: (ConfigScriptMetaString) { ui } + 4 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { mbTexture_6 } } } } + 27 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { tTexture_7 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { textureMap } + 3 0x0006: (ConfigScriptMetaString) { ui } + 4 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { mbTexture_7 } } } } + 28 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { tTexture_8 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { textureMap } + 3 0x0006: (ConfigScriptMetaString) { ui } + 4 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { mbTexture_8 } } } } } + 3 0x0007: (ConfigScriptMetaContainer) [20] { + 0 0x0060: (CStorageValue) { 19 } + 1 0x0006: (ConfigScriptMetaString) { slot1 } + 2 0x0003: (CStorageValue) { 2 } + 3 0x0003: (CStorageValue) { 3 } + 4 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { rollout } + 2 0x0006: (ConfigScriptMetaString) { NelMultitextureSlot1 } } + 5 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { cConstant_1 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { color } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0008: (CStorageValue) { 255.000000 255.000000 255.000000 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cpConstant } } } } + 6 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iRgbOperation_1 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 7 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iRgbBlendSource_1 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 8 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iRgbArg0_1 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 9 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iRgbArg1_1 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 10 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iRgbArg0Operand_1 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 11 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iRgbArg1Operand_1 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 12 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iAlphaOperation_1 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 13 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iAlphaBlendSource_1 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 14 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iAlphaArg0_1 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 15 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iAlphaArg1_1 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 16 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iAlphaArg0Operand_1 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 3 } } } + 17 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iAlphaArg1Operand_1 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 3 } } } + 18 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iTextureShader_1 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 19 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iConstantAlpha_1 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 255 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { sdConstantAlpha } } } } } + 4 0x0007: (ConfigScriptMetaContainer) [20] { + 0 0x0060: (CStorageValue) { 19 } + 1 0x0006: (ConfigScriptMetaString) { slot2 } + 2 0x0003: (CStorageValue) { 3 } + 3 0x0003: (CStorageValue) { 4 } + 4 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { rollout } + 2 0x0006: (ConfigScriptMetaString) { NelMultitextureSlot2 } } + 5 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { cConstant_2 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { color } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0008: (CStorageValue) { 255.000000 255.000000 255.000000 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cpConstant } } } } + 6 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iRgbOperation_2 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 7 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iRgbBlendSource_2 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 8 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iRgbArg0_2 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 9 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iRgbArg1_2 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 10 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iRgbArg0Operand_2 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 11 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iRgbArg1Operand_2 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 12 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iAlphaOperation_2 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 13 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iAlphaBlendSource_2 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 14 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iAlphaArg0_2 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 15 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iAlphaArg1_2 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 16 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iAlphaArg0Operand_2 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 3 } } } + 17 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iAlphaArg1Operand_2 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 3 } } } + 18 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iTextureShader_2 } + 2 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 1 } } } + 19 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { iConstantAlpha_2 } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { integer } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0003: (CStorageValue) { 255 } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { sdConstantAlpha } } } } } + 5 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { slot3 } + 2 0x0003: (CStorageValue) { 4 } + 3 0x0003: (CStorageValue) { 5 } + 4 0x0007: (ConfigScriptMetaContainer) [1] { + 0 0x0060: (CStorageValue) { 0 } } } + 6 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { slot4 } + 2 0x0003: (CStorageValue) { 5 } + 3 0x0003: (CStorageValue) { 6 } + 4 0x0007: (ConfigScriptMetaContainer) [1] { + 0 0x0060: (CStorageValue) { 0 } } } + 7 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { slot5 } + 2 0x0003: (CStorageValue) { 6 } + 3 0x0003: (CStorageValue) { 7 } + 4 0x0007: (ConfigScriptMetaContainer) [1] { + 0 0x0060: (CStorageValue) { 0 } } } + 8 0x0007: (ConfigScriptMetaContainer) [5] { + 0 0x0060: (CStorageValue) { 4 } + 1 0x0006: (ConfigScriptMetaString) { slot6 } + 2 0x0003: (CStorageValue) { 7 } + 3 0x0003: (CStorageValue) { 8 } + 4 0x0007: (ConfigScriptMetaContainer) [1] { + 0 0x0060: (CStorageValue) { 0 } } } } } + 1 0x0040: (ConfigScriptEntry) [2] { + 0 0x0050: (ConfigScriptHeader) { + SuperClassID: 3088 + ClassID: (0x043e0955, 0x5a8003f9) } + 1 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0007: (ConfigScriptMetaContainer) [13] { + 0 0x0060: (CStorageValue) { 12 } + 1 0x0006: (ConfigScriptMetaString) { pblock } + 2 0x0003: (CStorageValue) { 0 } + 3 0x0003: (CStorageValue) { 1 } + 4 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { rollout } + 2 0x0006: (ConfigScriptMetaString) { AdditionnalBitmaps } } + 5 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bitmap1FileName } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { String } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0005: (ConfigScriptMetaString) { } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cBitmap1FileName } } } } + 6 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bitmap2FileName } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { String } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0005: (ConfigScriptMetaString) { } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cBitmap2FileName } } } } + 7 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bitmap3FileName } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { String } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0005: (ConfigScriptMetaString) { } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cBitmap3FileName } } } } + 8 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bitmap4FileName } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { String } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0005: (ConfigScriptMetaString) { } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cBitmap4FileName } } } } + 9 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bitmap5FileName } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { String } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0005: (ConfigScriptMetaString) { } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cBitmap5FileName } } } } + 10 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bitmap6FileName } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { String } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0005: (ConfigScriptMetaString) { } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cBitmap6FileName } } } } + 11 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bitmap7FileName } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { String } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0005: (ConfigScriptMetaString) { } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cBitmap7FileName } } } } + 12 0x0007: (ConfigScriptMetaContainer) [3] { + 0 0x0060: (CStorageValue) { 2 } + 1 0x0006: (ConfigScriptMetaString) { bitmap8FileName } + 2 0x0007: (ConfigScriptMetaContainer) [7] { + 0 0x0060: (CStorageValue) { 6 } + 1 0x0006: (ConfigScriptMetaString) { type } + 2 0x0006: (ConfigScriptMetaString) { String } + 3 0x0006: (ConfigScriptMetaString) { default } + 4 0x0005: (ConfigScriptMetaString) { } + 5 0x0006: (ConfigScriptMetaString) { ui } + 6 0x0007: (ConfigScriptMetaContainer) [2] { + 0 0x0060: (CStorageValue) { 1 } + 1 0x0006: (ConfigScriptMetaString) { cBitmap8FileName } } } } } } } } } + + +------------------ +(program exited with code: 0) +Press return to continue + diff --git a/code/nel/tools/3d/pipeline_max_dump/info.txt b/code/nel/tools/3d/pipeline_max_dump/info.txt new file mode 100644 index 000000000..db3130509 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max_dump/info.txt @@ -0,0 +1,1184 @@ + + + +see: +http://area.autodesk.com/blogs/chris/reading_and_modifying_asset_file_paths_in_the_3ds_max_file +file:///usr/share/doc/libgsf-1-dev/html/gsf/api.html + + + +(max 3.x) +/srv/work/database/interfaces/anims_max/cp_fy_hof_species.max: +d 0 *root* +f 52 VideoPostQueue +f 2159653 Scene +f 1228 DllDirectory +f 18700 Config +f 3194 ClassDirectory3 +f 176 ClassData +f 34780 SummaryInformation +f 3352 DocumentSummaryInformation + +(max 2010) +/home/kaetemi/source/minimax/GE_Acc_MikotoBaniere.max: +d 0 *root* +f 52 VideoPostQueue <- not important +f 147230 Scene <- the main scene, todo +f 366 FileAssetMetaData2 <- this is new in max2010! (it is unfortunately in a different format ...) +f 2198 DllDirectory <- a listing of dlls used by this file +f 29605 Config <- contains stuff related to the paramblocks in max scripts, needed for handling nel material +f 3438 ClassDirectory3 <- a listing of used classes, the index in this list may be relevant to chunk ids +f 691 ClassData <- maybe contains global class data +f 29576 SummaryInformation <- standard windows stuff, different format +f 2320 DocumentSummaryInformation + + + +kaetemi@benzaiten ~/source/minimax/build $ gsf dump /home/kaetemi/source/minimax/GE_Acc_MikotoBaniere.max VideoPostQueue +VideoPostQueue +[ + 50 00 (id: 0x0050) + 0a 00 00 00 (size: 10 - 6 = 4) + [ + 01 00 00 00 (value: 1) + ] +] +[ + 60 00 (id: 0x0060) + 2a 00 00 80 (size: 42 - 6 = 36) (note: negative bit = container) + [ + 10 00 (id: 0x0010) + 1e 00 00 00 (size: 30 - 6 = 24) + [ + 07 00 00 00 (value: 7) + 01 00 00 00 (value: 1) + 00 00 00 00 + 00 00 00 00 + 20 12 00 00 (value: 4610) + 00 00 00 00 + ] + 20 00 (id: 0x0020) + 06 00 00 00 (size: 6 - 6 = 0) + ] +] + + + + +Pipeline Max Dump (Temporary Tool) +/srv/work/database/interfaces/anims_max/cp_fy_hof_species.max +DllDirectory +CHUNK ID: 8248, SIZE: 112, CONTAINER: 1 + CHUNK ID: 8249, SIZE: 80, CONTAINER: 0 + UTF16: Default materials and textures (Kinetix) + SKIPPED: 0 + CHUNK ID: 8247, SIZE: 20, CONTAINER: 0 + UTF16: mtlgen.dlt + SKIPPED: 0 +SKIPPED: 0 +CHUNK ID: 8248, SIZE: 108, CONTAINER: 1 + CHUNK ID: 8249, SIZE: 82, CONTAINER: 0 + UTF16: Standard materials and textures (Kinetix) + SKIPPED: 0 + CHUNK ID: 8247, SIZE: 14, CONTAINER: 0 + UTF16: mtl.dlt + SKIPPED: 0 +SKIPPED: 0 +CHUNK ID: 8248, SIZE: 90, CONTAINER: 1 + CHUNK ID: 8249, SIZE: 54, CONTAINER: 0 + UTF16: Standard samplers (Kinetix) + SKIPPED: 0 + CHUNK ID: 8247, SIZE: 24, CONTAINER: 0 + UTF16: samplers.dlh + SKIPPED: 0 +SKIPPED: 0 +CHUNK ID: 8248, SIZE: 88, CONTAINER: 1 + CHUNK ID: 8249, SIZE: 60, CONTAINER: 0 + UTF16: Standard controllers (Kinetix) + SKIPPED: 0 + CHUNK ID: 8247, SIZE: 16, CONTAINER: 0 + UTF16: ctrl.dlc + SKIPPED: 0 +SKIPPED: 0 +CHUNK ID: 8248, SIZE: 128, CONTAINER: 1 + CHUNK ID: 8249, SIZE: 92, CONTAINER: 0 + UTF16: Physique Modifier: a skeletal deformation tool + SKIPPED: 0 + CHUNK ID: 8247, SIZE: 24, CONTAINER: 0 + UTF16: physique.dlm + SKIPPED: 0 +SKIPPED: 0 +CHUNK ID: 8248, SIZE: 94, CONTAINER: 1 + CHUNK ID: 8249, SIZE: 60, CONTAINER: 0 + UTF16: Editable mesh object (Kinetix) + SKIPPED: 0 + CHUNK ID: 8247, SIZE: 22, CONTAINER: 0 + UTF16: update1.dlo + SKIPPED: 0 +SKIPPED: 0 +CHUNK ID: 8248, SIZE: 84, CONTAINER: 1 + CHUNK ID: 8249, SIZE: 54, CONTAINER: 0 + UTF16: BIPED.DLC: Biped Controller + SKIPPED: 0 + CHUNK ID: 8247, SIZE: 18, CONTAINER: 0 + UTF16: biped.dlc + SKIPPED: 0 +SKIPPED: 0 +CHUNK ID: 8248, SIZE: 260, CONTAINER: 1 + CHUNK ID: 8249, SIZE: 218, CONTAINER: 0 + UTF16: Map extender plug-in --- made by 3DSMax Team - UBI Soft Romania & Daniel Raviart - Ubi Research & Development + SKIPPED: 0 + CHUNK ID: 8247, SIZE: 30, CONTAINER: 0 + UTF16: mapext198m3.dlm + SKIPPED: 0 +SKIPPED: 0 +CHUNK ID: 8248, SIZE: 106, CONTAINER: 1 + CHUNK ID: 8249, SIZE: 74, CONTAINER: 0 + UTF16: Standard pre-filter kernels (Kinetix) + SKIPPED: 0 + CHUNK ID: 8247, SIZE: 20, CONTAINER: 0 + UTF16: kernel.dlk + SKIPPED: 0 +SKIPPED: 0 +CHUNK ID: 8248, SIZE: 98, CONTAINER: 1 + CHUNK ID: 8249, SIZE: 70, CONTAINER: 0 + UTF16: Default scanline renderer (Kinetix) + SKIPPED: 0 + CHUNK ID: 8247, SIZE: 16, CONTAINER: 0 + UTF16: rend.dlr + SKIPPED: 0 +SKIPPED: 0 + + + +Chunk Header +As follows: +2 bytes ID, interpretation context (parent) dependent, often refers to a class or version configuration used to parse this chunk +4 bytes Size, most significant bit flags whether the chunk is a container +if Size is 0: 8 bytes Size64, idem meaning Size, support for large files + + +Scene + + +The Scene stream contains 1 root chunk, with as ID the version that the max file is stored in. +0x2004 3 +0x2006 4 +0x2008 5 +0x2009 6 +? 7 +? 8 +0x200E 9 +0x200F 2008 (10) +? 2009 (11) +0x2012 2010 (12) +? 2011 (13) +? 2012 (14) +? 2013 (15) +The size of this chunk, including the header size, is equal to the size of the Scene stream. + + + + + +max 3 + 0 | 04 20 (id version) + 25 f4 20 80 (size + containerflag) + 00 00 (id) + 40 00 00 80 (size + containerflag) + 35 20 + 0a 00 | ..%.....@...5... + 10 | 00 00 02 00 00 00 01 25 0a 00 00 00 00 00 80 3f | .......%.......? + 20 | 00 25 0e 00 00 00 00 00 00 80 00 00 00 80 02 30 | .%.............0 + 30 | 0a 00 00 00 00 00 00 00 03 30 0e 00 00 00 00 00 | .........0...... + 40 | 00 80 00 00 00 80 01 00 b8 01 00 80 01 00 0a 00 | ................ + 50 | 00 00 0d 00 00 00 05 00 08 00 00 00 06 00 02 00 | ................ + 60 | 20 00 00 80 03 00 0a 00 00 00 00 00 00 00 04 00 | ................ + 70 | 06 00 00 00 00 01 0a 00 00 00 00 00 00 00 02 00 | ................ + 80 | 20 00 00 80 03 00 0a 00 00 00 01 00 00 00 04 00 | ................ + 90 | 06 00 00 00 00 01 0a 00 00 00 00 00 00 00 02 00 | ................ + a0 | 20 00 00 80 03 00 0a 00 00 00 02 00 00 00 04 00 | ................ + b0 | 06 00 00 00 00 01 0a 00 00 00 00 00 80 3f 02 00 | .............?.. + c0 | 20 00 00 80 03 00 0a 00 00 00 03 00 00 00 04 00 | ................ + d0 | 06 00 00 00 00 01 0a 00 00 00 00 00 80 3f 02 00 | .............?.. + e0 | 20 00 00 80 03 00 0a 00 00 00 04 00 00 00 04 00 | ................ + f0 | 06 00 00 00 00 01 0a 00 00 00 00 00 00 00 02 00 | ................ + 100 | 20 00 00 80 03 00 0a 00 00 00 05 00 00 00 04 00 | ................ + 110 | 06 00 00 00 00 01 0a 00 00 00 00 00 00 00 02 00 | ................ + 120 | 20 00 00 80 03 00 0a 00 00 00 06 00 00 00 04 00 | ................ + 130 | 06 00 00 00 00 01 0a 00 00 00 00 00 00 00 02 00 | ................ + 140 | 20 00 00 80 03 00 0a 00 00 00 07 00 00 00 04 00 | ................ + 150 | 06 00 00 00 00 01 0a 00 00 00 00 00 80 3f 02 00 | .............?.. + 160 | 20 00 00 80 03 00 0a 00 00 00 08 00 00 00 04 00 | ................ + + + + + +max 9 (stored under wine) +Scene: + 0 | 0e 20 (id version) + 00 00 00 00 (missing size) + 01 49 + 40 00 00 00 00 80 00 00 | .......I@....... + 10 | 00 00 00 00 d0 00 00 00 00 00 00 80 0b 00 00 00 | ................ + 20 | 00 00 26 00 00 00 00 00 00 00 3c 29 06 5a 1e 0c | ..&.......<).Z.. + 30 | 42 30 60 11 00 00 00 00 00 15 28 23 04 00 01 00 | B0`.......(#.... + 40 | 00 00 0e 00 00 00 00 00 21 00 00 00 00 00 00 00 | ........!....... + 50 | 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 | ..............@. + 60 | 00 00 00 0e 00 00 00 00 00 21 00 00 00 00 00 00 | .........!...... + 70 | 00 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 | ...............@ + 80 | 00 00 00 00 0e 00 00 00 00 00 21 00 00 00 00 00 | ..........!..... + 90 | 00 00 02 00 04 00 00 00 00 00 82 00 00 00 00 00 | ................ + a0 | 40 00 00 00 00 0e 00 00 00 00 00 21 00 00 00 00 | @..........!.... + b0 | 00 00 00 04 00 09 00 00 00 00 00 + 80 06 00 00 00 | ................ + c0 | 00 40 ff ff ff ff + 0c 00 00 00 00 00 18 00 00 00 | .@.............. + d0 | 00 00 00 00 01 00 00 00 01 00 00 00 00 00 01 00 | ................ + e0 | 00 00 00 00 ac 00 00 00 00 00 00 80 34 20 00 00 | ............4... + f0 | 00 00 16 00 00 00 00 00 00 00 00 00 00 00 ff ff | ................ + 100 | ff ff 45 20 00 00 00 00 12 00 00 00 00 00 00 00 | ..E............. + 110 | 00 00 00 00 47 20 00 00 00 00 64 00 00 00 00 00 | ....G.....d..... + 120 | 00 80 48 20 00 00 00 00 24 00 00 00 00 00 00 80 | ..H.....$....... + 130 | 00 27 00 00 00 00 16 00 00 00 00 00 00 00 02 00 | .'.............. + 140 | 00 00 00 00 00 00 49 20 00 00 00 00 24 00 00 00 | ......I.....$... + 150 | 00 00 00 80 00 27 00 00 00 00 16 00 00 00 00 00 | .....'.......... + 160 | 00 00 02 00 00 00 01 00 00 00 4a 20 00 00 00 00 | ..........J..... + 170 | 0e 00 00 00 00 00 00 00 00 10 00 00 00 00 12 00 | ................ + 180 | 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 | ................ + + + +max 2008 (stored under wine) +Scene: + 0 | 0f 20 (id version) + 00 00 00 00 (missing size) + 17 fe 01 00 00 00 00 80 (unknown 64 bits) + 00 00 | ................ + 10 | 00 00 00 00 d0 00 00 00 00 00 00 80 + 0b 00 (id) + 00 00 | ................ + 20 | 00 00 (missing size) + 26 00 00 00 00 00 00 00 (unknown 64 bits) + 3c 29 06 5a 1e 0c | ..&.......<).Z.. + 30 | 42 30 60 11 00 00 00 00 00 17 10 27 04 00 01 00 | B0`........'.... + 40 | 00 00 + 0e 00 00 00 00 00 + 21 00 00 00 00 00 00 00 | ........!....... + 50 | 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 | ..............@. + 60 | 00 00 00 + 0e 00 00 00 00 00 + 21 00 00 00 00 00 00 | .........!...... + 70 | 00 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 | ...............@ + 80 | 00 00 00 00 + 0e 00 00 00 00 00 + 21 00 00 00 00 00 | ..........!..... + 90 | 00 00 02 00 04 00 00 00 00 00 82 00 00 00 00 00 | ................ + a0 | 40 00 00 00 00 + 0e 00 00 00 00 00 + 21 00 00 00 00 | @..........!.... + b0 | 00 00 00 04 00 09 00 00 00 00 00 + 80 06 00 00 00 | ................ + c0 | 00 40 ff ff ff ff + 0c 00 00 00 00 00 18 00 00 00 | .@.............. + d0 | 00 00 00 00 01 00 00 00 01 00 00 00 11 00 01 00 | ................ + e0 | 00 00 00 00 45 00 00 00 00 00 00 80 34 20 00 00 | ....E.......4... + f0 | 00 00 16 00 00 00 00 00 00 00 00 00 00 00 ff ff | ................ + 100 | ff ff 4b 20 00 00 00 00 0f 00 00 00 00 00 00 00 | ..K............. + 110 | 2e 00 10 00 00 00 00 12 00 00 00 00 00 00 00 00 | ................ + +max 2010 +Scene: + 0 | 12 20 (id version) + 1e 3f 02 80 (size+containerflag) + 00 00 (id) + 98 00 00 80 (size+containerflag) + 0b 00 (id) + 1e 00 | ...?............ + 10 | 00 00 (size 30-6=24) + 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 | ..<).Z..B0`..... + 20 | 00 21 e0 2e 04 00 01 00 00 00 + 0e 00 (id) + 19 00 00 00 (size 25-6=19) + | .!.............. + 30 | 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 | ..............@. + 40 | 00 00 00 + 0e 00 19 00 00 00 + 01 00 01 00 00 00 00 | ................ + 50 | 00 82 00 00 00 00 00 40 00 00 00 00 0e 00 19 00 | .......@........ + 60 | 00 00 02 00 04 00 00 00 00 00 82 00 00 00 00 00 | ................ + 70 | 40 00 00 00 00 + 0e 00 19 00 00 00 + 04 00 09 00 00 | @............... + 80 | 00 00 00 + 80 06 00 00 00 00 40 ff ff ff ff + 0c 00 | .........@...... + 90 | 10 00 00 00 01 00 00 00 01 00 00 00 00 00 01 00 | ................ + a0 | 25 00 00 80 34 20 0e 00 00 00 00 00 00 00 ff ff | %...4........... + b0 | ff ff 4b 20 07 00 00 00 2e 00 10 0a 00 00 00 00 | ..K............. + c0 | 00 00 00 00 00 be 03 00 80 35 20 0a 00 00 00 09 | .........5...... + d0 | 00 00 00 4b 20 07 00 00 00 2e 0b 00 1e 00 00 00 | ...K............ + e0 | 59 b4 8a 21 80 89 dc 25 60 11 00 00 00 00 00 21 | Y..!...%`......! + f0 | e0 2e 25 00 03 00 00 00 0e 00 19 00 00 00 00 00 | ..%............. + 100 | 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 | ................ + 110 | 00 0e 00 15 00 00 00 01 00 0f 00 00 00 40 20 81 | .............@.. + 120 | 10 00 00 00 00 40 0e 00 15 00 00 00 02 00 0f 00 | .....@.......... + 130 | 00 00 40 20 81 10 00 00 00 00 40 0e 00 15 00 00 | ..@.......@..... + 140 | 00 03 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 | .......@.......@ + 150 | 0e 00 15 00 00 00 04 00 0f 00 00 00 40 00 81 10 | ............@... + 160 | 00 00 00 00 40 0e 00 15 00 00 00 05 00 0f 00 00 | ....@........... + 170 | 00 40 00 81 10 00 00 00 00 40 0e 00 15 00 00 00 | .@.......@...... + 180 | 06 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 0e | ......@.......@. + 190 | 00 15 00 00 00 07 00 0f 00 00 00 40 20 81 10 00 | ...........@.... + 1a0 | 00 00 00 40 0e 00 15 00 00 00 08 00 0f 00 00 00 | ...@............ + 1b0 | 40 00 81 10 00 00 00 00 40 0e 00 15 00 00 00 09 | @.......@....... + + + + +max 2010 +(DllDirectory) { +0x21c0: (CStorageValue) { 786432216 } +0x2038: (DllEntry) { + 0x2039: (CStorageValue) { Viewport Manager for DirectX (Autodesk) } + 0x2037: (CStorageValue) { ViewportManager.gup } } +0x2038: (DllEntry) { + 0x2039: (CStorageValue) { mental ray: Material Custom Attributes (Autodesk) } + 0x2037: (CStorageValue) { mrMaterialAttribs.gup } } +0x2038: (DllEntry) { + 0x2039: (CStorageValue) { Custom Attribute Container (Autodesk) } + 0x2037: (CStorageValue) { CustAttribContainer.dlo } } +0x2038: (DllEntry) { + 0x2039: (CStorageValue) { Standard Materials and Textures (Autodesk) } + 0x2037: (CStorageValue) { mtl.dlt } } +0x2038: (DllEntry) { + 0x2039: (CStorageValue) { Standard Samplers (Autodesk) } + 0x2037: (CStorageValue) { samplers.dlh } } +0x2038: (DllEntry) { + 0x2039: (CStorageValue) { Default Materials and Textures (Autodesk) } + 0x2037: (CStorageValue) { mtlgen.dlt } } +0x2038: (DllEntry) { + 0x2039: (CStorageValue) { ProSound - Multitrack Audio } + 0x2037: (CStorageValue) { ProSound.dlc } } +0x2038: (DllEntry) { + 0x2039: (CStorageValue) { Editable Poly Object (Autodesk) } + 0x2037: (CStorageValue) { EPoly.dlo } } +0x2038: (DllEntry) { + 0x2039: (CStorageValue) { Standard Pre-Filter Kernels (Autodesk) } + 0x2037: (CStorageValue) { kernel.dlk } } +0x2038: (DllEntry) { + 0x2039: (CStorageValue) { Default Scanline Renderer (Autodesk) } + 0x2037: (CStorageValue) { rend.dlr } } +0x2038: (DllEntry) { + 0x2039: (CStorageValue) { Standard Controllers (Autodesk) } + 0x2037: (CStorageValue) { ctrl.dlc } } +0x2038: (DllEntry) { + 0x2039: (CStorageValue) { Block Manager Utility (Autodesk) } + 0x2037: (CStorageValue) { AcadBlocks.dlu } } +0x2038: (DllEntry) { + 0x2039: (CStorageValue) { Propagation Manager Utility (Autodesk) } + 0x2037: (CStorageValue) { InstanceMgr.dlu } } +0x2038: (DllEntry) { + 0x2039: (CStorageValue) { Scene Effect Manager (Autodesk) } + 0x2037: (CStorageValue) { SceneEffectLoader.dlu } } +0x2038: (DllEntry) { + 0x2039: (CStorageValue) { Change Reaction Controller (Autodesk) } + 0x2037: (CStorageValue) { reactor.dlc } } +0x2038: (DllEntry) { + 0x2039: (CStorageValue) { ParameterEditor (Autodesk) } + 0x2037: (CStorageValue) { ParamEditor.gup } } +0x2038: (DllEntry) { + 0x2039: (CStorageValue) { Bitmap Proxies (Autodesk) } + 0x2037: (CStorageValue) { BitmapProxies.dlu } } +0x2038: (DllEntry) { + 0x2039: (CStorageValue) { Standard Bitmap Storages and Filters (Autodesk) } + 0x2037: (CStorageValue) { StorageAndFilter.bms } } +0x2038: (DllEntry) { + 0x2039: (CStorageValue) { Biped Controller (Autodesk) } + 0x2037: (CStorageValue) { biped.dlc } } } + +max 2010 +(ClassDirectory3) { +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00000082) + SuperClassID: 130} + 0x2042: (CStorageValue) { ParamBlock2 } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 0 + ClassID: (0x30420c1e, 0x5a06293c) + SuperClassID: 4448} + 0x2042: (CStorageValue) { ViewportManager } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 1 + ClassID: (0x25dc8980, 0x218ab459) + SuperClassID: 4448} + 0x2042: (CStorageValue) { mental ray: material custom attribute } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 2 + ClassID: (0x23b708db, 0x5ddb3626) + SuperClassID: 256} + 0x2042: (CStorageValue) { CustAttribContainer } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 3 + ClassID: (0x00000000, 0x00001200) + SuperClassID: 4224} + 0x2042: (CStorageValue) { Texmaps } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 3 + ClassID: (0x00000000, 0x00000038) + SuperClassID: 4272} + 0x2042: (CStorageValue) { Blinn } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00000008) + SuperClassID: 8} + 0x2042: (CStorageValue) { ParamBlock } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 4 + ClassID: (0x00000000, 0x25773211) + SuperClassID: 4368} + 0x2042: (CStorageValue) { Max 2.5 Star } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 3 + ClassID: (0x00000000, 0x00000002) + SuperClassID: 3072} + 0x2042: (CStorageValue) { Standard } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00002007) + SuperClassID: 36867} + 0x2042: (CStorageValue) { Bezier Float } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 5 + ClassID: (0x00000000, 0x00000100) + SuperClassID: 3104} + 0x2042: (CStorageValue) { Placement } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 5 + ClassID: (0x00000000, 0x00000100) + SuperClassID: 3136} + 0x2042: (CStorageValue) { Output } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 3 + ClassID: (0x00000000, 0x00000240) + SuperClassID: 3088} + 0x2042: (CStorageValue) { Bitmap } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -2 + ClassID: (0x222b9eb9, 0x64c75fec) + SuperClassID: 3072} + 0x2042: (CStorageValue) { NeL Material } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00000c80) + SuperClassID: 256} + 0x2042: (CStorageValue) { Material Editor } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00003333) + SuperClassID: 256} + 0x2042: (CStorageValue) { MtlBaseLib } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 6 + ClassID: (0x5b918e4e, 0x476fa9de) + SuperClassID: 3328} + 0x2042: (CStorageValue) { WaveMaster } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 6 + ClassID: (0x5b918e4a, 0x476fa9de) + SuperClassID: 3328} + 0x2042: (CStorageValue) { ProSound } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00000002) + SuperClassID: 1} + 0x2042: (CStorageValue) { RootNode } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00002008) + SuperClassID: 36875} + 0x2042: (CStorageValue) { Bezier Position } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00442313) + SuperClassID: 36876} + 0x2042: (CStorageValue) { TCB Rotation } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00002010) + SuperClassID: 36877} + 0x2042: (CStorageValue) { Bezier Scale } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00002005) + SuperClassID: 36872} + 0x2042: (CStorageValue) { Position/Rotation/Scale } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x0d9c20ff) + SuperClassID: 36880} + 0x2042: (CStorageValue) { Master Point Controller } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 7 + ClassID: (0x192f6098, 0x1bf8338d) + SuperClassID: 16} + 0x2042: (CStorageValue) { Editable Poly } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x1dba1df0, 0x7e9858fe) + SuperClassID: 4336} + 0x2042: (CStorageValue) { Base Layer } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00000001) + SuperClassID: 1} + 0x2042: (CStorageValue) { Node } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 8 + ClassID: (0x00000000, 0x77912301) + SuperClassID: 4256} + 0x2042: (CStorageValue) { Area } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 9 + ClassID: (0x00000000, 0x00000001) + SuperClassID: 3840} + 0x2042: (CStorageValue) { Default Scanline Renderer } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x06546546, 0x46576167) + SuperClassID: 512} + 0x2042: (CStorageValue) { RenderElementMgr } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00002011) + SuperClassID: 36869} + 0x2042: (CStorageValue) { Bezier Color } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0xee448b23) + SuperClassID: 4112} + 0x2042: (CStorageValue) { RenderEnvironment } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00008d52) + SuperClassID: 256} + 0x2042: (CStorageValue) { NamedSelSetList } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x90f2ee71, 0x8d73b8aa) + SuperClassID: 512} + 0x2042: (CStorageValue) { TVNode } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 10 + ClassID: (0x00000000, 0x4b4b1000) + SuperClassID: 36867} + 0x2042: (CStorageValue) { Float List } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 10 + ClassID: (0x00000000, 0x4b4b1001) + SuperClassID: 36869} + 0x2042: (CStorageValue) { Point3 List } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 10 + ClassID: (0x00000000, 0x4b4b1005) + SuperClassID: 36882} + 0x2042: (CStorageValue) { Point4 List } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 10 + ClassID: (0x00000000, 0x4b4b1002) + SuperClassID: 36875} + 0x2042: (CStorageValue) { Position List } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 10 + ClassID: (0x00000000, 0x4b4b1003) + SuperClassID: 36876} + 0x2042: (CStorageValue) { Rotation List } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 10 + ClassID: (0x00000000, 0x4b4b1004) + SuperClassID: 36877} + 0x2042: (CStorageValue) { Scale List } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 10 + ClassID: (0x00000000, 0x4b4b1015) + SuperClassID: 36881} + 0x2042: (CStorageValue) { Block Control } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 11 + ClassID: (0x11793bed, 0x1f8c3646) + SuperClassID: 36867} + 0x2042: (CStorageValue) { Block Manager Wrapper } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 12 + ClassID: (0x7620792b, 0x5a1b661e) + SuperClassID: 36867} + 0x2042: (CStorageValue) { Propagation Manager Wrapper } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 13 + ClassID: (0xf4044794, 0x368d1139) + SuperClassID: 36867} + 0x2042: (CStorageValue) { Scene Effect Loader } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 14 + ClassID: (0x087906d7, 0x294a389c) + SuperClassID: 256} + 0x2042: (CStorageValue) { Reaction Manager } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 15 + ClassID: (0x265a2326, 0x28250b30) + SuperClassID: 4448} + 0x2042: (CStorageValue) { ParameterCollectorCA } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 16 + ClassID: (0x01513165, 0x4a0c66e1) + SuperClassID: 2912} + 0x2042: (CStorageValue) { } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x2c1a0a7b, 0x0c6f6387) + SuperClassID: 36879} + 0x2042: (CStorageValue) { SceneAppData Latch } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 17 + ClassID: (0x68c22d6f, 0x5bf94f11) + SuperClassID: 2912} + 0x2042: (CStorageValue) { BitmapPagerData } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 10 + ClassID: (0x781f1430, 0x0f4871a5) + SuperClassID: 36879} + 0x2042: (CStorageValue) { MasterLayerControlManager } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 18 + ClassID: (0x30935afc, 0x57a52b8c) + SuperClassID: 36879} + 0x2042: (CStorageValue) { Max Mixer Clip } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00000001) + SuperClassID: 4294966784} + 0x2042: (CStorageValue) { Grid Reference } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x17356912) + SuperClassID: 4240} + 0x2042: (CStorageValue) { RenderEffects } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: 9 + ClassID: (0x00000000, 0x00000100) + SuperClassID: 4304} + 0x2042: (CStorageValue) { Shadow Map } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x51ff028e, 0x0d7374fc) + SuperClassID: 512} + 0x2042: (CStorageValue) { Layer Manager } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x2cf03595) + SuperClassID: 256} + 0x2042: (CStorageValue) { TrackSetList } } +0x2040: (ClassEntry) { + 0x2060: (ClassDirectoryHeader) { + DllIndex: -1 + ClassID: (0x00000000, 0x00002222) + SuperClassID: 256} + 0x2042: (CStorageValue) { Scene } } } + + + + +Config + +nel script material id: +0x64c75fec, 0x222b9eb9 +ec 5f c7 64 b9 9e 2b 22 + +0x2180: (StorageContainer) { + 0x0040: (StorageContainer) { + 0x0050: (StorageRaw) { + Size: 12 + String: ....._.d..+" + Hex: 00 0c 00 00 ec 5f c7 64 b9 9e 2b 22 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 09 00 00 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 0e 00 00 00 } + 0x0006: (StorageRaw) { + Size: 9 + String: ....nlbp. + Hex: 05 00 00 00 6e 6c 62 70 00 } + 0x0003: (StorageRaw) { + Size: 4 + String: .... } + 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + 0x0007: (StorageContainer) { + 0x0060: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 } + + + +max3 +(Config) { +0x20e0: (StorageContainer) { + 0x0100: (StorageRaw) { + Size: 12 + String: ...=........ + Hex: cd cc cc 3d 0a 00 00 00 01 00 00 00 } + 0x0200: (StorageRaw) { + Size: 48 + String: ...@.. A........................................ + Hex: 00 00 a0 40 00 00 20 41 01 00 00 00 03 00 00 00 08 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + 0x0300: (StorageRaw) { + Size: 0 + String: + Hex: } } +0x20a0: (StorageContainer) { + 0x0100: (StorageRaw) { + Size: 4 + String: .... + + +max2010 +(Config) { +0x20e0: (StorageContainer) { + 0x0100: (StorageRaw) { + Size: 12 + String: .. A........ + Hex: 00 00 20 41 0a 00 00 00 01 00 00 00 } + 0x0400: (StorageRaw) { + Size: 8 + String: ........ + Hex: 07 00 00 00 01 00 00 00 } + 0x0200: (StorageRaw) { + Size: 40 + String: ...@.. A................................ + Hex: 00 00 a0 40 00 00 20 41 00 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 } + 0x0300: (StorageRaw) { + Size: 0 + String: + Hex: } } +0x20a0: (StorageContainer) { + 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 } + + + + + +max2010 scene, near no fx +2f 27 02 05 +std::string CExportNel::getScriptAppData (Animatable *node, uint32 id, const std::string& def) +AppDataChunk *ap=node->GetAppDataChunk (MAXSCRIPT_UTILITY_CLASS_ID, UTILITY_CLASS_ID, id); +MAXSCRIPT_UTILITY_CLASS_ID Class_ID(0x4d64858, 0x16d1751d) +UTILITY_CLASS_ID 0x001020 +#define NEL3D_APPDATA_ENV_FX (84682543) +0x50C272F + +0x0110: (StorageContainer) [2] { + 0x0120: (StorageRaw) { + Size: 20 + String: XH...u.. .../'...... + Hex: 58 48 d6 04 1d 75 d1 16 // MAXSCRIPT_UTILITY_CLASS_ID + 20 10 00 00 // UTILITY_CLASS_ID + 2f 27 0c 05 // NEL3D_APPDATA_ENV_FX + 06 00 00 00 } // size??? + 0x0130: (StorageRaw) { + Size: 6 + String: no fx. } } + + + + + + +Scene class references + +ver3 + References 0x2034: PARSED { + 0: (Material Editor, (0x00000c80, 0x00000000)) + 1: (MtlBaseLib, (0x00003333, 0x00000000)) + 2: (Default Sound, (0x00000001, 0x00000000)) + 3: (RootNode, (0x00000002, 0x00000000)) + 4: (RenderEnvironment, (0xee448b23, 0x00000000)) + 5: (NamedSelSetList, (0x00008d52, 0x00000000)) + 6: (TVNode, (0x8d73b8aa, 0x90f2ee71)) + 7: (Grid Reference, (0x00000001, 0x00000000)) + 8: (RenderEffects, (0x17356912, 0x00000000)) + 9: (Shadow Map, (0x00000100, 0x00000000)) + 10: (Layer Manager, (0x0d7374fc, 0x51ff028e)) } + +ver9 + References 0x2034: PARSED { + 0: (Material Editor, (0x00000c80, 0x00000000)) + 1: (MtlBaseLib, (0x00003333, 0x00000000)) + 2: (Default Sound, (0x00000001, 0x00000000)) + 3: (RootNode, (0x00000002, 0x00000000)) + 4: (RenderEnvironment, (0xee448b23, 0x00000000)) + 5: (NamedSelSetList, (0x00008d52, 0x00000000)) + 6: (TVNode, (0x8d73b8aa, 0x90f2ee71)) + 7: (Grid Reference, (0x00000001, 0x00000000)) + 8: (RenderEffects, (0x17356912, 0x00000000)) + 9: (Shadow Map, (0x00000100, 0x00000000)) + 10: (Layer Manager, (0x0d7374fc, 0x51ff028e)) + 11: (TrackSetList, (0x2cf03595, 0x00000000)) } + +ver2008 + References 0x2034: PARSED { + 0: (Material Editor, (0x00000c80, 0x00000000)) + 1: (MtlBaseLib, (0x00003333, 0x00000000)) + 2: (Default Sound, (0x00000001, 0x00000000)) + 3: (RootNode, (0x00000002, 0x00000000)) + 4: (RenderEnvironment, (0xee448b23, 0x00000000)) + 5: (NamedSelSetList, (0x00008d52, 0x00000000)) + 6: (TVNode, (0x8d73b8aa, 0x90f2ee71)) + 7: (Grid Reference, (0x00000001, 0x00000000)) + 8: (RenderEffects, (0x17356912, 0x00000000)) + 9: (Shadow Map, (0x00000100, 0x00000000)) + 10: (Layer Manager, (0x0d7374fc, 0x51ff028e)) + 11: (TrackSetList, (0x2cf03595, 0x00000000)) } + +ver2010 + References 0x2034: PARSED { + 0: (Material Editor, (0x00000c80, 0x00000000)) + 1: (MtlBaseLib, (0x00003333, 0x00000000)) + 2: (ProSound, (0x476fa9de, 0x5b918e4a)) + 3: (RootNode, (0x00000002, 0x00000000)) + 4: (RenderEnvironment, (0xee448b23, 0x00000000)) + 5: (NamedSelSetList, (0x00008d52, 0x00000000)) + 6: (TVNode, (0x8d73b8aa, 0x90f2ee71)) + 7: (Grid Reference, (0x00000001, 0x00000000)) + 8: (RenderEffects, (0x17356912, 0x00000000)) + 9: (Shadow Map, (0x00000100, 0x00000000)) + 10: (Layer Manager, (0x0d7374fc, 0x51ff028e)) + 11: (TrackSetList, (0x2cf03595, 0x00000000)) } + + + +01 00 00 00 // one face + 04 00 00 00 // four edges/vertices + 02 00 00 00 // 2 + 00 00 00 00 // 0 + 01 00 00 00 // 1 + 03 00 00 00 // 3 + 30 00 // nomnom + 01 00 00 00 // nomnom + 01 00 00 00 // nomnom + 03 00 00 00 // nomnom + +////// banner + +c2 00 00 00 // 194 faces + 04 00 00 00 // four vertices + 00 00 00 00 + 01 00 00 00 + 2e 00 00 00 + 2d 00 00 00 + 31 00 // magic + 0c 00 00 00 // magic + 08 00 00 00 // more magic?! + 01 00 00 00 // cut from local 1 + 03 00 00 00 // to local 3 + 04 00 00 00 // four vertices + 01 00 00 00 + 02 00 00 00 + 2f 00 00 00 + 2e 00 00 00 + 31 00 // magic + 04 00 00 00 // magic + 08 00 00 00 // more magic?! + 01 00 00 00 // cut from local 1 + 03 00 00 00 // to local 3 + 04 00 00 00 + 02 00 00 00 + 03 00 00 00 + 30 00 00 00 + 2f 00 00 00 + 31 00 + 04 00 00 00 + 08 00 00 00 + 01 00 00 00 + 03 00 00 00 + 04 00 00 00 + 03 00 00 00 + 04 00 00 00 + 31 00 00 00 + 30 00 00 00 + 31 00 + 0c 00 00 00 + 08 00 00 00 + 01 00 00 00 + 03 00 00 00 + 04 00 00 00 + 04 00 00 00 00 00 00 00 2d 00 00 00 31 00 00 00 + 31 00 + 0c 00 00 00 08 00 00 00 + 01 00 00 00 03 00 00 00 + 04 00 00 00 + 14 00 00 00 13 00 00 00 19 00 00 00 18 00 00 00 + 39 00 + 0c 00 00 00 + 09 00 + 08 00 00 00 + 02 00 00 00 + 00 00 00 00 + 04 00 00 00 13 00 00 00 15 00 00 00 1a 00 00 00 19 00 00 00 + 39 00 04 00 00 00 + 09 00 08 00 00 00 + 02 00 00 00 00 00 00 00 04 00 00 00 15 00 00 00 16 00 00 00 1b 00 00 00 1a 00 00 00 39 00 04 00 00 00 09 00 08 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 16 00 00 00 17 00 00 00 1c 00 00 00 1b 00 00 00 39 00 0c 00 00 00 09 00 08 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 17 00 00 00 14 00 00 00 18 00 00 00 1c 00 00 00 39 00 0c 00 00 00 09 00 08 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 0b 00 00 00 0a 00 00 00 1f 00 00 00 20 00 00 00 31 00 04 00 00 00 08 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 0a 00 00 00 09 00 00 00 1e 00 00 00 1f 00 00 00 31 00 0c 00 00 01 08 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 0c 00 00 00 0b 00 00 00 20 00 00 00 21 00 00 00 31 00 04 00 00 00 08 00 00 00 00 00 00 00 02 00 0 + +////// banner + + 3 0x0100: (StorageArraySizePre) [6] { { 0x0, -5.000000 -5.000000 0.000000 } { 0x1000000, 5.000000 -5.000000 0.000000 } { 0x0, -5.000000 5.000000 0.000000 } { 0x1000000, 5.000000 5.000000 0.000000 } { 0x0, 5.000000 -5.000000 10.000000 } { 0x0, 5.000000 5.000000 10.000000 } } + 4 0x010a: (StorageArraySizePre) [7] { { 0x0, 2 0 } { 0x0, 3 2 } { 0x0, 1 3 } { 0x0, 0 1 } { 0x0, 1 4 } { 0x0, 5 3 } { 0x1, 4 5 } } + 5 0x011a: (StorageRaw) { + Size: 68 + String: ........................0................................. ......... + Hex: + +02 00 00 00 // 2 faces! + 04 00 00 00 // 4 vertices + 02 00 00 00 + 00 00 00 00 + 01 00 00 00 // shared + 03 00 00 00 // shared + 30 00 + 01 00 00 00 + 01 00 00 00 + 03 00 00 00 + 04 00 00 00 // 4 vertices + 03 00 00 00 // shared + 01 00 00 00 // shared + 04 00 00 00 + 05 00 00 00 + 20 00 + 00 00 00 00 + 02 00 00 00 } + + + + 3 0x0100: (StorageArraySizePre) [8] { { 0x0, -5.000000 -5.000000 0.000000 } { 0x0, 5.000000 -5.000000 0.000000 } { 0x0, -5.000000 5.000000 0.000000 } { 0x0, 5.000000 5.000000 0.000000 } { 0x1000000, 5.000000 -5.000000 10.000000 } { 0x1000000, 5.000000 5.000000 10.000000 } { 0x0, -5.000000 -5.000000 10.000000 } { 0x0, -5.000000 5.000000 10.000000 } } + 4 0x010a: (StorageArraySizePre) [10] { { 0x8, 2 0 } { 0x8, 3 2 } { 0x8, 1 3 } { 0x8, 0 1 } { 0x8, 1 4 } { 0x8, 5 3 } { 0x0, 4 5 } { 0x0, 4 6 } { 0x0, 7 5 } { 0x0, 6 7 } } + 5 0x011a: (StorageRaw) { + Size: 106 + String: ........................1.....................................!................................. ......... + Hex: + +03 00 00 00 // 3 faces + 04 00 00 00 // 4 vertices + 02 00 00 00 + 00 00 00 00 + 01 00 00 00 + 03 00 00 00 + 31 00 // 0011 0001 + 08 00 00 00 + 01 00 00 00 + 01 00 00 00 + 03 00 00 00 + 04 00 00 00 // 4 vertices + 03 00 00 00 + 01 00 00 00 + 04 00 00 00 // shared vertex + 05 00 00 00 // shared vertex + 21 00 // 0010 0001 + 08 00 00 00 + 00 00 00 00 + 02 00 00 00 + 04 00 00 00 // 4 vertices + 05 00 00 00 // shared vertex + 04 00 00 00 // shared vertex + 06 00 00 00 + 07 00 00 00 + 20 00 // 0010 0000 + 00 00 00 00 + 02 00 00 00 } + +** triangulation is stored inside the polyobject somewhere with the faces! + + 3 0x0100: (StorageArraySizePre) [5] { { 0x0, -5.000000 -2.000000 0.000000 } { 0x0, 1.169249 -6.003741 0.000000 } { 0x0, -3.931087 3.378710 0.000000 } { 0x0, 3.007738 4.420538 0.000000 } { 0x0, 5.070167 -1.944196 0.000000 } } + 4 0x010a: (StorageArraySizePre) [5] { { 0x0, 2 0 } { 0x0, 3 2 } { 0x0, 1 4 } { 0x0, 0 1 } { 0x0, 4 3 } } + 5 0x011a: (StorageRaw) { + Size: 50 + String: ............................0..................... + Hex: + +01 00 00 00 // 1 face + 05 00 00 00 + 02 00 00 00 + 00 00 00 00 // v0 at idx 1 + 01 00 00 00 + 04 00 00 00 + 03 00 00 00 + 30 00 // triangulation egdes should both touch vertex 0... locally 1? + 01 00 00 00 + 01 00 00 00 + 03 00 00 00 + 01 00 00 00 + oops deleted + + + Float: 4.2039e-45 } + 3 0x0100: (StorageArraySizePre) [5] { { 0x0, -5.000000 -2.000000 0.000000 } { 0x0, 1.169249 -6.003741 0.000000 } { 0x0, -3.931087 3.378710 0.000000 } { 0x0, 3.007738 4.420538 0.000000 } { 0x0, 5.070167 -1.944196 0.000000 } } + 4 0x010a: (StorageArraySizePre) [5] { { 0x0, 2 0 } { 0x0, 3 2 } { 0x0, 1 4 } { 0x0, 0 1 } { 0x0, 4 3 } } + 5 0x011a: (StorageRaw) { + Size: 50 + String: ............................0..................... + Hex: +01 00 00 00 + 05 00 00 00 + 02 00 00 00 + 00 00 00 00 + 01 00 00 00 // v1 at idx 2 + 04 00 00 00 + 03 00 00 00 + 30 00 30 00 // triangle edges should both touch vertex 1... locally 2? + 01 00 00 00 01 00 00 00 + 00 00 00 00 01 00 00 00 + 02 00 00 00 03 00 00 00 + 02 00 00 00 01 00 00 00 // hm! + 04 00 00 00 oops deleted } + + + 3 0x0100: (StorageArraySizePre) [5] { { 0x0, -5.000000 -2.000000 0.000000 } { 0x0, 1.169249 -6.003741 0.000000 } { 0x0, -3.931087 3.378710 0.000000 } { 0x0, 3.007738 4.420538 0.000000 } { 0x1, 5.070167 -1.944196 0.000000 } } + 4 0x010a: (StorageArraySizePre) [5] { { 0x0, 2 0 } { 0x0, 3 2 } { 0x0, 1 4 } { 0x0, 0 1 } { 0x0, 4 3 } } + 5 0x011a: (StorageRaw) { + Size: 50 + String: ............................0..................... + Hex: + +01 00 00 00 + 05 00 00 00 + 02 00 00 00 + 00 00 00 00 + 01 00 00 00 + 04 00 00 00 + 03 00 00 00 + 30 00 // magic // triangle edges should touch vertex 4 .. locally 3? + 01 00 00 00 // magic + 01 00 00 00 // triangulate from local 1 + 03 00 00 00 // to local 3 + 00 00 00 00 // triangulate from local 0 + 03 00 00 00 // to local 3 } + + + 3 0x0100: (StorageArraySizePre) [3] { { 0x0, -5.000000 -2.000000 0.000000 } { 0x0, 1.169249 -6.003741 0.000000 } { 0x0, 5.070167 -1.944196 0.000000 } } + 4 0x010a: (StorageArraySizePre) [3] { { 0x0, 1 2 } { 0x0, 0 1 } { 0x1, 2 0 } } + 5 0x011a: (StorageRaw) { + Size: 26 + String: .......................... + Hex: + +01 00 00 00 + 03 00 00 00 + 00 00 00 00 + 01 00 00 00 + 02 00 00 00 + 10 00 + 01 00 00 00 } + + +01 00 00 00 + 05 00 00 00 + 02 00 00 00 + 00 00 00 00 + 01 00 00 00 + 04 00 00 00 + 03 00 00 00 + 31 00 /// 20 00 = info, last; 10 00 = smoothing groups; 01 00 = ?? + 01 00 01 00 + ff ff ff ff // smoothing group + 01 00 00 00 03 00 00 00 // cut 1 + 00 00 00 00 03 00 00 00 // cut 1 } + + +bitfield + 01 00 = unknown, uint32 or pair '01 00 01 00' + 02 00 + 04 00 + 08 00 = material id, uint16 (max shows index + 1, so starts at 1, binary starts at 0) + 10 00 = smoothing groups, uint32 + 20 00 = triangulation, pair per cut + 40 00 ? + + +01 00 00 00 05 00 00 00 02 00 00 00 00 00 00 00 01 00 00 00 04 00 00 00 03 00 00 00 21 00 01 00 01 00 01 00 00 00 03 00 00 00 00 00 00 00 03 00 00 00 // selected +01 00 00 00 05 00 00 00 02 00 00 00 00 00 00 00 01 00 00 00 04 00 00 00 03 00 00 00 21 00 00 00 01 00 01 00 00 00 03 00 00 00 00 00 00 00 03 00 00 00 // unselected - no difference *** byte changed from 1 to 0 ??? +01 00 00 00 05 00 00 00 02 00 00 00 00 00 00 00 01 00 00 00 04 00 00 00 03 00 00 00 29 00 01 00 01 00 04 00 01 00 00 00 03 00 00 00 00 00 00 00 03 00 00 00 // material id changed to '5', 08 00 +01 00 00 00 05 00 00 00 02 00 00 00 00 00 00 00 01 00 00 00 04 00 00 00 03 00 00 00 29 00 01 00 01 00 04 00 01 00 00 00 03 00 00 00 00 00 00 00 03 00 00 00 // clear selection unselected -- no diff +01 00 00 00 05 00 00 00 02 00 00 00 00 00 00 00 01 00 00 00 04 00 00 00 03 00 00 00 29 00 01 00 01 00 04 00 01 00 00 00 03 00 00 00 00 00 00 00 03 00 00 00 // use subdiv -- no diff +01 00 00 00 05 00 00 00 02 00 00 00 00 00 00 00 01 00 00 00 04 00 00 00 03 00 00 00 29 00 01 00 01 00 04 00 01 00 00 00 03 00 00 00 00 00 00 00 03 00 00 00 // vertex colors -- no diff + + + + diff --git a/code/nel/tools/3d/pipeline_max_dump/main.cpp b/code/nel/tools/3d/pipeline_max_dump/main.cpp new file mode 100644 index 000000000..58c366831 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max_dump/main.cpp @@ -0,0 +1,374 @@ +/* + * Copyright (C) 2012 by Jan Boon (Kaetemi) + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include "../max/storage_stream.h" +#include "../max/storage_object.h" +#include "../max/dll_directory.h" +#include "../max/class_directory_3.h" +#include "../max/class_data.h" +#include "../max/config.h" +#include "../max/scene.h" +#include "../max/scene_class_registry.h" + +// Testing +#include "../max/builtin/builtin.h" +#include "../max/update1/update1.h" +#include "../max/epoly/epoly.h" + +#include "../max/builtin/storage/app_data.h" +#include "../max/builtin/storage/geom_buffers.h" +#include "../max/builtin/scene_impl.h" +#include "../max/builtin/i_node.h" +#include "../max/update1/editable_mesh.h" +#include "../max/epoly/editable_poly.h" + +using namespace PIPELINE::MAX; +using namespace PIPELINE::MAX::BUILTIN; +using namespace PIPELINE::MAX::BUILTIN::STORAGE; +using namespace PIPELINE::MAX::UPDATE1; +using namespace PIPELINE::MAX::EPOLY; + +//static const char *filename = "/srv/work/database/interfaces/anims_max/cp_fy_hof_species.max"; +//static const char *filename = "/home/kaetemi/source/minimax/GE_Acc_MikotoBaniere.max"; +//static const char *filename = "/home/kaetemi/3dsMax/scenes/test2008.max"; +//static const char *filename = "/home/kaetemi/3dsMax/scenes/teapot_test_scene.max"; +//static const char *filename = "/home/kaetemi/3dsMax/scenes/testplane.max"; +//static const char *filename = "/home/kaetemi/3dsMax/scenes/geomobjects.max"; +static const char *filename = "/mnt/tsurugi/ryzom-assets/database/landscape/ligo/desert/max/zonematerial-converted-165_eg.max"; +static const char *streamname = "Scene"; + +#define PBMS_GEOM_BUFFERS_POLY_A_VERTEX_CHUNK_ID 0x0100 +#define PBMS_GEOM_BUFFERS_POLY_A_EDGE_CHUNK_ID 0x010a +#define PBMS_GEOM_BUFFERS_POLY_A_FACE_CHUNK_ID 0x011a +// CStorageArraySizePre +// CStorageArraySizePre +// CStorageArrayDynSize + +void exportObj(const std::string &fileName, const CReferenceMaker *geomObject) +{ + nlassert(dynamic_cast(geomObject)); + const CEditableMesh *mesh = dynamic_cast(geomObject); + if (mesh) + { + nlerror("Not implemented!"); + /* + IStorageObject *bufferBlock = triObject->findStorageObject(0x08fe); + nlassert(bufferBlock->isContainer()); + CStorageContainer *buffers = static_cast(bufferBlock); + CStorageArraySizePre *vertexBuffer = static_cast *>(buffers->findStorageObject(0x0914)); + CStorageArraySizePre *indexBuffer = static_cast *>(buffers->findStorageObject(0x0912)); + + std::ofstream ofs(fileName.c_str()); + for (uint i = 0; i < vertexBuffer->Value.size(); ++i) + ofs << "v " << vertexBuffer->Value[i].x << " " << vertexBuffer->Value[i].y << " " << vertexBuffer->Value[i].z << "\n"; + for (uint i = 0; i < indexBuffer->Value.size(); ++i) + ofs << "f " << (indexBuffer->Value[i].a + 1) << " " << (indexBuffer->Value[i].b + 1) << " " << (indexBuffer->Value[i].c + 1) << "\n"; // + 1 as .obj indexes at 1... + */ + return; + } + const CEditablePoly *poly = dynamic_cast(geomObject); + if (poly) + { + CGeomBuffers *geomBuffers = poly->geomBuffers(); + CStorageArraySizePre *vertexBuffer = static_cast *>(geomBuffers->findStorageObject(PBMS_GEOM_BUFFERS_POLY_A_VERTEX_CHUNK_ID)); + CStorageArraySizePre *edgeBuffer = static_cast *>(geomBuffers->findStorageObject(PBMS_GEOM_BUFFERS_POLY_A_EDGE_CHUNK_ID)); + CStorageArrayDynSize *faceBuffer = static_cast *>(geomBuffers->findStorageObject(PBMS_GEOM_BUFFERS_POLY_A_FACE_CHUNK_ID)); + nlassert(vertexBuffer); + nlassert(edgeBuffer); + nlassert(faceBuffer); + std::ofstream ofs(fileName.c_str()); + for (uint i = 0; i < vertexBuffer->Value.size(); ++i) + ofs << "v " << vertexBuffer->Value[i].v.x << " " << vertexBuffer->Value[i].v.y << " " << vertexBuffer->Value[i].v.z << "\n"; + std::vector triangles; + for (uint i = 0; i < faceBuffer->Value.size(); ++i) + { + CGeomObject::triangulatePolyFace(triangles, faceBuffer->Value[i]); + for (uint j = 0; j < triangles.size(); ++j) + { + ofs << "f " << (triangles[j].a + 1) << " " << (triangles[j].b + 1) << " " << (triangles[j].c + 1) << "\n"; // + 1 as .obj indexes at 1... + } + triangles.clear(); + } + return; + } + nlerror("Not handled!"); +} + +// int __stdcall WinMain(void *, void *, void *, int) +int main(int argc, char **argv) +{ + //printf("Pipeline Max Dump (Temporary Tool)\n"); + + char const *me = (argv[0] ? argv[0] : "pipeline_max_dump"); + g_set_prgname(me); + gsf_init(); + + // Register all plugin classes + CSceneClassRegistry sceneClassRegistry; + CBuiltin::registerClasses(&sceneClassRegistry); + CUpdate1::registerClasses(&sceneClassRegistry); + CEPoly::registerClasses(&sceneClassRegistry); + + GsfInfile *infile; + GError *error = NULL; + GsfInput *src; + char *display_name; + + src = gsf_input_stdio_new(filename, &error); + + if (error) + { + display_name = g_filename_display_name(filename); + g_printerr (_("%s: Failed to open %s: %s\n"), + g_get_prgname (), + display_name, + error->message); + g_free(display_name); + return 1; + } + + infile = gsf_infile_msole_new(src, NULL); + + if (!infile) + { + display_name = g_filename_display_name(filename); + g_printerr (_("%s: Failed to recognize %s as an archive\n"), + g_get_prgname (), + display_name); + g_free (display_name); + return 1; + } + + display_name = g_filename_display_name(filename); + //g_print("%s\n", display_name); + g_free(display_name); + // g_print("%s\n", streamname); + std::cout << "\n"; + + GsfInput *input = NULL; + + + PIPELINE::MAX::CDllDirectory dllDirectory; + input = gsf_infile_child_by_name(infile, "DllDirectory"); + { + PIPELINE::MAX::CStorageStream instream(input); + PIPELINE::MAX::CStorageContainer ctr; + ctr.serial(instream); + { + NLMISC::COFile of("temp.bin"); + ctr.serial(of); // out + // nldebug("Written %i bytes", of.getPos()); + } + { + NLMISC::CIFile inf("temp.bin"); + dllDirectory.serial(inf); // in + } + //dllDirectory.serial(instream); + } + g_object_unref(input); + //dllDirectory.toString(std::cout); + //std::cout << "\n"; + dllDirectory.parse(PIPELINE::MAX::VersionUnknown); // parse the structure to readable data + dllDirectory.clean(); // cleanup unused file structure + dllDirectory.toString(std::cout); + std::cout << "\n"; + //dllDirectory.build(PIPELINE::MAX::VersionUnknown); + //dllDirectory.disown(); + //dllDirectory.toString(std::cout); + //std::cout << "\n"; + + + std::cout << "\n"; + + + PIPELINE::MAX::CClassDirectory3 classDirectory3(&dllDirectory); + input = gsf_infile_child_by_name(infile, "ClassDirectory3"); + { + PIPELINE::MAX::CStorageStream instream(input); + classDirectory3.serial(instream); + } + g_object_unref(input); + //classDirectory3.toString(std::cout); + //std::cout << "\n"; + classDirectory3.parse(PIPELINE::MAX::VersionUnknown); // parse the structure to readable data + classDirectory3.clean(); // cleanup unused file structure + classDirectory3.toString(std::cout); + std::cout << "\n"; + //classDirectory3.build(PIPELINE::MAX::VersionUnknown); + //classDirectory3.disown(); + //classDirectory3.toString(std::cout); + //std::cout << "\n"; + + + std::cout << "\n"; + + + PIPELINE::MAX::CScene scene(&sceneClassRegistry, &dllDirectory, &classDirectory3); + //PIPELINE::MAX::CStorageContainer scene; + input = gsf_infile_child_by_name(infile, "Scene"); + { + PIPELINE::MAX::CStorageStream instream(input); + scene.serial(instream); + } + g_object_unref(input); + //classDirectory3.toString(std::cout); + //std::cout << "\n"; + scene.parse(PIPELINE::MAX::VersionUnknown); // parse the structure to readable data + scene.clean(); // cleanup unused file structure + // TEST -> + nldebug("BUILD"); + scene.build(PIPELINE::MAX::VersionUnknown); + nldebug("DISOWN"); + scene.disown(); + nldebug("PARSE"); + scene.parse(PIPELINE::MAX::VersionUnknown); // parse the structure to readable data + nldebug("CLEAN"); + //scene.clean(); // cleanup unused file structure, don't clean up if we want direct access to chunks as well + // <- TEST + scene.toString(std::cout);//## + std::cout << "\n"; + //classDirectory3.build(PIPELINE::MAX::VersionUnknown); + //classDirectory3.disown(); + //classDirectory3.toString(std::cout); + //std::cout << "\n"; + + std::cout << "\n"; + scene.container()->scene()->rootNode()->dumpNodes(std::cout); + std::cout << "\n"; + + //PIPELINE::MAX::BUILTIN::INode *node = scene.container()->scene()->rootNode()->find(ucstring("TR_HOF_civil01_gilet")); nlassert(node); + //node->toString(std::cout); + //exportObj("tr_hof_civil01_gilet.obj", node->getReference(1)->getReference(1)); // => CDerivedObject::getBase(node->object()) + + /*INode *node = scene.container()->scene()->rootNode()->find(ucstring("GE_Acc_MikotoBaniere")); nlassert(node); + //INode *node = scene.container()->scene()->rootNode()->find(ucstring("testplane")); nlassert(node); + CReferenceMaker *object = node->getReference(1); + object->toString(std::cout); + exportObj("ge_acc_mikotobaniere.obj", object);*/ + + + //GE_Acc_MikotoBaniere + + // TEST APP DATA -> +/* +#define MAXSCRIPT_UTILITY_CLASS_ID (NLMISC::CClassId(0x04d64858, 0x16d1751d)) +#define UTILITY_CLASS_ID (4128) +#define NEL3D_APPDATA_ENV_FX (84682543) + + PIPELINE::MAX::CSceneClassContainer *ssc = scene.container(); + for (PIPELINE::MAX::CStorageContainer::TStorageObjectConstIt it = ssc->chunks().begin(), end = ssc->chunks().end(); it != end; ++it) + { + PIPELINE::MAX::CStorageContainer *subc = static_cast(it->second); + for (PIPELINE::MAX::CStorageContainer::TStorageObjectConstIt subit = subc->chunks().begin(), subend = subc->chunks().end(); subit != subend; ++subit) + { + PIPELINE::MAX::IStorageObject *storageChunk = subit->second; + PIPELINE::MAX::BUILTIN::STORAGE::CAppData *appData = dynamic_cast(storageChunk); + if (appData) + { + + nlinfo("Found AppData"); + CStorageRaw *raw = appData->get(MAXSCRIPT_UTILITY_CLASS_ID, UTILITY_CLASS_ID, NEL3D_APPDATA_ENV_FX); + if (raw) + { + nlinfo("Found NEL3D_APPDATA_ENV_FX, size %i", raw->Value.size()); + //raw->Value.resize(200); + } + + } + } + }*/ + // <- TEST APP DATA + + +/* + scene.clean(); + scene.build(PIPELINE::MAX::VersionUnknown); + scene.disown(); + scene.parse(PIPELINE::MAX::VersionUnknown); + + ssc = scene.container(); + for (PIPELINE::MAX::CStorageContainer::TStorageObjectConstIt it = ssc->chunks().begin(), end = ssc->chunks().end(); it != end; ++it) + { + PIPELINE::MAX::CStorageContainer *subc = static_cast(it->second); + for (PIPELINE::MAX::CStorageContainer::TStorageObjectConstIt subit = subc->chunks().begin(), subend = subc->chunks().end(); subit != subend; ++subit) + { + PIPELINE::MAX::IStorageObject *storageChunk = subit->second; + PIPELINE::MAX::BUILTIN::STORAGE::CAppData *appData = dynamic_cast(storageChunk); + if (appData) + { + + nlinfo("Found AppData"); + const CStorageRaw *raw = appData->get(MAXSCRIPT_UTILITY_CLASS_ID, UTILITY_CLASS_ID, NEL3D_APPDATA_ENV_FX); + if (raw) + { + nlinfo("Found NEL3D_APPDATA_ENV_FX, size %i", raw->Value.size()); + } + + } + } + } + */ + +/* + GsfInput *input = gsf_infile_child_by_name(infile, streamname); + + { + //gsf_input_dump(input, 1); // just a regular hex dump of this input stream + PIPELINE::MAX::CStorageStream instream(input); + //dumpContainer(instream, ""); + PIPELINE::MAX::CScene ctr; + ctr.serial(instream); + ctr.toString(std::cout); + std::cout << "\n"; + //ctr.dump(""); + } + + g_object_unref(input); + */ + + + g_object_unref(infile); + g_object_unref(src); + + gsf_shutdown(); + + return 0; +} + diff --git a/code/nel/tools/3d/pipeline_max_dump/scene_2010.c b/code/nel/tools/3d/pipeline_max_dump/scene_2010.c new file mode 100644 index 000000000..651b01d64 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max_dump/scene_2010.c @@ -0,0 +1,19166 @@ + +(DllDirectory) [0] PARSED { +0x21c0: (CStorageValue) { 786432216 } +Entries[0]: (DllEntry) [2] PARSED { + DllDescription: Viewport Manager for DirectX (Autodesk) + DllFilename: ViewportManager.gup } +Entries[1]: (DllEntry) [2] PARSED { + DllDescription: mental ray: Material Custom Attributes (Autodesk) + DllFilename: mrMaterialAttribs.gup } +Entries[2]: (DllEntry) [2] PARSED { + DllDescription: Custom Attribute Container (Autodesk) + DllFilename: CustAttribContainer.dlo } +Entries[3]: (DllEntry) [2] PARSED { + DllDescription: Standard Materials and Textures (Autodesk) + DllFilename: mtl.dlt } +Entries[4]: (DllEntry) [2] PARSED { + DllDescription: Standard Samplers (Autodesk) + DllFilename: samplers.dlh } +Entries[5]: (DllEntry) [2] PARSED { + DllDescription: Default Materials and Textures (Autodesk) + DllFilename: mtlgen.dlt } +Entries[6]: (DllEntry) [2] PARSED { + DllDescription: ProSound - Multitrack Audio + DllFilename: ProSound.dlc } +Entries[7]: (DllEntry) [2] PARSED { + DllDescription: Editable Poly Object (Autodesk) + DllFilename: EPoly.dlo } +Entries[8]: (DllEntry) [2] PARSED { + DllDescription: Standard Pre-Filter Kernels (Autodesk) + DllFilename: kernel.dlk } +Entries[9]: (DllEntry) [2] PARSED { + DllDescription: Default Scanline Renderer (Autodesk) + DllFilename: rend.dlr } +Entries[10]: (DllEntry) [2] PARSED { + DllDescription: Standard Controllers (Autodesk) + DllFilename: ctrl.dlc } +Entries[11]: (DllEntry) [2] PARSED { + DllDescription: Block Manager Utility (Autodesk) + DllFilename: AcadBlocks.dlu } +Entries[12]: (DllEntry) [2] PARSED { + DllDescription: Propagation Manager Utility (Autodesk) + DllFilename: InstanceMgr.dlu } +Entries[13]: (DllEntry) [2] PARSED { + DllDescription: Scene Effect Manager (Autodesk) + DllFilename: SceneEffectLoader.dlu } +Entries[14]: (DllEntry) [2] PARSED { + DllDescription: Change Reaction Controller (Autodesk) + DllFilename: reactor.dlc } +Entries[15]: (DllEntry) [2] PARSED { + DllDescription: ParameterEditor (Autodesk) + DllFilename: ParamEditor.gup } +Entries[16]: (DllEntry) [2] PARSED { + DllDescription: Bitmap Proxies (Autodesk) + DllFilename: BitmapProxies.dlu } +Entries[17]: (DllEntry) [2] PARSED { + DllDescription: Standard Bitmap Storages and Filters (Autodesk) + DllFilename: StorageAndFilter.bms } +Entries[18]: (DllEntry) [2] PARSED { + DllDescription: Biped Controller (Autodesk) + DllFilename: biped.dlc } } + +(ClassDirectory3) [0] PARSED { +Entries[0]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x00000082, 0x00000000) + SuperClassId: 130 } + Name: ParamBlock2 } +Entries[1]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 0 + ClassId: (0x5a06293c, 0x30420c1e) + SuperClassId: 4448 } + Name: ViewportManager } +Entries[2]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 1 + ClassId: (0x218ab459, 0x25dc8980) + SuperClassId: 4448 } + Name: mental ray: material custom attribute } +Entries[3]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 2 + ClassId: (0x5ddb3626, 0x23b708db) + SuperClassId: 256 } + Name: CustAttribContainer } +Entries[4]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 3 + ClassId: (0x00001200, 0x00000000) + SuperClassId: 4224 } + Name: Texmaps } +Entries[5]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 3 + ClassId: (0x00000038, 0x00000000) + SuperClassId: 4272 } + Name: Blinn } +Entries[6]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x00000008, 0x00000000) + SuperClassId: 8 } + Name: ParamBlock } +Entries[7]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 4 + ClassId: (0x25773211, 0x00000000) + SuperClassId: 4368 } + Name: Max 2.5 Star } +Entries[8]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 3 + ClassId: (0x00000002, 0x00000000) + SuperClassId: 3072 } + Name: Standard } +Entries[9]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x00002007, 0x00000000) + SuperClassId: 36867 } + Name: Bezier Float } +Entries[10]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 5 + ClassId: (0x00000100, 0x00000000) + SuperClassId: 3104 } + Name: Placement } +Entries[11]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 5 + ClassId: (0x00000100, 0x00000000) + SuperClassId: 3136 } + Name: Output } +Entries[12]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 3 + ClassId: (0x00000240, 0x00000000) + SuperClassId: 3088 } + Name: Bitmap } +Entries[13]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -2 + ClassId: (0x64c75fec, 0x222b9eb9) + SuperClassId: 3072 } + Name: NeL Material } +Entries[14]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x00000c80, 0x00000000) + SuperClassId: 256 } + Name: Material Editor } +Entries[15]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x00003333, 0x00000000) + SuperClassId: 256 } + Name: MtlBaseLib } +Entries[16]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 6 + ClassId: (0x476fa9de, 0x5b918e4e) + SuperClassId: 3328 } + Name: WaveMaster } +Entries[17]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 6 + ClassId: (0x476fa9de, 0x5b918e4a) + SuperClassId: 3328 } + Name: ProSound } +Entries[18]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x00000002, 0x00000000) + SuperClassId: 1 } + Name: RootNode } +Entries[19]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x00002008, 0x00000000) + SuperClassId: 36875 } + Name: Bezier Position } +Entries[20]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x00442313, 0x00000000) + SuperClassId: 36876 } + Name: TCB Rotation } +Entries[21]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x00002010, 0x00000000) + SuperClassId: 36877 } + Name: Bezier Scale } +Entries[22]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x00002005, 0x00000000) + SuperClassId: 36872 } + Name: Position/Rotation/Scale } +Entries[23]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x0d9c20ff, 0x00000000) + SuperClassId: 36880 } + Name: Master Point Controller } +Entries[24]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 7 + ClassId: (0x1bf8338d, 0x192f6098) + SuperClassId: 16 } + Name: Editable Poly } +Entries[25]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x7e9858fe, 0x1dba1df0) + SuperClassId: 4336 } + Name: Base Layer } +Entries[26]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x00000001, 0x00000000) + SuperClassId: 1 } + Name: Node } +Entries[27]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 8 + ClassId: (0x77912301, 0x00000000) + SuperClassId: 4256 } + Name: Area } +Entries[28]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 9 + ClassId: (0x00000001, 0x00000000) + SuperClassId: 3840 } + Name: Default Scanline Renderer } +Entries[29]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x46576167, 0x06546546) + SuperClassId: 512 } + Name: RenderElementMgr } +Entries[30]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x00002011, 0x00000000) + SuperClassId: 36869 } + Name: Bezier Color } +Entries[31]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0xee448b23, 0x00000000) + SuperClassId: 4112 } + Name: RenderEnvironment } +Entries[32]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x00008d52, 0x00000000) + SuperClassId: 256 } + Name: NamedSelSetList } +Entries[33]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x8d73b8aa, 0x90f2ee71) + SuperClassId: 512 } + Name: TVNode } +Entries[34]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 10 + ClassId: (0x4b4b1000, 0x00000000) + SuperClassId: 36867 } + Name: Float List } +Entries[35]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 10 + ClassId: (0x4b4b1001, 0x00000000) + SuperClassId: 36869 } + Name: Point3 List } +Entries[36]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 10 + ClassId: (0x4b4b1005, 0x00000000) + SuperClassId: 36882 } + Name: Point4 List } +Entries[37]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 10 + ClassId: (0x4b4b1002, 0x00000000) + SuperClassId: 36875 } + Name: Position List } +Entries[38]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 10 + ClassId: (0x4b4b1003, 0x00000000) + SuperClassId: 36876 } + Name: Rotation List } +Entries[39]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 10 + ClassId: (0x4b4b1004, 0x00000000) + SuperClassId: 36877 } + Name: Scale List } +Entries[40]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 10 + ClassId: (0x4b4b1015, 0x00000000) + SuperClassId: 36881 } + Name: Block Control } +Entries[41]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 11 + ClassId: (0x1f8c3646, 0x11793bed) + SuperClassId: 36867 } + Name: Block Manager Wrapper } +Entries[42]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 12 + ClassId: (0x5a1b661e, 0x7620792b) + SuperClassId: 36867 } + Name: Propagation Manager Wrapper } +Entries[43]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 13 + ClassId: (0x368d1139, 0xf4044794) + SuperClassId: 36867 } + Name: Scene Effect Loader } +Entries[44]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 14 + ClassId: (0x294a389c, 0x087906d7) + SuperClassId: 256 } + Name: Reaction Manager } +Entries[45]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 15 + ClassId: (0x28250b30, 0x265a2326) + SuperClassId: 4448 } + Name: ParameterCollectorCA } +Entries[46]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 16 + ClassId: (0x4a0c66e1, 0x01513165) + SuperClassId: 2912 } + Name: } +Entries[47]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x0c6f6387, 0x2c1a0a7b) + SuperClassId: 36879 } + Name: SceneAppData Latch } +Entries[48]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 17 + ClassId: (0x5bf94f11, 0x68c22d6f) + SuperClassId: 2912 } + Name: BitmapPagerData } +Entries[49]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 10 + ClassId: (0x0f4871a5, 0x781f1430) + SuperClassId: 36879 } + Name: MasterLayerControlManager } +Entries[50]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 18 + ClassId: (0x57a52b8c, 0x30935afc) + SuperClassId: 36879 } + Name: Max Mixer Clip } +Entries[51]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x00000001, 0x00000000) + SuperClassId: 4294966784 } + Name: Grid Reference } +Entries[52]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x17356912, 0x00000000) + SuperClassId: 4240 } + Name: RenderEffects } +Entries[53]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: 9 + ClassId: (0x00000100, 0x00000000) + SuperClassId: 4304 } + Name: Shadow Map } +Entries[54]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x0d7374fc, 0x51ff028e) + SuperClassId: 512 } + Name: Layer Manager } +Entries[55]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x2cf03595, 0x00000000) + SuperClassId: 256 } + Name: TrackSetList } +Entries[56]: (ClassEntry) [2] PARSED { + Header: (ClassEntryHeader) { + DllIndex: -1 + ClassId: (0x00002222, 0x00000000) + SuperClassId: 256 } + Name: Scene } } + +DBG 1f2ee940 main.cpp 161 main : BUILD +DBG 1f2ee940 main.cpp 163 main : DISOWN +DBG 1f2ee940 main.cpp 165 main : PARSE +DBG 1f2ee940 main.cpp 167 main : CLEAN +(Scene) [1] { +0 0x2012: (SceneClassContainer) [452] { + 0 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!........ + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 01 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 1 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 2 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [39] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: Y..!...%`......!..%..... + Hex: 59 b4 8a 21 80 89 dc 25 60 11 00 00 00 00 00 21 e0 2e 25 00 03 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 00 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 01 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 02 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 03 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 04 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 05 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 06 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 07 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 08 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 09 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: d.............@.... + Hex: 64 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: e.............@.... + Hex: 65 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[13] 0x000e: (StorageRaw) { + Size: 19 + String: f.............@.... + Hex: 66 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[14] 0x000e: (StorageRaw) { + Size: 19 + String: g.............@.... + Hex: 67 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[15] 0x000e: (StorageRaw) { + Size: 19 + String: h.............@.... + Hex: 68 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[16] 0x000e: (StorageRaw) { + Size: 19 + String: i.............@.... + Hex: 69 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[17] 0x000e: (StorageRaw) { + Size: 19 + String: j.............@.... + Hex: 6a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[18] 0x000e: (StorageRaw) { + Size: 19 + String: k.............@.... + Hex: 6b 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[19] 0x000e: (StorageRaw) { + Size: 19 + String: l.............@.... + Hex: 6c 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[20] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: c8 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[21] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: c9 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[22] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: ca 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[23] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cb 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[24] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cc 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[25] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cd 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[26] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: ce 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[27] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cf 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[28] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: d0 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[29] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: dc 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[30] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: dd 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[31] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: de 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[32] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: df 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[33] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e0 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[34] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e1 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[35] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e2 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[36] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e3 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[37] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e4 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[38] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 3 0x0002: (CustAttribSuperClassUnknown: mental ray: material custom attribute, (0x218ab459, 0x25dc8980), 0x00001160, mental ray: Material Custom Attributes (Autodesk)) [0] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } } + 4 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) + 1: (mental ray: material custom attribute, (0x218ab459, 0x25dc8980)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: .... + Hex: 0f 00 00 00 + Int: 15 + Float: 2.10195e-44 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } } + 5 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 6 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 07 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 7 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 8 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 0f 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 9 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 0f 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 10 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 0f 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 11 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 0f 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 12 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 0f 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 13 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 14 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 0 + String: + Hex: } } } + 15 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: ......... + Hex: 20 10 0a 00 00 00 04 00 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 0.9. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 10 + Int: 268435968 + Float: 2.52451e-29 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 16 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!........ + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 11 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 17 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 18 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [39] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: Y..!...%`......!..%..... + Hex: 59 b4 8a 21 80 89 dc 25 60 11 00 00 00 00 00 21 e0 2e 25 00 13 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 00 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 01 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 02 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 03 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 04 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 05 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 06 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 07 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 08 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 09 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: d.............@.... + Hex: 64 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: e.............@.... + Hex: 65 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[13] 0x000e: (StorageRaw) { + Size: 19 + String: f.............@.... + Hex: 66 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[14] 0x000e: (StorageRaw) { + Size: 19 + String: g.............@.... + Hex: 67 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[15] 0x000e: (StorageRaw) { + Size: 19 + String: h.............@.... + Hex: 68 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[16] 0x000e: (StorageRaw) { + Size: 19 + String: i.............@.... + Hex: 69 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[17] 0x000e: (StorageRaw) { + Size: 19 + String: j.............@.... + Hex: 6a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[18] 0x000e: (StorageRaw) { + Size: 19 + String: k.............@.... + Hex: 6b 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[19] 0x000e: (StorageRaw) { + Size: 19 + String: l.............@.... + Hex: 6c 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[20] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: c8 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[21] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: c9 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[22] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: ca 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[23] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cb 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[24] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cc 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[25] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cd 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[26] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: ce 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[27] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cf 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[28] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: d0 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[29] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: dc 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[30] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: dd 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[31] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: de 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[32] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: df 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[33] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e0 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[34] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e1 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[35] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e2 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[36] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e3 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[37] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e4 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[38] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 19 0x0002: (CustAttribSuperClassUnknown: mental ray: material custom attribute, (0x218ab459, 0x25dc8980), 0x00001160, mental ray: Material Custom Attributes (Autodesk)) [0] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } } + 20 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) + 1: (mental ray: material custom attribute, (0x218ab459, 0x25dc8980)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: .... + Hex: 1f 00 00 00 + Int: 31 + Float: 4.34403e-44 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } } + 21 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 22 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 17 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 23 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 24 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 1f 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 25 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 1f 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 26 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 1f 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 27 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 1f 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 28 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 1f 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 29 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 30 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 0 + String: + Hex: } } } + 31 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: ......... + Hex: 20 10 0a 00 00 00 14 00 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 0.9. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 10 + Int: 268435968 + Float: 2.52451e-29 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 32 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!....!... + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 21 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 33 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 34 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [39] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: Y..!...%`......!..%.#... + Hex: 59 b4 8a 21 80 89 dc 25 60 11 00 00 00 00 00 21 e0 2e 25 00 23 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 00 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 01 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 02 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 03 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 04 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 05 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 06 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 07 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 08 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 09 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: d.............@.... + Hex: 64 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: e.............@.... + Hex: 65 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[13] 0x000e: (StorageRaw) { + Size: 19 + String: f.............@.... + Hex: 66 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[14] 0x000e: (StorageRaw) { + Size: 19 + String: g.............@.... + Hex: 67 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[15] 0x000e: (StorageRaw) { + Size: 19 + String: h.............@.... + Hex: 68 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[16] 0x000e: (StorageRaw) { + Size: 19 + String: i.............@.... + Hex: 69 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[17] 0x000e: (StorageRaw) { + Size: 19 + String: j.............@.... + Hex: 6a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[18] 0x000e: (StorageRaw) { + Size: 19 + String: k.............@.... + Hex: 6b 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[19] 0x000e: (StorageRaw) { + Size: 19 + String: l.............@.... + Hex: 6c 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[20] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: c8 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[21] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: c9 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[22] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: ca 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[23] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cb 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[24] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cc 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[25] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cd 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[26] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: ce 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[27] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cf 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[28] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: d0 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[29] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: dc 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[30] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: dd 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[31] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: de 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[32] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: df 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[33] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e0 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[34] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e1 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[35] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e2 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[36] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e3 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[37] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e4 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[38] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 35 0x0002: (CustAttribSuperClassUnknown: mental ray: material custom attribute, (0x218ab459, 0x25dc8980), 0x00001160, mental ray: Material Custom Attributes (Autodesk)) [0] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } } + 36 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) + 1: (mental ray: material custom attribute, (0x218ab459, 0x25dc8980)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: /... + Hex: 2f 00 00 00 + Int: 47 + Float: 6.5861e-44 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } } + 37 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 38 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....'... + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 27 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 39 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 40 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!..../... + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 2f 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 41 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!..../... + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 2f 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 42 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!..../... + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 2f 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 43 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!..../... + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 2f 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 44 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!..../... + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 2f 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 45 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 46 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 0 + String: + Hex: } } } + 47 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: .....$... + Hex: 20 10 0a 00 00 00 24 00 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 0.9. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 10 + Int: 268435968 + Float: 2.52451e-29 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 48 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!....1... + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 31 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 49 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 50 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: =... + Hex: 3d 00 00 00 + Int: 61 + Float: 8.54792e-44 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 51 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 52 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....5... + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 35 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 53 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 54 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....=... + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 3d 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 55 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....=... + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 3d 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 56 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....=... + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 3d 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 57 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....=... + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 3d 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 58 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....=... + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 3d 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 59 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 60 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 61 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: .....2... + Hex: 20 10 0a 00 00 00 32 00 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 0.4. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 62 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!....?... + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 3f 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 63 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 64 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: K... + Hex: 4b 00 00 00 + Int: 75 + Float: 1.05097e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 65 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 66 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....C... + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 43 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 67 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 68 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....K... + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 4b 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 69 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....K... + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 4b 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 70 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....K... + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 4b 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 71 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....K... + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 4b 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 72 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....K... + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 4b 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 73 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 74 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 75 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: .....@... + Hex: 20 10 0a 00 00 00 40 00 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 0.5. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 76 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!....M... + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 4d 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 77 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 78 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: Y... + Hex: 59 00 00 00 + Int: 89 + Float: 1.24716e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 79 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 80 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....Q... + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 51 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 81 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 82 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....Y... + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 59 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 83 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....Y... + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 59 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 84 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....Y... + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 59 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 85 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....Y... + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 59 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 86 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....Y... + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 59 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 87 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 88 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 89 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: .....N... + Hex: 20 10 0a 00 00 00 4e 00 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 0.6. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 90 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!....[... + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 5b 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: ........&. + Hex: 01 00 00 00 01 00 00 00 26 03 } } + 91 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 92 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [39] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: Y..!...%`......!..%.]... + Hex: 59 b4 8a 21 80 89 dc 25 60 11 00 00 00 00 00 21 e0 2e 25 00 5d 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 00 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 01 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 02 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 03 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 04 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 05 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 06 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 07 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 08 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 09 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: d.............@.... + Hex: 64 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: e.............@.... + Hex: 65 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[13] 0x000e: (StorageRaw) { + Size: 19 + String: f.............@.... + Hex: 66 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[14] 0x000e: (StorageRaw) { + Size: 19 + String: g.............@.... + Hex: 67 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[15] 0x000e: (StorageRaw) { + Size: 19 + String: h.............@.... + Hex: 68 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[16] 0x000e: (StorageRaw) { + Size: 19 + String: i.............@.... + Hex: 69 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[17] 0x000e: (StorageRaw) { + Size: 19 + String: j.............@.... + Hex: 6a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[18] 0x000e: (StorageRaw) { + Size: 19 + String: k.............@.... + Hex: 6b 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[19] 0x000e: (StorageRaw) { + Size: 19 + String: l.............@.... + Hex: 6c 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[20] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: c8 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[21] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: c9 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[22] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: ca 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[23] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cb 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[24] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cc 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[25] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cd 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[26] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: ce 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[27] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cf 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[28] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: d0 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[29] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: dc 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[30] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: dd 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[31] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: de 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[32] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: df 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[33] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e0 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[34] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e1 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[35] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e2 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[36] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e3 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[37] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e4 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[38] 0x000c: (StorageRaw) { + Size: 10 + String: ........&. + Hex: 01 00 00 00 00 00 00 00 26 03 } } + 93 0x0002: (CustAttribSuperClassUnknown: mental ray: material custom attribute, (0x218ab459, 0x25dc8980), 0x00001160, mental ray: Material Custom Attributes (Autodesk)) [0] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } } + 94 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) + 1: (mental ray: material custom attribute, (0x218ab459, 0x25dc8980)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: .... + Hex: 86 00 00 00 + Int: 134 + Float: 1.87774e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } } + 95 0x0009: (ControlFloatSuperClassUnknown: Bezier Float, (0x00002007, 0x00000000), 0x00009003, Builtin) [9] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x2501: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } + Orphan[1] 0x2500: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 80 ff ff ff 7f } + Orphan[2] 0x3002: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x3003: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 80 00 00 00 80 } + Orphan[4] 0x2532: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[5] 0x2533: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[6] 0x2534: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[7] 0x3005: (StorageRaw) { + Size: 4 + String: .... + Hex: 86 01 00 00 + Int: 390 + Float: 5.46506e-43 } + Orphan[8] 0x2535: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 96 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: g... + Hex: 67 00 00 00 + Int: 103 + Float: 1.44334e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 97 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [15] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 06 00 } + Orphan[2] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[3] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } } + Orphan[5] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } } + Orphan[6] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 + Int: 4 + Float: 5.60519e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[7] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 05 00 00 00 + Int: 5 + Float: 7.00649e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[8] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 + Int: 6 + Float: 8.40779e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[9] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 07 00 00 00 + Int: 7 + Float: 9.80909e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } } + Orphan[10] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 08 00 00 00 + Int: 8 + Float: 1.12104e-44 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } } + Orphan[11] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 09 00 00 00 + Int: 9 + Float: 1.26117e-44 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } } + Orphan[12] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 0a 00 00 00 + Int: 10 + Float: 1.4013e-44 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0101: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + Orphan[13] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 0b 00 00 00 + Int: 11 + Float: 1.54143e-44 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[14] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 0c 00 00 00 + Int: 12 + Float: 1.68156e-44 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 98 0x000a: (UVGenSuperClassUnknown: Placement, (0x00000100, 0x00000000), 0x00000c20, Default Materials and Textures (Autodesk)) [6] { + AppData: (AppData) [1] PARSED { + Entries[0]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x00000100, 0x00000000) + SuperClassId: 3104 + SubId: 0 + Size: 4 } + Value: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x9002: (StorageRaw) { + Size: 4 + String: ...P + Hex: 03 00 00 50 + Int: 1342177283 + Float: 8.58994e+09 } + Orphan[1] 0x9003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[2] 0x9009: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 + Int: 4 + Float: 5.60519e-45 } + Orphan[3] 0x9005: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x9006: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x900b: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 99 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [21] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....g... + Hex: 0c 00 00 00 00 00 00 21 e0 2e 11 00 67 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 03 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 04 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 01 00 00 00 00 00 92 00 00 00 00 00 40 01 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0b 00 01 00 00 00 00 00 92 00 00 00 00 00 40 02 00 00 00 } + Orphan[13] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0c 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[14] 0x000e: (StorageRaw) { + Size: 16 + String: ..............@. + Hex: 0d 00 10 00 00 00 00 00 80 00 00 00 00 00 40 01 } + Orphan[15] 0x0003: (StorageContainer) [3] { + 0 0x1201: (StorageRaw) { + Size: 70 + String: .......?...>................@..............................?.......... + Hex: 00 02 00 02 00 00 80 3f c7 ba e8 3e 00 00 00 00 00 00 00 00 02 00 00 00 06 00 00 00 40 01 c8 00 00 00 00 00 00 00 00 00 00 00 ff 7f 00 00 ff 7f 01 00 00 00 00 00 00 00 00 00 80 3f 04 00 00 00 00 00 00 00 00 00 } + 1 0x1260: (StorageContainer) [1] { + 0 0x0002: (StorageRaw) { + Size: 16 + String: .R3....K...[..R9 + Hex: 1d 52 33 cb ba d8 80 4b 96 bb 05 5b e6 e7 52 39 } } + 2 0x1240: (StorageRaw) { + Size: 28 + String: P.N.G. .I.m.a.g.e. .F.i.l.e. } } + Orphan[16] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0e 00 12 00 00 00 00 03 81 08 00 00 00 00 40 ff ff ff ff } + Orphan[17] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0f 00 12 00 00 00 00 03 81 08 00 00 00 00 40 ff ff ff ff } + Orphan[18] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 10 00 09 00 00 00 02 00 80 00 00 00 02 00 40 fe ff ff ff } + Orphan[19] 0x000f: (StorageContainer) [1] { + 0 0x0002: (StorageRaw) { + Size: 16 + String: .R3....K...[..R9 + Hex: 1d 52 33 cb ba d8 80 4b 96 bb 05 5b e6 e7 52 39 } } + Orphan[20] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 100 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [6] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 + Int: 4 + Float: 5.60519e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 03 00 } + Orphan[2] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } } + Orphan[3] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } } + Orphan[5] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } } } + 101 0x000b: (TextureOutputSuperClassUnknown: Output, (0x00000100, 0x00000000), 0x00000c40, Default Materials and Textures (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0002: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 102 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....g... + Hex: 0c 00 00 00 01 00 00 21 e0 2e 04 00 67 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 0c 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...? + Hex: 01 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 103 0x000c: (TexmapSuperClassUnknown: Bitmap, (0x00000240, 0x00000000), 0x00000c10, Standard Materials and Textures (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (Placement, (0x00000100, 0x00000000)) + 1: (ParamBlock2, (0x00000082, 0x00000000)) + 2: (Output, (0x00000100, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: .....`... + Hex: 20 10 0a 00 00 00 60 00 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 12 + String: M.a.p. .#.0. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 08 02 00 00 + Int: 520 + Float: 7.28675e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } } + 104 0x0009: (ControlFloatSuperClassUnknown: Bezier Float, (0x00002007, 0x00000000), 0x00009003, Builtin) [9] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x2501: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } + Orphan[1] 0x2500: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 80 ff ff ff 7f } + Orphan[2] 0x3002: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x3003: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 80 00 00 00 80 } + Orphan[4] 0x2532: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[5] 0x2533: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[6] 0x2534: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[7] 0x3005: (StorageRaw) { + Size: 4 + String: .... + Hex: 86 01 00 00 + Int: 390 + Float: 5.46506e-43 } + Orphan[8] 0x2535: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 105 0x0009: (ControlFloatSuperClassUnknown: Bezier Float, (0x00002007, 0x00000000), 0x00009003, Builtin) [9] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x2501: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } + Orphan[1] 0x2500: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 80 ff ff ff 7f } + Orphan[2] 0x3002: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x3003: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 80 00 00 00 80 } + Orphan[4] 0x2532: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[5] 0x2533: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[6] 0x2534: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[7] 0x3005: (StorageRaw) { + Size: 4 + String: .... + Hex: 86 01 00 00 + Int: 390 + Float: 5.46506e-43 } + Orphan[8] 0x2535: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 106 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: q... + Hex: 71 00 00 00 + Int: 113 + Float: 1.58347e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 107 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [15] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 06 00 } + Orphan[2] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[3] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } } + Orphan[5] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } } + Orphan[6] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 + Int: 4 + Float: 5.60519e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[7] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 05 00 00 00 + Int: 5 + Float: 7.00649e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[8] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 + Int: 6 + Float: 8.40779e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[9] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 07 00 00 00 + Int: 7 + Float: 9.80909e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } } + Orphan[10] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 08 00 00 00 + Int: 8 + Float: 1.12104e-44 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } } + Orphan[11] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 09 00 00 00 + Int: 9 + Float: 1.26117e-44 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } } + Orphan[12] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 0a 00 00 00 + Int: 10 + Float: 1.4013e-44 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0101: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + Orphan[13] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 0b 00 00 00 + Int: 11 + Float: 1.54143e-44 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[14] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 0c 00 00 00 + Int: 12 + Float: 1.68156e-44 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 108 0x000a: (UVGenSuperClassUnknown: Placement, (0x00000100, 0x00000000), 0x00000c20, Default Materials and Textures (Autodesk)) [6] { + AppData: (AppData) [1] PARSED { + Entries[0]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x00000100, 0x00000000) + SuperClassId: 3104 + SubId: 0 + Size: 4 } + Value: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x9002: (StorageRaw) { + Size: 4 + String: ...P + Hex: 03 00 00 50 + Int: 1342177283 + Float: 8.58994e+09 } + Orphan[1] 0x9003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[2] 0x9009: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 + Int: 4 + Float: 5.60519e-45 } + Orphan[3] 0x9005: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x9006: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x900b: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 109 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [21] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....q... + Hex: 0c 00 00 00 00 00 00 21 e0 2e 11 00 71 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 03 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 04 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 01 00 00 00 00 00 92 00 00 00 00 00 40 01 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0b 00 01 00 00 00 00 00 92 00 00 00 00 00 40 02 00 00 00 } + Orphan[13] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0c 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[14] 0x000e: (StorageRaw) { + Size: 16 + String: ..............@. + Hex: 0d 00 10 00 00 00 00 00 80 00 00 00 00 00 40 01 } + Orphan[15] 0x0003: (StorageContainer) [3] { + 0 0x1201: (StorageRaw) { + Size: 70 + String: @.@....?...@................@..............................?.......... + Hex: 40 00 40 00 00 00 80 3f cd cc 0c 40 00 00 00 00 00 00 00 00 02 00 00 00 06 00 00 00 40 01 c8 00 00 00 00 00 00 00 00 00 00 00 ff 7f 00 00 ff 7f 01 00 00 00 00 00 00 00 00 00 80 3f 04 00 00 00 00 00 00 00 00 00 } + 1 0x1260: (StorageContainer) [1] { + 0 0x0002: (StorageRaw) { + Size: 16 + String: ..]..".K..SLh4.. + Hex: e1 e4 5d 11 c6 22 7d 4b be e1 53 4c 68 34 97 1f } } + 2 0x1240: (StorageRaw) { + Size: 28 + String: P.N.G. .I.m.a.g.e. .F.i.l.e. } } + Orphan[16] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0e 00 12 00 00 00 00 03 81 08 00 00 00 00 40 ff ff ff ff } + Orphan[17] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0f 00 12 00 00 00 00 03 81 08 00 00 00 00 40 ff ff ff ff } + Orphan[18] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 10 00 09 00 00 00 02 00 80 00 00 00 02 00 40 fe ff ff ff } + Orphan[19] 0x000f: (StorageContainer) [1] { + 0 0x0002: (StorageRaw) { + Size: 16 + String: ..]..".K..SLh4.. + Hex: e1 e4 5d 11 c6 22 7d 4b be e1 53 4c 68 34 97 1f } } + Orphan[20] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 110 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [6] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 + Int: 4 + Float: 5.60519e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 03 00 } + Orphan[2] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } } + Orphan[3] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } } + Orphan[5] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } } } + 111 0x000b: (TextureOutputSuperClassUnknown: Output, (0x00000100, 0x00000000), 0x00000c40, Default Materials and Textures (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0002: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 112 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....q... + Hex: 0c 00 00 00 01 00 00 21 e0 2e 04 00 71 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 0c 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...? + Hex: 01 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 113 0x000c: (TexmapSuperClassUnknown: Bitmap, (0x00000240, 0x00000000), 0x00000c10, Standard Materials and Textures (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (Placement, (0x00000100, 0x00000000)) + 1: (ParamBlock2, (0x00000082, 0x00000000)) + 2: (Output, (0x00000100, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: .....j... + Hex: 20 10 0a 00 00 00 6a 00 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 12 + String: M.a.p. .#.1. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } } + 114 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + References 0x2035: PARSED { + 0: (Bezier Float, (0x00002007, 0x00000000)) + 1: (Bitmap, (0x00000240, 0x00000000)) + 2: (Bezier Float, (0x00002007, 0x00000000)) + 3: (Bitmap, (0x00000240, 0x00000000)) + 4: (Bezier Float, (0x00002007, 0x00000000)) + 5: (Bitmap, (0x00000240, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 07 00 00 00 + Int: 7 + Float: 9.80909e-45 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 115 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....t... + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 74 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 80 3f 00 00 80 3f 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 80 3f 00 00 80 3f 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 80 3f 00 00 80 3f 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 116 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 117 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....|... + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 7c 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 118 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....|... + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 7c 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 119 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....|... + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 7c 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 120 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....|... + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 7c 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 01 00 00 00 40 01 00 00 00 40 01 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@g...@g...@q...@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 67 00 00 00 40 67 00 00 00 40 71 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 121 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....|... + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 7c 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 122 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 123 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 124 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 0 + String: + Hex: } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 08 02 00 00 + Int: 520 + Float: 7.28675e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 125 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0007: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[1] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 0d 00 00 00 00 00 00 21 e0 2e 0a 00 86 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 00 00 04 00 00 00 01 00 80 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 80 00 00 00 00 00 c0 00 00 80 3f 00 00 80 3f 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 80 00 00 00 00 00 c0 00 00 80 3f 00 00 80 3f 00 00 80 3f } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 03 00 06 00 00 00 01 00 80 00 00 00 00 00 c0 00 00 80 3f } + Orphan[6] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 04 00 02 00 00 00 01 00 80 00 00 00 00 00 c0 00 00 80 3f 00 00 80 3f 00 00 80 3f } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 80 00 00 00 00 00 c0 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 06 00 06 00 00 00 01 00 80 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 07 00 02 00 00 00 01 00 80 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 08 00 06 00 00 00 01 00 80 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 04 00 00 00 01 00 80 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 126 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [40] { + Orphan[0] 0x0007: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[1] 0x0009: (StorageRaw) { + Size: 16 + String: .......!..%..... + Hex: 0d 00 00 00 01 00 00 21 e0 2e 25 00 86 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 00 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 03 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 04 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 06 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 08 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: .................#< + Hex: 09 00 00 00 00 00 01 00 82 00 00 00 00 00 c0 0a d7 23 3c } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................#< + Hex: 0a 00 00 00 00 00 01 00 82 00 00 00 00 00 c0 0a d7 23 3c } + Orphan[13] 0x000e: (StorageRaw) { + Size: 19 + String: .................#< + Hex: 0b 00 00 00 00 00 01 00 82 00 00 00 00 00 c0 0a d7 23 3c } + Orphan[14] 0x000e: (StorageRaw) { + Size: 19 + String: .................#< + Hex: 0c 00 00 00 00 00 01 00 82 00 00 00 00 00 c0 0a d7 23 3c } + Orphan[15] 0x000e: (StorageRaw) { + Size: 19 + String: ..................; + Hex: 0d 00 00 00 00 00 01 00 82 00 00 00 00 00 c0 0a d7 a3 3b } + Orphan[16] 0x000e: (StorageRaw) { + Size: 19 + String: ..................; + Hex: 0e 00 00 00 00 00 01 00 82 00 00 00 00 00 c0 0a d7 a3 3b } + Orphan[17] 0x000e: (StorageRaw) { + Size: 19 + String: ..................; + Hex: 0f 00 00 00 00 00 01 00 82 00 00 00 00 00 c0 0a d7 a3 3b } + Orphan[18] 0x000e: (StorageRaw) { + Size: 19 + String: ..................; + Hex: 10 00 00 00 00 00 01 00 82 00 00 00 00 00 c0 0a d7 a3 3b } + Orphan[19] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 11 00 00 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 80 3f } + Orphan[20] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 12 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[21] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 13 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[22] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 14 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[23] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 15 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[24] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 16 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[25] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 17 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[26] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 18 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[27] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 19 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[28] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 1a 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[29] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 1b 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[30] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 1c 00 00 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[31] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 1d 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 02 00 00 00 } + Orphan[32] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 1e 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 05 00 00 00 } + Orphan[33] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 1f 00 04 00 00 00 01 00 80 00 00 00 00 00 c0 00 00 00 00 } + Orphan[34] 0x000e: (StorageRaw) { + Size: 19 + String: .................. + Hex: 20 00 04 00 00 00 01 00 80 00 00 00 00 00 c0 01 00 00 00 } + Orphan[35] 0x000e: (StorageRaw) { + Size: 19 + String: !.................. + Hex: 21 00 04 00 00 00 01 00 80 00 00 00 00 00 c0 00 00 00 00 } + Orphan[36] 0x000e: (StorageRaw) { + Size: 19 + String: ".................. + Hex: 22 00 04 00 00 00 01 00 80 00 00 00 00 00 c0 00 00 00 00 } + Orphan[37] 0x000e: (StorageRaw) { + Size: 27 + String: #.................?.......? + Hex: 23 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 80 3f 00 00 00 00 00 00 80 3f } + Orphan[38] 0x000e: (StorageRaw) { + Size: 19 + String: $.................. + Hex: 24 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[39] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 127 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [27] { + References 0x2035: PARSED { + 0: (Bitmap, (0x00000240, 0x00000000)) + 1: (Bitmap, (0x00000240, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0007: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[1] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 0d 00 00 00 02 00 00 21 e0 2e 18 00 86 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 00 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 03 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 04 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 06 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 08 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[13] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0b 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[14] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0c 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[15] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0d 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[16] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0e 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[17] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0f 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[18] 0x000e: (StorageRaw) { + Size: 15 + String: ..............@ + Hex: 10 00 0f 00 00 00 00 00 81 00 00 00 00 00 40 } + Orphan[19] 0x000e: (StorageRaw) { + Size: 15 + String: ..............@ + Hex: 11 00 0f 00 00 00 00 00 81 00 00 00 00 00 40 } + Orphan[20] 0x000e: (StorageRaw) { + Size: 15 + String: ..............@ + Hex: 12 00 0f 00 00 00 00 00 81 00 00 00 00 00 40 } + Orphan[21] 0x000e: (StorageRaw) { + Size: 15 + String: ..............@ + Hex: 13 00 0f 00 00 00 00 00 81 00 00 00 00 00 40 } + Orphan[22] 0x000e: (StorageRaw) { + Size: 15 + String: ..............@ + Hex: 14 00 0f 00 00 00 00 00 81 00 00 00 00 00 40 } + Orphan[23] 0x000e: (StorageRaw) { + Size: 15 + String: ..............@ + Hex: 15 00 0f 00 00 00 00 00 81 00 00 00 00 00 40 } + Orphan[24] 0x000e: (StorageRaw) { + Size: 15 + String: ..............@ + Hex: 16 00 0f 00 00 00 00 00 81 00 00 00 00 00 40 } + Orphan[25] 0x000e: (StorageRaw) { + Size: 15 + String: ..............@ + Hex: 17 00 0f 00 00 00 00 00 81 00 00 00 00 00 40 } + Orphan[26] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 128 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [22] { + Orphan[0] 0x0007: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[1] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 0d 00 00 00 03 00 00 21 e0 2e 13 00 86 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 80 3f 00 00 80 3f 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 02 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 03 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 04 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 02 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 06 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 08 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 02 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[13] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0b 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[14] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0c 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 02 00 00 00 } + Orphan[15] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0d 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[16] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0e 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 03 00 00 00 } + Orphan[17] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0f 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 03 00 00 00 } + Orphan[18] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 10 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 03 00 00 00 } + Orphan[19] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 11 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[20] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 12 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 ff 00 00 00 } + Orphan[21] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 129 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [22] { + Orphan[0] 0x0007: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[1] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 0d 00 00 00 04 00 00 21 e0 2e 13 00 86 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 80 3f 00 00 80 3f 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 03 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 04 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 06 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 08 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[13] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0b 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[14] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0c 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[15] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0d 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[16] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0e 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 03 00 00 00 } + Orphan[17] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0f 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 03 00 00 00 } + Orphan[18] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 10 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 03 00 00 00 } + Orphan[19] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 11 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[20] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 12 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 ff 00 00 00 } + Orphan[21] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 130 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [22] { + Orphan[0] 0x0007: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[1] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 0d 00 00 00 05 00 00 21 e0 2e 13 00 86 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 80 3f 00 00 80 3f 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 03 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 04 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 06 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 08 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[13] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0b 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[14] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0c 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[15] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0d 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[16] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0e 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 03 00 00 00 } + Orphan[17] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0f 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 03 00 00 00 } + Orphan[18] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 10 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 03 00 00 00 } + Orphan[19] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 11 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[20] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 12 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 ff 00 00 00 } + Orphan[21] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 131 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [22] { + Orphan[0] 0x0007: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[1] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 0d 00 00 00 06 00 00 21 e0 2e 13 00 86 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 80 3f 00 00 80 3f 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 03 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 04 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 06 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 08 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[13] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0b 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[14] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0c 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[15] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0d 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[16] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0e 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 03 00 00 00 } + Orphan[17] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0f 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 03 00 00 00 } + Orphan[18] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 10 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 03 00 00 00 } + Orphan[19] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 11 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 01 00 00 00 } + Orphan[20] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 12 00 01 00 00 00 01 00 82 00 00 00 00 00 c0 ff 00 00 00 } + Orphan[21] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 132 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [3] { + Orphan[0] 0x0007: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[1] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 0d 00 00 00 07 00 00 21 e0 2e 00 00 86 00 00 00 } + Orphan[2] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 133 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [3] { + Orphan[0] 0x0007: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[1] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 0d 00 00 00 08 00 00 21 e0 2e 00 00 86 00 00 00 } + Orphan[2] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 134 0x000d: (MtlSuperClassUnknown: NeL Material, (0x64c75fec, 0x222b9eb9), 0x00000c00, Script) [5] { + References 0x2034: PARSED { + 0: (Standard, (0x00000002, 0x00000000)) + 1: (ParamBlock2, (0x00000082, 0x00000000)) + 2: (ParamBlock2, (0x00000082, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (ParamBlock2, (0x00000082, 0x00000000)) + 9: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: .....^... + Hex: 20 10 0a 00 00 00 5e 00 00 00 } + Orphan[0] 0x0010: (StorageRaw) { + Size: 8 + String: ........ + Hex: 0e 00 00 00 09 00 00 00 } + Orphan[1] 0x4001: (StorageRaw) { + Size: 50 + String: M.T.R.L._.G.E._.A.c.c._.M.i.k.o.t.o.B.a.n.i.e.r.e. } + Orphan[2] 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 0a 02 00 00 + Int: 522 + Float: 7.31478e-43 } + Orphan[3] 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + 135 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!........ + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 88 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 136 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 137 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [39] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: Y..!...%`......!..%..... + Hex: 59 b4 8a 21 80 89 dc 25 60 11 00 00 00 00 00 21 e0 2e 25 00 8a 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 00 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 01 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 02 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 03 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 04 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 05 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 06 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 15 + String: ......@ ......@ + Hex: 07 00 0f 00 00 00 40 20 81 10 00 00 00 00 40 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 08 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 15 + String: ......@.......@ + Hex: 09 00 0f 00 00 00 40 00 81 10 00 00 00 00 40 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: d.............@.... + Hex: 64 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: e.............@.... + Hex: 65 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[13] 0x000e: (StorageRaw) { + Size: 19 + String: f.............@.... + Hex: 66 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[14] 0x000e: (StorageRaw) { + Size: 19 + String: g.............@.... + Hex: 67 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[15] 0x000e: (StorageRaw) { + Size: 19 + String: h.............@.... + Hex: 68 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[16] 0x000e: (StorageRaw) { + Size: 19 + String: i.............@.... + Hex: 69 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[17] 0x000e: (StorageRaw) { + Size: 19 + String: j.............@.... + Hex: 6a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[18] 0x000e: (StorageRaw) { + Size: 19 + String: k.............@.... + Hex: 6b 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[19] 0x000e: (StorageRaw) { + Size: 19 + String: l.............@.... + Hex: 6c 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[20] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: c8 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[21] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: c9 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[22] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: ca 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[23] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cb 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[24] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cc 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[25] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cd 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[26] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: ce 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[27] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: cf 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[28] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: d0 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[29] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: dc 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[30] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: dd 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[31] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: de 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[32] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: df 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[33] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e0 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[34] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e1 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[35] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e2 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[36] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e3 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[37] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: e4 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[38] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 138 0x0002: (CustAttribSuperClassUnknown: mental ray: material custom attribute, (0x218ab459, 0x25dc8980), 0x00001160, mental ray: Material Custom Attributes (Autodesk)) [0] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } } + 139 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) + 1: (mental ray: material custom attribute, (0x218ab459, 0x25dc8980)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: .... + Hex: 96 00 00 00 + Int: 150 + Float: 2.10195e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } } + 140 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 141 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 8e 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 142 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 143 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 96 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 144 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 96 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 145 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 96 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 146 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 96 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 147 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 96 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 148 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 149 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 0 + String: + Hex: } } } + 150 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: ......... + Hex: 20 10 0a 00 00 00 8b 00 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 0.9. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 10 + Int: 268435968 + Float: 2.52451e-29 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 151 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!........ + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 98 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 152 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 153 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: .... + Hex: a4 00 00 00 + Int: 164 + Float: 2.29813e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 154 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 155 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 9c 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 156 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 157 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 a4 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 158 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 a4 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 159 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 a4 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 160 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 a4 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 161 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 a4 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 162 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 163 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 164 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: ......... + Hex: 20 10 0a 00 00 00 99 00 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 0.9. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 165 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!........ + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 a6 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 166 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 167 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: .... + Hex: b2 00 00 00 + Int: 178 + Float: 2.49431e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 168 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 169 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 aa 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 170 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 171 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 b2 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 172 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 b2 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 173 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 b2 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 174 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 b2 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 175 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 b2 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 176 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 177 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 178 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: ......... + Hex: 20 10 0a 00 00 00 a7 00 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 1.0. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 179 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!........ + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 b4 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 180 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 181 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: .... + Hex: c0 00 00 00 + Int: 192 + Float: 2.69049e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 182 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 183 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 b8 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 184 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 185 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 c0 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 186 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 c0 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 187 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 c0 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 188 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 c0 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 189 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 c0 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 190 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 191 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 192 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: ......... + Hex: 20 10 0a 00 00 00 b5 00 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 1.1. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 193 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!........ + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 c2 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 194 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 195 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: .... + Hex: ce 00 00 00 + Int: 206 + Float: 2.88667e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 196 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 197 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 c6 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 198 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 199 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 ce 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 200 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 ce 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 201 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 ce 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 202 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 ce 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 203 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 ce 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 204 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 205 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 206 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: ......... + Hex: 20 10 0a 00 00 00 c3 00 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 1.2. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 207 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!........ + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 d0 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 208 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 209 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: .... + Hex: dc 00 00 00 + Int: 220 + Float: 3.08286e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 210 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 211 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 d4 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 212 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 213 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 dc 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 214 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 dc 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 215 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 dc 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 216 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 dc 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 217 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 dc 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 218 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 219 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 220 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: ......... + Hex: 20 10 0a 00 00 00 d1 00 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 1.3. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 221 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!........ + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 de 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 222 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 223 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: .... + Hex: ea 00 00 00 + Int: 234 + Float: 3.27904e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 224 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 225 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 e2 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 226 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 227 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 ea 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 228 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 ea 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 229 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 ea 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 230 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 ea 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 231 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 ea 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 232 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 233 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 234 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: ......... + Hex: 20 10 0a 00 00 00 df 00 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 1.4. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 235 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!........ + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 ec 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 236 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 237 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: .... + Hex: f8 00 00 00 + Int: 248 + Float: 3.47522e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 238 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 239 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 f0 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 240 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 241 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 f8 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 242 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 f8 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 243 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 f8 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 244 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 f8 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 245 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 f8 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 246 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 247 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 248 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: ......... + Hex: 20 10 0a 00 00 00 ed 00 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 1.5. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 249 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!........ + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 fa 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 250 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 251 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 01 00 00 + Int: 262 + Float: 3.6714e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 252 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 253 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 fe 00 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 254 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 255 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 06 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 256 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 06 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 257 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 06 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 258 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 06 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 259 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 06 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 260 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 261 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 262 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: ......... + Hex: 20 10 0a 00 00 00 fb 00 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 1.6. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 263 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!........ + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 08 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 264 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 265 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: .... + Hex: 14 01 00 00 + Int: 276 + Float: 3.86758e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 266 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 267 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 0c 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 268 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 269 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 14 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 270 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 14 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 271 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 14 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 272 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 14 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 273 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 14 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 274 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 275 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 276 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: ......... + Hex: 20 10 0a 00 00 00 09 01 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 1.7. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 277 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!........ + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 16 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 278 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 279 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: "... + Hex: 22 01 00 00 + Int: 290 + Float: 4.06377e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 280 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 281 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!........ + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 1a 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 282 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 283 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!...."... + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 22 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 284 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!...."... + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 22 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 285 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!...."... + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 22 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 286 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!...."... + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 22 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 287 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!...."... + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 22 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 288 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 289 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 290 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: ......... + Hex: 20 10 0a 00 00 00 17 01 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 1.8. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 291 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!....$... + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 24 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 292 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 293 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: 0... + Hex: 30 01 00 00 + Int: 304 + Float: 4.25995e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 294 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 295 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....(... + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 28 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 296 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 297 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....0... + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 30 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 298 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....0... + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 30 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 299 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....0... + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 30 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 300 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....0... + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 30 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 301 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....0... + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 30 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 302 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 303 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 304 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: .....%... + Hex: 20 10 0a 00 00 00 25 01 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 1.9. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 305 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!....2... + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 32 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 306 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 307 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: >... + Hex: 3e 01 00 00 + Int: 318 + Float: 4.45613e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 308 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 309 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....6... + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 36 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 310 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 311 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....>... + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 3e 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 312 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....>... + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 3e 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 313 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....>... + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 3e 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 314 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....>... + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 3e 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 315 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....>... + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 3e 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 316 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 317 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 318 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: .....3... + Hex: 20 10 0a 00 00 00 33 01 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 2.0. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 319 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!....@... + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 40 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 320 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 321 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: L... + Hex: 4c 01 00 00 + Int: 332 + Float: 4.65231e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 322 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 323 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....D... + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 44 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 324 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 325 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....L... + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 4c 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 326 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....L... + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 4c 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 327 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....L... + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 4c 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 328 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....L... + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 4c 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 329 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....L... + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 4c 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 330 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 331 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 332 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: .....A... + Hex: 20 10 0a 00 00 00 41 01 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 2.1. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 333 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!....N... + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 4e 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 334 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 335 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: Z... + Hex: 5a 01 00 00 + Int: 346 + Float: 4.84849e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 336 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 337 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....R... + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 52 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 338 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 339 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....Z... + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 5a 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 340 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....Z... + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 5a 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 341 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....Z... + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 5a 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 342 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....Z... + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 5a 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 343 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....Z... + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 5a 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 344 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 345 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 346 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: .....O... + Hex: 20 10 0a 00 00 00 4f 01 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 2.2. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 347 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!....\... + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 5c 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 348 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 349 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: h... + Hex: 68 01 00 00 + Int: 360 + Float: 5.04467e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 350 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 351 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....`... + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 60 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 352 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 353 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....h... + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 68 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 354 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....h... + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 68 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 355 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....h... + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 68 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 356 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....h... + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 68 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 357 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....h... + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 68 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 358 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 359 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 360 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: .....]... + Hex: 20 10 0a 00 00 00 5d 01 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 2.3. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 361 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [6] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: <).Z..B0`......!....j... + Hex: 3c 29 06 5a 1e 0c 42 30 60 11 00 00 00 00 00 21 e0 2e 04 00 6a 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 09 00 00 00 00 00 80 06 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 362 0x0001: (CustAttribSuperClassUnknown: ViewportManager, (0x5a06293c, 0x30420c1e), 0x00001160, Viewport Manager for DirectX (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 363 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ViewportManager, (0x5a06293c, 0x30420c1e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: v... + Hex: 76 01 00 00 + Int: 374 + Float: 5.24086e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 364 0x0004: (TexmapContainerSuperClassUnknown: Texmaps, (0x00001200, 0x00000000), 0x00001080, Standard Materials and Textures (Autodesk)) [6] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x5108: (StorageRaw) { + Size: 4 + String: ...> + Hex: 9a 99 99 3e + Int: 1050253722 + Float: 0.3 } + Orphan[2] 0x510c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x510d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x510e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x510f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 365 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....n... + Hex: 05 00 00 00 00 00 00 21 e0 2e 0c 00 6e 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 00 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 01 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 97 96 16 3f 97 96 16 3f 97 96 16 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ...............fff?fff?fff? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 66 66 66 3f 66 66 66 3f 66 66 66 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 27 + String: ........................... + Hex: 08 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0a 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 cc cc cc 3d } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ..................= + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 cd cc cc 3d } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 366 0x0005: (ShaderSuperClassUnknown: Blinn, (0x00000038, 0x00000000), 0x000010b0, Standard Materials and Textures (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x5020: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 367 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [8] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....v... + Hex: 08 00 00 00 00 00 00 21 e0 2e 06 00 76 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 02 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[7] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 368 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [14] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....v... + Hex: 08 00 00 00 01 00 00 21 e0 2e 0c 00 76 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 27 + String: ..................?...?...? + Hex: 02 00 02 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 3f 00 00 00 3f 00 00 00 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: .......)......@.... + Hex: 03 00 0f 00 00 00 00 29 81 10 00 00 00 00 40 ff ff ff ff } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 06 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 06 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 c0 3f } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 07 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: .................@@ + Hex: 0b 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 40 40 } + Orphan[13] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 369 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [13] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....v... + Hex: 08 00 00 00 02 00 00 21 e0 2e 0b 00 76 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 3f } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 04 00 00 00 01 00 82 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 04 00 00 00 00 00 00 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 05 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 08 00 00 00 00 00 80 00 00 00 00 00 40 ff ff ff ff } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 09 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[12] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 370 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [7] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....v... + Hex: 08 00 00 00 03 00 00 21 e0 2e 04 00 76 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 00 00 04 08 00 00 00 00 82 00 00 00 00 00 00 18 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@....@.... + Hex: 01 00 0f 08 00 00 00 01 81 00 00 00 00 00 00 18 00 00 00 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff 40 ff ff ff ff } + Orphan[3] 0x000e: (StorageRaw) { + Size: 139 + String: ...................@...?@...?@...?@...?@...?@...?@...?@...?@...>@...?@...?@...?@....@....@....@....@...?@...?@...?@...?@...?@...?@...?@...? + Hex: 02 00 06 08 00 00 00 00 92 00 00 00 00 00 00 18 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 9a 99 99 3e 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 00 00 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f 40 00 00 80 3f } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 03 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[5] 0x0005: (StorageRaw) { + Size: 961 + String: $.......ambientMap...........ambientMapAmount...........ambientMapEnable...........bumpMap...........bumpMapAmount...........bumpMapEnable...........diffuseMap...........diffuseMapAmount...........diffuseMapEnable...........displacementMap...........displacementMapAmount...........displacementMapEnable...........filterMap...........filterMapAmount...........filterMapEnable...........glossinessMap...........glossinessMapAmount...........glossinessMapEnable...........opacityMap...........opacityMapAmount...........opacityMapEnable...........reflectionMap...........reflectionMapAmount...........reflectionMapEnable...........refractionMap...........refractionMapAmount...........refractionMapEnable...........selfIllumMap...........selfIllumMapAmount...........selfIllumMapEnable...........specularLevelMap...........specularLevelMapAmount...........specularLevelMapEnable...........specularMap...........specularMapAmount...........specularMapEnable....... + Hex: 24 00 00 00 0b 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 00 01 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 00 00 00 00 11 00 00 00 61 6d 62 69 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 00 00 00 00 08 00 00 00 62 75 6d 70 4d 61 70 00 01 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 41 6d 6f 75 6e 74 00 02 00 08 00 00 00 0e 00 00 00 62 75 6d 70 4d 61 70 45 6e 61 62 6c 65 00 00 00 08 00 00 00 0b 00 00 00 64 69 66 66 75 73 65 4d 61 70 00 01 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 41 6d 6f 75 6e 74 00 02 00 01 00 00 00 11 00 00 00 64 69 66 66 75 73 65 4d 61 70 45 6e 61 62 6c 65 00 00 00 01 00 00 00 10 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 00 01 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0b 00 00 00 16 00 00 00 64 69 73 70 6c 61 63 65 6d 65 6e 74 4d 61 70 45 6e 61 62 6c 65 00 00 00 0b 00 00 00 0a 00 00 00 66 69 6c 74 65 72 4d 61 70 00 01 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 07 00 00 00 10 00 00 00 66 69 6c 74 65 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 07 00 00 00 0e 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 00 01 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 41 6d 6f 75 6e 74 00 02 00 04 00 00 00 14 00 00 00 67 6c 6f 73 73 69 6e 65 73 73 4d 61 70 45 6e 61 62 6c 65 00 00 00 04 00 00 00 0b 00 00 00 6f 70 61 63 69 74 79 4d 61 70 00 01 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 41 6d 6f 75 6e 74 00 02 00 06 00 00 00 11 00 00 00 6f 70 61 63 69 74 79 4d 61 70 45 6e 61 62 6c 65 00 00 00 06 00 00 00 0e 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 00 01 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 09 00 00 00 14 00 00 00 72 65 66 6c 65 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 09 00 00 00 0e 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 00 01 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 41 6d 6f 75 6e 74 00 02 00 0a 00 00 00 14 00 00 00 72 65 66 72 61 63 74 69 6f 6e 4d 61 70 45 6e 61 62 6c 65 00 00 00 0a 00 00 00 0d 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 00 01 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 41 6d 6f 75 6e 74 00 02 00 05 00 00 00 13 00 00 00 73 65 6c 66 49 6c 6c 75 6d 4d 61 70 45 6e 61 62 6c 65 00 00 00 05 00 00 00 11 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 00 01 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 41 6d 6f 75 6e 74 00 02 00 03 00 00 00 17 00 00 00 73 70 65 63 75 6c 61 72 4c 65 76 65 6c 4d 61 70 45 6e 61 62 6c 65 00 00 00 03 00 00 00 0c 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 00 01 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 41 6d 6f 75 6e 74 00 02 00 02 00 00 00 12 00 00 00 73 70 65 63 75 6c 61 72 4d 61 70 45 6e 61 62 6c 65 00 00 00 02 00 00 00 } + Orphan[6] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 371 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!....v... + Hex: 08 00 00 00 04 00 00 21 e0 2e 03 00 76 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 00 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 00 00 00 00 00 00 } } + 372 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [5] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } } + Orphan[3] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[4] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 373 0x0007: (SamplerSuperClassUnknown: Max 2.5 Star, (0x25773211, 0x00000000), 0x00001110, Standard Samplers (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 24 + String: M.a.x. .2...5. .S.t.a.r. } } } + 374 0x0008: (MtlSuperClassUnknown: Standard, (0x00000002, 0x00000000), 0x00000c00, Standard Materials and Textures (Autodesk)) [3] { + References 0x2034: PARSED { + 1: (Texmaps, (0x00001200, 0x00000000)) + 2: (Blinn, (0x00000038, 0x00000000)) + 3: (ParamBlock2, (0x00000082, 0x00000000)) + 4: (ParamBlock2, (0x00000082, 0x00000000)) + 5: (ParamBlock2, (0x00000082, 0x00000000)) + 6: (ParamBlock2, (0x00000082, 0x00000000)) + 7: (ParamBlock2, (0x00000082, 0x00000000)) + 8: (Max 2.5 Star, (0x25773211, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: .....k... + Hex: 20 10 0a 00 00 00 6b 01 00 00 } + Orphan[0] 0x4000: (StorageContainer) [4] { + 0 0x4001: (StorageRaw) { + Size: 24 + String: 2.4. .-. .D.e.f.a.u.l.t. } + 1 0x4003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + 2 0x4020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x4030: (StorageRaw) { + Size: 16 + String: ...............? + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } } + Orphan[1] 0x5300: (StorageRaw) { + Size: 4 + String: .... + Hex: 0d 00 00 00 + Int: 13 + Float: 1.82169e-44 } + Orphan[2] 0x5600: (StorageContainer) [1] { + 0 0x0322: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 375 0x000e: (ReferenceMakerUnknown: Material Editor, (0x00000c80, 0x00000000), 0x00000100, Builtin) [5] { + References 0x2034: PARSED { + 1: (Standard, (0x00000002, 0x00000000)) + 2: (Standard, (0x00000002, 0x00000000)) + 3: (Standard, (0x00000002, 0x00000000)) + 4: (Standard, (0x00000002, 0x00000000)) + 5: (Standard, (0x00000002, 0x00000000)) + 6: (Standard, (0x00000002, 0x00000000)) + 7: (NeL Material, (0x64c75fec, 0x222b9eb9)) + 8: (Standard, (0x00000002, 0x00000000)) + 9: (Standard, (0x00000002, 0x00000000)) + 10: (Standard, (0x00000002, 0x00000000)) + 11: (Standard, (0x00000002, 0x00000000)) + 12: (Standard, (0x00000002, 0x00000000)) + 13: (Standard, (0x00000002, 0x00000000)) + 14: (Standard, (0x00000002, 0x00000000)) + 15: (Standard, (0x00000002, 0x00000000)) + 16: (Standard, (0x00000002, 0x00000000)) + 17: (Standard, (0x00000002, 0x00000000)) + 18: (Standard, (0x00000002, 0x00000000)) + 19: (Standard, (0x00000002, 0x00000000)) + 20: (Standard, (0x00000002, 0x00000000)) + 21: (Standard, (0x00000002, 0x00000000)) + 22: (Standard, (0x00000002, 0x00000000)) + 23: (Standard, (0x00000002, 0x00000000)) + 24: (Standard, (0x00000002, 0x00000000)) + 25: (NeL Material, (0x64c75fec, 0x222b9eb9)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x9010: (StorageRaw) { + Size: 8 + String: ........ + Hex: 06 00 00 00 04 00 00 00 } + Orphan[1] 0x9030: (StorageRaw) { + Size: 96 + String: ................................................................................................ + Hex: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[2] 0x09c0: (StorageRaw) { + Size: 4 + String: .... + Hex: 06 00 00 00 + Int: 6 + Float: 8.40779e-45 } + Orphan[3] 0x90b0: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[4] 0x09d0: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 376 0x000f: (ReferenceMakerUnknown: MtlBaseLib, (0x00003333, 0x00000000), 0x00000100, Builtin) [1] { + References 0x2034: PARSED { + 0: (NeL Material, (0x64c75fec, 0x222b9eb9)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x4110: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 377 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [3] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 00 00 } + Orphan[2] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } } } + 378 0x0010: (SoundObjSuperClassUnknown: WaveMaster, (0x476fa9de, 0x5b918e4e), 0x00000d00, ProSound - Multitrack Audio) [0] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } } + 379 0x0011: (SoundObjSuperClassUnknown: ProSound, (0x476fa9de, 0x5b918e4a), 0x00000d00, ProSound - Multitrack Audio) [29] { + References 0x2034: PARSED { + 0: (WaveMaster, (0x476fa9de, 0x5b918e4e)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x4990: (StorageRaw) { + Size: 4 + String: .... + Hex: 8c 00 00 00 + Int: 140 + Float: 1.96182e-43 } + Orphan[1] 0x5000: (StorageRaw) { + Size: 4 + String: <... + Hex: 3c 00 00 00 + Int: 60 + Float: 8.40779e-44 } + Orphan[2] 0x5001: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 + Int: 4 + Float: 5.60519e-45 } + Orphan[3] 0x5002: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[4] 0x5003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x5004: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[6] 0x5005: (StorageRaw) { + Size: 4 + String: .... + Hex: d0 07 00 00 + Int: 2000 + Float: 2.8026e-42 } + Orphan[7] 0x5006: (StorageRaw) { + Size: 4 + String: .... + Hex: e8 03 00 00 + Int: 1000 + Float: 1.4013e-42 } + Orphan[8] 0x5008: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[9] 0x5009: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[10] 0x500a: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[11] 0x500b: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[12] 0x500c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[13] 0x500d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[14] 0x500e: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[15] 0x500f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[16] 0x5010: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[17] 0x5011: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[18] 0x5012: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[19] 0x5013: (StorageRaw) { + Size: 4 + String: d... + Hex: 64 00 00 00 + Int: 100 + Float: 1.4013e-43 } + Orphan[20] 0x5014: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[21] 0x5015: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[22] 0x5016: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } + Orphan[23] 0x5100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[24] 0x5110: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[25] 0x5120: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[26] 0x5130: (StorageRaw) { + Size: 8 + String: .....>.. + Hex: 00 00 00 00 80 3e 00 00 } + Orphan[27] 0x5140: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[28] 0x5150: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 380 0x0012: (RootNode: RootNode, (0x00000002, 0x00000000), 0x00000001, Builtin) [1] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Children: IMPLICIT { + 0: (Node, (0x00000001, 0x00000000)) GE_Acc_MikotoBaniere } + Orphan[0] 0x0120: (StorageRaw) { + Size: 0 + String: + Hex: } } + 381 0x0013: (ControlPositionSuperClassUnknown: Bezier Position, (0x00002008, 0x00000000), 0x0000900b, Builtin) [9] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x2503: (StorageRaw) { + Size: 12 + String: .....%f..... + Hex: 00 00 00 00 9c 25 66 b2 00 00 80 b3 } + Orphan[1] 0x2500: (StorageRaw) { + Size: 8 + String: ........ } + Orphan[2] 0x3002: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x3003: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 80 00 00 00 80 } + Orphan[4] 0x2532: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[5] 0x2533: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[6] 0x2534: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[7] 0x3005: (StorageRaw) { + Size: 4 + String: .... + Hex: 86 01 00 00 + Int: 390 + Float: 5.46506e-43 } + Orphan[8] 0x2535: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 382 0x0014: (ControlRotationSuperClassUnknown: TCB Rotation, (0x00442313, 0x00000000), 0x0000900c, Builtin) [9] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x2504: (StorageRaw) { + Size: 16 + String: ..5...5...52..5? + Hex: f2 04 35 bf f3 04 35 b2 f6 04 35 32 f4 04 35 3f } + Orphan[1] 0x2500: (StorageRaw) { + Size: 8 + String: ........ } + Orphan[2] 0x3002: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x3003: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 80 00 00 00 80 } + Orphan[4] 0x2532: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[5] 0x2533: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[6] 0x2534: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[7] 0x3005: (StorageRaw) { + Size: 4 + String: .... + Hex: 86 01 00 00 + Int: 390 + Float: 5.46506e-43 } + Orphan[8] 0x2535: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 383 0x0015: (ControlScaleSuperClassUnknown: Bezier Scale, (0x00002010, 0x00000000), 0x0000900d, Builtin) [9] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x2505: (StorageRaw) { + Size: 28 + String: ...?...?...?...............? + Hex: 00 00 80 3f 00 00 80 3f 00 00 80 3f 00 00 00 80 00 00 00 80 00 00 00 80 00 00 80 3f } + Orphan[1] 0x2500: (StorageRaw) { + Size: 8 + String: ........ } + Orphan[2] 0x3002: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x3003: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 80 00 00 00 80 } + Orphan[4] 0x2532: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[5] 0x2533: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[6] 0x2534: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[7] 0x3005: (StorageRaw) { + Size: 4 + String: .... + Hex: 86 01 00 00 + Int: 390 + Float: 5.46506e-43 } + Orphan[8] 0x2535: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 384 0x0016: (ControlTransformSuperClassUnknown: Position/Rotation/Scale, (0x00002005, 0x00000000), 0x00009008, Builtin) [3] { + References 0x2034: PARSED { + 0: (Bezier Position, (0x00002008, 0x00000000)) + 1: (TCB Rotation, (0x00442313, 0x00000000)) + 2: (Bezier Scale, (0x00002010, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x7230: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x7231: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[2] 0x2535: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 385 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [121] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: .......!..w..... + Hex: 18 00 00 00 00 00 00 21 e0 2e 77 00 83 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 04 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: p..... .......@.... + Hex: 70 00 04 00 00 00 20 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: q..... .......@..I? + Hex: 71 00 05 00 00 00 20 00 92 00 00 00 00 00 40 db 0f 49 3f } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 04 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 06 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 07 00 01 00 00 00 00 00 92 00 00 00 00 00 40 01 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 08 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ..................A + Hex: 09 00 07 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 a0 41 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 07 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0b 00 07 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: [.............@.... + Hex: 5b 00 04 00 00 00 02 00 80 00 00 00 00 00 40 00 00 00 00 } + Orphan[13] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 7f 00 01 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[14] 0x000e: (StorageRaw) { + Size: 19 + String: \.............@...? + Hex: 5c 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 80 3f } + Orphan[15] 0x000e: (StorageRaw) { + Size: 19 + String: ].............@.. A + Hex: 5d 00 07 00 00 00 02 00 90 00 00 00 00 00 40 00 00 20 41 } + Orphan[16] 0x000e: (StorageRaw) { + Size: 19 + String: ^.............@...? + Hex: 5e 00 00 00 00 00 02 00 90 00 00 00 00 00 40 00 00 80 3f } + Orphan[17] 0x000e: (StorageRaw) { + Size: 19 + String: M.............@.... + Hex: 4d 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[18] 0x000e: (StorageRaw) { + Size: 19 + String: Y.............@.... + Hex: 59 00 04 00 00 00 02 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[19] 0x000e: (StorageRaw) { + Size: 19 + String: =.............@.... + Hex: 3d 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[20] 0x000e: (StorageRaw) { + Size: 19 + String: O.............@.... + Hex: 4f 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[21] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0d 00 04 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[22] 0x000e: (StorageRaw) { + Size: 19 + String: Z.............@.... + Hex: 5a 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[23] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 17 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[24] 0x000e: (StorageRaw) { + Size: 19 + String: 4.............@.... + Hex: 34 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[25] 0x000e: (StorageRaw) { + Size: 19 + String: X.............@.... + Hex: 58 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[26] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 19 00 01 00 00 00 01 00 92 00 00 00 00 00 c0 01 00 00 00 } + Orphan[27] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 1a 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[28] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 1d 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[29] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 1b 00 01 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 00 00 } + Orphan[30] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 1e 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[31] 0x000e: (StorageRaw) { + Size: 19 + String: ..................? + Hex: 1c 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 80 3f } + Orphan[32] 0x000e: (StorageRaw) { + Size: 19 + String: .............@.... + Hex: 20 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[33] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 1f 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[34] 0x000e: (StorageRaw) { + Size: 19 + String: !.............@.... + Hex: 21 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[35] 0x000e: (StorageRaw) { + Size: 27 + String: ".............@...?...?...? + Hex: 22 00 02 00 00 00 02 00 82 00 00 00 00 00 40 00 00 80 3f 00 00 80 3f 00 00 80 3f } + Orphan[36] 0x000e: (StorageRaw) { + Size: 19 + String: '.............@.... + Hex: 27 00 01 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[37] 0x000e: (StorageRaw) { + Size: 19 + String: #.............@.... + Hex: 23 00 01 00 00 00 02 00 92 00 00 00 00 00 40 0a 00 00 00 } + Orphan[38] 0x000e: (StorageRaw) { + Size: 19 + String: $.............@.... + Hex: 24 00 01 00 00 00 02 00 92 00 00 00 00 00 40 0a 00 00 00 } + Orphan[39] 0x000e: (StorageRaw) { + Size: 19 + String: %.............@.... + Hex: 25 00 01 00 00 00 02 00 92 00 00 00 00 00 40 0a 00 00 00 } + Orphan[40] 0x000e: (StorageRaw) { + Size: 19 + String: &.............@..I? + Hex: 26 00 05 00 00 00 02 00 92 00 00 00 00 00 40 db 0f 49 3f } + Orphan[41] 0x000e: (StorageRaw) { + Size: 19 + String: (.............@.... + Hex: 28 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[42] 0x000e: (StorageRaw) { + Size: 19 + String: ).............@.... + Hex: 29 00 04 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[43] 0x000e: (StorageRaw) { + Size: 19 + String: *.............@.... + Hex: 2a 00 01 00 00 00 00 00 82 00 00 00 00 00 40 03 00 00 00 } + Orphan[44] 0x000e: (StorageRaw) { + Size: 19 + String: +.................. + Hex: 2b 00 01 00 00 00 01 00 92 00 00 00 00 00 c0 02 00 00 00 } + Orphan[45] 0x000e: (StorageRaw) { + Size: 19 + String: ,.................A + Hex: 2c 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 a0 41 } + Orphan[46] 0x000e: (StorageRaw) { + Size: 19 + String: -.................A + Hex: 2d 00 00 00 00 00 01 00 92 00 00 00 00 00 c0 00 00 a0 41 } + Orphan[47] 0x000e: (StorageRaw) { + Size: 19 + String: .................2> + Hex: 2e 00 05 00 00 00 01 00 92 00 00 00 00 00 c0 c2 b8 32 3e } + Orphan[48] 0x000e: (StorageRaw) { + Size: 19 + String: /.............@.... + Hex: 2f 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[49] 0x000e: (StorageRaw) { + Size: 19 + String: 0.............@.... + Hex: 30 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[50] 0x000e: (StorageRaw) { + Size: 19 + String: 1.............@.... + Hex: 31 00 01 00 00 00 00 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[51] 0x000e: (StorageRaw) { + Size: 19 + String: 2.............@.... + Hex: 32 00 01 00 00 00 00 00 92 00 00 00 00 00 40 02 00 00 00 } + Orphan[52] 0x000e: (StorageRaw) { + Size: 19 + String: 3.............@ N.. + Hex: 33 00 01 00 00 00 00 00 92 00 00 00 00 00 40 20 4e 00 00 } + Orphan[53] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 0c 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[54] 0x000e: (StorageRaw) { + Size: 19 + String: V.............@.... + Hex: 56 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[55] 0x000e: (StorageRaw) { + Size: 19 + String: 5.............@.. A + Hex: 35 00 07 00 00 00 02 00 92 00 00 00 00 00 40 00 00 20 41 } + Orphan[56] 0x000e: (StorageRaw) { + Size: 19 + String: Q.............@.. A + Hex: 51 00 07 00 00 00 02 00 92 00 00 00 00 00 40 00 00 20 41 } + Orphan[57] 0x000e: (StorageRaw) { + Size: 19 + String: R.............@.. A + Hex: 52 00 07 00 00 00 02 00 92 00 00 00 00 00 40 00 00 20 41 } + Orphan[58] 0x000e: (StorageRaw) { + Size: 19 + String: >.............@..@@ + Hex: 3e 00 00 00 00 00 02 00 92 00 00 00 00 00 40 00 00 40 40 } + Orphan[59] 0x000e: (StorageRaw) { + Size: 19 + String: S.............@..@@ + Hex: 53 00 00 00 00 00 02 00 92 00 00 00 00 00 40 00 00 40 40 } + Orphan[60] 0x000e: (StorageRaw) { + Size: 19 + String: P.............@.. A + Hex: 50 00 07 00 00 00 02 00 92 00 00 00 00 00 40 00 00 20 41 } + Orphan[61] 0x000e: (StorageRaw) { + Size: 19 + String: 6.............@.... + Hex: 36 00 07 00 00 00 02 00 92 00 00 00 00 00 40 00 00 80 bf } + Orphan[62] 0x000e: (StorageRaw) { + Size: 19 + String: T.............@.... + Hex: 54 00 07 00 00 00 02 00 92 00 00 00 00 00 40 00 00 80 bf } + Orphan[63] 0x000e: (StorageRaw) { + Size: 19 + String: K.............@...? + Hex: 4b 00 07 00 00 00 02 00 92 00 00 00 00 00 40 00 00 80 3f } + Orphan[64] 0x000e: (StorageRaw) { + Size: 19 + String: L.............@.... + Hex: 4c 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[65] 0x000e: (StorageRaw) { + Size: 19 + String: 7.............@...? + Hex: 37 00 07 00 00 00 02 00 92 00 00 00 00 00 40 00 00 80 3f } + Orphan[66] 0x000e: (StorageRaw) { + Size: 19 + String: U.............@...? + Hex: 55 00 07 00 00 00 02 00 92 00 00 00 00 00 40 00 00 80 3f } + Orphan[67] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 81 00 01 00 00 00 02 00 92 00 00 00 00 00 40 01 00 00 00 } + Orphan[68] 0x000e: (StorageRaw) { + Size: 19 + String: z.............@.... + Hex: 7a 00 07 00 00 00 02 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[69] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...= + Hex: 0f 00 07 00 00 00 02 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[70] 0x000e: (StorageRaw) { + Size: 19 + String: W.............@...= + Hex: 57 00 07 00 00 00 02 00 92 00 00 00 00 00 40 cd cc cc 3d } + Orphan[71] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 10 00 01 00 00 00 02 00 82 00 00 00 00 00 40 04 00 00 00 } + Orphan[72] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@...? + Hex: 11 00 00 00 00 00 02 00 92 00 00 00 00 00 40 00 00 80 3f } + Orphan[73] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 13 00 04 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[74] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 14 00 04 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[75] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 15 00 01 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[76] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 16 00 00 00 00 00 02 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[77] 0x000e: (StorageRaw) { + Size: 19 + String: B.............@.... + Hex: 42 00 01 00 00 00 02 00 92 00 00 00 00 00 40 01 00 00 00 } + Orphan[78] 0x000e: (StorageRaw) { + Size: 15 + String: E.............@ + Hex: 45 00 11 00 00 00 02 00 81 00 00 00 00 00 40 } + Orphan[79] 0x000e: (StorageRaw) { + Size: 19 + String: F.............@.... + Hex: 46 00 01 00 00 00 02 00 92 00 00 00 00 00 40 06 00 00 00 } + Orphan[80] 0x000e: (StorageRaw) { + Size: 19 + String: G.............@.... + Hex: 47 00 00 00 00 00 02 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[81] 0x000e: (StorageRaw) { + Size: 19 + String: H.............@.... + Hex: 48 00 00 00 00 00 02 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[82] 0x000e: (StorageRaw) { + Size: 19 + String: I.............@.... + Hex: 49 00 05 00 00 00 02 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[83] 0x000e: (StorageRaw) { + Size: 19 + String: J.............@.... + Hex: 4a 00 05 00 00 00 02 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[84] 0x000e: (StorageRaw) { + Size: 19 + String: N.............@.... + Hex: 4e 00 04 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[85] 0x000e: (StorageRaw) { + Size: 19 + String: ?.............@...? + Hex: 3f 00 05 00 00 00 02 00 92 00 00 00 00 00 40 92 0a 06 3f } + Orphan[86] 0x000e: (StorageRaw) { + Size: 19 + String: @.............@.... + Hex: 40 00 13 00 00 00 02 00 82 00 00 00 00 00 40 ff ff ff ff } + Orphan[87] 0x000e: (StorageRaw) { + Size: 19 + String: A.............@.... + Hex: 41 00 01 00 00 00 02 00 92 00 00 00 00 00 40 01 00 00 00 } + Orphan[88] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 80 00 01 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[89] 0x000e: (StorageRaw) { + Size: 19 + String: _.............@.. A + Hex: 5f 00 00 00 00 00 00 00 92 00 00 00 00 00 40 00 00 20 41 } + Orphan[90] 0x000e: (StorageRaw) { + Size: 19 + String: `.............@.. A + Hex: 60 00 07 00 00 00 02 00 90 00 00 00 00 00 40 00 00 20 41 } + Orphan[91] 0x000e: (StorageRaw) { + Size: 19 + String: a.............@...? + Hex: 61 00 00 00 00 00 02 00 90 00 00 00 00 00 40 00 00 80 3f } + Orphan[92] 0x000e: (StorageRaw) { + Size: 19 + String: b.............@.... + Hex: 62 00 01 00 00 00 00 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[93] 0x000e: (StorageRaw) { + Size: 19 + String: 8.............@.... + Hex: 38 00 01 00 00 00 02 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[94] 0x000e: (StorageRaw) { + Size: 19 + String: 9.............@.... + Hex: 39 00 13 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[95] 0x000e: (StorageRaw) { + Size: 27 + String: :.............@............ + Hex: 3a 00 03 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[96] 0x000e: (StorageRaw) { + Size: 27 + String: ;.............@............ + Hex: 3b 00 03 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[97] 0x000e: (StorageRaw) { + Size: 27 + String: <.............@............ + Hex: 3c 00 03 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 } + Orphan[98] 0x000e: (StorageRaw) { + Size: 19 + String: e.............@.... + Hex: 65 00 01 00 00 00 02 00 92 00 00 00 00 00 40 01 00 00 00 } + Orphan[99] 0x000e: (StorageRaw) { + Size: 19 + String: c.............@.... + Hex: 63 00 00 00 00 00 02 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[100] 0x000e: (StorageRaw) { + Size: 19 + String: d.............@.... + Hex: 64 00 00 00 00 00 02 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[101] 0x000e: (StorageRaw) { + Size: 19 + String: f.............@..I? + Hex: 66 00 05 00 00 00 02 00 92 00 00 00 00 00 40 db 0f 49 3f } + Orphan[102] 0x000e: (StorageRaw) { + Size: 19 + String: k.............@.... + Hex: 6b 00 01 00 00 00 00 00 92 00 00 00 00 00 40 01 00 00 00 } + Orphan[103] 0x000e: (StorageRaw) { + Size: 19 + String: i.............@.... + Hex: 69 00 01 00 00 00 02 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[104] 0x000e: (StorageRaw) { + Size: 19 + String: j.............@.... + Hex: 6a 00 01 00 00 00 02 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[105] 0x000e: (StorageRaw) { + Size: 19 + String: g.............@.... + Hex: 67 00 01 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[106] 0x000e: (StorageRaw) { + Size: 19 + String: h.............@.... + Hex: 68 00 01 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[107] 0x000e: (StorageRaw) { + Size: 19 + String: l.............@...? + Hex: 6c 00 00 00 00 00 02 00 92 00 00 00 00 00 40 00 00 00 3f } + Orphan[108] 0x000e: (StorageRaw) { + Size: 19 + String: m.............@.... + Hex: 6d 00 01 00 00 00 02 00 92 00 00 00 00 00 40 01 00 00 00 } + Orphan[109] 0x000e: (StorageRaw) { + Size: 19 + String: n.............@.... + Hex: 6e 00 04 00 00 00 02 00 82 00 00 00 00 00 40 01 00 00 00 } + Orphan[110] 0x000e: (StorageRaw) { + Size: 19 + String: o.............@.... + Hex: 6f 00 04 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[111] 0x000e: (StorageRaw) { + Size: 19 + String: s.............@.... + Hex: 73 00 04 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[112] 0x000e: (StorageRaw) { + Size: 19 + String: t.............@.... + Hex: 74 00 04 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[113] 0x000e: (StorageRaw) { + Size: 19 + String: r..... .......@..I? + Hex: 72 00 05 00 00 00 20 00 92 00 00 00 00 00 40 db 0f 49 3f } + Orphan[114] 0x000e: (StorageRaw) { + Size: 19 + String: u.............@.... + Hex: 75 00 01 00 00 00 02 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[115] 0x000e: (StorageRaw) { + Size: 19 + String: v.............@.... + Hex: 76 00 01 00 00 00 02 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[116] 0x000e: (StorageRaw) { + Size: 19 + String: w.............@.... + Hex: 77 00 01 00 00 00 02 00 92 00 00 00 00 00 40 00 00 00 00 } + Orphan[117] 0x000e: (StorageRaw) { + Size: 27 + String: ..............@...?...?.... + Hex: 7b 00 03 00 00 00 02 00 82 00 00 00 00 00 40 00 00 80 3f 97 96 16 3f 00 00 00 00 } + Orphan[118] 0x000e: (StorageRaw) { + Size: 27 + String: |.............@..r?..Y?.... + Hex: 7c 00 03 00 00 00 02 00 82 00 00 00 00 00 40 f4 f2 72 3f db d9 59 3f 00 00 00 00 } + Orphan[119] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 82 00 01 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[120] 0x000c: (StorageRaw) { + Size: 94 + String: .............................................................................................. + Hex: 0f 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 01 00 00 00 00 00 01 00 00 00 00 00 01 00 00 00 00 00 01 00 00 00 00 00 01 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 01 00 00 00 00 00 01 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 } } + 386 0x0017: (MasterPointControllerSuperClassUnknown: Master Point Controller, (0x0d9c20ff, 0x00000000), 0x00009010, Builtin) [1] { + Orphan[0] 0x2535: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 387 0x0018: (GeomObjectSuperClassUnknown: Editable Poly, (0x1bf8338d, 0x192f6098), 0x00000010, Editable Poly Object (Autodesk)) [9] { + AppData: (AppData) [2] PARSED { + Entries[0]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x1cef158c, 0x1da8486f) + SuperClassId: 2912 + SubId: 0 + Size: 4 } + Value: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Entries[1]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x48a057d2, 0x44f70d8a) + SuperClassId: 2912 + SubId: 0 + Size: 1 } + Value: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } } + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) + 1: (Master Point Controller, (0x0d9c20ff, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x4039: (StorageContainer) [2] { + 0 0x0000: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[1] 0x403a: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[2] 0x4038: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x0900: (StorageRaw) { + Size: 44 + String: ............................................ + Hex: 00 00 00 80 ff ff ff 7f 00 00 00 80 ff ff ff 7f 00 00 00 80 ff ff ff 7f 00 00 00 80 ff ff ff 7f 00 00 00 80 ff ff ff 7f ff ff ff ff } + Orphan[4] 0x08fe: (StorageContainer) [13] { + 0 0x0150: (StorageRaw) { + Size: 4 + String: .... + Hex: 0f 00 00 00 + Int: 15 + Float: 2.10195e-44 } + 1 0x0140: (StorageRaw) { + Size: 4 + String: @... + Hex: 40 00 00 00 + Int: 64 + Float: 8.96831e-44 } + 2 0x0130: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x0100: (StorageRaw) { + Size: 3188 + String: .........m...5.<.].?.........'.;.].?........? ...].?......pz......X....>...9......O..<.u+..L........6=*l[<........Jm...5.<~.I>.........'.;~.I>........N ..~.I>......p.....<.<.'.;~.I>...........;.9Q>.....m.....<.9Q>....R9J.f....9Q>......9...."\.<...;.9Q>....wl......N.S.Gc......t.H.H............g..5..=........P....4 .?....?.x..l...N.?....?.x..m.<.N.?...........<(;.?............(;.?.... ......<.d.?.... ........d.?....&.-.`..<<=.?......C...B....?....M.?.W..;bn.?....`......<...?........A...x..?.....:./h...m.<.N.?....?.x>.l...N.?.......>...<(;.?.......>....(;.?.... ..>...<.d.?.... ..>.....d.?....&.->`..<<=.?.....:./`..<.[.?......C>..B;...?....O.?>....bn.?.......=...;x..?....`..=B......?.....:./.......?.....:./..#<...?....".)...#.y .?.....'B...4....?....M.?.....bn.?.....'B.$.4;...?......C...B;...?...........;x..?....`...B......?....&.->...;<=.?....&.->....<=.?.....'B>&.4;...?....O.?>W..;bn.?.....'B>..4....?......C>..B....?....`..=...<...?.......=A...x..?.....:./#.#....?.....:./y..;...?....&.-.w...<=.?....&.-.....<=.?....".)>..#w...<=.?....".)>..#.y .?....".)...#N(.4x..?....>..>*6u..".?.....Y.>W...N..?.....Y.>.....>M7u<.".?.....RC>U..4.6.?......5>.......?....>. >s.@....?....>. >..@<...?......5>...<...?.....RC.U..4.6.?......5........?....>. .s.@....?....>. ...@<...?......5....<...?.........v.4da.?........E...]@.?.....Q..A.7..l.?.....Q..l.7<.l.?...........<]@.?.........H.4Ae.?....2....D..q..?..........$....?..........$<...?....2....D....4.O.?.....?.>cz.4./.?.....c.>=.w4.(.?....(.;..xf4...?......./q.f4so.?....(.;>.xf4...?......./..w4-..? + Hex: c7 00 00 00 0c 00 00 00 0b 6d 09 ba db 35 c5 3c e4 5d 15 3f 04 00 00 00 8e d3 cd bc d2 27 cb 3b e4 5d 15 3f 04 00 00 00 1b d9 80 bc 3f 20 ba bc e4 5d 15 3f 04 00 00 00 94 84 70 3c 3f 20 ba bc e4 5d 15 3f 0c 00 00 00 bb 3c c5 3c da 27 cb 3b e4 5d 15 3f 0c 00 00 00 5d 8c fd b9 ac bd 30 3d c9 c1 da 3f 04 00 00 00 e7 19 43 bd 58 4d 54 3c 3d d5 db 3f 04 00 00 00 49 97 e9 bc 02 50 2a bd 9d ba db 3f 04 00 00 00 ec 2c e0 3c 6e d7 26 bd a1 b1 db 3f 0c 00 00 00 35 c7 eb b9 a0 6f 35 3d 13 6a c2 be 04 00 00 00 d2 58 36 bd a6 e1 5f 3c 3e 7a bf be 04 00 00 00 58 cf de bc 04 3e 1c bd c6 39 c3 be 04 00 00 00 4f 9a e4 3c 10 75 2b bd b3 4c c2 be 0c 00 00 00 86 da 36 3d 2a 6c 5b 3c 86 c6 bf be 0c 00 00 00 4a 6d 09 ba ce 35 c5 3c 7e 80 49 3e 04 00 00 00 91 d3 cd bc 92 27 cb 3b 7e 80 49 3e 04 00 00 00 1d d9 80 bc 4e 20 ba bc 7e 80 49 3e 04 00 00 00 92 84 70 3c 4c 20 ba bc 7e 80 49 3e 04 00 00 00 b7 3c c5 3c 9c 27 cb 3b 7e 80 49 3e 04 00 00 00 cb f2 a0 bc d9 d3 90 3b f0 39 51 3e 0c 00 00 00 1a 6d 09 ba c5 05 96 3c f0 39 51 3e 04 00 00 00 52 39 4a bc 66 f3 93 bc f0 39 51 3e 04 00 00 00 b6 0b 39 3c 65 f3 93 bc f0 39 51 3e 04 00 00 00 22 5c 98 3c e1 d3 90 3b f0 39 51 3e 0c 00 00 00 77 6c 09 ba d4 05 96 3c 6c 13 13 3f 04 00 00 00 c8 f2 a0 bc 07 d4 90 3b 6e 13 13 3f 04 00 00 00 48 39 4a bc 59 f3 93 bc 6e 13 13 3f 04 00 00 00 be 0b 39 3c 59 f3 93 bc 6e 13 13 3f 0c 00 00 00 fd 5b 98 3c 10 d4 90 3b 6c 13 13 3f 0c 00 00 00 2e 3d 2f 3d 17 24 56 3c 50 5a db 3f 0c 00 00 00 c8 d8 35 3a 64 47 fb 3c 6a 4d cd be 04 00 00 00 74 75 05 bd ba 87 33 3c c9 e3 c9 be 04 00 00 00 df 8d 8f bc df a9 e0 bc 61 ad cf be 04 00 00 00 f1 fa af 3c cb 73 e2 bc 18 e6 cd be 0c 00 00 00 96 19 fa 3c 5e de 1c 3c fd fb cc be 0c 00 00 00 5a 97 02 ba 4c b6 f9 3c 9c 0d bb bd 04 00 00 00 da 7d 00 bd 27 94 0d 3c 9c 0d bb bd 04 00 00 00 24 64 9e bc f8 c0 e1 bc 9c 0d bb bd 04 00 00 00 1e fa 9a 3c 52 98 ec bc 9c 0d bb bd 0c 00 00 00 ee b6 fb 3c be f0 0b 3c 9c 0d bb bd 04 00 00 00 d2 fe c2 39 cd 08 02 3d 4e 0d de 3f 04 00 00 00 bc 3c 05 bd cc 17 0b 3c 6a b1 dd 3f 04 00 00 00 86 91 a8 bc 88 ce f5 bc ec 46 dd 3f 04 00 00 00 5d ee 9c 3c 4c 1f e7 bc 4a 98 dd 3f 04 00 00 00 d4 18 02 3d 8d 1a 1a 3c de 53 de 3f 0c 00 00 00 8e d2 05 ba de 23 d6 3c 72 d1 99 3f 04 00 00 00 5a 34 03 bd fa 49 e7 3b 72 d1 99 3f 04 00 00 00 56 c1 a0 bc ef 56 d0 bc 72 d1 99 3f 04 00 00 00 d8 e5 97 3c 56 4a ce bc 72 d1 99 3f 0c 00 00 00 ea 8e f3 3c c8 9f e8 3b 72 d1 99 3f 0c 00 00 00 64 6e 22 ba 62 6e 0b 3d 5a 89 d6 3f 04 00 00 00 f0 f6 1e bd f8 01 22 3c dd 89 d6 3f 04 00 00 00 d2 62 be bc 2c 32 0a bd 27 8a d6 3f 04 00 00 00 53 e7 b2 3c 84 ba 07 bd d1 89 d6 3f 0c 00 00 00 6c 68 0c 3d 80 2f 23 3c f6 88 d6 3f 04 00 00 00 2d fa fb bc f8 27 e0 3b 3d 77 b4 3f 04 00 00 00 cd e8 98 bc 1e e2 cf bc 69 77 b4 3f 04 00 00 00 38 13 8e 3c ef 25 cd bc 10 77 b4 3f 0c 00 00 00 e5 35 e1 3c 36 d3 e0 3b 60 76 b4 3f 0c 00 00 00 24 35 1f ba 30 bf cd 3c 99 76 b4 3f 0c 00 00 00 99 31 fe b9 05 8d 2d 3d 9a c8 d7 3f 04 00 00 00 95 b9 1b bd aa bc 18 3c c3 26 b3 3f 04 00 00 00 13 c0 bc bc a4 97 01 bd cd 26 b3 3f 04 00 00 00 72 b1 b3 3c ea 47 ff bc ca 26 b3 3f 0c 00 00 00 d5 71 0e 3d 06 21 1a 3c be 26 b3 3f 0c 00 00 00 cf bf fe b9 2d ce 2a 3d 7e 39 d5 3f 0c 00 00 00 8b cb 02 ba b2 fe 08 3d e4 b5 b5 3f 04 00 00 00 8c 2e 3f bd 8c 5f 4e 3c 9f c8 d7 3f 04 00 00 00 25 3b e5 bc 6e 5a 26 bd 97 c8 d7 3f 04 00 00 00 9c e2 db 3c 85 0f 23 bd 9a c8 d7 3f 0c 00 00 00 da 53 2c 3d 2e d0 50 3c a4 c8 d7 3f 04 00 00 00 b7 33 1e bd ee 7b 1c 3c eb b5 b5 3f 04 00 00 00 6b b4 3c bd 4a a0 4a 3c 79 39 d5 3f 04 00 00 00 fb 93 bf bc 08 29 04 bd e1 b5 b5 3f 04 00 00 00 3b 67 e2 bc 0a c9 23 bd 81 39 d5 3f 04 00 00 00 36 80 b6 3c 63 1d 02 bd e4 b5 b5 3f 04 00 00 00 d6 13 d9 3c 16 96 20 bd 7e 39 d5 3f 0c 00 00 00 4f 88 10 3d 16 f3 1d 3c f0 b5 b5 3f 0c 00 00 00 62 3d 2a 3d 20 fe 4c 3c 74 39 d5 3f 0c 00 00 00 a5 12 03 ba dc 3f 06 3d ca 26 b3 3f 0c 00 00 00 40 40 f6 b9 0c c7 0e 3d 40 44 52 be 04 00 00 00 6b e7 11 bd 9a ec 28 3c 40 44 52 be 04 00 00 00 12 76 b2 bc ea c5 fc bc 40 44 52 be 04 00 00 00 9b c3 b2 3c aa 84 07 bd 3f 44 52 be 0c 00 00 00 4f 7e 10 3d 0a 2a 26 3c 40 44 52 be 04 00 00 00 3d a8 41 3d 31 97 8b bc 49 4b 8f be 04 00 00 00 18 f4 3e ba 4e a0 53 bd 47 63 90 be 04 00 00 00 74 02 48 bd 48 f9 85 bc cf db 8f be 04 00 00 00 ec 67 ec bc 35 9a 19 3d d8 d2 8f be 0c 00 00 00 50 95 e9 3c 71 25 1b 3d a7 ac 8f be 0c 00 00 00 82 ef 8e b9 73 5c 4d 3d de 15 c6 3f 04 00 00 00 b9 16 2e bd 29 84 34 3c be 1f c6 3f 0c 00 00 00 ee eb 1d 3d 76 73 36 3c be 1f c6 3f 0c 00 00 00 44 f7 b9 ba 42 44 07 3d b5 8b bb 3f 0c 00 00 00 bf f2 ca ba 30 db 20 3d e7 ff d0 3f 04 00 00 00 7c d0 e1 bc 2f 41 1b bd 8b b8 d0 3f 04 00 00 00 8b 31 cd bc 8e a1 0a bd c3 36 bc 3f 04 00 00 00 7b cb bd 3c f6 8a 08 bd c5 5b bc 3f 04 00 00 00 82 ef 8e b9 df 58 4e bd de 15 c6 3f 04 00 00 00 e2 cf d7 3c a0 3e 1c bd 34 20 d0 3f 00 00 00 02 3f c2 78 be 9a 6c 9e bc 96 4e ed 3f 08 00 00 02 3f c2 78 be a5 6d 9e 3c 96 4e ed 3f 08 00 00 00 d4 17 a4 be ab ef b1 3c 28 3b e0 3f 00 00 00 00 d4 17 a4 be a7 ee b1 bc 28 3b e0 3f 08 00 00 00 20 d1 9c be b3 c7 bf 3c b5 64 d1 3f 00 00 00 00 20 d1 9c be bb c6 bf bc b5 64 d1 3f 08 00 00 00 26 b2 2d be 60 e1 ca 3c 3c 3d c1 3f 00 00 00 00 9c e0 43 be c6 82 42 bb ed 9b bc 3f 08 00 00 00 4d f5 3f be 57 e4 e0 3b 62 6e bc 3f 08 00 00 00 60 a9 db bd 11 ff 07 3c 0f 88 b8 3f 00 00 00 00 c4 90 dc bd 41 eb 87 bb 78 01 b8 3f 00 02 00 00 dc 3a aa 2f 68 e1 ca 3c 46 5b ce 3f 00 02 00 00 e4 3a aa 2f 70 e0 ca bc 44 5b ce 3f 00 02 00 00 e1 3a aa 2f f7 d7 23 3c 00 5b bc 3f 00 02 00 00 e8 3a aa 2f 79 e0 ca bc 01 5b bc 3f 00 02 00 00 e6 3a aa 2f 22 d6 23 bc 00 5b bc 3f 00 00 00 04 3f c2 78 3e a5 6d 9e 3c 96 4e ed 3f 00 00 00 04 3f c2 78 3e 9a 6c 9e bc 96 4e ed 3f 08 00 00 00 d4 17 a4 3e ab ef b1 3c 28 3b e0 3f 00 00 00 00 d4 17 a4 3e a7 ee b1 bc 28 3b e0 3f 08 00 00 00 20 d1 9c 3e b3 c7 bf 3c b5 64 d1 3f 00 00 00 00 20 d1 9c 3e bb c6 bf bc b5 64 d1 3f 08 00 00 00 26 b2 2d 3e 60 e1 ca 3c 3c 3d c1 3f 08 02 00 00 e0 3a aa 2f 60 e1 ca 3c 01 5b bc 3f 08 00 00 00 9e e0 43 3e 06 8a 42 3b ed 9b bc 3f 00 00 00 00 4f f5 3f 3e b7 e0 e0 bb 62 6e bc 3f 00 00 00 00 c4 90 dc 3d dd ee 87 3b 78 01 b8 3f 00 00 00 00 60 a9 db 3d 42 fd 07 bc 0f 88 b8 3f 00 02 00 00 e8 3a aa 2f d7 99 c4 bb 92 0e ba 3f 08 02 00 00 e3 3a aa 2f f5 d7 23 3c a4 91 ba 3f 00 02 00 00 22 b3 29 be 1d d6 23 bc 79 20 c1 3f 00 00 00 00 17 27 42 be ea 87 34 bb ef fc bb 3f 00 00 00 00 4d f5 3f be b7 e0 e0 bb 62 6e bc 3f 00 00 00 00 17 27 42 be 24 8f 34 3b ef fc bb 3f 00 00 00 00 9c e0 43 be 06 8a 42 3b ed 9b bc 3f 00 00 00 00 c4 90 dc bd dd ee 87 3b 78 01 b8 3f 00 00 00 00 60 a9 db bd 42 fd 07 bc 0f 88 b8 3f 00 02 00 00 26 b2 2d 3e 85 9d c4 3b 3c 3d c1 3f 00 02 00 00 26 b2 2d 3e cb 99 c4 bb 3c 3d c1 3f 08 00 00 00 19 27 42 3e 26 8f 34 3b ef fc bb 3f 08 00 00 00 4f f5 3f 3e 57 e4 e0 3b 62 6e bc 3f 00 00 00 00 19 27 42 3e e8 87 34 bb ef fc bb 3f 00 00 00 00 9e e0 43 3e c3 82 42 bb ed 9b bc 3f 08 00 00 00 60 a9 db 3d 11 ff 07 3c 0f 88 b8 3f 00 00 00 00 c4 90 dc 3d 41 eb 87 bb 78 01 b8 3f 00 00 00 00 e8 3a aa 2f 23 d6 23 bc a4 91 ba 3f 00 00 00 00 e4 3a aa 2f 79 9d c4 3b 92 0e ba 3f 00 00 00 00 26 b2 2d be 77 e0 ca bc 3c 3d c1 3f 00 02 00 00 26 b2 2d be cb 99 c4 bb 3c 3d c1 3f 00 02 00 00 22 b3 29 3e fa d7 23 3c 79 20 c1 3f 00 00 00 00 26 b2 2d 3e 77 e0 ca bc 3c 3d c1 3f 00 02 00 00 22 b3 29 3e 1d d6 23 bc 79 20 c1 3f 00 02 00 00 22 b3 29 be fa d7 23 3c 79 20 c1 3f 00 02 00 00 26 b2 2d be 85 9d c4 3b 3c 3d c1 3f 00 00 00 00 3a 25 19 b2 87 1a 1a 34 a1 62 f4 3f 00 00 00 00 59 04 0d b2 46 1a b6 bc 68 51 f2 3f 00 00 00 00 1a c9 f2 b1 22 17 61 bc 1a f9 ee 3f 00 00 00 00 1a c9 f2 b1 53 18 61 3c 1a f9 ee 3f 08 00 00 00 59 04 0d b2 de 1a b6 3c 68 51 f2 3f 00 00 00 00 49 7f a6 3d 8e a0 18 34 77 a7 f1 3f 00 00 00 00 ef 60 9b 3d 61 40 7a bc e7 17 f0 3f 00 00 00 00 70 63 89 3d bd a9 1a bc 65 91 ed 3f 00 00 00 00 70 63 89 3d ec aa 1a 3c 65 91 ed 3f 08 00 00 00 ef 60 9b 3d 8d 41 7a 3c e7 17 f0 3f 00 00 00 00 57 97 14 3e 4e 28 14 34 78 01 eb 3f 00 00 00 00 3e dc 0c 3e 2a 36 75 bc b9 22 ea 3f 00 00 00 00 ff 59 00 3e 57 8c 17 bc 4e ba e8 3f 00 00 00 00 ff 59 00 3e 81 8d 17 3c 4e ba e8 3f 08 00 00 00 3e dc 0c 3e 4d 37 75 3c b9 22 ea 3f 00 00 00 00 7f 52 43 3e 55 9f 0e 34 f9 36 e2 3f 00 00 00 00 11 dd 35 3e ed d1 9b bc 09 ab e1 3f 00 00 00 00 3e 16 20 3e 73 9a 40 bc 9d c8 e0 3f 00 00 00 00 3e 16 20 3e 92 9b 40 3c 9d c8 e0 3f 00 00 00 00 11 dd 35 3e 7b d2 9b 3c 09 ab e1 3f 00 00 00 00 7f 52 43 be 55 9f 0e 34 f8 36 e2 3f 00 00 00 00 11 dd 35 be ed d1 9b bc 09 ab e1 3f 00 00 00 00 3e 16 20 be 73 9a 40 bc 9d c8 e0 3f 00 00 00 00 3e 16 20 be 92 9b 40 3c 9d c8 e0 3f 00 00 00 00 11 dd 35 be 7b d2 9b 3c 09 ab e1 3f 00 00 00 00 99 eb 17 be d2 76 14 34 64 61 eb 3f 00 00 00 00 9b e3 0d be 45 a1 94 bc 5d 40 ea 3f 00 00 00 00 02 51 fb bd 41 b7 37 bc b4 6c e8 3f 08 00 00 00 02 51 fb bd 6c b8 37 3c b4 6c e8 3f 08 00 00 00 9b e3 0d be d7 a1 94 3c 5d 40 ea 3f 00 00 00 00 a4 a7 a4 bd f4 48 18 34 41 65 f1 3f 00 00 00 00 32 cf 9a bd 1e 44 85 bc 71 03 f0 3f 00 00 00 00 05 e1 8a bd 9f b9 24 bc f6 c6 ed 3f 00 00 00 00 05 e1 8a bd cc ba 24 3c f6 c6 ed 3f 08 00 00 00 32 cf 9a bd b6 44 85 3c 71 03 f0 3f 00 00 00 00 f0 59 86 be 93 00 87 34 bb 4f ef 3f 00 00 00 00 be 3f b1 be 63 7a 82 34 ed 2f e1 3f 00 00 00 00 b3 63 a9 be 3d c4 77 34 f2 28 d1 3f 00 00 00 00 f0 59 86 3e 93 00 86 34 bb 4f ef 3f 00 00 00 00 be 3f b1 3e 63 7a 82 34 ed 2f e1 3f 00 00 00 00 b3 63 a9 3e 3d c4 77 34 f2 28 d1 3f 00 00 00 00 28 9f 3b be af 78 66 34 eb b5 bf 3f 00 00 00 00 c3 e0 b7 2f 71 14 66 34 73 6f ba 3f 00 00 00 00 28 9f 3b 3e af 78 66 34 eb b5 bf 3f 00 00 00 00 bf e0 b7 2f e8 85 77 34 2d e1 cd 3f } + 4 0x010a: (StorageRaw) { + Size: 4660 + String: ........................<.........................................................../...................................0...................................1...............................................#....................................................................................................................................................................................................................................................................... ...........!..........."........... ................... ...!......."...........!...".......#...P.......$...........%...........&...........'...........$...#.......%...$.......&...%.......'...&.......#...'...................................................................................................................................(...........)...........*...........+...........,.......)...(.......*...).......+...*.......,...+.......(...,.......-...............=......./...>.......0...?.......1...@...........-......./...........0.../.......1...0.......-...1.......A...^.......C...........D...........E...........F...........3...2.......4...3.......5...4.......6...5.......2...6.......G...[.......I...`.......K...a.......M...\.......O...-.......7...;.......8...7.......9...8.......:...9.......;...:.......<...2.......=...7.......>...8.......?...9.......@...:.......2...A.......B...;.......3...C.......4...D.......5...E.......6...F.......7...G.......H...3.......8...I.......J...4.......9...K.......L...5.......:...M.......N...6.......;...O.......=...O.......>...=.......?...>.......@...?.......O...@.......<...C.......C...D.......D...E.......E...F.......F...<.......H...A.......B...G.......J...H.......G...I.......L...J.......I...K.......N...L.......K...M.......A...N.......M...B...................................................................Q...$.......R...%.......S...&.......T...'.......R...S.......Q...R.......P...Q.......T...P.......S...T...........P...........S.......T...U.......U...............U.......U...S...........R.......S...V.......V...........R...V.......V...............Q.......R...W.......W...........Q...W.......W...........P...X.......X...........Q...X.......X...............Y.......Y...T.......P...Y...........T.......Y...........Z...].......[...H.......a...c.......\...N.......Z...\.......]...B.......\...].......]...[.......^...Z.......\...^.......[...Z.......^...[......._...J......._...[.......`..._.......[...`.......c...L.......\...c.......\...a......._...b.......b...a.......`...b.......b...c......._...c.......`...a.......p...d.......d...........e...o.......f...e.......g...d.......f...........h...f.......i...g.......h...............q...........j...........r.......s.......................................k.......m...l.......n...............n...................j...h...........m.......o...........r...p...........s.......q...........t...........u...p.......w...........u...w.......t...v.......y...........w...y.......v...x.......z...........q...............s.......r...........|...............|.......................~...............................x...z...............................o...t...........................................k...........................k.......l...........................l...........m...........n...............................|...........................|...............................................~...............................................................................n...............................................................~...................~...........i...............k.......................y.......................l...................j.......................z...........p...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................e...........g...........i...........u...........v...........x.......................r.......................o.......................................................................................................t...u.......e...d... + Hex: 84 01 00 00 0c 00 00 01 06 00 00 00 05 00 00 00 0c 00 00 01 05 00 00 00 3c 00 00 00 0c 00 00 01 00 00 00 00 01 00 00 00 04 00 00 01 01 00 00 00 2e 00 00 00 04 00 00 01 07 00 00 00 06 00 00 00 04 00 00 01 01 00 00 00 02 00 00 00 04 00 00 01 02 00 00 00 2f 00 00 00 04 00 00 01 08 00 00 00 07 00 00 00 04 00 00 01 02 00 00 00 03 00 00 00 04 00 00 01 03 00 00 00 30 00 00 00 0c 00 00 01 1d 00 00 00 08 00 00 00 0c 00 00 01 03 00 00 00 04 00 00 00 0c 00 00 01 04 00 00 00 31 00 00 00 0c 00 00 01 05 00 00 00 1d 00 00 00 0c 00 00 01 04 00 00 00 00 00 00 00 0c 00 00 01 0f 00 00 00 0e 00 00 00 0c 00 00 01 0e 00 00 00 23 00 00 00 04 00 00 01 10 00 00 00 0f 00 00 00 04 00 00 01 11 00 00 00 10 00 00 00 04 00 00 01 12 00 00 00 11 00 00 00 0c 00 00 01 0e 00 00 00 12 00 00 00 0c 00 00 01 14 00 00 00 13 00 00 00 04 00 00 01 13 00 00 00 15 00 00 00 04 00 00 01 15 00 00 00 16 00 00 00 04 00 00 01 16 00 00 00 17 00 00 00 0c 00 00 01 17 00 00 00 14 00 00 00 04 00 00 01 13 00 00 00 19 00 00 00 0c 00 00 01 19 00 00 00 18 00 00 00 0c 00 00 01 18 00 00 00 14 00 00 00 04 00 00 01 15 00 00 00 1a 00 00 00 04 00 00 01 1a 00 00 00 19 00 00 00 04 00 00 01 16 00 00 00 1b 00 00 00 04 00 00 01 1b 00 00 00 1a 00 00 00 0c 00 00 01 17 00 00 00 1c 00 00 00 0c 00 00 01 1c 00 00 00 1b 00 00 00 0c 00 00 01 18 00 00 00 1c 00 00 00 0c 00 00 01 09 00 00 00 1e 00 00 00 04 00 00 01 0a 00 00 00 1f 00 00 00 04 00 00 01 0b 00 00 00 20 00 00 00 04 00 00 01 0c 00 00 00 21 00 00 00 0c 00 00 01 0d 00 00 00 22 00 00 00 04 00 00 01 1f 00 00 00 20 00 00 00 0c 00 00 01 1e 00 00 00 1f 00 00 00 04 00 00 01 20 00 00 00 21 00 00 00 0c 00 00 01 22 00 00 00 1e 00 00 00 0c 00 00 01 21 00 00 00 22 00 00 00 0c 00 00 01 23 00 00 00 50 00 00 00 04 00 00 01 24 00 00 00 0f 00 00 00 04 00 00 01 25 00 00 00 10 00 00 00 04 00 00 01 26 00 00 00 11 00 00 00 0c 00 00 01 27 00 00 00 12 00 00 00 0c 00 00 01 24 00 00 00 23 00 00 00 04 00 00 01 25 00 00 00 24 00 00 00 04 00 00 01 26 00 00 00 25 00 00 00 0c 00 00 01 27 00 00 00 26 00 00 00 0c 00 00 01 23 00 00 00 27 00 00 00 0c 00 00 01 0e 00 00 00 14 00 00 00 04 00 00 01 0f 00 00 00 13 00 00 00 04 00 00 01 10 00 00 00 15 00 00 00 04 00 00 01 11 00 00 00 16 00 00 00 04 00 00 01 12 00 00 00 17 00 00 00 0c 00 00 01 00 00 00 00 18 00 00 00 0c 00 00 01 04 00 00 00 1c 00 00 00 04 00 00 01 03 00 00 00 1b 00 00 00 04 00 00 01 02 00 00 00 1a 00 00 00 04 00 00 01 01 00 00 00 19 00 00 00 0c 00 00 01 05 00 00 00 28 00 00 00 04 00 00 01 06 00 00 00 29 00 00 00 04 00 00 01 07 00 00 00 2a 00 00 00 04 00 00 01 08 00 00 00 2b 00 00 00 0c 00 00 01 1d 00 00 00 2c 00 00 00 04 00 00 01 29 00 00 00 28 00 00 00 04 00 00 01 2a 00 00 00 29 00 00 00 04 00 00 01 2b 00 00 00 2a 00 00 00 04 00 00 01 2c 00 00 00 2b 00 00 00 04 00 00 01 28 00 00 00 2c 00 00 00 0c 00 00 01 2d 00 00 00 00 00 00 00 04 00 00 01 2e 00 00 00 3d 00 00 00 04 00 00 01 2f 00 00 00 3e 00 00 00 04 00 00 01 30 00 00 00 3f 00 00 00 0c 00 00 01 31 00 00 00 40 00 00 00 0c 00 00 01 2e 00 00 00 2d 00 00 00 04 00 00 01 2f 00 00 00 2e 00 00 00 04 00 00 01 30 00 00 00 2f 00 00 00 0c 00 00 01 31 00 00 00 30 00 00 00 0c 00 00 01 2d 00 00 00 31 00 00 00 0c 00 00 01 41 00 00 00 5e 00 00 00 04 00 00 01 43 00 00 00 06 00 00 00 04 00 00 01 44 00 00 00 07 00 00 00 04 00 00 01 45 00 00 00 08 00 00 00 0c 00 00 01 46 00 00 00 1d 00 00 00 0c 00 00 01 33 00 00 00 32 00 00 00 04 00 00 01 34 00 00 00 33 00 00 00 04 00 00 01 35 00 00 00 34 00 00 00 0c 00 00 01 36 00 00 00 35 00 00 00 0c 00 00 01 32 00 00 00 36 00 00 00 04 00 00 01 47 00 00 00 5b 00 00 00 04 00 00 01 49 00 00 00 60 00 00 00 04 00 00 01 4b 00 00 00 61 00 00 00 0c 00 00 01 4d 00 00 00 5c 00 00 00 0c 00 00 01 4f 00 00 00 2d 00 00 00 0c 00 00 01 37 00 00 00 3b 00 00 00 04 00 00 01 38 00 00 00 37 00 00 00 04 00 00 01 39 00 00 00 38 00 00 00 0c 00 00 01 3a 00 00 00 39 00 00 00 0c 00 00 01 3b 00 00 00 3a 00 00 00 0c 00 00 01 3c 00 00 00 32 00 00 00 04 00 00 01 3d 00 00 00 37 00 00 00 04 00 00 01 3e 00 00 00 38 00 00 00 04 00 00 01 3f 00 00 00 39 00 00 00 0c 00 00 01 40 00 00 00 3a 00 00 00 0c 00 00 01 32 00 00 00 41 00 00 00 0c 00 00 01 42 00 00 00 3b 00 00 00 04 00 00 01 33 00 00 00 43 00 00 00 04 00 00 01 34 00 00 00 44 00 00 00 04 00 00 01 35 00 00 00 45 00 00 00 0c 00 00 01 36 00 00 00 46 00 00 00 04 00 00 01 37 00 00 00 47 00 00 00 04 00 00 01 48 00 00 00 33 00 00 00 04 00 00 01 38 00 00 00 49 00 00 00 04 00 00 01 4a 00 00 00 34 00 00 00 04 00 00 01 39 00 00 00 4b 00 00 00 04 00 00 01 4c 00 00 00 35 00 00 00 0c 00 00 01 3a 00 00 00 4d 00 00 00 0c 00 00 01 4e 00 00 00 36 00 00 00 0c 00 00 01 3b 00 00 00 4f 00 00 00 0c 00 00 01 3d 00 00 00 4f 00 00 00 04 00 00 01 3e 00 00 00 3d 00 00 00 04 00 00 01 3f 00 00 00 3e 00 00 00 0c 00 00 01 40 00 00 00 3f 00 00 00 0c 00 00 01 4f 00 00 00 40 00 00 00 0c 00 00 01 3c 00 00 00 43 00 00 00 04 00 00 01 43 00 00 00 44 00 00 00 04 00 00 01 44 00 00 00 45 00 00 00 0c 00 00 01 45 00 00 00 46 00 00 00 0c 00 00 01 46 00 00 00 3c 00 00 00 0c 00 00 01 48 00 00 00 41 00 00 00 0c 00 00 01 42 00 00 00 47 00 00 00 04 00 00 01 4a 00 00 00 48 00 00 00 04 00 00 01 47 00 00 00 49 00 00 00 04 00 00 01 4c 00 00 00 4a 00 00 00 04 00 00 01 49 00 00 00 4b 00 00 00 0c 00 00 01 4e 00 00 00 4c 00 00 00 0c 00 00 01 4b 00 00 00 4d 00 00 00 0c 00 00 01 41 00 00 00 4e 00 00 00 0c 00 00 01 4d 00 00 00 42 00 00 00 0c 00 00 01 09 00 00 00 0d 00 00 00 0c 00 00 01 0a 00 00 00 09 00 00 00 04 00 00 01 0b 00 00 00 0a 00 00 00 04 00 00 01 0c 00 00 00 0b 00 00 00 0c 00 00 01 0d 00 00 00 0c 00 00 00 04 00 00 01 51 00 00 00 24 00 00 00 04 00 00 01 52 00 00 00 25 00 00 00 04 00 00 01 53 00 00 00 26 00 00 00 0c 00 00 01 54 00 00 00 27 00 00 00 04 00 00 01 52 00 00 00 53 00 00 00 04 00 00 01 51 00 00 00 52 00 00 00 0c 00 00 01 50 00 00 00 51 00 00 00 0c 00 00 01 54 00 00 00 50 00 00 00 0c 00 00 01 53 00 00 00 54 00 00 00 0c 00 00 01 09 00 00 00 50 00 00 00 04 00 00 01 0c 00 00 00 53 00 00 00 0c 00 00 01 54 00 00 00 55 00 00 00 04 00 00 01 55 00 00 00 0c 00 00 00 0c 00 00 01 0d 00 00 00 55 00 00 00 04 00 00 01 55 00 00 00 53 00 00 00 04 00 00 01 0b 00 00 00 52 00 00 00 04 00 00 01 53 00 00 00 56 00 00 00 04 00 00 01 56 00 00 00 0b 00 00 00 04 00 00 01 52 00 00 00 56 00 00 00 04 00 00 01 56 00 00 00 0c 00 00 00 04 00 00 01 0a 00 00 00 51 00 00 00 04 00 00 01 52 00 00 00 57 00 00 00 04 00 00 01 57 00 00 00 0a 00 00 00 04 00 00 01 51 00 00 00 57 00 00 00 04 00 00 01 57 00 00 00 0b 00 00 00 0c 00 00 01 50 00 00 00 58 00 00 00 04 00 00 01 58 00 00 00 0a 00 00 00 04 00 00 01 51 00 00 00 58 00 00 00 0c 00 00 01 58 00 00 00 09 00 00 00 0c 00 00 01 09 00 00 00 59 00 00 00 0c 00 00 01 59 00 00 00 54 00 00 00 0c 00 00 01 50 00 00 00 59 00 00 00 0c 00 00 01 0d 00 00 00 54 00 00 00 0c 00 00 01 59 00 00 00 0d 00 00 00 0c 00 00 01 5a 00 00 00 5d 00 00 00 04 00 00 01 5b 00 00 00 48 00 00 00 04 00 00 01 61 00 00 00 63 00 00 00 0c 00 00 01 5c 00 00 00 4e 00 00 00 08 00 00 01 5a 00 00 00 5c 00 00 00 0c 00 00 01 5d 00 00 00 42 00 00 00 08 00 00 01 5c 00 00 00 5d 00 00 00 08 00 00 01 5d 00 00 00 5b 00 00 00 0c 00 00 01 5e 00 00 00 5a 00 00 00 08 00 00 01 5c 00 00 00 5e 00 00 00 08 00 00 01 5b 00 00 00 5a 00 00 00 08 00 00 01 5e 00 00 00 5b 00 00 00 04 00 00 01 5f 00 00 00 4a 00 00 00 00 00 00 01 5f 00 00 00 5b 00 00 00 04 00 00 01 60 00 00 00 5f 00 00 00 00 00 00 01 5b 00 00 00 60 00 00 00 04 00 00 01 63 00 00 00 4c 00 00 00 08 00 00 01 5c 00 00 00 63 00 00 00 08 00 00 01 5c 00 00 00 61 00 00 00 00 00 00 01 5f 00 00 00 62 00 00 00 00 00 00 01 62 00 00 00 61 00 00 00 00 00 00 01 60 00 00 00 62 00 00 00 00 00 00 01 62 00 00 00 63 00 00 00 00 00 00 01 5f 00 00 00 63 00 00 00 00 00 00 01 60 00 00 00 61 00 00 00 00 00 00 01 70 00 00 00 64 00 00 00 00 00 01 01 64 00 00 00 bd 00 00 00 08 00 00 01 65 00 00 00 6f 00 00 00 08 00 00 01 66 00 00 00 65 00 00 00 00 00 00 01 67 00 00 00 64 00 00 00 08 00 01 01 66 00 00 00 be 00 00 00 08 00 00 01 68 00 00 00 66 00 00 00 00 00 00 01 69 00 00 00 67 00 00 00 08 00 01 01 68 00 00 00 bf 00 00 00 08 00 00 01 98 00 00 00 71 00 00 00 08 00 00 01 7b 00 00 00 6a 00 00 00 00 00 00 01 93 00 00 00 72 00 00 00 00 00 00 01 73 00 00 00 82 00 00 00 00 00 00 01 94 00 00 00 99 00 00 00 00 00 00 01 82 00 00 00 84 00 00 00 00 00 00 01 86 00 00 00 6b 00 00 00 08 00 00 01 6d 00 00 00 6c 00 00 00 00 00 00 01 6e 00 00 00 83 00 00 00 00 00 00 01 87 00 00 00 6e 00 00 00 00 00 00 01 88 00 00 00 91 00 00 00 08 00 00 01 6a 00 00 00 68 00 00 00 08 00 00 01 81 00 00 00 6d 00 00 00 08 00 00 01 6f 00 00 00 7b 00 00 00 00 00 00 01 72 00 00 00 70 00 00 00 00 00 00 01 91 00 00 00 73 00 00 00 08 00 00 01 71 00 00 00 81 00 00 00 00 00 01 01 74 00 00 00 c0 00 00 00 00 00 00 01 75 00 00 00 70 00 00 00 00 00 01 01 77 00 00 00 c1 00 00 00 00 00 00 01 75 00 00 00 77 00 00 00 08 00 00 01 74 00 00 00 76 00 00 00 00 00 01 01 79 00 00 00 c2 00 00 00 00 00 00 01 77 00 00 00 79 00 00 00 08 00 00 01 76 00 00 00 78 00 00 00 08 00 00 01 7a 00 00 00 7b 00 00 00 08 00 00 01 71 00 00 00 95 00 00 00 00 00 00 01 97 00 00 00 73 00 00 00 00 00 00 01 72 00 00 00 96 00 00 00 08 00 00 01 7c 00 00 00 89 00 00 00 08 00 00 01 8e 00 00 00 7c 00 00 00 08 00 00 01 89 00 00 00 8a 00 00 00 00 00 00 01 90 00 00 00 7e 00 00 00 00 00 00 01 8d 00 00 00 90 00 00 00 08 00 00 01 8c 00 00 00 8f 00 00 00 08 00 00 01 78 00 00 00 7a 00 00 00 00 00 00 01 91 00 00 00 7f 00 00 00 08 00 00 01 8f 00 00 00 81 00 00 00 00 00 00 01 6f 00 00 00 74 00 00 00 00 00 00 01 80 00 00 00 92 00 00 00 08 00 00 01 99 00 00 00 98 00 00 00 00 00 00 01 82 00 00 00 94 00 00 00 00 00 00 01 6b 00 00 00 83 00 00 00 00 00 00 01 83 00 00 00 84 00 00 00 00 00 00 01 84 00 00 00 6b 00 00 00 08 00 00 01 6c 00 00 00 85 00 00 00 00 00 00 01 85 00 00 00 86 00 00 00 08 00 00 01 86 00 00 00 6c 00 00 00 08 00 00 01 87 00 00 00 6d 00 00 00 00 00 00 01 88 00 00 00 6e 00 00 00 08 00 00 01 95 00 00 00 89 00 00 00 00 00 00 01 8a 00 00 00 97 00 00 00 08 00 00 01 7c 00 00 00 8b 00 00 00 08 00 00 01 8b 00 00 00 8c 00 00 00 08 00 00 01 8c 00 00 00 7c 00 00 00 00 00 00 01 7d 00 00 00 8d 00 00 00 00 00 00 01 8d 00 00 00 8e 00 00 00 00 00 00 01 8e 00 00 00 7d 00 00 00 08 00 00 01 8f 00 00 00 7e 00 00 00 00 00 00 01 90 00 00 00 7f 00 00 00 00 00 00 01 91 00 00 00 80 00 00 00 08 00 00 01 92 00 00 00 81 00 00 00 00 00 00 01 85 00 00 00 83 00 00 00 00 00 00 01 87 00 00 00 85 00 00 00 00 00 00 01 88 00 00 00 84 00 00 00 00 00 00 01 6e 00 00 00 80 00 00 00 08 00 00 01 92 00 00 00 87 00 00 00 08 00 00 01 8d 00 00 00 8b 00 00 00 00 00 00 01 8a 00 00 00 8e 00 00 00 00 00 00 01 7d 00 00 00 7f 00 00 00 08 00 00 01 8b 00 00 00 7e 00 00 00 00 00 00 01 80 00 00 00 90 00 00 00 00 00 00 01 7e 00 00 00 92 00 00 00 00 00 00 01 69 00 00 00 93 00 00 00 00 00 00 01 94 00 00 00 6b 00 00 00 08 00 00 01 8c 00 00 00 95 00 00 00 00 00 00 01 96 00 00 00 79 00 00 00 00 00 00 01 97 00 00 00 7d 00 00 00 08 00 00 01 98 00 00 00 6c 00 00 00 00 00 00 01 86 00 00 00 99 00 00 00 08 00 01 01 6a 00 00 00 c3 00 00 00 08 00 01 01 7b 00 00 00 c4 00 00 00 08 00 01 01 7a 00 00 00 c5 00 00 00 00 00 01 01 70 00 00 00 c6 00 00 00 00 00 00 01 a0 00 00 00 9f 00 00 00 00 00 00 01 9f 00 00 00 9a 00 00 00 00 00 00 01 9a 00 00 00 9b 00 00 00 00 00 00 01 9b 00 00 00 a0 00 00 00 00 00 00 01 a1 00 00 00 a0 00 00 00 00 00 00 01 9b 00 00 00 9c 00 00 00 00 00 00 01 9c 00 00 00 a1 00 00 00 00 00 00 01 a2 00 00 00 a1 00 00 00 00 00 00 01 9c 00 00 00 9d 00 00 00 00 00 00 01 9d 00 00 00 a2 00 00 00 08 00 00 01 a3 00 00 00 a2 00 00 00 08 00 00 01 9d 00 00 00 9e 00 00 00 08 00 00 01 9e 00 00 00 a3 00 00 00 08 00 00 01 9f 00 00 00 a3 00 00 00 08 00 00 01 9e 00 00 00 9a 00 00 00 00 00 00 01 a5 00 00 00 a4 00 00 00 00 00 00 01 a4 00 00 00 9f 00 00 00 00 00 00 01 a0 00 00 00 a5 00 00 00 00 00 00 01 a6 00 00 00 a5 00 00 00 00 00 00 01 a1 00 00 00 a6 00 00 00 00 00 00 01 a7 00 00 00 a6 00 00 00 00 00 00 01 a2 00 00 00 a7 00 00 00 08 00 00 01 a8 00 00 00 a7 00 00 00 08 00 00 01 a3 00 00 00 a8 00 00 00 08 00 00 01 a4 00 00 00 a8 00 00 00 00 00 00 01 aa 00 00 00 a9 00 00 00 00 00 00 01 a9 00 00 00 a4 00 00 00 00 00 00 01 a5 00 00 00 aa 00 00 00 00 00 00 01 ab 00 00 00 aa 00 00 00 00 00 00 01 a6 00 00 00 ab 00 00 00 00 00 00 01 ac 00 00 00 ab 00 00 00 00 00 00 01 a7 00 00 00 ac 00 00 00 08 00 00 01 ad 00 00 00 ac 00 00 00 08 00 00 01 a8 00 00 00 ad 00 00 00 08 00 00 01 a9 00 00 00 ad 00 00 00 00 00 00 01 ae 00 00 00 af 00 00 00 00 00 00 01 af 00 00 00 b0 00 00 00 08 00 00 01 b0 00 00 00 b1 00 00 00 08 00 00 01 b1 00 00 00 b2 00 00 00 08 00 00 01 b2 00 00 00 ae 00 00 00 00 00 00 01 b4 00 00 00 b3 00 00 00 00 00 00 01 b3 00 00 00 ae 00 00 00 00 00 00 01 af 00 00 00 b4 00 00 00 00 00 00 01 b5 00 00 00 b4 00 00 00 00 00 00 01 b0 00 00 00 b5 00 00 00 08 00 00 01 b6 00 00 00 b5 00 00 00 08 00 00 01 b1 00 00 00 b6 00 00 00 08 00 00 01 b7 00 00 00 b6 00 00 00 08 00 00 01 b2 00 00 00 b7 00 00 00 08 00 00 01 b3 00 00 00 b7 00 00 00 00 00 00 01 b9 00 00 00 b8 00 00 00 00 00 00 01 b8 00 00 00 b3 00 00 00 00 00 00 01 b4 00 00 00 b9 00 00 00 00 00 00 01 ba 00 00 00 b9 00 00 00 00 00 00 01 b5 00 00 00 ba 00 00 00 00 00 00 01 bb 00 00 00 ba 00 00 00 08 00 00 01 b6 00 00 00 bb 00 00 00 08 00 00 01 bc 00 00 00 bb 00 00 00 08 00 00 01 b7 00 00 00 bc 00 00 00 08 00 00 01 b8 00 00 00 bc 00 00 00 00 00 00 01 9a 00 00 00 b8 00 00 00 00 00 00 01 b9 00 00 00 9b 00 00 00 00 00 00 01 ba 00 00 00 9c 00 00 00 00 00 00 01 bb 00 00 00 9d 00 00 00 08 00 00 01 bc 00 00 00 9e 00 00 00 08 00 01 01 bd 00 00 00 65 00 00 00 00 00 01 01 be 00 00 00 67 00 00 00 00 00 01 01 bf 00 00 00 69 00 00 00 00 00 01 01 c0 00 00 00 75 00 00 00 08 00 01 01 c1 00 00 00 76 00 00 00 08 00 01 01 c2 00 00 00 78 00 00 00 00 00 01 01 c3 00 00 00 93 00 00 00 00 00 01 01 c4 00 00 00 72 00 00 00 00 00 01 01 c5 00 00 00 96 00 00 00 00 00 01 01 c6 00 00 00 6f 00 00 00 00 00 00 01 be 00 00 00 bd 00 00 00 00 00 00 01 bf 00 00 00 be 00 00 00 00 00 00 01 c0 00 00 00 c1 00 00 00 00 00 00 01 c1 00 00 00 c2 00 00 00 00 00 00 01 bf 00 00 00 c3 00 00 00 00 00 00 01 c3 00 00 00 c4 00 00 00 00 00 00 01 c4 00 00 00 c5 00 00 00 00 00 00 01 c5 00 00 00 c2 00 00 00 00 00 00 01 74 00 00 00 75 00 00 00 08 00 00 01 65 00 00 00 64 00 00 00 } + 5 0x011a: (StorageRaw) { + Size: 7042 + String: ....................-...1............................./.......1.............................0.../...1.............................1...0...1.............................-...1...1.....................................9.......................................9.......................................9.......................................9.......................................9................................... ...1.....................................1............................. ...!...1.............................".......1.............................!..."...1............................."...!... ...1.............................$...........#...1.....................%...........$...1.....................&...........%...1.....................'...........&...1.....................#...........'...1.....................................9.......................................9.......................................9.......................................9.......................................9.......................................9.......................................9.......................................9.......................................9.......................................9...............................)...(...1.............................*...)...1.............................+...*...1.............................,...+...1.............................(...,...1.....................)...*...+...,...(...1.................................=...O...-...1...................../...>...=.......1.....................0...?...>.../...1.....................1...@...?...0...1.....................-...O...@...1...1.....................C...........<...1.....................D...........C...1.....................E...........D...1.....................F...........E...1.....................<...........F...1.....................[...Z...].................`..._...[.................c..._...b.................M...\...a...K...1.....................]...Z...\.................=...7...;...O...1.....................>...8...7...=...1.....................?...9...8...>...1.....................@...:...9...?...1.....................O...;...:...@...1.....................<...2...3...C...1.....................C...3...4...D...1.....................D...4...5...E...1.....................E...5...6...F...1.....................F...6...2...<...1.....................H...3...2...A...1.....................B...;...7...G...1.....................J...4...3...H...1.....................G...7...8...I...1.....................L...5...4...J...1.....................I...8...9...K...1.....................N...6...5...L...1.....................K...9...:...M...1.....................A...2...6...N...1.....................M...:...;...B...1.....................Q...$...#...P...1.....................R...%...$...Q...1.....................S...&...%...R...1.....................T...'...&...S...1.....................P...#...'...T...1.........................S...V.........................U.........................Y.....................Q...X.....................R...W.................S.......U.....................T...U.................U...T...S.................S...R...V.................R.......V.................V.........................R...Q...W.................Q.......W.................W.................................X.................Q...P...X.................X...P.........................P...Y.................P...T...Y.................Y...T.....................[...H...A...^...1.....................L...J..._...c...1.....................^...A...N...\...1.....................\...M...B...]...1.....................]...B...G...[...1.....................\...Z...^.................^...Z...[................._...J...H...[...1.....................[...G...I...`...1.....................\...N...L...c...1.....................\...c...a................._...`...b.................`...a...b.................b...a...c.................`...I...K...a...1.....................f...........e...1.....................h...........f...1.............................k....... .................n...........1..... ...............................s...0.........................l.......q.......m...1.................................n...........1..... ...................j...h...f...e...o...1.....................................p...d...g...i.......r...1.....................................v...t...........1.....................x...v...........1.................................|...!.................~...............1..... ...................s...............0.....................................q.......1.....................................~.......1..... ...................o...t...v...x...z...1.....................................p...r.......y...w...u...0.................................k.....................l.........................|.......................................................k.......0.............................k...0.........................l.......1.....................m...........l...1.....................n...............0.....................n...........0.............................m...1.....................|...............1.................................|...1.....................................0.................................0.........................~.......1.....................................0.....................~...........1.........................i...........1.....................r...............1.........................r...........1.....................y...............1.....................o...e...d...p.......1.............................t...u.....................................0.................................0.................................0.................................1.....................................1.....................................0.................................0.................................0.................................1.....................................1.....................................0.................................0.................................0.................................1.....................................1.....................................0.................................0.................................1.....................................1.....................................1.....................................0.................................0.................................1.....................................1.....................................1.....................................0.................................0.................................0.................................1.....................................1.........................g...d.......1.........................i...g.......1.........................u...w.......1.........................w...y.......1.........................h...j.......1.........................j...........1.............................z.......1.........................z...x.......1.....................t...o.......p...u...1.............................e.......d............. + Hex: c2 00 00 00 04 00 00 00 00 00 00 00 01 00 00 00 2e 00 00 00 2d 00 00 00 31 00 0c 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 01 00 00 00 02 00 00 00 2f 00 00 00 2e 00 00 00 31 00 04 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 02 00 00 00 03 00 00 00 30 00 00 00 2f 00 00 00 31 00 04 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 03 00 00 00 04 00 00 00 31 00 00 00 30 00 00 00 31 00 0c 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 04 00 00 00 00 00 00 00 2d 00 00 00 31 00 00 00 31 00 0c 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 14 00 00 00 13 00 00 00 19 00 00 00 18 00 00 00 39 00 0c 00 00 00 09 00 08 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 13 00 00 00 15 00 00 00 1a 00 00 00 19 00 00 00 39 00 04 00 00 00 09 00 08 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 15 00 00 00 16 00 00 00 1b 00 00 00 1a 00 00 00 39 00 04 00 00 00 09 00 08 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 16 00 00 00 17 00 00 00 1c 00 00 00 1b 00 00 00 39 00 0c 00 00 00 09 00 08 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 17 00 00 00 14 00 00 00 18 00 00 00 1c 00 00 00 39 00 0c 00 00 00 09 00 08 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 0b 00 00 00 0a 00 00 00 1f 00 00 00 20 00 00 00 31 00 04 00 00 00 08 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 0a 00 00 00 09 00 00 00 1e 00 00 00 1f 00 00 00 31 00 0c 00 00 01 08 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 0c 00 00 00 0b 00 00 00 20 00 00 00 21 00 00 00 31 00 04 00 00 00 08 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 09 00 00 00 0d 00 00 00 22 00 00 00 1e 00 00 00 31 00 0c 00 00 00 08 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 0d 00 00 00 0c 00 00 00 21 00 00 00 22 00 00 00 31 00 0c 00 00 00 08 00 00 00 00 00 00 00 02 00 00 00 05 00 00 00 1f 00 00 00 1e 00 00 00 22 00 00 00 21 00 00 00 20 00 00 00 31 00 0c 00 00 00 08 00 00 00 02 00 00 00 04 00 00 00 01 00 00 00 04 00 00 00 04 00 00 00 24 00 00 00 0f 00 00 00 0e 00 00 00 23 00 00 00 31 00 0c 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 25 00 00 00 10 00 00 00 0f 00 00 00 24 00 00 00 31 00 04 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 26 00 00 00 11 00 00 00 10 00 00 00 25 00 00 00 31 00 04 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 27 00 00 00 12 00 00 00 11 00 00 00 26 00 00 00 31 00 0c 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 23 00 00 00 0e 00 00 00 12 00 00 00 27 00 00 00 31 00 0c 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 0e 00 00 00 0f 00 00 00 13 00 00 00 14 00 00 00 39 00 0c 00 00 00 0a 00 04 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 0f 00 00 00 10 00 00 00 15 00 00 00 13 00 00 00 39 00 04 00 00 00 0a 00 04 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 10 00 00 00 11 00 00 00 16 00 00 00 15 00 00 00 39 00 04 00 00 00 0a 00 04 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 11 00 00 00 12 00 00 00 17 00 00 00 16 00 00 00 39 00 04 00 00 00 0a 00 04 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 12 00 00 00 0e 00 00 00 14 00 00 00 17 00 00 00 39 00 0c 00 00 00 0a 00 04 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 00 00 00 00 04 00 00 00 1c 00 00 00 18 00 00 00 39 00 0c 00 00 00 0a 00 04 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 04 00 00 00 03 00 00 00 1b 00 00 00 1c 00 00 00 39 00 0c 00 00 00 0a 00 04 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 03 00 00 00 02 00 00 00 1a 00 00 00 1b 00 00 00 39 00 04 00 00 00 0a 00 04 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 02 00 00 00 01 00 00 00 19 00 00 00 1a 00 00 00 39 00 04 00 00 00 0a 00 04 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 01 00 00 00 00 00 00 00 18 00 00 00 19 00 00 00 39 00 0c 00 00 00 0a 00 04 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00 29 00 00 00 28 00 00 00 31 00 0c 00 00 00 08 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 06 00 00 00 07 00 00 00 2a 00 00 00 29 00 00 00 31 00 04 00 00 00 08 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 07 00 00 00 08 00 00 00 2b 00 00 00 2a 00 00 00 31 00 04 00 00 00 08 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 08 00 00 00 1d 00 00 00 2c 00 00 00 2b 00 00 00 31 00 0c 00 00 00 08 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 1d 00 00 00 05 00 00 00 28 00 00 00 2c 00 00 00 31 00 0c 00 00 00 08 00 00 00 00 00 00 00 02 00 00 00 05 00 00 00 29 00 00 00 2a 00 00 00 2b 00 00 00 2c 00 00 00 28 00 00 00 31 00 04 00 00 00 08 00 00 00 02 00 00 00 04 00 00 00 01 00 00 00 04 00 00 00 04 00 00 00 2e 00 00 00 3d 00 00 00 4f 00 00 00 2d 00 00 00 31 00 0c 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 2f 00 00 00 3e 00 00 00 3d 00 00 00 2e 00 00 00 31 00 04 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 30 00 00 00 3f 00 00 00 3e 00 00 00 2f 00 00 00 31 00 04 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 31 00 00 00 40 00 00 00 3f 00 00 00 30 00 00 00 31 00 0c 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 2d 00 00 00 4f 00 00 00 40 00 00 00 31 00 00 00 31 00 0c 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 43 00 00 00 06 00 00 00 05 00 00 00 3c 00 00 00 31 00 0c 00 00 00 08 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 44 00 00 00 07 00 00 00 06 00 00 00 43 00 00 00 31 00 04 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 45 00 00 00 08 00 00 00 07 00 00 00 44 00 00 00 31 00 04 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 46 00 00 00 1d 00 00 00 08 00 00 00 45 00 00 00 31 00 0c 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 3c 00 00 00 05 00 00 00 1d 00 00 00 46 00 00 00 31 00 0c 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 03 00 00 00 5b 00 00 00 5a 00 00 00 5d 00 00 00 11 00 0c 00 00 00 04 00 00 00 03 00 00 00 60 00 00 00 5f 00 00 00 5b 00 00 00 11 00 04 00 00 00 04 00 00 00 03 00 00 00 63 00 00 00 5f 00 00 00 62 00 00 00 11 00 04 00 00 00 04 00 00 00 04 00 00 00 4d 00 00 00 5c 00 00 00 61 00 00 00 4b 00 00 00 31 00 0c 00 00 00 04 00 00 00 01 00 00 00 03 00 00 00 03 00 00 00 5d 00 00 00 5a 00 00 00 5c 00 00 00 11 00 0c 00 00 00 04 00 00 00 04 00 00 00 3d 00 00 00 37 00 00 00 3b 00 00 00 4f 00 00 00 31 00 0c 00 00 00 04 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 3e 00 00 00 38 00 00 00 37 00 00 00 3d 00 00 00 31 00 04 00 00 00 04 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 3f 00 00 00 39 00 00 00 38 00 00 00 3e 00 00 00 31 00 04 00 00 00 04 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 40 00 00 00 3a 00 00 00 39 00 00 00 3f 00 00 00 31 00 0c 00 00 00 04 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 4f 00 00 00 3b 00 00 00 3a 00 00 00 40 00 00 00 31 00 0c 00 00 00 04 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 3c 00 00 00 32 00 00 00 33 00 00 00 43 00 00 00 31 00 0c 00 00 00 04 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 43 00 00 00 33 00 00 00 34 00 00 00 44 00 00 00 31 00 04 00 00 00 04 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 44 00 00 00 34 00 00 00 35 00 00 00 45 00 00 00 31 00 04 00 00 00 04 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 45 00 00 00 35 00 00 00 36 00 00 00 46 00 00 00 31 00 0c 00 00 00 04 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 46 00 00 00 36 00 00 00 32 00 00 00 3c 00 00 00 31 00 0c 00 00 00 04 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 48 00 00 00 33 00 00 00 32 00 00 00 41 00 00 00 31 00 0c 00 00 00 08 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 42 00 00 00 3b 00 00 00 37 00 00 00 47 00 00 00 31 00 0c 00 00 00 08 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 4a 00 00 00 34 00 00 00 33 00 00 00 48 00 00 00 31 00 04 00 00 00 08 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 47 00 00 00 37 00 00 00 38 00 00 00 49 00 00 00 31 00 04 00 00 00 08 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 4c 00 00 00 35 00 00 00 34 00 00 00 4a 00 00 00 31 00 04 00 00 00 08 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 49 00 00 00 38 00 00 00 39 00 00 00 4b 00 00 00 31 00 04 00 00 00 08 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 4e 00 00 00 36 00 00 00 35 00 00 00 4c 00 00 00 31 00 0c 00 00 00 08 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 4b 00 00 00 39 00 00 00 3a 00 00 00 4d 00 00 00 31 00 0c 00 00 00 08 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 41 00 00 00 32 00 00 00 36 00 00 00 4e 00 00 00 31 00 0c 00 00 00 08 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 4d 00 00 00 3a 00 00 00 3b 00 00 00 42 00 00 00 31 00 0c 00 00 00 08 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 51 00 00 00 24 00 00 00 23 00 00 00 50 00 00 00 31 00 0c 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 52 00 00 00 25 00 00 00 24 00 00 00 51 00 00 00 31 00 04 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 53 00 00 00 26 00 00 00 25 00 00 00 52 00 00 00 31 00 04 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 54 00 00 00 27 00 00 00 26 00 00 00 53 00 00 00 31 00 0c 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 50 00 00 00 23 00 00 00 27 00 00 00 54 00 00 00 31 00 0c 00 00 00 08 00 00 00 01 00 00 00 03 00 00 00 03 00 00 00 0c 00 00 00 53 00 00 00 56 00 00 00 11 00 04 00 00 00 08 00 00 00 03 00 00 00 0c 00 00 00 0d 00 00 00 55 00 00 00 11 00 0c 00 00 00 08 00 00 00 03 00 00 00 0d 00 00 00 09 00 00 00 59 00 00 00 11 00 0c 00 00 00 08 00 00 00 03 00 00 00 0a 00 00 00 51 00 00 00 58 00 00 00 11 00 04 00 00 00 08 00 00 00 03 00 00 00 0b 00 00 00 52 00 00 00 57 00 00 00 11 00 04 00 00 00 08 00 00 00 03 00 00 00 53 00 00 00 0c 00 00 00 55 00 00 00 11 00 04 00 00 00 08 00 00 00 03 00 00 00 0d 00 00 00 54 00 00 00 55 00 00 00 11 00 0c 00 00 00 08 00 00 00 03 00 00 00 55 00 00 00 54 00 00 00 53 00 00 00 11 00 0c 00 00 00 08 00 00 00 03 00 00 00 53 00 00 00 52 00 00 00 56 00 00 00 11 00 04 00 00 00 08 00 00 00 03 00 00 00 52 00 00 00 0b 00 00 00 56 00 00 00 11 00 04 00 00 00 08 00 00 00 03 00 00 00 56 00 00 00 0b 00 00 00 0c 00 00 00 11 00 04 00 00 00 08 00 00 00 03 00 00 00 52 00 00 00 51 00 00 00 57 00 00 00 11 00 04 00 00 00 08 00 00 00 03 00 00 00 51 00 00 00 0a 00 00 00 57 00 00 00 11 00 04 00 00 00 08 00 00 00 03 00 00 00 57 00 00 00 0a 00 00 00 0b 00 00 00 11 00 04 00 00 00 08 00 00 00 03 00 00 00 09 00 00 00 0a 00 00 00 58 00 00 00 11 00 0c 00 00 00 08 00 00 00 03 00 00 00 51 00 00 00 50 00 00 00 58 00 00 00 11 00 0c 00 00 00 08 00 00 00 03 00 00 00 58 00 00 00 50 00 00 00 09 00 00 00 11 00 0c 00 00 00 08 00 00 00 03 00 00 00 09 00 00 00 50 00 00 00 59 00 00 00 11 00 0c 00 00 00 08 00 00 00 03 00 00 00 50 00 00 00 54 00 00 00 59 00 00 00 11 00 0c 00 00 00 08 00 00 00 03 00 00 00 59 00 00 00 54 00 00 00 0d 00 00 00 11 00 0c 00 00 00 08 00 00 00 04 00 00 00 5b 00 00 00 48 00 00 00 41 00 00 00 5e 00 00 00 31 00 0c 00 00 00 04 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 4c 00 00 00 4a 00 00 00 5f 00 00 00 63 00 00 00 31 00 04 00 00 00 04 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 5e 00 00 00 41 00 00 00 4e 00 00 00 5c 00 00 00 31 00 0c 00 00 00 04 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 5c 00 00 00 4d 00 00 00 42 00 00 00 5d 00 00 00 31 00 0c 00 00 00 04 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 5d 00 00 00 42 00 00 00 47 00 00 00 5b 00 00 00 31 00 0c 00 00 00 04 00 00 00 03 00 00 00 01 00 00 00 03 00 00 00 5c 00 00 00 5a 00 00 00 5e 00 00 00 11 00 0c 00 00 00 04 00 00 00 03 00 00 00 5e 00 00 00 5a 00 00 00 5b 00 00 00 11 00 0c 00 00 00 04 00 00 00 04 00 00 00 5f 00 00 00 4a 00 00 00 48 00 00 00 5b 00 00 00 31 00 04 00 00 00 04 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 5b 00 00 00 47 00 00 00 49 00 00 00 60 00 00 00 31 00 04 00 00 00 04 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 5c 00 00 00 4e 00 00 00 4c 00 00 00 63 00 00 00 31 00 0c 00 00 00 04 00 00 00 01 00 00 00 03 00 00 00 03 00 00 00 5c 00 00 00 63 00 00 00 61 00 00 00 11 00 0c 00 00 00 04 00 00 00 03 00 00 00 5f 00 00 00 60 00 00 00 62 00 00 00 11 00 04 00 00 00 04 00 00 00 03 00 00 00 60 00 00 00 61 00 00 00 62 00 00 00 11 00 04 00 00 00 04 00 00 00 03 00 00 00 62 00 00 00 61 00 00 00 63 00 00 00 11 00 04 00 00 00 04 00 00 00 04 00 00 00 60 00 00 00 49 00 00 00 4b 00 00 00 61 00 00 00 31 00 04 00 00 00 04 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 66 00 00 00 be 00 00 00 bd 00 00 00 65 00 00 00 31 00 08 00 01 04 01 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 68 00 00 00 bf 00 00 00 be 00 00 00 66 00 00 00 31 00 08 00 00 04 01 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 99 00 00 00 86 00 00 00 6b 00 00 00 94 00 00 00 20 00 00 00 00 00 02 00 00 00 04 00 00 00 87 00 00 00 6e 00 00 00 83 00 00 00 85 00 00 00 31 00 00 00 00 02 20 00 00 00 00 00 00 00 02 00 00 00 05 00 00 00 82 00 00 00 84 00 00 00 88 00 00 00 91 00 00 00 73 00 00 00 30 00 01 00 00 00 02 00 00 00 04 00 00 00 01 00 00 00 04 00 00 00 05 00 00 00 6c 00 00 00 98 00 00 00 71 00 00 00 81 00 00 00 6d 00 00 00 31 00 08 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 02 00 00 00 04 00 00 00 04 00 00 00 80 00 00 00 6e 00 00 00 87 00 00 00 92 00 00 00 31 00 08 00 00 02 20 00 00 00 01 00 00 00 03 00 00 00 06 00 00 00 7b 00 00 00 6a 00 00 00 68 00 00 00 66 00 00 00 65 00 00 00 6f 00 00 00 31 00 08 00 01 00 01 00 00 00 00 00 00 00 02 00 00 00 02 00 00 00 04 00 00 00 00 00 00 00 04 00 00 00 06 00 00 00 70 00 00 00 64 00 00 00 67 00 00 00 69 00 00 00 93 00 00 00 72 00 00 00 31 00 00 00 01 00 01 00 00 00 02 00 00 00 04 00 00 00 01 00 00 00 04 00 00 00 00 00 00 00 04 00 00 00 04 00 00 00 76 00 00 00 74 00 00 00 c0 00 00 00 c1 00 00 00 31 00 08 00 00 04 01 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 78 00 00 00 76 00 00 00 c1 00 00 00 c2 00 00 00 31 00 08 00 00 04 01 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 89 00 00 00 8a 00 00 00 8e 00 00 00 7c 00 00 00 21 00 08 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 7e 00 00 00 8b 00 00 00 8d 00 00 00 90 00 00 00 31 00 08 00 00 02 20 00 00 00 00 00 00 00 02 00 00 00 05 00 00 00 97 00 00 00 73 00 00 00 91 00 00 00 7f 00 00 00 7d 00 00 00 30 00 01 00 00 00 01 00 00 00 03 00 00 00 01 00 00 00 04 00 00 00 05 00 00 00 8c 00 00 00 8f 00 00 00 81 00 00 00 71 00 00 00 95 00 00 00 31 00 08 00 00 00 01 00 00 00 01 00 00 00 03 00 00 00 00 00 00 00 03 00 00 00 04 00 00 00 80 00 00 00 92 00 00 00 7e 00 00 00 90 00 00 00 31 00 00 00 00 02 20 00 00 00 03 00 00 00 01 00 00 00 06 00 00 00 7b 00 00 00 6f 00 00 00 74 00 00 00 76 00 00 00 78 00 00 00 7a 00 00 00 31 00 08 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 02 00 00 00 04 00 00 00 00 00 00 00 04 00 00 00 06 00 00 00 70 00 00 00 72 00 00 00 96 00 00 00 79 00 00 00 77 00 00 00 75 00 00 00 30 00 01 00 00 00 00 00 00 00 02 00 00 00 02 00 00 00 04 00 00 00 00 00 00 00 04 00 00 00 03 00 00 00 6b 00 00 00 83 00 00 00 84 00 00 00 10 00 10 00 00 00 03 00 00 00 6c 00 00 00 85 00 00 00 86 00 00 00 11 00 08 00 00 00 10 00 00 00 03 00 00 00 7c 00 00 00 8b 00 00 00 8c 00 00 00 11 00 08 00 00 00 10 00 00 00 03 00 00 00 7d 00 00 00 8d 00 00 00 8e 00 00 00 10 00 10 00 00 00 04 00 00 00 82 00 00 00 94 00 00 00 6b 00 00 00 84 00 00 00 30 00 04 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 86 00 00 00 85 00 00 00 83 00 00 00 6b 00 00 00 30 00 08 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 99 00 00 00 98 00 00 00 6c 00 00 00 86 00 00 00 31 00 08 00 00 00 04 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 6d 00 00 00 87 00 00 00 85 00 00 00 6c 00 00 00 31 00 08 00 00 00 02 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 6e 00 00 00 88 00 00 00 84 00 00 00 83 00 00 00 30 00 02 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 88 00 00 00 6e 00 00 00 80 00 00 00 91 00 00 00 30 00 02 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 81 00 00 00 92 00 00 00 87 00 00 00 6d 00 00 00 31 00 08 00 00 00 02 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 7c 00 00 00 8c 00 00 00 95 00 00 00 89 00 00 00 31 00 08 00 00 00 04 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 8e 00 00 00 8d 00 00 00 8b 00 00 00 7c 00 00 00 31 00 08 00 00 00 08 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 7d 00 00 00 8e 00 00 00 8a 00 00 00 97 00 00 00 30 00 04 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 8d 00 00 00 7d 00 00 00 7f 00 00 00 90 00 00 00 30 00 02 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 8c 00 00 00 8b 00 00 00 7e 00 00 00 8f 00 00 00 31 00 08 00 00 00 02 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 91 00 00 00 80 00 00 00 90 00 00 00 7f 00 00 00 30 00 02 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 8f 00 00 00 7e 00 00 00 92 00 00 00 81 00 00 00 31 00 08 00 00 00 02 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 93 00 00 00 69 00 00 00 bf 00 00 00 c3 00 00 00 31 00 00 00 00 04 01 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 72 00 00 00 93 00 00 00 c3 00 00 00 c4 00 00 00 31 00 00 00 00 04 01 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 96 00 00 00 72 00 00 00 c4 00 00 00 c5 00 00 00 31 00 00 00 00 04 01 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 79 00 00 00 96 00 00 00 c5 00 00 00 c2 00 00 00 31 00 00 00 00 04 01 00 00 00 01 00 00 00 03 00 00 00 05 00 00 00 6f 00 00 00 65 00 00 00 64 00 00 00 70 00 00 00 c6 00 00 00 31 00 08 00 01 04 02 00 00 00 02 00 00 00 04 00 00 00 01 00 00 00 04 00 00 00 03 00 00 00 74 00 00 00 75 00 00 00 c0 00 00 00 11 00 00 00 00 04 04 00 00 00 04 00 00 00 9a 00 00 00 9b 00 00 00 a0 00 00 00 9f 00 00 00 30 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 9b 00 00 00 9c 00 00 00 a1 00 00 00 a0 00 00 00 30 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 9c 00 00 00 9d 00 00 00 a2 00 00 00 a1 00 00 00 30 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 9d 00 00 00 9e 00 00 00 a3 00 00 00 a2 00 00 00 31 00 08 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 9e 00 00 00 9a 00 00 00 9f 00 00 00 a3 00 00 00 31 00 08 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 9f 00 00 00 a0 00 00 00 a5 00 00 00 a4 00 00 00 30 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 a0 00 00 00 a1 00 00 00 a6 00 00 00 a5 00 00 00 30 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 a1 00 00 00 a2 00 00 00 a7 00 00 00 a6 00 00 00 30 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 a2 00 00 00 a3 00 00 00 a8 00 00 00 a7 00 00 00 31 00 08 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 a3 00 00 00 9f 00 00 00 a4 00 00 00 a8 00 00 00 31 00 08 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 a4 00 00 00 a5 00 00 00 aa 00 00 00 a9 00 00 00 30 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 a5 00 00 00 a6 00 00 00 ab 00 00 00 aa 00 00 00 30 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 a6 00 00 00 a7 00 00 00 ac 00 00 00 ab 00 00 00 30 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 a7 00 00 00 a8 00 00 00 ad 00 00 00 ac 00 00 00 31 00 08 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 a8 00 00 00 a4 00 00 00 a9 00 00 00 ad 00 00 00 31 00 08 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 ae 00 00 00 af 00 00 00 b4 00 00 00 b3 00 00 00 30 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 af 00 00 00 b0 00 00 00 b5 00 00 00 b4 00 00 00 30 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 b0 00 00 00 b1 00 00 00 b6 00 00 00 b5 00 00 00 31 00 08 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 b1 00 00 00 b2 00 00 00 b7 00 00 00 b6 00 00 00 31 00 08 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 b2 00 00 00 ae 00 00 00 b3 00 00 00 b7 00 00 00 31 00 08 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 b3 00 00 00 b4 00 00 00 b9 00 00 00 b8 00 00 00 30 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 b4 00 00 00 b5 00 00 00 ba 00 00 00 b9 00 00 00 30 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 b5 00 00 00 b6 00 00 00 bb 00 00 00 ba 00 00 00 31 00 08 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 b6 00 00 00 b7 00 00 00 bc 00 00 00 bb 00 00 00 31 00 08 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 b7 00 00 00 b3 00 00 00 b8 00 00 00 bc 00 00 00 31 00 08 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 b8 00 00 00 b9 00 00 00 9b 00 00 00 9a 00 00 00 30 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 b9 00 00 00 ba 00 00 00 9c 00 00 00 9b 00 00 00 30 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 ba 00 00 00 bb 00 00 00 9d 00 00 00 9c 00 00 00 30 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 bb 00 00 00 bc 00 00 00 9e 00 00 00 9d 00 00 00 31 00 08 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 bc 00 00 00 b8 00 00 00 9a 00 00 00 9e 00 00 00 31 00 08 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 be 00 00 00 67 00 00 00 64 00 00 00 bd 00 00 00 31 00 00 00 01 04 01 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 bf 00 00 00 69 00 00 00 67 00 00 00 be 00 00 00 31 00 00 00 00 04 01 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 c0 00 00 00 75 00 00 00 77 00 00 00 c1 00 00 00 31 00 00 00 00 04 01 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 c1 00 00 00 77 00 00 00 79 00 00 00 c2 00 00 00 31 00 00 00 00 04 01 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 bf 00 00 00 68 00 00 00 6a 00 00 00 c3 00 00 00 31 00 08 00 00 04 01 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 c3 00 00 00 6a 00 00 00 7b 00 00 00 c4 00 00 00 31 00 08 00 00 04 01 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 c4 00 00 00 7b 00 00 00 7a 00 00 00 c5 00 00 00 31 00 08 00 00 04 01 00 00 00 01 00 00 00 03 00 00 00 04 00 00 00 c5 00 00 00 7a 00 00 00 78 00 00 00 c2 00 00 00 31 00 08 00 00 04 01 00 00 00 01 00 00 00 03 00 00 00 05 00 00 00 74 00 00 00 6f 00 00 00 c6 00 00 00 70 00 00 00 75 00 00 00 31 00 00 00 00 04 04 00 00 00 01 00 00 00 03 00 00 00 01 00 00 00 04 00 00 00 03 00 00 00 65 00 00 00 bd 00 00 00 64 00 00 00 11 00 08 00 00 04 02 00 00 00 } + 6 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 7 0x0120: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 8 0x0124: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 9 0x0128: (StorageRaw) { + Size: 3292 + String: .......=...=c|.<...>...=.y.<.M.>...?4..=q..=...?Pj.<..M>...=...<.3K>...?.O.<...>...=...<0..>...?I..<|A#=...=.n.<~..=...?A..=..*?j..>...<..*?.H.>...<...>.H.>...<...>j..>...<..*?Rc.>m..<...>Tc.>s..<..*?...>X..<...>...>d..<..*?...>...<...>...>...<9.X?..A>..;=.bW?.D.>..<=..[?...>Y..=n.^?....=..X?g..=..8=Y.]?.!.=...=..X?.lv>.DM=(Q]?..y>...=..W?.R.<..B=..\?A..<...=c..?.#.>...=c..?M`.=...l..=...>...>...<...>..H?.......>..H?....E..>'.^?....E..>'.^?.......>".0?.......>".0?......"?...?....c..>.5.?......"?..+?....c..?.~v>...=...>...=.........8?...>.....9=?.!.>....P.E?IR.>......E?6..>....c=!=.M.<.K.<...=.M.<+M.<...>.M....?....f..>>..?....$..?J..>....7..?...>......M>.M.<.s..M.<.R.<.X.=.[u?z.3=9..>. w?y.G=...>R0z?.x.=...=..z?.?.=X.M>..v?."J=..M>..y?v..=...>8.v?a7H=...>..z?...=.#)=.Vv?.2;=.Z(=.;.?...=.."?...>......"?.4.?....c..>.5.?......"?...?.....cf?..H?......U?'.^?......U?'.^?.....cf?..H?....9\c?".0?....9\c?".0?.....=K?...?.....PK?>..?.....I9?...>.....F9?J..>....0z.>.04?y..=[6.=.04?.b.=TcL>.14?0..=VY.>.04?.k.=R0$=.04?.v.=9..>*wp?..C=.V.=%wp?..0=..M>.wp?..E=c..>%wp?..C=T.(=5wp?C.8=...>.hS?..1=...=QXS?..P=...=..B?.l.=..L>>.C?..(=#bL>,.d?..;=[..>..c?.)==..g>QXS?.9K=..$=.f8?...=..&=.hS?.O(=...>#WC?..%=.L.>.f8?O>.=.*.>.Z6?Dg.<.\.=.Y6?...<.:L>.Z6?.A.JZ6?.*..jn?..!=..M>+kn?.n#=H..>.jn?..!=.P'=6in?R'.=...>0Al?!+A=.T.=;Al?..-=79.=.f8?.!.=.h.>.f8?L. =.nM>?Al?..B=..L>.f8?5..=m..>;Al?K.A=..(=*Al?..5=..3?...>v..=..3?.f.=t..=..3?X'B>.R.=..3?(uv>m.!=..3?.p.G~P=..C?*..>..O=..C?..g=L.F=T.C?.p.=2jB=..C?.a&>..N=x..=.Me?..$=......S.E?s..>......D?.i.>....h.......8?r..>.......>:5.>...<...>.#.=...<...>..B>J..<...>..v>f].<...>.`....>...<...>..F>.y.<...>..w>.y.<...>...<...<..*?...>...<...>...>......=.n....?A..=..W?DN.>..B=..\?...>...=c..?R..>...=...>.M.<.K.<...>.Vv?.2;=p..>.;.?...=$?.>.04?.v.=...>5wp?C.8=nK.>.f8?...=O..>.hS?.O(=...>(Y6?o..<4..>6in?R'.=y..>*Al?..5=..3?+ .>zG.=...>.x.>...<.g.>...?......"?+%.?.......>J..?......"?+%.?......E?...?......E?...?.......>J..?.....g.>...?.......>w..?.......>...?.......>w..?....f..>>..?....7..?...>....$..?J..>....gTF?J..?....gTF?J..?.....IK?w..?.....=K?...?.....IK?w..?.....PK?>..?.....F9?J..>.....I9?...>......"?.4.?......"?...>.....J..?......E?...?........?.......>J..?.....g.>...?....gTF?J..?....gTF?J..?.....n.>0..>....K.p>0..>....3.M>0..>......)>0..>.....0.>0..>.......=0..>.....n.>.o.>....K.p>.o.>....3.M>.o.>......)>.o.>.....0.>.o.>.......=.o.>.....n.>.t^>....K.p>.t^>....3.M>.t^>......)>.t^>.....0.>.t^>.......=.t^>.....n.>..&>....K.p>..&>....3.M>..&>......)>..&>.....0.>..&>.......=..&>.....n.>|C.>....I.p>|C.>....1.M>|C.>......)>vC.>.....0.>vC.>.......=vC.>.....n.>`..>....I.p>`..>....1.M>`..>......)>`..>.....0.>`..>.......=`..>.....n.>F..>....I.p>F..>....1.M>F..>......)>F..>.....0.>F..>.......=F..>.......>..F?....._.>(.J?....[ .>..`?.......>..W?....@..>&.0?.....L.>..-?....0tc?..G?....H.U?k.W?......V?U&a?......k?^.J?....2O_?.l1?....C.h?!Y+?.......>.z.?.......?Dc.?.... .!?o..?.... .!?...?....7wG?v..?....cmD?...?......!?.G&?......!?P..?.....s.>*A\?....f..>..H?.....g.>.;/?......V?`l\?......g?t\I?......c?.b.?.....D.>.o.?.... .!?z..?....M.E?.G.?......!?.**?.... + Hex: 12 01 00 00 99 0c c0 3d aa ce 04 3d 63 7c cb 3c 83 df 17 3e aa ce 04 3d 14 79 cf 3c 85 4d 19 3e 0f 82 0a 3f 34 fa 03 3d 71 12 c0 3d 0f 82 0a 3f 50 6a dc 3c 8f 8a 4d 3e aa ce 04 3d be 9c d9 3c a0 33 4b 3e 0f 82 0a 3f d9 4f fe 3c 0d be 80 3e aa ce 04 3d 90 f4 db 3c 30 f1 81 3e 0f 82 0a 3f 49 0e ff 3c 7c 41 23 3d aa ce 04 3d d7 6e d3 3c 7e a9 1f 3d 0f 82 0a 3f 41 0a 01 3d cb 83 2a 3f 6a f3 b7 3e 9a fc 94 3c cb 83 2a 3f ba 48 c4 3e c6 8d a0 3c de 18 b9 3e ba 48 c4 3e c2 8d a0 3c e1 18 b9 3e 6a f3 b7 3e 91 fc 94 3c cb 83 2a 3f 52 63 cf 3e 6d ae b1 3c de 18 b9 3e 54 63 cf 3e 73 ae b1 3c cb 83 2a 3f e6 ea d9 3e 58 ae b1 3c de 18 b9 3e e6 ea d9 3e 64 ae b1 3c cb 83 2a 3f 19 9e ab 3e c7 8d a0 3c e1 18 b9 3e 1b 9e ab 3e a1 8d a0 3c 39 ed 58 3f 83 e7 41 3e c2 7f 3b 3d 85 62 57 3f 1a 44 0b 3e d7 aa 3c 3d fc aa 5b 3f ae c9 09 3e 59 d9 0a 3d 6e 0c 5e 3f de 3c 44 3e 86 f5 00 3d c8 97 58 3f 67 84 aa 3d e9 92 38 3d 59 12 5d 3f d8 21 a7 3d b9 e9 00 3d b3 8b 58 3f 0d 6c 76 3e 09 44 4d 3d 28 51 5d 3f 94 f3 79 3e 97 f0 0e 3d e7 81 57 3f 7d 52 f9 3c bd db 42 3d da f0 5c 3f 41 18 ff 3c f2 09 07 3d 63 db 1b 3f 9c 23 0c 3e b0 1a 03 3d 63 db 1b 3f 4d 60 aa 3d e9 fc ff 3c 63 db 1b 3f f7 4f 42 3e 6c 80 05 3d fa 9c b8 3e 8d b6 12 3e 7b a0 9f 3c 1b 95 bb 3e 16 ce 48 3f 00 00 00 00 1b 95 bb 3e 16 ce 48 3f 00 00 00 00 45 a4 dc 3e 27 93 5e 3f 00 00 00 00 45 a4 dc 3e 27 93 5e 3f 00 00 00 00 b2 a3 c1 3e 22 1a 30 3f 00 00 00 00 b2 a3 c1 3e 22 1a 30 3f 00 00 00 00 0a 17 22 3f 99 13 0d 3f 00 00 00 00 63 e2 fb 3e 13 35 15 3f 00 00 00 00 0a 17 22 3f cd 0b 2b 3f 00 00 00 00 63 db 1b 3f 89 7e 76 3e cd 9a 0c 3d fb 9c b8 3e ee 8f ae 3d 04 7b 90 3c 63 db 1b 3f 53 33 f4 3c c5 8b 06 3d 1a ef 3c 3f 5e 8c cc 3e 00 00 00 00 17 c8 38 3f a1 90 da 3e 00 00 00 00 ae 39 3d 3f f0 21 e7 3e 00 00 00 00 50 10 45 3f 49 52 e3 3e 00 00 00 00 89 04 45 3f 36 e4 d2 3e 00 00 00 00 63 3d 21 3d ca 4d cd 3c e0 4b a4 3c 8d c9 bf 3d ca 4d cd 3c 2b 4d 9c 3c a2 a7 80 3e f8 4d cd 3c 52 c6 ac 3c 0a 17 22 3f ca 0b 2b 3f 00 00 00 00 14 f0 f3 3e a1 d6 02 3f 00 00 00 00 66 ca f3 3e 3e db 02 3f 00 00 00 00 24 ef 0b 3f 4a 07 f8 3e 00 00 00 00 37 ec 0b 3f f2 f9 f7 3e 00 00 00 00 ff e6 4d 3e f8 4d cd 3c e3 73 aa 3c 72 52 18 3e f8 4d cd 3c f4 52 a0 3c c2 58 c0 3d 95 5b 75 3f 7a e0 33 3d 39 9a 17 3e ce 20 77 3f 79 fc 47 3d 98 a8 17 3e 52 30 7a 3f d9 78 07 3d 1c e4 bd 3d 80 c7 7a 3f cf 3f 05 3d 58 95 4d 3e 01 f5 76 3f a0 22 4a 3d 9e a7 4d 3e 18 81 79 3f 76 a6 10 3d 89 be 80 3e 38 e6 76 3f 61 37 48 3d c2 0e 81 3e f8 06 7a 3f e4 f1 0a 3d ee 23 29 3d 8d 56 76 3f bc 32 3b 3d a1 5a 28 3d 9d 3b 7b 3f d2 a1 0b 3d e0 9a 22 3f f0 b9 fe 3e 00 00 00 00 e0 9a 22 3f a2 34 00 3f 00 00 00 00 63 e2 fb 3e 13 35 15 3f 00 00 00 00 0a 17 22 3f 99 13 0d 3f 00 00 00 00 84 63 66 3f 16 ce 48 3f 00 00 00 00 ef db 55 3f 27 93 5e 3f 00 00 00 00 ef db 55 3f 27 93 5e 3f 00 00 00 00 84 63 66 3f 16 ce 48 3f 00 00 00 00 39 5c 63 3f 22 1a 30 3f 00 00 00 00 39 5c 63 3f 22 1a 30 3f 00 00 00 00 b9 3d 4b 3f a1 d6 02 3f 00 00 00 00 8f 50 4b 3f 3e db 02 3f 00 00 00 00 88 49 39 3f f2 f9 f7 3e 00 00 00 00 9b 46 39 3f 4a 07 f8 3e 00 00 00 00 30 7a 18 3e f0 30 34 3f 79 0b 1e 3d 5b 36 c0 3d fc 30 34 3f e0 62 09 3d 54 63 4c 3e 01 31 34 3f 30 ea 1b 3d 56 59 81 3e fc 30 34 3f a9 6b 1b 3d 52 30 24 3d e9 30 34 3f cb 76 17 3d 39 ac 17 3e 2a 77 70 3f fb ce 43 3d bb 56 c0 3d 25 77 70 3f d7 af 30 3d e1 7d 4d 3e 1d 77 70 3f bf a2 45 3d 63 ca 80 3e 25 77 70 3f ec e3 43 3d 54 c7 28 3d 35 77 70 3f 43 05 38 3d 95 04 18 3e 90 68 53 3f 82 98 31 3d c7 11 c0 3d 51 58 53 3f dc 80 50 3d a9 8c c2 3d cb 00 42 3f 80 6c 0a 3d 17 09 4c 3e 3e 1a 43 3f 8c 0f 28 3d 23 62 4c 3e 2c d8 64 3f b0 91 3b 3d 5b 0c 81 3e 85 dd 63 3f c8 29 3d 3d b0 9d 67 3e 51 58 53 3f b9 39 4b 3d 94 92 24 3d f5 66 38 3f 03 bc 19 3d 9f c9 26 3d 90 68 53 3f 98 4f 28 3d d7 2e 81 3e 23 57 43 3f 90 94 25 3d fa 4c 81 3e e3 66 38 3f 4f 3e 1e 3d bc 2a 19 3e 93 5a 36 3f 44 67 fd 3c 06 5c c0 3d 86 59 36 3f fe 03 d4 3c 08 3a 4c 3e db 5a 36 3f d5 41 f9 3c 72 56 81 3e 4a 5a 36 3f 0c 2a f8 3c 5a 96 21 3d 28 59 36 3f 6f d7 ef 3c 5f 88 c0 3d d9 69 6e 3f 8b 90 0e 3d dd 1b 18 3e af 6a 6e 3f 9c c8 21 3d dc 88 4d 3e 2b 6b 6e 3f 14 6e 23 3d 48 aa 80 3e 9b 6a 6e 3f fe be 21 3d cf 50 27 3d 36 69 6e 3f 52 27 16 3d ff b7 17 3e 30 41 6c 3f 21 2b 41 3d f5 54 c0 3d 3b 41 6c 3f 02 f1 2d 3d 37 39 c0 3d e3 66 38 3f b2 21 0c 3d a8 68 18 3e ee 66 38 3f 4c ae 20 3d 13 6e 4d 3e 3f 41 6c 3f c9 b7 42 3d e5 7b 4c 3e de 66 38 3f 35 d3 1e 3d 6d d2 80 3e 3b 41 6c 3f 4b 0f 41 3d f2 82 28 3d 2a 41 6c 3f 10 be 35 3d 09 de 33 3f b3 bb 0b 3e 76 c3 15 3d 09 de 33 3f ae 66 aa 3d 74 ea 11 3d 0c de 33 3f 58 27 42 3e 85 52 16 3d 09 de 33 3f 28 75 76 3e 6d 88 21 3d 09 de 33 3f ef 70 f6 3c 7a 47 1a 3d bc 03 44 3f d3 54 5c 3e 47 7e 50 3d 90 90 43 3f 2a d3 88 3e be d0 4f 3d 9d b8 43 3f ac 05 67 3d 4c 9b 46 3d 54 c8 43 3f 09 70 e1 3d 32 6a 42 3d 03 cc 43 3f ed 61 26 3e 7f ee 4e 3d 78 92 c2 3d 98 4d 65 3f d0 04 24 3d d0 e7 3c 3f b3 a3 a1 3e 00 00 00 00 53 03 45 3f 73 ac a6 3e 00 00 00 00 ae a2 44 3f 09 69 b7 3e 00 00 00 00 68 b6 3c 3f 4c b8 bc 3e 00 00 00 00 e0 01 38 3f 72 7f af 3e 00 00 00 00 19 c4 bc 3e 3a 35 0d 3e 0a e6 b7 3c 18 c4 bc 3e 95 23 aa 3d d1 e4 b3 3c 19 c4 bc 3e 05 d5 42 3e 4a 08 c2 3c 19 c4 bc 3e f3 81 76 3e 66 5d c4 3c 18 c4 bc 3e e5 60 ed 3c 6e dd bb 3c a9 4b bd 3e ec 99 95 3e 92 b8 c3 3c fa 9c b8 3e d9 8b 46 3e ea 79 b5 3c fa 9c b8 3e c1 1a 77 3e ef 79 b5 3c fb 9c b8 3e 02 cb de 3c ac a0 9f 3c cb 83 2a 3f 80 05 e5 3e c7 8d a0 3c e2 18 b9 3e 80 05 e5 3e a1 8d a0 3c 4a 21 9b 3e aa ce 04 3d d7 6e d3 3c 4a ae 9a 3e 0f 82 0a 3f 41 0a 01 3d e7 81 57 3f 44 4e 96 3e be db 42 3d da f0 5c 3f a4 aa 96 3e f2 09 07 3d 63 db 1b 3f 52 fc 95 3e c5 8b 06 3d c6 e0 9a 3e ca 4d cd 3c e0 4b a4 3c 9a dd 9b 3e 8d 56 76 3f bc 32 3b 3d 70 c4 9b 3e 9d 3b 7b 3f d2 a1 0b 3d 24 3f 9b 3e e9 30 34 3f cb 76 17 3d 05 d2 9b 3e 35 77 70 3f 43 05 38 3d 6e 4b 9b 3e f5 66 38 3f 03 bc 19 3d 4f 92 9b 3e 90 68 53 3f 98 4f 28 3d e5 eb 9a 3e 28 59 36 3f 6f d7 ef 3c 34 a3 9b 3e 36 69 6e 3f 52 27 16 3d 79 c9 9b 3e 2a 41 6c 3f 10 be 35 3d 09 de 33 3f 2b 20 96 3e 7a 47 1a 3d f9 9c b8 3e 06 78 95 3e ac a0 9f 3c 89 67 ff 3e f6 fe 0a 3f 00 00 00 00 e0 9a 22 3f 2b 25 03 3f 00 00 00 00 b8 c2 fd 3e 4a 2e 0b 3f 00 00 00 00 e0 9a 22 3f 2b 25 03 3f 00 00 00 00 ff 81 45 3f f6 fe 0a 3f 00 00 00 00 ff 81 45 3f f6 fe 0a 3f 00 00 00 00 b8 c2 fd 3e 4a 2e 0b 3f 00 00 00 00 89 67 ff 3e f6 fe 0a 3f 00 00 00 00 c1 d7 f3 3e 77 d3 02 3f 00 00 00 00 14 f0 f3 3e a1 d6 02 3f 00 00 00 00 c1 d7 f3 3e 77 d3 02 3f 00 00 00 00 66 ca f3 3e 3e db 02 3f 00 00 00 00 37 ec 0b 3f f2 f9 f7 3e 00 00 00 00 24 ef 0b 3f 4a 07 f8 3e 00 00 00 00 67 54 46 3f 4a 2e 0b 3f 00 00 00 00 67 54 46 3f 4a 2e 0b 3f 00 00 00 00 e2 49 4b 3f 77 d3 02 3f 00 00 00 00 b9 3d 4b 3f a1 d6 02 3f 00 00 00 00 e2 49 4b 3f 77 d3 02 3f 00 00 00 00 8f 50 4b 3f 3e db 02 3f 00 00 00 00 9b 46 39 3f 4a 07 f8 3e 00 00 00 00 88 49 39 3f f2 f9 f7 3e 00 00 00 00 e0 9a 22 3f a2 34 00 3f 00 00 00 00 e0 9a 22 3f f0 b9 fe 3e 00 00 00 00 e1 3c 46 3f 13 35 15 3f 00 00 00 00 b8 c2 fd 3e 4a 2e 0b 3f 00 00 00 00 ff 81 45 3f f6 fe 0a 3f 00 00 00 00 e1 3c 46 3f 13 35 15 3f 00 00 00 00 ff 81 45 3f f6 fe 0a 3f 00 00 00 00 89 67 ff 3e f6 fe 0a 3f 00 00 00 00 b8 c2 fd 3e 4a 2e 0b 3f 00 00 00 00 89 67 ff 3e f6 fe 0a 3f 00 00 00 00 67 54 46 3f 4a 2e 0b 3f 00 00 00 00 67 54 46 3f 4a 2e 0b 3f 00 00 00 00 b9 6e 8a 3e 30 a4 a7 3e 00 00 00 00 4b f2 70 3e 30 a4 a7 3e 00 00 00 00 33 07 4d 3e 30 a4 a7 3e 00 00 00 00 17 1c 29 3e 30 a4 a7 3e 00 00 00 00 ff 30 05 3e 30 a4 a7 3e 00 00 00 00 b4 8b c2 3d 30 a4 a7 3e 00 00 00 00 b9 6e 8a 3e 1a 6f 8b 3e 00 00 00 00 4b f2 70 3e 1a 6f 8b 3e 00 00 00 00 33 07 4d 3e 1a 6f 8b 3e 00 00 00 00 17 1c 29 3e 1a 6f 8b 3e 00 00 00 00 ff 30 05 3e 1a 6f 8b 3e 00 00 00 00 b4 8b c2 3d 16 6f 8b 3e 00 00 00 00 b9 6e 8a 3e 08 74 5e 3e 00 00 00 00 4b f2 70 3e 08 74 5e 3e 00 00 00 00 33 07 4d 3e 08 74 5e 3e 00 00 00 00 17 1c 29 3e 00 74 5e 3e 00 00 00 00 ff 30 05 3e 00 74 5e 3e 00 00 00 00 b6 8b c2 3d 00 74 5e 3e 00 00 00 00 b9 6e 8a 3e d4 09 26 3e 00 00 00 00 4b f2 70 3e cc 09 26 3e 00 00 00 00 33 07 4d 3e cc 09 26 3e 00 00 00 00 17 1c 29 3e cc 09 26 3e 00 00 00 00 ff 30 05 3e cc 09 26 3e 00 00 00 00 b6 8b c2 3d cc 09 26 3e 00 00 00 00 b8 6e 8a 3e 7c 43 fc 3e 00 00 00 00 49 f2 70 3e 7c 43 fc 3e 00 00 00 00 31 07 4d 3e 7c 43 fc 3e 00 00 00 00 15 1c 29 3e 76 43 fc 3e 00 00 00 00 fd 30 05 3e 76 43 fc 3e 00 00 00 00 b2 8b c2 3d 76 43 fc 3e 00 00 00 00 b8 6e 8a 3e 60 0e e0 3e 00 00 00 00 49 f2 70 3e 60 0e e0 3e 00 00 00 00 31 07 4d 3e 60 0e e0 3e 00 00 00 00 15 1c 29 3e 60 0e e0 3e 00 00 00 00 fd 30 05 3e 60 0e e0 3e 00 00 00 00 b4 8b c2 3d 60 0e e0 3e 00 00 00 00 b8 6e 8a 3e 46 d9 c3 3e 00 00 00 00 49 f2 70 3e 46 d9 c3 3e 00 00 00 00 31 07 4d 3e 46 d9 c3 3e 00 00 00 00 15 1c 29 3e 46 d9 c3 3e 00 00 00 00 fd 30 05 3e 46 d9 c3 3e 00 00 00 00 b4 8b c2 3d 46 d9 c3 3e 00 00 00 00 f9 90 c1 3e 0c a9 46 3f 00 00 00 00 d2 5f b2 3e 28 b6 4a 3f 00 00 00 00 5b 20 dd 3e b2 a4 60 3f 00 00 00 00 a7 c6 db 3e a2 dd 57 3f 00 00 00 00 40 81 c8 3e 26 eb 30 3f 00 00 00 00 d3 4c b8 3e e5 8a 2d 3f 00 00 00 00 30 74 63 3f 8a d7 47 3f 00 00 00 00 48 81 55 3f 6b b2 57 3f 00 00 00 00 c5 af 56 3f 55 26 61 3f 00 00 00 00 d3 e4 6b 3f 5e e1 4a 3f 00 00 00 00 32 4f 5f 3f ca 6c 31 3f 00 00 00 00 43 16 68 3f 21 59 2b 3f 00 00 00 00 9e e4 fa 3e d2 7a 13 3f 00 00 00 00 90 d2 00 3f 44 63 19 3f 00 00 00 00 20 f3 21 3f 6f 8e 0a 3f 00 00 00 00 20 f3 21 3f 84 f8 10 3f 00 00 00 00 37 77 47 3f 76 fc 13 3f 00 00 00 00 63 6d 44 3f c2 91 1a 3f 00 00 00 00 1f ad 21 3f d0 47 26 3f 00 00 00 00 1f f3 21 3f 50 0d 2e 3f 00 00 00 00 81 73 dc 3e 2a 41 5c 3f 00 00 00 00 66 f8 b9 3e 9a af 48 3f 00 00 00 00 0a 67 c0 3e 06 3b 2f 3f 00 00 00 00 86 18 56 3f 60 6c 5c 3f 00 00 00 00 82 ac 67 3f 74 5c 49 3f 00 00 00 00 ba b2 63 3f f6 62 2e 3f 00 00 00 00 df 44 fe 3e 0b 6f 16 3f 00 00 00 00 20 f3 21 3f 7a c3 0d 3f 00 00 00 00 4d f2 45 3f 1c 47 17 3f 00 00 00 00 1f d0 21 3f 90 2a 2a 3f 00 00 00 00 } + 10 0x012b: (StorageRaw) { + Size: 3800 + String: ..................................................................................................................................................................................................................................................................................................................../...0...1...2........................... ...................+........... ...................+...................-...............!...,...................!.......................................................,...................3...4...............5...................;...5...............<...;...............4...<.......=...>...?...@.......>...A...B...?.......A...C...D...B.......C...........D.......E...=...@...F...................................U...V...............W...U...............X...W...................X...............V...Y...........Z...>...=...[.......\...A...>...Z.......]...C...A...\...............C...].......[...=...E...^......._...`...a.......b...c..._.......d...c...e...............h...i.......a...`...g.......U...j...k...V.......W...l...j...U.......X...m...l...W...............m...X.......V...k...n...Y.......[...o...p...Z.......Z...p...q...\.......\...q...r...].......]...r...............^...s...o...[.......t...p...o...u.......v...k...j...w.......x...q...p...t.......w...j...l...y.......z...r...q...x.......y...l...m...i...............r...z.......i...m...............u...o...s...........f...n...k...v.......|...................~... .......|...........+... ...~...............+...................-...............................................................|...............~...............................................................~...........~...............................~...|...........|...............................................|..............................................................................._...t...u...........z...x...c...d...........u.......g.......g...f...v...a.......a...v...w..._.......g...`...............`..._.......c...x...t..._......._...w...y...b...............z...d...........d...h.......c...b...e.......b...h...e.......e...h...d.......b...y...i...h.......................................................8...............:.......................................7...........H...9.......G...:...............(...)...&..."...%...*.......6...$...#...'...I...J...........................................................R.......S...............................T...Q...............H...............G.......S...........(...*...L...K...O...........6...J.......P...N...M.......8...............7...............R...............Q.......................8.......................8...............7...........9...........7.......:.......................:...G...........H...........9.......R...............................R.......Q.......................Q...T...................S...............G.......T...........S.......H........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... + Hex: 04 00 00 00 00 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 01 00 00 00 04 00 00 00 05 00 00 00 02 00 00 00 04 00 00 00 04 00 00 00 06 00 00 00 07 00 00 00 05 00 00 00 04 00 00 00 06 00 00 00 97 00 00 00 98 00 00 00 07 00 00 00 04 00 00 00 08 00 00 00 00 00 00 00 03 00 00 00 09 00 00 00 04 00 00 00 0a 00 00 00 0b 00 00 00 0c 00 00 00 0d 00 00 00 04 00 00 00 0b 00 00 00 0e 00 00 00 0f 00 00 00 0c 00 00 00 04 00 00 00 0e 00 00 00 10 00 00 00 11 00 00 00 0f 00 00 00 04 00 00 00 10 00 00 00 95 00 00 00 96 00 00 00 11 00 00 00 04 00 00 00 12 00 00 00 0a 00 00 00 0d 00 00 00 13 00 00 00 04 00 00 00 14 00 00 00 15 00 00 00 16 00 00 00 17 00 00 00 04 00 00 00 15 00 00 00 18 00 00 00 19 00 00 00 16 00 00 00 04 00 00 00 1a 00 00 00 14 00 00 00 17 00 00 00 1b 00 00 00 04 00 00 00 18 00 00 00 1c 00 00 00 1d 00 00 00 19 00 00 00 04 00 00 00 99 00 00 00 1a 00 00 00 1b 00 00 00 9a 00 00 00 05 00 00 00 2e 00 00 00 2f 00 00 00 30 00 00 00 31 00 00 00 32 00 00 00 04 00 00 00 1e 00 00 00 8c 00 00 00 8d 00 00 00 1f 00 00 00 04 00 00 00 20 00 00 00 8e 00 00 00 8c 00 00 00 1e 00 00 00 04 00 00 00 2b 00 00 00 8f 00 00 00 8e 00 00 00 20 00 00 00 04 00 00 00 9b 00 00 00 91 00 00 00 8f 00 00 00 2b 00 00 00 04 00 00 00 1f 00 00 00 8d 00 00 00 90 00 00 00 2d 00 00 00 04 00 00 00 8d 00 00 00 8c 00 00 00 21 00 00 00 2c 00 00 00 04 00 00 00 8c 00 00 00 8e 00 00 00 92 00 00 00 21 00 00 00 04 00 00 00 8e 00 00 00 8f 00 00 00 93 00 00 00 92 00 00 00 04 00 00 00 8f 00 00 00 91 00 00 00 a7 00 00 00 93 00 00 00 04 00 00 00 90 00 00 00 8d 00 00 00 2c 00 00 00 94 00 00 00 04 00 00 00 00 00 00 00 08 00 00 00 33 00 00 00 34 00 00 00 04 00 00 00 97 00 00 00 06 00 00 00 35 00 00 00 9c 00 00 00 04 00 00 00 06 00 00 00 04 00 00 00 3b 00 00 00 35 00 00 00 04 00 00 00 04 00 00 00 01 00 00 00 3c 00 00 00 3b 00 00 00 04 00 00 00 01 00 00 00 00 00 00 00 34 00 00 00 3c 00 00 00 04 00 00 00 3d 00 00 00 3e 00 00 00 3f 00 00 00 40 00 00 00 04 00 00 00 3e 00 00 00 41 00 00 00 42 00 00 00 3f 00 00 00 04 00 00 00 41 00 00 00 43 00 00 00 44 00 00 00 42 00 00 00 04 00 00 00 43 00 00 00 9d 00 00 00 9e 00 00 00 44 00 00 00 04 00 00 00 45 00 00 00 3d 00 00 00 40 00 00 00 46 00 00 00 05 00 00 00 87 00 00 00 88 00 00 00 89 00 00 00 8a 00 00 00 8b 00 00 00 04 00 00 00 02 00 00 00 55 00 00 00 56 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 57 00 00 00 55 00 00 00 02 00 00 00 04 00 00 00 07 00 00 00 58 00 00 00 57 00 00 00 05 00 00 00 04 00 00 00 98 00 00 00 9f 00 00 00 58 00 00 00 07 00 00 00 04 00 00 00 03 00 00 00 56 00 00 00 59 00 00 00 09 00 00 00 04 00 00 00 5a 00 00 00 3e 00 00 00 3d 00 00 00 5b 00 00 00 04 00 00 00 5c 00 00 00 41 00 00 00 3e 00 00 00 5a 00 00 00 04 00 00 00 5d 00 00 00 43 00 00 00 41 00 00 00 5c 00 00 00 04 00 00 00 a0 00 00 00 9d 00 00 00 43 00 00 00 5d 00 00 00 04 00 00 00 5b 00 00 00 3d 00 00 00 45 00 00 00 5e 00 00 00 03 00 00 00 5f 00 00 00 60 00 00 00 61 00 00 00 03 00 00 00 62 00 00 00 63 00 00 00 5f 00 00 00 03 00 00 00 64 00 00 00 63 00 00 00 65 00 00 00 04 00 00 00 a1 00 00 00 a2 00 00 00 68 00 00 00 69 00 00 00 03 00 00 00 61 00 00 00 60 00 00 00 67 00 00 00 04 00 00 00 55 00 00 00 6a 00 00 00 6b 00 00 00 56 00 00 00 04 00 00 00 57 00 00 00 6c 00 00 00 6a 00 00 00 55 00 00 00 04 00 00 00 58 00 00 00 6d 00 00 00 6c 00 00 00 57 00 00 00 04 00 00 00 9f 00 00 00 a3 00 00 00 6d 00 00 00 58 00 00 00 04 00 00 00 56 00 00 00 6b 00 00 00 6e 00 00 00 59 00 00 00 04 00 00 00 5b 00 00 00 6f 00 00 00 70 00 00 00 5a 00 00 00 04 00 00 00 5a 00 00 00 70 00 00 00 71 00 00 00 5c 00 00 00 04 00 00 00 5c 00 00 00 71 00 00 00 72 00 00 00 5d 00 00 00 04 00 00 00 5d 00 00 00 72 00 00 00 a4 00 00 00 a0 00 00 00 04 00 00 00 5e 00 00 00 73 00 00 00 6f 00 00 00 5b 00 00 00 04 00 00 00 74 00 00 00 70 00 00 00 6f 00 00 00 75 00 00 00 04 00 00 00 76 00 00 00 6b 00 00 00 6a 00 00 00 77 00 00 00 04 00 00 00 78 00 00 00 71 00 00 00 70 00 00 00 74 00 00 00 04 00 00 00 77 00 00 00 6a 00 00 00 6c 00 00 00 79 00 00 00 04 00 00 00 7a 00 00 00 72 00 00 00 71 00 00 00 78 00 00 00 04 00 00 00 79 00 00 00 6c 00 00 00 6d 00 00 00 69 00 00 00 04 00 00 00 a5 00 00 00 a4 00 00 00 72 00 00 00 7a 00 00 00 04 00 00 00 69 00 00 00 6d 00 00 00 a3 00 00 00 a1 00 00 00 04 00 00 00 75 00 00 00 6f 00 00 00 73 00 00 00 7b 00 00 00 04 00 00 00 66 00 00 00 6e 00 00 00 6b 00 00 00 76 00 00 00 04 00 00 00 7c 00 00 00 1e 00 00 00 1f 00 00 00 7d 00 00 00 04 00 00 00 7e 00 00 00 20 00 00 00 1e 00 00 00 7c 00 00 00 04 00 00 00 7f 00 00 00 2b 00 00 00 20 00 00 00 7e 00 00 00 04 00 00 00 a6 00 00 00 9b 00 00 00 2b 00 00 00 7f 00 00 00 04 00 00 00 7d 00 00 00 1f 00 00 00 2d 00 00 00 80 00 00 00 03 00 00 00 1a 00 00 00 7f 00 00 00 81 00 00 00 03 00 00 00 1a 00 00 00 99 00 00 00 82 00 00 00 03 00 00 00 1c 00 00 00 18 00 00 00 83 00 00 00 03 00 00 00 15 00 00 00 7c 00 00 00 84 00 00 00 03 00 00 00 14 00 00 00 7e 00 00 00 85 00 00 00 03 00 00 00 7f 00 00 00 1a 00 00 00 82 00 00 00 03 00 00 00 99 00 00 00 a6 00 00 00 82 00 00 00 03 00 00 00 82 00 00 00 a6 00 00 00 7f 00 00 00 03 00 00 00 7f 00 00 00 7e 00 00 00 81 00 00 00 03 00 00 00 7e 00 00 00 14 00 00 00 81 00 00 00 03 00 00 00 81 00 00 00 14 00 00 00 1a 00 00 00 03 00 00 00 7e 00 00 00 7c 00 00 00 85 00 00 00 03 00 00 00 7c 00 00 00 15 00 00 00 85 00 00 00 03 00 00 00 85 00 00 00 15 00 00 00 14 00 00 00 03 00 00 00 18 00 00 00 15 00 00 00 84 00 00 00 03 00 00 00 7c 00 00 00 7d 00 00 00 84 00 00 00 03 00 00 00 84 00 00 00 7d 00 00 00 18 00 00 00 03 00 00 00 18 00 00 00 7d 00 00 00 83 00 00 00 03 00 00 00 7d 00 00 00 80 00 00 00 83 00 00 00 03 00 00 00 83 00 00 00 80 00 00 00 1c 00 00 00 04 00 00 00 5f 00 00 00 74 00 00 00 75 00 00 00 86 00 00 00 04 00 00 00 7a 00 00 00 78 00 00 00 63 00 00 00 64 00 00 00 04 00 00 00 86 00 00 00 75 00 00 00 7b 00 00 00 67 00 00 00 04 00 00 00 67 00 00 00 66 00 00 00 76 00 00 00 61 00 00 00 04 00 00 00 61 00 00 00 76 00 00 00 77 00 00 00 5f 00 00 00 03 00 00 00 67 00 00 00 60 00 00 00 86 00 00 00 03 00 00 00 86 00 00 00 60 00 00 00 5f 00 00 00 04 00 00 00 63 00 00 00 78 00 00 00 74 00 00 00 5f 00 00 00 04 00 00 00 5f 00 00 00 77 00 00 00 79 00 00 00 62 00 00 00 04 00 00 00 a2 00 00 00 a5 00 00 00 7a 00 00 00 64 00 00 00 03 00 00 00 a2 00 00 00 64 00 00 00 68 00 00 00 03 00 00 00 63 00 00 00 62 00 00 00 65 00 00 00 03 00 00 00 62 00 00 00 68 00 00 00 65 00 00 00 03 00 00 00 65 00 00 00 68 00 00 00 64 00 00 00 04 00 00 00 62 00 00 00 79 00 00 00 69 00 00 00 68 00 00 00 04 00 00 00 f4 00 00 00 09 01 00 00 08 01 00 00 f7 00 00 00 04 00 00 00 f8 00 00 00 0a 01 00 00 09 01 00 00 f4 00 00 00 04 00 00 00 ae 00 00 00 b3 00 00 00 38 00 00 00 aa 00 00 00 04 00 00 00 b4 00 00 00 3a 00 00 00 b0 00 00 00 b2 00 00 00 05 00 00 00 af 00 00 00 b1 00 00 00 b5 00 00 00 be 00 00 00 ab 00 00 00 05 00 00 00 37 00 00 00 a8 00 00 00 a9 00 00 00 48 00 00 00 39 00 00 00 04 00 00 00 47 00 00 00 3a 00 00 00 b4 00 00 00 bf 00 00 00 06 00 00 00 28 00 00 00 29 00 00 00 26 00 00 00 22 00 00 00 25 00 00 00 2a 00 00 00 06 00 00 00 36 00 00 00 24 00 00 00 23 00 00 00 27 00 00 00 49 00 00 00 4a 00 00 00 04 00 00 00 fa 00 00 00 fb 00 00 00 0b 01 00 00 0c 01 00 00 04 00 00 00 fe 00 00 00 fa 00 00 00 0c 01 00 00 0d 01 00 00 04 00 00 00 b6 00 00 00 b7 00 00 00 bb 00 00 00 52 00 00 00 04 00 00 00 53 00 00 00 b8 00 00 00 ba 00 00 00 bd 00 00 00 05 00 00 00 ad 00 00 00 ab 00 00 00 be 00 00 00 54 00 00 00 51 00 00 00 05 00 00 00 b9 00 00 00 bc 00 00 00 48 00 00 00 a9 00 00 00 ac 00 00 00 04 00 00 00 47 00 00 00 bf 00 00 00 53 00 00 00 bd 00 00 00 06 00 00 00 28 00 00 00 2a 00 00 00 4c 00 00 00 4b 00 00 00 4f 00 00 00 c0 00 00 00 06 00 00 00 36 00 00 00 4a 00 00 00 c3 00 00 00 50 00 00 00 4e 00 00 00 4d 00 00 00 03 00 00 00 38 00 00 00 b0 00 00 00 b1 00 00 00 03 00 00 00 37 00 00 00 b2 00 00 00 b3 00 00 00 03 00 00 00 52 00 00 00 b8 00 00 00 b9 00 00 00 03 00 00 00 51 00 00 00 ba 00 00 00 bb 00 00 00 04 00 00 00 c7 00 00 00 c1 00 00 00 38 00 00 00 b1 00 00 00 04 00 00 00 b3 00 00 00 b2 00 00 00 b0 00 00 00 38 00 00 00 04 00 00 00 c6 00 00 00 c5 00 00 00 37 00 00 00 b3 00 00 00 04 00 00 00 39 00 00 00 b4 00 00 00 b2 00 00 00 37 00 00 00 04 00 00 00 3a 00 00 00 b5 00 00 00 b1 00 00 00 b0 00 00 00 04 00 00 00 b5 00 00 00 3a 00 00 00 47 00 00 00 be 00 00 00 04 00 00 00 48 00 00 00 bf 00 00 00 b4 00 00 00 39 00 00 00 04 00 00 00 52 00 00 00 b9 00 00 00 c2 00 00 00 c8 00 00 00 04 00 00 00 bb 00 00 00 ba 00 00 00 b8 00 00 00 52 00 00 00 04 00 00 00 51 00 00 00 bb 00 00 00 c9 00 00 00 c4 00 00 00 04 00 00 00 ba 00 00 00 51 00 00 00 54 00 00 00 bd 00 00 00 04 00 00 00 b9 00 00 00 b8 00 00 00 53 00 00 00 bc 00 00 00 04 00 00 00 be 00 00 00 47 00 00 00 bd 00 00 00 54 00 00 00 04 00 00 00 bc 00 00 00 53 00 00 00 bf 00 00 00 48 00 00 00 04 00 00 00 00 01 00 00 f9 00 00 00 0a 01 00 00 0e 01 00 00 04 00 00 00 02 01 00 00 00 01 00 00 0e 01 00 00 0f 01 00 00 04 00 00 00 04 01 00 00 02 01 00 00 0f 01 00 00 10 01 00 00 04 00 00 00 ff 00 00 00 04 01 00 00 10 01 00 00 0d 01 00 00 05 00 00 00 06 01 00 00 f7 00 00 00 f6 00 00 00 07 01 00 00 11 01 00 00 03 00 00 00 fb 00 00 00 fc 00 00 00 0b 01 00 00 04 00 00 00 ca 00 00 00 cb 00 00 00 d1 00 00 00 d0 00 00 00 04 00 00 00 cb 00 00 00 cc 00 00 00 d2 00 00 00 d1 00 00 00 04 00 00 00 cc 00 00 00 cd 00 00 00 d3 00 00 00 d2 00 00 00 04 00 00 00 cd 00 00 00 ce 00 00 00 d4 00 00 00 d3 00 00 00 04 00 00 00 ce 00 00 00 cf 00 00 00 d5 00 00 00 d4 00 00 00 04 00 00 00 d0 00 00 00 d1 00 00 00 d7 00 00 00 d6 00 00 00 04 00 00 00 d1 00 00 00 d2 00 00 00 d8 00 00 00 d7 00 00 00 04 00 00 00 d2 00 00 00 d3 00 00 00 d9 00 00 00 d8 00 00 00 04 00 00 00 d3 00 00 00 d4 00 00 00 da 00 00 00 d9 00 00 00 04 00 00 00 d4 00 00 00 d5 00 00 00 db 00 00 00 da 00 00 00 04 00 00 00 d6 00 00 00 d7 00 00 00 dd 00 00 00 dc 00 00 00 04 00 00 00 d7 00 00 00 d8 00 00 00 de 00 00 00 dd 00 00 00 04 00 00 00 d8 00 00 00 d9 00 00 00 df 00 00 00 de 00 00 00 04 00 00 00 d9 00 00 00 da 00 00 00 e0 00 00 00 df 00 00 00 04 00 00 00 da 00 00 00 db 00 00 00 e1 00 00 00 e0 00 00 00 04 00 00 00 e2 00 00 00 e3 00 00 00 e9 00 00 00 e8 00 00 00 04 00 00 00 e3 00 00 00 e4 00 00 00 ea 00 00 00 e9 00 00 00 04 00 00 00 e4 00 00 00 e5 00 00 00 eb 00 00 00 ea 00 00 00 04 00 00 00 e5 00 00 00 e6 00 00 00 ec 00 00 00 eb 00 00 00 04 00 00 00 e6 00 00 00 e7 00 00 00 ed 00 00 00 ec 00 00 00 04 00 00 00 e8 00 00 00 e9 00 00 00 ef 00 00 00 ee 00 00 00 04 00 00 00 e9 00 00 00 ea 00 00 00 f0 00 00 00 ef 00 00 00 04 00 00 00 ea 00 00 00 eb 00 00 00 f1 00 00 00 f0 00 00 00 04 00 00 00 eb 00 00 00 ec 00 00 00 f2 00 00 00 f1 00 00 00 04 00 00 00 ec 00 00 00 ed 00 00 00 f3 00 00 00 f2 00 00 00 04 00 00 00 ee 00 00 00 ef 00 00 00 cb 00 00 00 ca 00 00 00 04 00 00 00 ef 00 00 00 f0 00 00 00 cc 00 00 00 cb 00 00 00 04 00 00 00 f0 00 00 00 f1 00 00 00 cd 00 00 00 cc 00 00 00 04 00 00 00 f1 00 00 00 f2 00 00 00 ce 00 00 00 cd 00 00 00 04 00 00 00 f2 00 00 00 f3 00 00 00 cf 00 00 00 ce 00 00 00 04 00 00 00 09 01 00 00 f5 00 00 00 f6 00 00 00 08 01 00 00 04 00 00 00 0a 01 00 00 f9 00 00 00 f5 00 00 00 09 01 00 00 04 00 00 00 0b 01 00 00 fc 00 00 00 fd 00 00 00 0c 01 00 00 04 00 00 00 0c 01 00 00 fd 00 00 00 ff 00 00 00 0d 01 00 00 04 00 00 00 0a 01 00 00 f8 00 00 00 01 01 00 00 0e 01 00 00 04 00 00 00 0e 01 00 00 01 01 00 00 03 01 00 00 0f 01 00 00 04 00 00 00 0f 01 00 00 03 01 00 00 05 01 00 00 10 01 00 00 04 00 00 00 10 01 00 00 05 01 00 00 fe 00 00 00 0d 01 00 00 05 00 00 00 fb 00 00 00 06 01 00 00 11 01 00 00 07 01 00 00 fc 00 00 00 03 00 00 00 f7 00 00 00 08 01 00 00 f6 00 00 00 } + 11 0x0310: (StorageRaw) { + Size: 7720 + String: ........L.......=...............................A.......................................@.......................................?...............................................>...............................B...................#.......*...........W.......C.......*...+... ...............X.......D.......+...,...!... ...........Y.......E.......,...-..."...!...........................$.......[...]...^...O...................%...............................Z...Y...P...[...........&...............................W...V...Q...Z...........'...............................N...R...M...W...........................(.......O...`...S...N...................8......................................./.......9...............................0.......:...............................1.......;...............................<.......2...........................9.......................................8.......................................:.......................................;.......................................<.......!...............................=...#...................................A.......................................@........... ...........................?... ......."...........................>..."...!...#...............................F.......Z.......#..."...-...........$...,...*.......................%...*...).......................&...)...+.......................'...+...-.......................(...-...,...........................7.......3...........L...H.........../...3.......4...........H...I...........0...4.......5...........I...J...........1...5.......6...........J...K...........2...6.......7...........K...L...........B...G...K...........$...#.......C...H...G....... ...$...........D...I...H.......!...$... .......E...J...I......."...$...!.......F...K...J.......#...$...".......L...Q...d...U...........%...)...............R...M...Q...........&...%...............S...N...R...........'...&...............T...O...S...........(...'...............U...P...T...........)...(...........[...j..._...o.......9...=...F...>.......[...v...\...q.......>...@...:...9.......\...x...]...r.......@...B...;...:.......]...z...^...s.......B...D...<...;......._...t...^...|.......=...<...D...F.......f...u...e...k.......A...?...4...5.......f...l...g...w.......5...6...C...A.......g...m...h...y.......6...7...E...C.......h...n...i...........7...8...G...E.......e...p...i...........?...G...8...4...............j...............=...9...*.......M.......k...~.......&...5...4...%.......N.......l...........'...6...5...&.......O.......m...........(...7...6...'.......P.......n...........)...8...7...(.......o.......V...........F...c...a...>.......p...................?...e...d...G.......W.......q...........*...9...:...+.......X.......r...........+...:...;...,.......Y.......s...........,...;...<...-.......Z.......t...........-...<...=...........u.......`...........A...i...e...?.......v...................>...a...h...@.......w.......a...........C...o...i...A.......x...................@...h...b...B.......y.......b...........E...2...o...C.......z...................B...b...j...D...............c...........G...d...2...E.......|...................D...j...c...F.......d...~...............%...4...8...)...................................]...\...H...L..._...^...................................Y...X...I...H...\...P...................................V...U...J...I...X...Q...................................R...T...K...J...U...M...................................`..._...L...K...T...S...........................N...S...T...R...........................W...M...U...V...........................Z...Q...X...Y...........................[...P...\...]...........................^..._...`...O...........................g...f...3.../.......`...............................i...0...h...a...g.../...e.......c...............................d...3...f...c...j...k...2...........................e.../...3...d.......V...................c...f...g...a...............................h...0...l...1...b.......a.......................o...m...l...0...i.......b.......................2...k...n...m...o...........................l...m...n...1...............................b...1...n...k...j...............................x...............p.......................w...p...........................w...q...p...........q...................x.......................w.......q...........r...$...............x...............+.......w.......................%...................r.......................)...................u.......................u...........................................s...v...........y...........................w...........................x...................................~...u...............w...........x...................................t...................................y.......................s...................................t...........y...z...............................................u...........z...................'...............................-.......................................,.......w........................................................... ...........(...........................!.......#...........|................... ......................................."...........v.......................................u...~...................................t...............................s...........................................t...................................s...................*...............r...........................................v...s...............................t...........................................................................!...............|...........................&...............~...................................|...........................................................................~.......................".......|.......................................t...................#.......................v...............$...v...................x...........%...........r...............&...............~...........x...'...........................(...........................)...........u...............*...............r.......1...0...=...k...........................1...l...4...2...........................4...m...7...5...........................7...n...:...8...........................=...;...:...o...........................0.../...?...<...........................2...3...@.../...........................5...6...B...3...........................8...9...D...6...........................;...<...F...9...........................?...>...I...G...........................@...A...J...>...........................B...C...L...A...........................D...E...N...C...........................F...G...P...E...........................Q...I...H...................H...J...K...................K...L...M...................M...N...O...................O...P...Q...................R...X...V...................S...Y...R...................T...[...S...................U...]...T...................V..._...U...................X...W...b...`...........................Y...Z...c...W...........................[...\...e...Z...........................]...^...g...\..........................._...`...i...^...........................k...j...b...a...........................l...a...c...d...........................m...d...e...f...........................n...f...g...h...........................o...h...i...j...............................p...z.......p...................q...z...........p...q...................r.......~.......q.......................s...|.......y...................t...|...........y...z...................u...............z...................+...v...~...............................,...w...................................-...x.......................................y............... + Hex: 04 00 00 00 02 00 00 00 4c 00 00 00 0e 00 00 00 3d 00 00 00 04 00 00 00 00 00 00 00 04 00 00 00 1a 00 00 00 1e 00 00 00 04 00 00 00 02 00 00 00 41 00 00 00 05 00 00 00 03 00 00 00 04 00 00 00 1e 00 00 00 1d 00 00 00 01 00 00 00 00 00 00 00 04 00 00 00 05 00 00 00 40 00 00 00 08 00 00 00 06 00 00 00 04 00 00 00 1d 00 00 00 1c 00 00 00 02 00 00 00 01 00 00 00 04 00 00 00 08 00 00 00 3f 00 00 00 0b 00 00 00 09 00 00 00 04 00 00 00 1c 00 00 00 1b 00 00 00 03 00 00 00 02 00 00 00 04 00 00 00 0e 00 00 00 0c 00 00 00 0b 00 00 00 3e 00 00 00 04 00 00 00 04 00 00 00 03 00 00 00 1b 00 00 00 1a 00 00 00 04 00 00 00 00 00 00 00 42 00 00 00 0d 00 00 00 01 00 00 00 04 00 00 00 1f 00 00 00 23 00 00 00 2e 00 00 00 2a 00 00 00 04 00 00 00 00 00 00 00 57 00 00 00 04 00 00 00 43 00 00 00 04 00 00 00 2a 00 00 00 2b 00 00 00 20 00 00 00 1f 00 00 00 04 00 00 00 04 00 00 00 58 00 00 00 07 00 00 00 44 00 00 00 04 00 00 00 2b 00 00 00 2c 00 00 00 21 00 00 00 20 00 00 00 04 00 00 00 07 00 00 00 59 00 00 00 0a 00 00 00 45 00 00 00 04 00 00 00 2c 00 00 00 2d 00 00 00 22 00 00 00 21 00 00 00 06 00 00 00 93 00 00 00 b3 00 00 00 a0 00 00 00 b4 00 00 00 92 00 00 00 24 00 00 00 06 00 00 00 5b 00 00 00 5d 00 00 00 5e 00 00 00 4f 00 00 00 0d 00 00 00 0b 00 00 00 06 00 00 00 93 00 00 00 25 00 00 00 94 00 00 00 ad 00 00 00 ab 00 00 00 b1 00 00 00 06 00 00 00 0b 00 00 00 0a 00 00 00 5a 00 00 00 59 00 00 00 50 00 00 00 5b 00 00 00 06 00 00 00 94 00 00 00 26 00 00 00 95 00 00 00 a8 00 00 00 a6 00 00 00 af 00 00 00 06 00 00 00 0a 00 00 00 0c 00 00 00 57 00 00 00 56 00 00 00 51 00 00 00 5a 00 00 00 06 00 00 00 95 00 00 00 27 00 00 00 96 00 00 00 a3 00 00 00 a1 00 00 00 aa 00 00 00 06 00 00 00 0c 00 00 00 0e 00 00 00 4e 00 00 00 52 00 00 00 4d 00 00 00 57 00 00 00 06 00 00 00 92 00 00 00 b8 00 00 00 b7 00 00 00 a4 00 00 00 96 00 00 00 28 00 00 00 06 00 00 00 4f 00 00 00 60 00 00 00 53 00 00 00 4e 00 00 00 0e 00 00 00 0d 00 00 00 04 00 00 00 0f 00 00 00 38 00 00 00 14 00 00 00 10 00 00 00 04 00 00 00 15 00 00 00 19 00 00 00 14 00 00 00 10 00 00 00 04 00 00 00 0f 00 00 00 2f 00 00 00 11 00 00 00 39 00 00 00 04 00 00 00 10 00 00 00 11 00 00 00 16 00 00 00 15 00 00 00 04 00 00 00 11 00 00 00 30 00 00 00 12 00 00 00 3a 00 00 00 04 00 00 00 11 00 00 00 12 00 00 00 17 00 00 00 16 00 00 00 04 00 00 00 12 00 00 00 31 00 00 00 13 00 00 00 3b 00 00 00 04 00 00 00 12 00 00 00 13 00 00 00 18 00 00 00 17 00 00 00 04 00 00 00 14 00 00 00 3c 00 00 00 13 00 00 00 32 00 00 00 04 00 00 00 19 00 00 00 18 00 00 00 13 00 00 00 14 00 00 00 04 00 00 00 39 00 00 00 16 00 00 00 1a 00 00 00 15 00 00 00 04 00 00 00 16 00 00 00 06 00 00 00 05 00 00 00 15 00 00 00 04 00 00 00 38 00 00 00 15 00 00 00 1c 00 00 00 19 00 00 00 04 00 00 00 15 00 00 00 05 00 00 00 09 00 00 00 19 00 00 00 04 00 00 00 3a 00 00 00 17 00 00 00 1d 00 00 00 16 00 00 00 04 00 00 00 17 00 00 00 07 00 00 00 06 00 00 00 16 00 00 00 04 00 00 00 3b 00 00 00 18 00 00 00 1f 00 00 00 17 00 00 00 04 00 00 00 18 00 00 00 08 00 00 00 07 00 00 00 17 00 00 00 04 00 00 00 3c 00 00 00 19 00 00 00 21 00 00 00 18 00 00 00 04 00 00 00 19 00 00 00 09 00 00 00 08 00 00 00 18 00 00 00 04 00 00 00 3d 00 00 00 23 00 00 00 1c 00 00 00 1b 00 00 00 04 00 00 00 1a 00 00 00 09 00 00 00 05 00 00 00 1e 00 00 00 04 00 00 00 41 00 00 00 1b 00 00 00 1a 00 00 00 1e 00 00 00 04 00 00 00 1e 00 00 00 05 00 00 00 06 00 00 00 1d 00 00 00 04 00 00 00 40 00 00 00 1e 00 00 00 1d 00 00 00 20 00 00 00 04 00 00 00 1d 00 00 00 06 00 00 00 07 00 00 00 1c 00 00 00 04 00 00 00 3f 00 00 00 20 00 00 00 1f 00 00 00 22 00 00 00 04 00 00 00 1c 00 00 00 07 00 00 00 08 00 00 00 1b 00 00 00 04 00 00 00 3e 00 00 00 22 00 00 00 21 00 00 00 23 00 00 00 04 00 00 00 1b 00 00 00 08 00 00 00 09 00 00 00 1a 00 00 00 04 00 00 00 0d 00 00 00 46 00 00 00 0a 00 00 00 5a 00 00 00 04 00 00 00 23 00 00 00 22 00 00 00 2d 00 00 00 2e 00 00 00 03 00 00 00 24 00 00 00 2c 00 00 00 2a 00 00 00 03 00 00 00 0d 00 00 00 0f 00 00 00 0b 00 00 00 03 00 00 00 25 00 00 00 2a 00 00 00 29 00 00 00 03 00 00 00 0b 00 00 00 0f 00 00 00 0a 00 00 00 03 00 00 00 26 00 00 00 29 00 00 00 2b 00 00 00 03 00 00 00 0a 00 00 00 0f 00 00 00 0c 00 00 00 03 00 00 00 27 00 00 00 2b 00 00 00 2d 00 00 00 03 00 00 00 0c 00 00 00 0f 00 00 00 0e 00 00 00 03 00 00 00 28 00 00 00 2d 00 00 00 2c 00 00 00 03 00 00 00 0e 00 00 00 0f 00 00 00 0d 00 00 00 04 00 00 00 10 00 00 00 37 00 00 00 2e 00 00 00 33 00 00 00 04 00 00 00 14 00 00 00 4c 00 00 00 48 00 00 00 10 00 00 00 04 00 00 00 2f 00 00 00 33 00 00 00 97 00 00 00 34 00 00 00 04 00 00 00 10 00 00 00 48 00 00 00 49 00 00 00 11 00 00 00 04 00 00 00 30 00 00 00 34 00 00 00 98 00 00 00 35 00 00 00 04 00 00 00 11 00 00 00 49 00 00 00 4a 00 00 00 12 00 00 00 04 00 00 00 31 00 00 00 35 00 00 00 99 00 00 00 36 00 00 00 04 00 00 00 12 00 00 00 4a 00 00 00 4b 00 00 00 13 00 00 00 04 00 00 00 32 00 00 00 36 00 00 00 9a 00 00 00 37 00 00 00 04 00 00 00 13 00 00 00 4b 00 00 00 4c 00 00 00 14 00 00 00 03 00 00 00 42 00 00 00 47 00 00 00 4b 00 00 00 03 00 00 00 1f 00 00 00 24 00 00 00 23 00 00 00 03 00 00 00 43 00 00 00 48 00 00 00 47 00 00 00 03 00 00 00 20 00 00 00 24 00 00 00 1f 00 00 00 03 00 00 00 44 00 00 00 49 00 00 00 48 00 00 00 03 00 00 00 21 00 00 00 24 00 00 00 20 00 00 00 03 00 00 00 45 00 00 00 4a 00 00 00 49 00 00 00 03 00 00 00 22 00 00 00 24 00 00 00 21 00 00 00 03 00 00 00 46 00 00 00 4b 00 00 00 4a 00 00 00 03 00 00 00 23 00 00 00 24 00 00 00 22 00 00 00 04 00 00 00 4c 00 00 00 51 00 00 00 64 00 00 00 55 00 00 00 04 00 00 00 00 00 00 00 25 00 00 00 29 00 00 00 04 00 00 00 04 00 00 00 03 00 00 00 52 00 00 00 4d 00 00 00 51 00 00 00 04 00 00 00 01 00 00 00 26 00 00 00 25 00 00 00 00 00 00 00 04 00 00 00 06 00 00 00 53 00 00 00 4e 00 00 00 52 00 00 00 04 00 00 00 02 00 00 00 27 00 00 00 26 00 00 00 01 00 00 00 04 00 00 00 09 00 00 00 54 00 00 00 4f 00 00 00 53 00 00 00 04 00 00 00 03 00 00 00 28 00 00 00 27 00 00 00 02 00 00 00 04 00 00 00 0c 00 00 00 55 00 00 00 50 00 00 00 54 00 00 00 04 00 00 00 04 00 00 00 29 00 00 00 28 00 00 00 03 00 00 00 04 00 00 00 5b 00 00 00 6a 00 00 00 5f 00 00 00 6f 00 00 00 04 00 00 00 39 00 00 00 3d 00 00 00 46 00 00 00 3e 00 00 00 04 00 00 00 5b 00 00 00 76 00 00 00 5c 00 00 00 71 00 00 00 04 00 00 00 3e 00 00 00 40 00 00 00 3a 00 00 00 39 00 00 00 04 00 00 00 5c 00 00 00 78 00 00 00 5d 00 00 00 72 00 00 00 04 00 00 00 40 00 00 00 42 00 00 00 3b 00 00 00 3a 00 00 00 04 00 00 00 5d 00 00 00 7a 00 00 00 5e 00 00 00 73 00 00 00 04 00 00 00 42 00 00 00 44 00 00 00 3c 00 00 00 3b 00 00 00 04 00 00 00 5f 00 00 00 74 00 00 00 5e 00 00 00 7c 00 00 00 04 00 00 00 3d 00 00 00 3c 00 00 00 44 00 00 00 46 00 00 00 04 00 00 00 66 00 00 00 75 00 00 00 65 00 00 00 6b 00 00 00 04 00 00 00 41 00 00 00 3f 00 00 00 34 00 00 00 35 00 00 00 04 00 00 00 66 00 00 00 6c 00 00 00 67 00 00 00 77 00 00 00 04 00 00 00 35 00 00 00 36 00 00 00 43 00 00 00 41 00 00 00 04 00 00 00 67 00 00 00 6d 00 00 00 68 00 00 00 79 00 00 00 04 00 00 00 36 00 00 00 37 00 00 00 45 00 00 00 43 00 00 00 04 00 00 00 68 00 00 00 6e 00 00 00 69 00 00 00 7b 00 00 00 04 00 00 00 37 00 00 00 38 00 00 00 47 00 00 00 45 00 00 00 04 00 00 00 65 00 00 00 70 00 00 00 69 00 00 00 7d 00 00 00 04 00 00 00 3f 00 00 00 47 00 00 00 38 00 00 00 34 00 00 00 04 00 00 00 01 00 00 00 87 00 00 00 6a 00 00 00 83 00 00 00 04 00 00 00 2e 00 00 00 3d 00 00 00 39 00 00 00 2a 00 00 00 04 00 00 00 4d 00 00 00 7f 00 00 00 6b 00 00 00 7e 00 00 00 04 00 00 00 26 00 00 00 35 00 00 00 34 00 00 00 25 00 00 00 04 00 00 00 4e 00 00 00 80 00 00 00 6c 00 00 00 7f 00 00 00 04 00 00 00 27 00 00 00 36 00 00 00 35 00 00 00 26 00 00 00 04 00 00 00 4f 00 00 00 81 00 00 00 6d 00 00 00 80 00 00 00 04 00 00 00 28 00 00 00 37 00 00 00 36 00 00 00 27 00 00 00 04 00 00 00 50 00 00 00 82 00 00 00 6e 00 00 00 81 00 00 00 04 00 00 00 29 00 00 00 38 00 00 00 37 00 00 00 28 00 00 00 04 00 00 00 6f 00 00 00 90 00 00 00 56 00 00 00 88 00 00 00 04 00 00 00 46 00 00 00 63 00 00 00 61 00 00 00 3e 00 00 00 04 00 00 00 70 00 00 00 89 00 00 00 be 00 00 00 91 00 00 00 04 00 00 00 3f 00 00 00 65 00 00 00 64 00 00 00 47 00 00 00 04 00 00 00 57 00 00 00 83 00 00 00 71 00 00 00 84 00 00 00 04 00 00 00 2a 00 00 00 39 00 00 00 3a 00 00 00 2b 00 00 00 04 00 00 00 58 00 00 00 84 00 00 00 72 00 00 00 85 00 00 00 04 00 00 00 2b 00 00 00 3a 00 00 00 3b 00 00 00 2c 00 00 00 04 00 00 00 59 00 00 00 85 00 00 00 73 00 00 00 86 00 00 00 04 00 00 00 2c 00 00 00 3b 00 00 00 3c 00 00 00 2d 00 00 00 04 00 00 00 5a 00 00 00 86 00 00 00 74 00 00 00 87 00 00 00 04 00 00 00 2d 00 00 00 3c 00 00 00 3d 00 00 00 2e 00 00 00 04 00 00 00 75 00 00 00 8b 00 00 00 60 00 00 00 89 00 00 00 04 00 00 00 41 00 00 00 69 00 00 00 65 00 00 00 3f 00 00 00 04 00 00 00 76 00 00 00 88 00 00 00 ba 00 00 00 8a 00 00 00 04 00 00 00 3e 00 00 00 61 00 00 00 68 00 00 00 40 00 00 00 04 00 00 00 77 00 00 00 8d 00 00 00 61 00 00 00 8b 00 00 00 04 00 00 00 43 00 00 00 6f 00 00 00 69 00 00 00 41 00 00 00 04 00 00 00 78 00 00 00 8a 00 00 00 c5 00 00 00 8c 00 00 00 04 00 00 00 40 00 00 00 68 00 00 00 62 00 00 00 42 00 00 00 04 00 00 00 79 00 00 00 8f 00 00 00 62 00 00 00 8d 00 00 00 04 00 00 00 45 00 00 00 32 00 00 00 6f 00 00 00 43 00 00 00 04 00 00 00 7a 00 00 00 8c 00 00 00 c9 00 00 00 8e 00 00 00 04 00 00 00 42 00 00 00 62 00 00 00 6a 00 00 00 44 00 00 00 04 00 00 00 7b 00 00 00 91 00 00 00 63 00 00 00 8f 00 00 00 04 00 00 00 47 00 00 00 64 00 00 00 32 00 00 00 45 00 00 00 04 00 00 00 7c 00 00 00 8e 00 00 00 bc 00 00 00 90 00 00 00 04 00 00 00 44 00 00 00 6a 00 00 00 63 00 00 00 46 00 00 00 04 00 00 00 64 00 00 00 7e 00 00 00 7d 00 00 00 82 00 00 00 04 00 00 00 25 00 00 00 34 00 00 00 38 00 00 00 29 00 00 00 06 00 00 00 a0 00 00 00 b0 00 00 00 9d 00 00 00 2e 00 00 00 9e 00 00 00 b6 00 00 00 06 00 00 00 5d 00 00 00 5c 00 00 00 48 00 00 00 4c 00 00 00 5f 00 00 00 5e 00 00 00 06 00 00 00 ab 00 00 00 ae 00 00 00 9c 00 00 00 97 00 00 00 9d 00 00 00 b2 00 00 00 06 00 00 00 59 00 00 00 58 00 00 00 49 00 00 00 48 00 00 00 5c 00 00 00 50 00 00 00 06 00 00 00 a6 00 00 00 a9 00 00 00 9b 00 00 00 98 00 00 00 9c 00 00 00 ac 00 00 00 06 00 00 00 56 00 00 00 55 00 00 00 4a 00 00 00 49 00 00 00 58 00 00 00 51 00 00 00 06 00 00 00 a1 00 00 00 a5 00 00 00 9f 00 00 00 99 00 00 00 9b 00 00 00 a7 00 00 00 06 00 00 00 52 00 00 00 54 00 00 00 4b 00 00 00 4a 00 00 00 55 00 00 00 4d 00 00 00 06 00 00 00 b7 00 00 00 b5 00 00 00 9e 00 00 00 9a 00 00 00 9f 00 00 00 a2 00 00 00 06 00 00 00 60 00 00 00 5f 00 00 00 4c 00 00 00 4b 00 00 00 54 00 00 00 53 00 00 00 04 00 00 00 a3 00 00 00 a4 00 00 00 a2 00 00 00 a5 00 00 00 04 00 00 00 4e 00 00 00 53 00 00 00 54 00 00 00 52 00 00 00 04 00 00 00 a8 00 00 00 aa 00 00 00 a7 00 00 00 a9 00 00 00 04 00 00 00 57 00 00 00 4d 00 00 00 55 00 00 00 56 00 00 00 04 00 00 00 ad 00 00 00 af 00 00 00 ac 00 00 00 ae 00 00 00 04 00 00 00 5a 00 00 00 51 00 00 00 58 00 00 00 59 00 00 00 04 00 00 00 b3 00 00 00 b1 00 00 00 b2 00 00 00 b0 00 00 00 04 00 00 00 5b 00 00 00 50 00 00 00 5c 00 00 00 5d 00 00 00 04 00 00 00 b4 00 00 00 b6 00 00 00 b5 00 00 00 b8 00 00 00 04 00 00 00 5e 00 00 00 5f 00 00 00 60 00 00 00 4f 00 00 00 04 00 00 00 c3 00 00 00 c1 00 00 00 bd 00 00 00 b9 00 00 00 04 00 00 00 67 00 00 00 66 00 00 00 33 00 00 00 2f 00 00 00 07 00 00 00 60 00 00 00 c8 00 00 00 c6 00 00 00 ba 00 00 00 c4 00 00 00 c3 00 00 00 c0 00 00 00 07 00 00 00 69 00 00 00 30 00 00 00 68 00 00 00 61 00 00 00 67 00 00 00 2f 00 00 00 65 00 00 00 07 00 00 00 63 00 00 00 bf 00 00 00 bd 00 00 00 c2 00 00 00 bc 00 00 00 ca 00 00 00 cb 00 00 00 07 00 00 00 64 00 00 00 33 00 00 00 66 00 00 00 63 00 00 00 6a 00 00 00 6b 00 00 00 32 00 00 00 04 00 00 00 be 00 00 00 c0 00 00 00 b9 00 00 00 bf 00 00 00 04 00 00 00 65 00 00 00 2f 00 00 00 33 00 00 00 64 00 00 00 04 00 00 00 56 00 00 00 c2 00 00 00 c1 00 00 00 c4 00 00 00 04 00 00 00 63 00 00 00 66 00 00 00 67 00 00 00 61 00 00 00 05 00 00 00 c5 00 00 00 c6 00 00 00 c7 00 00 00 cc 00 00 00 d0 00 00 00 05 00 00 00 68 00 00 00 30 00 00 00 6c 00 00 00 31 00 00 00 62 00 00 00 05 00 00 00 61 00 00 00 d1 00 00 00 ce 00 00 00 c7 00 00 00 c8 00 00 00 05 00 00 00 6f 00 00 00 6d 00 00 00 6c 00 00 00 30 00 00 00 69 00 00 00 05 00 00 00 62 00 00 00 cb 00 00 00 bb 00 00 00 cd 00 00 00 d1 00 00 00 05 00 00 00 32 00 00 00 6b 00 00 00 6e 00 00 00 6d 00 00 00 6f 00 00 00 04 00 00 00 cc 00 00 00 ce 00 00 00 cd 00 00 00 cf 00 00 00 04 00 00 00 6c 00 00 00 6d 00 00 00 6e 00 00 00 31 00 00 00 05 00 00 00 c9 00 00 00 d0 00 00 00 cf 00 00 00 bb 00 00 00 ca 00 00 00 05 00 00 00 62 00 00 00 31 00 00 00 6e 00 00 00 6b 00 00 00 6a 00 00 00 04 00 00 00 d3 00 00 00 d6 00 00 00 d2 00 00 00 83 01 00 00 04 00 00 00 b8 00 00 00 78 00 00 00 98 00 00 00 c1 00 00 00 04 00 00 00 70 01 00 00 d4 00 00 00 d5 00 00 00 83 01 00 00 04 00 00 00 98 00 00 00 77 00 00 00 70 00 00 00 c1 00 00 00 03 00 00 00 d5 00 00 00 d8 00 00 00 d7 00 00 00 03 00 00 00 77 00 00 00 71 00 00 00 70 00 00 00 03 00 00 00 d6 00 00 00 71 01 00 00 d9 00 00 00 03 00 00 00 b8 00 00 00 b9 00 00 00 78 00 00 00 03 00 00 00 d8 00 00 00 e6 00 00 00 da 00 00 00 03 00 00 00 77 00 00 00 bc 00 00 00 71 00 00 00 03 00 00 00 d9 00 00 00 72 01 00 00 24 01 00 00 03 00 00 00 b9 00 00 00 94 00 00 00 78 00 00 00 03 00 00 00 e6 00 00 00 dc 00 00 00 2b 01 00 00 03 00 00 00 77 00 00 00 bd 00 00 00 bc 00 00 00 04 00 00 00 05 01 00 00 07 01 00 00 25 01 00 00 e1 00 00 00 04 00 00 00 82 00 00 00 86 00 00 00 72 00 00 00 87 00 00 00 04 00 00 00 e2 00 00 00 08 01 00 00 0a 01 00 00 29 01 00 00 04 00 00 00 89 00 00 00 83 00 00 00 88 00 00 00 75 00 00 00 03 00 00 00 e2 00 00 00 e7 00 00 00 0b 01 00 00 03 00 00 00 75 00 00 00 8c 00 00 00 89 00 00 00 04 00 00 00 1c 01 00 00 0c 01 00 00 e3 00 00 00 e4 00 00 00 04 00 00 00 8b 00 00 00 8a 00 00 00 73 00 00 00 76 00 00 00 04 00 00 00 d4 00 00 00 79 01 00 00 01 01 00 00 e8 00 00 00 04 00 00 00 98 00 00 00 c0 00 00 00 80 00 00 00 77 00 00 00 04 00 00 00 d2 00 00 00 e9 00 00 00 ed 00 00 00 2e 01 00 00 04 00 00 00 78 00 00 00 81 00 00 00 c0 00 00 00 98 00 00 00 03 00 00 00 f5 00 00 00 eb 00 00 00 db 00 00 00 02 00 00 00 7e 00 00 00 75 00 00 00 04 00 00 00 e9 00 00 00 dd 00 00 00 77 01 00 00 f7 00 00 00 04 00 00 00 78 00 00 00 95 00 00 00 96 00 00 00 81 00 00 00 03 00 00 00 de 00 00 00 ea 00 00 00 f6 00 00 00 02 00 00 00 74 00 00 00 7d 00 00 00 04 00 00 00 01 01 00 00 ec 00 00 00 f0 00 00 00 82 01 00 00 04 00 00 00 99 00 00 00 79 00 00 00 80 00 00 00 c0 00 00 00 04 00 00 00 ed 00 00 00 ef 00 00 00 73 01 00 00 82 01 00 00 04 00 00 00 81 00 00 00 ba 00 00 00 99 00 00 00 c0 00 00 00 03 00 00 00 f0 00 00 00 74 01 00 00 f3 00 00 00 03 00 00 00 79 00 00 00 7a 00 00 00 80 00 00 00 03 00 00 00 ef 00 00 00 f2 00 00 00 ee 00 00 00 03 00 00 00 81 00 00 00 bb 00 00 00 ba 00 00 00 03 00 00 00 f3 00 00 00 75 01 00 00 fe 00 00 00 03 00 00 00 7a 00 00 00 bf 00 00 00 80 00 00 00 03 00 00 00 f2 00 00 00 27 01 00 00 f1 00 00 00 03 00 00 00 81 00 00 00 97 00 00 00 bb 00 00 00 03 00 00 00 fe 00 00 00 2d 01 00 00 f4 00 00 00 03 00 00 00 bf 00 00 00 be 00 00 00 80 00 00 00 04 00 00 00 dc 00 00 00 e8 00 00 00 f4 00 00 00 2c 01 00 00 04 00 00 00 77 00 00 00 80 00 00 00 be 00 00 00 bd 00 00 00 04 00 00 00 f8 00 00 00 f9 00 00 00 0f 01 00 00 11 01 00 00 04 00 00 00 7b 00 00 00 8e 00 00 00 84 00 00 00 8d 00 00 00 04 00 00 00 20 01 00 00 12 01 00 00 14 01 00 00 28 01 00 00 04 00 00 00 90 00 00 00 85 00 00 00 8f 00 00 00 7d 00 00 00 04 00 00 00 21 01 00 00 fb 00 00 00 23 01 00 00 15 01 00 00 04 00 00 00 7c 00 00 00 7f 00 00 00 93 00 00 00 91 00 00 00 03 00 00 00 20 01 00 00 ff 00 00 00 16 01 00 00 03 00 00 00 7d 00 00 00 92 00 00 00 90 00 00 00 04 00 00 00 1c 01 00 00 02 01 00 00 22 01 00 00 17 01 00 00 04 00 00 00 76 00 00 00 7f 00 00 00 92 00 00 00 8b 00 00 00 04 00 00 00 e7 00 00 00 eb 00 00 00 00 01 00 00 18 01 00 00 04 00 00 00 75 00 00 00 7e 00 00 00 93 00 00 00 8c 00 00 00 03 00 00 00 04 01 00 00 e0 00 00 00 de 00 00 00 02 00 00 00 86 00 00 00 74 00 00 00 04 00 00 00 05 01 00 00 19 01 00 00 e3 00 00 00 06 01 00 00 04 00 00 00 87 00 00 00 73 00 00 00 8a 00 00 00 82 00 00 00 04 00 00 00 07 01 00 00 06 01 00 00 1b 01 00 00 e0 00 00 00 04 00 00 00 82 00 00 00 8a 00 00 00 74 00 00 00 86 00 00 00 04 00 00 00 08 01 00 00 1a 01 00 00 19 01 00 00 09 01 00 00 04 00 00 00 89 00 00 00 73 00 00 00 87 00 00 00 83 00 00 00 04 00 00 00 e1 00 00 00 2a 01 00 00 0a 01 00 00 09 01 00 00 04 00 00 00 72 00 00 00 88 00 00 00 83 00 00 00 87 00 00 00 04 00 00 00 0b 01 00 00 1d 01 00 00 e4 00 00 00 1a 01 00 00 04 00 00 00 8c 00 00 00 76 00 00 00 73 00 00 00 89 00 00 00 03 00 00 00 0c 01 00 00 e5 00 00 00 1b 01 00 00 03 00 00 00 8b 00 00 00 74 00 00 00 8a 00 00 00 03 00 00 00 fa 00 00 00 f8 00 00 00 0d 01 00 00 02 00 00 00 7b 00 00 00 8d 00 00 00 03 00 00 00 0e 01 00 00 1f 01 00 00 fa 00 00 00 02 00 00 00 8f 00 00 00 7b 00 00 00 04 00 00 00 0f 01 00 00 1e 01 00 00 21 01 00 00 10 01 00 00 04 00 00 00 8e 00 00 00 7c 00 00 00 91 00 00 00 84 00 00 00 04 00 00 00 11 01 00 00 10 01 00 00 fd 00 00 00 26 01 00 00 04 00 00 00 84 00 00 00 91 00 00 00 7e 00 00 00 8d 00 00 00 04 00 00 00 12 01 00 00 fc 00 00 00 1e 01 00 00 13 01 00 00 04 00 00 00 90 00 00 00 7c 00 00 00 8e 00 00 00 85 00 00 00 04 00 00 00 f9 00 00 00 1f 01 00 00 14 01 00 00 13 01 00 00 04 00 00 00 7b 00 00 00 8f 00 00 00 85 00 00 00 8e 00 00 00 03 00 00 00 15 01 00 00 00 01 00 00 fd 00 00 00 03 00 00 00 93 00 00 00 7e 00 00 00 91 00 00 00 04 00 00 00 fb 00 00 00 fc 00 00 00 16 01 00 00 22 01 00 00 04 00 00 00 7c 00 00 00 90 00 00 00 92 00 00 00 7f 00 00 00 04 00 00 00 ea 00 00 00 e5 00 00 00 17 01 00 00 ff 00 00 00 04 00 00 00 74 00 00 00 8b 00 00 00 92 00 00 00 7d 00 00 00 04 00 00 00 23 01 00 00 02 01 00 00 1d 01 00 00 18 01 00 00 04 00 00 00 7f 00 00 00 76 00 00 00 8c 00 00 00 93 00 00 00 03 00 00 00 24 01 00 00 76 01 00 00 dd 00 00 00 03 00 00 00 94 00 00 00 95 00 00 00 78 00 00 00 03 00 00 00 df 00 00 00 25 01 00 00 04 01 00 00 02 00 00 00 72 00 00 00 86 00 00 00 03 00 00 00 0d 01 00 00 26 01 00 00 f5 00 00 00 02 00 00 00 8d 00 00 00 7e 00 00 00 03 00 00 00 f7 00 00 00 78 01 00 00 27 01 00 00 03 00 00 00 96 00 00 00 97 00 00 00 81 00 00 00 03 00 00 00 f6 00 00 00 28 01 00 00 0e 01 00 00 02 00 00 00 7d 00 00 00 8f 00 00 00 03 00 00 00 db 00 00 00 29 01 00 00 03 01 00 00 02 00 00 00 75 00 00 00 88 00 00 00 03 00 00 00 03 01 00 00 2a 01 00 00 df 00 00 00 02 00 00 00 88 00 00 00 72 00 00 00 04 00 00 00 31 01 00 00 30 01 00 00 3d 01 00 00 6b 01 00 00 04 00 00 00 9a 00 00 00 9e 00 00 00 b7 00 00 00 b3 00 00 00 04 00 00 00 31 01 00 00 6c 01 00 00 34 01 00 00 32 01 00 00 04 00 00 00 b3 00 00 00 b4 00 00 00 9b 00 00 00 9a 00 00 00 04 00 00 00 34 01 00 00 6d 01 00 00 37 01 00 00 35 01 00 00 04 00 00 00 b4 00 00 00 b5 00 00 00 9c 00 00 00 9b 00 00 00 04 00 00 00 37 01 00 00 6e 01 00 00 3a 01 00 00 38 01 00 00 04 00 00 00 b5 00 00 00 b6 00 00 00 9d 00 00 00 9c 00 00 00 04 00 00 00 3d 01 00 00 3b 01 00 00 3a 01 00 00 6f 01 00 00 04 00 00 00 9e 00 00 00 9d 00 00 00 b6 00 00 00 b7 00 00 00 04 00 00 00 30 01 00 00 2f 01 00 00 3f 01 00 00 3c 01 00 00 04 00 00 00 9a 00 00 00 9f 00 00 00 a3 00 00 00 9e 00 00 00 04 00 00 00 32 01 00 00 33 01 00 00 40 01 00 00 2f 01 00 00 04 00 00 00 9b 00 00 00 a0 00 00 00 9f 00 00 00 9a 00 00 00 04 00 00 00 35 01 00 00 36 01 00 00 42 01 00 00 33 01 00 00 04 00 00 00 9c 00 00 00 a1 00 00 00 a0 00 00 00 9b 00 00 00 04 00 00 00 38 01 00 00 39 01 00 00 44 01 00 00 36 01 00 00 04 00 00 00 9d 00 00 00 a2 00 00 00 a1 00 00 00 9c 00 00 00 04 00 00 00 3b 01 00 00 3c 01 00 00 46 01 00 00 39 01 00 00 04 00 00 00 9e 00 00 00 a3 00 00 00 a2 00 00 00 9d 00 00 00 04 00 00 00 3f 01 00 00 3e 01 00 00 49 01 00 00 47 01 00 00 04 00 00 00 9f 00 00 00 a4 00 00 00 a8 00 00 00 a3 00 00 00 04 00 00 00 40 01 00 00 41 01 00 00 4a 01 00 00 3e 01 00 00 04 00 00 00 a0 00 00 00 a5 00 00 00 a4 00 00 00 9f 00 00 00 04 00 00 00 42 01 00 00 43 01 00 00 4c 01 00 00 41 01 00 00 04 00 00 00 a1 00 00 00 a6 00 00 00 a5 00 00 00 a0 00 00 00 04 00 00 00 44 01 00 00 45 01 00 00 4e 01 00 00 43 01 00 00 04 00 00 00 a2 00 00 00 a7 00 00 00 a6 00 00 00 a1 00 00 00 04 00 00 00 46 01 00 00 47 01 00 00 50 01 00 00 45 01 00 00 04 00 00 00 a3 00 00 00 a8 00 00 00 a7 00 00 00 a2 00 00 00 03 00 00 00 51 01 00 00 49 01 00 00 48 01 00 00 02 00 00 00 a8 00 00 00 a4 00 00 00 03 00 00 00 48 01 00 00 4a 01 00 00 4b 01 00 00 02 00 00 00 a4 00 00 00 a5 00 00 00 03 00 00 00 4b 01 00 00 4c 01 00 00 4d 01 00 00 02 00 00 00 a5 00 00 00 a6 00 00 00 03 00 00 00 4d 01 00 00 4e 01 00 00 4f 01 00 00 02 00 00 00 a6 00 00 00 a7 00 00 00 03 00 00 00 4f 01 00 00 50 01 00 00 51 01 00 00 02 00 00 00 a7 00 00 00 a8 00 00 00 03 00 00 00 52 01 00 00 58 01 00 00 56 01 00 00 02 00 00 00 a9 00 00 00 ad 00 00 00 03 00 00 00 53 01 00 00 59 01 00 00 52 01 00 00 02 00 00 00 aa 00 00 00 a9 00 00 00 03 00 00 00 54 01 00 00 5b 01 00 00 53 01 00 00 02 00 00 00 ab 00 00 00 aa 00 00 00 03 00 00 00 55 01 00 00 5d 01 00 00 54 01 00 00 02 00 00 00 ac 00 00 00 ab 00 00 00 03 00 00 00 56 01 00 00 5f 01 00 00 55 01 00 00 02 00 00 00 ad 00 00 00 ac 00 00 00 04 00 00 00 58 01 00 00 57 01 00 00 62 01 00 00 60 01 00 00 04 00 00 00 a9 00 00 00 ae 00 00 00 b2 00 00 00 ad 00 00 00 04 00 00 00 59 01 00 00 5a 01 00 00 63 01 00 00 57 01 00 00 04 00 00 00 aa 00 00 00 af 00 00 00 ae 00 00 00 a9 00 00 00 04 00 00 00 5b 01 00 00 5c 01 00 00 65 01 00 00 5a 01 00 00 04 00 00 00 ab 00 00 00 b0 00 00 00 af 00 00 00 aa 00 00 00 04 00 00 00 5d 01 00 00 5e 01 00 00 67 01 00 00 5c 01 00 00 04 00 00 00 ac 00 00 00 b1 00 00 00 b0 00 00 00 ab 00 00 00 04 00 00 00 5f 01 00 00 60 01 00 00 69 01 00 00 5e 01 00 00 04 00 00 00 ad 00 00 00 b2 00 00 00 b1 00 00 00 ac 00 00 00 04 00 00 00 6b 01 00 00 6a 01 00 00 62 01 00 00 61 01 00 00 04 00 00 00 b7 00 00 00 b2 00 00 00 ae 00 00 00 b3 00 00 00 04 00 00 00 6c 01 00 00 61 01 00 00 63 01 00 00 64 01 00 00 04 00 00 00 b3 00 00 00 ae 00 00 00 af 00 00 00 b4 00 00 00 04 00 00 00 6d 01 00 00 64 01 00 00 65 01 00 00 66 01 00 00 04 00 00 00 b4 00 00 00 af 00 00 00 b0 00 00 00 b5 00 00 00 04 00 00 00 6e 01 00 00 66 01 00 00 67 01 00 00 68 01 00 00 04 00 00 00 b5 00 00 00 b0 00 00 00 b1 00 00 00 b6 00 00 00 04 00 00 00 6f 01 00 00 68 01 00 00 69 01 00 00 6a 01 00 00 04 00 00 00 b6 00 00 00 b1 00 00 00 b2 00 00 00 b7 00 00 00 03 00 00 00 d3 00 00 00 70 01 00 00 7a 01 00 00 03 00 00 00 70 00 00 00 c1 00 00 00 b8 00 00 00 04 00 00 00 d7 00 00 00 71 01 00 00 7a 01 00 00 7b 01 00 00 04 00 00 00 70 00 00 00 71 00 00 00 b8 00 00 00 b9 00 00 00 04 00 00 00 da 00 00 00 72 01 00 00 7b 01 00 00 7e 01 00 00 04 00 00 00 71 00 00 00 94 00 00 00 b9 00 00 00 bc 00 00 00 03 00 00 00 ec 00 00 00 73 01 00 00 7c 01 00 00 03 00 00 00 79 00 00 00 99 00 00 00 ba 00 00 00 04 00 00 00 ee 00 00 00 74 01 00 00 7c 01 00 00 7d 01 00 00 04 00 00 00 79 00 00 00 7a 00 00 00 ba 00 00 00 bb 00 00 00 04 00 00 00 f1 00 00 00 75 01 00 00 7d 01 00 00 81 01 00 00 04 00 00 00 7a 00 00 00 97 00 00 00 bb 00 00 00 bf 00 00 00 04 00 00 00 2b 01 00 00 76 01 00 00 7e 01 00 00 7f 01 00 00 04 00 00 00 94 00 00 00 95 00 00 00 bc 00 00 00 bd 00 00 00 04 00 00 00 2c 01 00 00 77 01 00 00 7f 01 00 00 80 01 00 00 04 00 00 00 95 00 00 00 96 00 00 00 bd 00 00 00 be 00 00 00 04 00 00 00 2d 01 00 00 78 01 00 00 80 01 00 00 81 01 00 00 04 00 00 00 96 00 00 00 97 00 00 00 be 00 00 00 bf 00 00 00 02 00 00 00 2e 01 00 00 79 01 00 00 02 00 00 00 98 00 00 00 c0 00 00 00 } + 12 0x0320: (StorageRaw) { + Size: 4 + String: .... + Hex: 0c 00 00 00 + Int: 12 + Float: 1.68156e-44 } } + Orphan[5] 0x0906: (StorageContainer) [16] { + 0 0x300d: (StorageRaw) { + Size: 4 + String: .... + Hex: 05 00 00 00 + Int: 5 + Float: 7.00649e-45 } + 1 0x300e: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 2 0x300f: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 3 0x3014: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 4 0x3015: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + 5 0x3010: (StorageRaw) { + Size: 4 + String: .. A + Hex: 00 00 20 41 + Int: 1092616192 + Float: 10 } + 6 0x3017: (StorageRaw) { + Size: 4 + String: ...A + Hex: 00 00 a0 41 + Int: 1101004800 + Float: 20 } + 7 0x3012: (StorageRaw) { + Size: 4 + String: ...A + Hex: 00 00 a0 41 + Int: 1101004800 + Float: 20 } + 8 0x3013: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 9 0x3016: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 10 0x301c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 11 0x3019: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 12 0x301a: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 13 0x301d: (StorageRaw) { + Size: 4 + String: N.. + Hex: 20 4e 00 00 + Int: 20000 + Float: 2.8026e-41 } + 14 0x301b: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 15 0x301e: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + Orphan[6] 0x0908: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + Orphan[7] 0x090a: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + Orphan[8] 0x090c: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } + 388 0x0019: (LayerSuperClassUnknown: Base Layer, (0x7e9858fe, 0x1dba1df0), 0x000010f0, Builtin) [9] { + Orphan[0] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[1] 0x1010: (StorageRaw) { + Size: 1 + String: 0 + Hex: 30 } + Orphan[2] 0x1030: (StorageRaw) { + Size: 4 + String: ..n. + Hex: 8a 08 6e 00 + Int: 7211146 + Float: 1.0105e-38 } + Orphan[3] 0x1020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[5] 0x1050: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 d6 00 0b + Int: 184604160 + Float: 2.48129e-32 } + Orphan[6] 0x1060: (StorageRaw) { + Size: 9 + String: ...?...?. + Hex: 00 00 80 3f 00 00 80 3f 01 } + Orphan[7] 0x1070: (StorageContainer) [1] { + 0 0x0006: (StorageRaw) { + Size: 21 + String: .........?..........? + Hex: 00 00 01 00 00 01 00 00 80 3f 00 01 01 01 01 00 00 00 00 80 3f } } + Orphan[8] 0x1080: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 389 0x001a: (NodeImpl: Node, (0x00000001, 0x00000000), 0x00000001, Builtin) [19] { + AppData: (AppData) [83] PARSED { + Entries[0]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1970 + Size: 1 } + Value: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } + Entries[1]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 41654685 + Size: 24 } + Value: (StorageRaw) { + Size: 24 + String: (Use NelLight Modifier). } } + Entries[2]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 41654686 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[3]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 41654687 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[4]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 84682540 + Size: 13 } + Value: (StorageRaw) { + Size: 13 + String: no occlusion. } } + Entries[5]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 84682541 + Size: 13 } + Value: (StorageRaw) { + Size: 13 + String: no occlusion. } } + Entries[6]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 84682542 + Size: 9 } + Value: (StorageRaw) { + Size: 9 + String: no sound. } } + Entries[7]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 84682543 + Size: 6 } + Value: (StorageRaw) { + Size: 6 + String: no fx. } } + Entries[8]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1266703978 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[9]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1266703979 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[10]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062537 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[11]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062548 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[12]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062549 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[13]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062550 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[14]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062551 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[15]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062552 + Size: 5 } + Value: (StorageRaw) { + Size: 5 + String: 1000. } } + Entries[16]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062553 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 5. + Hex: 35 00 } } + Entries[17]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062554 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[18]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062555 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 1. + Hex: 31 00 } } + Entries[19]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062556 + Size: 3 } + Value: (StorageRaw) { + Size: 3 + String: 11. + Hex: 31 31 00 } } + Entries[20]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062557 + Size: 3 } + Value: (StorageRaw) { + Size: 3 + String: 20. + Hex: 32 30 00 } } + Entries[21]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062558 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 5. + Hex: 35 00 } } + Entries[22]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062559 + Size: 3 } + Value: (StorageRaw) { + Size: 3 + String: 30. + Hex: 33 30 00 } } + Entries[23]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062560 + Size: 4 } + Value: (StorageRaw) { + Size: 4 + String: 200. + Hex: 32 30 30 00 + Int: 3158066 + Float: 4.42539e-39 } } + Entries[24]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062561 + Size: 3 } + Value: (StorageRaw) { + Size: 3 + String: 32. + Hex: 33 32 00 } } + Entries[25]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062562 + Size: 1 } + Value: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } + Entries[26]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062563 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[27]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062564 + Size: 1 } + Value: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } + Entries[28]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062565 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[29]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062566 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[30]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062567 + Size: 4 } + Value: (StorageRaw) { + Size: 4 + String: 1.0. + Hex: 31 2e 30 00 + Int: 3157553 + Float: 4.42467e-39 } } + Entries[31]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062568 + Size: 4 } + Value: (StorageRaw) { + Size: 4 + String: 1.4. + Hex: 31 2e 34 00 + Int: 3419697 + Float: 4.79202e-39 } } + Entries[32]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062569 + Size: 3 } + Value: (StorageRaw) { + Size: 3 + String: 15. + Hex: 31 35 00 } } + Entries[33]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062570 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[34]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062580 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[35]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062581 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[36]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062582 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[37]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062583 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[38]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062584 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[39]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062585 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[40]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062586 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 1. + Hex: 31 00 } } + Entries[41]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062587 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[42]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062588 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 1. + Hex: 31 00 } } + Entries[43]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062589 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[44]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062590 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 1. + Hex: 31 00 } } + Entries[45]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062591 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[46]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062592 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[47]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062611 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[48]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062612 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[49]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062613 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[50]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062614 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[51]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062615 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[52]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062616 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[53]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062617 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[54]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062618 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[55]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062619 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[56]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062620 + Size: 1 } + Value: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } + Entries[57]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062631 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[58]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062632 + Size: 3 } + Value: (StorageRaw) { + Size: 3 + String: 16. + Hex: 31 36 00 } } + Entries[59]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062633 + Size: 5 } + Value: (StorageRaw) { + Size: 5 + String: 0.02. } } + Entries[60]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062634 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 1. + Hex: 31 00 } } + Entries[61]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062635 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 1. + Hex: 31 00 } } + Entries[62]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062636 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[63]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062637 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[64]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062638 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[65]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062639 + Size: 10 } + Value: (StorageRaw) { + Size: 10 + String: 0 0 0 255. } } + Entries[66]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062640 + Size: 10 } + Value: (StorageRaw) { + Size: 10 + String: 0 0 0 255. } } + Entries[67]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062641 + Size: 10 } + Value: (StorageRaw) { + Size: 10 + String: 0 0 0 255. } } + Entries[68]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062655 + Size: 16 } + Value: (StorageRaw) { + Size: 16 + String: 255 255 255 255. } } + Entries[69]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062656 + Size: 16 } + Value: (StorageRaw) { + Size: 16 + String: 255 255 255 255. } } + Entries[70]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062657 + Size: 16 } + Value: (StorageRaw) { + Size: 16 + String: 255 255 255 255. } } + Entries[71]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062671 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[72]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062672 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[73]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062701 + Size: 4 } + Value: (StorageRaw) { + Size: 4 + String: 0.1. + Hex: 30 2e 31 00 + Int: 3223088 + Float: 4.51651e-39 } } + Entries[74]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062702 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[75]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062800 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[76]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062801 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[77]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 1423062802 + Size: 2 } + Value: (StorageRaw) { + Size: 2 + String: 0. + Hex: 30 00 } } + Entries[78]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 2089254647 + Size: 1 } + Value: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } + Entries[79]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 2089254648 + Size: 1 } + Value: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } + Entries[80]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 2089254649 + Size: 1 } + Value: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } + Entries[81]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x04d64858, 0x16d1751d) + SuperClassId: 4128 + SubId: 2089254650 + Size: 1 } + Value: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } + Entries[82]: (AppDataEntry) [2] PARSED { + Key: (AppDataEntryKey) { + ClassId: (0x7fd53834, 0x3b8525b5) + SuperClassId: 1 + SubId: 0 + Size: 16 } + Value: (StorageRaw) { + Size: 16 + String: ..|r...=...>..@? + Hex: 01 86 7c 72 cd cc cc 3d 9a 99 99 3e 00 00 40 3f } } } + References 0x2035: PARSED { + 0: (Position/Rotation/Scale, (0x00002005, 0x00000000)) + 1: (Editable Poly, (0x1bf8338d, 0x192f6098)) + 3: (NeL Material, (0x64c75fec, 0x222b9eb9)) + 6: (Base Layer, (0x7e9858fe, 0x1dba1df0)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Children: IMPLICIT { } + NodeVersion: 700 + Parent: (RootNode, (0x00000002, 0x00000000)) Root Node + ParentFlags: 2048 + UserName: GE_Acc_MikotoBaniere + Orphan[0] 0x09ba: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[1] 0x0963: (StorageRaw) { + Size: 8 + String: ........ + Hex: 10 00 00 00 10 00 00 00 } + Orphan[2] 0x096a: (StorageRaw) { + Size: 12 + String: .*@2.*... .. + Hex: b2 2a 40 32 b0 2a c0 be 05 20 d0 b3 } + Orphan[3] 0x096b: (StorageRaw) { + Size: 16 + String: ..5?..52..5...5? + Hex: f1 04 35 3f f1 04 35 32 f6 04 35 b2 f4 04 35 3f } + Orphan[4] 0x096c: (StorageRaw) { + Size: 28 + String: ...?...?...?...............? + Hex: 00 00 80 3f 00 00 80 3f 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3f } + Orphan[5] 0x0974: (StorageRaw) { + Size: 4 + String: .... + Hex: e4 d6 99 00 + Int: 10082020 + Float: 1.41279e-38 } + Orphan[6] 0x099c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 d6 00 0b + Int: 184604160 + Float: 2.48129e-32 } + Orphan[7] 0x0a28: (StorageRaw) { + Size: 8 + String: ........ } + Orphan[8] 0x0a32: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[9] 0x0abe: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[10] 0x0ac3: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[11] 0x0ad2: (StorageContainer) [1] { + 0 0x0006: (StorageRaw) { + Size: 21 + String: .........?..........? + Hex: 00 00 01 00 00 01 00 00 80 3f 00 01 01 01 01 00 00 00 00 80 3f } } + Orphan[12] 0x0b22: (StorageContainer) [10] { + 0 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0101: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + 2 0x0102: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + 3 0x0103: (StorageRaw) { + Size: 4 + String: ...@ + Hex: 00 00 00 40 + Int: 1073741824 + Float: 2 } + 4 0x0104: (StorageRaw) { + Size: 4 + String: ...A + Hex: 00 00 a0 41 + Int: 1101004800 + Float: 20 } + 5 0x0105: (StorageRaw) { + Size: 2 + String: .. + Hex: 06 00 } + 6 0x0106: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + 7 0x0107: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 8 0x0108: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + 9 0x0109: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } + Orphan[13] 0x0adc: (StorageContainer) [2] { + 0 0x0001: (StorageRaw) { + Size: 2 + String: .. + Hex: 00 00 } + 1 0x0002: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } } + Orphan[14] 0x0af0: (StorageContainer) [8] { + 0 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0002: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 2 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + 3 0x0004: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 4 0x0005: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 5 0x0006: (StorageRaw) { + Size: 16 + String: ..Iq..Iq..I...I. + Hex: ca f2 49 71 ca f2 49 71 ca f2 49 f1 ca f2 49 f1 } + 6 0x0007: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 7 0x0008: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[15] 0x0b0e: (StorageContainer) [1] { + 0 0x0001: (StorageContainer) [24] { + 0 0x0002: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0003: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0018: (StorageRaw) { + Size: 4 + String: .... + Hex: ff ff ff ff + Int: -1 + Float: -nan } + 3 0x0005: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 4 0x0006: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 5 0x0007: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + 6 0x0008: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 7 0x001f: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 8 0x0009: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 9 0x000a: (StorageRaw) { + Size: 4 + String: .. A + Hex: 00 00 20 41 + Int: 1092616192 + Float: 10 } + 10 0x000b: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 11 0x000c: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 12 0x000d: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 13 0x0012: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 14 0x0013: (StorageRaw) { + Size: 12 + String: ...?........ + Hex: 00 00 80 3f 00 00 00 00 00 00 00 00 } + 15 0x0014: (StorageRaw) { + Size: 4 + String: .. . + Hex: 00 00 20 c1 + Int: -1054867456 + Float: -10 } + 16 0x0015: (StorageRaw) { + Size: 4 + String: .. A + Hex: 00 00 20 41 + Int: 1092616192 + Float: 10 } + 17 0x0016: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 18 0x0017: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 19 0x001a: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 20 0x001b: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 + Int: 4 + Float: 5.60519e-45 } + 21 0x001c: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 22 0x001d: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 23 0x001e: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + Orphan[16] 0x0b4a: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + Orphan[17] 0x0b54: (StorageContainer) [1] { + 0 0x0001: (StorageContainer) [1] { + 0 0x0002: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + Orphan[18] 0x0b5e: (StorageContainer) [1] { + 0 0x0001: (StorageContainer) [1] { + 0 0x0005: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } } } } + 390 0x001b: (FilterKernelSuperClassUnknown: Area, (0x77912301, 0x00000000), 0x000010a0, Standard Pre-Filter Kernels (Autodesk)) [1] { + Orphan[0] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 0 + String: + Hex: } } } + 391 0x001c: (RendererSuperClassUnknown: Default Scanline Renderer, (0x00000001, 0x00000000), 0x00000f00, Default Scanline Renderer (Autodesk)) [18] { + References 0x2034: PARSED { + 0: (Area, (0x77912301, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0002: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[1] 0x0020: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[2] 0x0072: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[3] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[4] 0x0007: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } + Orphan[5] 0x0008: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } + Orphan[6] 0x0009: (StorageRaw) { + Size: 4 + String: .... + Hex: 0a 00 00 00 + Int: 10 + Float: 1.4013e-44 } + Orphan[7] 0x000a: (StorageRaw) { + Size: 4 + String: .... + Hex: 0a 00 00 00 + Int: 10 + Float: 1.4013e-44 } + Orphan[8] 0x000b: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } + Orphan[9] 0x0030: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } + Orphan[10] 0x000d: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[11] 0x0060: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } + Orphan[12] 0x0077: (StorageRaw) { + Size: 8 + String: .2w%.... + Hex: 11 32 77 25 00 00 00 00 } + Orphan[13] 0x0074: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[14] 0x0075: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[15] 0x0071: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } + Orphan[16] 0x0076: (StorageRaw) { + Size: 4 + String: ...= + Hex: cd cc cc 3d + Int: 1036831949 + Float: 0.1 } + Orphan[17] 0x0080: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 392 0x001b: (FilterKernelSuperClassUnknown: Area, (0x77912301, 0x00000000), 0x000010a0, Standard Pre-Filter Kernels (Autodesk)) [1] { + Orphan[0] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 0 + String: + Hex: } } } + 393 0x001c: (RendererSuperClassUnknown: Default Scanline Renderer, (0x00000001, 0x00000000), 0x00000f00, Default Scanline Renderer (Autodesk)) [18] { + References 0x2034: PARSED { + 0: (Area, (0x77912301, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0002: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[1] 0x0020: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[2] 0x0072: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[3] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[4] 0x0007: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } + Orphan[5] 0x0008: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } + Orphan[6] 0x0009: (StorageRaw) { + Size: 4 + String: .... + Hex: 0a 00 00 00 + Int: 10 + Float: 1.4013e-44 } + Orphan[7] 0x000a: (StorageRaw) { + Size: 4 + String: .... + Hex: 0a 00 00 00 + Int: 10 + Float: 1.4013e-44 } + Orphan[8] 0x000b: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } + Orphan[9] 0x0030: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } + Orphan[10] 0x000d: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[11] 0x0060: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 c0 3f + Int: 1069547520 + Float: 1.5 } + Orphan[12] 0x0077: (StorageRaw) { + Size: 8 + String: .2w%.... + Hex: 11 32 77 25 00 00 00 00 } + Orphan[13] 0x0074: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[14] 0x0075: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[15] 0x0071: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } + Orphan[16] 0x0076: (StorageRaw) { + Size: 4 + String: ...= + Hex: cd cc cc 3d + Int: 1036831949 + Float: 0.1 } + Orphan[17] 0x0080: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 394 0x001b: (FilterKernelSuperClassUnknown: Area, (0x77912301, 0x00000000), 0x000010a0, Standard Pre-Filter Kernels (Autodesk)) [1] { + Orphan[0] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 0 + String: + Hex: } } } + 395 0x001c: (RendererSuperClassUnknown: Default Scanline Renderer, (0x00000001, 0x00000000), 0x00000f00, Default Scanline Renderer (Autodesk)) [18] { + References 0x2034: PARSED { + 0: (Area, (0x77912301, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0002: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[1] 0x0020: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[2] 0x0072: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[3] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[4] 0x0007: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } + Orphan[5] 0x0008: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } + Orphan[6] 0x0009: (StorageRaw) { + Size: 4 + String: .... + Hex: 0a 00 00 00 + Int: 10 + Float: 1.4013e-44 } + Orphan[7] 0x000a: (StorageRaw) { + Size: 4 + String: .... + Hex: 0a 00 00 00 + Int: 10 + Float: 1.4013e-44 } + Orphan[8] 0x000b: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } + Orphan[9] 0x0030: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } + Orphan[10] 0x000d: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[11] 0x0060: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 c0 3f + Int: 1069547520 + Float: 1.5 } + Orphan[12] 0x0077: (StorageRaw) { + Size: 8 + String: .2w%.... + Hex: 11 32 77 25 00 00 00 00 } + Orphan[13] 0x0074: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[14] 0x0075: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[15] 0x0071: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } + Orphan[16] 0x0076: (StorageRaw) { + Size: 4 + String: ...= + Hex: cd cc cc 3d + Int: 1036831949 + Float: 0.1 } + Orphan[17] 0x0080: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 396 0x001d: (ReferenceTargetUnknown: RenderElementMgr, (0x46576167, 0x06546546), 0x00000200, Builtin) [8] { + Orphan[0] 0x1200: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + Orphan[1] 0x1210: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[2] 0x1240: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x1220: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x1230: (StorageRaw) { + Size: 20 + String: d...7...%...Z....... + Hex: 64 00 00 00 37 00 00 00 25 00 00 00 5a 00 00 00 f4 01 00 00 } + Orphan[5] 0x1240: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[6] 0x1250: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + Orphan[7] 0x1260: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } + 397 0x001d: (ReferenceTargetUnknown: RenderElementMgr, (0x46576167, 0x06546546), 0x00000200, Builtin) [8] { + Orphan[0] 0x1200: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + Orphan[1] 0x1210: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[2] 0x1240: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[3] 0x1220: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x1230: (StorageRaw) { + Size: 20 + String: d...7...%...Z....... + Hex: 64 00 00 00 37 00 00 00 25 00 00 00 5a 00 00 00 f4 01 00 00 } + Orphan[5] 0x1240: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[6] 0x1250: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + Orphan[7] 0x1260: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } + 398 0x001e: (ControlPoint3SuperClassUnknown: Bezier Color, (0x00002011, 0x00000000), 0x00009005, Builtin) [9] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x2501: (StorageRaw) { + Size: 12 + String: ............ } + Orphan[1] 0x2500: (StorageRaw) { + Size: 8 + String: ........ } + Orphan[2] 0x3002: (StorageRaw) { + Size: 4 + String: ... + Hex: 20 00 00 00 + Int: 32 + Float: 4.48416e-44 } + Orphan[3] 0x3003: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 80 00 00 00 80 } + Orphan[4] 0x2532: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[5] 0x2533: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[6] 0x2534: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[7] 0x3005: (StorageRaw) { + Size: 4 + String: .... + Hex: 86 01 00 00 + Int: 390 + Float: 5.46506e-43 } + Orphan[8] 0x2535: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 399 0x001e: (ControlPoint3SuperClassUnknown: Bezier Color, (0x00002011, 0x00000000), 0x00009005, Builtin) [9] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x2501: (StorageRaw) { + Size: 12 + String: ............ } + Orphan[1] 0x2500: (StorageRaw) { + Size: 8 + String: ........ } + Orphan[2] 0x3002: (StorageRaw) { + Size: 4 + String: ... + Hex: 20 00 00 00 + Int: 32 + Float: 4.48416e-44 } + Orphan[3] 0x3003: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 80 00 00 00 80 } + Orphan[4] 0x2532: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[5] 0x2533: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[6] 0x2534: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[7] 0x3005: (StorageRaw) { + Size: 4 + String: .... + Hex: 86 01 00 00 + Int: 390 + Float: 5.46506e-43 } + Orphan[8] 0x2535: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 400 0x001e: (ControlPoint3SuperClassUnknown: Bezier Color, (0x00002011, 0x00000000), 0x00009005, Builtin) [9] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x2501: (StorageRaw) { + Size: 12 + String: ...?...?...? + Hex: 00 00 80 3f 00 00 80 3f 00 00 80 3f } + Orphan[1] 0x2500: (StorageRaw) { + Size: 8 + String: ........ } + Orphan[2] 0x3002: (StorageRaw) { + Size: 4 + String: ... + Hex: 20 00 00 00 + Int: 32 + Float: 4.48416e-44 } + Orphan[3] 0x3003: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 80 00 00 00 80 } + Orphan[4] 0x2532: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[5] 0x2533: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[6] 0x2534: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[7] 0x3005: (StorageRaw) { + Size: 4 + String: .... + Hex: 86 01 00 00 + Int: 390 + Float: 5.46506e-43 } + Orphan[8] 0x2535: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 401 0x0009: (ControlFloatSuperClassUnknown: Bezier Float, (0x00002007, 0x00000000), 0x00009003, Builtin) [9] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x2501: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } + Orphan[1] 0x2500: (StorageRaw) { + Size: 8 + String: ........ } + Orphan[2] 0x3002: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x3003: (StorageRaw) { + Size: 8 + String: ........ + Hex: 00 00 00 80 00 00 00 80 } + Orphan[4] 0x2532: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[5] 0x2533: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[6] 0x2534: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[7] 0x3005: (StorageRaw) { + Size: 4 + String: .... + Hex: 86 01 00 00 + Int: 390 + Float: 5.46506e-43 } + Orphan[8] 0x2535: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 402 0x001b: (FilterKernelSuperClassUnknown: Area, (0x77912301, 0x00000000), 0x000010a0, Standard Pre-Filter Kernels (Autodesk)) [1] { + Orphan[0] 0x39bf: (StorageContainer) [1] { + 0 0x0100: (StorageRaw) { + Size: 0 + String: + Hex: } } } + 403 0x001c: (RendererSuperClassUnknown: Default Scanline Renderer, (0x00000001, 0x00000000), 0x00000f00, Default Scanline Renderer (Autodesk)) [18] { + References 0x2034: PARSED { + 0: (Area, (0x77912301, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0002: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[1] 0x0020: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[2] 0x0072: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[3] 0x1000: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[4] 0x0007: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } + Orphan[5] 0x0008: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } + Orphan[6] 0x0009: (StorageRaw) { + Size: 4 + String: .... + Hex: 0a 00 00 00 + Int: 10 + Float: 1.4013e-44 } + Orphan[7] 0x000a: (StorageRaw) { + Size: 4 + String: .... + Hex: 0a 00 00 00 + Int: 10 + Float: 1.4013e-44 } + Orphan[8] 0x000b: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } + Orphan[9] 0x0030: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } + Orphan[10] 0x000d: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[11] 0x0060: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 c0 3f + Int: 1069547520 + Float: 1.5 } + Orphan[12] 0x0077: (StorageRaw) { + Size: 8 + String: .2w%.... + Hex: 11 32 77 25 00 00 00 00 } + Orphan[13] 0x0074: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[14] 0x0075: (StorageRaw) { + Size: 0 + String: + Hex: } + Orphan[15] 0x0071: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 00 3f + Int: 1056964608 + Float: 0.5 } + Orphan[16] 0x0076: (StorageRaw) { + Size: 4 + String: ...= + Hex: cd cc cc 3d + Int: 1036831949 + Float: 0.1 } + Orphan[17] 0x0080: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 404 0x001f: (AtmosphericSuperClassUnknown: RenderEnvironment, (0xee448b23, 0x00000000), 0x00001010, Builtin) [5] { + References 0x2034: PARSED { + 0: (Default Scanline Renderer, (0x00000001, 0x00000000)) + 1: (Default Scanline Renderer, (0x00000001, 0x00000000)) + 2: (Default Scanline Renderer, (0x00000001, 0x00000000)) + 3: (RenderElementMgr, (0x46576167, 0x06546546)) + 4: (RenderElementMgr, (0x46576167, 0x06546546)) + 6: (Bezier Color, (0x00002011, 0x00000000)) + 7: (Bezier Color, (0x00002011, 0x00000000)) + 8: (Bezier Color, (0x00002011, 0x00000000)) + 9: (Bezier Float, (0x00002007, 0x00000000)) + 12: (Default Scanline Renderer, (0x00000001, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x2000: (StorageRaw) { + Size: 4 + String: .... + Hex: 0c 00 00 00 + Int: 12 + Float: 1.68156e-44 } + Orphan[2] 0x0120: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[3] 0x0110: (StorageContainer) [5] { + 0 0x2000: (StorageContainer) [41] { + 0 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 05 00 00 + Int: 1281 + Float: 1.79506e-42 } + 1 0x0110: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 2 0x0120: (StorageRaw) { + Size: 4 + String: .>.. + Hex: 80 3e 00 00 + Int: 16000 + Float: 2.24208e-41 } + 3 0x0130: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 4 0x0135: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 5 0x0140: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 6 0x0150: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 7 0x0160: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 8 0x0170: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 9 0x0180: (StorageRaw) { + Size: 4 + String: .... + Hex: 10 05 00 00 + Int: 1296 + Float: 1.81608e-42 } + 10 0x0610: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 11 0x0620: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 12 0x0680: (StorageRaw) { + Size: 0 + String: + Hex: } + 13 0x0640: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 14 0x0650: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 15 0x0690: (StorageRaw) { + Size: 0 + String: + Hex: } + 16 0x0670: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 17 0x0199: (StorageRaw) { + Size: 4 + String: .(.. + Hex: 03 28 00 00 + Int: 10243 + Float: 1.43535e-41 } + 18 0x0190: (StorageRaw) { + Size: 4 + String: ... + Hex: 20 03 00 00 + Int: 800 + Float: 1.12104e-42 } + 19 0x0200: (StorageRaw) { + Size: 4 + String: X... + Hex: 58 02 00 00 + Int: 600 + Float: 8.40779e-43 } + 20 0x0210: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } + 21 0x0440: (StorageRaw) { + Size: 4 + String: ...B + Hex: 00 00 10 42 + Int: 1108344832 + Float: 36 } + 22 0x0500: (StorageRaw) { + Size: 4 + String: ... + Hex: 20 03 00 00 + Int: 800 + Float: 1.12104e-42 } + 23 0x0510: (StorageRaw) { + Size: 4 + String: X... + Hex: 58 02 00 00 + Int: 600 + Float: 8.40779e-43 } + 24 0x0520: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } + 25 0x0530: (StorageRaw) { + Size: 4 + String: ...B + Hex: 00 00 10 42 + Int: 1108344832 + Float: 36 } + 26 0x0220: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 27 0x0240: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 28 0x0290: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 29 0x0310: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 30 0x0320: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 31 0x0330: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 32 0x0338: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 33 0x05b0: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 34 0x05d0: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + 35 0x05e0: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + 36 0x0340: (StorageRaw) { + Size: 16 + String: 1.,.3.,.5.-.1.2. } + 37 0x0400: (StorageContainer) [2] { + 0 0x1201: (StorageRaw) { + Size: 70 + String: .X....?...?................@..............................?.......... + Hex: 20 03 58 02 00 00 80 3f 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 01 c8 00 00 00 00 00 00 00 00 00 00 00 ff 7f 00 00 ff 7f 01 00 00 00 00 00 00 00 00 00 80 3f 14 00 00 00 00 00 00 00 00 00 } + 1 0x1260: (StorageRaw) { + Size: 0 + String: + Hex: } } + 38 0x0410: (StorageContainer) [2] { + 0 0x1201: (StorageRaw) { + Size: 70 + String: .X....?...?................@..............................?.......... + Hex: 20 03 58 02 00 00 80 3f 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 01 c8 00 00 00 00 00 00 00 00 00 00 00 ff 7f 00 00 ff 7f 01 00 00 00 00 00 00 00 00 00 80 3f 14 00 00 00 00 00 00 00 00 00 } + 1 0x1260: (StorageRaw) { + Size: 0 + String: + Hex: } } + 39 0x05c0: (StorageContainer) [8] { + 0 0x1200: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + 1 0x1210: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 2 0x1240: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 3 0x1220: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 4 0x1230: (StorageRaw) { + Size: 20 + String: d...7...%...Z....... + Hex: 64 00 00 00 37 00 00 00 25 00 00 00 5a 00 00 00 f4 01 00 00 } + 5 0x1240: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 6 0x1250: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + 7 0x1260: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } + 40 0x0600: (StorageRaw) { + Size: 800 + String: ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ + Hex: 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 00 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 00 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a } } + 1 0x2100: (StorageContainer) [41] { + 0 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 05 00 00 + Int: 1281 + Float: 1.79506e-42 } + 1 0x0110: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 2 0x0120: (StorageRaw) { + Size: 4 + String: .>.. + Hex: 80 3e 00 00 + Int: 16000 + Float: 2.24208e-41 } + 3 0x0130: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 4 0x0135: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 5 0x0140: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 6 0x0150: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 7 0x0160: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 8 0x0170: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 9 0x0180: (StorageRaw) { + Size: 4 + String: .... + Hex: 0f 05 00 00 + Int: 1295 + Float: 1.81468e-42 } + 10 0x0610: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 11 0x0620: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 12 0x0680: (StorageRaw) { + Size: 0 + String: + Hex: } + 13 0x0640: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 14 0x0650: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 15 0x0690: (StorageRaw) { + Size: 0 + String: + Hex: } + 16 0x0670: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 17 0x0199: (StorageRaw) { + Size: 4 + String: .(.. + Hex: 03 28 00 00 + Int: 10243 + Float: 1.43535e-41 } + 18 0x0190: (StorageRaw) { + Size: 4 + String: .... + Hex: 80 02 00 00 + Int: 640 + Float: 8.96831e-43 } + 19 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: e0 01 00 00 + Int: 480 + Float: 6.72623e-43 } + 20 0x0210: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } + 21 0x0440: (StorageRaw) { + Size: 4 + String: ...B + Hex: 00 00 10 42 + Int: 1108344832 + Float: 36 } + 22 0x0500: (StorageRaw) { + Size: 4 + String: .... + Hex: 80 02 00 00 + Int: 640 + Float: 8.96831e-43 } + 23 0x0510: (StorageRaw) { + Size: 4 + String: .... + Hex: e0 01 00 00 + Int: 480 + Float: 6.72623e-43 } + 24 0x0520: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } + 25 0x0530: (StorageRaw) { + Size: 4 + String: ...B + Hex: 00 00 10 42 + Int: 1108344832 + Float: 36 } + 26 0x0220: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 27 0x0240: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 28 0x0290: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 29 0x0310: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 30 0x0320: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 31 0x0330: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 32 0x0338: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 33 0x05b0: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 34 0x05d0: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + 35 0x05e0: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + 36 0x0340: (StorageRaw) { + Size: 16 + String: 1.,.3.,.5.-.1.2. } + 37 0x0400: (StorageContainer) [2] { + 0 0x1201: (StorageRaw) { + Size: 70 + String: .......?...?................@..............................?.......... + Hex: 80 02 e0 01 00 00 80 3f 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 01 c8 00 00 00 00 00 00 00 00 00 00 00 ff 7f 00 00 ff 7f 01 00 00 00 00 00 00 00 00 00 80 3f 14 00 00 00 00 00 00 00 00 00 } + 1 0x1260: (StorageRaw) { + Size: 0 + String: + Hex: } } + 38 0x0410: (StorageContainer) [2] { + 0 0x1201: (StorageRaw) { + Size: 70 + String: .......?...?................@..............................?.......... + Hex: 80 02 e0 01 00 00 80 3f 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 01 c8 00 00 00 00 00 00 00 00 00 00 00 ff 7f 00 00 ff 7f 01 00 00 00 00 00 00 00 00 00 80 3f 14 00 00 00 00 00 00 00 00 00 } + 1 0x1260: (StorageRaw) { + Size: 0 + String: + Hex: } } + 39 0x05c0: (StorageContainer) [8] { + 0 0x1200: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + 1 0x1210: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 2 0x1240: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 3 0x1220: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 4 0x1230: (StorageRaw) { + Size: 20 + String: d...7...%...Z....... + Hex: 64 00 00 00 37 00 00 00 25 00 00 00 5a 00 00 00 f4 01 00 00 } + 5 0x1240: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 6 0x1250: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + 7 0x1260: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } } + 40 0x0600: (StorageRaw) { + Size: 800 + String: ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ + Hex: 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 00 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 00 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a } } + 2 0x2300: (StorageContainer) [40] { + 0 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 05 00 00 + Int: 1281 + Float: 1.79506e-42 } + 1 0x0110: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 2 0x0120: (StorageRaw) { + Size: 4 + String: .>.. + Hex: 80 3e 00 00 + Int: 16000 + Float: 2.24208e-41 } + 3 0x0130: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 4 0x0135: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 5 0x0140: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 6 0x0150: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 7 0x0160: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 8 0x0170: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 9 0x0180: (StorageRaw) { + Size: 4 + String: .... + Hex: 0f 05 00 00 + Int: 1295 + Float: 1.81468e-42 } + 10 0x0610: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 11 0x0620: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 12 0x0680: (StorageRaw) { + Size: 0 + String: + Hex: } + 13 0x0640: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 14 0x0650: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 15 0x0690: (StorageRaw) { + Size: 0 + String: + Hex: } + 16 0x0670: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 17 0x0199: (StorageRaw) { + Size: 4 + String: .(.. + Hex: 03 28 00 00 + Int: 10243 + Float: 1.43535e-41 } + 18 0x0190: (StorageRaw) { + Size: 4 + String: .... + Hex: 80 02 00 00 + Int: 640 + Float: 8.96831e-43 } + 19 0x0200: (StorageRaw) { + Size: 4 + String: .... + Hex: e0 01 00 00 + Int: 480 + Float: 6.72623e-43 } + 20 0x0210: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } + 21 0x0440: (StorageRaw) { + Size: 4 + String: ...B + Hex: 00 00 10 42 + Int: 1108344832 + Float: 36 } + 22 0x0500: (StorageRaw) { + Size: 4 + String: .... + Hex: 80 02 00 00 + Int: 640 + Float: 8.96831e-43 } + 23 0x0510: (StorageRaw) { + Size: 4 + String: .... + Hex: e0 01 00 00 + Int: 480 + Float: 6.72623e-43 } + 24 0x0520: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } + 25 0x0530: (StorageRaw) { + Size: 4 + String: ...B + Hex: 00 00 10 42 + Int: 1108344832 + Float: 36 } + 26 0x0220: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 27 0x0240: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 28 0x0290: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 29 0x0310: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 30 0x0320: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 31 0x0330: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 32 0x0338: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 33 0x05b0: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 34 0x05d0: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } + 35 0x05e0: (StorageRaw) { + Size: 1 + String: . + Hex: 00 } + 36 0x0340: (StorageRaw) { + Size: 16 + String: 1.,.3.,.5.-.1.2. } + 37 0x0400: (StorageContainer) [2] { + 0 0x1201: (StorageRaw) { + Size: 70 + String: .......?...?................@..............................?.......... + Hex: 80 02 e0 01 00 00 80 3f 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 01 c8 00 00 00 00 00 00 00 00 00 00 00 ff 7f 00 00 ff 7f 01 00 00 00 00 00 00 00 00 00 80 3f 14 00 00 00 00 00 00 00 00 00 } + 1 0x1260: (StorageRaw) { + Size: 0 + String: + Hex: } } + 38 0x0410: (StorageContainer) [2] { + 0 0x1201: (StorageRaw) { + Size: 70 + String: .......?...?................@..............................?.......... + Hex: 80 02 e0 01 00 00 80 3f 00 00 80 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 01 c8 00 00 00 00 00 00 00 00 00 00 00 ff 7f 00 00 ff 7f 01 00 00 00 00 00 00 00 00 00 80 3f 14 00 00 00 00 00 00 00 00 00 } + 1 0x1260: (StorageRaw) { + Size: 0 + String: + Hex: } } + 39 0x0600: (StorageRaw) { + Size: 800 + String: ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ + Hex: 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 00 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 00 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a } } + 3 0x2400: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 4 0x2500: (StorageRaw) { + Size: 1 + String: . + Hex: 01 } } + Orphan[4] 0x6010: (StorageRaw) { + Size: 12 + String: .......@...@ + Hex: 00 00 00 00 cd cc 0c 40 cd cc 0c 40 } } + 405 0x0020: (ReferenceMakerUnknown: NamedSelSetList, (0x00008d52, 0x00000000), 0x00000100, Builtin) [1] { + Orphan[0] 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 406 0x0021: (TrackViewNode: TVNode, (0x8d73b8aa, 0x90f2ee71), 0x00000200, Builtin) [0] { } + 407 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [4] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: "......!........ + Hex: 22 00 00 00 00 00 00 21 e0 2e 02 00 98 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 00 00 00 08 00 00 89 10 92 00 00 00 00 00 80 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 408 0x0022: (ControlFloatSuperClassUnknown: Float List, (0x4b4b1000, 0x00000000), 0x00009003, Standard Controllers (Autodesk)) [3] { + References 0x2034: PARSED { + 2: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1010: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x1020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[2] 0x2535: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 409 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [4] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: #......!........ + Hex: 23 00 00 00 00 00 00 21 e0 2e 02 00 9a 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 00 00 00 08 00 00 89 10 92 00 00 00 00 00 80 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 410 0x0023: (ControlPoint3SuperClassUnknown: Point3 List, (0x4b4b1001, 0x00000000), 0x00009005, Standard Controllers (Autodesk)) [3] { + References 0x2034: PARSED { + 2: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1010: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x1020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[2] 0x2535: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 411 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [4] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: $......!........ + Hex: 24 00 00 00 00 00 00 21 e0 2e 02 00 9c 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 00 00 00 08 00 00 89 10 92 00 00 00 00 00 80 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 412 0x0024: (ControlPoint4SuperClassUnknown: Point4 List, (0x4b4b1005, 0x00000000), 0x00009012, Standard Controllers (Autodesk)) [3] { + References 0x2034: PARSED { + 2: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1010: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x1020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[2] 0x2535: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 413 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [4] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: %......!........ + Hex: 25 00 00 00 00 00 00 21 e0 2e 02 00 9e 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 00 00 00 08 00 00 89 10 92 00 00 00 00 00 80 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 414 0x0025: (ControlPositionSuperClassUnknown: Position List, (0x4b4b1002, 0x00000000), 0x0000900b, Standard Controllers (Autodesk)) [3] { + References 0x2034: PARSED { + 2: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1010: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x1020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[2] 0x2535: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 415 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [4] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: &......!........ + Hex: 26 00 00 00 00 00 00 21 e0 2e 02 00 a0 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 00 00 00 08 00 00 89 10 92 00 00 00 00 00 80 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 416 0x0026: (ControlRotationSuperClassUnknown: Rotation List, (0x4b4b1003, 0x00000000), 0x0000900c, Standard Controllers (Autodesk)) [3] { + References 0x2034: PARSED { + 2: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1010: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x1020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[2] 0x2535: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 417 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [4] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: '......!........ + Hex: 27 00 00 00 00 00 00 21 e0 2e 02 00 a2 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 00 00 00 08 00 00 89 10 92 00 00 00 00 00 80 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 418 0x0027: (ControlScaleSuperClassUnknown: Scale List, (0x4b4b1004, 0x00000000), 0x0000900d, Standard Controllers (Autodesk)) [3] { + References 0x2034: PARSED { + 2: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1010: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x1020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[2] 0x2535: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 419 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [4] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: (......!........ + Hex: 28 00 00 00 00 00 00 21 e0 2e 02 00 a4 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 00 00 00 08 00 00 89 10 92 00 00 00 00 00 80 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 01 00 04 00 00 00 00 00 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[3] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 420 0x0028: (ControlMasterBlockSuperClassUnknown: Block Control, (0x4b4b1015, 0x00000000), 0x00009011, Standard Controllers (Autodesk)) [3] { + References 0x2034: PARSED { + 2: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1010: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x1020: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[2] 0x2535: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 421 0x0021: (TrackViewNode: TVNode, (0x8d73b8aa, 0x90f2ee71), 0x00000200, Builtin) [0] { + References 0x2034: PARSED VIRTUAL { + 0: (Float List, (0x4b4b1000, 0x00000000)) + 1: (Point3 List, (0x4b4b1001, 0x00000000)) + 2: (Point4 List, (0x4b4b1005, 0x00000000)) + 3: (Position List, (0x4b4b1002, 0x00000000)) + 4: (Rotation List, (0x4b4b1003, 0x00000000)) + 5: (Scale List, (0x4b4b1004, 0x00000000)) + 6: (Block Control, (0x4b4b1015, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + 0: (Float List, (0x4b4b1000, 0x00000000)) (Float, (0x4b4b1000, 0x00000000), 1) + 1: (Point3 List, (0x4b4b1001, 0x00000000)) (Point3, (0x4b4b1001, 0x00000000), 1) + 2: (Point4 List, (0x4b4b1005, 0x00000000)) (Point4, (0x4b4b1005, 0x00000000), 1) + 3: (Position List, (0x4b4b1002, 0x00000000)) (Position, (0x4b4b1002, 0x00000000), 1) + 4: (Rotation List, (0x4b4b1003, 0x00000000)) (Rotation, (0x4b4b1003, 0x00000000), 1) + 5: (Scale List, (0x4b4b1004, 0x00000000)) (Scale, (0x4b4b1004, 0x00000000), 1) + 6: (Block Control, (0x4b4b1015, 0x00000000)) (Block Control, (0x4b4b1015, 0x00000000), 1) } + 422 0x0029: (ControlFloatSuperClassUnknown: Block Manager Wrapper, (0x1f8c3646, 0x11793bed), 0x00009003, Block Manager Utility (Autodesk)) [1] { + Orphan[0] 0x0001: (StorageContainer) [1] { + 0 0x0010: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 423 0x0021: (TrackViewNode: TVNode, (0x8d73b8aa, 0x90f2ee71), 0x00000200, Builtin) [0] { + References 0x2034: PARSED VIRTUAL { + 0: (Block Manager Wrapper, (0x1f8c3646, 0x11793bed)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Empty 0x0140 + 0: (Block Manager Wrapper, (0x1f8c3646, 0x11793bed)) (Block Manager Wrapper, (0x1f8c3646, 0x11793bed), 1) } + 424 0x002a: (ControlFloatSuperClassUnknown: Propagation Manager Wrapper, (0x5a1b661e, 0x7620792b), 0x00009003, Propagation Manager Utility (Autodesk)) [1] { + Orphan[0] 0x0001: (StorageContainer) [1] { + 0 0x0010: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } } + 425 0x0021: (TrackViewNode: TVNode, (0x8d73b8aa, 0x90f2ee71), 0x00000200, Builtin) [0] { + References 0x2034: PARSED VIRTUAL { + 0: (Propagation Manager Wrapper, (0x5a1b661e, 0x7620792b)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Empty 0x0140 + 0: (Propagation Manager Wrapper, (0x5a1b661e, 0x7620792b)) (Propagation Manager Wrapper, (0x5a1b661e, 0x7620792b), 1) } + 426 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [5] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: +......!........ + Hex: 2b 00 00 00 00 00 00 21 e0 2e 03 00 ab 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 00 00 0e 08 00 00 00 10 81 00 00 00 00 00 00 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 01 00 0e 08 00 00 00 10 81 00 00 00 00 00 00 00 00 00 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 0e 08 00 00 00 10 81 00 00 00 00 00 00 00 00 00 00 } + Orphan[4] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 427 0x002b: (ControlFloatSuperClassUnknown: Scene Effect Loader, (0x368d1139, 0xf4044794), 0x00009003, Scene Effect Manager (Autodesk)) [3] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0400: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x0410: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[2] 0x0420: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 428 0x0021: (TrackViewNode: TVNode, (0x8d73b8aa, 0x90f2ee71), 0x00000200, Builtin) [0] { + References 0x2034: PARSED VIRTUAL { + 0: (Scene Effect Loader, (0x368d1139, 0xf4044794)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Empty 0x0140 + Empty 0x0150 + 0: (Scene Effect Loader, (0x368d1139, 0xf4044794)) (Scene Effect Loader, (0x368d1139, 0xf4044794), 1) } + 429 0x002c: (ReferenceMakerUnknown: Reaction Manager, (0x294a389c, 0x087906d7), 0x00000100, Change Reaction Controller (Autodesk)) [0] { } + 430 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [18] { + Orphan[0] 0x000b: (StorageRaw) { + Size: 24 + String: 0.%(&#Z&`......!........ + Hex: 30 0b 25 28 26 23 5a 26 60 11 00 00 00 00 00 21 e0 2e 10 00 af 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ..............@.... + Hex: 00 00 01 00 00 00 00 80 82 00 00 00 00 00 40 00 00 00 00 } + Orphan[2] 0x000e: (StorageRaw) { + Size: 38 + String: ...................@....XX UNNAMED XX. + Hex: 01 00 08 08 00 00 00 90 80 00 00 00 00 00 00 01 00 00 00 40 0e 00 00 00 58 58 20 55 4e 4e 41 4d 45 44 20 58 58 00 } + Orphan[3] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 02 00 08 08 00 00 00 90 80 00 00 00 00 00 00 00 00 00 00 } + Orphan[4] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 04 00 01 08 00 00 00 90 80 00 00 00 00 00 00 00 00 00 00 } + Orphan[5] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 03 00 01 08 00 00 00 90 80 00 00 00 00 00 00 00 00 00 00 } + Orphan[6] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0e 00 04 08 00 00 00 90 80 00 00 00 00 00 00 00 00 00 00 } + Orphan[7] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 07 00 12 08 00 00 00 93 81 08 00 00 00 00 00 00 00 00 00 } + Orphan[8] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 08 00 01 08 00 00 00 90 80 00 00 00 00 00 00 00 00 00 00 } + Orphan[9] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0a 00 01 08 00 00 00 90 80 00 00 00 00 00 00 00 00 00 00 } + Orphan[10] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 06 00 01 08 00 00 00 90 80 00 00 00 00 00 00 00 00 00 00 } + Orphan[11] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 05 00 01 08 00 00 00 90 80 00 00 00 00 00 00 00 00 00 00 } + Orphan[12] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 09 00 04 08 00 00 00 90 80 00 00 00 00 00 00 00 00 00 00 } + Orphan[13] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0b 00 08 08 00 00 00 90 80 00 00 00 00 00 00 00 00 00 00 } + Orphan[14] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0c 00 08 08 00 00 00 90 80 00 00 00 00 00 00 00 00 00 00 } + Orphan[15] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0d 00 08 08 00 00 00 90 80 00 00 00 00 00 00 00 00 00 00 } + Orphan[16] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 0f 00 04 08 00 00 00 90 82 00 00 00 00 00 00 00 00 00 00 } + Orphan[17] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 431 0x002d: (CustAttribSuperClassUnknown: ParameterCollectorCA, (0x28250b30, 0x265a2326), 0x00001160, ParameterEditor (Autodesk)) [1] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0100: (StorageContainer) [2] { + 0 0x0110: (StorageRaw) { + Size: 4 + String: e... + Hex: 65 00 00 00 + Int: 101 + Float: 1.41531e-43 } + 1 0x0120: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 432 0x0003: (ReferenceMakerUnknown: CustAttribContainer, (0x5ddb3626, 0x23b708db), 0x00000100, Custom Attribute Container (Autodesk)) [2] { + References 0x2034: PARSED { + 0: (ParameterCollectorCA, (0x28250b30, 0x265a2326)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1030: (StorageRaw) { + Size: 4 + String: .... + Hex: b1 01 00 00 + Int: 433 + Float: 6.06762e-43 } + Orphan[1] 0x1040: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 433 0x0021: (TrackViewNode: TVNode, (0x8d73b8aa, 0x90f2ee71), 0x00000200, Builtin) [0] { + Unknown 0x21B0: (StorageRaw) { + Size: 10 + String: ......... + Hex: 20 10 0a 00 00 00 b0 01 00 00 } + Empty 0x0140 + Empty 0x0150 } + 434 0x002e: (UserDataTypeSuperClassUnknown: , (0x4a0c66e1, 0x01513165), 0x00000b60, Bitmap Proxies (Autodesk)) [5] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0110: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x0120: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[2] 0x0130: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } + Orphan[3] 0x0140: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[4] 0x0200: (StorageRaw) { + Size: 0 + String: + Hex: } } + 435 0x002f: (UserTypeSuperClassUnknown: SceneAppData Latch, (0x0c6f6387, 0x2c1a0a7b), 0x0000900f, Builtin) [0] { + References 0x2034: PARSED { + 0: (, (0x4a0c66e1, 0x01513165)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } } + 436 0x0021: (TrackViewNode: TVNode, (0x8d73b8aa, 0x90f2ee71), 0x00000200, Builtin) [0] { + References 0x2034: PARSED VIRTUAL { + 0: (SceneAppData Latch, (0x0c6f6387, 0x2c1a0a7b)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Empty 0x0140 + Empty 0x0150 + 0: (SceneAppData Latch, (0x0c6f6387, 0x2c1a0a7b)) (, (0x4a0c66e1, 0x01513165), 1) } + 437 0x0030: (UserDataTypeSuperClassUnknown: BitmapPagerData, (0x5bf94f11, 0x68c22d6f), 0x00000b60, Standard Bitmap Storages and Filters (Autodesk)) [4] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x0110: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[1] 0x0120: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[2] 0x0130: (StorageRaw) { + Size: 4 + String: ...> + Hex: 00 00 80 3e + Int: 1048576000 + Float: 0.25 } + Orphan[3] 0x0140: (StorageRaw) { + Size: 4 + String: ...= + Hex: cd cc cc 3d + Int: 1036831949 + Float: 0.1 } } + 438 0x002f: (UserTypeSuperClassUnknown: SceneAppData Latch, (0x0c6f6387, 0x2c1a0a7b), 0x0000900f, Builtin) [0] { + References 0x2034: PARSED { + 0: (BitmapPagerData, (0x5bf94f11, 0x68c22d6f)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } } + 439 0x0021: (TrackViewNode: TVNode, (0x8d73b8aa, 0x90f2ee71), 0x00000200, Builtin) [0] { + References 0x2034: PARSED VIRTUAL { + 0: (SceneAppData Latch, (0x0c6f6387, 0x2c1a0a7b)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Empty 0x0140 + Empty 0x0150 + 0: (SceneAppData Latch, (0x0c6f6387, 0x2c1a0a7b)) (BitmapPagerData, (0x5bf94f11, 0x68c22d6f), 1) } + 440 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [3] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: 1......!........ + Hex: 31 00 00 00 00 00 00 21 e0 2e 01 00 b9 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ......H............ + Hex: 00 00 12 08 00 00 48 10 81 00 00 00 00 00 00 00 00 00 00 } + Orphan[2] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 441 0x0031: (UserTypeSuperClassUnknown: MasterLayerControlManager, (0x0f4871a5, 0x781f1430), 0x0000900f, Standard Controllers (Autodesk)) [7] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1001: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x1002: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[2] 0x1003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[3] 0x1004: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[4] 0x1005: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[5] 0x1006: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[6] 0x1007: (StorageRaw) { + Size: 4 + String: d... + Hex: 64 00 00 00 + Int: 100 + Float: 1.4013e-43 } } + 442 0x0000: (ParamBlock2SuperClassUnknown: ParamBlock2, (0x00000082, 0x00000000), 0x00000082, Builtin) [3] { + Orphan[0] 0x0009: (StorageRaw) { + Size: 16 + String: 2......!........ + Hex: 32 00 00 00 00 00 00 21 e0 2e 01 00 bb 01 00 00 } + Orphan[1] 0x000e: (StorageRaw) { + Size: 19 + String: ................... + Hex: 00 00 12 08 00 00 00 10 81 00 00 00 00 00 00 00 00 00 00 } + Orphan[2] 0x000c: (StorageRaw) { + Size: 10 + String: .......... + Hex: 01 00 00 00 01 00 00 00 00 00 } } + 443 0x0032: (UserTypeSuperClassUnknown: Max Mixer Clip, (0x57a52b8c, 0x30935afc), 0x0000900f, Biped Controller (Autodesk)) [0] { + References 0x2034: PARSED { + 0: (ParamBlock2, (0x00000082, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } } + 444 0x0021: (TrackViewNode: TVNode, (0x8d73b8aa, 0x90f2ee71), 0x00000200, Builtin) [0] { + References 0x2034: PARSED VIRTUAL { + 0: (TVNode, (0x8d73b8aa, 0x90f2ee71)) + 1: (TVNode, (0x8d73b8aa, 0x90f2ee71)) + 2: (TVNode, (0x8d73b8aa, 0x90f2ee71)) + 3: (TVNode, (0x8d73b8aa, 0x90f2ee71)) + 4: (TVNode, (0x8d73b8aa, 0x90f2ee71)) + 5: (Reaction Manager, (0x294a389c, 0x087906d7)) + 6: (TVNode, (0x8d73b8aa, 0x90f2ee71)) + 7: (TVNode, (0x8d73b8aa, 0x90f2ee71)) + 8: (TVNode, (0x8d73b8aa, 0x90f2ee71)) + 9: (MasterLayerControlManager, (0x0f4871a5, 0x781f1430)) + 10: (Max Mixer Clip, (0x57a52b8c, 0x30935afc)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Empty 0x0140 + 0: (TVNode, (0x8d73b8aa, 0x90f2ee71)) (Video Post, (0x482b8d30, 0xb72c8511), 0) + 1: (TVNode, (0x8d73b8aa, 0x90f2ee71)) (Global Tracks, (0xb27e9f2a, 0x73fad370), 0) + 2: (TVNode, (0x8d73b8aa, 0x90f2ee71)) (Block Manager Wrapper TVNode, (0x1f8c3646, 0x11793bed), 0) + 3: (TVNode, (0x8d73b8aa, 0x90f2ee71)) (Propagation Manager Wrapper TVNode, (0x5a1b661e, 0x7620792b), 0) + 4: (TVNode, (0x8d73b8aa, 0x90f2ee71)) (Scene Effects, (0x368d1139, 0xf4044794), 0) + 5: (Reaction Manager, (0x294a389c, 0x087906d7)) (Reaction Manager, (0x294a389c, 0x087906d7), 1) + 6: (TVNode, (0x8d73b8aa, 0x90f2ee71)) (Parameter Collector, (0x39aa5b4d, 0x74c1157e), 0) + 7: (TVNode, (0x8d73b8aa, 0x90f2ee71)) (, (0x4a0c66e1, 0x01513165), 0) + 8: (TVNode, (0x8d73b8aa, 0x90f2ee71)) (BitmapPagerData, (0x5bf94f11, 0x68c22d6f), 0) + 9: (MasterLayerControlManager, (0x0f4871a5, 0x781f1430)) (Anim Layer Control Manager, (0x0f4871a5, 0x781f1430), 1) + 10: (Max Mixer Clip, (0x57a52b8c, 0x30935afc)) (Max MotionClip Manager, (0x57a52b8c, 0x30935afc), 1) } + 445 0x0033: (GridReferenceSuperClassUnknown: Grid Reference, (0x00000001, 0x00000000), 0xfffffe00, Builtin) [0] { + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } } + 446 0x0034: (RenderEffectSuperClassUnknown: RenderEffects, (0x17356912, 0x00000000), 0x00001090, Builtin) [2] { + Orphan[0] 0x1100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[1] 0x1110: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } } + 447 0x0006: (ParamBlockSuperClassUnknown: ParamBlock, (0x00000008, 0x00000000), 0x00000008, Builtin) [7] { + Orphan[0] 0x0001: (StorageRaw) { + Size: 4 + String: .... + Hex: 05 00 00 00 + Int: 5 + Float: 7.00649e-45 } + Orphan[1] 0x0005: (StorageRaw) { + Size: 2 + String: .. + Hex: 02 00 } + Orphan[2] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0101: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 02 00 00 + Int: 512 + Float: 7.17465e-43 } } + Orphan[3] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: ...@ + Hex: 00 00 80 40 + Int: 1082130432 + Float: 4 } } + Orphan[4] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0100: (StorageRaw) { + Size: 4 + String: ...? + Hex: 00 00 80 3f + Int: 1065353216 + Float: 1 } } + Orphan[5] 0x0002: (StorageContainer) [3] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 03 00 00 00 + Int: 3 + Float: 4.2039e-45 } + 1 0x0004: (StorageRaw) { + Size: 0 + String: + Hex: } + 2 0x0101: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + Orphan[6] 0x0002: (StorageContainer) [2] { + 0 0x0003: (StorageRaw) { + Size: 4 + String: .... + Hex: 04 00 00 00 + Int: 4 + Float: 5.60519e-45 } + 1 0x0104: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } + 448 0x0035: (ShadowTypeSuperClassUnknown: Shadow Map, (0x00000100, 0x00000000), 0x000010d0, Default Scanline Renderer (Autodesk)) [0] { + References 0x2034: PARSED { + 0: (ParamBlock, (0x00000008, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } } + 449 0x0036: (ReferenceTargetUnknown: Layer Manager, (0x0d7374fc, 0x51ff028e), 0x00000200, Builtin) [3] { + References 0x2034: PARSED { + 0: (Base Layer, (0x7e9858fe, 0x1dba1df0)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x1500: (StorageRaw) { + Size: 4 + String: .... + Hex: 01 00 00 00 + Int: 1 + Float: 1.4013e-45 } + Orphan[1] 0x1600: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } + Orphan[2] 0x1700: (StorageRaw) { + Size: 1 + String: 0 + Hex: 30 } } + 450 0x0037: (ReferenceMakerUnknown: TrackSetList, (0x2cf03595, 0x00000000), 0x00000100, Builtin) [1] { + Orphan[0] 0x0100: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } + 451 0x0038: (SceneImpl: Scene, (0x00002222, 0x00000000), 0x00000100, Builtin) [6] { + References 0x2034: PARSED VIRTUAL { + 0: (Material Editor, (0x00000c80, 0x00000000)) + 1: (MtlBaseLib, (0x00003333, 0x00000000)) + 2: (ProSound, (0x476fa9de, 0x5b918e4a)) + 3: (RootNode, (0x00000002, 0x00000000)) + 4: (RenderEnvironment, (0xee448b23, 0x00000000)) + 5: (NamedSelSetList, (0x00008d52, 0x00000000)) + 6: (TVNode, (0x8d73b8aa, 0x90f2ee71)) + 7: (Grid Reference, (0x00000001, 0x00000000)) + 8: (RenderEffects, (0x17356912, 0x00000000)) + 9: (Shadow Map, (0x00000100, 0x00000000)) + 10: (Layer Manager, (0x0d7374fc, 0x51ff028e)) + 11: (TrackSetList, (0x2cf03595, 0x00000000)) } + 0x204B Equals 0x2E (46): (CStorageValue) { 46 } + Orphan[0] 0x8500: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[1] 0x8530: (StorageRaw) { + Size: 4 + String: .... + Hex: 02 00 00 00 + Int: 2 + Float: 2.8026e-45 } + Orphan[2] 0x8510: (StorageRaw) { + Size: 4 + String: .... + Hex: c0 12 00 00 + Int: 4800 + Float: 6.72623e-42 } + Orphan[3] 0x8520: (StorageRaw) { + Size: 8 + String: .......? + Hex: 05 00 00 00 00 00 80 3f } + Orphan[4] 0x9000: (StorageRaw) { + Size: 4 + String: >... + Hex: 3e 00 00 00 + Int: 62 + Float: 8.68805e-44 } + Orphan[5] 0x9600: (StorageRaw) { + Size: 4 + String: .... + Hex: 00 00 00 00 + Int: 0 + Float: 0 } } } } + + +------------------ +(program exited with code: 0) +Press return to continue + diff --git a/code/nel/tools/3d/pipeline_max_dump/scene_graph_5.txt b/code/nel/tools/3d/pipeline_max_dump/scene_graph_5.txt new file mode 100644 index 000000000..e206e14fc --- /dev/null +++ b/code/nel/tools/3d/pipeline_max_dump/scene_graph_5.txt @@ -0,0 +1,172 @@ +Scene Graph +Version R3 + + Root Node [8] { +0: TR_HOF_civil01_armpad [0] { + Object: OSM Derived } +1: TR_HOF_civil01_gilet [0] { + Object: OSM Derived } +2: TR_HOF_Civil01_bottes [0] { + Object: OSM Derived } +3: TR_HOF_civil01_pantabottes [0] { + Object: OSM Derived } +4: Bip01 [3] { + Object: Biped Object + 0: Bip01 Footsteps [0] { + Object: Biped Object } + 1: Bip01 Pelvis [3] { + Object: Biped Object + 0: Bip01 Spine [1] { + Object: Biped Object + 0: Bip01 Spine1 [1] { + Object: Biped Object + 0: Bip01 Spine2 [1] { + Object: Biped Object + 0: Bip01 Neck [3] { + Object: Biped Object + 0: Bip01 Head [2] { + Object: Biped Object + 0: Bip01 Head [0] { + Object: Dummy } + 1: Bip01 hair1 [1] { + Object: Biped Object + 0: Bip01 hair11 [1] { + Object: Biped Object + 0: Bip01 hair1 [0] { + Object: Dummy } } } } + 1: Bip01 L Clavicle [1] { + Object: Biped Object + 0: Bip01 L UpperArm [1] { + Object: Biped Object + 0: Bip01 L Forearm [2] { + Object: Biped Object + 0: Bip01 L Hand [6] { + Object: Biped Object + 0: Bip01 L Finger0 [1] { + Object: Biped Object + 0: Bip01 L Finger01 [1] { + Object: Biped Object + 0: Bip01 L Finger02 [1] { + Object: Biped Object + 0: Bip01 L Finger0 [0] { + Object: Dummy } } } } + 1: Bip01 L Finger1 [1] { + Object: Biped Object + 0: Bip01 L Finger11 [1] { + Object: Biped Object + 0: Bip01 L Finger12 [1] { + Object: Biped Object + 0: Bip01 L Finger1 [0] { + Object: Dummy } } } } + 2: Bip01 L Finger2 [1] { + Object: Biped Object + 0: Bip01 L Finger21 [1] { + Object: Biped Object + 0: Bip01 L Finger22 [1] { + Object: Biped Object + 0: Bip01 L Finger2 [0] { + Object: Dummy } } } } + 3: Bip01 L Finger3 [1] { + Object: Biped Object + 0: Bip01 L Finger31 [1] { + Object: Biped Object + 0: Bip01 L Finger32 [1] { + Object: Biped Object + 0: Bip01 L Finger3 [0] { + Object: Dummy } } } } + 4: Bip01 L Finger4 [1] { + Object: Biped Object + 0: Bip01 L Finger41 [1] { + Object: Biped Object + 0: Bip01 L Finger42 [1] { + Object: Biped Object + 0: Bip01 L Finger4 [0] { + Object: Dummy } } } } + 5: box_arme_gauche [0] { + Object: Editable Mesh } } + 1: Box_bouclier [0] { + Object: Editable Mesh } } } } + 2: Bip01 R Clavicle [1] { + Object: Biped Object + 0: Bip01 R UpperArm [1] { + Object: Biped Object + 0: Bip01 R Forearm [1] { + Object: Biped Object + 0: Bip01 R Hand [6] { + Object: Biped Object + 0: Bip01 R Finger0 [1] { + Object: Biped Object + 0: Bip01 R Finger01 [1] { + Object: Biped Object + 0: Bip01 R Finger02 [1] { + Object: Biped Object + 0: Bip01 R Finger0R [0] { + Object: Dummy } } } } + 1: Bip01 R Finger1 [1] { + Object: Biped Object + 0: Bip01 R Finger11 [1] { + Object: Biped Object + 0: Bip01 R Finger12 [1] { + Object: Biped Object + 0: Bip01 R Finger1R [0] { + Object: Dummy } } } } + 2: Bip01 R Finger2 [1] { + Object: Biped Object + 0: Bip01 R Finger21 [1] { + Object: Biped Object + 0: Bip01 R Finger22 [1] { + Object: Biped Object + 0: Bip01 R Finger2R [0] { + Object: Dummy } } } } + 3: Bip01 R Finger3 [1] { + Object: Biped Object + 0: Bip01 R Finger31 [1] { + Object: Biped Object + 0: Bip01 R Finger32 [1] { + Object: Biped Object + 0: Bip01 R Finger3R [0] { + Object: Dummy } } } } + 4: Bip01 R Finger4 [1] { + Object: Biped Object + 0: Bip01 R Finger41 [1] { + Object: Biped Object + 0: Bip01 R Finger42 [1] { + Object: Biped Object + 0: Bip01 R Finger4R [0] { + Object: Dummy } } } } + 5: box_arme [0] { + Object: Editable Mesh } } } } } } } } } + 1: Bip01 L Thigh [1] { + Object: Biped Object + 0: Bip01 L Calf [1] { + Object: Biped Object + 0: Bip01 L Foot [1] { + Object: Biped Object + 0: Bip01 L Toe0 [1] { + Object: Biped Object + 0: Bip01 L Toe0 [0] { + Object: Dummy } } } } } + 2: Bip01 R Thigh [1] { + Object: Biped Object + 0: Bip01 R Calf [1] { + Object: Biped Object + 0: Bip01 R Foot [1] { + Object: Biped Object + 0: Bip01 R Toe0 [1] { + Object: Biped Object + 0: Bip01 R Toe0 [0] { + Object: Dummy } } } } } } + 2: name [0] { + Object: Dummy } } +5: visage01 [0] { + Object: OSM Derived } +6: Object02 [0] { + Object: OSM Derived } +7: TR_HOF_underwear_hand [0] { + Object: OSM Derived } } + + +------------------ +(program exited with code: 0) +Press return to continue + diff --git a/code/nel/tools/3d/pipeline_max_rewrite_assets/CMakeLists.txt b/code/nel/tools/3d/pipeline_max_rewrite_assets/CMakeLists.txt new file mode 100644 index 000000000..4aa8a6652 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max_rewrite_assets/CMakeLists.txt @@ -0,0 +1,36 @@ + +FIND_PACKAGE(LIBGSF) + +IF (NOT (LIBGSF_INCLUDE_DIR AND LIBGSF_LIBRARIES)) + MESSAGE(FATAL_ERROR "LIBGSF not found!") +ENDIF (NOT (LIBGSF_INCLUDE_DIR AND LIBGSF_LIBRARIES)) + +FIND_PACKAGE(GLIB2) + +if (NOT GLIB2_FOUND) + MESSAGE(FATAL_ERROR "GLIB2 not found!") +ENDIF (NOT GLIB2_FOUND) + +INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS}) +INCLUDE_DIRECTORIES(${LIBGSF_INCLUDE_DIR}) + +FILE(GLOB SRCS *.cpp) +FILE(GLOB HDRS *.h) + +ADD_EXECUTABLE(pipeline_max_rewrite_assets + ${SRCS} + ${HDRS} + ) + +TARGET_LINK_LIBRARIES(pipeline_max_rewrite_assets + ${LIBGSF_LIBRARIES} + ${GLIB2_LIBRARIES} + pipeline_max + nelmisc +) + +NL_DEFAULT_PROPS(pipeline_max_dump "NeL, Tools, 3D: Pipeline Max Rewrite Assets") +NL_ADD_RUNTIME_FLAGS(pipeline_max_rewrite_assets) + +INSTALL(TARGETS pipeline_max_rewrite_assets RUNTIME DESTINATION bin COMPONENT toolsmisc) + diff --git a/code/nel/tools/3d/pipeline_max_rewrite_assets/main.cpp b/code/nel/tools/3d/pipeline_max_rewrite_assets/main.cpp new file mode 100644 index 000000000..4a7aca040 --- /dev/null +++ b/code/nel/tools/3d/pipeline_max_rewrite_assets/main.cpp @@ -0,0 +1,1518 @@ +/* + * Copyright (C) 2012 by Jan Boon (Kaetemi) + * + * This file is part of RYZOM CORE PIPELINE. + * RYZOM CORE PIPELINE is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * RYZOM CORE PIPELINE is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with RYZOM CORE PIPELINE. If not, see + * . + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include "nel/misc/dynloadlib.h" +#include "nel/misc/debug.h" +#include "nel/misc/path.h" +#include "nel/misc/algo.h" +#include "nel/misc/file.h" +#include "nel/misc/mem_stream.h" + +#include "../max/storage_stream.h" +#include "../max/storage_object.h" +#include "../max/dll_directory.h" +#include "../max/class_directory_3.h" +#include "../max/class_data.h" +#include "../max/config.h" +#include "../max/scene.h" +#include "../max/scene_class_registry.h" + +// Testing +#include "../max/builtin/builtin.h" +#include "../max/update1/update1.h" +#include "../max/epoly/epoly.h" + +#include "../max/builtin/storage/app_data.h" +#include "../max/builtin/storage/geom_buffers.h" +#include "../max/builtin/scene_impl.h" +#include "../max/builtin/i_node.h" +#include "../max/update1/editable_mesh.h" +#include "../max/epoly/editable_poly.h" + +#include +using namespace std; +using namespace boost::algorithm; + +using namespace PIPELINE::MAX; +using namespace PIPELINE::MAX::BUILTIN; +using namespace PIPELINE::MAX::BUILTIN::STORAGE; +using namespace PIPELINE::MAX::UPDATE1; +using namespace PIPELINE::MAX::EPOLY; + +CSceneClassRegistry SceneClassRegistry; + +// Never enable this +bool DebugParser = false; + +bool DisplayStream = false; +bool DisplayReplaces = false; + +bool ReplacePaths = true; +bool ReplaceMapExt = true; + +bool WriteModified = true; +bool WriteDummy = false; + +bool HaltOnIssue = false; + +const char *DatabaseDirectory = "w:\\database\\"; +const char *LinuxDatabaseDirectory = "/mnt/tsurugi/ryzom-assets/database/"; +bool RunningLinux = true; + +//const char *SrcDirectoryRecursive = "w:\\database\\interfaces\\"; +//const char *SrcDirectoryRecursive = "w:\\database\\"; +//const char *SrcDirectoryRecursive = "w:\\database\\stuff\\fyros\\city\\newpositionville\\"; +const char *SrcDirectoryRecursiveInit = "w:\\database\\"; +//const char *SrcDirectoryRecursiveHandle = "w:\\database\\stuff\\generique\\agents\\accessories\\"; +const char *SrcDirectoryRecursiveHandle = "w:\\database\\landscape\\ligo\\primes_racines\\max\\"; + +bool UseFallbackTga = false; +const char *FallbackTga = "w:\\database\\stuff\\lod_actors\\texture_lod\\trame.png"; + +std::set MissingFiles; +std::map KnownFileCache; + +std::string nativeDatabasePath(const std::string &standardizedPath) +{ + if (RunningLinux) + { + std::string result = standardizedPath; + NLMISC::strFindReplace(result, DatabaseDirectory, LinuxDatabaseDirectory); + while (NLMISC::strFindReplace(result, "\\", "/")) { } + return result; + } + return standardizedPath; +} + +std::string unnativeDatabasePath(const std::string &nativizedPath) +{ + if (RunningLinux) + { + std::string result = nativizedPath; + NLMISC::strFindReplace(result, LinuxDatabaseDirectory, DatabaseDirectory); + while (NLMISC::strFindReplace(result, "/", "\\")) { } + return result; + } + return nativizedPath; +} + +// COPY FROM PIPELINE_SERVICE.CPP WITH BACKSLASHES INSTEAD OF FORWARD SLASHES +std::string standardizePath(const std::string &path, bool addFinalSlash) +{ + // check empty path + if (path.empty()) + return ""; + + std::string newPath; + newPath.resize(path.size() + 1); + + std::string::size_type j = 0; + for (std::string::size_type i = 0; i < path.size(); ++i) + { + if (path[i] == '\\' || path[i] == '/') + { + if (j <= 1 && path[i] == '\\') + { + // for windows network + newPath[j] = '\\'; + ++j; + } + else if (j == 0 || newPath[j - 1] != '\\') + { + newPath[j] = '\\'; + ++j; + } + } + else + { + newPath[j] = path[i]; + ++j; + } + } + newPath[j] = 0; + newPath.resize(j); + + // add terminal slash + if (addFinalSlash && newPath[newPath.size()-1] != '\\') + newPath += '\\'; + + return newPath; +} + +inline bool isCharacter(char c0) +{ + uint8 c = *(uint8 *)(void *)(&c0); + return (32 <= c /*&& c <= 127) || (161 <= c*/ /*&& c <= 255*/); +} + +inline char stripFrenchLocale(char c0) +{ + uint8 c = *(uint8 *)(void *)(&c0); + if (192 <= c && c <= 197) return 'a'; + if (200 <= c && c <= 203) return 'e'; + if (204 <= c && c <= 207) return 'i'; + if (210 <= c && c <= 214) return 'o'; + if (217 <= c && c <= 220) return 'u'; + if (c == 221) return 'y'; + if (224 <= c && c <= 229) return 'a'; + if (232 <= c && c <= 235) return 'e'; + if (236 <= c && c <= 239) return 'i'; + if (242 <= c && c <= 246) return 'o'; + if (249 <= c && c <= 252) return 'u'; + if (c == 253 || c == 255) return 'y'; + return c0; +} + +std::string rewritePath(const std::string &path, const std::string &databaseDirectory) +{ + static std::set fileNameCache; + + std::string stdPath = standardizePath(path, false); + for (std::string::size_type i = 0; i < stdPath.size(); ++i) + stdPath[i] = stripFrenchLocale(stdPath[i]); + stdPath = NLMISC::toLower(stdPath); + + // TODO: remove ./stuff/caravan/agents/_textures/actors/trame.png + + NLMISC::strFindReplace(stdPath, "w:\\database\\", databaseDirectory); + NLMISC::strFindReplace(stdPath, "\\\\amiga\\3d\\database\\", databaseDirectory); + NLMISC::strFindReplace(stdPath, "ma_hom_armor_01", "ma_hom_armor01"); + NLMISC::strFindReplace(stdPath, "ma_hof_armor_01", "ma_hof_armor01"); + NLMISC::strFindReplace(stdPath, "ma_hom_armor_00", "ma_hom_armor00"); + NLMISC::strFindReplace(stdPath, "ma_hof_armor_00", "ma_hof_armor00"); + NLMISC::strFindReplace(stdPath, "zo_hom_armor_00", "zo_hom_armor00"); + NLMISC::strFindReplace(stdPath, "zo_hof_armor_00", "zo_hof_armor00"); + NLMISC::strFindReplace(stdPath, "fy_hof_cheveux_shave01", "fy_hof_cheveux_shave"); + + NLMISC::strFindReplace(stdPath, "matis\\agents\\_textures\\actors\\ma_hom_underwear_avtbras", "tryker\\agents\\_textures\\actors\\tr_hom_underwear_avtbras"); + NLMISC::strFindReplace(stdPath, "matis\\agents\\_textures\\actors\\ma_hom_underwear_epaule", "tryker\\agents\\_textures\\actors\\tr_hom_underwear_epaule"); + NLMISC::strFindReplace(stdPath, "matis\\agents\\_textures\\actors\\ma_hom_underwear_hand-downside", "tryker\\agents\\_textures\\actors\\tr_hom_underwear_hand-downside"); + NLMISC::strFindReplace(stdPath, "matis\\agents\\_textures\\actors\\ma_hom_underwear_hand-upside", "tryker\\agents\\_textures\\actors\\tr_hom_underwear_hand-upside"); + NLMISC::strFindReplace(stdPath, "matis\\agents\\_textures\\actors\\ma_hom_underwear_molet", "tryker\\agents\\_textures\\actors\\tr_hom_underwear_molet"); + NLMISC::strFindReplace(stdPath, "matis\\agents\\_textures\\actors\\ma_hof_underwear_hand-downside", "tryker\\agents\\_textures\\actors\\tr_hof_underwear_hand-downside"); + NLMISC::strFindReplace(stdPath, "matis\\agents\\_textures\\actors\\ma_hof_underwear_hand-upside", "tryker\\agents\\_textures\\actors\\tr_hof_underwear_hand-upside"); + + NLMISC::strFindReplace(stdPath, "tr_hof_underwear_torso", "tr_hof_underwear_torse"); + NLMISC::strFindReplace(stdPath, "tr_hof_underwear_hand-", "tr_hof_underwear_hand_"); + + NLMISC::strFindReplace(stdPath, "fy_hom_armor00_avbras.", "fy_hom_armor00_avbras_c1."); + NLMISC::strFindReplace(stdPath, "fy_hom_armor00_bottes.", "fy_hom_armor00_bottes_c1."); + NLMISC::strFindReplace(stdPath, "fy_hom_armor00_bras.", "fy_hom_armor00_bras_c1."); + NLMISC::strFindReplace(stdPath, "fy_hom_armor00_cuissear.", "fy_hom_armor00_cuissear_c1."); + NLMISC::strFindReplace(stdPath, "fy_hom_armor00_cuisseav.", "fy_hom_armor00_cuisseav_c1."); + NLMISC::strFindReplace(stdPath, "fy_hom_armor00_dos.", "fy_hom_armor00_dos_c1."); + NLMISC::strFindReplace(stdPath, "fy_hom_armor00_hand-downside.", "fy_hom_armor00_hand-downside_c1."); + NLMISC::strFindReplace(stdPath, "fy_hom_armor00_hand-upside.", "fy_hom_armor00_hand-upside_c1."); + NLMISC::strFindReplace(stdPath, "fy_hom_armor00_pieds.", "fy_hom_armor00_pieds_c1."); + NLMISC::strFindReplace(stdPath, "fy_hom_armor00_torse.", "fy_hom_armor00_torse_c1."); + + NLMISC::strFindReplace(stdPath, "fy-hof-gilet02-dos", "fy_hof_gilet02_arriere_n"); + NLMISC::strFindReplace(stdPath, "fy-hof-pantalon02-arriere", "fy_hof_pantalon02_arriere_n"); + NLMISC::strFindReplace(stdPath, "fy-hof-pantalon02-avant", "fy_hof_pantalon02_avant_n"); + NLMISC::strFindReplace(stdPath, "fy-hom-blouson02-avantbras", "fy_hom_blouson02_avbras_n"); + NLMISC::strFindReplace(stdPath, "fy-hom-blouson02-bras", "fy_hom_blouson02_bras_n"); + NLMISC::strFindReplace(stdPath, "fy-hom-blouson02-dos", "fy_hom_blouson02_arriere_n"); + NLMISC::strFindReplace(stdPath, "fy-hom-blouson02-torse", "fy_hom_blouson02_avant_n"); + NLMISC::strFindReplace(stdPath, "fy-hom-pantalon02-mollet", "fy_hom_pantalon02_mollet_n"); + NLMISC::strFindReplace(stdPath, "fy-hom-shoes02", "fy_hom_shoes02_shoes_n"); + NLMISC::strFindReplace(stdPath, "fyhof-gilet02-torse", "fy_hof_gilet02_torse_n"); + + NLMISC::strFindReplace(stdPath, "ge_hom_armor02_armpad", "ge_hom_armor02_avbras"); + NLMISC::strFindReplace(stdPath, "ge_hom_armor02_bottes", "ge_hom_armor02_pied"); + NLMISC::strFindReplace(stdPath, "ge_hom_armor02_cuisse-arr", "ge_hom_armor02_cuisse_arr"); + NLMISC::strFindReplace(stdPath, "ge_hom_armor02_cuisse-avt", "ge_hom_armor02_cuisse_avt"); + NLMISC::strFindReplace(stdPath, "ge_hom_armor02_hand-down", "ge_hom_armor02_hand_down"); + NLMISC::strFindReplace(stdPath, "ge_hom_armor02_hand-up", "ge_hom_armor02_hand_up"); + NLMISC::strFindReplace(stdPath, "ge_hom_armor02_torse", "ge_hom_armor02_torso"); + + NLMISC::strFindReplace(stdPath, "fy_lovejail.", "fy_lovejail_su."); + NLMISC::strFindReplace(stdPath, "\\caissebonusaction.", "\\g_caissebonus."); + NLMISC::strFindReplace(stdPath, "\\sactoile.", "\\g_sactoile."); + NLMISC::strFindReplace(stdPath, "\\ge_mission_stele_kami0.", "\\ge_mission_stele_kami."); + NLMISC::strFindReplace(stdPath, "\\ge_mission_reward_karavan_bigshield.", "\\ge_mission_reward_karavan_bigshield_c1."); + + NLMISC::strFindReplace(stdPath, "\\tr_hom_underwear_cuisse_arr.", "\\tr_hom_underwear_cuisse-arr."); + NLMISC::strFindReplace(stdPath, "\\tr_hom_underwear_cuisse_avt.", "\\tr_hom_underwear_cuisse-avt."); + + NLMISC::strFindReplace(stdPath, "interfaces_visage", "visage_interface"); + + if (stdPath.find("\\trame.") != std::string::npos) + stdPath = standardizePath(databaseDirectory + "/stuff/lod_actors/texture_lod/trame.png", false); + if (stdPath.find("\\tr_hof_visage_c1.") != std::string::npos) + stdPath = standardizePath(databaseDirectory + "/stuff/tryker/agents/_textures/actors/tr_hof_visage_c1.png", false); + if (stdPath.find("\\tr_hof_visage_c2.") != std::string::npos) + stdPath = standardizePath(databaseDirectory + "/stuff/tryker/agents/_textures/actors/tr_hof_visage_c2.png", false); + if (stdPath.find("\\tr_hof_visage_c3.") != std::string::npos) + stdPath = standardizePath(databaseDirectory + "/stuff/tryker/agents/_textures/actors/tr_hof_visage_c3.png", false); + if (stdPath.find("\\ma_hof_cheveux_medium02.") != std::string::npos) + stdPath = standardizePath(databaseDirectory + "/stuff/matis/agents/_textures/actors/ma_hof_cheveux_medium02.png", false); + + /*if (stdPath.size() > path.size()) + { + nlwarning("Path size becomes too large: '%s' -> '%s'", path.c_str(), stdPath.c_str()); + return path; + }*/ + + if (NLMISC::CFile::getFilename(stdPath) == stdPath) + { + breakable + { + if (fileNameCache.find(stdPath) == fileNameCache.end() || KnownFileCache.find(stdPath) == KnownFileCache.end()) + { + if (stdPath[stdPath.size() - 3] == 't' && stdPath[stdPath.size() - 2] == 'g' && stdPath[stdPath.size() - 1] == 'a') + { + stdPath[stdPath.size() - 3] = 'p'; + stdPath[stdPath.size() - 2] = 'n'; + stdPath[stdPath.size() - 1] = 'g'; + if (fileNameCache.find(stdPath) != fileNameCache.end()) + break; + } + //#nlwarning("File name not known: '%s' ('%s')", path.c_str(), stdPath.c_str()); + // MissingFiles.insert(path); + return stdPath; + } + } + return stdPath; + } + else + { + if (stdPath.find(databaseDirectory) == std::string::npos) + { + if (stdPath[1] == ':' || (stdPath[0] == '\\' && stdPath[1] == '\\')) + { + if (KnownFileCache.find(NLMISC::CFile::getFilename(stdPath)) != KnownFileCache.end()) + return KnownFileCache[NLMISC::CFile::getFilename(stdPath)]; + + if (stdPath[stdPath.size() - 3] == 't' && stdPath[stdPath.size() - 2] == 'g' && stdPath[stdPath.size() - 1] == 'a') + { stdPath[stdPath.size() - 3] = 'p'; stdPath[stdPath.size() - 2] = 'n'; stdPath[stdPath.size() - 1] = 'g'; } + if (KnownFileCache.find(NLMISC::CFile::getFilename(stdPath)) != KnownFileCache.end()) + return KnownFileCache[NLMISC::CFile::getFilename(stdPath)]; + + if (stdPath[stdPath.size() - 3] == 'p' && stdPath[stdPath.size() - 2] == 'n' && stdPath[stdPath.size() - 1] == 'g') + { stdPath[stdPath.size() - 3] = 't'; stdPath[stdPath.size() - 2] = 'g'; stdPath[stdPath.size() - 1] = 'a'; } + if (KnownFileCache.find(NLMISC::CFile::getFilename(stdPath)) != KnownFileCache.end()) + return KnownFileCache[NLMISC::CFile::getFilename(stdPath)]; + + //#nlwarning("Path not in database: '%s' ('%s')", path.c_str(), stdPath.c_str()); + MissingFiles.insert(path); + return stdPath; + } + else + { + // invalid path, don't care too much + return stdPath; + } + } + + breakable + { + if (!NLMISC::CFile::fileExists(nativeDatabasePath(stdPath))) + { + if (stdPath[stdPath.size() - 3] == 't' && stdPath[stdPath.size() - 2] == 'g' && stdPath[stdPath.size() - 1] == 'a') + { + stdPath[stdPath.size() - 3] = 'p'; + stdPath[stdPath.size() - 2] = 'n'; + stdPath[stdPath.size() - 1] = 'g'; + if (NLMISC::CFile::fileExists(nativeDatabasePath(stdPath))) + break; + } + { + std::string stdPathVv2 = standardizePath(NLMISC::CFile::getPath(stdPath) + "/vv2/" + NLMISC::CFile::getFilename(stdPath), false); + bool vv2works = false; + if (NLMISC::CFile::fileExists(nativeDatabasePath(stdPathVv2))) + { + vv2works = true; + } + else + { + if (stdPathVv2[stdPathVv2.size() - 3] == 'p' && stdPathVv2[stdPathVv2.size() - 2] == 'n' && stdPathVv2[stdPathVv2.size() - 1] == 'g') + { + stdPathVv2[stdPathVv2.size() - 3] = 't'; + stdPathVv2[stdPathVv2.size() - 2] = 'g'; + stdPathVv2[stdPathVv2.size() - 1] = 'a'; + if (NLMISC::CFile::fileExists(nativeDatabasePath(stdPathVv2))) + { + vv2works = true; + } + } + } + if (vv2works) + { + // try with vv2 + /*if (stdPathVv2.size() > path.size()) + { + nlwarning("Path with vv2 size becomes too large: '%s' -> '%s'", path.c_str(), stdPathVv2.c_str()); + return stdPath; + } + else + {*/ + stdPath = stdPathVv2; + break; + //} + } + } + // try find + if (KnownFileCache.find(NLMISC::CFile::getFilename(stdPath)) != KnownFileCache.end()) + return KnownFileCache[NLMISC::CFile::getFilename(stdPath)]; + + if (stdPath[stdPath.size() - 3] == 't' && stdPath[stdPath.size() - 2] == 'g' && stdPath[stdPath.size() - 1] == 'a') + { stdPath[stdPath.size() - 3] = 'p'; stdPath[stdPath.size() - 2] = 'n'; stdPath[stdPath.size() - 1] = 'g'; } + if (KnownFileCache.find(NLMISC::CFile::getFilename(stdPath)) != KnownFileCache.end()) + return KnownFileCache[NLMISC::CFile::getFilename(stdPath)]; + + if (stdPath[stdPath.size() - 3] == 'p' && stdPath[stdPath.size() - 2] == 'n' && stdPath[stdPath.size() - 1] == 'g') + { stdPath[stdPath.size() - 3] = 't'; stdPath[stdPath.size() - 2] = 'g'; stdPath[stdPath.size() - 1] = 'a'; } + if (KnownFileCache.find(NLMISC::CFile::getFilename(stdPath)) != KnownFileCache.end()) + return KnownFileCache[NLMISC::CFile::getFilename(stdPath)]; + + //#nlwarning("Path file does not exist: '%s' ('%s')", path.c_str(), stdPath.c_str()); + MissingFiles.insert(path); + return stdPath; + } + } + } + + fileNameCache.insert(NLMISC::CFile::getFilename(stdPath)); + return stdPath; +} + +void doFileInitialize(const std::string &filePath) +{ + // nldebug("File: '%s'", filePath.c_str()); + // nldebug("Native: '%s'", nativeDatabasePath(filePath).c_str()); + + KnownFileCache[NLMISC::CFile::getFilename(filePath)] = standardizePath(filePath, false); +} + +// maxRewritePaths W:/database/interfaces/anims_max + +void doDirectoryInitialize(const std::string &directoryPath) +{ + nldebug("Directory: '%s'", directoryPath.c_str()); + + std::string dirPath = standardizePath(directoryPath, true); + std::vector dirContents; + + NLMISC::CPath::getPathContent(nativeDatabasePath(dirPath), false, true, true, dirContents); + + // nldebug("Native: '%s'", nativeDatabasePath(dirPath).c_str()); + // nldebug("Contents: %i", dirContents.size()); + + for (std::vector::iterator it = dirContents.begin(), end = dirContents.end(); it != end; ++it) + { + std::string subPath = standardizePath(unnativeDatabasePath(*it), false); + // nldebug("Path: '%s'", subPath.c_str()); + // nldebug("Native: '%s'", nativeDatabasePath(subPath + " ").c_str()); + + if (NLMISC::CFile::isDirectory(nativeDatabasePath(subPath))) + { + if (subPath.find("\\.") == std::string::npos) + doDirectoryInitialize(subPath); + } + else + doFileInitialize(subPath); + } +} + +void runInitialize() +{ + nlinfo("DatabaseDirectory: '%s'", DatabaseDirectory); + + doDirectoryInitialize(std::string(SrcDirectoryRecursiveInit)); +} + +// Scary stuff +void doFileScanner(const std::string &filePath) +{ + if (filePath[filePath.size() - 3] == 'm' && filePath[filePath.size() - 2] == 'a' && filePath[filePath.size() - 1] == 'x') + { + nldebug("File: '%s'", filePath.c_str()); + + std::vector buffer; + buffer.resize(NLMISC::CFile::getFileSize(nativeDatabasePath(filePath))); + + // read + { + NLMISC::CIFile ifile; + ifile.open(nativeDatabasePath(filePath), false); + ifile.serialBuffer((uint8 *)(&buffer[0]), buffer.size()); + ifile.close(); + } + + // find paths + for (std::vector::size_type i = 256; i < buffer.size(); ++i) // skip the first 256 lol :) + { + if (((NLMISC::toLower(buffer[i - 1]) == 'x' && NLMISC::toLower(buffer [i - 2]) == 'a' && NLMISC::toLower(buffer[i - 3]) == 'm') + || (NLMISC::toLower(buffer[i - 1]) == 'a' && NLMISC::toLower(buffer [i - 2]) == 'g' && NLMISC::toLower(buffer[i - 3]) == 't') + || (NLMISC::toLower(buffer[i - 1]) == 'g' && NLMISC::toLower(buffer [i - 2]) == 'n' && NLMISC::toLower(buffer[i - 3]) == 'p')) + && (NLMISC::toLower(buffer[i - 4]) == '.')) + { + // buffer[i] is the character after the path! :) + std::vector::size_type beginPath = 0; + for (std::vector::size_type j = i - 4; j > 0; --j) + { + if (!isCharacter(buffer[j])) + { + if ((buffer[j + 1] == '\\' && buffer[j + 2] == '\\') || buffer[j] == 0) + { + beginPath = j + 1; + break; + } + // nlwarning("Invalid characters '%i' in path at %i, len %i!", (uint32)buffer[j], (uint32)j, (uint32)(i - j)); + // beginPath = j + 1; // test + break; + } + if (buffer[j] == ':') + { + beginPath = j - 1; + break; + } + } + if (beginPath != 0) + { + std::vector::size_type sizePath = i - beginPath; + std::string foundPath = std::string(&buffer[beginPath], sizePath); //std::string(buffer.at(beginPath), buffer.at(i)); + //nldebug("Found path: '%s' from %i to %i", foundPath.c_str(), (uint32)beginPath, (uint32)i); + std::string fixedPath = rewritePath(foundPath, DatabaseDirectory); + //nldebug("Rewrite to: '%s'", fixedPath.c_str()); + } + } + } + + //NLMISC::CFile::re + + // ... + } +} + +void doDirectoryScanner(const std::string &directoryPath) +{ + nldebug("Directory: '%s'", directoryPath.c_str()); + + std::string dirPath = standardizePath(directoryPath, true); + std::vector dirContents; + + NLMISC::CPath::getPathContent(nativeDatabasePath(dirPath), false, true, true, dirContents); + + for (std::vector::iterator it = dirContents.begin(), end = dirContents.end(); it != end; ++it) + { + std::string subPath = standardizePath(unnativeDatabasePath(*it), false); + + if (NLMISC::CFile::isDirectory(nativeDatabasePath(subPath))) + { + if (subPath.find("\\.") == std::string::npos) + doDirectoryScanner(subPath); + } + else + doFileScanner(subPath); + } +} + +void runScanner() +{ + nlinfo("DatabaseDirectory: '%s'", DatabaseDirectory); + + doDirectoryScanner(SrcDirectoryRecursiveHandle); + + for (std::set::iterator it = MissingFiles.begin(), end = MissingFiles.end(); it != end; ++it) + nlinfo("Missing: '%s'", (*it).c_str()); +} + +void handleFile(const std::string &path); + +void doFileHandler(const std::string &filePath) +{ + if (filePath[filePath.size() - 3] == 'm' && filePath[filePath.size() - 2] == 'a' && filePath[filePath.size() - 1] == 'x') + { + nldebug("File: '%s'", filePath.c_str()); + + handleFile(nativeDatabasePath(filePath)); + } +} + +void doDirectoryHandler(const std::string &directoryPath) +{ + nldebug("Directory: '%s'", directoryPath.c_str()); + + std::string dirPath = standardizePath(directoryPath, true); + std::vector dirContents; + + NLMISC::CPath::getPathContent(nativeDatabasePath(dirPath), false, true, true, dirContents); + + for (std::vector::iterator it = dirContents.begin(), end = dirContents.end(); it != end; ++it) + { + std::string subPath = standardizePath(unnativeDatabasePath(*it), false); + + if (NLMISC::CFile::isDirectory(nativeDatabasePath(subPath))) + { + if (subPath.find("\\.") == std::string::npos) + doDirectoryHandler(subPath); + } + else + doFileHandler(subPath); + } +} + +void runHandler() +{ + nlinfo("DatabaseDirectory: '%s'", DatabaseDirectory); + + doDirectoryHandler(SrcDirectoryRecursiveHandle); + + for (std::set::iterator it = MissingFiles.begin(), end = MissingFiles.end(); it != end; ++it) + nlinfo("Missing: '%s'", (*it).c_str()); +} + +void serializeStorageContainer(PIPELINE::MAX::CStorageContainer *storageContainer, GsfInfile *infile, const char *streamName) +{ + GsfInput *input = gsf_infile_child_by_name(infile, streamName); + if (!input) + { + nlerror("GSF Could not read stream %s", streamName); + return; + } + { + PIPELINE::MAX::CStorageStream instream(input); + storageContainer->serial(instream); + } + g_object_unref(input); +} + +void serializeStorageContainer(PIPELINE::MAX::CStorageContainer *storageContainer, GsfOutfile *outfile, const char *streamName) +{ + //nldebug("write"); + GsfOutput *output = GSF_OUTPUT(gsf_outfile_new_child(outfile, streamName, false)); + if (!output) + { + nlerror("GSF Could not write stream %s", streamName); + return; + } + { + PIPELINE::MAX::CStorageStream outstream(output); + storageContainer->serial(outstream); + } + gsf_output_close(output); + g_object_unref(G_OBJECT(output)); +} + +void serializeRaw(std::vector &rawOutput, GsfInfile *infile, const char *streamName) +{ + GsfInput *input = gsf_infile_child_by_name(infile, streamName); + if (!input) + { + nlerror("GSF Could not read stream %s", streamName); + return; + } + { + PIPELINE::MAX::CStorageStream instream(input); + rawOutput.resize(instream.size()); + instream.serialBuffer(&rawOutput[0], rawOutput.size()); + } + g_object_unref(input); +} + +void serializeRaw(std::vector &rawOutput, GsfOutfile *outfile, const char *streamName) +{ + GsfOutput *output = GSF_OUTPUT(gsf_outfile_new_child(outfile, streamName, false)); + if (!output) + { + nlerror("GSF Could not write stream %s", streamName); + return; + } + { + PIPELINE::MAX::CStorageStream outstream(output); + outstream.serialBuffer(&rawOutput[0], rawOutput.size()); + } + gsf_output_close(output); + g_object_unref(G_OBJECT(output)); +} + +std::string cleanString(const std::string &str) +{ + std::string res = str; + trim(res); + // \\Amiga\3D (10 chars) + if (res.size() > 10) + { + if (res.substr(res.size() - 10) == "\\\\Amiga\\3D") + res = res.substr(0, res.size() - 10); + } + if (res.size() > 1) + { + if (res.substr(res.size() - 1) == "0") + res = res.substr(0, res.size() - 1); + } + if (res.size() > 4 && res[res.size() - 1] == '.') + { + if (res.substr(res.size() - 4) == "max.") // fix a stupid typo + res = res.substr(0, res.size() - 1); + } + return res; +} + +std::string rewritePathFinal(const std::string &str) +{ + std::string strtrimmed = cleanString(str); + std::string result = rewritePath(strtrimmed, DatabaseDirectory); + if (NLMISC::CFile::getFilename(result) != result && !NLMISC::CFile::fileExists(nativeDatabasePath(result)) && + ((result[result.size() - 3] == 't' && result[result.size() - 2] == 'g' && result[result.size() - 1] == 'a') || (result[result.size() - 3] == 'p' && result[result.size() - 2] == 'n' && result[result.size() - 1] == 'g')) + ) + { + // nlwarning("Replacing missing '%s' with '%s'", result.c_str(), FallbackTga); + if (UseFallbackTga) + { + return FallbackTga; + } + else + { + return NLMISC::CFile::getFilename(result); + } + } + if (DisplayReplaces) + { + nldebug("Replacing '%s' with '%s'", str.c_str(), result.c_str()); + } + return result; +} + +bool isImportantFilePath(const std::string &str) +{ + std::string strtrimmed = cleanString(str); + if (strtrimmed.size() >= 4) + { + std::string strlw = NLMISC::toLower(strtrimmed); + return (strlw[strlw.size() - 3] == 'm' && strlw[strlw.size() - 2] == 'a' && strlw[strlw.size() - 1] == 'x') + || (strlw[strlw.size() - 3] == 't' && strlw[strlw.size() - 2] == 'g' && strlw[strlw.size() - 1] == 'a') + || (strlw[strlw.size() - 3] == 'p' && strlw[strlw.size() - 2] == 'n' && strlw[strlw.size() - 1] == 'g'); + } + return false; +} + +bool hasImportantFilePath(CStorageRaw *raw) +{ + if (raw->Value.size() >= 4) + { + // Find any occurences of .max, .png or .tga in ascii or utf16 + for (uint i = 0; i < raw->Value.size() - 3; ++i) + { + if (NLMISC::toLower(((char *)&raw->Value[0])[i]) == '.' + && NLMISC::toLower(((char *)&raw->Value[0])[i + 1]) == 'm' + && NLMISC::toLower(((char *)&raw->Value[0])[i + 2]) == 'a' + && NLMISC::toLower(((char *)&raw->Value[0])[i + 3]) == 'x') + return true; + if (NLMISC::toLower(((char *)&raw->Value[0])[i]) == '.' + && NLMISC::toLower(((char *)&raw->Value[0])[i + 1]) == 't' + && NLMISC::toLower(((char *)&raw->Value[0])[i + 2]) == 'g' + && NLMISC::toLower(((char *)&raw->Value[0])[i + 3]) == 'a') + return true; + if (NLMISC::toLower(((char *)&raw->Value[0])[i]) == '.' + && NLMISC::toLower(((char *)&raw->Value[0])[i + 1]) == 'p' + && NLMISC::toLower(((char *)&raw->Value[0])[i + 2]) == 'n' + && NLMISC::toLower(((char *)&raw->Value[0])[i + 3]) == 'g') + return true; + } + } + if (raw->Value.size() >= 6) + { + for (uint i = 0; i < raw->Value.size() - 6; ++i) + { + if (NLMISC::toLower(((char *)&raw->Value[0])[i]) == '.' + && NLMISC::toLower(((char *)&raw->Value[0])[i + 2]) == 'm' + && NLMISC::toLower(((char *)&raw->Value[0])[i + 4]) == 'a' + && NLMISC::toLower(((char *)&raw->Value[0])[i + 6]) == 'x') + return true; + if (NLMISC::toLower(((char *)&raw->Value[0])[i]) == '.' + && NLMISC::toLower(((char *)&raw->Value[0])[i + 2]) == 't' + && NLMISC::toLower(((char *)&raw->Value[0])[i + 4]) == 'g' + && NLMISC::toLower(((char *)&raw->Value[0])[i + 6]) == 'a') + return true; + if (NLMISC::toLower(((char *)&raw->Value[0])[i]) == '.' + && NLMISC::toLower(((char *)&raw->Value[0])[i + 2]) == 'p' + && NLMISC::toLower(((char *)&raw->Value[0])[i + 4]) == 'n' + && NLMISC::toLower(((char *)&raw->Value[0])[i + 6]) == 'g') + return true; + } + } + return false; +} + +void fixChunk(uint16 id, IStorageObject *chunk) +{ + CStorageValue *asString = dynamic_cast *>(chunk); + if (asString) + { + // nldebug("String: %s", asString->Value.c_str()); + if (isImportantFilePath(asString->Value)) + asString->Value = rewritePathFinal(asString->Value); + return; + } + CStorageValue *asUCString = dynamic_cast *>(chunk); + if (asUCString) + { + // nldebug("UCString: %s", asUCString->Value.toUtf8().c_str()); + if (isImportantFilePath(asUCString->Value.toString())) + asUCString->Value.fromUtf8(rewritePathFinal(asUCString->Value.toString())); + return; + } + CStorageRaw *asRaw = dynamic_cast(chunk); + if (asRaw) + { + switch (id) + { + case 256: + case 4656: + case 16385: + case 288: // .max xref in classdata + if (hasImportantFilePath(asRaw)) + { + // generic ucstring really + nlassert(asRaw->Value.size() % 2 == 0); + ucstring str; + str.resize(asRaw->Value.size() / 2); + memcpy(&str[0], &asRaw->Value[0], asRaw->Value.size()); + // nldebug("[%s]", str.toString().c_str()); + nlassert(isImportantFilePath(str.toString())); + str.fromUtf8(rewritePathFinal(str.toString())); + asRaw->Value.resize(str.size() * 2); + memcpy(&asRaw->Value[0], &str[0], asRaw->Value.size()); + break; + } + case 10: + if (hasImportantFilePath(asRaw)) + { + // 10 00 08 00 00 00 02 00 80 00 40 // 11 bytes O_O + // 4d 00 00 00 + // 57 3a 5c 44 61 74 61 62 61 73 + // 65 5c 73 74 75 66 66 5c 74 72 + // 79 6b 65 72 5c 61 67 65 6e 74 + // 73 5c 5f 74 65 78 74 75 72 65 + // 73 5c 61 63 74 6f 72 73 5c 54 + // 52 5f 48 4f 46 5f 63 69 76 69 + // 6c 30 31 5f 74 6f 72 73 6f 5f + // 43 31 2e 74 67 61 00 + bool overrideFF = true; // Patch for some ligo max files + if (overrideFF && asRaw->Value.size() > 4 && asRaw->Value[asRaw->Value.size() - 4] == 0xFF) + { + nlwarning("0xFFFFFFFF"); + } + else if (!(asRaw->Value[asRaw->Value.size() - 1] == 0)) + { + nlinfo("Id: %i, size: %i", (uint32)id, asRaw->Value.size()); + asRaw->toString(std::cout); + nldebug("x"); + nlwarning("not null term"); + if (HaltOnIssue) + { + std::string x; + std::cin >> x; + } + break; + } + uint32 size = ((uint32 *)&asRaw->Value[11])[0]; + if (!(asRaw->Value.size() == size + 4 + 11)) + { + nlinfo("Id: %i, size: %i", (uint32)id, asRaw->Value.size()); + asRaw->toString(std::cout); + nldebug("x"); + nlwarning("size '%i' does not match '%i', use different algo :)", size, asRaw->Value.size() - 4 - 11); + uint8 nonsense[11]; + uint32 counter; + std::vector strings; + { + NLMISC::CMemStream mem; + asRaw->serial(mem); + mem.invert(); + mem.serialBuffer(nonsense, 11); + mem.serial(counter); + uint i = 0; + while ((sint)mem.getPos() != (sint)mem.size()) + { + //nldebug("pos %i", mem.getPos()); + //nldebug("size %i", mem.size()); + char funny; + mem.serial(funny); + nlassert(funny == '@'); + sint32 size; + mem.serial(size); + //nldebug("size %i", size); + if (!overrideFF && size == -1) + { + nldebug("size %i", size); + nlwarning("bad size"); + if (HaltOnIssue) + { + std::string x; + std::cin >> x; + } + return; + } + std::string v; + if (overrideFF && size == -1) + { + v.resize(1); + *(uint8 *)&v[0] = 0; + } + else + { + v.resize(size); + mem.serialBuffer((uint8 *)&v[0], size); + } + if (!(v[v.size() - 1] == 0)) + { + nlinfo("Id: %i, size: %i", (uint32)id, asRaw->Value.size()); + asRaw->toString(std::cout); + nldebug("x"); + nlwarning("not null term inside array stuff %i '%s'", i, v.c_str()); + if (HaltOnIssue) + { + std::string x; + std::cin >> x; + } + return; + } + v.resize(v.size() - 1); + // nldebug("%s", v.c_str()); + strings.push_back(v); + ++i; + // nldebug("ok"); + } + nlassert(strings.size() == counter); + asRaw->Value.resize(0); + } + bool foundone = false; + for (uint i = 0; i < strings.size(); ++i) + { + if (isImportantFilePath(strings[i])) + { + foundone = true; + strings[i] = rewritePathFinal(strings[i]); + } + } + nlassert(foundone); + { + //nldebug("go"); + NLMISC::CMemStream mem; + mem.serialBuffer(nonsense, 11); + mem.serial(counter); + for (uint i = 0; i < strings.size(); ++i) + { + //nldebug("one"); + char funny = '@'; + mem.serial(funny); + strings[i].resize(strings[i].size() + 1); + strings[i][strings[i].size() - 1] = 0; + uint32 size = strings[i].size(); + mem.serial(size); + mem.serialBuffer((uint8 *)&strings[i][0], size); + } + asRaw->setSize(mem.getPos()); + mem.invert(); + asRaw->serial(mem); + } + //std::string x; + //std::cin >> x; + return; + } + std::string str; + str.resize(size - 1); + memcpy(&str[0], &asRaw->Value[15], str.size()); + // nldebug("test '%s'", str.c_str()); + // asRaw->toString(std::cout); + if (!isImportantFilePath(str)) + { + nlinfo("Id: %i, size: %i", (uint32)id, asRaw->Value.size()); + asRaw->toString(std::cout); + nldebug("x"); + nlwarning("not important"); + if (HaltOnIssue) + { + std::string x; + std::cin >> x; + } + break; + } + str = rewritePathFinal(str); + asRaw->Value.resize(str.size() + 11 + 4 + 1); + memcpy(&asRaw->Value[15], &str[0], str.size()); + ((uint32 *)&asRaw->Value[11])[0] = str.size() + 1; + asRaw->Value[asRaw->Value.size() - 1] = 0; + break; + } + case 304: + if (hasImportantFilePath(asRaw)) + { + // null term c string + nlassert(asRaw->Value[asRaw->Value.size() - 1] == 0); + std::string str; + str.resize(asRaw->Value.size() - 1); + memcpy(&str[0], &asRaw->Value[0], str.size()); + if (!isImportantFilePath(str)) + { + nlinfo("Id: %i", (uint32)id); + asRaw->toString(std::cout); + nlerror("not important"); + } + str = rewritePathFinal(str); + asRaw->Value.resize(str.size() + 1); + memcpy(&asRaw->Value[0], &str[0], str.size()); + asRaw->Value[asRaw->Value.size() - 1] = 0; + break; + } + case 9730: + if (asRaw->Value.size() > 0 && asRaw->Value[0] == 'I') + { + // ignore Init.max + break; + } + default: + if (hasImportantFilePath(asRaw)) + { + nlinfo("Id: %i", (uint32)id); + asRaw->toString(std::cout); + nlwarning("Found important file path"); + if (HaltOnIssue) + { + std::string x; + std::cin >> x; + } + return; + } + break; + } + } +} + +void fixChunks(CStorageContainer *container) +{ + for (CStorageContainer::TStorageObjectConstIt it = container->chunks().begin(), end = container->chunks().end(); it != end; ++it) + { + if (it->second->isContainer()) + { + fixChunks(static_cast(it->second)); + } + else + { + fixChunk(it->first, it->second); + } + } +} + +void handleFile(const std::string &path) +{ + GError *err = NULL; + + GsfDocMetaData *metadata = gsf_doc_meta_data_new(); + nlassert(metadata); + + GsfInput *src = gsf_input_stdio_new(path.c_str(), &err); + if (err) { nlerror("GSF Failed to open %s", path.c_str()); return; } + + GsfInfile *infile = gsf_infile_msole_new(src, NULL); + if (!infile) { nlerror("GSF Failed to recognize %s", path.c_str()); return; } + g_object_unref(src); + + uint8 classId[16]; + if (!gsf_infile_msole_get_class_id((GsfInfileMSOle *)infile, classId)) + nlerror("GSF Did not find classId"); + + PIPELINE::MAX::CStorageContainer videoPostQueue; + serializeStorageContainer(&videoPostQueue, infile, "VideoPostQueue"); + PIPELINE::MAX::CStorageContainer config; + serializeStorageContainer(&config, infile, "Config"); + PIPELINE::MAX::CStorageContainer classData; + serializeStorageContainer(&classData, infile, "ClassData"); + + std::vector summaryInformation; + serializeRaw(summaryInformation, infile, "\05SummaryInformation"); + + std::vector documentSummaryInformation; + serializeRaw(documentSummaryInformation, infile, "\05DocumentSummaryInformation"); // Can't read this, don't care. + + PIPELINE::MAX::CDllDirectory dllDirectory; + serializeStorageContainer(&dllDirectory, infile, "DllDirectory"); + dllDirectory.parse(VersionUnknown); + + PIPELINE::MAX::CClassDirectory3 classDirectory3(&dllDirectory); + serializeStorageContainer(&classDirectory3, infile, "ClassDirectory3"); + classDirectory3.parse(VersionUnknown); + + PIPELINE::MAX::CScene scene(&SceneClassRegistry, &dllDirectory, &classDirectory3); + serializeStorageContainer(&scene, infile, "Scene"); + + if (DebugParser) + { + // Not parsing the scene for this function. + scene.parse(VersionUnknown); + scene.clean(); + } + + /* + PIPELINE::MAX::CStorageContainer dllDirectory; + serializeStorageContainer(&dllDirectory, infile, "DllDirectory"); + + PIPELINE::MAX::CStorageContainer classDirectory3; + serializeStorageContainer(&classDirectory3, infile, "ClassDirectory3"); + + PIPELINE::MAX::CStorageContainer scene; + serializeStorageContainer(&scene, infile, "Scene"); + */ + + if (DisplayStream) + { + videoPostQueue.toString(std::cout); + config.toString(std::cout); + classData.toString(std::cout); + dllDirectory.toString(std::cout); + classDirectory3.toString(std::cout); + scene.toString(std::cout); + } + + if (DebugParser) + { + // Not parsing the scene for this function. + scene.build(VersionUnknown); + scene.disown(); + } + + g_object_unref(infile); + + if (ReplacePaths) + { + fixChunks(&classData); + fixChunks(&scene); + } + if (ReplaceMapExt) + { + // Parse the scene + scene.parse(VersionUnknown); + NLMISC::CClassId editMeshClassId = NLMISC::CClassId(0x00000050, 0x00000000); + NLMISC::CClassId editableMeshClassId = NLMISC::CClassId(0xe44f10b3, 0x00000000); + // from: (0x2ec82081, 0x045a6271) + NLMISC::CClassId fromClassId = NLMISC::CClassId(0x2ec82081, 0x045a6271); + // Find all object space modifier derived containing map extender + for (CStorageContainer::TStorageObjectConstIt it = scene.container()->chunks().begin(), end = scene.container()->chunks().end(); it != end; ++it) + { + if (it->first == 0x2032) // Derived Object + { + // nldebug("Found derived object"); + CReferenceMaker *derivedObject = dynamic_cast(it->second); + nlassert(derivedObject); + + // Find map extender in the modifier stack + uint mapExtenderIndex = 0; + CReferenceMaker *mapExtender = NULL; + for (uint i = 0; i < derivedObject->nbReferences(); ++i) + { + if (derivedObject->getReference(i) && derivedObject->getReference(i)->classDesc()->classId() == fromClassId) + { + nldebug("Found map extender at '%i' / '%i'!", i, derivedObject->nbReferences()); + mapExtenderIndex = i; + mapExtender = derivedObject->getReference(i); + + bool deleteDerivedGeom = false; + CStorageContainer *derivedData = dynamic_cast(derivedObject->findStorageObject(0x2500, mapExtenderIndex)); + nlassert(derivedData); + CStorageContainer *derivedGeom = dynamic_cast(derivedData->findStorageObject(0x2512)); + if (!derivedGeom) + { + CStorageRaw *derivedGeomRaw = dynamic_cast(derivedData->findStorageObject(0x2512)); + if (derivedGeomRaw) + { + nlwarning("Derived geometry raw instead of as container"); + NLMISC::CMemStream memGeom; + derivedGeomRaw->serial(memGeom); + uint size = memGeom.getPos(); + memGeom.invert(); + derivedGeom = new CStorageContainer(); + deleteDerivedGeom = true; + derivedGeom->serial(memGeom, size); + } + else + { + derivedData->toString(std::cout); + nlwarning("derived geometry missing!!!"); + if (HaltOnIssue) + { + std::string x; + std::cin >> x; + } + continue; + } + } + CStorageRaw *derivedVertices = dynamic_cast(derivedGeom->findStorageObject(0x03e9)); + if (!derivedVertices) + { + derivedGeom->toString(std::cout); + nlwarning("derived vertices missing!!!"); + if (HaltOnIssue) + { + std::string x; + std::cin >> x; + } + continue; + } + CStorageRaw *derivedIndices = dynamic_cast(derivedGeom->findStorageObject(0x03eb)); + if (!derivedIndices) + { + derivedGeom->toString(std::cout); + nlwarning("derived indices missing!!!"); + if (HaltOnIssue) + { + std::string x; + std::cin >> x; + } + continue; + } + + CStorageContainer::TStorageObjectContainer &mapChunks = const_cast(mapExtender->chunks()); + + // CStorageContainer::TStorageObjectWithId + + nlassert(derivedVertices->Value.size() % 12 == 0); + nlassert(derivedIndices->Value.size() % 12 == 0); + uint32 nbVertices = derivedVertices->Value.size() / 12; + uint32 nbFaces = derivedIndices->Value.size() / 12; + nldebug("Vertices: %i", nbVertices); + nldebug("Faces: %i", nbFaces); + + // Write vertex chunks + CStorageValue *chunkVertCount = new CStorageValue(); + chunkVertCount->Value = nbVertices; + mapChunks.push_back(CStorageContainer::TStorageObjectWithId(0x0100, chunkVertCount)); + + CStorageRaw *chunkVerts = new CStorageRaw(); + NLMISC::CMemStream memVerts; + derivedVertices->serial(memVerts); + chunkVerts->setSize(memVerts.getPos()); + memVerts.invert(); + chunkVerts->serial(memVerts); + mapChunks.push_back(CStorageContainer::TStorageObjectWithId(0x0110, chunkVerts)); + + // Write face chunks + CStorageValue *chunkFaceCount = new CStorageValue(); + chunkFaceCount->Value = nbFaces; + mapChunks.push_back(CStorageContainer::TStorageObjectWithId(0x0230, chunkFaceCount)); + + CStorageRaw *chunkFaces = new CStorageRaw(); + NLMISC::CMemStream memFaces; + derivedIndices->serial(memFaces); + chunkFaces->setSize(memFaces.getPos()); + memFaces.invert(); + chunkFaces->serial(memFaces); + mapChunks.push_back(CStorageContainer::TStorageObjectWithId(0x0240, chunkFaces)); + + // Write geom points + CStorageValue *chunkGeomPointCount = new CStorageValue(); + chunkGeomPointCount->Value = nbVertices; // derived vertices? + mapChunks.push_back(CStorageContainer::TStorageObjectWithId(0x0320, chunkGeomPointCount)); + + CStorageRaw *chunkGeomPoints = new CStorageRaw(); + NLMISC::CMemStream memGeomPoints; + derivedVertices->serial(memGeomPoints); // derived vertices? + chunkGeomPoints->setSize(memGeomPoints.getPos()); + memGeomPoints.invert(); + chunkGeomPoints->serial(memGeomPoints); + mapChunks.push_back(CStorageContainer::TStorageObjectWithId(0x0330, chunkGeomPoints)); + + if (deleteDerivedGeom) + delete derivedGeom; + + // /*break;*/ + nldebug("Converted!"); + } + } + + if (mapExtender) + { + uint editMeshIndex; + CReferenceMaker *editMesh = NULL; + for (uint i = 0; i < derivedObject->nbReferences(); ++i) + { + if (derivedObject->getReference(i) && derivedObject->getReference(i)->classDesc()->classId() == editMeshClassId) + { + nldebug("Found edit mesh at '%i' / '%i'!", i, derivedObject->nbReferences()); + editMeshIndex = i; + editMesh = derivedObject->getReference(i); + + // Ensure no selection + + CStorageContainer::TStorageObjectContainer &meshChunks = const_cast(editMesh->chunks()); + + // Ensure no selection + for (CStorageContainer::TStorageObjectIterator it = meshChunks.begin(), end = meshChunks.end(); it != end; ) + { + CStorageContainer::TStorageObjectIterator next = it; ++next; + switch (it->first) + { + case 0x2800: + nldebug("Override selection"); + { + delete it->second; + CStorageValue *v = new CStorageValue(); + v->Value = 0; + it->second = v; + } + break; + } + it = next; + } + + // /*break;*/ + } + } + + uint editableMeshIndex; + CReferenceMaker *editableMesh = NULL; + for (uint i = 0; i < derivedObject->nbReferences(); ++i) + { + if (derivedObject->getReference(i) && derivedObject->getReference(i)->classDesc()->classId() == editableMeshClassId) + { + nldebug("Found editable mesh at '%i' / '%i'!", i, derivedObject->nbReferences()); + editableMeshIndex = i; + editableMesh = derivedObject->getReference(i); + + CStorageContainer::TStorageObjectContainer &meshChunks = const_cast(editableMesh->chunks()); + + // Ensure no selection + for (CStorageContainer::TStorageObjectIterator it = meshChunks.begin(), end = meshChunks.end(); it != end; ) + { + CStorageContainer::TStorageObjectIterator next = it; ++next; + switch (it->first) + { + case 0x2845: + case 0x2846: + case 0x2847: + case 0x2849: + case 0x2850: + case 0x3001: + case 0x3003: + case 0x3004: + nldebug("Erase selection"); + meshChunks.erase(it); + break; + case 0x4038: + nldebug("Override selection"); + { + delete it->second; + CStorageValue *v = new CStorageValue(); + v->Value = 0; + it->second = v; + } + break; + } + it = next; + } + + // /*break;*/ + } + } + + if (editableMesh && editableMeshIndex + 1 != derivedObject->nbReferences()) + { + nlwarning("Editable mesh not at bottom of the stack, this is unpossible!"); + std::string x; + std::cin >> x; + continue; + } +/* + if (editableMesh == NULL || editMesh == NULL) + { + derivedObject->toString(std::cout); + nlwarning("editable mesh or edit mesh not found"); + std::string x; + std::cin >> x; + continue; + } + + // + //derivedObject->toString(std::cout); + //editableMesh->toString(std::cout); + + // derivedObject -> 0x2500 -> 0x2512 -> 0x03e9 / 0x03eb + // editableMesh -> 0x08fe (geom) -> 0x0916 / 0x0918 + + CStorageContainer *editableMeshGeometry = dynamic_cast(editableMesh->findStorageObject(0x08fe)); + // nlassert(editableMeshGeometry); + if (!editableMeshGeometry) + { + nlwarning("broken"); + std::string x; + std::cin >> x; + continue; + } + CStorageRaw *editableVertices = dynamic_cast(editableMeshGeometry->findStorageObject(0x0916)); + nlassert(editableVertices); + CStorageRaw *editableIndices = dynamic_cast(editableMeshGeometry->findStorageObject(0x0918)); + nlassert(editableIndices); + + //return new CStorageArraySizePre(); + if (derivedIndices->Value.size() != editableIndices->Value.size()) + { + editableMesh->toString(std::cout); + derivedObject->toString(std::cout); + nlwarning("size mismatch"); + std::string x; + std::cin >> x; + continue; + } + + editableVertices->Value.clear(); + editableIndices->Value.clear(); + + nlassert(derivedVertices->Value.size() % 12 == 0); + uint32 nbVertices = derivedVertices->Value.size() / 12; + NLMISC::CMemStream memVertices; + memVertices.serial(nbVertices); + derivedVertices->serial(memVertices); + memVertices.invert(); + editableVertices->setSize(derivedVertices->Value.size() + 4); + editableVertices->serial(memVertices); + + NLMISC::CMemStream memIndices; + derivedIndices->serial(memIndices); + memIndices.invert(); + editableIndices->setSize(derivedIndices->Value.size()); + editableIndices->serial(memIndices); + nldebug("ok!");*/ + } + } + } + // to: (0x02df2e3a, 0x72ba4e1f) + NLMISC::CClassId toClassId = NLMISC::CClassId(0x02df2e3a, 0x72ba4e1f); // uvw unwrap + // NLMISC::CClassId toClassId = NLMISC::CClassId(0x5c5b50f7,0x60397ca1); // converttomesh :| + // NLMISC::CClassId toClassId = NLMISC::CClassId(0x31f9c666, 0x03b4a577); // uvw mapping add + // dllname to: uvwunwrap.dlm + for (CStorageContainer::TStorageObjectConstIt it = classDirectory3.chunks().begin(), end = classDirectory3.chunks().end(); it != end; ++it) + { + CClassEntry *classEntry = dynamic_cast(it->second); + if (classEntry) + { + //nldebug("class entry %s", classEntry->classId().toString().c_str()); + if (classEntry->classId() == fromClassId) + { + nldebug("Found class id to replace!"); + classEntry->overrideClassId(toClassId); + CDllEntry *dllEntry = const_cast(dllDirectory.get(classEntry->dllIndex())); + dllEntry->overrideDllFilename(ucstring("uvwunwrap.dlm")); + } + } + //else nldebug("not class entry"); + } + // Disown the scene + scene.disown(); + } + + dllDirectory.disown(); + classDirectory3.disown(); + if (WriteModified) + { + const char *outpath = (WriteDummy ? "testdummy.max" : path.c_str()); + GsfOutput *output; + GsfOutfile *outfile; + + output = gsf_output_stdio_new(outpath, &err); + if (err) { nlerror("GSF Failed to create %s", outpath); return; } + outfile = gsf_outfile_msole_new(output); + g_object_unref(G_OBJECT(output)); + + serializeStorageContainer(&videoPostQueue, outfile, "VideoPostQueue"); + serializeStorageContainer(&scene, outfile, "Scene"); + serializeStorageContainer(&dllDirectory, outfile, "DllDirectory"); + serializeStorageContainer(&config, outfile, "Config"); + serializeStorageContainer(&classDirectory3, outfile, "ClassDirectory3"); + serializeStorageContainer(&classData, outfile, "ClassData"); + serializeRaw(summaryInformation, outfile, "\05SummaryInformation"); + serializeRaw(documentSummaryInformation, outfile, "\05DocumentSummaryInformation"); + + if (!gsf_outfile_msole_set_class_id((GsfOutfileMSOle *)outfile, classId)) + nlerror("GSF Cannot write class id"); + + gsf_output_close(GSF_OUTPUT(outfile)); + g_object_unref(G_OBJECT(outfile)); + + if (WriteDummy) + { + nlinfo("Dummy written, press key for next"); + std::string x; + std::cin >> x; + } + } + + g_object_unref(metadata); +} + +// int __stdcall WinMain(void *, void *, void *, int) +int main(int argc, char **argv) +{ + // Initialise gsf + printf("Pipeline Max Rewrite Assets\n"); + char const *me = (argv[0] ? argv[0] : "pipeline_max_rewrite_assets"); + g_set_prgname(me); + gsf_init(); + + // Register all plugin classes + CBuiltin::registerClasses(&SceneClassRegistry); + CUpdate1::registerClasses(&SceneClassRegistry); + CEPoly::registerClasses(&SceneClassRegistry); + + //handleFile("/srv/work/database/interfaces/anims_max/cp_fy_hof_species.max"); + runInitialize(); + runHandler(); + //handleFile(nativeDatabasePath("w:\\database\\landscape\\ligo\\desert\\max\\zonematerial-converted-brandon.max")); // overrideFF + //handleFile(nativeDatabasePath("w:\\database\\landscape\\ligo\\desert\\max\\zonematerial-converted-154_dz.max")); // overrideFF + //handleFile(nativeDatabasePath("w:\\database\\landscape\\ligo\\lacustre\\max\\zonematerial-converted-village_a.max")); + //handleFile(nativeDatabasePath("w:\\database\\stuff\\generique\\agents\\accessories\\ge_mission_reward_karavan_bigshield.max")); + //handleFile(nativeDatabasePath("w:\\database\\stuff\\generique\\agents\\accessories\\ge_acc_pick_o.max")); + //handleFile(nativeDatabasePath("w:\\database\\stuff\\generique\\agents\\accessories\\ge_zo_wea_trib_masse1m.max")); + //handleFile(nativeDatabasePath("w:\\database\\stuff\\generique\\agents\\accessories\\ge_fy_wea_trib_grand_bouclier.max")); + //handleFile(nativeDatabasePath("w:\\database\\stuff\\generique\\agents\\accessories\\ge_mission_entrepot.max")); + //handleFile(nativeDatabasePath("w:\\database\\stuff\\generique\\agents\\accessories\\mesh_wip\\all_trib_weapons.max")); + //handleFile("/srv/work/database/landscape/ligo/jungle/max/zonematerial-foret-ruine_boss.max"); + //handleFile("/srv/work/database/stuff/fyros/agents/actors/male/animation/anims_non_utilisees/fy_hom_assis_boire_verre.max"); + //handleFile("/home/kaetemi/3dsMax/scenes/test_clear_add_uvw.max"); + //runScanner(); + + gsf_shutdown(); + + return 0; +} + From 440d0a5f311986683e994dddc10a56a59374167c Mon Sep 17 00:00:00 2001 From: kaetemi Date: Tue, 23 Apr 2019 03:05:01 +0800 Subject: [PATCH 13/14] Update build settings --- .gitignore | 2 +- azure-pipelines.yml | 16 ++++-- code/CMakeModules/FindGOBJECT2.cmake | 51 +++++++++++++++++++ code/nel/tools/3d/pipeline_max/CMakeLists.txt | 7 +++ .../tools/3d/pipeline_max_dump/CMakeLists.txt | 7 +++ code/nel/tools/3d/pipeline_max_dump/main.cpp | 36 ++++++------- .../CMakeLists.txt | 7 +++ .../3d/pipeline_max_rewrite_assets/main.cpp | 36 ++++++------- 8 files changed, 120 insertions(+), 42 deletions(-) create mode 100644 code/CMakeModules/FindGOBJECT2.cmake diff --git a/.gitignore b/.gitignore index 1d7b8efd4..1f3f7abba 100644 --- a/.gitignore +++ b/.gitignore @@ -160,7 +160,7 @@ code/build/* code/build-2010/* build/* install/* -build_vc* +build_* code/nel/tools/build_gamedata/configuration/buildsite.py # Linux nel compile diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 6e0f2b2a7..cfb8b4696 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -12,20 +12,26 @@ jobs: sudo apt-get install gcc-8 g++-8 -y sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 60 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 60 - sudo apt-get install libmysqlclient-dev -y sudo apt-get install bison autoconf automake -y - sudo apt-get install libpng12-dev libjpeg62-dev -y + sudo apt-get install libpng12-dev -y + sudo apt-get install libjpeg-dev -y + sudo apt-get install libgif-dev libfreetype6-dev -y + sudo apt-get install freeglut3-dev -y sudo apt-get install liblua5.1-dev libluabind-dev libcpptest-dev -y sudo apt-get install libogg-dev libvorbis-dev libopenal-dev -y - sudo apt-get install libgif-dev libfreetype6-dev -y + sudo apt-get install libavcodec-dev libavformat-dev libavdevice-dev libswscale-dev libpostproc-dev -y + sudo apt-get install libmysqlclient-dev -y sudo apt-get install libxml2-dev -y - sudo apt-get install libcurl4-openssl-dev -y + sudo apt-get install libcurl4-openssl-dev libssl-dev -y + sudo apt-get install libsquish-dev -y + sudo apt-get install liblzma-dev -y + sudo apt-get install libgsf-1-dev -y displayName: 'Dependencies' - script: | mkdir build cmake --version cd build - cmake -DWITH_NEL_TESTS=OFF -DWITH_NEL_SAMPLES=ON -DWITH_LUA51=ON -DWITH_RYZOM_SERVER=ON -DWITH_RYZOM_TOOLS=OFF -DWITH_NEL_TOOLS=OFF ../code + cmake -DWITH_STATIC=ON -DWITH_NEL_TESTS=OFF -DWITH_NEL_SAMPLES=ON -DWITH_LUA51=ON -DWITH_RYZOM_SERVER=ON -DWITH_RYZOM_TOOLS=OFF -DWITH_NEL_TOOLS=ON -DWITH_LIBGSF=ON ../code cat CMakeCache.txt displayName: 'CMake' - script: | diff --git a/code/CMakeModules/FindGOBJECT2.cmake b/code/CMakeModules/FindGOBJECT2.cmake new file mode 100644 index 000000000..d0d4cda0d --- /dev/null +++ b/code/CMakeModules/FindGOBJECT2.cmake @@ -0,0 +1,51 @@ +# - Try to find GObject2 +# Find GObject2 headers, libraries and the answer to all questions. +# +# GOBJECT2_FOUND True if GOBJECT2 got found +# GOBJECT2_INCLUDE_DIRS Location of GOBJECT2 headers +# GOBJECT2_LIBRARIES List of libraries to use GOBJECT2 +# +# Copyright (c) 2008 Bjoern Ricks +# +# Redistribution and use is allowed according to the terms of the New +# BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +# + +INCLUDE( FindPkgConfig ) + +IF ( GOBJECT2_FIND_REQUIRED ) + SET( _pkgconfig_REQUIRED "REQUIRED" ) +ELSE( GOBJECT2_FIND_REQUIRED ) + SET( _pkgconfig_REQUIRED "" ) +ENDIF ( GOBJECT2_FIND_REQUIRED ) + +IF ( GOBJECT2_MIN_VERSION ) + PKG_SEARCH_MODULE( GOBJECT2 ${_pkgconfig_REQUIRED} gobject-2.0>=${GOBJECT2_MIN_VERSION} ) +ELSE ( GOBJECT2_MIN_VERSION ) + PKG_SEARCH_MODULE( GOBJECT2 ${_pkgconfig_REQUIRED} gobject-2.0 ) +ENDIF ( GOBJECT2_MIN_VERSION ) + + +IF( NOT GOBJECT2_FOUND AND NOT PKG_CONFIG_FOUND ) + FIND_PATH( GOBJECT2_INCLUDE_DIRS gobject/gobject.h PATH_SUFFIXES glib-2.0) + FIND_LIBRARY( GOBJECT2_LIBRARIES gobject-2.0 ) + + # Report results + IF ( GOBJECT2_LIBRARIES AND GOBJECT2_INCLUDE_DIRS ) + SET( GOBJECT2_FOUND 1 ) + IF ( NOT GOBJECT2_FIND_QUIETLY ) + MESSAGE( STATUS "Found GOBJECT2: ${GOBJECT2_LIBRARIES}" ) + ENDIF ( NOT GOBJECT2_FIND_QUIETLY ) + ELSE ( GOBJECT2_LIBRARIES AND GOBJECT2_INCLUDE_DIRS ) + IF ( GOBJECT2_FIND_REQUIRED ) + MESSAGE( SEND_ERROR "Could NOT find GOBJECT2" ) + ELSE ( GOBJECT2_FIND_REQUIRED ) + IF ( NOT GOBJECT2_FIND_QUIETLY ) + MESSAGE( STATUS "Could NOT find GOBJECT2" ) + ENDIF ( NOT GOBJECT2_FIND_QUIETLY ) + ENDIF ( GOBJECT2_FIND_REQUIRED ) + ENDIF ( GOBJECT2_LIBRARIES AND GOBJECT2_INCLUDE_DIRS ) +ENDIF( NOT GOBJECT2_FOUND AND NOT PKG_CONFIG_FOUND ) + +MARK_AS_ADVANCED( GOBJECT2_LIBRARIES GOBJECT2_INCLUDE_DIRS ) diff --git a/code/nel/tools/3d/pipeline_max/CMakeLists.txt b/code/nel/tools/3d/pipeline_max/CMakeLists.txt index f80176150..9bc0086aa 100644 --- a/code/nel/tools/3d/pipeline_max/CMakeLists.txt +++ b/code/nel/tools/3d/pipeline_max/CMakeLists.txt @@ -5,6 +5,12 @@ IF (NOT (LIBGSF_INCLUDE_DIR AND LIBGSF_LIBRARIES)) MESSAGE(FATAL_ERROR "LIBGSF not found!") ENDIF (NOT (LIBGSF_INCLUDE_DIR AND LIBGSF_LIBRARIES)) +FIND_PACKAGE(GOBJECT2) + +if (NOT GOBJECT2_FOUND) + MESSAGE(FATAL_ERROR "GOBJECT2 not found!") +ENDIF (NOT GOBJECT2_FOUND) + FIND_PACKAGE(GLIB2) if (NOT GLIB2_FOUND) @@ -25,6 +31,7 @@ NL_TARGET_LIB(pipeline_max TARGET_LINK_LIBRARIES(pipeline_max ${LIBGSF_LIBRARIES} ${GLIB2_LIBRARIES} + ${GOBJECT2_LIBRARIES} nelmisc ) diff --git a/code/nel/tools/3d/pipeline_max_dump/CMakeLists.txt b/code/nel/tools/3d/pipeline_max_dump/CMakeLists.txt index d079d9000..5582079a1 100644 --- a/code/nel/tools/3d/pipeline_max_dump/CMakeLists.txt +++ b/code/nel/tools/3d/pipeline_max_dump/CMakeLists.txt @@ -5,6 +5,12 @@ IF (NOT (LIBGSF_INCLUDE_DIR AND LIBGSF_LIBRARIES)) MESSAGE(FATAL_ERROR "LIBGSF not found!") ENDIF (NOT (LIBGSF_INCLUDE_DIR AND LIBGSF_LIBRARIES)) +FIND_PACKAGE(GOBJECT2) + +if (NOT GOBJECT2_FOUND) + MESSAGE(FATAL_ERROR "GOBJECT2 not found!") +ENDIF (NOT GOBJECT2_FOUND) + FIND_PACKAGE(GLIB2) if (NOT GLIB2_FOUND) @@ -25,6 +31,7 @@ ADD_EXECUTABLE(pipeline_max_dump TARGET_LINK_LIBRARIES(pipeline_max_dump ${LIBGSF_LIBRARIES} ${GLIB2_LIBRARIES} + ${GOBJECT2_LIBRARIES} pipeline_max nelmisc ) diff --git a/code/nel/tools/3d/pipeline_max_dump/main.cpp b/code/nel/tools/3d/pipeline_max_dump/main.cpp index 58c366831..e74d0ec11 100644 --- a/code/nel/tools/3d/pipeline_max_dump/main.cpp +++ b/code/nel/tools/3d/pipeline_max_dump/main.cpp @@ -38,26 +38,26 @@ #include #include -#include "../max/storage_stream.h" -#include "../max/storage_object.h" -#include "../max/dll_directory.h" -#include "../max/class_directory_3.h" -#include "../max/class_data.h" -#include "../max/config.h" -#include "../max/scene.h" -#include "../max/scene_class_registry.h" +#include "../pipeline_max/storage_stream.h" +#include "../pipeline_max/storage_object.h" +#include "../pipeline_max/dll_directory.h" +#include "../pipeline_max/class_directory_3.h" +#include "../pipeline_max/class_data.h" +#include "../pipeline_max/config.h" +#include "../pipeline_max/scene.h" +#include "../pipeline_max/scene_class_registry.h" // Testing -#include "../max/builtin/builtin.h" -#include "../max/update1/update1.h" -#include "../max/epoly/epoly.h" +#include "../pipeline_max/builtin/builtin.h" +#include "../pipeline_max/update1/update1.h" +#include "../pipeline_max/epoly/epoly.h" -#include "../max/builtin/storage/app_data.h" -#include "../max/builtin/storage/geom_buffers.h" -#include "../max/builtin/scene_impl.h" -#include "../max/builtin/i_node.h" -#include "../max/update1/editable_mesh.h" -#include "../max/epoly/editable_poly.h" +#include "../pipeline_max/builtin/storage/app_data.h" +#include "../pipeline_max/builtin/storage/geom_buffers.h" +#include "../pipeline_max/builtin/scene_impl.h" +#include "../pipeline_max/builtin/i_node.h" +#include "../pipeline_max/update1/editable_mesh.h" +#include "../pipeline_max/epoly/editable_poly.h" using namespace PIPELINE::MAX; using namespace PIPELINE::MAX::BUILTIN; @@ -71,7 +71,7 @@ using namespace PIPELINE::MAX::EPOLY; //static const char *filename = "/home/kaetemi/3dsMax/scenes/teapot_test_scene.max"; //static const char *filename = "/home/kaetemi/3dsMax/scenes/testplane.max"; //static const char *filename = "/home/kaetemi/3dsMax/scenes/geomobjects.max"; -static const char *filename = "/mnt/tsurugi/ryzom-assets/database/landscape/ligo/desert/max/zonematerial-converted-165_eg.max"; +static const char *filename = "/mnt/tsurugi/ryzom-assets/database/landscape/ligo/desert/pipeline_max/zonematerial-converted-165_eg.max"; static const char *streamname = "Scene"; #define PBMS_GEOM_BUFFERS_POLY_A_VERTEX_CHUNK_ID 0x0100 diff --git a/code/nel/tools/3d/pipeline_max_rewrite_assets/CMakeLists.txt b/code/nel/tools/3d/pipeline_max_rewrite_assets/CMakeLists.txt index 4aa8a6652..556dde895 100644 --- a/code/nel/tools/3d/pipeline_max_rewrite_assets/CMakeLists.txt +++ b/code/nel/tools/3d/pipeline_max_rewrite_assets/CMakeLists.txt @@ -5,6 +5,12 @@ IF (NOT (LIBGSF_INCLUDE_DIR AND LIBGSF_LIBRARIES)) MESSAGE(FATAL_ERROR "LIBGSF not found!") ENDIF (NOT (LIBGSF_INCLUDE_DIR AND LIBGSF_LIBRARIES)) +FIND_PACKAGE(GOBJECT2) + +if (NOT GOBJECT2_FOUND) + MESSAGE(FATAL_ERROR "GOBJECT2 not found!") +ENDIF (NOT GOBJECT2_FOUND) + FIND_PACKAGE(GLIB2) if (NOT GLIB2_FOUND) @@ -25,6 +31,7 @@ ADD_EXECUTABLE(pipeline_max_rewrite_assets TARGET_LINK_LIBRARIES(pipeline_max_rewrite_assets ${LIBGSF_LIBRARIES} ${GLIB2_LIBRARIES} + ${GOBJECT2_LIBRARIES} pipeline_max nelmisc ) diff --git a/code/nel/tools/3d/pipeline_max_rewrite_assets/main.cpp b/code/nel/tools/3d/pipeline_max_rewrite_assets/main.cpp index 4a7aca040..fc07a0e18 100644 --- a/code/nel/tools/3d/pipeline_max_rewrite_assets/main.cpp +++ b/code/nel/tools/3d/pipeline_max_rewrite_assets/main.cpp @@ -47,26 +47,26 @@ #include "nel/misc/file.h" #include "nel/misc/mem_stream.h" -#include "../max/storage_stream.h" -#include "../max/storage_object.h" -#include "../max/dll_directory.h" -#include "../max/class_directory_3.h" -#include "../max/class_data.h" -#include "../max/config.h" -#include "../max/scene.h" -#include "../max/scene_class_registry.h" +#include "../pipeline_max/storage_stream.h" +#include "../pipeline_max/storage_object.h" +#include "../pipeline_max/dll_directory.h" +#include "../pipeline_max/class_directory_3.h" +#include "../pipeline_max/class_data.h" +#include "../pipeline_max/config.h" +#include "../pipeline_max/scene.h" +#include "../pipeline_max/scene_class_registry.h" // Testing -#include "../max/builtin/builtin.h" -#include "../max/update1/update1.h" -#include "../max/epoly/epoly.h" +#include "../pipeline_max/builtin/builtin.h" +#include "../pipeline_max/update1/update1.h" +#include "../pipeline_max/epoly/epoly.h" -#include "../max/builtin/storage/app_data.h" -#include "../max/builtin/storage/geom_buffers.h" -#include "../max/builtin/scene_impl.h" -#include "../max/builtin/i_node.h" -#include "../max/update1/editable_mesh.h" -#include "../max/epoly/editable_poly.h" +#include "../pipeline_max/builtin/storage/app_data.h" +#include "../pipeline_max/builtin/storage/geom_buffers.h" +#include "../pipeline_max/builtin/scene_impl.h" +#include "../pipeline_max/builtin/i_node.h" +#include "../pipeline_max/update1/editable_mesh.h" +#include "../pipeline_max/epoly/editable_poly.h" #include using namespace std; @@ -1506,7 +1506,7 @@ int main(int argc, char **argv) //handleFile(nativeDatabasePath("w:\\database\\stuff\\generique\\agents\\accessories\\ge_fy_wea_trib_grand_bouclier.max")); //handleFile(nativeDatabasePath("w:\\database\\stuff\\generique\\agents\\accessories\\ge_mission_entrepot.max")); //handleFile(nativeDatabasePath("w:\\database\\stuff\\generique\\agents\\accessories\\mesh_wip\\all_trib_weapons.max")); - //handleFile("/srv/work/database/landscape/ligo/jungle/max/zonematerial-foret-ruine_boss.max"); + //handleFile("/srv/work/database/landscape/ligo/jungle/pipeline_max/zonematerial-foret-ruine_boss.max"); //handleFile("/srv/work/database/stuff/fyros/agents/actors/male/animation/anims_non_utilisees/fy_hom_assis_boire_verre.max"); //handleFile("/home/kaetemi/3dsMax/scenes/test_clear_add_uvw.max"); //runScanner(); From e10834fd585815afa06e6ae4e26a8b671d81812b Mon Sep 17 00:00:00 2001 From: kaetemi Date: Tue, 23 Apr 2019 05:37:36 +0800 Subject: [PATCH 14/14] Add option to rewrite file only on changes --- .../3d/pipeline_max_rewrite_assets/main.cpp | 122 +++++++++++++----- 1 file changed, 87 insertions(+), 35 deletions(-) diff --git a/code/nel/tools/3d/pipeline_max_rewrite_assets/main.cpp b/code/nel/tools/3d/pipeline_max_rewrite_assets/main.cpp index fc07a0e18..e28d87627 100644 --- a/code/nel/tools/3d/pipeline_max_rewrite_assets/main.cpp +++ b/code/nel/tools/3d/pipeline_max_rewrite_assets/main.cpp @@ -87,15 +87,16 @@ bool DisplayStream = false; bool DisplayReplaces = false; bool ReplacePaths = true; -bool ReplaceMapExt = true; +bool ReplaceMapExt = false; +bool WritePathChangesOnly = true; bool WriteModified = true; bool WriteDummy = false; bool HaltOnIssue = false; const char *DatabaseDirectory = "w:\\database\\"; -const char *LinuxDatabaseDirectory = "/mnt/tsurugi/ryzom-assets/database/"; +const char *LinuxDatabaseDirectory = "/mnt/y/ryzom-assets/database/"; bool RunningLinux = true; //const char *SrcDirectoryRecursive = "w:\\database\\interfaces\\"; @@ -103,7 +104,8 @@ bool RunningLinux = true; //const char *SrcDirectoryRecursive = "w:\\database\\stuff\\fyros\\city\\newpositionville\\"; const char *SrcDirectoryRecursiveInit = "w:\\database\\"; //const char *SrcDirectoryRecursiveHandle = "w:\\database\\stuff\\generique\\agents\\accessories\\"; -const char *SrcDirectoryRecursiveHandle = "w:\\database\\landscape\\ligo\\primes_racines\\max\\"; +//const char *SrcDirectoryRecursiveHandle = "w:\\database\\landscape\\ligo\\primes_racines\\max\\"; +const char *SrcDirectoryRecursiveHandle = "w:\\database\\stuff\\fyros\\decors\\constructions\\"; bool UseFallbackTga = false; const char *FallbackTga = "w:\\database\\stuff\\lod_actors\\texture_lod\\trame.png"; @@ -204,6 +206,8 @@ inline char stripFrenchLocale(char c0) std::string rewritePath(const std::string &path, const std::string &databaseDirectory) { + // nldebug("Rewrite: %s", path.c_str()); + static std::set fileNameCache; std::string stdPath = standardizePath(path, false); @@ -597,9 +601,6 @@ void runHandler() nlinfo("DatabaseDirectory: '%s'", DatabaseDirectory); doDirectoryHandler(SrcDirectoryRecursiveHandle); - - for (std::set::iterator it = MissingFiles.begin(), end = MissingFiles.end(); it != end; ++it) - nlinfo("Missing: '%s'", (*it).c_str()); } void serializeStorageContainer(PIPELINE::MAX::CStorageContainer *storageContainer, GsfInfile *infile, const char *streamName) @@ -716,6 +717,8 @@ std::string rewritePathFinal(const std::string &str) bool isImportantFilePath(const std::string &str) { + // nldebug("Is important? %s", str.c_str()); + std::string strtrimmed = cleanString(str); if (strtrimmed.size() >= 4) { @@ -775,31 +778,51 @@ bool hasImportantFilePath(CStorageRaw *raw) return false; } -void fixChunk(uint16 id, IStorageObject *chunk) +bool fixChunk(uint16 id, IStorageObject *chunk) { + if (id == 4656) + { + // nldebug("testing 4656: %s", chunk->toString().c_str()); + } + bool changed = false; CStorageValue *asString = dynamic_cast *>(chunk); if (asString) { // nldebug("String: %s", asString->Value.c_str()); if (isImportantFilePath(asString->Value)) - asString->Value = rewritePathFinal(asString->Value); - return; + { + std::string rewritten = rewritePathFinal(asString->Value); + if (rewritten != asString->Value) + { + asString->Value = rewritten; + changed = true; + } + } + return changed; } CStorageValue *asUCString = dynamic_cast *>(chunk); if (asUCString) { // nldebug("UCString: %s", asUCString->Value.toUtf8().c_str()); if (isImportantFilePath(asUCString->Value.toString())) - asUCString->Value.fromUtf8(rewritePathFinal(asUCString->Value.toString())); - return; + { + std::string rewritten = rewritePathFinal(asUCString->Value.toString()); + if (rewritten != asUCString->Value.toString()) + { + asUCString->Value.fromUtf8(rewritten); + changed = true; + } + } + return changed; } CStorageRaw *asRaw = dynamic_cast(chunk); if (asRaw) { switch (id) { - case 256: case 4656: + // nldebug("4656: %s", chunk->toString().c_str()); + case 256: case 16385: case 288: // .max xref in classdata if (hasImportantFilePath(asRaw)) @@ -811,9 +834,14 @@ void fixChunk(uint16 id, IStorageObject *chunk) memcpy(&str[0], &asRaw->Value[0], asRaw->Value.size()); // nldebug("[%s]", str.toString().c_str()); nlassert(isImportantFilePath(str.toString())); - str.fromUtf8(rewritePathFinal(str.toString())); - asRaw->Value.resize(str.size() * 2); - memcpy(&asRaw->Value[0], &str[0], asRaw->Value.size()); + std::string rewritten = rewritePathFinal(str.toString()); + if (rewritten != str.toString()) + { + str.fromUtf8(rewritten); + asRaw->Value.resize(str.size() * 2); + memcpy(&asRaw->Value[0], &str[0], asRaw->Value.size()); + changed = true; + } break; } case 10: @@ -883,7 +911,7 @@ void fixChunk(uint16 id, IStorageObject *chunk) std::string x; std::cin >> x; } - return; + return changed; } std::string v; if (overrideFF && size == -1) @@ -907,7 +935,7 @@ void fixChunk(uint16 id, IStorageObject *chunk) std::string x; std::cin >> x; } - return; + return changed; } v.resize(v.size() - 1); // nldebug("%s", v.c_str()); @@ -924,7 +952,12 @@ void fixChunk(uint16 id, IStorageObject *chunk) if (isImportantFilePath(strings[i])) { foundone = true; - strings[i] = rewritePathFinal(strings[i]); + std::string rewritten = rewritePathFinal(strings[i]); + if (rewritten != strings[i]) + { + strings[i] = rewritten; + changed = true; + } } } nlassert(foundone); @@ -950,7 +983,7 @@ void fixChunk(uint16 id, IStorageObject *chunk) } //std::string x; //std::cin >> x; - return; + return changed; } std::string str; str.resize(size - 1); @@ -970,11 +1003,16 @@ void fixChunk(uint16 id, IStorageObject *chunk) } break; } - str = rewritePathFinal(str); - asRaw->Value.resize(str.size() + 11 + 4 + 1); - memcpy(&asRaw->Value[15], &str[0], str.size()); - ((uint32 *)&asRaw->Value[11])[0] = str.size() + 1; - asRaw->Value[asRaw->Value.size() - 1] = 0; + std::string rewritten = rewritePathFinal(str); + if (rewritten != str) + { + str = rewritten; + asRaw->Value.resize(str.size() + 11 + 4 + 1); + memcpy(&asRaw->Value[15], &str[0], str.size()); + ((uint32 *)&asRaw->Value[11])[0] = str.size() + 1; + asRaw->Value[asRaw->Value.size() - 1] = 0; + changed = true; + } break; } case 304: @@ -991,10 +1029,15 @@ void fixChunk(uint16 id, IStorageObject *chunk) asRaw->toString(std::cout); nlerror("not important"); } - str = rewritePathFinal(str); - asRaw->Value.resize(str.size() + 1); - memcpy(&asRaw->Value[0], &str[0], str.size()); - asRaw->Value[asRaw->Value.size() - 1] = 0; + std::string rewritten = rewritePathFinal(str); + if (rewritten != str) + { + str = rewritten; + asRaw->Value.resize(str.size() + 1); + memcpy(&asRaw->Value[0], &str[0], str.size()); + asRaw->Value[asRaw->Value.size() - 1] = 0; + changed = true; + } break; } case 9730: @@ -1014,26 +1057,29 @@ void fixChunk(uint16 id, IStorageObject *chunk) std::string x; std::cin >> x; } - return; + return changed; } break; } } + return changed; } -void fixChunks(CStorageContainer *container) +bool fixChunks(CStorageContainer *container) { + bool changed = false; for (CStorageContainer::TStorageObjectConstIt it = container->chunks().begin(), end = container->chunks().end(); it != end; ++it) { if (it->second->isContainer()) { - fixChunks(static_cast(it->second)); + changed = (changed || fixChunks(static_cast(it->second))); } else { - fixChunk(it->first, it->second); + changed = (changed || fixChunk(it->first, it->second)); } } + return changed; } void handleFile(const std::string &path) @@ -1115,11 +1161,13 @@ void handleFile(const std::string &path) g_object_unref(infile); + bool pathsChanged = !WritePathChangesOnly; if (ReplacePaths) { - fixChunks(&classData); - fixChunks(&scene); + pathsChanged = pathsChanged || fixChunks(&classData); + pathsChanged = pathsChanged || fixChunks(&scene); } + if (ReplaceMapExt) { // Parse the scene @@ -1443,7 +1491,7 @@ void handleFile(const std::string &path) dllDirectory.disown(); classDirectory3.disown(); - if (WriteModified) + if (WriteModified && (ReplaceMapExt || pathsChanged)) { const char *outpath = (WriteDummy ? "testdummy.max" : path.c_str()); GsfOutput *output; @@ -1506,11 +1554,15 @@ int main(int argc, char **argv) //handleFile(nativeDatabasePath("w:\\database\\stuff\\generique\\agents\\accessories\\ge_fy_wea_trib_grand_bouclier.max")); //handleFile(nativeDatabasePath("w:\\database\\stuff\\generique\\agents\\accessories\\ge_mission_entrepot.max")); //handleFile(nativeDatabasePath("w:\\database\\stuff\\generique\\agents\\accessories\\mesh_wip\\all_trib_weapons.max")); + //handleFile(nativeDatabasePath("w:\\database\\stuff\\fyros\\decors\\constructions\\fy_cn_smokehouse.max")); //handleFile("/srv/work/database/landscape/ligo/jungle/pipeline_max/zonematerial-foret-ruine_boss.max"); //handleFile("/srv/work/database/stuff/fyros/agents/actors/male/animation/anims_non_utilisees/fy_hom_assis_boire_verre.max"); //handleFile("/home/kaetemi/3dsMax/scenes/test_clear_add_uvw.max"); //runScanner(); + for (std::set::iterator it = MissingFiles.begin(), end = MissingFiles.end(); it != end; ++it) + nlinfo("Missing: '%s'", (*it).c_str()); + gsf_shutdown(); return 0;