Fix T66340: Missing particles in Grid and Volume distribution.

This solution only alleviates the problem.
This commit is contained in:
Germano Cavalcante 2019-07-02 11:44:24 -03:00
parent 57c26453f8
commit 65bc59a56d
Notes: blender-bot 2023-02-14 08:38:11 +01:00
Referenced by issue #66340, Missing diaognal layer of particles with default cube and grid distribution
1 changed files with 28 additions and 12 deletions

View File

@ -232,6 +232,9 @@ static void distribute_grid(Mesh *mesh, ParticleSystem *psys)
/* lets intersect the faces */
for (i = 0; i < totface; i++, mface++) {
ParticleData *pa1 = NULL, *pa2 = NULL;
bool isect1 = false, isect2 = false;
copy_v3_v3(v1, mvert[mface->v1].co);
copy_v3_v3(v2, mvert[mface->v2].co);
copy_v3_v3(v3, mvert[mface->v3].co);
@ -239,24 +242,37 @@ static void distribute_grid(Mesh *mesh, ParticleSystem *psys)
bool intersects_tri = isect_ray_tri_watertight_v3(
co1, &isect_precalc, v1, v2, v3, &lambda, NULL);
if (intersects_tri) {
if (from == PART_FROM_FACE) {
(pa + (int)(lambda * size[a]) * a0mul)->flag &= ~PARS_UNEXIST;
}
else { /* store number of intersections */
(pa + (int)(lambda * size[a]) * a0mul)->hair_index++;
}
pa1 = (pa + (int)(lambda * size[a]) * a0mul);
isect1 = true;
}
if (mface->v4 && (!intersects_tri || from == PART_FROM_VOLUME)) {
copy_v3_v3(v4, mvert[mface->v4].co);
if (isect_ray_tri_watertight_v3(co1, &isect_precalc, v1, v3, v4, &lambda, NULL)) {
if (from == PART_FROM_FACE) {
(pa + (int)(lambda * size[a]) * a0mul)->flag &= ~PARS_UNEXIST;
}
else {
(pa + (int)(lambda * size[a]) * a0mul)->hair_index++;
}
pa2 = (pa + (int)(lambda * size[a]) * a0mul);
isect2 = true;
}
}
if (pa1 == pa2) {
isect1 |= isect2;
}
else if (isect2) {
if (from == PART_FROM_FACE) {
pa2->flag &= ~PARS_UNEXIST;
}
else { /* store number of intersections */
pa2->hair_index++;
}
}
if (isect1) {
if (from == PART_FROM_FACE) {
pa1->flag &= ~PARS_UNEXIST;
}
else { /* store number of intersections */
pa1->hair_index++;
}
}
}