mirror of
https://github.com/Relintai/godot-lportal.git
synced 2024-11-11 10:52:09 +01:00
Search for statics within rooms is now recursive
Statics can now be in hierarchies in rooms instead of expecting meshes hanging directly from the room.
This commit is contained in:
parent
d3eadcbfa5
commit
5969d06e08
@ -97,6 +97,41 @@ int LRoomConverter::FindRoom_ByName(String szName) const
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LRoomConverter::Convert_Room_FindObjects_Recursive(Node * pParent, LRoom &lroom, LAABB &bb_room)
|
||||||
|
{
|
||||||
|
int nChildren = pParent->get_child_count();
|
||||||
|
for (int n=0; n<nChildren; n++)
|
||||||
|
{
|
||||||
|
Node * pChild = pParent->get_child(n);
|
||||||
|
|
||||||
|
VisualInstance * pVI = Object::cast_to<VisualInstance>(pChild);
|
||||||
|
if (pVI)
|
||||||
|
{
|
||||||
|
print("\t\tFound VI : " + pVI->get_name());
|
||||||
|
|
||||||
|
|
||||||
|
// update bound to find centre of room roughly
|
||||||
|
AABB bb = pVI->get_transformed_aabb();
|
||||||
|
bb_room.ExpandToEnclose(bb);
|
||||||
|
|
||||||
|
// store some info about the static object for use at runtime
|
||||||
|
LSob sob;
|
||||||
|
sob.m_ID = pVI->get_instance_id();
|
||||||
|
sob.m_aabb = bb;
|
||||||
|
|
||||||
|
lroom.m_SOBs.push_back(sob);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// not visual instances
|
||||||
|
}
|
||||||
|
|
||||||
|
// does it have further children?
|
||||||
|
Convert_Room_FindObjects_Recursive(pChild, lroom, bb_room);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
bool LRoomConverter::Convert_Room(Spatial * pNode, int lroomID)
|
bool LRoomConverter::Convert_Room(Spatial * pNode, int lroomID)
|
||||||
{
|
{
|
||||||
// get the room part of the name
|
// get the room part of the name
|
||||||
@ -120,33 +155,8 @@ bool LRoomConverter::Convert_Room(Spatial * pNode, int lroomID)
|
|||||||
LAABB bb_room;
|
LAABB bb_room;
|
||||||
bb_room.SetToMaxOpposite();
|
bb_room.SetToMaxOpposite();
|
||||||
|
|
||||||
int nChildren = pNode->get_child_count();
|
// recursively find statics
|
||||||
for (int n=0; n<nChildren; n++)
|
Convert_Room_FindObjects_Recursive(pNode, lroom, bb_room);
|
||||||
{
|
|
||||||
Node * pChild = pNode->get_child(n);
|
|
||||||
|
|
||||||
VisualInstance * pVI = Object::cast_to<VisualInstance>(pChild);
|
|
||||||
if (pVI)
|
|
||||||
{
|
|
||||||
print("\t\tFound VI : " + pVI->get_name());
|
|
||||||
|
|
||||||
|
|
||||||
// update bound to find centre of room roughly
|
|
||||||
AABB bb = pVI->get_transformed_aabb();
|
|
||||||
bb_room.ExpandToEnclose(bb);
|
|
||||||
|
|
||||||
// store some info about the static object for use at runtime
|
|
||||||
LSob sob;
|
|
||||||
sob.m_ID = pVI->get_instance_id();
|
|
||||||
sob.m_aabb = bb;
|
|
||||||
|
|
||||||
lroom.m_SOBs.push_back(sob);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// not visual instances NYI
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// store the lroom centre and bound
|
// store the lroom centre and bound
|
||||||
lroom.m_ptCentre = bb_room.FindCentre();
|
lroom.m_ptCentre = bb_room.FindCentre();
|
||||||
|
@ -63,6 +63,8 @@ private:
|
|||||||
|
|
||||||
void Convert_Rooms();
|
void Convert_Rooms();
|
||||||
bool Convert_Room(Spatial * pNode, int lroomID);
|
bool Convert_Room(Spatial * pNode, int lroomID);
|
||||||
|
void Convert_Room_FindObjects_Recursive(Node * pParent, LRoom &lroom, LAABB &bb_room);
|
||||||
|
|
||||||
void Convert_Portals();
|
void Convert_Portals();
|
||||||
|
|
||||||
|
|
||||||
|
@ -119,13 +119,13 @@ LRoom * LRoomManager::GetRoomFromDOB(Node * pNode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void LRoomManager::dob_register(Node * pDOB, float radius)
|
bool LRoomManager::dob_register(Node * pDOB, float radius)
|
||||||
{
|
{
|
||||||
print_line("register_dob " + pDOB->get_name());
|
print_line("register_dob " + pDOB->get_name());
|
||||||
|
|
||||||
Spatial * pSpat = Object::cast_to<Spatial>(pDOB);
|
Spatial * pSpat = Object::cast_to<Spatial>(pDOB);
|
||||||
if (!pSpat)
|
if (!pSpat)
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
Vector3 pt = pSpat->get_global_transform().origin;
|
Vector3 pt = pSpat->get_global_transform().origin;
|
||||||
|
|
||||||
@ -133,11 +133,11 @@ void LRoomManager::dob_register(Node * pDOB, float radius)
|
|||||||
print_line("register_dob closest room " + itos(iRoomNum));
|
print_line("register_dob closest room " + itos(iRoomNum));
|
||||||
|
|
||||||
if (iRoomNum == -1)
|
if (iRoomNum == -1)
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
LRoom * pRoom = GetRoom(iRoomNum);
|
LRoom * pRoom = GetRoom(iRoomNum);
|
||||||
if (!pRoom)
|
if (!pRoom)
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
LDob dob;
|
LDob dob;
|
||||||
dob.m_ID = pSpat->get_instance_id();
|
dob.m_ID = pSpat->get_instance_id();
|
||||||
@ -147,19 +147,20 @@ void LRoomManager::dob_register(Node * pDOB, float radius)
|
|||||||
|
|
||||||
// save the room ID on the dob metadata
|
// save the room ID on the dob metadata
|
||||||
Obj_SetRoomNum(pSpat, iRoomNum);
|
Obj_SetRoomNum(pSpat, iRoomNum);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool LRoomManager::dob_update(Node * pDOB)
|
int LRoomManager::dob_update(Node * pDOB)
|
||||||
{
|
{
|
||||||
// find the room the object is attached to
|
// find the room the object is attached to
|
||||||
LRoom * pRoom = GetRoomFromDOB(pDOB);
|
LRoom * pRoom = GetRoomFromDOB(pDOB);
|
||||||
if (!pRoom)
|
if (!pRoom)
|
||||||
return false;
|
return -1;
|
||||||
|
|
||||||
Spatial * pSpat = Object::cast_to<Spatial>(pDOB);
|
Spatial * pSpat = Object::cast_to<Spatial>(pDOB);
|
||||||
if (!pSpat)
|
if (!pSpat)
|
||||||
return false;
|
return -1;
|
||||||
|
|
||||||
LRoom * pNewRoom = pRoom->DOB_Update(*this, pSpat);
|
LRoom * pNewRoom = pRoom->DOB_Update(*this, pSpat);
|
||||||
|
|
||||||
@ -184,29 +185,69 @@ bool LRoomManager::dob_update(Node * pDOB)
|
|||||||
// save the room ID on the dob metadata
|
// save the room ID on the dob metadata
|
||||||
Obj_SetRoomNum(pSpat, iRoomNum);
|
Obj_SetRoomNum(pSpat, iRoomNum);
|
||||||
|
|
||||||
return true;
|
// new room number
|
||||||
|
return iRoomNum;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
// still in the same room
|
||||||
|
return pRoom->m_RoomID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// not tested...
|
||||||
bool LRoomManager::dob_teleport(Node * pDOB)
|
bool LRoomManager::dob_teleport(Node * pDOB)
|
||||||
{
|
{
|
||||||
|
Spatial * pSpat = Object::cast_to<Spatial>(pDOB);
|
||||||
|
if (!pSpat)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// old room
|
||||||
|
LRoom * pOldRoom = GetRoomFromDOB(pDOB);
|
||||||
|
if (!pOldRoom)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Vector3 pt = pSpat->get_global_transform().origin;
|
||||||
|
|
||||||
|
int iRoomNum = FindClosestRoom(pt);
|
||||||
|
//print_line("dob_teleport closest room " + itos(iRoomNum));
|
||||||
|
|
||||||
|
if (iRoomNum == -1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
LRoom * pNewRoom = GetRoom(iRoomNum);
|
||||||
|
if (!pNewRoom)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// detach from old room, add to new room
|
||||||
|
// get dob data to move to new room
|
||||||
|
unsigned int dob_id = pOldRoom->DOB_Find(pDOB);
|
||||||
|
assert (dob_id != -1);
|
||||||
|
|
||||||
|
// copy across data before removing
|
||||||
|
const LDob &data = pOldRoom->DOB_Get(dob_id);
|
||||||
|
pNewRoom->DOB_Add(data);
|
||||||
|
|
||||||
|
// remove from old room
|
||||||
|
pOldRoom->DOB_Remove(dob_id);
|
||||||
|
|
||||||
|
// save the room ID on the dob metadata
|
||||||
|
Obj_SetRoomNum(pSpat, iRoomNum);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void LRoomManager::dob_unregister(Node * pDOB)
|
bool LRoomManager::dob_unregister(Node * pDOB)
|
||||||
{
|
{
|
||||||
LRoom * pRoom = GetRoomFromDOB(pDOB);
|
LRoom * pRoom = GetRoomFromDOB(pDOB);
|
||||||
|
|
||||||
if (pRoom)
|
if (pRoom)
|
||||||
{
|
{
|
||||||
unsigned int dob_id = pRoom->DOB_Find(pDOB);
|
unsigned int dob_id = pRoom->DOB_Find(pDOB);
|
||||||
assert (dob_id != -1);
|
return pRoom->DOB_Remove(dob_id);
|
||||||
pRoom->DOB_Remove(dob_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int LRoomManager::dob_get_room_id(Node * pDOB)
|
int LRoomManager::dob_get_room_id(Node * pDOB)
|
||||||
|
@ -69,19 +69,26 @@ public:
|
|||||||
// normally this will be your main camera, but you can choose another for debugging
|
// normally this will be your main camera, but you can choose another for debugging
|
||||||
void rooms_set_camera(Node * pCam);
|
void rooms_set_camera(Node * pCam);
|
||||||
|
|
||||||
|
// get the Godot room that is associated with an LPortal room
|
||||||
|
// (can be used to find the name etc of a room ID returned by dob_update)
|
||||||
|
Node * rooms_get_room(int room_id);
|
||||||
|
|
||||||
// Dynamic objects .. cameras, players, boxes etc
|
// Dynamic objects .. cameras, players, boxes etc
|
||||||
// These are defined by their ability to move from room to room.
|
// These are defined by their ability to move from room to room.
|
||||||
// You can still move static objects within the same room (e.g. elevators, moving platforms)
|
// You can still move static objects within the same room (e.g. elevators, moving platforms)
|
||||||
// as these don't require checks for changing rooms.
|
// as these don't require checks for changing rooms.
|
||||||
void dob_register(Node * pDOB, float radius);
|
bool dob_register(Node * pDOB, float radius);
|
||||||
void dob_unregister(Node * pDOB);
|
bool dob_unregister(Node * pDOB);
|
||||||
bool dob_update(Node * pDOB);
|
|
||||||
|
// returns the room ID within
|
||||||
|
int dob_update(Node * pDOB);
|
||||||
|
|
||||||
|
// if we are moving the DOB possibly through multiple rooms, then teleport rather than detect
|
||||||
|
// portal crossings
|
||||||
bool dob_teleport(Node * pDOB);
|
bool dob_teleport(Node * pDOB);
|
||||||
|
|
||||||
// supplementary functions available from script
|
// helper func, not needed usually as dob_update returns the room
|
||||||
int dob_get_room_id(Node * pDOB);
|
int dob_get_room_id(Node * pDOB);
|
||||||
Node * rooms_get_room(int room_id);
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
Loading…
Reference in New Issue
Block a user