diff --git a/makepanda/makepanda.vcproj b/makepanda/makepanda.vcproj
index ad7f219650..03324fb60e 100644
--- a/makepanda/makepanda.vcproj
+++ b/makepanda/makepanda.vcproj
@@ -1043,7 +1043,7 @@
-
+
@@ -1054,7 +1054,7 @@
-
+
@@ -1089,7 +1089,7 @@
-
+
diff --git a/panda/src/bullet/bulletBodyNode.cxx b/panda/src/bullet/bulletBodyNode.cxx
index 81a056adc2..cb9d7ed9c0 100644
--- a/panda/src/bullet/bulletBodyNode.cxx
+++ b/panda/src/bullet/bulletBodyNode.cxx
@@ -28,7 +28,7 @@
#include "collisionPlane.h"
#include "collisionSphere.h"
#include "collisionPolygon.h"
-#include "collisionTube.h"
+#include "collisionCapsule.h"
TypeHandle BulletBodyNode::_type_handle;
@@ -813,12 +813,12 @@ add_shapes_from_collision_solids(CollisionNode *cnode) {
do_add_shape(BulletBoxShape::make_from_solid(box), ts);
}
- // CollisionTube
- else if (CollisionTube::get_class_type() == type) {
- CPT(CollisionTube) tube = DCAST(CollisionTube, solid);
- CPT(TransformState) ts = TransformState::make_pos((tube->get_point_b() + tube->get_point_a()) / 2.0);
+ // CollisionCapsule
+ else if (CollisionCapsule::get_class_type() == type) {
+ CPT(CollisionCapsule) capsule = DCAST(CollisionCapsule, solid);
+ CPT(TransformState) ts = TransformState::make_pos((capsule->get_point_b() + capsule->get_point_a()) / 2.0);
- do_add_shape(BulletCapsuleShape::make_from_solid(tube), ts);
+ do_add_shape(BulletCapsuleShape::make_from_solid(capsule), ts);
}
// CollisionPlane
diff --git a/panda/src/bullet/bulletCapsuleShape.cxx b/panda/src/bullet/bulletCapsuleShape.cxx
index 0bdb1284dc..cde5e64050 100644
--- a/panda/src/bullet/bulletCapsuleShape.cxx
+++ b/panda/src/bullet/bulletCapsuleShape.cxx
@@ -87,16 +87,16 @@ ptr() const {
/**
* Constructs a new BulletCapsuleShape using the information from a
- * CollisionTube from the builtin collision system.
+ * CollisionCapsule from the builtin collision system.
*/
BulletCapsuleShape *BulletCapsuleShape::
-make_from_solid(const CollisionTube *solid) {
-
+make_from_solid(const CollisionCapsule *solid) {
+
PN_stdfloat radius = solid->get_radius();
- // Get tube's cylinder height: length from point A to point B
+ // Get capsule's cylinder height: length from point A to point B
PN_stdfloat height = (solid->get_point_b() - solid->get_point_a()).length();
- // CollisionTubes are always Z-Up.
+ // CollisionCapsules are always Z-Up.
return new BulletCapsuleShape(radius, height, Z_up);
}
diff --git a/panda/src/bullet/bulletCapsuleShape.h b/panda/src/bullet/bulletCapsuleShape.h
index f8eecfe3d7..e78b06bc08 100644
--- a/panda/src/bullet/bulletCapsuleShape.h
+++ b/panda/src/bullet/bulletCapsuleShape.h
@@ -20,7 +20,7 @@
#include "bullet_utils.h"
#include "bulletShape.h"
-#include "collisionTube.h"
+#include "collisionCapsule.h"
/**
*
@@ -35,7 +35,7 @@ PUBLISHED:
BulletCapsuleShape(const BulletCapsuleShape ©);
INLINE ~BulletCapsuleShape();
- static BulletCapsuleShape *make_from_solid(const CollisionTube *solid);
+ static BulletCapsuleShape *make_from_solid(const CollisionCapsule *solid);
INLINE PN_stdfloat get_radius() const;
INLINE PN_stdfloat get_half_height() const;
diff --git a/panda/src/collide/collisionBox.cxx b/panda/src/collide/collisionBox.cxx
index a8af257456..8528e7bc27 100644
--- a/panda/src/collide/collisionBox.cxx
+++ b/panda/src/collide/collisionBox.cxx
@@ -16,7 +16,7 @@
#include "collisionRay.h"
#include "collisionSphere.h"
#include "collisionSegment.h"
-#include "collisionTube.h"
+#include "collisionCapsule.h"
#include "collisionHandler.h"
#include "collisionEntry.h"
#include "config_collide.h"
@@ -547,19 +547,19 @@ test_intersection_from_segment(const CollisionEntry &entry) const {
}
/**
- * Double dispatch point for tube as a FROM object
+ * Double dispatch point for capsule as a FROM object
*/
PT(CollisionEntry) CollisionBox::
-test_intersection_from_tube(const CollisionEntry &entry) const {
- const CollisionTube *tube;
- DCAST_INTO_R(tube, entry.get_from(), nullptr);
+test_intersection_from_capsule(const CollisionEntry &entry) const {
+ const CollisionCapsule *capsule;
+ DCAST_INTO_R(capsule, entry.get_from(), nullptr);
const LMatrix4 &wrt_mat = entry.get_wrt_mat();
- LPoint3 from_a = tube->get_point_a() * wrt_mat;
- LPoint3 from_b = tube->get_point_b() * wrt_mat;
+ LPoint3 from_a = capsule->get_point_a() * wrt_mat;
+ LPoint3 from_b = capsule->get_point_b() * wrt_mat;
LVector3 from_direction = from_b - from_a;
- PN_stdfloat radius_sq = wrt_mat.xform_vec(LVector3(0, 0, tube->get_radius())).length_squared();
+ PN_stdfloat radius_sq = wrt_mat.xform_vec(LVector3(0, 0, capsule->get_radius())).length_squared();
PN_stdfloat radius = csqrt(radius_sq);
LPoint3 box_min = get_min();
@@ -620,7 +620,7 @@ test_intersection_from_tube(const CollisionEntry &entry) const {
LVector3 delta(0);
delta[edges[i].axis] = dimensions[edges[i].axis];
double u1, u2;
- CollisionTube::calc_closest_segment_points(u1, u2, from_a, from_direction, vertex, delta);
+ CollisionCapsule::calc_closest_segment_points(u1, u2, from_a, from_direction, vertex, delta);
PN_stdfloat dist_sq = ((from_a + from_direction * u1) - (vertex + delta * u2)).length_squared();
if (dist_sq < best_dist_sq) {
best_dist_sq = dist_sq;
@@ -682,7 +682,7 @@ test_intersection_from_tube(const CollisionEntry &entry) const {
new_entry->set_interior_point(point - interior_vec * radius);
new_entry->set_surface_point(surface_point);
- if (has_effective_normal() && tube->get_respect_effective_normal()) {
+ if (has_effective_normal() && capsule->get_respect_effective_normal()) {
new_entry->set_surface_normal(get_effective_normal());
} else {
new_entry->set_surface_normal(normal);
diff --git a/panda/src/collide/collisionBox.h b/panda/src/collide/collisionBox.h
index cf9e8bc15b..db9d2c2aa9 100644
--- a/panda/src/collide/collisionBox.h
+++ b/panda/src/collide/collisionBox.h
@@ -82,7 +82,7 @@ protected:
virtual PT(CollisionEntry)
test_intersection_from_segment(const CollisionEntry &entry) const;
virtual PT(CollisionEntry)
- test_intersection_from_tube(const CollisionEntry &entry) const;
+ test_intersection_from_capsule(const CollisionEntry &entry) const;
virtual PT(CollisionEntry)
test_intersection_from_box(const CollisionEntry &entry) const;
diff --git a/panda/src/collide/collisionTube.I b/panda/src/collide/collisionCapsule.I
similarity index 70%
rename from panda/src/collide/collisionTube.I
rename to panda/src/collide/collisionCapsule.I
index 53e0f4cff6..78b8c3559b 100644
--- a/panda/src/collide/collisionTube.I
+++ b/panda/src/collide/collisionCapsule.I
@@ -6,7 +6,7 @@
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
- * @file collisionTube.I
+ * @file collisionCapsule.I
* @author drose
* @date 2003-09-25
*/
@@ -14,8 +14,8 @@
/**
*
*/
-INLINE CollisionTube::
-CollisionTube(const LPoint3 &a, const LPoint3 &b, PN_stdfloat radius) :
+INLINE CollisionCapsule::
+CollisionCapsule(const LPoint3 &a, const LPoint3 &b, PN_stdfloat radius) :
_a(a), _b(b), _radius(radius)
{
recalc_internals();
@@ -25,8 +25,8 @@ CollisionTube(const LPoint3 &a, const LPoint3 &b, PN_stdfloat radius) :
/**
*
*/
-INLINE CollisionTube::
-CollisionTube(PN_stdfloat ax, PN_stdfloat ay, PN_stdfloat az,
+INLINE CollisionCapsule::
+CollisionCapsule(PN_stdfloat ax, PN_stdfloat ay, PN_stdfloat az,
PN_stdfloat bx, PN_stdfloat by, PN_stdfloat bz,
PN_stdfloat radius) :
_a(ax, ay, az), _b(bx, by, bz), _radius(radius)
@@ -36,17 +36,17 @@ CollisionTube(PN_stdfloat ax, PN_stdfloat ay, PN_stdfloat az,
}
/**
- * Creates an invalid tube. Only used when reading from a bam file.
+ * Creates an invalid capsule. Only used when reading from a bam file.
*/
-INLINE CollisionTube::
-CollisionTube() {
+INLINE CollisionCapsule::
+CollisionCapsule() {
}
/**
*
*/
-INLINE CollisionTube::
-CollisionTube(const CollisionTube ©) :
+INLINE CollisionCapsule::
+CollisionCapsule(const CollisionCapsule ©) :
CollisionSolid(copy),
_a(copy._a),
_b(copy._b),
@@ -58,7 +58,7 @@ CollisionTube(const CollisionTube ©) :
/**
* Flushes the PStatCollectors used during traversal.
*/
-INLINE void CollisionTube::
+INLINE void CollisionCapsule::
flush_level() {
_volume_pcollector.flush_level();
_test_pcollector.flush_level();
@@ -67,7 +67,7 @@ flush_level() {
/**
*
*/
-INLINE void CollisionTube::
+INLINE void CollisionCapsule::
set_point_a(const LPoint3 &a) {
_a = a;
recalc_internals();
@@ -76,7 +76,7 @@ set_point_a(const LPoint3 &a) {
/**
*
*/
-INLINE void CollisionTube::
+INLINE void CollisionCapsule::
set_point_a(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z) {
set_point_a(LPoint3(x, y, z));
}
@@ -84,7 +84,7 @@ set_point_a(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z) {
/**
*
*/
-INLINE const LPoint3 &CollisionTube::
+INLINE const LPoint3 &CollisionCapsule::
get_point_a() const {
return _a;
}
@@ -92,7 +92,7 @@ get_point_a() const {
/**
*
*/
-INLINE void CollisionTube::
+INLINE void CollisionCapsule::
set_point_b(const LPoint3 &b) {
_b = b;
recalc_internals();
@@ -101,7 +101,7 @@ set_point_b(const LPoint3 &b) {
/**
*
*/
-INLINE void CollisionTube::
+INLINE void CollisionCapsule::
set_point_b(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z) {
set_point_b(LPoint3(x, y, z));
}
@@ -109,7 +109,7 @@ set_point_b(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z) {
/**
*
*/
-INLINE const LPoint3 &CollisionTube::
+INLINE const LPoint3 &CollisionCapsule::
get_point_b() const {
return _b;
}
@@ -117,7 +117,7 @@ get_point_b() const {
/**
*
*/
-INLINE void CollisionTube::
+INLINE void CollisionCapsule::
set_radius(PN_stdfloat radius) {
nassertv(radius >= 0.0f);
_radius = radius;
@@ -131,7 +131,7 @@ set_radius(PN_stdfloat radius) {
/**
*
*/
-INLINE PN_stdfloat CollisionTube::
+INLINE PN_stdfloat CollisionCapsule::
get_radius() const {
return _radius;
}
diff --git a/panda/src/collide/collisionTube.cxx b/panda/src/collide/collisionCapsule.cxx
similarity index 89%
rename from panda/src/collide/collisionTube.cxx
rename to panda/src/collide/collisionCapsule.cxx
index 90f82a3630..91ab319735 100644
--- a/panda/src/collide/collisionTube.cxx
+++ b/panda/src/collide/collisionCapsule.cxx
@@ -6,12 +6,12 @@
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
- * @file collisionTube.cxx
+ * @file collisionCapsule.cxx
* @author drose
* @date 2003-09-25
*/
-#include "collisionTube.h"
+#include "collisionCapsule.h"
#include "collisionSphere.h"
#include "collisionLine.h"
#include "collisionRay.h"
@@ -35,30 +35,30 @@
#include "geomVertexWriter.h"
#include "boundingSphere.h"
-PStatCollector CollisionTube::_volume_pcollector("Collision Volumes:CollisionTube");
-PStatCollector CollisionTube::_test_pcollector("Collision Tests:CollisionTube");
-TypeHandle CollisionTube::_type_handle;
+PStatCollector CollisionCapsule::_volume_pcollector("Collision Volumes:CollisionCapsule");
+PStatCollector CollisionCapsule::_test_pcollector("Collision Tests:CollisionCapsule");
+TypeHandle CollisionCapsule::_type_handle;
/**
*
*/
-CollisionSolid *CollisionTube::
+CollisionSolid *CollisionCapsule::
make_copy() {
- return new CollisionTube(*this);
+ return new CollisionCapsule(*this);
}
/**
*
*/
-PT(CollisionEntry) CollisionTube::
+PT(CollisionEntry) CollisionCapsule::
test_intersection(const CollisionEntry &entry) const {
- return entry.get_into()->test_intersection_from_tube(entry);
+ return entry.get_into()->test_intersection_from_capsule(entry);
}
/**
* Transforms the solid by the indicated matrix.
*/
-void CollisionTube::
+void CollisionCapsule::
xform(const LMatrix4 &mat) {
_a = _a * mat;
_b = _b * mat;
@@ -77,7 +77,7 @@ xform(const LMatrix4 &mat) {
* collision purposes. The closest intersection point to this origin point is
* considered to be the most significant.
*/
-LPoint3 CollisionTube::
+LPoint3 CollisionCapsule::
get_collision_origin() const {
return get_point_a();
}
@@ -86,7 +86,7 @@ get_collision_origin() const {
* Returns a PStatCollector that is used to count the number of bounding
* volume tests made against a solid of this type in a given frame.
*/
-PStatCollector &CollisionTube::
+PStatCollector &CollisionCapsule::
get_volume_pcollector() {
return _volume_pcollector;
}
@@ -95,7 +95,7 @@ get_volume_pcollector() {
* Returns a PStatCollector that is used to count the number of intersection
* tests made against a solid of this type in a given frame.
*/
-PStatCollector &CollisionTube::
+PStatCollector &CollisionCapsule::
get_test_pcollector() {
return _test_pcollector;
}
@@ -103,15 +103,15 @@ get_test_pcollector() {
/**
*
*/
-void CollisionTube::
+void CollisionCapsule::
output(std::ostream &out) const {
- out << "tube, a (" << _a << "), b (" << _b << "), r " << _radius;
+ out << "capsule, a (" << _a << "), b (" << _b << "), r " << _radius;
}
/**
*
*/
-PT(BoundingVolume) CollisionTube::
+PT(BoundingVolume) CollisionCapsule::
compute_internal_bounds() const {
PT(BoundingVolume) bound = CollisionSolid::compute_internal_bounds();
@@ -143,7 +143,7 @@ compute_internal_bounds() const {
/**
*
*/
-PT(CollisionEntry) CollisionTube::
+PT(CollisionEntry) CollisionCapsule::
test_intersection_from_sphere(const CollisionEntry &entry) const {
const CollisionSphere *sphere;
DCAST_INTO_R(sphere, entry.get_from(), nullptr);
@@ -160,7 +160,7 @@ test_intersection_from_sphere(const CollisionEntry &entry) const {
PN_stdfloat actual_t = 0.0f;
if (wrt_prev_space != wrt_space) {
- // If the sphere is moving relative to the tube, it becomes a tube itself.
+ // If the sphere is moving relative to the capsule, it becomes a capsule itself.
from_a = sphere->get_center() * wrt_prev_space->get_mat();
}
@@ -195,11 +195,11 @@ test_intersection_from_sphere(const CollisionEntry &entry) const {
LPoint3 into_intersection_point;
if (t2 > 1.0) {
- // Point b is within the tube. The first intersection point is point b
+ // Point b is within the capsule. The first intersection point is point b
// itself.
into_intersection_point = from_b;
} else {
- // Point b is outside the tube, and point a is either inside the tube or
+ // Point b is outside the capsule, and point a is either inside the capsule or
// beyond it. The first intersection point is at t2.
into_intersection_point = from_a + t2 * from_direction;
}
@@ -221,7 +221,7 @@ test_intersection_from_sphere(const CollisionEntry &entry) const {
/**
*
*/
-PT(CollisionEntry) CollisionTube::
+PT(CollisionEntry) CollisionCapsule::
test_intersection_from_line(const CollisionEntry &entry) const {
const CollisionLine *line;
DCAST_INTO_R(line, entry.get_from(), nullptr);
@@ -269,7 +269,7 @@ test_intersection_from_line(const CollisionEntry &entry) const {
/**
*
*/
-PT(CollisionEntry) CollisionTube::
+PT(CollisionEntry) CollisionCapsule::
test_intersection_from_ray(const CollisionEntry &entry) const {
const CollisionRay *ray;
DCAST_INTO_R(ray, entry.get_from(), nullptr);
@@ -299,11 +299,11 @@ test_intersection_from_ray(const CollisionEntry &entry) const {
LPoint3 into_intersection_point;
if (t1 < 0.0) {
- // Point a is within the tube. The first intersection point is point a
+ // Point a is within the capsule. The first intersection point is point a
// itself.
into_intersection_point = from_origin;
} else {
- // Point a is outside the tube. The first intersection point is at t1.
+ // Point a is outside the capsule. The first intersection point is at t1.
into_intersection_point = from_origin + t1 * from_direction;
}
set_intersection_point(new_entry, into_intersection_point, 0.0);
@@ -330,7 +330,7 @@ test_intersection_from_ray(const CollisionEntry &entry) const {
/**
*
*/
-PT(CollisionEntry) CollisionTube::
+PT(CollisionEntry) CollisionCapsule::
test_intersection_from_segment(const CollisionEntry &entry) const {
const CollisionSegment *segment;
DCAST_INTO_R(segment, entry.get_from(), nullptr);
@@ -362,11 +362,11 @@ test_intersection_from_segment(const CollisionEntry &entry) const {
LPoint3 into_intersection_point;
if (t1 < 0.0) {
- // Point a is within the tube. The first intersection point is point a
+ // Point a is within the capsule. The first intersection point is point a
// itself.
into_intersection_point = from_a;
} else {
- // Point a is outside the tube, and point b is either inside the tube or
+ // Point a is outside the capsule, and point b is either inside the capsule or
// beyond it. The first intersection point is at t1.
into_intersection_point = from_a + t1 * from_direction;
}
@@ -394,22 +394,22 @@ test_intersection_from_segment(const CollisionEntry &entry) const {
/**
*
*/
-PT(CollisionEntry) CollisionTube::
-test_intersection_from_tube(const CollisionEntry &entry) const {
- const CollisionTube *tube;
- DCAST_INTO_R(tube, entry.get_from(), nullptr);
+PT(CollisionEntry) CollisionCapsule::
+test_intersection_from_capsule(const CollisionEntry &entry) const {
+ const CollisionCapsule *capsule;
+ DCAST_INTO_R(capsule, entry.get_from(), nullptr);
LPoint3 into_a = _a;
LVector3 into_direction = _b - into_a;
const LMatrix4 &wrt_mat = entry.get_wrt_mat();
- LPoint3 from_a = tube->get_point_a() * wrt_mat;
- LPoint3 from_b = tube->get_point_b() * wrt_mat;
+ LPoint3 from_a = capsule->get_point_a() * wrt_mat;
+ LPoint3 from_b = capsule->get_point_b() * wrt_mat;
LVector3 from_direction = from_b - from_a;
LVector3 from_radius_v =
- LVector3(tube->get_radius(), 0.0f, 0.0f) * wrt_mat;
+ LVector3(capsule->get_radius(), 0.0f, 0.0f) * wrt_mat;
PN_stdfloat from_radius = length(from_radius_v);
// Determine the points on each segment with the smallest distance between.
@@ -420,7 +420,7 @@ test_intersection_from_tube(const CollisionEntry &entry) const {
LPoint3 into_closest = into_a + into_direction * into_t;
LPoint3 from_closest = from_a + from_direction * from_t;
- // If the distance is greater than the sum of tube radii, the test fails.
+ // If the distance is greater than the sum of capsule radii, the test fails.
LVector3 closest_vec = from_closest - into_closest;
PN_stdfloat distance = closest_vec.length();
if (distance > _radius + from_radius) {
@@ -442,7 +442,7 @@ test_intersection_from_tube(const CollisionEntry &entry) const {
new_entry->set_surface_point(into_closest + surface_normal * _radius);
new_entry->set_interior_point(from_closest - surface_normal * from_radius);
- if (has_effective_normal() && tube->get_respect_effective_normal()) {
+ if (has_effective_normal() && capsule->get_respect_effective_normal()) {
new_entry->set_surface_normal(get_effective_normal());
} else if (distance != 0) {
new_entry->set_surface_normal(surface_normal);
@@ -458,7 +458,7 @@ test_intersection_from_tube(const CollisionEntry &entry) const {
/**
*
*/
-PT(CollisionEntry) CollisionTube::
+PT(CollisionEntry) CollisionCapsule::
test_intersection_from_parabola(const CollisionEntry &entry) const {
const CollisionParabola *parabola;
DCAST_INTO_R(parabola, entry.get_from(), nullptr);
@@ -510,14 +510,14 @@ test_intersection_from_parabola(const CollisionEntry &entry) const {
* Fills the _viz_geom GeomNode up with Geoms suitable for rendering this
* solid.
*/
-void CollisionTube::
+void CollisionCapsule::
fill_viz_geom() {
if (collide_cat.is_debug()) {
collide_cat.debug()
<< "Recomputing viz for " << *this << "\n";
}
- // Generate the vertices such that we draw a tube with one endpoint at (0,
+ // Generate the vertices such that we draw a capsule with one endpoint at (0,
// 0, 0), and another at (0, length, 0). Then we'll rotate and translate it
// into place with the appropriate look_at matrix.
LVector3 direction = (_b - _a);
@@ -576,9 +576,9 @@ fill_viz_geom() {
/**
* Should be called internally to recompute the matrix and length when the
- * properties of the tube have changed.
+ * properties of the capsule have changed.
*/
-void CollisionTube::
+void CollisionCapsule::
recalc_internals() {
LVector3 direction = (_b - _a);
_length = direction.length();
@@ -595,7 +595,7 @@ recalc_internals() {
* Calculates a particular vertex on the surface of the first endcap
* hemisphere, for use in generating the viz geometry.
*/
-LVertex CollisionTube::
+LVertex CollisionCapsule::
calc_sphere1_vertex(int ri, int si, int num_rings, int num_slices) {
PN_stdfloat r = (PN_stdfloat)ri / (PN_stdfloat)num_rings;
PN_stdfloat s = (PN_stdfloat)si / (PN_stdfloat)num_slices;
@@ -620,7 +620,7 @@ calc_sphere1_vertex(int ri, int si, int num_rings, int num_slices) {
* Calculates a particular vertex on the surface of the second endcap
* hemisphere, for use in generating the viz geometry.
*/
-LVertex CollisionTube::
+LVertex CollisionCapsule::
calc_sphere2_vertex(int ri, int si, int num_rings, int num_slices,
PN_stdfloat length) {
PN_stdfloat r = (PN_stdfloat)ri / (PN_stdfloat)num_rings;
@@ -646,7 +646,7 @@ calc_sphere2_vertex(int ri, int si, int num_rings, int num_slices,
* Given line segments s1 and s2 defined by two points each, computes the
* point on each segment with the closest distance between them.
*/
-void CollisionTube::
+void CollisionCapsule::
calc_closest_segment_points(double &t1, double &t2,
const LPoint3 &from1, const LVector3 &delta1,
const LPoint3 &from2, const LVector3 &delta2) {
@@ -717,18 +717,18 @@ calc_closest_segment_points(double &t1, double &t2,
}
/**
- * Determine the point(s) of intersection of a parametric line with the tube.
+ * Determine the point(s) of intersection of a parametric line with the capsule.
* The line is infinite in both directions, and passes through "from" and
- * from+delta. If the line does not intersect the tube, the function returns
- * false, and t1 and t2 are undefined. If it does intersect the tube, it
+ * from+delta. If the line does not intersect the capsule, the function returns
+ * false, and t1 and t2 are undefined. If it does intersect the capsule, it
* returns true, and t1 and t2 are set to the points along the equation
* from+t*delta that correspond to the two points of intersection.
*/
-bool CollisionTube::
+bool CollisionCapsule::
intersects_line(double &t1, double &t2,
const LPoint3 &from0, const LVector3 &delta0,
PN_stdfloat inflate_radius) const {
- // Convert the line into our canonical coordinate space: the tube is aligned
+ // Convert the line into our canonical coordinate space: the capsule is aligned
// with the y axis.
LPoint3 from = from0 * _inv_mat;
LVector3 delta = delta0 * _inv_mat;
@@ -776,7 +776,7 @@ intersects_line(double &t1, double &t2,
}
}
- // The point is within the tube!
+ // The point is within the capsule!
t1 = t2 = 0.0;
return true;
}
@@ -819,15 +819,15 @@ intersects_line(double &t1, double &t2,
PN_stdfloat t2_y = from[1] + t2 * delta[1];
if (t1_y < -radius && t2_y < -radius) {
- // Both points are way off the bottom of the tube; no intersection.
+ // Both points are way off the bottom of the capsule; no intersection.
return false;
} else if (t1_y > _length + radius && t2_y > _length + radius) {
- // Both points are way off the top of the tube; no intersection.
+ // Both points are way off the top of the capsule; no intersection.
return false;
}
if (t1_y < 0.0f) {
- // The starting point is off the bottom of the tube. Test the line
+ // The starting point is off the bottom of the capsule. Test the line
// against the first endcap.
double t1a, t2a;
if (!sphere_intersects_line(t1a, t2a, 0.0f, from, delta, radius)) {
@@ -838,7 +838,7 @@ intersects_line(double &t1, double &t2,
t1 = t1a;
} else if (t1_y > _length) {
- // The starting point is off the top of the tube. Test the line against
+ // The starting point is off the top of the capsule. Test the line against
// the second endcap.
double t1b, t2b;
if (!sphere_intersects_line(t1b, t2b, _length, from, delta, radius)) {
@@ -850,7 +850,7 @@ intersects_line(double &t1, double &t2,
}
if (t2_y < 0.0f) {
- // The ending point is off the bottom of the tube. Test the line against
+ // The ending point is off the bottom of the capsule. Test the line against
// the first endcap.
double t1a, t2a;
if (!sphere_intersects_line(t1a, t2a, 0.0f, from, delta, radius)) {
@@ -861,7 +861,7 @@ intersects_line(double &t1, double &t2,
t2 = t2a;
} else if (t2_y > _length) {
- // The ending point is off the top of the tube. Test the line against the
+ // The ending point is off the top of the capsule. Test the line against the
// second endcap.
double t1b, t2b;
if (!sphere_intersects_line(t1b, t2b, _length, from, delta, radius)) {
@@ -880,7 +880,7 @@ intersects_line(double &t1, double &t2,
* whether it intersects one or the other endcaps. The y parameter specifies
* the center of the sphere (and hence the particular endcap).
*/
-bool CollisionTube::
+bool CollisionCapsule::
sphere_intersects_line(double &t1, double &t2, PN_stdfloat center_y,
const LPoint3 &from, const LVector3 &delta,
PN_stdfloat radius) {
@@ -917,14 +917,14 @@ sphere_intersects_line(double &t1, double &t2, PN_stdfloat center_y,
}
/**
- * Determine a point of intersection of a parametric parabola with the tube.
+ * Determine a point of intersection of a parametric parabola with the capsule.
*
* We only consider the segment of the parabola between t1 and t2, which has
* already been computed as corresponding to points p1 and p2. If there is an
* intersection, t is set to the parametric point of intersection, and true is
* returned; otherwise, false is returned.
*/
-bool CollisionTube::
+bool CollisionCapsule::
intersects_parabola(double &t, const LParabola ¶bola,
double t1, double t2,
const LPoint3 &p1, const LPoint3 &p2) const {
@@ -965,11 +965,11 @@ intersects_parabola(double &t, const LParabola ¶bola,
}
/**
- * Calculates a point that is exactly on the surface of the tube and its
+ * Calculates a point that is exactly on the surface of the capsule and its
* corresponding normal, given a point that is supposedly on the surface of
- * the tube.
+ * the capsule.
*/
-void CollisionTube::
+void CollisionCapsule::
calculate_surface_point_and_normal(const LPoint3 &surface_point,
double extra_radius,
LPoint3 &result_point,
@@ -1015,7 +1015,7 @@ calculate_surface_point_and_normal(const LPoint3 &surface_point,
* point in the CollisionEntry, and also compute the relevant normal based on
* that point.
*/
-void CollisionTube::
+void CollisionCapsule::
set_intersection_point(CollisionEntry *new_entry,
const LPoint3 &into_intersection_point,
double extra_radius) const {
@@ -1033,16 +1033,16 @@ set_intersection_point(CollisionEntry *new_entry,
new_entry->set_surface_normal(normal);
new_entry->set_surface_point(point);
- // Also adjust the original point into the tube by the amount of
- // extra_radius, which should put it on the surface of the tube if our
+ // Also adjust the original point into the capsule by the amount of
+ // extra_radius, which should put it on the surface of the capsule if our
// collision was tangential.
new_entry->set_interior_point(into_intersection_point - normal * extra_radius);
}
/**
- * Tells the BamReader how to create objects of type CollisionTube.
+ * Tells the BamReader how to create objects of type CollisionCapsule.
*/
-void CollisionTube::
+void CollisionCapsule::
register_with_read_factory() {
BamReader::get_factory()->register_factory(get_class_type(), make_from_bam);
}
@@ -1051,7 +1051,7 @@ register_with_read_factory() {
* Writes the contents of this object to the datagram for shipping out to a
* Bam file.
*/
-void CollisionTube::
+void CollisionCapsule::
write_datagram(BamWriter *manager, Datagram &dg) {
CollisionSolid::write_datagram(manager, dg);
_a.write_datagram(dg);
@@ -1061,12 +1061,12 @@ write_datagram(BamWriter *manager, Datagram &dg) {
/**
* This function is called by the BamReader's factory when a new object of
- * type CollisionTube is encountered in the Bam file. It should create the
- * CollisionTube and extract its information from the file.
+ * type CollisionCapsule is encountered in the Bam file. It should create the
+ * CollisionCapsule and extract its information from the file.
*/
-TypedWritable *CollisionTube::
+TypedWritable *CollisionCapsule::
make_from_bam(const FactoryParams ¶ms) {
- CollisionTube *node = new CollisionTube();
+ CollisionCapsule *node = new CollisionCapsule();
DatagramIterator scan;
BamReader *manager;
@@ -1078,9 +1078,9 @@ make_from_bam(const FactoryParams ¶ms) {
/**
* This internal function is called by make_from_bam to read in all of the
- * relevant data from the BamFile for the new CollisionTube.
+ * relevant data from the BamFile for the new CollisionCapsule.
*/
-void CollisionTube::
+void CollisionCapsule::
fillin(DatagramIterator &scan, BamReader *manager) {
CollisionSolid::fillin(scan, manager);
_a.read_datagram(scan);
diff --git a/panda/src/collide/collisionTube.h b/panda/src/collide/collisionCapsule.h
similarity index 81%
rename from panda/src/collide/collisionTube.h
rename to panda/src/collide/collisionCapsule.h
index 3d91ce2506..af5cbcc92d 100644
--- a/panda/src/collide/collisionTube.h
+++ b/panda/src/collide/collisionCapsule.h
@@ -6,38 +6,39 @@
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
- * @file collisionTube.h
+ * @file collisionCapsule.h
* @author drose
* @date 2003-09-25
*/
-#ifndef COLLISIONTUBE_H
-#define COLLISIONTUBE_H
+#ifndef COLLISIONCAPSULE_H
+#define COLLISIONCAPSULE_H
#include "pandabase.h"
#include "collisionSolid.h"
#include "parabola.h"
/**
- * This implements a solid roughly in cylindrical shape. It's not called a
- * CollisionCylinder because it's not a true cylinder; specifically, it has
- * rounded ends instead of flat ends. It looks more like a Contac pill.
+ * This implements a solid consisting of a cylinder with hemispherical endcaps,
+ * also known as a capsule or a spherocylinder.
+ *
+ * This shape was previously erroneously called CollisionTube.
*/
-class EXPCL_PANDA_COLLIDE CollisionTube : public CollisionSolid {
+class EXPCL_PANDA_COLLIDE CollisionCapsule : public CollisionSolid {
PUBLISHED:
- INLINE explicit CollisionTube(const LPoint3 &a, const LPoint3 &db,
- PN_stdfloat radius);
- INLINE explicit CollisionTube(PN_stdfloat ax, PN_stdfloat ay, PN_stdfloat az,
- PN_stdfloat bx, PN_stdfloat by, PN_stdfloat bz,
- PN_stdfloat radius);
+ INLINE explicit CollisionCapsule(const LPoint3 &a, const LPoint3 &db,
+ PN_stdfloat radius);
+ INLINE explicit CollisionCapsule(PN_stdfloat ax, PN_stdfloat ay, PN_stdfloat az,
+ PN_stdfloat bx, PN_stdfloat by, PN_stdfloat bz,
+ PN_stdfloat radius);
virtual LPoint3 get_collision_origin() const;
private:
- INLINE CollisionTube();
+ INLINE CollisionCapsule();
public:
- INLINE CollisionTube(const CollisionTube ©);
+ INLINE CollisionCapsule(const CollisionCapsule ©);
virtual CollisionSolid *make_copy();
virtual PT(CollisionEntry)
@@ -82,7 +83,7 @@ protected:
virtual PT(CollisionEntry)
test_intersection_from_segment(const CollisionEntry &entry) const;
virtual PT(CollisionEntry)
- test_intersection_from_tube(const CollisionEntry &entry) const;
+ test_intersection_from_capsule(const CollisionEntry &entry) const;
virtual PT(CollisionEntry)
test_intersection_from_parabola(const CollisionEntry &entry) const;
@@ -141,7 +142,7 @@ public:
}
static void init_type() {
CollisionSolid::init_type();
- register_type(_type_handle, "CollisionTube",
+ register_type(_type_handle, "CollisionCapsule",
CollisionSolid::get_class_type());
}
virtual TypeHandle get_type() const {
@@ -155,6 +156,13 @@ private:
friend class CollisionBox;
};
-#include "collisionTube.I"
+BEGIN_PUBLISH
+/**
+ * Alias for backward compatibility.
+ */
+typedef CollisionCapsule CollisionTube;
+END_PUBLISH
+
+#include "collisionCapsule.I"
#endif
diff --git a/panda/src/collide/collisionHandlerFluidPusher.cxx b/panda/src/collide/collisionHandlerFluidPusher.cxx
index df15e8bacc..622f5da00d 100644
--- a/panda/src/collide/collisionHandlerFluidPusher.cxx
+++ b/panda/src/collide/collisionHandlerFluidPusher.cxx
@@ -72,7 +72,7 @@ handle_entries() {
PosB = collider's current position
M = movement vector (PosB - PosA)
BV = bounding sphere that includes collider at PosA and PosB
- CS = 'collision set', all 'collidables' within BV (collision polys, tubes, etc)
+ CS = 'collision set', all 'collidables' within BV (collision polys, capsules, etc)
VARIABLES
N = movement vector since most recent collision (or start of frame)
diff --git a/panda/src/collide/collisionPlane.cxx b/panda/src/collide/collisionPlane.cxx
index 8a325ea082..2e174d4aa8 100644
--- a/panda/src/collide/collisionPlane.cxx
+++ b/panda/src/collide/collisionPlane.cxx
@@ -18,7 +18,7 @@
#include "collisionLine.h"
#include "collisionRay.h"
#include "collisionSegment.h"
-#include "collisionTube.h"
+#include "collisionCapsule.h"
#include "collisionParabola.h"
#include "config_collide.h"
#include "pointerToArray.h"
@@ -298,16 +298,16 @@ test_intersection_from_segment(const CollisionEntry &entry) const {
*
*/
PT(CollisionEntry) CollisionPlane::
-test_intersection_from_tube(const CollisionEntry &entry) const {
- const CollisionTube *tube;
- DCAST_INTO_R(tube, entry.get_from(), nullptr);
+test_intersection_from_capsule(const CollisionEntry &entry) const {
+ const CollisionCapsule *capsule;
+ DCAST_INTO_R(capsule, entry.get_from(), nullptr);
const LMatrix4 &wrt_mat = entry.get_wrt_mat();
- LPoint3 from_a = tube->get_point_a() * wrt_mat;
- LPoint3 from_b = tube->get_point_b() * wrt_mat;
+ LPoint3 from_a = capsule->get_point_a() * wrt_mat;
+ LPoint3 from_b = capsule->get_point_b() * wrt_mat;
LVector3 from_radius_v =
- LVector3(tube->get_radius(), 0.0f, 0.0f) * wrt_mat;
+ LVector3(capsule->get_radius(), 0.0f, 0.0f) * wrt_mat;
PN_stdfloat from_radius = length(from_radius_v);
PN_stdfloat dist_a = _plane.dist_to_plane(from_a);
@@ -325,7 +325,7 @@ test_intersection_from_tube(const CollisionEntry &entry) const {
}
PT(CollisionEntry) new_entry = new CollisionEntry(entry);
- LVector3 normal = (has_effective_normal() && tube->get_respect_effective_normal()) ? get_effective_normal() : get_normal();
+ LVector3 normal = (has_effective_normal() && capsule->get_respect_effective_normal()) ? get_effective_normal() : get_normal();
new_entry->set_surface_normal(normal);
PN_stdfloat t;
@@ -339,17 +339,17 @@ test_intersection_from_tube(const CollisionEntry &entry) const {
new_entry->set_surface_point(from_a - get_normal() * dist_a);
} else {
- // Within the tube! Yay, that means we have a surface point.
+ // Within the capsule! Yay, that means we have a surface point.
new_entry->set_surface_point(from_a + t * from_direction);
}
} else {
// If it's completely parallel, pretend it's colliding in the center of
- // the tube.
+ // the capsule.
new_entry->set_surface_point(from_a + 0.5f * from_direction - get_normal() * dist_a);
}
if (IS_NEARLY_EQUAL(dist_a, dist_b)) {
- // Let's be fair and choose the center of the tube.
+ // Let's be fair and choose the center of the capsule.
new_entry->set_interior_point(from_a + 0.5f * from_direction - get_normal() * from_radius);
} else if (dist_a < dist_b) {
diff --git a/panda/src/collide/collisionPlane.h b/panda/src/collide/collisionPlane.h
index bc7602ba8b..719e33f489 100644
--- a/panda/src/collide/collisionPlane.h
+++ b/panda/src/collide/collisionPlane.h
@@ -72,7 +72,7 @@ protected:
virtual PT(CollisionEntry)
test_intersection_from_segment(const CollisionEntry &entry) const;
virtual PT(CollisionEntry)
- test_intersection_from_tube(const CollisionEntry &entry) const;
+ test_intersection_from_capsule(const CollisionEntry &entry) const;
virtual PT(CollisionEntry)
test_intersection_from_parabola(const CollisionEntry &entry) const;
virtual PT(CollisionEntry)
diff --git a/panda/src/collide/collisionSolid.cxx b/panda/src/collide/collisionSolid.cxx
index b862ec7c73..b68673be15 100644
--- a/panda/src/collide/collisionSolid.cxx
+++ b/panda/src/collide/collisionSolid.cxx
@@ -17,7 +17,7 @@
#include "collisionLine.h"
#include "collisionRay.h"
#include "collisionSegment.h"
-#include "collisionTube.h"
+#include "collisionCapsule.h"
#include "collisionParabola.h"
#include "collisionBox.h"
#include "collisionEntry.h"
@@ -240,11 +240,11 @@ test_intersection_from_segment(const CollisionEntry &) const {
/**
* This is part of the double-dispatch implementation of test_intersection().
- * It is called when the "from" object is a tube.
+ * It is called when the "from" object is a capsule.
*/
PT(CollisionEntry) CollisionSolid::
-test_intersection_from_tube(const CollisionEntry &) const {
- report_undefined_intersection_test(CollisionTube::get_class_type(),
+test_intersection_from_capsule(const CollisionEntry &) const {
+ report_undefined_intersection_test(CollisionCapsule::get_class_type(),
get_type());
return nullptr;
}
diff --git a/panda/src/collide/collisionSolid.h b/panda/src/collide/collisionSolid.h
index 6b2914e954..4721d70381 100644
--- a/panda/src/collide/collisionSolid.h
+++ b/panda/src/collide/collisionSolid.h
@@ -108,7 +108,7 @@ protected:
virtual PT(CollisionEntry)
test_intersection_from_segment(const CollisionEntry &entry) const;
virtual PT(CollisionEntry)
- test_intersection_from_tube(const CollisionEntry &entry) const;
+ test_intersection_from_capsule(const CollisionEntry &entry) const;
virtual PT(CollisionEntry)
test_intersection_from_parabola(const CollisionEntry &entry) const;
virtual PT(CollisionEntry)
@@ -177,7 +177,7 @@ private:
friend class CollisionLine;
friend class CollisionRay;
friend class CollisionSegment;
- friend class CollisionTube;
+ friend class CollisionCapsule;
friend class CollisionParabola;
friend class CollisionHandlerFluidPusher;
friend class CollisionBox;
diff --git a/panda/src/collide/collisionSphere.cxx b/panda/src/collide/collisionSphere.cxx
index a07b1fbcbc..aacc43fcb2 100644
--- a/panda/src/collide/collisionSphere.cxx
+++ b/panda/src/collide/collisionSphere.cxx
@@ -17,7 +17,7 @@
#include "collisionHandler.h"
#include "collisionEntry.h"
#include "collisionSegment.h"
-#include "collisionTube.h"
+#include "collisionCapsule.h"
#include "collisionParabola.h"
#include "collisionBox.h"
#include "config_collide.h"
@@ -444,18 +444,18 @@ test_intersection_from_segment(const CollisionEntry &entry) const {
*
*/
PT(CollisionEntry) CollisionSphere::
-test_intersection_from_tube(const CollisionEntry &entry) const {
- const CollisionTube *tube;
- DCAST_INTO_R(tube, entry.get_from(), nullptr);
+test_intersection_from_capsule(const CollisionEntry &entry) const {
+ const CollisionCapsule *capsule;
+ DCAST_INTO_R(capsule, entry.get_from(), nullptr);
const LMatrix4 &wrt_mat = entry.get_wrt_mat();
- LPoint3 from_a = tube->get_point_a() * wrt_mat;
- LPoint3 from_b = tube->get_point_b() * wrt_mat;
+ LPoint3 from_a = capsule->get_point_a() * wrt_mat;
+ LPoint3 from_b = capsule->get_point_b() * wrt_mat;
LVector3 from_direction = from_b - from_a;
LVector3 from_radius_v =
- LVector3(tube->get_radius(), 0.0f, 0.0f) * wrt_mat;
+ LVector3(capsule->get_radius(), 0.0f, 0.0f) * wrt_mat;
PN_stdfloat from_radius = length(from_radius_v);
double t1, t2;
@@ -465,8 +465,8 @@ test_intersection_from_tube(const CollisionEntry &entry) const {
}
if (t2 < 0.0 || t1 > 1.0) {
- // Both intersection points are before the start of the tube or after
- // the end of the tube.
+ // Both intersection points are before the start of the capsule or after
+ // the end of the capsule.
return nullptr;
}
@@ -487,7 +487,7 @@ test_intersection_from_tube(const CollisionEntry &entry) const {
new_entry->set_surface_point(get_center() + normal * get_radius());
new_entry->set_interior_point(inner_point - normal * from_radius);
- if (has_effective_normal() && tube->get_respect_effective_normal()) {
+ if (has_effective_normal() && capsule->get_respect_effective_normal()) {
new_entry->set_surface_normal(get_effective_normal());
} else {
new_entry->set_surface_normal(normal);
diff --git a/panda/src/collide/collisionSphere.h b/panda/src/collide/collisionSphere.h
index 8337644b42..39b21d59f1 100644
--- a/panda/src/collide/collisionSphere.h
+++ b/panda/src/collide/collisionSphere.h
@@ -72,7 +72,7 @@ protected:
virtual PT(CollisionEntry)
test_intersection_from_segment(const CollisionEntry &entry) const;
virtual PT(CollisionEntry)
- test_intersection_from_tube(const CollisionEntry &entry) const;
+ test_intersection_from_capsule(const CollisionEntry &entry) const;
virtual PT(CollisionEntry)
test_intersection_from_parabola(const CollisionEntry &entry) const;
virtual PT(CollisionEntry)
diff --git a/panda/src/collide/collisionTraverser.cxx b/panda/src/collide/collisionTraverser.cxx
index 35f7966a3f..794e7552da 100644
--- a/panda/src/collide/collisionTraverser.cxx
+++ b/panda/src/collide/collisionTraverser.cxx
@@ -20,7 +20,7 @@
#include "collisionVisualizer.h"
#include "collisionSphere.h"
#include "collisionBox.h"
-#include "collisionTube.h"
+#include "collisionCapsule.h"
#include "collisionPolygon.h"
#include "collisionPlane.h"
#include "config_collide.h"
@@ -345,7 +345,7 @@ traverse(const NodePath &root) {
_geom_volume_pcollector.flush_level();
CollisionSphere::flush_level();
- CollisionTube::flush_level();
+ CollisionCapsule::flush_level();
CollisionPolygon::flush_level();
CollisionPlane::flush_level();
CollisionBox::flush_level();
diff --git a/panda/src/collide/config_collide.cxx b/panda/src/collide/config_collide.cxx
index 38c821ed05..b9ca4e368a 100644
--- a/panda/src/collide/config_collide.cxx
+++ b/panda/src/collide/config_collide.cxx
@@ -13,6 +13,7 @@
#include "config_collide.h"
#include "collisionBox.h"
+#include "collisionCapsule.h"
#include "collisionEntry.h"
#include "collisionHandler.h"
#include "collisionHandlerEvent.h"
@@ -38,7 +39,6 @@
#include "collisionSolid.h"
#include "collisionSphere.h"
#include "collisionTraverser.h"
-#include "collisionTube.h"
#include "collisionVisualizer.h"
#include "dconfig.h"
@@ -126,6 +126,7 @@ init_libcollide() {
initialized = true;
CollisionBox::init_type();
+ CollisionCapsule::init_type();
CollisionEntry::init_type();
CollisionHandler::init_type();
CollisionHandlerEvent::init_type();
@@ -150,14 +151,18 @@ init_libcollide() {
CollisionSolid::init_type();
CollisionSphere::init_type();
CollisionTraverser::init_type();
- CollisionTube::init_type();
#ifdef DO_COLLISION_RECORDING
CollisionRecorder::init_type();
CollisionVisualizer::init_type();
#endif
+ // Record the old name for CollisionCapsule for backwards compatibility.
+ BamWriter::record_obsolete_type_name(CollisionCapsule::get_class_type(),
+ "CollisionTube", 6, 44);
+
CollisionBox::register_with_read_factory();
+ CollisionCapsule::register_with_read_factory();
CollisionInvSphere::register_with_read_factory();
CollisionLine::register_with_read_factory();
CollisionNode::register_with_read_factory();
@@ -168,5 +173,4 @@ init_libcollide() {
CollisionRay::register_with_read_factory();
CollisionSegment::register_with_read_factory();
CollisionSphere::register_with_read_factory();
- CollisionTube::register_with_read_factory();
}
diff --git a/panda/src/collide/p3collide_composite1.cxx b/panda/src/collide/p3collide_composite1.cxx
index d66b71b18c..af8ecc07d8 100644
--- a/panda/src/collide/p3collide_composite1.cxx
+++ b/panda/src/collide/p3collide_composite1.cxx
@@ -1,5 +1,6 @@
#include "config_collide.cxx"
#include "collisionBox.cxx"
+#include "collisionCapsule.cxx"
#include "collisionEntry.cxx"
#include "collisionGeom.cxx"
#include "collisionHandler.cxx"
@@ -12,5 +13,3 @@
#include "collisionHandlerFluidPusher.cxx"
#include "collisionHandlerQueue.cxx"
#include "collisionInvSphere.cxx"
-#include "collisionLevelStateBase.cxx"
-#include "collisionLevelState.cxx"
diff --git a/panda/src/collide/p3collide_composite2.cxx b/panda/src/collide/p3collide_composite2.cxx
index 50a6acdddc..4b74e9dd9e 100644
--- a/panda/src/collide/p3collide_composite2.cxx
+++ b/panda/src/collide/p3collide_composite2.cxx
@@ -1,3 +1,5 @@
+#include "collisionLevelStateBase.cxx"
+#include "collisionLevelState.cxx"
#include "collisionLine.cxx"
#include "collisionNode.cxx"
#include "collisionParabola.cxx"
@@ -10,5 +12,4 @@
#include "collisionSolid.cxx"
#include "collisionSphere.cxx"
#include "collisionTraverser.cxx"
-#include "collisionTube.cxx"
#include "collisionVisualizer.cxx"
diff --git a/panda/src/display/graphicsEngine.cxx b/panda/src/display/graphicsEngine.cxx
index c06c2b207f..ae1052ba1d 100644
--- a/panda/src/display/graphicsEngine.cxx
+++ b/panda/src/display/graphicsEngine.cxx
@@ -110,8 +110,8 @@ PStatCollector GraphicsEngine::_volume_sphere_pcollector("Collision Volumes:Coll
PStatCollector GraphicsEngine::_test_sphere_pcollector("Collision Tests:CollisionSphere");
PStatCollector GraphicsEngine::_volume_box_pcollector("Collision Volumes:CollisionBox");
PStatCollector GraphicsEngine::_test_box_pcollector("Collision Tests:CollisionBox");
-PStatCollector GraphicsEngine::_volume_tube_pcollector("Collision Volumes:CollisionTube");
-PStatCollector GraphicsEngine::_test_tube_pcollector("Collision Tests:CollisionTube");
+PStatCollector GraphicsEngine::_volume_capsule_pcollector("Collision Volumes:CollisionCapsule");
+PStatCollector GraphicsEngine::_test_capsule_pcollector("Collision Tests:CollisionCapsule");
PStatCollector GraphicsEngine::_volume_inv_sphere_pcollector("Collision Volumes:CollisionInvSphere");
PStatCollector GraphicsEngine::_test_inv_sphere_pcollector("Collision Tests:CollisionInvSphere");
PStatCollector GraphicsEngine::_volume_geom_pcollector("Collision Volumes:CollisionGeom");
@@ -875,8 +875,8 @@ render_frame() {
_test_sphere_pcollector.clear_level();
_volume_box_pcollector.clear_level();
_test_box_pcollector.clear_level();
- _volume_tube_pcollector.clear_level();
- _test_tube_pcollector.clear_level();
+ _volume_capsule_pcollector.clear_level();
+ _test_capsule_pcollector.clear_level();
_volume_inv_sphere_pcollector.clear_level();
_test_inv_sphere_pcollector.clear_level();
_volume_geom_pcollector.clear_level();
diff --git a/panda/src/display/graphicsEngine.h b/panda/src/display/graphicsEngine.h
index 3371f20b39..e3e7df66c8 100644
--- a/panda/src/display/graphicsEngine.h
+++ b/panda/src/display/graphicsEngine.h
@@ -401,8 +401,8 @@ private:
static PStatCollector _test_sphere_pcollector;
static PStatCollector _volume_box_pcollector;
static PStatCollector _test_box_pcollector;
- static PStatCollector _volume_tube_pcollector;
- static PStatCollector _test_tube_pcollector;
+ static PStatCollector _volume_capsule_pcollector;
+ static PStatCollector _test_capsule_pcollector;
static PStatCollector _volume_inv_sphere_pcollector;
static PStatCollector _test_inv_sphere_pcollector;
static PStatCollector _volume_geom_pcollector;
diff --git a/panda/src/doc/collisionFlags.txt b/panda/src/doc/collisionFlags.txt
index 4989ef8e33..04a890f42b 100644
--- a/panda/src/doc/collisionFlags.txt
+++ b/panda/src/doc/collisionFlags.txt
@@ -6,7 +6,7 @@ camera-collide: for things that the camera should avoid
trigger: for things (usually not barriers or floors) that should trigger an
event when avatars intersect with them
sphere: for things that should have a collision sphere around them
-tube: for things that should have a collision tube (cylinder) around them
+tube: for things that should have a collision capsule around them
NOTES
diff --git a/panda/src/egg/eggGroup.cxx b/panda/src/egg/eggGroup.cxx
index 6bc6f152f0..fe36f2b123 100644
--- a/panda/src/egg/eggGroup.cxx
+++ b/panda/src/egg/eggGroup.cxx
@@ -897,7 +897,8 @@ string_cs_type(const string &strval) {
} else if (cmp_nocase_uh(strval, "inv-sphere") == 0 ||
cmp_nocase_uh(strval, "invsphere") == 0) {
return CST_inv_sphere;
- } else if (cmp_nocase_uh(strval, "tube") == 0) {
+ } else if (cmp_nocase_uh(strval, "tube") == 0 ||
+ cmp_nocase_uh(strval, "capsule") == 0) {
return CST_tube;
} else if (cmp_nocase_uh(strval, "floor-mesh") == 0 ||
cmp_nocase_uh(strval, "floormesh") == 0) {
diff --git a/panda/src/egg2pg/eggLoader.cxx b/panda/src/egg2pg/eggLoader.cxx
index 9d885e0234..6aeb84f54f 100644
--- a/panda/src/egg2pg/eggLoader.cxx
+++ b/panda/src/egg2pg/eggLoader.cxx
@@ -74,7 +74,7 @@
#include "collisionNode.h"
#include "collisionSphere.h"
#include "collisionInvSphere.h"
-#include "collisionTube.h"
+#include "collisionCapsule.h"
#include "collisionPlane.h"
#include "collisionPolygon.h"
#include "collisionFloorMesh.h"
@@ -2865,7 +2865,7 @@ make_collision_solids(EggGroup *start_group, EggGroup *egg_group,
break;
case EggGroup::CST_tube:
- make_collision_tube(egg_group, cnode, start_group->get_collide_flags());
+ make_collision_capsule(egg_group, cnode, start_group->get_collide_flags());
break;
case EggGroup::CST_floor_mesh:
@@ -3045,12 +3045,12 @@ make_collision_inv_sphere(EggGroup *egg_group, CollisionNode *cnode,
}
/**
- * Creates a single CollisionTube corresponding to the polygons associated
+ * Creates a single CollisionCapsule corresponding to the polygons associated
* with this group.
*/
void EggLoader::
-make_collision_tube(EggGroup *egg_group, CollisionNode *cnode,
- EggGroup::CollideFlags flags) {
+make_collision_capsule(EggGroup *egg_group, CollisionNode *cnode,
+ EggGroup::CollideFlags flags) {
EggGroup *geom_group = find_collision_geometry(egg_group, flags);
if (geom_group != nullptr) {
// Collect all of the vertices.
@@ -3175,7 +3175,7 @@ make_collision_tube(EggGroup *egg_group, CollisionNode *cnode,
// Transform all of the points so that the major axis is along the Y
// axis, and the origin is the center. This is very similar to the
- // CollisionTube's idea of its canonical orientation (although not
+ // CollisionCapsule's idea of its canonical orientation (although not
// exactly the same, since it is centered on the origin instead of
// having point_a on the origin). It makes it easier to determine the
// length and radius of the cylinder.
@@ -3230,11 +3230,11 @@ make_collision_tube(EggGroup *egg_group, CollisionNode *cnode,
LPoint3d point_a = center - half;
LPoint3d point_b = center + half;
- CollisionTube *cstube =
- new CollisionTube(LCAST(PN_stdfloat, point_a), LCAST(PN_stdfloat, point_b),
+ CollisionCapsule *cscapsule =
+ new CollisionCapsule(LCAST(PN_stdfloat, point_a), LCAST(PN_stdfloat, point_b),
radius);
- apply_collision_flags(cstube, flags);
- cnode->add_solid(cstube);
+ apply_collision_flags(cscapsule, flags);
+ cnode->add_solid(cscapsule);
}
}
}
diff --git a/panda/src/egg2pg/eggLoader.h b/panda/src/egg2pg/eggLoader.h
index eb81317bd8..0f974f41c2 100644
--- a/panda/src/egg2pg/eggLoader.h
+++ b/panda/src/egg2pg/eggLoader.h
@@ -180,8 +180,8 @@ private:
EggGroup::CollideFlags flags);
void make_collision_inv_sphere(EggGroup *egg_group, CollisionNode *cnode,
EggGroup::CollideFlags flags);
- void make_collision_tube(EggGroup *egg_group, CollisionNode *cnode,
- EggGroup::CollideFlags flags);
+ void make_collision_capsule(EggGroup *egg_group, CollisionNode *cnode,
+ EggGroup::CollideFlags flags);
void make_collision_floor_mesh(EggGroup *egg_group, CollisionNode *cnode,
EggGroup::CollideFlags flags);
void apply_collision_flags(CollisionSolid *solid,
diff --git a/panda/src/egg2pg/eggSaver.cxx b/panda/src/egg2pg/eggSaver.cxx
index fb6bb3a59b..9aba56cc01 100644
--- a/panda/src/egg2pg/eggSaver.cxx
+++ b/panda/src/egg2pg/eggSaver.cxx
@@ -39,7 +39,7 @@
#include "collisionSphere.h"
#include "collisionBox.h"
#include "collisionInvSphere.h"
-#include "collisionTube.h"
+#include "collisionCapsule.h"
#include "textureStage.h"
#include "geomNode.h"
#include "geom.h"
@@ -620,13 +620,13 @@ convert_collision_node(CollisionNode *node, const WorkingNodePath &node_path,
egg_poly->add_vertex(cvpool->create_unique_vertex(ev0));
egg_poly->add_vertex(cvpool->create_unique_vertex(ev1));
- } else if (child->is_of_type(CollisionTube::get_class_type())) {
- CPT(CollisionTube) tube = DCAST(CollisionTube, child);
- LPoint3 point_a = tube->get_point_a();
- LPoint3 point_b = tube->get_point_b();
+ } else if (child->is_of_type(CollisionCapsule::get_class_type())) {
+ CPT(CollisionCapsule) capsule = DCAST(CollisionCapsule, child);
+ LPoint3 point_a = capsule->get_point_a();
+ LPoint3 point_b = capsule->get_point_b();
LPoint3 centroid = (point_a + point_b) * 0.5f;
- // Also get an arbitrary vector perpendicular to the tube.
+ // Also get an arbitrary vector perpendicular to the capsule.
LVector3 axis = point_b - point_a;
LVector3 sideways;
if (std::fabs(axis[2]) > std::fabs(axis[1])) {
@@ -635,18 +635,18 @@ convert_collision_node(CollisionNode *node, const WorkingNodePath &node_path,
sideways = axis.cross(LVector3(0, 0, 1));
}
sideways.normalize();
- sideways *= tube->get_radius();
- LVector3 extend = axis.normalized() * tube->get_radius();
+ sideways *= capsule->get_radius();
+ LVector3 extend = axis.normalized() * capsule->get_radius();
- EggGroup *egg_tube;
+ EggGroup *egg_capsule;
if (num_solids == 1) {
- egg_tube = egg_group;
+ egg_capsule = egg_group;
} else {
- egg_tube = new EggGroup;
- egg_group->add_child(egg_tube);
+ egg_capsule = new EggGroup;
+ egg_group->add_child(egg_capsule);
}
- egg_tube->set_cs_type(EggGroup::CST_tube);
- egg_tube->set_collide_flags(flags);
+ egg_capsule->set_cs_type(EggGroup::CST_tube);
+ egg_capsule->set_collide_flags(flags);
// Add two points for the endcaps, and then two points around the
// centroid to indicate the radius.
@@ -657,7 +657,7 @@ convert_collision_node(CollisionNode *node, const WorkingNodePath &node_path,
ev3.set_pos(LCAST(double, (centroid - sideways) * net_mat));
EggPolygon *egg_poly = new EggPolygon;
- egg_tube->add_child(egg_poly);
+ egg_capsule->add_child(egg_poly);
egg_poly->add_vertex(cvpool->create_unique_vertex(ev0));
egg_poly->add_vertex(cvpool->create_unique_vertex(ev1));
diff --git a/panda/src/putil/bam.h b/panda/src/putil/bam.h
index 96f41cbf98..e21dadbc14 100644
--- a/panda/src/putil/bam.h
+++ b/panda/src/putil/bam.h
@@ -32,7 +32,7 @@ static const unsigned short _bam_major_ver = 6;
// Bumped to major version 6 on 2006-02-11 to factor out PandaNode::CData.
static const unsigned short _bam_first_minor_ver = 14;
-static const unsigned short _bam_minor_ver = 43;
+static const unsigned short _bam_minor_ver = 44;
// Bumped to minor version 14 on 2007-12-19 to change default ColorAttrib.
// Bumped to minor version 15 on 2008-04-09 to add TextureAttrib::_implicit_sort.
// Bumped to minor version 16 on 2008-05-13 to add Texture::_quality_level.
@@ -63,5 +63,6 @@ static const unsigned short _bam_minor_ver = 43;
// Bumped to minor version 41 on 2016-03-02 to change LensNode, Lens, and Camera.
// Bumped to minor version 42 on 2016-04-08 to expand ColorBlendAttrib.
// Bumped to minor version 43 on 2018-12-06 to expand BillboardEffect and CompassEffect.
+// Bumped to minor version 44 on 2018-12-23 to rename CollisionTube to CollisionCapsule.
#endif
diff --git a/panda/src/putil/bamWriter.cxx b/panda/src/putil/bamWriter.cxx
index d8aa3e0b30..3de731d27d 100644
--- a/panda/src/putil/bamWriter.cxx
+++ b/panda/src/putil/bamWriter.cxx
@@ -20,9 +20,28 @@
#include "bamWriter.h"
#include "bamReader.h"
#include "lightMutexHolder.h"
+#include "simpleHashMap.h"
#include
+// Keeps track of older type names in case we want to write out older .bam
+// files.
+struct ObsoleteName {
+ std::string _name;
+ int _before_major;
+ int _before_minor;
+
+ bool operator < (const ObsoleteName &other) const {
+ if (_before_major != other._before_major) {
+ return _before_major < other._before_major;
+ }
+ return _before_minor < other._before_minor;
+ }
+};
+
+// This is a SimpleHashMap to avoid static init ordering issues.
+static SimpleHashMap > obsolete_type_names;
+
/**
*
*/
@@ -504,7 +523,14 @@ write_handle(Datagram &packet, TypeHandle type) {
if (inserted) {
// This is the first time this TypeHandle has been written, so also
// write out its definition.
- packet.add_string(type.get_name());
+
+ if (_file_major == _bam_major_ver && _file_minor == _bam_minor_ver) {
+ packet.add_string(type.get_name());
+ } else {
+ // We are writing an older .bam format, so we need to look up whether
+ // we may need to write an older type name.
+ packet.add_string(get_obsolete_type_name(type, _file_major, _file_minor));
+ }
// We also need to write the derivation of the TypeHandle, in case the
// program reading this file later has never heard of this type before.
@@ -518,6 +544,45 @@ write_handle(Datagram &packet, TypeHandle type) {
}
}
+/**
+ * Returns the name that the given type had in an older .bam version.
+ */
+std::string BamWriter::
+get_obsolete_type_name(TypeHandle type, int major, int minor) {
+ int index = obsolete_type_names.find(type);
+ if (index >= 0) {
+ // Iterate over the names. It is sorted such that the lower versions are
+ // listed first.
+ for (const ObsoleteName &name : obsolete_type_names.get_data((size_t)index)) {
+ if (major < name._before_major ||
+ (major == name._before_major && minor < name._before_minor)) {
+ // We have a hit.
+ return name._name;
+ }
+ }
+ }
+
+ return TypeRegistry::ptr()->get_name(type, nullptr);
+}
+
+/**
+ * Registers the given type as having an older name in .bam files *before* the
+ * indicated version. You can call this multiple times for the same type in
+ * order to establish a history of renames for this type.
+ */
+void BamWriter::
+record_obsolete_type_name(TypeHandle type, std::string name,
+ int before_major, int before_minor) {
+ // Make sure it is registered as alternate name for reading.
+ TypeRegistry *reg = TypeRegistry::ptr();
+ reg->record_alternate_name(type, name);
+
+ ObsoleteName obsolete_name;
+ obsolete_name._name = std::move(name);
+ obsolete_name._before_major = before_major;
+ obsolete_name._before_minor = before_minor;
+ obsolete_type_names[type].insert(std::move(obsolete_name));
+}
/**
* This is called by the TypedWritable destructor. It should remove the
diff --git a/panda/src/putil/bamWriter.h b/panda/src/putil/bamWriter.h
index b8c53aac38..780104b61c 100644
--- a/panda/src/putil/bamWriter.h
+++ b/panda/src/putil/bamWriter.h
@@ -111,6 +111,10 @@ public:
bool register_pta(Datagram &packet, const void *ptr);
void write_handle(Datagram &packet, TypeHandle type);
+ static std::string get_obsolete_type_name(TypeHandle type, int major, int minor);
+ static void record_obsolete_type_name(TypeHandle type, std::string name,
+ int before_major, int before_minor);
+
private:
void object_destructs(TypedWritable *object);
diff --git a/pandatool/src/eggprogs/eggMakeTube.cxx b/pandatool/src/eggprogs/eggMakeTube.cxx
index 7017e97dcd..85ec85081d 100644
--- a/pandatool/src/eggprogs/eggMakeTube.cxx
+++ b/pandatool/src/eggprogs/eggMakeTube.cxx
@@ -29,7 +29,7 @@ EggMakeTube() {
set_program_description
("egg-make-tube generates an egg file representing a \"tube\" model, "
"a cylinder capped on both ends by hemispheres. This is similar "
- "in shape to the CollisionTube object within Panda.\n\n"
+ "in shape to the CollisionCapsule object within Panda.\n\n"
"This program can also generate spheres if you omit -b; in this "
"case, you are generating a degenerate tube of length 0.");
diff --git a/pandatool/src/eggprogs/eggMakeTube.h b/pandatool/src/eggprogs/eggMakeTube.h
index 520d178aee..3031b1c74e 100644
--- a/pandatool/src/eggprogs/eggMakeTube.h
+++ b/pandatool/src/eggprogs/eggMakeTube.h
@@ -24,7 +24,7 @@ class EggVertex;
/**
* A program to generate an egg file representing a tube model, similar in
- * shape to a CollisionTube.
+ * shape to a CollisionCapsule.
*/
class EggMakeTube : public EggMakeSomething {
public:
diff --git a/tests/collide/test_collision_tube.py b/tests/collide/test_collision_tube.py
new file mode 100644
index 0000000000..3d97754d87
--- /dev/null
+++ b/tests/collide/test_collision_tube.py
@@ -0,0 +1,63 @@
+from panda3d import core
+
+
+def test_collision_tube_alias():
+ assert hasattr(core, 'CollisionCapsule')
+ assert hasattr(core, 'CollisionTube')
+ assert core.CollisionTube is core.CollisionCapsule
+
+
+def test_collision_tube_write_old():
+ buffer = core.DatagramBuffer()
+ writer = core.BamWriter(buffer)
+ assert writer.get_file_major_ver() == 6
+ writer.set_file_minor_ver(43)
+
+ capsule = core.CollisionCapsule((0, 0, -1), (0, 0, 1), 0.5)
+ writer.init()
+ writer.write_object(capsule)
+ writer.flush()
+
+ data = buffer.data
+ assert b'CollisionTube' in data
+ assert b'CollisionCapsule' not in data
+
+
+def test_collision_tube_write_new():
+ buffer = core.DatagramBuffer()
+ writer = core.BamWriter(buffer)
+ assert writer.get_file_major_ver() == 6
+ writer.set_file_minor_ver(44)
+
+ capsule = core.CollisionCapsule((0, 0, -1), (0, 0, 1), 0.5)
+ writer.init()
+ writer.write_object(capsule)
+ writer.flush()
+
+ data = buffer.data
+ assert b'CollisionTube' not in data
+ assert b'CollisionCapsule' in data
+
+
+def test_collision_tube_read_old():
+ # Make sure we can read an older file that contains CollisionTube.
+ buffer = core.DatagramBuffer(b'\x06\x00\x00\x00\x06\x00+\x00\x01\x00\xd6\x00\x00\x00\x00j\x01\r\x00CollisionTube\x01h\x01\x0e\x00CollisionSolid\x01B\x00\x11\x00CopyOnWriteObject\x01A\x00!\x00CachedTypedWritableReferenceCount\x01=\x00\x1b\x00TypedWritableReferenceCount\x02<\x00\r\x00TypedWritable\x01\x03\x00\x0b\x00TypedObject\x00\x07\x00\x0e\x00ReferenceCount\x00\x01\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00?\x01\x00\x00\x00\x01')
+ reader = core.BamReader(buffer)
+ reader.init()
+ assert reader.file_version == (6, 43)
+
+ capsule = reader.read_object()
+ reader.resolve()
+ assert isinstance(capsule, core.CollisionCapsule)
+
+
+def test_collision_tube_read_new():
+ # Make sure we can read a newer file that contains CollisionCapsule.
+ buffer = core.DatagramBuffer(b'\x06\x00\x00\x00\x06\x00,\x00\x01\x00\xd9\x00\x00\x00\x00j\x01\x10\x00CollisionCapsule\x01h\x01\x0e\x00CollisionSolid\x01B\x00\x11\x00CopyOnWriteObject\x01A\x00!\x00CachedTypedWritableReferenceCount\x01=\x00\x1b\x00TypedWritableReferenceCount\x02<\x00\r\x00TypedWritable\x01\x03\x00\x0b\x00TypedObject\x00\x07\x00\x0e\x00ReferenceCount\x00\x01\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00?\x01\x00\x00\x00\x01')
+ reader = core.BamReader(buffer)
+ reader.init()
+ assert reader.file_version == (6, 44)
+
+ capsule = reader.read_object()
+ reader.resolve()
+ assert isinstance(capsule, core.CollisionCapsule)