Mask rework

This commit is contained in:
yaz0r 2025-06-13 18:03:51 -07:00
parent d95af85906
commit cea84b5a6d
9 changed files with 51 additions and 34 deletions

2
.gitignore vendored
View File

@ -1,4 +1,4 @@
/build/vs2019 /build/vs2019
/FitdLib/shaders/generated /FitdLib/shaders/generated
build/vs2022 build
data data

View File

@ -31,12 +31,13 @@ add_subdirectory(${THIRD_PARTY}/zlib ${CMAKE_BINARY_DIR}/zlib/zlib-build)
add_subdirectory( FitdLib ) add_subdirectory( FitdLib )
add_subdirectory( Fitd ) add_subdirectory( Fitd )
#set(USE_ASAN ON CACHE BOOL "" FORCE) set(USE_SANITIZER ON)
if(USE_ASAN) if(USE_SANITIZER)
target_link_options(Fitd PRIVATE "-fsanitize=address") set(SANITIZER_TYPE "address,undefined,leak")
target_compile_options(Fitd PRIVATE "-fsanitize=address") target_link_options(Fitd PRIVATE "-fsanitize=${SANITIZER_TYPE}")
target_compile_options(FitdLib PRIVATE "-fsanitize=address") target_compile_options(Fitd PRIVATE "-fsanitize=${SANITIZER_TYPE}")
target_compile_options(bimg PRIVATE "-fsanitize=address") target_compile_options(FitdLib PRIVATE "-fsanitize=${SANITIZER_TYPE}")
target_compile_options(bgfx PRIVATE "-fsanitize=address") target_compile_options(bimg PRIVATE "-fsanitize=${SANITIZER_TYPE}")
target_compile_options(soloud PRIVATE "-fsanitize=address") target_compile_options(bgfx PRIVATE "-fsanitize=${SANITIZER_TYPE}")
target_compile_options(soloud PRIVATE "-fsanitize=${SANITIZER_TYPE}")
endif() endif()

View File

@ -197,7 +197,9 @@ FORCEINLINE u16 READ_LE_U16(void *ptr)
#ifdef MACOSX #ifdef MACOSX
return (((u8*)ptr)[1]<<8)|((u8*)ptr)[0]; return (((u8*)ptr)[1]<<8)|((u8*)ptr)[0];
#else #else
return *(u16*)ptr; u16 temp;
memcpy(&temp, ptr, 2);
return temp;
#endif #endif
} }
@ -225,7 +227,9 @@ FORCEINLINE u32 READ_LE_U32(void *ptr)
#ifdef MACOSX #ifdef MACOSX
return (((u8*)ptr)[3]<<24)|(((u8*)ptr)[2]<<16)|(((u8*)ptr)[1]<<8)|((u8*)ptr)[0]; return (((u8*)ptr)[3]<<24)|(((u8*)ptr)[2]<<16)|(((u8*)ptr)[1]<<8)|((u8*)ptr)[0];
#else #else
return *(u32*)ptr; u32 temp;
memcpy(&temp, ptr, 4);
return temp;
#endif #endif
} }

View File

