be more gentle with not-in-scene-graph warnings

This commit is contained in:
David Rose 2003-10-28 00:14:20 +00:00
parent 7e3f8e6b6d
commit 1cecb8d5f5
2 changed files with 53 additions and 33 deletions

View File

@ -107,7 +107,10 @@ add_collider(const NodePath &collider, CollisionHandler *handler) {
} else { } else {
// We hadn't already known about this collider. // We hadn't already known about this collider.
_colliders.insert(Colliders::value_type(collider, handler)); _colliders.insert(Colliders::value_type(collider, handler));
_ordered_colliders.push_back(collider); OrderedColliderDef ocdef;
ocdef._node_path = collider;
ocdef._in_graph = true;
_ordered_colliders.push_back(ocdef);
Handlers::iterator hi = _handlers.find(handler); Handlers::iterator hi = _handlers.find(handler);
if (hi == _handlers.end()) { if (hi == _handlers.end()) {
@ -152,8 +155,13 @@ remove_collider(const NodePath &collider) {
_colliders.erase(ci); _colliders.erase(ci);
OrderedColliders::iterator oci = OrderedColliders::iterator oci;
find(_ordered_colliders.begin(), _ordered_colliders.end(), collider); oci = _ordered_colliders.begin();
while (oci != _ordered_colliders.end() &&
(*oci)._node_path != collider) {
++oci;
}
nassertr(oci != _ordered_colliders.end(), false); nassertr(oci != _ordered_colliders.end(), false);
_ordered_colliders.erase(oci); _ordered_colliders.erase(oci);
@ -196,7 +204,7 @@ NodePath CollisionTraverser::
get_collider(int n) const { get_collider(int n) const {
nassertr(_ordered_colliders.size() == _colliders.size(), NULL); nassertr(_ordered_colliders.size() == _colliders.size(), NULL);
nassertr(n >= 0 && n < (int)_ordered_colliders.size(), NULL); nassertr(n >= 0 && n < (int)_ordered_colliders.size(), NULL);
return _ordered_colliders[n]; return _ordered_colliders[n]._node_path;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -403,20 +411,23 @@ prepare_colliders(CollisionLevelState &level_state, const NodePath &root) {
level_state.clear(); level_state.clear();
level_state.reserve(_colliders.size()); level_state.reserve(_colliders.size());
int i = 0; OrderedColliders::iterator oci;
while (i < (int)_ordered_colliders.size()) { for (oci = _ordered_colliders.begin();
NodePath cnode_path = _ordered_colliders[i]; oci != _ordered_colliders.end();
#ifndef NDEBUG ++oci) {
NodePath cnode_path = (*oci)._node_path;
if (!cnode_path.is_same_graph(root)) { if (!cnode_path.is_same_graph(root)) {
collide_cat.error() if ((*oci)._in_graph) {
// Only report this warning once.
collide_cat.warning()
<< "Collider " << cnode_path << "Collider " << cnode_path
<< " is not in scene graph. Dropping from traverser.\n"; << " is not in scene graph. Ignoring.\n";
// This is safe to do while traversing the list of colliders, (*oci)._in_graph = false;
// because we do not increment i in this case. }
remove_collider(cnode_path);
} else } else {
#endif (*oci)._in_graph = true;
{
CollisionNode *cnode = DCAST(CollisionNode, cnode_path.node()); CollisionNode *cnode = DCAST(CollisionNode, cnode_path.node());
CollisionLevelState::ColliderDef def; CollisionLevelState::ColliderDef def;
@ -429,7 +440,6 @@ prepare_colliders(CollisionLevelState &level_state, const NodePath &root) {
def._collider = collider; def._collider = collider;
level_state.prepare_collider(def); level_state.prepare_collider(def);
} }
i++;
} }
} }
} }
@ -720,8 +730,12 @@ remove_handler(CollisionTraverser::Handlers::iterator hi) {
ci = cnext; ci = cnext;
// Also remove it from the ordered list. // Also remove it from the ordered list.
OrderedColliders::iterator oci = OrderedColliders::iterator oci;
find(_ordered_colliders.begin(), _ordered_colliders.end(), node_path); oci = _ordered_colliders.begin();
while (oci != _ordered_colliders.end() &&
(*oci)._node_path != node_path) {
++oci;
}
nassertr(oci != _ordered_colliders.end(), hi); nassertr(oci != _ordered_colliders.end(), hi);
_ordered_colliders.erase(oci); _ordered_colliders.erase(oci);

View File

@ -108,9 +108,15 @@ private:
PT(CollisionHandler) _default_handler; PT(CollisionHandler) _default_handler;
TypeHandle _graph_type; TypeHandle _graph_type;
class OrderedColliderDef {
public:
NodePath _node_path;
bool _in_graph;
};
typedef pmap<NodePath, PT(CollisionHandler) > Colliders; typedef pmap<NodePath, PT(CollisionHandler) > Colliders;
Colliders _colliders; Colliders _colliders;
typedef pvector<NodePath> OrderedColliders; typedef pvector<OrderedColliderDef> OrderedColliders;
OrderedColliders _ordered_colliders; OrderedColliders _ordered_colliders;
typedef pmap<PT(CollisionHandler), int> Handlers; typedef pmap<PT(CollisionHandler), int> Handlers;