mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 02:42:49 -04:00
double-check vertex ordering against polygon normal
This commit is contained in:
parent
4b802dc3c5
commit
85caa2fed2
@ -1378,7 +1378,7 @@ make_polyset(const MDagPath &dag_path, const MFnMesh &mesh,
|
||||
if (!status) {
|
||||
status.perror("MItMeshPolygon::getNormal");
|
||||
} else {
|
||||
LVector3d n3d(n[0], n[1], n[2]);
|
||||
Normald n3d(n[0], n[1], n[2]);
|
||||
n3d = n3d * vertex_frame_inv;
|
||||
vert.set_normal(n3d);
|
||||
}
|
||||
@ -1414,11 +1414,58 @@ make_polyset(const MDagPath &dag_path, const MFnMesh &mesh,
|
||||
egg_poly->add_vertex(vpool->create_unique_vertex(vert));
|
||||
}
|
||||
|
||||
// Also get the face normal for the polygon.
|
||||
Normald face_normal;
|
||||
bool got_face_normal = false;
|
||||
|
||||
MVector n;
|
||||
status = pi.getNormal(n, MSpace::kWorld);
|
||||
if (!status) {
|
||||
status.perror("MItMeshPolygon::getNormal face");
|
||||
} else {
|
||||
face_normal.set(n[0], n[1], n[2]);
|
||||
face_normal = face_normal * vertex_frame_inv;
|
||||
got_face_normal = true;
|
||||
egg_poly->set_normal(face_normal);
|
||||
}
|
||||
|
||||
// Now, check that the vertex ordering is consistent with the
|
||||
// direction of the normals. If not, reverse the vertex ordering
|
||||
// (since we have seen cases where Maya sets this in contradiction
|
||||
// to its normals).
|
||||
Normald order_normal;
|
||||
if (got_face_normal && egg_poly->calculate_normal(order_normal)) {
|
||||
if (order_normal.dot(face_normal) < 0.0) {
|
||||
egg_poly->reverse_vertex_ordering();
|
||||
mayaegg_cat.info()
|
||||
<< "reversing polygon\n";
|
||||
|
||||
/*
|
||||
Normald new_normal;
|
||||
egg_poly->calculate_normal(new_normal);
|
||||
if (new_normal.dot(order_normal) >= 0.0) {
|
||||
cerr << "Did not change! orig " << order_normal
|
||||
<< " new " << new_normal << "\n";
|
||||
shader = NULL;
|
||||
egg_poly->write(cerr, 0);
|
||||
egg_poly->reverse_vertex_ordering();
|
||||
egg_poly->write(cerr, 0);
|
||||
} else {
|
||||
cerr << "reversing prim: orig = "
|
||||
<< order_normal
|
||||
<< ", new = " << new_normal << ", net = " << face_normal
|
||||
<< ", dot = " << order_normal.dot(face_normal)
|
||||
<< ", new dot = " << new_normal.dot(face_normal) << "\n";
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
// Now apply the shader.
|
||||
if (shader != (MayaShader *)NULL) {
|
||||
set_shader_attributes(*egg_poly, *shader);
|
||||
}
|
||||
|
||||
|
||||
pi.next();
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user