forked from bartvdbraak/blender
hum ..
turned off quad optimization, which is a bug IMHO, since breaking a quad it 2 faces always needs a test on both faces
This commit is contained in:
parent
4714432110
commit
f2678b8dac
@ -563,7 +563,7 @@ int pdDoDeflection(float opco[3], float npco[3], float opno[3],
|
|||||||
float damping, perm_thresh;
|
float damping, perm_thresh;
|
||||||
float perm_val, rdamp_val;
|
float perm_val, rdamp_val;
|
||||||
int a, deflected=0, deflected_now=0;
|
int a, deflected=0, deflected_now=0;
|
||||||
float t, min_t;
|
float t,t2, min_t;
|
||||||
float mat[3][3], obloc[3];
|
float mat[3][3], obloc[3];
|
||||||
short cur_frame;
|
short cur_frame;
|
||||||
float time_before, time_after;
|
float time_before, time_after;
|
||||||
@ -647,35 +647,41 @@ int pdDoDeflection(float opco[3], float npco[3], float opno[3],
|
|||||||
|
|
||||||
deflected_now = 0;
|
deflected_now = 0;
|
||||||
|
|
||||||
t= 0.5; // this is labda of line, can use it optimize quad intersection
|
// t= 0.5; // this is labda of line, can use it optimize quad intersection
|
||||||
|
// sorry but no .. see below (BM)
|
||||||
if( linetriangle(opco, npco, nv1, nv2, nv3, &t) ) {
|
if( linetriangle(opco, npco, nv1, nv2, nv3, &t) ) {
|
||||||
if (t < min_t) {
|
if (t < min_t) {
|
||||||
deflected = 1;
|
deflected = 1;
|
||||||
deflected_now = 1;
|
deflected_now = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (mface->v4 && (t>=0.0 && t<=1.0)) {
|
// else if (mface->v4 && (t>=0.0 && t<=1.0)) {
|
||||||
if( linetriangle(opco, npco, nv1, nv3, nv4, &t) ) {
|
// no, you can't skip testing the other triangle
|
||||||
if (t < min_t) {
|
// it might give a smaller t on (close to) the edge .. this is numerics not esoteric maths :)
|
||||||
|
// note: the 2 triangles don't need to share a plane ! (BM)
|
||||||
|
if (mface->v4) {
|
||||||
|
if( linetriangle(opco, npco, nv1, nv3, nv4, &t2) ) {
|
||||||
|
if (t2 < min_t) {
|
||||||
deflected = 1;
|
deflected = 1;
|
||||||
deflected_now = 2;
|
deflected_now = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((deflected_now > 0) && (t < min_t)) {
|
if ((deflected_now > 0) && ((t < min_t) ||(t2 < min_t))) {
|
||||||
min_t = t;
|
min_t = t;
|
||||||
ds_object = d_object;
|
ds_object = d_object;
|
||||||
ds_face = d_face;
|
ds_face = d_face;
|
||||||
deflection_object = ob;
|
deflection_object = ob;
|
||||||
deflection_face = mface;
|
deflection_face = mface;
|
||||||
if (deflected_now==1) {
|
if (deflected_now==1) {
|
||||||
|
min_t = t;
|
||||||
VECCOPY(dv1, nv1);
|
VECCOPY(dv1, nv1);
|
||||||
VECCOPY(dv2, nv2);
|
VECCOPY(dv2, nv2);
|
||||||
VECCOPY(dv3, nv3);
|
VECCOPY(dv3, nv3);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
min_t = t2;
|
||||||
VECCOPY(dv1, nv1);
|
VECCOPY(dv1, nv1);
|
||||||
VECCOPY(dv2, nv3);
|
VECCOPY(dv2, nv3);
|
||||||
VECCOPY(dv3, nv4);
|
VECCOPY(dv3, nv4);
|
||||||
|
Loading…
Reference in New Issue
Block a user