You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-22 15:06:45 +00:00
Cleanup unused engine code v2
This commit is contained in:
@@ -198,149 +198,6 @@ struct _FaceClassify {
|
||||
_FaceClassify() {}
|
||||
};
|
||||
|
||||
static bool _connect_faces(_FaceClassify *p_faces, int len, int p_group) {
|
||||
// Connect faces, error will occur if an edge is shared between more than 2 faces.
|
||||
// Clear connections.
|
||||
|
||||
bool error = false;
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
for (int j = 0; j < 3; j++) {
|
||||
p_faces[i].links[j].clear();
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
if (p_faces[i].group != p_group) {
|
||||
continue;
|
||||
}
|
||||
for (int j = i + 1; j < len; j++) {
|
||||
if (p_faces[j].group != p_group) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (int k = 0; k < 3; k++) {
|
||||
Vector3 vi1 = p_faces[i].face.vertex[k];
|
||||
Vector3 vi2 = p_faces[i].face.vertex[(k + 1) % 3];
|
||||
|
||||
for (int l = 0; l < 3; l++) {
|
||||
Vector3 vj2 = p_faces[j].face.vertex[l];
|
||||
Vector3 vj1 = p_faces[j].face.vertex[(l + 1) % 3];
|
||||
|
||||
if (vi1.distance_to(vj1) < 0.00001f &&
|
||||
vi2.distance_to(vj2) < 0.00001f) {
|
||||
if (p_faces[i].links[k].face != -1) {
|
||||
ERR_PRINT("already linked\n");
|
||||
error = true;
|
||||
break;
|
||||
}
|
||||
if (p_faces[j].links[l].face != -1) {
|
||||
ERR_PRINT("already linked\n");
|
||||
error = true;
|
||||
break;
|
||||
}
|
||||
|
||||
p_faces[i].links[k].face = j;
|
||||
p_faces[i].links[k].edge = l;
|
||||
p_faces[j].links[l].face = i;
|
||||
p_faces[j].links[l].edge = k;
|
||||
}
|
||||
}
|
||||
if (error) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (error) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (error) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
p_faces[i].valid = true;
|
||||
for (int j = 0; j < 3; j++) {
|
||||
if (p_faces[i].links[j].face == -1) {
|
||||
p_faces[i].valid = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
static bool _group_face(_FaceClassify *p_faces, int len, int p_index, int p_group) {
|
||||
if (p_faces[p_index].group >= 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
p_faces[p_index].group = p_group;
|
||||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
ERR_FAIL_INDEX_V(p_faces[p_index].links[i].face, len, true);
|
||||
_group_face(p_faces, len, p_faces[p_index].links[i].face, p_group);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Vector<Vector<Face3>> Geometry3D::separate_objects(Vector<Face3> p_array) {
|
||||
Vector<Vector<Face3>> objects;
|
||||
|
||||
int len = p_array.size();
|
||||
|
||||
const Face3 *arrayptr = p_array.ptr();
|
||||
|
||||
Vector<_FaceClassify> fc;
|
||||
|
||||
fc.resize(len);
|
||||
|
||||
_FaceClassify *_fcptr = fc.ptrw();
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
_fcptr[i].face = arrayptr[i];
|
||||
}
|
||||
|
||||
bool error = _connect_faces(_fcptr, len, -1);
|
||||
|
||||
ERR_FAIL_COND_V_MSG(error, Vector<Vector<Face3>>(), "Invalid geometry.");
|
||||
|
||||
// Group connected faces in separate objects.
|
||||
|
||||
int group = 0;
|
||||
for (int i = 0; i < len; i++) {
|
||||
if (!_fcptr[i].valid) {
|
||||
continue;
|
||||
}
|
||||
if (_group_face(_fcptr, len, i, group)) {
|
||||
group++;
|
||||
}
|
||||
}
|
||||
|
||||
// Group connected faces in separate objects.
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
_fcptr[i].face = arrayptr[i];
|
||||
}
|
||||
|
||||
if (group >= 0) {
|
||||
objects.resize(group);
|
||||
Vector<Face3> *group_faces = objects.ptrw();
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
if (!_fcptr[i].valid) {
|
||||
continue;
|
||||
}
|
||||
if (_fcptr[i].group >= 0 && _fcptr[i].group < group) {
|
||||
group_faces[_fcptr[i].group].push_back(_fcptr[i].face);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return objects;
|
||||
}
|
||||
|
||||
/*** GEOMETRY WRAPPER ***/
|
||||
|
||||
enum _CellFlags {
|
||||
|
||||
Reference in New Issue
Block a user