93 lines
2.9 KiB
C++
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;
|
|
}
|