open_toontown_panda3d/panda/src/collide/collisionLevelStateBase.cxx

93 lines
2.9 KiB
C++

/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file collisionLevelStateBase.cxx
* @author drose
* @date 2002-03-16
*/
#include "collisionLevelStateBase.h"
#include "collisionSolid.h"
#include "collisionNode.h"
#include "config_collide.h"
#include "dcast.h"
PStatCollector CollisionLevelStateBase::_node_volume_pcollector("Collision Volumes:PandaNode");
TypeHandle CollisionLevelStateBase::_type_handle;
/**
*
*/
void CollisionLevelStateBase::
clear() {
_colliders.clear();
_local_bounds.clear();
_parent_bounds.clear();
}
/**
* Indicates an intention to add the indicated number of colliders to the
* level state.
*/
void CollisionLevelStateBase::
reserve(int num_colliders) {
_colliders.reserve(num_colliders);
_local_bounds.reserve(num_colliders);
}
/**
* Adds the indicated Collider to the set of Colliders in the current level
* state.
*/
void CollisionLevelStateBase::
prepare_collider(const ColliderDef &def, const NodePath &root) {
_colliders.push_back(def);
const CollisionSolid *collider = def._collider;
CPT(BoundingVolume) bv = collider->get_bounds();
if (!bv->is_of_type(GeometricBoundingVolume::get_class_type())) {
_local_bounds.push_back(nullptr);
} else {
// We can use a plain pointer, rather than a PT() here, because we know we
// are going to save the volume in the vector, below.
GeometricBoundingVolume *gbv;
DCAST_INTO_V(gbv, bv->make_copy());
// TODO: we need to make this logic work in the new relative world. The
// bounding volume should be extended by the object's motion relative to
// each object it is considering a collision with. That makes things
// complicated!
if (bv->as_bounding_sphere()) {
LPoint3 pos_delta = def._node_path.get_pos_delta(root);
// LVector3 cap(pos_delta); if(cap.length()>fluid_cap_amount) {
// pos_delta=LPoint3(capcap.length())*fluid_cap_amount; }
if (pos_delta != LVector3::zero()) {
// If the node has a delta, we have to include the starting position
// in the volume as well. We only do this for bounding spheres, since
// (a) other kinds of volumes may not extend so well, and (b) we've
// only implemented fluid-motion detection for CollisionSpheres
// anyway.
LMatrix4 inv_trans = LMatrix4::translate_mat(-pos_delta);
PT(GeometricBoundingVolume) gbv_prev;
gbv_prev = DCAST(GeometricBoundingVolume, bv->make_copy());
gbv_prev->xform(inv_trans);
gbv->extend_by(gbv_prev);
}
}
CPT(TransformState) rel_transform = def._node_path.get_transform(root.get_parent());
gbv->xform(rel_transform->get_mat());
_local_bounds.push_back(gbv);
}
_parent_bounds = _local_bounds;
}