finish almost object output display

This commit is contained in:
2023-09-22 22:31:51 +08:00
parent d37a552873
commit c0626eefee
9 changed files with 89 additions and 23 deletions

View File

@ -368,6 +368,10 @@ namespace LibCmo::CK2 {
#pragma region Not important variable visitor
CK_BITMAPDATA_FLAGS CKBitmapData::GetBitmapFlags() const {
return m_BitmapFlags;
}
void CKBitmapData::SetCubeMap(bool is_cube) {
if (is_cube) {
SetSlotCount(6);

View File

@ -110,6 +110,8 @@ namespace LibCmo::CK2 {
#pragma region Not important funcs
CK_BITMAPDATA_FLAGS GetBitmapFlags() const;
void SetCubeMap(bool is_cube);
bool IsCubeMap() const;

View File

@ -157,7 +157,7 @@ namespace LibCmo::CK2 {
}
CKDWORD CKContext::GetManagerCount() {
return m_ManagerList.size();
return static_cast<CKDWORD>(m_ManagerList.size());
}
MgrImpls::CKBaseManager* CKContext::GetManager(CKDWORD index) {

View File

@ -289,7 +289,7 @@ namespace LibCmo::CK2::ObjImpls {
chunk->ReadStruct(uvcount);
if (uvcount != 0) {
// make sure no overflow
uvcount = std::min(uvcount, chl.m_CustomUV.size());
uvcount = std::min(uvcount, static_cast<CKDWORD>(chl.m_CustomUV.size()));
CKDWORD bufsize = uvcount * CKSizeof(VxMath::VxVector2);
auto locker = chunk->LockReadBufferWrapper(bufsize);

View File

@ -93,34 +93,41 @@ namespace LibCmo::CK2::ObjImpls {
return false;
} else {
CKDWORD fmtbytesize;
if (chunk->SeekIdentifierAndReturnSize(CK_STATESAVEFLAGS_TEXTURE::CK_STATESAVE_OLDTEXONLY, &fmtbytesize)) {
// MARK: there is a patch for virtools 2.1 implement.
// CK_STATESAVE_TEXONLY is noy valid in 2.1 but we add it for cpmpatibility reason.
if (chunk->SeekIdentifierAndReturnSize(CK_STATESAVEFLAGS_TEXTURE::CK_STATESAVE_OLDTEXONLY, &fmtbytesize) ||
chunk->SeekIdentifierAndReturnSize(CK_STATESAVEFLAGS_TEXTURE::CK_STATESAVE_TEXONLY, &fmtbytesize)) {
// for mid data:
// HIGH >>> 0xFF (blank) 0xFF (save options) 0xFF (transparent + movie info + video fmt) 0xFF (mip map) <<< LOW
// for mixed flags:
// HIGH >>> 1(blank) 1(cubemap) 1(has video fmt) 1(is transparent)
CKDWORD mixdata;
chunk->ReadStruct(mixdata);
// set mipmap
m_UseMipMap = (mixdata & 0xFF);
m_ImageHost.SetSaveOptions(static_cast<CK_TEXTURE_SAVEOPTIONS>((mixdata & 0xFF0000) >> 16));
mixdata >>= 8;
// mix flags
CKDWORD mixflags = mixdata & 0xFF;
mixdata >>= 8;
m_ImageHost.SetTransparent(mixflags & 0x1);
bool hasVideoFmt = mixflags & 0x2;
m_ImageHost.SetCubeMap(mixflags & 0x4);
// save options
m_ImageHost.SetSaveOptions(static_cast<CK_TEXTURE_SAVEOPTIONS>(mixdata & 0xFF));
mixdata >>= 8;
mixdata = mixdata & 0xFF00 >> 8;
m_ImageHost.SetTransparent(mixdata & 0x1);
bool hasVideoFmt = mixdata & 0x2;
m_ImageHost.SetCubeMap(mixdata & 0x4);
// MARK: I ignore 0x4 in there because it involve video.
// set current slot, transparent color, and video format.
CKDWORD currentSlot, transColor;
fmtbytesize -= CKSizeof(CKDWORD);
switch (fmtbytesize) {
case (3 * sizeof(CKDWORD)):
case (3 * CKSizeof(CKDWORD)):
chunk->ReadStruct(transColor);
m_ImageHost.SetTransparentColor(transColor);
chunk->ReadStruct(currentSlot);
m_ImageHost.SetCurrentSlot(currentSlot);
chunk->ReadStruct(m_VideoFormat);
break;
case (2 * sizeof(CKDWORD)):
case (2 * CKSizeof(CKDWORD)):
if (m_ImageHost.GetSlotCount() <= 1 || !hasVideoFmt) {
chunk->ReadStruct(transColor);
m_ImageHost.SetTransparentColor(transColor);
@ -133,7 +140,7 @@ namespace LibCmo::CK2::ObjImpls {
chunk->ReadStruct(m_VideoFormat);
}
break;
case (sizeof(CKDWORD)):
case (CKSizeof(CKDWORD)):
if (hasVideoFmt) {
chunk->ReadStruct(m_VideoFormat);
} else if (m_ImageHost.GetSlotCount() <= 1) {