@ -201,10 +201,10 @@ int evalVar(const char* name)
actorIdx = ListWorldObjets[objectNumber].objIndex; actorIdx = ListWorldObjets[objectNumber].objIndex;
currentLifePtr+=2; currentLifePtr+=2;
actorPtr = &objectTable[actorIdx];
if(actorIdx==-1) if(actorIdx==-1)
{ {
actorPtr = nullptr;
switch(var1 & 0x7FFF) switch(var1 & 0x7FFF)
{ {
case 0x1F: case 0x1F:
@ -224,6 +224,10 @@ int evalVar(const char* name)
} }
} }
} }
else {
actorPtr = &objectTable[actorIdx];
}
} }
{ {

View File

@ -1338,10 +1338,12 @@ struct maskStruct
std::array<u8, 320*200> mask; std::array<u8, 320*200> mask;
}; };
maskStruct g_maskBuffers[10][10]; std::vector<std::vector<maskStruct>> g_maskBuffers;
void loadMask(int cameraIdx) void loadMask(int cameraIdx)
{ {
g_maskBuffers.clear();
if (g_gameId == TIMEGATE) if (g_gameId == TIMEGATE)
return; return;
@ -1409,7 +1411,7 @@ void loadMask(int cameraIdx)
} }
} }
osystem_createMask(pDestMask->mask, i, j, (unsigned char*)aux, pDestMask->x1, pDestMask->y1, pDestMask->x2, pDestMask->y2); osystem_createMask(pDestMask->mask, i, j, pDestMask->x1, pDestMask->y1, pDestMask->x2, pDestMask->y2);
} }
} }
} }
@ -1431,13 +1433,13 @@ void createAITD1Mask()
for(int maskIdx=0;maskIdx<numMask;maskIdx++) for(int maskIdx=0;maskIdx<numMask;maskIdx++)
{ {
maskStruct* pDestMask = &g_maskBuffers[viewedRoomIdx][maskIdx]; maskStruct theMaskStruct;
maskStruct* pDestMask = &theMaskStruct;
pDestMask->mask.fill(0); pDestMask->mask.fill(0);
polyBackBuffer = &pDestMask->mask[0]; polyBackBuffer = pDestMask->mask.data();
char* src = data2 + *(u16*)(data+2); int numMaskZone = READ_LE_U16(data);
char* src = data2 + READ_LE_U16(data+2);
int numMaskZone = *(s16*)(data);
int minX = 319; int minX = 319;
int maxX = 0; int maxX = 0;
@ -1449,12 +1451,12 @@ void createAITD1Mask()
data+4, data+4,
*(s16*)(data) ))*/ *(s16*)(data) ))*/
{ {
int numMaskPoly = *(s16*)src; int numMaskPoly = READ_LE_U16(src);
src += 2; src += 2;
for(int maskPolyIdx=0;maskPolyIdx<numMaskPoly;maskPolyIdx++) for(int maskPolyIdx=0;maskPolyIdx<numMaskPoly;maskPolyIdx++)
{ {
int numPoints = *(s16*)(src); int numPoints = READ_LE_U16(src);
src+=2; src+=2;
memcpy(cameraBuffer, src, numPoints*4); memcpy(cameraBuffer, src, numPoints*4);
@ -1482,9 +1484,9 @@ void createAITD1Mask()
} }
osystem_createMask(pDestMask->mask, viewedRoomIdx, maskIdx, (unsigned char*)aux, minX-1, minY-1, maxX+1, maxY+1); osystem_createMask(pDestMask->mask, viewedRoomIdx, maskIdx, minX-1, minY-1, maxX+1, maxY+1);
int numOverlay = *(s16*)(data); int numOverlay = READ_LE_U16(data);
data+=2; data+=2;
data+=((numOverlay*4)+1)*2; data+=((numOverlay*4)+1)*2;
} }

View File

@ -63,7 +63,7 @@
void osystem_playSample(char* samplePtr,int size); void osystem_playSample(char* samplePtr,int size);
// void getMouseStatus(mouseStatusStruct * mouseData); // void getMouseStatus(mouseStatusStruct * mouseData);
void osystem_createMask(const std::array<u8, 320 * 200>& mask, int roomId, int maskId, unsigned char* refImage, int maskX1, int maskY1, int maskX2, int maskY2); void osystem_createMask(const std::array<u8, 320 * 200>& mask, int roomId, int maskId, int maskX1, int maskY1, int maskX2, int maskY2);
void osystem_drawMask(int roomId, int maskId); void osystem_drawMask(int roomId, int maskId);
void osystem_startFrame(); void osystem_startFrame();

View File

