open_toontown_panda3d/panda/src/collide/collisionLevelStateBase.cxx

102 lines
3.8 KiB
C++

// Filename: collisionLevelStateBase.cxx
// Created by: drose (16Mar02)
//
////////////////////////////////////////////////////////////////////
//
// 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."
//
////////////////////////////////////////////////////////////////////
#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;
////////////////////////////////////////////////////////////////////
// Function: CollisionLevelStateBase::clear
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
void CollisionLevelStateBase::
clear() {
_colliders.clear();
_local_bounds.clear();
_parent_bounds.clear();
}
////////////////////////////////////////////////////////////////////
// Function: CollisionLevelStateBase::reserve
// Access: Public
// Description: 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);
}
////////////////////////////////////////////////////////////////////
// Function: CollisionLevelStateBase::prepare_collider
// Access: Public
// Description: 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((GeometricBoundingVolume *)NULL);
} 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(cap/cap.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;
}