You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-17 14:11:06 +00:00
Merge pull request #48551 from nekomatata/concave-shape-optimization-3.x
[3.x] Optimize area detection and intersect_shape queries with concave shapes
This commit is contained in:
@@ -1383,11 +1383,11 @@ Vector3 ConcavePolygonShapeSW::get_closest_point_to(const Vector3 &p_point) cons
|
||||
return Vector3();
|
||||
}
|
||||
|
||||
void ConcavePolygonShapeSW::_cull(int p_idx, _CullParams *p_params) const {
|
||||
bool ConcavePolygonShapeSW::_cull(int p_idx, _CullParams *p_params) const {
|
||||
const BVH *bvh = &p_params->bvh[p_idx];
|
||||
|
||||
if (!p_params->aabb.intersects(bvh->aabb)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (bvh->face_index >= 0) {
|
||||
@@ -1397,20 +1397,28 @@ void ConcavePolygonShapeSW::_cull(int p_idx, _CullParams *p_params) const {
|
||||
face->vertex[0] = p_params->vertices[f->indices[0]];
|
||||
face->vertex[1] = p_params->vertices[f->indices[1]];
|
||||
face->vertex[2] = p_params->vertices[f->indices[2]];
|
||||
p_params->callback(p_params->userdata, face);
|
||||
if (p_params->callback(p_params->userdata, face)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
} else {
|
||||
if (bvh->left >= 0) {
|
||||
_cull(bvh->left, p_params);
|
||||
if (_cull(bvh->left, p_params)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (bvh->right >= 0) {
|
||||
_cull(bvh->right, p_params);
|
||||
if (_cull(bvh->right, p_params)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void ConcavePolygonShapeSW::cull(const AABB &p_local_aabb, Callback p_callback, void *p_userdata) const {
|
||||
void ConcavePolygonShapeSW::cull(const AABB &p_local_aabb, QueryCallback p_callback, void *p_userdata) const {
|
||||
// make matrix local to concave
|
||||
if (faces.size() == 0) {
|
||||
return;
|
||||
@@ -1873,7 +1881,7 @@ void HeightMapShapeSW::_get_cell(const Vector3 &p_point, int &r_x, int &r_y, int
|
||||
r_z = (clamped_point.z < 0.0) ? (clamped_point.z - 0.5) : (clamped_point.z + 0.5);
|
||||
}
|
||||
|
||||
void HeightMapShapeSW::cull(const AABB &p_local_aabb, Callback p_callback, void *p_userdata) const {
|
||||
void HeightMapShapeSW::cull(const AABB &p_local_aabb, QueryCallback p_callback, void *p_userdata) const {
|
||||
if (heights.empty()) {
|
||||
return;
|
||||
}
|
||||
@@ -1908,13 +1916,17 @@ void HeightMapShapeSW::cull(const AABB &p_local_aabb, Callback p_callback, void
|
||||
_get_point(x + 1, z, face.vertex[1]);
|
||||
_get_point(x, z + 1, face.vertex[2]);
|
||||
face.normal = Plane(face.vertex[0], face.vertex[1], face.vertex[2]).normal;
|
||||
p_callback(p_userdata, &face);
|
||||
if (p_callback(p_userdata, &face)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Second triangle.
|
||||
face.vertex[0] = face.vertex[1];
|
||||
_get_point(x + 1, z + 1, face.vertex[1]);
|
||||
face.normal = Plane(face.vertex[0], face.vertex[1], face.vertex[2]).normal;
|
||||
p_callback(p_userdata, &face);
|
||||
if (p_callback(p_userdata, &face)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user