diff options
Diffstat (limited to 'source/blender/render/intern/source/renderdatabase.c')
-rw-r--r-- | source/blender/render/intern/source/renderdatabase.c | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c index 42c654b2c43..d271592af5f 100644 --- a/source/blender/render/intern/source/renderdatabase.c +++ b/source/blender/render/intern/source/renderdatabase.c @@ -69,7 +69,8 @@ #include "DNA_material_types.h" #include "DNA_meshdata_types.h" -#include "DNA_texture_types.h" +#include "DNA_texture_types.h" +#include "DNA_particle_types.h" #include "BKE_customdata.h" #include "BKE_DerivedMesh.h" @@ -1375,6 +1376,38 @@ ObjectInstanceRen *RE_addRenderInstance(Render *re, ObjectRen *obr, Object *ob, obi->psysindex= psysindex; obi->lay= lay; + /* Fill particle info */ + if (obi->psysindex >= 0) { + int psysindex = 0; + int index; + ParticleSystem *psys; + if (obi->par) { + for (psys = obi->par->particlesystem.first; psys; psys = psys->next) { + if (psysindex == obi->psysindex) + break; + ++psysindex; + } + if (psys) { + if (obi->index < psys->totpart) + index = obi->index; + else { + index = psys->child[obi->index - psys->totpart].parent; + } + if (index >= 0) { + ParticleData* p = &psys->particles[index]; + obi->part_index = index; + obi->part_size = p->size; + obi->part_age = RE_GetStats(re)->cfra - p->time; + obi->part_lifetime = p->lifetime; + + copy_v3_v3(obi->part_co, p->state.co); + copy_v3_v3(obi->part_vel, p->state.vel); + copy_v3_v3(obi->part_avel, p->state.ave); + } + } + } + } + if (mat) { copy_m4_m4(obi->mat, mat); copy_m3_m4(mat3, mat); @@ -1388,6 +1421,18 @@ ObjectInstanceRen *RE_addRenderInstance(Render *re, ObjectRen *obr, Object *ob, return obi; } +void RE_instance_get_particle_info(struct ObjectInstanceRen *obi, float *index, float *age, float *lifetime, float co[3], float *size, float vel[3], float angvel[3]) +{ + *index = obi->part_index; + *age = obi->part_age; + *lifetime = obi->part_lifetime; + copy_v3_v3(co, obi->part_co); + *size = obi->part_size; + copy_v3_v3(vel, obi->part_vel); + copy_v3_v3(angvel, obi->part_avel); +} + + void RE_makeRenderInstances(Render *re) { ObjectInstanceRen *obi, *oldobi; |