Fix T84588: Cache access in rna_Particle_uv_on_emitter

The function `rna_Particle_uv_on_emitter` did not handle the case where
`particle->num_dmcache` was `DMCACHE_ISCHILD`. This resulted in an
incorrect offset for the `mtface` pointer. The commit checks for the
case and sets the offset accordingly, similar to existing code in
e.g. `particle_calculate_parent_uvs`.

Reviewed By: JacquesLucke

Differential Revision: https://developer.blender.org/D10072
This commit is contained in:
Robert Guetzkow 2021-01-12 12:12:33 +01:00 committed by Robert Guetzkow
parent c56da67716
commit f5c0ef52cf
Notes: blender-bot 2023-02-14 06:57:56 +01:00
Referenced by issue #84588, uv_on_emitter crash
2 changed files with 7 additions and 6 deletions

View File

@ -132,7 +132,10 @@ typedef struct ParticleData {
*/
/** Index to vert/edge/face. */
int num;
/** Index to derived mesh data (face) to avoid slow lookups. */
/**
* Index to derived mesh data (face) to avoid slow lookups. It can also have negative
* values DMCACHE_NOTFOUND and DMCACHE_ISCHILD.
*/
int num_dmcache;
/** Coordinates on face/edge number "num" and depth along. */

View File

@ -403,16 +403,15 @@ static void rna_Particle_uv_on_emitter(ParticleData *particle,
}
BKE_mesh_tessface_ensure(modifier->mesh_final); /* BMESH - UNTIL MODIFIER IS UPDATED FOR MPoly */
if (num == DMCACHE_NOTFOUND) {
if (ELEM(num, DMCACHE_NOTFOUND, DMCACHE_ISCHILD)) {
if (particle->num < modifier->mesh_final->totface) {
num = particle->num;
}
}
/* get uvco */
if (r_uv && ELEM(from, PART_FROM_FACE, PART_FROM_VOLUME)) {
if (num != DMCACHE_NOTFOUND) {
if (r_uv && ELEM(from, PART_FROM_FACE, PART_FROM_VOLUME) &&
!ELEM(num, DMCACHE_NOTFOUND, DMCACHE_ISCHILD)) {
MFace *mface;
MTFace *mtface;
@ -424,7 +423,6 @@ static void rna_Particle_uv_on_emitter(ParticleData *particle,
psys_interpolate_uvs(mtface, mface->v4, particle->fuv, r_uv);
return;
}
}
}
r_uv[0] = 0.0f;