diff --git a/.gitignore b/.gitignore index 823f92d..b9d3a16 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ /build/vs2019 /FitdLib/shaders/generated -build/vs2022 +build data diff --git a/CMakeLists.txt b/CMakeLists.txt index 3fd0095..9ad77bf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,12 +31,13 @@ add_subdirectory(${THIRD_PARTY}/zlib ${CMAKE_BINARY_DIR}/zlib/zlib-build) add_subdirectory( FitdLib ) add_subdirectory( Fitd ) -#set(USE_ASAN ON CACHE BOOL "" FORCE) -if(USE_ASAN) - target_link_options(Fitd PRIVATE "-fsanitize=address") - target_compile_options(Fitd PRIVATE "-fsanitize=address") - target_compile_options(FitdLib PRIVATE "-fsanitize=address") - target_compile_options(bimg PRIVATE "-fsanitize=address") - target_compile_options(bgfx PRIVATE "-fsanitize=address") - target_compile_options(soloud PRIVATE "-fsanitize=address") +set(USE_SANITIZER ON) +if(USE_SANITIZER) + set(SANITIZER_TYPE "address,undefined,leak") + target_link_options(Fitd PRIVATE "-fsanitize=${SANITIZER_TYPE}") + target_compile_options(Fitd PRIVATE "-fsanitize=${SANITIZER_TYPE}") + target_compile_options(FitdLib PRIVATE "-fsanitize=${SANITIZER_TYPE}") + target_compile_options(bimg PRIVATE "-fsanitize=${SANITIZER_TYPE}") + target_compile_options(bgfx PRIVATE "-fsanitize=${SANITIZER_TYPE}") + target_compile_options(soloud PRIVATE "-fsanitize=${SANITIZER_TYPE}") endif() diff --git a/FitdLib/common.h b/FitdLib/common.h index fe05147..d0e8a99 100644 --- a/FitdLib/common.h +++ b/FitdLib/common.h @@ -197,7 +197,9 @@ FORCEINLINE u16 READ_LE_U16(void *ptr) #ifdef MACOSX return (((u8*)ptr)[1]<<8)|((u8*)ptr)[0]; #else - return *(u16*)ptr; + u16 temp; + memcpy(&temp, ptr, 2); + return temp; #endif } @@ -225,7 +227,9 @@ FORCEINLINE u32 READ_LE_U32(void *ptr) #ifdef MACOSX return (((u8*)ptr)[3]<<24)|(((u8*)ptr)[2]<<16)|(((u8*)ptr)[1]<<8)|((u8*)ptr)[0]; #else - return *(u32*)ptr; + u32 temp; + memcpy(&temp, ptr, 4); + return temp; #endif } diff --git a/FitdLib/evalVar.cpp b/FitdLib/evalVar.cpp index 05a2482..084e1d7 100644 --- a/FitdLib/evalVar.cpp +++ b/FitdLib/evalVar.cpp @@ -201,10 +201,10 @@ int evalVar(const char* name) actorIdx = ListWorldObjets[objectNumber].objIndex; currentLifePtr+=2; - actorPtr = &objectTable[actorIdx]; - + if(actorIdx==-1) { + actorPtr = nullptr; switch(var1 & 0x7FFF) { case 0x1F: @@ -224,6 +224,10 @@ int evalVar(const char* name) } } } + else { + actorPtr = &objectTable[actorIdx]; + } + } { diff --git a/FitdLib/main.cpp b/FitdLib/main.cpp index 6e60ad4..7a5af86 100644 --- a/FitdLib/main.cpp +++ b/FitdLib/main.cpp @@ -1338,10 +1338,12 @@ struct maskStruct std::array mask; }; -maskStruct g_maskBuffers[10][10]; +std::vector> g_maskBuffers; void loadMask(int cameraIdx) { + g_maskBuffers.clear(); + if (g_gameId == TIMEGATE) 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;maskIdxmask.fill(0); - polyBackBuffer = &pDestMask->mask[0]; + polyBackBuffer = pDestMask->mask.data(); - char* src = data2 + *(u16*)(data+2); - - int numMaskZone = *(s16*)(data); + int numMaskZone = READ_LE_U16(data); + char* src = data2 + READ_LE_U16(data+2); int minX = 319; int maxX = 0; @@ -1449,12 +1451,12 @@ void createAITD1Mask() data+4, *(s16*)(data) ))*/ { - int numMaskPoly = *(s16*)src; + int numMaskPoly = READ_LE_U16(src); src += 2; for(int maskPolyIdx=0;maskPolyIdxmask, 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+=((numOverlay*4)+1)*2; } diff --git a/FitdLib/osystem.h b/FitdLib/osystem.h index e79bd34..3364a94 100644 --- a/FitdLib/osystem.h +++ b/FitdLib/osystem.h @@ -63,8 +63,8 @@ void osystem_playSample(char* samplePtr,int size); // void getMouseStatus(mouseStatusStruct * mouseData); - void osystem_createMask(const std::array& mask, int roomId, int maskId, unsigned char* refImage, int maskX1, int maskY1, int maskX2, int maskY2); - void osystem_drawMask(int roomId, int maskId); + void osystem_createMask(const std::array& mask, int roomId, int maskId, int maskX1, int maskY1, int maskX2, int maskY2); + void osystem_drawMask(int roomId, int maskId); void osystem_startFrame(); void osystem_stopFrame(); diff --git a/FitdLib/rendererBGFX.cpp b/FitdLib/rendererBGFX.cpp index ce4047a..cfa7dd9 100644 --- a/FitdLib/rendererBGFX.cpp +++ b/FitdLib/rendererBGFX.cpp @@ -1182,7 +1182,7 @@ void osystem_flip(unsigned char* videoBuffer) osystem_flushPendingPrimitives(); } -void osystem_createMask(const std::array& mask, int roomId, int maskId, unsigned char* refImage, int maskX1, int maskY1, int maskX2, int maskY2) +void osystem_createMask(const std::array& mask, int roomId, int maskId, int maskX1, int maskY1, int maskX2, int maskY2) { if (maskTextures.size() < roomId + 1) { @@ -1205,7 +1205,7 @@ void osystem_createMask(const std::array& mask, int roomId, int m 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].maskX2 = maskX2 + 1; maskTextures[roomId][maskId].maskY1 = maskY1; diff --git a/FitdLib/room.cpp b/FitdLib/room.cpp index a59e9d1..0533ea4 100644 --- a/FitdLib/room.cpp +++ b/FitdLib/room.cpp @@ -14,8 +14,8 @@ etageVar1 -> table for camera data */ std::vector roomDataTable; -cameraDataStruct* cameraDataTable[NUM_MAX_CAMERA_IN_ROOM]; -cameraViewedRoomStruct* currentCameraZoneList[NUM_MAX_CAMERA_IN_ROOM]; +std::vector cameraDataTable; +std::vector currentCameraZoneList; roomDefStruct* getRoomData(int roomNumber) { @@ -112,6 +112,11 @@ void ChangeSalle(int roomNumber) int newNumCamera = 0; 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) for(i=0;inumViewedRooms; @@ -143,8 +148,9 @@ void ChangeSalle(int roomNumber) } 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]; + } } // reajust world coordinates diff --git a/FitdLib/room.h b/FitdLib/room.h index 7c0b4a7..3f3513d 100644 --- a/FitdLib/room.h +++ b/FitdLib/room.h @@ -106,8 +106,8 @@ struct roomDataStruct }; typedef struct roomDataStruct roomDataStruct; -extern cameraDataStruct* cameraDataTable[NUM_MAX_CAMERA_IN_ROOM]; -extern cameraViewedRoomStruct* currentCameraZoneList[NUM_MAX_CAMERA_IN_ROOM]; +extern std::vector cameraDataTable; +extern std::vector currentCameraZoneList; extern std::vector roomDataTable; roomDefStruct* getRoomData(int roomNumber);