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
/FitdLib/shaders/generated
build/vs2022
build
data

View File

@ -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()

View File

@ -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
}

View File

@ -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];
}
}
{

View File

@ -1338,10 +1338,12 @@ struct maskStruct
std::array<u8, 320*200> mask;
};
maskStruct g_maskBuffers[10][10];
std::vector<std::vector<maskStruct>> 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;maskIdx<numMask;maskIdx++)
{
maskStruct* pDestMask = &g_maskBuffers[viewedRoomIdx][maskIdx];
maskStruct theMaskStruct;
maskStruct* pDestMask = &theMaskStruct;
pDestMask->mask.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;maskPolyIdx<numMaskPoly;maskPolyIdx++)
{
int numPoints = *(s16*)(src);
int numPoints = READ_LE_U16(src);
src+=2;
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+=((numOverlay*4)+1)*2;
}

View File

@ -63,8 +63,8 @@
void osystem_playSample(char* samplePtr,int size);
// 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_drawMask(int roomId, int maskId);
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_startFrame();
void osystem_stopFrame();

View File

@ -1182,7 +1182,7 @@ void osystem_flip(unsigned char* videoBuffer)
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)
{
@ -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].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;

View File

@ -14,8 +14,8 @@ etageVar1 -> table for camera data
*/
std::vector<roomDataStruct> roomDataTable;
cameraDataStruct* cameraDataTable[NUM_MAX_CAMERA_IN_ROOM];
cameraViewedRoomStruct* currentCameraZoneList[NUM_MAX_CAMERA_IN_ROOM];
std::vector<cameraDataStruct*> cameraDataTable;
std::vector<cameraViewedRoomStruct*> 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;i<numCameraInRoom;i++)
{
@ -130,7 +135,7 @@ void ChangeSalle(int roomNumber)
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;
@ -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

View File

@ -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<cameraDataStruct*> cameraDataTable;
extern std::vector<cameraViewedRoomStruct*> currentCameraZoneList;
extern std::vector<roomDataStruct> roomDataTable;
roomDefStruct* getRoomData(int roomNumber);