mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 10:54:24 -04:00
qpgeom supports collide-with-geom
This commit is contained in:
parent
e7a79098b6
commit
87a7fd85bf
@ -27,6 +27,9 @@
|
|||||||
#include "transformState.h"
|
#include "transformState.h"
|
||||||
#include "geomNode.h"
|
#include "geomNode.h"
|
||||||
#include "geom.h"
|
#include "geom.h"
|
||||||
|
#include "qpgeom.h"
|
||||||
|
#include "qpgeomTriangles.h"
|
||||||
|
#include "qpgeomVertexReader.h"
|
||||||
#include "lodNode.h"
|
#include "lodNode.h"
|
||||||
#include "nodePath.h"
|
#include "nodePath.h"
|
||||||
#include "pStatTimer.h"
|
#include "pStatTimer.h"
|
||||||
@ -738,21 +741,55 @@ compare_collider_to_geom(CollisionEntry &entry, const Geom *geom,
|
|||||||
ci = _colliders.find(entry.get_from_node_path());
|
ci = _colliders.find(entry.get_from_node_path());
|
||||||
nassertv(ci != _colliders.end());
|
nassertv(ci != _colliders.end());
|
||||||
|
|
||||||
PTA_Vertexf coords;
|
if (geom->is_of_type(qpGeom::get_class_type())) {
|
||||||
PTA_ushort vindex;
|
const qpGeom *qpgeom = DCAST(qpGeom, geom);
|
||||||
geom->get_coords(coords, vindex);
|
if (qpgeom->get_primitive_type() == qpGeom::PT_polygons) {
|
||||||
PTA_ushort tris = geom->get_tris();
|
const qpGeomVertexData *data =qpgeom->get_vertex_data();
|
||||||
|
qpGeomVertexReader vertex(data, InternalName::get_vertex());
|
||||||
|
|
||||||
for (int i = 0; i < (int)tris.size(); i += 3) {
|
int num_primitives = qpgeom->get_num_primitives();
|
||||||
if (CollisionPolygon::verify_points(coords[tris[i]],
|
for (int i = 0; i < num_primitives; ++i) {
|
||||||
coords[tris[i + 1]],
|
const qpGeomPrimitive *primitive = qpgeom->get_primitive(i);
|
||||||
coords[tris[i + 2]])) {
|
CPT(qpGeomPrimitive) tris = primitive->decompose();
|
||||||
// Generate a temporary CollisionPolygon on the fly for each
|
nassertv(tris->is_of_type(qpGeomTriangles::get_class_type()));
|
||||||
// triangle in the Geom.
|
int num_vertices = tris->get_num_vertices();
|
||||||
entry._into =
|
nassertv((num_vertices % 3) == 0);
|
||||||
new CollisionPolygon(coords[tris[i]], coords[tris[i + 1]],
|
|
||||||
coords[tris[i + 2]]);
|
for (int vi = 0; vi < num_vertices; vi += 3) {
|
||||||
entry.test_intersection((*ci).second, this);
|
vertex.set_row(tris->get_vertex(vi));
|
||||||
|
Vertexf v0 = vertex.get_data3f();
|
||||||
|
vertex.set_row(tris->get_vertex(vi + 1));
|
||||||
|
Vertexf v1 = vertex.get_data3f();
|
||||||
|
vertex.set_row(tris->get_vertex(vi + 2));
|
||||||
|
Vertexf v2 = vertex.get_data3f();
|
||||||
|
|
||||||
|
// Generate a temporary CollisionPolygon on the fly for
|
||||||
|
// each triangle in the Geom.
|
||||||
|
if (CollisionPolygon::verify_points(v0, v1, v2)) {
|
||||||
|
entry._into = new CollisionPolygon(v0, v1, v2);
|
||||||
|
entry.test_intersection((*ci).second, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
PTA_Vertexf coords;
|
||||||
|
PTA_ushort vindex;
|
||||||
|
geom->get_coords(coords, vindex);
|
||||||
|
PTA_ushort tris = geom->get_tris();
|
||||||
|
|
||||||
|
for (int i = 0; i < (int)tris.size(); i += 3) {
|
||||||
|
if (CollisionPolygon::verify_points(coords[tris[i]],
|
||||||
|
coords[tris[i + 1]],
|
||||||
|
coords[tris[i + 2]])) {
|
||||||
|
// Generate a temporary CollisionPolygon on the fly for each
|
||||||
|
// triangle in the Geom.
|
||||||
|
entry._into =
|
||||||
|
new CollisionPolygon(coords[tris[i]], coords[tris[i + 1]],
|
||||||
|
coords[tris[i + 2]]);
|
||||||
|
entry.test_intersection((*ci).second, this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user