Visual debugging of room bounds

This commit is contained in:
lawnjelly 2019-09-23 12:31:26 +01:00 committed by GitHub
parent ebff0a04e7
commit cd4deb39e3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 108 additions and 29 deletions

View File

@ -113,6 +113,8 @@ public:
LRoom(); LRoom();
Spatial * GetGodotRoom() const; Spatial * GetGodotRoom() const;
// retained purely for debugging visualization
Geometry::MeshData m_Bound_MeshData;
}; };

View File

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

View File

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

View File

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