mirror of https://github.com/yaz0r/FITD.git
Mask rework
This commit is contained in:
parent
d95af85906
commit
cea84b5a6d
|
@ -1,4 +1,4 @@
|
||||||
/build/vs2019
|
/build/vs2019
|
||||||
/FitdLib/shaders/generated
|
/FitdLib/shaders/generated
|
||||||
build/vs2022
|
build
|
||||||
data
|
data
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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];
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,8 +63,8 @@
|
||||||
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();
|
||||||
void osystem_stopFrame();
|
void osystem_stopFrame();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,8 +148,9 @@ 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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue