From 2fb31f34af84c39116742e20a12222099cd0ff9a Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Wed, 2 Mar 2022 17:12:56 +0100 Subject: Fix T95692: incorrect interpolated children particle hair Differential Revision: https://developer.blender.org/D14227 --- source/blender/blenkernel/BKE_particle.h | 3 +- source/blender/blenkernel/intern/particle.c | 33 ++++++++++++++++++---- .../blenkernel/intern/particle_distribute.c | 5 +++- 3 files changed, 34 insertions(+), 7 deletions(-) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h index 804331a3412..d39796ddbd1 100644 --- a/source/blender/blenkernel/BKE_particle.h +++ b/source/blender/blenkernel/BKE_particle.h @@ -596,7 +596,8 @@ void psys_get_texture(struct ParticleSimulationData *sim, /** * Interpolate a location on a face based on face coordinates. */ -void psys_interpolate_face(struct MVert *mvert, +void psys_interpolate_face(struct Mesh *mesh, + struct MVert *mvert, const float (*vert_normals)[3], struct MFace *mface, struct MTFace *tface, diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 4dba13ce4c2..80f0ecd6baa 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -1673,7 +1673,8 @@ static void interpolate_pathcache(ParticleCacheKey *first, float t, ParticleCach /* Particles on a dm */ /************************************************/ -void psys_interpolate_face(MVert *mvert, +void psys_interpolate_face(Mesh *mesh, + MVert *mvert, const float (*vert_normals)[3], MFace *mface, MTFace *tface, @@ -1793,6 +1794,7 @@ void psys_interpolate_face(MVert *mvert, else { interp_v3_v3v3v3(orco, o1, o2, o3, w); } + BKE_mesh_orco_verts_transform(mesh, (float(*)[3])orco, 1, true); } else { copy_v3_v3(orco, vec); @@ -2137,6 +2139,7 @@ void psys_particle_on_dm(Mesh *mesh_final, if (orco) { if (orcodata) { copy_v3_v3(orco, orcodata[mapindex]); + BKE_mesh_orco_verts_transform(mesh_final, (float(*)[3])orco, 1, true); } else { copy_v3_v3(orco, vec); @@ -2162,8 +2165,18 @@ void psys_particle_on_dm(Mesh *mesh_final, } if (from == PART_FROM_VOLUME) { - psys_interpolate_face( - mvert, vert_normals, mface, mtface, orcodata, mapfw, vec, tmpnor, utan, vtan, orco); + psys_interpolate_face(mesh_final, + mvert, + vert_normals, + mface, + mtface, + orcodata, + mapfw, + vec, + tmpnor, + utan, + vtan, + orco); if (nor) { copy_v3_v3(nor, tmpnor); } @@ -2175,8 +2188,18 @@ void psys_particle_on_dm(Mesh *mesh_final, add_v3_v3(vec, tmpnor); } else { - psys_interpolate_face( - mvert, vert_normals, mface, mtface, orcodata, mapfw, vec, nor, utan, vtan, orco); + psys_interpolate_face(mesh_final, + mvert, + vert_normals, + mface, + mtface, + orcodata, + mapfw, + vec, + nor, + utan, + vtan, + orco); } } } diff --git a/source/blender/blenkernel/intern/particle_distribute.c b/source/blender/blenkernel/intern/particle_distribute.c index ba3f99a2800..d8da3b5a497 100644 --- a/source/blender/blenkernel/intern/particle_distribute.c +++ b/source/blender/blenkernel/intern/particle_distribute.c @@ -627,7 +627,7 @@ static void distribute_from_volume_exec(ParticleTask *thread, ParticleData *pa, tot = mesh->totface; psys_interpolate_face( - mvert, BKE_mesh_vertex_normals_ensure(mesh), mface, 0, 0, pa->fuv, co, nor, 0, 0, 0); + mesh, mvert, BKE_mesh_vertex_normals_ensure(mesh), mface, 0, 0, pa->fuv, co, nor, 0, 0, 0); normalize_v3(nor); negate_v3(nor); @@ -958,6 +958,9 @@ static int psys_thread_context_init_distribute(ParticleThreadContext *ctx, } } + /* After this #BKE_mesh_orco_verts_transform can be used safely from multiple threads. */ + BKE_mesh_texspace_ensure(final_mesh); + /* Create trees and original coordinates if needed */ if (from == PART_FROM_CHILD) { distr = PART_DISTR_RAND; -- cgit v1.2.3