@ -1182,7 +1182,7 @@ void osystem_flip(unsigned char* videoBuffer)
osystem_flushPendingPrimitives(); osystem_flushPendingPrimitives();
} }
void osystem_createMask(const std::array<u8, 320 * 200>& mask, int roomId, int maskId, unsigned char* refImage, int maskX1, int maskY1, int maskX2, int maskY2) void osystem_createMask(const std::array<u8, 320 * 200>& mask, int roomId, int maskId, int maskX1, int maskY1, int maskX2, int maskY2)
{ {
if (maskTextures.size() < roomId + 1) if (maskTextures.size() < roomId + 1)
{ {
@ -1205,7 +1205,7 @@ void osystem_createMask(const std::array<u8, 320 * 200>& mask, int roomId, int m
maskTextures[roomId][maskId].vertexBuffer = BGFX_INVALID_HANDLE; maskTextures[roomId][maskId].vertexBuffer = BGFX_INVALID_HANDLE;
} }
maskTextures[roomId][maskId].maskTexture = bgfx::createTexture2D(320, 200, false, 1, bgfx::TextureFormat::R8U, 0, bgfx::copy(&mask[0], 320 * 200)); maskTextures[roomId][maskId].maskTexture = bgfx::createTexture2D(320, 200, false, 1, bgfx::TextureFormat::R8U, 0, bgfx::copy(mask.data(), 320 * 200));
maskTextures[roomId][maskId].maskX1 = maskX1; maskTextures[roomId][maskId].maskX1 = maskX1;
maskTextures[roomId][maskId].maskX2 = maskX2 + 1; maskTextures[roomId][maskId].maskX2 = maskX2 + 1;
maskTextures[roomId][maskId].maskY1 = maskY1; maskTextures[roomId][maskId].maskY1 = maskY1;

View File

@ -14,8 +14,8 @@ etageVar1 -> table for camera data
*/ */
std::vector<roomDataStruct> roomDataTable; std::vector<roomDataStruct> roomDataTable;
cameraDataStruct* cameraDataTable[NUM_MAX_CAMERA_IN_ROOM]; std::vector<cameraDataStruct*> cameraDataTable;
cameraViewedRoomStruct* currentCameraZoneList[NUM_MAX_CAMERA_IN_ROOM]; std::vector<cameraViewedRoomStruct*> currentCameraZoneList;
roomDefStruct* getRoomData(int roomNumber) roomDefStruct* getRoomData(int roomNumber)
{ {
@ -112,6 +112,11 @@ void ChangeSalle(int roomNumber)
int newNumCamera = 0; int newNumCamera = 0;
int newAbsCamera = -1; int newAbsCamera = -1;
cameraDataTable.clear();
currentCameraZoneList.clear();
currentCameraZoneList.resize(numCameraInRoom, nullptr);
// load the new camera table and try to keep the same camera (except if changing floor) // load the new camera table and try to keep the same camera (except if changing floor)
for(i=0;i<numCameraInRoom;i++) for(i=0;i<numCameraInRoom;i++)
{ {
@ -130,7 +135,7 @@ void ChangeSalle(int roomNumber)
room_PtrCamera[i] = g_currentFloorCameraRawData + READ_LE_U32(g_currentFloorCameraRawData + currentCameraIdx * 4); room_PtrCamera[i] = g_currentFloorCameraRawData + READ_LE_U32(g_currentFloorCameraRawData + currentCameraIdx * 4);
} }
cameraDataTable[i] = &(g_currentFloorCameraData[currentCameraIdx]); cameraDataTable.push_back(&g_currentFloorCameraData.at(currentCameraIdx));
currentCameraIdx = cameraDataTable[i]->numViewedRooms; currentCameraIdx = cameraDataTable[i]->numViewedRooms;
@ -143,9 +148,10 @@ void ChangeSalle(int roomNumber)
} }
ASSERT(cameraDataTable[i]->viewedRoomTable[j].viewedRoomIdx == currentRoom); ASSERT(cameraDataTable[i]->viewedRoomTable[j].viewedRoomIdx == currentRoom);
if(cameraDataTable[i]->viewedRoomTable[j].viewedRoomIdx == currentRoom) if(cameraDataTable[i]->viewedRoomTable[j].viewedRoomIdx == currentRoom) {
currentCameraZoneList[i] = &cameraDataTable[i]->viewedRoomTable[j]; currentCameraZoneList[i] = &cameraDataTable[i]->viewedRoomTable[j];
} }
}
// reajust world coordinates // reajust world coordinates
if(oldCameraIdx != -1) // if a camera was selected before loading room if(oldCameraIdx != -1) // if a camera was selected before loading room

View File

@ -106,8 +106,8 @@ struct roomDataStruct
}; };
typedef struct roomDataStruct roomDataStruct; typedef struct roomDataStruct roomDataStruct;
extern cameraDataStruct* cameraDataTable[NUM_MAX_CAMERA_IN_ROOM]; extern std::vector<cameraDataStruct*> cameraDataTable;
extern cameraViewedRoomStruct* currentCameraZoneList[NUM_MAX_CAMERA_IN_ROOM]; extern std::vector<cameraViewedRoomStruct*> currentCameraZoneList;
extern std::vector<roomDataStruct> roomDataTable; extern std::vector<roomDataStruct> roomDataTable;
roomDefStruct* getRoomData(int roomNumber); roomDefStruct* getRoomData(int roomNumber);