Added single room mode

This commit is contained in:
lawnjelly 2019-11-20 10:31:39 +00:00 committed by GitHub
parent 9b8a614ca3
commit 87d946f3d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 67 additions and 10 deletions

View File

@ -33,11 +33,11 @@
void LRoomConverter::Convert(LRoomManager &manager, bool bVerbose, bool bPreparationRun, bool bDeleteLights) void LRoomConverter::Convert(LRoomManager &manager, bool bVerbose, bool bPreparationRun, bool bDeleteLights, bool bSingleRoomMode)
{ {
m_bFinalRun = (bPreparationRun == false); m_bFinalRun = (bPreparationRun == false);
m_bDeleteLights = bDeleteLights; m_bDeleteLights = bDeleteLights;
m_bSingleRoomMode = bSingleRoomMode;
// This just is simply used to set how much debugging output .. more during conversion, less during running // This just is simply used to set how much debugging output .. more during conversion, less during running
// except when requested by explicitly clearing this flag. // except when requested by explicitly clearing this flag.
@ -142,6 +142,21 @@ void LRoomConverter::Convert_Rooms()
{ {
LPRINT(5,"Convert_Rooms"); LPRINT(5,"Convert_Rooms");
// allow faking a single room in single room mode
if (m_bSingleRoomMode)
{
Spatial * pSpat = Object::cast_to<Spatial>(LROOMLIST);
if (!pSpat)
return;
// add a default area
int area = Area_FindOrCreate("default");
Convert_Room(pSpat, 0, area);
return;
}
// first find all room empties and convert to LRooms // first find all room empties and convert to LRooms
int count = 0; int count = 0;
int area = -1; int area = -1;
@ -916,6 +931,9 @@ void LRoomConverter::Convert_Portals()
int LRoomConverter::CountRooms() int LRoomConverter::CountRooms()
{ {
if (m_bSingleRoomMode)
return 1; // hard coded
int nChildren = LROOMLIST->get_child_count(); int nChildren = LROOMLIST->get_child_count();
int count = 0; int count = 0;

View File

@ -82,7 +82,9 @@ public:
}; };
// this function calls everything else in the converter // this function calls everything else in the converter
void Convert(LRoomManager &manager, bool bVerbose, bool bPreparationRun, bool bDeleteLights); // single room mode enables us to emulate a room list in games that do not have rooms...
// this allows taking advantage of basic LPortal speedup without converting games / demos
void Convert(LRoomManager &manager, bool bVerbose, bool bPreparationRun, bool bDeleteLights, bool bSingleRoomMode = false);
private: private:
int CountRooms(); int CountRooms();
@ -147,4 +149,5 @@ private:
// in which case we should delete lights and set vis flags // in which case we should delete lights and set vis flags
bool m_bFinalRun; bool m_bFinalRun;
bool m_bDeleteLights; bool m_bDeleteLights;
bool m_bSingleRoomMode;
}; };

View File

@ -1083,12 +1083,12 @@ void LRoomManager::rooms_set_active(bool bActive)
m_bActive = bActive; m_bActive = bActive;
if (m_bActive) // if (m_bActive)
{ // {
// clear these to ensure the system is initialized // clear these to ensure the system is initialized
m_pCurr_VisibleRoomList->clear(); m_pCurr_VisibleRoomList->clear();
m_pPrev_VisibleRoomList->clear(); m_pPrev_VisibleRoomList->clear();
} // }
// show all // show all
for (int n=0; n<m_Rooms.size(); n++) for (int n=0; n<m_Rooms.size(); n++)
@ -1098,6 +1098,7 @@ void LRoomManager::rooms_set_active(bool bActive)
} }
// SOBS
for (int n=0; n<m_SOBs.size(); n++) for (int n=0; n<m_SOBs.size(); n++)
{ {
LSob &sob = m_SOBs[n]; LSob &sob = m_SOBs[n];
@ -1113,9 +1114,30 @@ void LRoomManager::rooms_set_active(bool bActive)
} }
LRoom::SoftShow(pVI, mask); LRoom::SoftShow(pVI, mask);
} }
} }
// LIGHTS
for (int n=0; n<m_Lights.size(); n++)
{
LLight &light = m_Lights[n];
// if (!light.m_Source.IsGlobal())
light.Show(!bActive);
}
m_ActiveLights.clear();
m_ActiveLights_prev.clear();
m_VisibleRoomList_A.clear();
m_VisibleRoomList_B.clear();
m_MasterList_SOBs.clear();
m_MasterList_SOBs_prev.clear();
m_VisibleList_SOBs.clear();
m_CasterList_SOBs.clear();
m_BF_ActiveLights_prev.Blank();
m_BF_ActiveLights.Blank();
} }
String LRoomManager::rooms_get_debug_frame_string() String LRoomManager::rooms_get_debug_frame_string()
@ -1170,18 +1192,28 @@ bool LRoomManager::rooms_set_camera(Node * pCam)
} }
// convert empties and meshes to rooms and portals // convert empties and meshes to rooms and portals
bool LRoomManager::rooms_convert(bool bVerbose, bool bDeleteLights) bool LRoomManager::RoomsConvert(bool bVerbose, bool bDeleteLights, bool bSingleRoomMode)
{ {
ResolveRoomListPath(); ResolveRoomListPath();
CHECK_ROOM_LIST CHECK_ROOM_LIST
LRoomConverter conv; LRoomConverter conv;
conv.Convert(*this, bVerbose, false, bDeleteLights); conv.Convert(*this, bVerbose, false, bDeleteLights, bSingleRoomMode);
return true; return true;
} }
bool LRoomManager::rooms_single_room_convert(bool bVerbose, bool bDeleteLights)
{
return RoomsConvert(bVerbose, bDeleteLights, true);
}
// convert empties and meshes to rooms and portals
bool LRoomManager::rooms_convert(bool bVerbose, bool bDeleteLights)
{
return RoomsConvert(bVerbose, bDeleteLights, false);
}
bool LRoomManager::rooms_transfer_uv2s(Node * pMeshInstance_From, Node * pMeshInstance_To) bool LRoomManager::rooms_transfer_uv2s(Node * pMeshInstance_From, Node * pMeshInstance_To)
{ {
CheckRoomList(); CheckRoomList();
@ -1841,6 +1873,7 @@ void LRoomManager::_bind_methods()
{ {
// main functions // main functions
ClassDB::bind_method(D_METHOD("rooms_convert", "verbose", "delete lights"), &LRoomManager::rooms_convert); ClassDB::bind_method(D_METHOD("rooms_convert", "verbose", "delete lights"), &LRoomManager::rooms_convert);
ClassDB::bind_method(D_METHOD("rooms_single_room_convert", "verbose", "delete lights"), &LRoomManager::rooms_single_room_convert);
ClassDB::bind_method(D_METHOD("rooms_release"), &LRoomManager::rooms_release); ClassDB::bind_method(D_METHOD("rooms_release"), &LRoomManager::rooms_release);
ClassDB::bind_method(D_METHOD("rooms_set_camera", "camera"), &LRoomManager::rooms_set_camera); ClassDB::bind_method(D_METHOD("rooms_set_camera", "camera"), &LRoomManager::rooms_set_camera);

View File

@ -59,6 +59,7 @@ public:
// MAIN // MAIN
// convert empties and meshes to rooms and portals // convert empties and meshes to rooms and portals
bool rooms_convert(bool bVerbose, bool bDeleteLights); bool rooms_convert(bool bVerbose, bool bDeleteLights);
bool rooms_single_room_convert(bool bVerbose, bool bDeleteLights);
// free memory for current set of rooms, prepare for converting a new game level // free memory for current set of rooms, prepare for converting a new game level
void rooms_release(); void rooms_release();
@ -301,6 +302,8 @@ private:
void FrameUpdate_DrawDebug(const LSource &cam, const LRoom &lroom); void FrameUpdate_DrawDebug(const LSource &cam, const LRoom &lroom);
// internal // internal
bool RoomsConvert(bool bVerbose, bool bDeleteLights, bool bSingleRoomMode);
// dobs // dobs
bool DobRegister(Spatial * pDOB, float radius, int iRoom); bool DobRegister(Spatial * pDOB, float radius, int iRoom);
ObjectID DobRegister_FindVIRecursive(Node * pNode) const; ObjectID DobRegister_FindVIRecursive(Node * pNode) const;