Преглед на файлове

collide: Fix potential use-after-free with transform cache disabled

Fixes #1733
rdb преди 4 месеца
родител
ревизия
6ef4699a48

+ 10 - 5
panda/src/collide/collisionBox.cxx

@@ -419,7 +419,8 @@ test_intersection_from_line(const CollisionEntry &entry) const {
   const CollisionLine *line;
   const CollisionLine *line;
   DCAST_INTO_R(line, entry.get_from(), nullptr);
   DCAST_INTO_R(line, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_origin = line->get_origin() * wrt_mat;
   LPoint3 from_origin = line->get_origin() * wrt_mat;
   LVector3 from_direction = line->get_direction() * wrt_mat;
   LVector3 from_direction = line->get_direction() * wrt_mat;
@@ -462,7 +463,8 @@ PT(CollisionEntry) CollisionBox::
 test_intersection_from_ray(const CollisionEntry &entry) const {
 test_intersection_from_ray(const CollisionEntry &entry) const {
   const CollisionRay *ray;
   const CollisionRay *ray;
   DCAST_INTO_R(ray, entry.get_from(), nullptr);
   DCAST_INTO_R(ray, entry.get_from(), nullptr);
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_origin = ray->get_origin() * wrt_mat;
   LPoint3 from_origin = ray->get_origin() * wrt_mat;
   LVector3 from_direction = ray->get_direction() * wrt_mat;
   LVector3 from_direction = ray->get_direction() * wrt_mat;
@@ -511,7 +513,8 @@ PT(CollisionEntry) CollisionBox::
 test_intersection_from_segment(const CollisionEntry &entry) const {
 test_intersection_from_segment(const CollisionEntry &entry) const {
   const CollisionSegment *seg;
   const CollisionSegment *seg;
   DCAST_INTO_R(seg, entry.get_from(), nullptr);
   DCAST_INTO_R(seg, entry.get_from(), nullptr);
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_origin = seg->get_point_a() * wrt_mat;
   LPoint3 from_origin = seg->get_point_a() * wrt_mat;
   LPoint3 from_extent = seg->get_point_b() * wrt_mat;
   LPoint3 from_extent = seg->get_point_b() * wrt_mat;
@@ -566,7 +569,8 @@ test_intersection_from_capsule(const CollisionEntry &entry) const {
   const CollisionCapsule *capsule;
   const CollisionCapsule *capsule;
   DCAST_INTO_R(capsule, entry.get_from(), nullptr);
   DCAST_INTO_R(capsule, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_a = capsule->get_point_a() * wrt_mat;
   LPoint3 from_a = capsule->get_point_a() * wrt_mat;
   LPoint3 from_b = capsule->get_point_b() * wrt_mat;
   LPoint3 from_b = capsule->get_point_b() * wrt_mat;
@@ -711,7 +715,8 @@ test_intersection_from_box(const CollisionEntry &entry) const {
   const CollisionBox *box;
   const CollisionBox *box;
   DCAST_INTO_R(box, entry.get_from(), nullptr);
   DCAST_INTO_R(box, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 diff = wrt_mat.xform_point_general(box->get_center()) - _center;
   LPoint3 diff = wrt_mat.xform_point_general(box->get_center()) - _center;
   LVector3 from_extents = box->get_dimensions() * 0.5f;
   LVector3 from_extents = box->get_dimensions() * 0.5f;

+ 10 - 5
panda/src/collide/collisionCapsule.cxx

@@ -226,7 +226,8 @@ test_intersection_from_line(const CollisionEntry &entry) const {
   const CollisionLine *line;
   const CollisionLine *line;
   DCAST_INTO_R(line, entry.get_from(), nullptr);
   DCAST_INTO_R(line, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_origin = line->get_origin() * wrt_mat;
   LPoint3 from_origin = line->get_origin() * wrt_mat;
   LVector3 from_direction = line->get_direction() * wrt_mat;
   LVector3 from_direction = line->get_direction() * wrt_mat;
@@ -274,7 +275,8 @@ test_intersection_from_ray(const CollisionEntry &entry) const {
   const CollisionRay *ray;
   const CollisionRay *ray;
   DCAST_INTO_R(ray, entry.get_from(), nullptr);
   DCAST_INTO_R(ray, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_origin = ray->get_origin() * wrt_mat;
   LPoint3 from_origin = ray->get_origin() * wrt_mat;
   LVector3 from_direction = ray->get_direction() * wrt_mat;
   LVector3 from_direction = ray->get_direction() * wrt_mat;
@@ -335,7 +337,8 @@ test_intersection_from_segment(const CollisionEntry &entry) const {
   const CollisionSegment *segment;
   const CollisionSegment *segment;
   DCAST_INTO_R(segment, entry.get_from(), nullptr);
   DCAST_INTO_R(segment, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_a = segment->get_point_a() * wrt_mat;
   LPoint3 from_a = segment->get_point_a() * wrt_mat;
   LPoint3 from_b = segment->get_point_b() * wrt_mat;
   LPoint3 from_b = segment->get_point_b() * wrt_mat;
@@ -402,7 +405,8 @@ test_intersection_from_capsule(const CollisionEntry &entry) const {
   LPoint3 into_a = _a;
   LPoint3 into_a = _a;
   LVector3 into_direction = _b - into_a;
   LVector3 into_direction = _b - into_a;
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_a = capsule->get_point_a() * wrt_mat;
   LPoint3 from_a = capsule->get_point_a() * wrt_mat;
   LPoint3 from_b = capsule->get_point_b() * wrt_mat;
   LPoint3 from_b = capsule->get_point_b() * wrt_mat;
@@ -463,7 +467,8 @@ test_intersection_from_parabola(const CollisionEntry &entry) const {
   const CollisionParabola *parabola;
   const CollisionParabola *parabola;
   DCAST_INTO_R(parabola, entry.get_from(), nullptr);
   DCAST_INTO_R(parabola, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   // Convert the parabola into local coordinate space.
   // Convert the parabola into local coordinate space.
   LParabola local_p(parabola->get_parabola());
   LParabola local_p(parabola->get_parabola());

+ 6 - 2
panda/src/collide/collisionFloorMesh.cxx

@@ -130,7 +130,9 @@ PT(CollisionEntry) CollisionFloorMesh::
 test_intersection_from_ray(const CollisionEntry &entry) const {
 test_intersection_from_ray(const CollisionEntry &entry) const {
   const CollisionRay *ray;
   const CollisionRay *ray;
   DCAST_INTO_R(ray, entry.get_from(), nullptr);
   DCAST_INTO_R(ray, entry.get_from(), nullptr);
-  LPoint3 from_origin = ray->get_origin() * entry.get_wrt_mat();
+
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  LPoint3 from_origin = ray->get_origin() * wrt_space->get_mat();
 
 
   double fx = from_origin[0];
   double fx = from_origin[0];
   double fy = from_origin[1];
   double fy = from_origin[1];
@@ -195,7 +197,9 @@ PT(CollisionEntry) CollisionFloorMesh::
 test_intersection_from_sphere(const CollisionEntry &entry) const {
 test_intersection_from_sphere(const CollisionEntry &entry) const {
   const CollisionSphere *sphere;
   const CollisionSphere *sphere;
   DCAST_INTO_R(sphere, entry.get_from(), nullptr);
   DCAST_INTO_R(sphere, entry.get_from(), nullptr);
-  LPoint3 from_origin = sphere->get_center() * entry.get_wrt_mat();
+
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  LPoint3 from_origin = sphere->get_center() * wrt_space->get_mat();
 
 
   double fx = from_origin[0];
   double fx = from_origin[0];
   double fy = from_origin[1];
   double fy = from_origin[1];

+ 12 - 6
panda/src/collide/collisionInvSphere.cxx

@@ -94,7 +94,8 @@ test_intersection_from_sphere(const CollisionEntry &entry) const {
   const CollisionSphere *sphere;
   const CollisionSphere *sphere;
   DCAST_INTO_R(sphere, entry.get_from(), nullptr);
   DCAST_INTO_R(sphere, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_center = sphere->get_center() * wrt_mat;
   LPoint3 from_center = sphere->get_center() * wrt_mat;
   LVector3 from_radius_v =
   LVector3 from_radius_v =
@@ -146,7 +147,8 @@ test_intersection_from_line(const CollisionEntry &entry) const {
   const CollisionLine *line;
   const CollisionLine *line;
   DCAST_INTO_R(line, entry.get_from(), nullptr);
   DCAST_INTO_R(line, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_origin = line->get_origin() * wrt_mat;
   LPoint3 from_origin = line->get_origin() * wrt_mat;
   LVector3 from_direction = line->get_direction() * wrt_mat;
   LVector3 from_direction = line->get_direction() * wrt_mat;
@@ -187,7 +189,8 @@ test_intersection_from_ray(const CollisionEntry &entry) const {
   const CollisionRay *ray;
   const CollisionRay *ray;
   DCAST_INTO_R(ray, entry.get_from(), nullptr);
   DCAST_INTO_R(ray, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_origin = ray->get_origin() * wrt_mat;
   LPoint3 from_origin = ray->get_origin() * wrt_mat;
   LVector3 from_direction = ray->get_direction() * wrt_mat;
   LVector3 from_direction = ray->get_direction() * wrt_mat;
@@ -230,7 +233,8 @@ test_intersection_from_segment(const CollisionEntry &entry) const {
   const CollisionSegment *segment;
   const CollisionSegment *segment;
   DCAST_INTO_R(segment, entry.get_from(), nullptr);
   DCAST_INTO_R(segment, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_a = segment->get_point_a() * wrt_mat;
   LPoint3 from_a = segment->get_point_a() * wrt_mat;
   LPoint3 from_b = segment->get_point_b() * wrt_mat;
   LPoint3 from_b = segment->get_point_b() * wrt_mat;
@@ -296,7 +300,8 @@ test_intersection_from_capsule(const CollisionEntry &entry) const {
   const CollisionCapsule *capsule;
   const CollisionCapsule *capsule;
   DCAST_INTO_R(capsule, entry.get_from(), nullptr);
   DCAST_INTO_R(capsule, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_a = capsule->get_point_a() * wrt_mat;
   LPoint3 from_a = capsule->get_point_a() * wrt_mat;
   LPoint3 from_b = capsule->get_point_b() * wrt_mat;
   LPoint3 from_b = capsule->get_point_b() * wrt_mat;
@@ -351,7 +356,8 @@ test_intersection_from_box(const CollisionEntry &entry) const {
   const CollisionBox *box;
   const CollisionBox *box;
   DCAST_INTO_R(box, entry.get_from(), nullptr);
   DCAST_INTO_R(box, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 center = get_center();
   LPoint3 center = get_center();
   PN_stdfloat radius_sq = get_radius();
   PN_stdfloat radius_sq = get_radius();

+ 14 - 7
panda/src/collide/collisionPlane.cxx

@@ -109,7 +109,8 @@ test_intersection_from_sphere(const CollisionEntry &entry) const {
   const CollisionSphere *sphere;
   const CollisionSphere *sphere;
   DCAST_INTO_R(sphere, entry.get_from(), nullptr);
   DCAST_INTO_R(sphere, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_center = sphere->get_center() * wrt_mat;
   LPoint3 from_center = sphere->get_center() * wrt_mat;
   LVector3 from_radius_v =
   LVector3 from_radius_v =
@@ -148,7 +149,8 @@ test_intersection_from_line(const CollisionEntry &entry) const {
   const CollisionLine *line;
   const CollisionLine *line;
   DCAST_INTO_R(line, entry.get_from(), nullptr);
   DCAST_INTO_R(line, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_origin = line->get_origin() * wrt_mat;
   LPoint3 from_origin = line->get_origin() * wrt_mat;
   LVector3 from_direction = line->get_direction() * wrt_mat;
   LVector3 from_direction = line->get_direction() * wrt_mat;
@@ -193,7 +195,8 @@ test_intersection_from_ray(const CollisionEntry &entry) const {
   const CollisionRay *ray;
   const CollisionRay *ray;
   DCAST_INTO_R(ray, entry.get_from(), nullptr);
   DCAST_INTO_R(ray, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_origin = ray->get_origin() * wrt_mat;
   LPoint3 from_origin = ray->get_origin() * wrt_mat;
   LVector3 from_direction = ray->get_direction() * wrt_mat;
   LVector3 from_direction = ray->get_direction() * wrt_mat;
@@ -245,7 +248,8 @@ test_intersection_from_segment(const CollisionEntry &entry) const {
   const CollisionSegment *segment;
   const CollisionSegment *segment;
   DCAST_INTO_R(segment, entry.get_from(), nullptr);
   DCAST_INTO_R(segment, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_a = segment->get_point_a() * wrt_mat;
   LPoint3 from_a = segment->get_point_a() * wrt_mat;
   LPoint3 from_b = segment->get_point_b() * wrt_mat;
   LPoint3 from_b = segment->get_point_b() * wrt_mat;
@@ -302,7 +306,8 @@ test_intersection_from_capsule(const CollisionEntry &entry) const {
   const CollisionCapsule *capsule;
   const CollisionCapsule *capsule;
   DCAST_INTO_R(capsule, entry.get_from(), nullptr);
   DCAST_INTO_R(capsule, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_a = capsule->get_point_a() * wrt_mat;
   LPoint3 from_a = capsule->get_point_a() * wrt_mat;
   LPoint3 from_b = capsule->get_point_b() * wrt_mat;
   LPoint3 from_b = capsule->get_point_b() * wrt_mat;
@@ -373,7 +378,8 @@ test_intersection_from_parabola(const CollisionEntry &entry) const {
   const CollisionParabola *parabola;
   const CollisionParabola *parabola;
   DCAST_INTO_R(parabola, entry.get_from(), nullptr);
   DCAST_INTO_R(parabola, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   // Convert the parabola into local coordinate space.
   // Convert the parabola into local coordinate space.
   LParabola local_p(parabola->get_parabola());
   LParabola local_p(parabola->get_parabola());
@@ -439,7 +445,8 @@ test_intersection_from_box(const CollisionEntry &entry) const {
   const CollisionBox *box;
   const CollisionBox *box;
   DCAST_INTO_R(box, entry.get_from(), nullptr);
   DCAST_INTO_R(box, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_center = box->get_center() * wrt_mat;
   LPoint3 from_center = box->get_center() * wrt_mat;
   LVector3 from_extents = box->get_dimensions() * 0.5f;
   LVector3 from_extents = box->get_dimensions() * 0.5f;

+ 12 - 6
panda/src/collide/collisionPolygon.cxx

@@ -552,7 +552,8 @@ test_intersection_from_line(const CollisionEntry &entry) const {
   const CollisionLine *line;
   const CollisionLine *line;
   DCAST_INTO_R(line, entry.get_from(), nullptr);
   DCAST_INTO_R(line, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_origin = line->get_origin() * wrt_mat;
   LPoint3 from_origin = line->get_origin() * wrt_mat;
   LVector3 from_direction = line->get_direction() * wrt_mat;
   LVector3 from_direction = line->get_direction() * wrt_mat;
@@ -620,7 +621,8 @@ test_intersection_from_ray(const CollisionEntry &entry) const {
   const CollisionRay *ray;
   const CollisionRay *ray;
   DCAST_INTO_R(ray, entry.get_from(), nullptr);
   DCAST_INTO_R(ray, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_origin = ray->get_origin() * wrt_mat;
   LPoint3 from_origin = ray->get_origin() * wrt_mat;
   LVector3 from_direction = ray->get_direction() * wrt_mat;
   LVector3 from_direction = ray->get_direction() * wrt_mat;
@@ -693,7 +695,8 @@ test_intersection_from_segment(const CollisionEntry &entry) const {
   const CollisionSegment *segment;
   const CollisionSegment *segment;
   DCAST_INTO_R(segment, entry.get_from(), nullptr);
   DCAST_INTO_R(segment, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_a = segment->get_point_a() * wrt_mat;
   LPoint3 from_a = segment->get_point_a() * wrt_mat;
   LPoint3 from_b = segment->get_point_b() * wrt_mat;
   LPoint3 from_b = segment->get_point_b() * wrt_mat;
@@ -763,7 +766,8 @@ test_intersection_from_capsule(const CollisionEntry &entry) const {
   const CollisionCapsule *capsule;
   const CollisionCapsule *capsule;
   DCAST_INTO_R(capsule, entry.get_from(), nullptr);
   DCAST_INTO_R(capsule, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_a = capsule->get_point_a() * wrt_mat;
   LPoint3 from_a = capsule->get_point_a() * wrt_mat;
   LPoint3 from_b = capsule->get_point_b() * wrt_mat;
   LPoint3 from_b = capsule->get_point_b() * wrt_mat;
@@ -962,7 +966,8 @@ test_intersection_from_parabola(const CollisionEntry &entry) const {
   const CollisionParabola *parabola;
   const CollisionParabola *parabola;
   DCAST_INTO_R(parabola, entry.get_from(), nullptr);
   DCAST_INTO_R(parabola, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   // Convert the parabola into local coordinate space.
   // Convert the parabola into local coordinate space.
   LParabola local_p(parabola->get_parabola());
   LParabola local_p(parabola->get_parabola());
@@ -1049,7 +1054,8 @@ test_intersection_from_box(const CollisionEntry &entry) const {
 
 
   // To make things easier, transform the box into the coordinate space of the
   // To make things easier, transform the box into the coordinate space of the
   // plane.
   // plane.
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
   LMatrix4 plane_mat = wrt_mat * _to_2d_mat;
   LMatrix4 plane_mat = wrt_mat * _to_2d_mat;
 
 
   LPoint3 from_center = box->get_center() * plane_mat;
   LPoint3 from_center = box->get_center() * plane_mat;

+ 16 - 9
panda/src/collide/collisionSphere.cxx

@@ -236,7 +236,8 @@ test_intersection_from_line(const CollisionEntry &entry) const {
   const CollisionLine *line;
   const CollisionLine *line;
   DCAST_INTO_R(line, entry.get_from(), nullptr);
   DCAST_INTO_R(line, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_origin = line->get_origin() * wrt_mat;
   LPoint3 from_origin = line->get_origin() * wrt_mat;
   LVector3 from_direction = line->get_direction() * wrt_mat;
   LVector3 from_direction = line->get_direction() * wrt_mat;
@@ -278,10 +279,11 @@ test_intersection_from_box(const CollisionEntry &entry) const {
 
 
   // Instead of transforming the box into the sphere's coordinate space, we do
   // Instead of transforming the box into the sphere's coordinate space, we do
   // it the other way around.  It's easier that way.
   // it the other way around.  It's easier that way.
-  const LMatrix4 &wrt_mat = entry.get_inv_wrt_mat();
+  CPT(TransformState) inv_wrt_space = entry.get_inv_wrt_space();
+  const LMatrix4 &inv_wrt_mat = inv_wrt_space->get_mat();
 
 
-  LPoint3 center = wrt_mat.xform_point(_center);
-  PN_stdfloat radius_sq = wrt_mat.xform_vec(LVector3(0, 0, _radius)).length_squared();
+  LPoint3 center = inv_wrt_mat.xform_point(_center);
+  PN_stdfloat radius_sq = inv_wrt_mat.xform_vec(LVector3(0, 0, _radius)).length_squared();
 
 
   LPoint3 box_min = box->get_min();
   LPoint3 box_min = box->get_min();
   LPoint3 box_max = box->get_max();
   LPoint3 box_max = box->get_max();
@@ -330,7 +332,8 @@ test_intersection_from_box(const CollisionEntry &entry) const {
   PT(CollisionEntry) new_entry = new CollisionEntry(entry);
   PT(CollisionEntry) new_entry = new CollisionEntry(entry);
 
 
   // To get the interior point, clamp the sphere center to the AABB.
   // To get the interior point, clamp the sphere center to the AABB.
-  LPoint3 interior = entry.get_wrt_mat().xform_point(center.fmax(box_min).fmin(box_max));
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  LPoint3 interior = wrt_space->get_mat().xform_point(center.fmax(box_min).fmin(box_max));
   new_entry->set_interior_point(interior);
   new_entry->set_interior_point(interior);
 
 
   // Now extrapolate the surface point and normal from that.
   // Now extrapolate the surface point and normal from that.
@@ -352,7 +355,8 @@ test_intersection_from_ray(const CollisionEntry &entry) const {
   const CollisionRay *ray;
   const CollisionRay *ray;
   DCAST_INTO_R(ray, entry.get_from(), nullptr);
   DCAST_INTO_R(ray, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_origin = ray->get_origin() * wrt_mat;
   LPoint3 from_origin = ray->get_origin() * wrt_mat;
   LVector3 from_direction = ray->get_direction() * wrt_mat;
   LVector3 from_direction = ray->get_direction() * wrt_mat;
@@ -399,7 +403,8 @@ test_intersection_from_segment(const CollisionEntry &entry) const {
   const CollisionSegment *segment;
   const CollisionSegment *segment;
   DCAST_INTO_R(segment, entry.get_from(), nullptr);
   DCAST_INTO_R(segment, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_a = segment->get_point_a() * wrt_mat;
   LPoint3 from_a = segment->get_point_a() * wrt_mat;
   LPoint3 from_b = segment->get_point_b() * wrt_mat;
   LPoint3 from_b = segment->get_point_b() * wrt_mat;
@@ -448,7 +453,8 @@ test_intersection_from_capsule(const CollisionEntry &entry) const {
   const CollisionCapsule *capsule;
   const CollisionCapsule *capsule;
   DCAST_INTO_R(capsule, entry.get_from(), nullptr);
   DCAST_INTO_R(capsule, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   LPoint3 from_a = capsule->get_point_a() * wrt_mat;
   LPoint3 from_a = capsule->get_point_a() * wrt_mat;
   LPoint3 from_b = capsule->get_point_b() * wrt_mat;
   LPoint3 from_b = capsule->get_point_b() * wrt_mat;
@@ -504,7 +510,8 @@ test_intersection_from_parabola(const CollisionEntry &entry) const {
   const CollisionParabola *parabola;
   const CollisionParabola *parabola;
   DCAST_INTO_R(parabola, entry.get_from(), nullptr);
   DCAST_INTO_R(parabola, entry.get_from(), nullptr);
 
 
-  const LMatrix4 &wrt_mat = entry.get_wrt_mat();
+  CPT(TransformState) wrt_space = entry.get_wrt_space();
+  const LMatrix4 &wrt_mat = wrt_space->get_mat();
 
 
   // Convert the parabola into local coordinate space.
   // Convert the parabola into local coordinate space.
   LParabola local_p(parabola->get_parabola());
   LParabola local_p(parabola->get_parabola());