mirror of
https://github.com/Relintai/godot-lportal.git
synced 2024-11-11 10:52:09 +01:00
Visual debugging of room bounds
This commit is contained in:
parent
ebff0a04e7
commit
cd4deb39e3
2
lroom.h
2
lroom.h
@ -113,6 +113,8 @@ public:
|
|||||||
LRoom();
|
LRoom();
|
||||||
Spatial * GetGodotRoom() const;
|
Spatial * GetGodotRoom() const;
|
||||||
|
|
||||||
|
// retained purely for debugging visualization
|
||||||
|
Geometry::MeshData m_Bound_MeshData;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -253,6 +253,22 @@ bool LRoomConverter::Convert_Bound(LRoom &lroom, MeshInstance * pMI)
|
|||||||
}
|
}
|
||||||
|
|
||||||
LPRINT(2, "\t\t\tcontained " + itos(lroom.m_Bound.m_Planes.size()) + " planes.");
|
LPRINT(2, "\t\t\tcontained " + itos(lroom.m_Bound.m_Planes.size()) + " planes.");
|
||||||
|
|
||||||
|
// make a copy of the mesh data for debugging
|
||||||
|
// note this could be avoided in release builds? NYI
|
||||||
|
lroom.m_Bound_MeshData = md;
|
||||||
|
|
||||||
|
// for (int f=0; f<md.faces.size(); f++)
|
||||||
|
// {
|
||||||
|
// String sz;
|
||||||
|
// sz = "face " + itos (f) + ", indices ";
|
||||||
|
// for (int i=0; i<md.faces[f].indices.size(); i++)
|
||||||
|
// {
|
||||||
|
// sz += itos(md.faces[f].indices[i]) + ", ";
|
||||||
|
// }
|
||||||
|
// LPRINT(2, sz);
|
||||||
|
// }
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,7 @@ LRoomManager::LRoomManager()
|
|||||||
m_pPrev_VisibleRoomList = &m_VisibleRoomList_B;
|
m_pPrev_VisibleRoomList = &m_VisibleRoomList_B;
|
||||||
|
|
||||||
m_bDebugPlanes = false;
|
m_bDebugPlanes = false;
|
||||||
|
m_bDebugBounds = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int LRoomManager::FindClosestRoom(const Vector3 &pt) const
|
int LRoomManager::FindClosestRoom(const Vector3 &pt) const
|
||||||
@ -206,10 +207,20 @@ void LRoomManager::CreateDebug()
|
|||||||
// m_mat_Debug_Planes->set_flag(SpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
|
// m_mat_Debug_Planes->set_flag(SpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
|
||||||
// m_mat_Debug_Planes->set_flag(SpatialMaterial::FLAG_SRGB_VERTEX_COLOR, true);
|
// m_mat_Debug_Planes->set_flag(SpatialMaterial::FLAG_SRGB_VERTEX_COLOR, true);
|
||||||
m_mat_Debug_Planes->set_albedo(Color(1, 0, 1, 1));
|
m_mat_Debug_Planes->set_albedo(Color(1, 0, 1, 1));
|
||||||
|
|
||||||
p->set_material_override(m_mat_Debug_Planes);
|
p->set_material_override(m_mat_Debug_Planes);
|
||||||
|
|
||||||
p->hide();
|
p->hide();
|
||||||
|
|
||||||
|
|
||||||
|
ImmediateGeometry * b = memnew(ImmediateGeometry);
|
||||||
|
b->set_name("debug_bounds");
|
||||||
|
add_child(b);
|
||||||
|
m_ID_DebugBounds = b->get_instance_id();
|
||||||
|
m_mat_Debug_Bounds = Ref<SpatialMaterial>(memnew(SpatialMaterial));
|
||||||
|
//m_mat_Debug_Bounds->set_flag(SpatialMaterial::FLAG_UNSHADED, true);
|
||||||
|
m_mat_Debug_Bounds->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
|
||||||
|
m_mat_Debug_Bounds->set_albedo(Color(0, 0, 1, 0.4));
|
||||||
|
b->set_material_override(m_mat_Debug_Bounds);
|
||||||
|
b->hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -424,6 +435,22 @@ Node * LRoomManager::rooms_get_room(int room_id)
|
|||||||
return pRoom->GetGodotRoom();
|
return pRoom->GetGodotRoom();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LRoomManager::rooms_set_debug_bounds(bool bActive)
|
||||||
|
{
|
||||||
|
m_bDebugBounds = bActive;
|
||||||
|
|
||||||
|
Object * pObj = ObjectDB::get_instance(m_ID_DebugBounds);
|
||||||
|
ImmediateGeometry * im = Object::cast_to<ImmediateGeometry>(pObj);
|
||||||
|
if (!im)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (bActive)
|
||||||
|
im->show();
|
||||||
|
else
|
||||||
|
im->hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void LRoomManager::rooms_set_debug_planes(bool bActive)
|
void LRoomManager::rooms_set_debug_planes(bool bActive)
|
||||||
{
|
{
|
||||||
m_bDebugPlanes = bActive;
|
m_bDebugPlanes = bActive;
|
||||||
@ -437,7 +464,6 @@ void LRoomManager::rooms_set_debug_planes(bool bActive)
|
|||||||
im->show();
|
im->show();
|
||||||
else
|
else
|
||||||
im->hide();
|
im->hide();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -648,39 +674,70 @@ void LRoomManager::FrameUpdate()
|
|||||||
// hide all the DOB
|
// hide all the DOB
|
||||||
|
|
||||||
// draw debug
|
// draw debug
|
||||||
FrameUpdate_DrawDebug(cam);
|
FrameUpdate_DrawDebug(cam, *pRoom);
|
||||||
|
|
||||||
// when running, emit less debugging output so as not to choke the IDE
|
// when running, emit less debugging output so as not to choke the IDE
|
||||||
Lawn::LDebug::m_bRunning = true;
|
Lawn::LDebug::m_bRunning = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void LRoomManager::FrameUpdate_DrawDebug(const LCamera &cam)
|
void LRoomManager::FrameUpdate_DrawDebug(const LCamera &cam, const LRoom &lroom)
|
||||||
{
|
{
|
||||||
if (!m_bDebugPlanes)
|
if (m_bDebugPlanes)
|
||||||
return;
|
|
||||||
|
|
||||||
Vector3 ptCam = cam.m_ptPos;
|
|
||||||
// slight adjustment to prevent parallel lines in viewport
|
|
||||||
ptCam += (cam.m_ptDir * 0.1f);
|
|
||||||
|
|
||||||
Object * pObj = ObjectDB::get_instance(m_ID_DebugPlanes);
|
|
||||||
ImmediateGeometry * im = Object::cast_to<ImmediateGeometry>(pObj);
|
|
||||||
if (!im)
|
|
||||||
return;
|
|
||||||
|
|
||||||
im->clear();
|
|
||||||
|
|
||||||
im->begin(Mesh::PRIMITIVE_LINES, NULL);
|
|
||||||
|
|
||||||
int nVerts = m_DebugPlanes.size();
|
|
||||||
|
|
||||||
for (int n=0; n<nVerts; n++)
|
|
||||||
{
|
{
|
||||||
im->add_vertex(ptCam);
|
Vector3 ptCam = cam.m_ptPos;
|
||||||
im->add_vertex(m_DebugPlanes[n]);
|
// slight adjustment to prevent parallel lines in viewport
|
||||||
|
ptCam += (cam.m_ptDir * 0.1f);
|
||||||
|
|
||||||
|
Object * pObj = ObjectDB::get_instance(m_ID_DebugPlanes);
|
||||||
|
ImmediateGeometry * im = Object::cast_to<ImmediateGeometry>(pObj);
|
||||||
|
if (!im)
|
||||||
|
return;
|
||||||
|
|
||||||
|
im->clear();
|
||||||
|
|
||||||
|
im->begin(Mesh::PRIMITIVE_LINES, NULL);
|
||||||
|
|
||||||
|
int nVerts = m_DebugPlanes.size();
|
||||||
|
|
||||||
|
for (int n=0; n<nVerts; n++)
|
||||||
|
{
|
||||||
|
im->add_vertex(ptCam);
|
||||||
|
im->add_vertex(m_DebugPlanes[n]);
|
||||||
|
}
|
||||||
|
im->end();
|
||||||
|
}
|
||||||
|
|
||||||
|
// if debug bounds are on and there is a bound for this room
|
||||||
|
const Geometry::MeshData &md = lroom.m_Bound_MeshData;
|
||||||
|
if (m_bDebugBounds && md.faces.size())
|
||||||
|
{
|
||||||
|
Object * pObj = ObjectDB::get_instance(m_ID_DebugBounds);
|
||||||
|
ImmediateGeometry * im = Object::cast_to<ImmediateGeometry>(pObj);
|
||||||
|
if (!im)
|
||||||
|
return;
|
||||||
|
|
||||||
|
im->clear();
|
||||||
|
|
||||||
|
im->begin(Mesh::PRIMITIVE_TRIANGLES, NULL);
|
||||||
|
|
||||||
|
for (int n=0; n<md.faces.size(); n++)
|
||||||
|
{
|
||||||
|
const Geometry::MeshData::Face &f = md.faces[n];
|
||||||
|
|
||||||
|
int numTris = f.indices.size() - 2;
|
||||||
|
|
||||||
|
for (int t=0; t<numTris; t++)
|
||||||
|
{
|
||||||
|
im->set_normal(f.plane.normal);
|
||||||
|
im->add_vertex(md.vertices[f.indices[0]]);
|
||||||
|
im->add_vertex(md.vertices[f.indices[t+1]]);
|
||||||
|
im->add_vertex(md.vertices[f.indices[t+2]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
im->end();
|
||||||
}
|
}
|
||||||
im->end();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LRoomManager::_notification(int p_what) {
|
void LRoomManager::_notification(int p_what) {
|
||||||
@ -718,6 +775,7 @@ void LRoomManager::_bind_methods()
|
|||||||
ClassDB::bind_method(D_METHOD("rooms_log_frame"), &LRoomManager::rooms_log_frame);
|
ClassDB::bind_method(D_METHOD("rooms_log_frame"), &LRoomManager::rooms_log_frame);
|
||||||
ClassDB::bind_method(D_METHOD("rooms_set_active"), &LRoomManager::rooms_set_active);
|
ClassDB::bind_method(D_METHOD("rooms_set_active"), &LRoomManager::rooms_set_active);
|
||||||
ClassDB::bind_method(D_METHOD("rooms_set_debug_planes"), &LRoomManager::rooms_set_debug_planes);
|
ClassDB::bind_method(D_METHOD("rooms_set_debug_planes"), &LRoomManager::rooms_set_debug_planes);
|
||||||
|
ClassDB::bind_method(D_METHOD("rooms_set_debug_bounds"), &LRoomManager::rooms_set_debug_bounds);
|
||||||
|
|
||||||
|
|
||||||
// functions to add dynamic objects to the culling system
|
// functions to add dynamic objects to the culling system
|
||||||
|
@ -81,8 +81,8 @@ public:
|
|||||||
|
|
||||||
// turn on and off culling for debugging
|
// turn on and off culling for debugging
|
||||||
void rooms_set_active(bool bActive);
|
void rooms_set_active(bool bActive);
|
||||||
|
|
||||||
void rooms_set_debug_planes(bool bActive);
|
void rooms_set_debug_planes(bool bActive);
|
||||||
|
void rooms_set_debug_bounds(bool bActive);
|
||||||
|
|
||||||
// 0 to 6 .. defaults to 4 which is (2) in our priorities (i.e. 6 - level)
|
// 0 to 6 .. defaults to 4 which is (2) in our priorities (i.e. 6 - level)
|
||||||
void rooms_set_logging(int level);
|
void rooms_set_logging(int level);
|
||||||
@ -148,7 +148,7 @@ private:
|
|||||||
void FrameUpdate_FrustumOnly();
|
void FrameUpdate_FrustumOnly();
|
||||||
|
|
||||||
// draw planes and room hulls
|
// draw planes and room hulls
|
||||||
void FrameUpdate_DrawDebug(const LCamera &cam);
|
void FrameUpdate_DrawDebug(const LCamera &cam, const LRoom &lroom);
|
||||||
|
|
||||||
// find which room is linked by a portal
|
// find which room is linked by a portal
|
||||||
LRoom &Portal_GetLinkedRoom(const LPortal &port);
|
LRoom &Portal_GetLinkedRoom(const LPortal &port);
|
||||||
@ -160,12 +160,15 @@ private:
|
|||||||
public:
|
public:
|
||||||
// whether debug planes is switched on
|
// whether debug planes is switched on
|
||||||
bool m_bDebugPlanes;
|
bool m_bDebugPlanes;
|
||||||
|
bool m_bDebugBounds;
|
||||||
|
|
||||||
// the planes are shown as a list of lines from the camera to the portal verts
|
// the planes are shown as a list of lines from the camera to the portal verts
|
||||||
LVector<Vector3> m_DebugPlanes;
|
LVector<Vector3> m_DebugPlanes;
|
||||||
private:
|
private:
|
||||||
ObjectID m_ID_DebugPlanes;
|
ObjectID m_ID_DebugPlanes;
|
||||||
|
ObjectID m_ID_DebugBounds;
|
||||||
Ref<SpatialMaterial> m_mat_Debug_Planes;
|
Ref<SpatialMaterial> m_mat_Debug_Planes;
|
||||||
|
Ref<SpatialMaterial> m_mat_Debug_Bounds;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user