[Bf-blender-cvs] [aa3f0b09986] blender2.8: Particles: Add utility function to copy particles from one system to another
Sergey Sharybin
noreply at git.blender.org
Tue Jun 19 15:29:06 CEST 2018
Commit: aa3f0b0998613d50f423dd4347f4c80e91d05528
Author: Sergey Sharybin
Date: Tue Jun 19 11:40:09 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBaa3f0b0998613d50f423dd4347f4c80e91d05528
Particles: Add utility function to copy particles from one system to another
===================================================================
M source/blender/blenkernel/BKE_particle.h
M source/blender/blenkernel/intern/particle.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h
index 64cf7e8402e..11aa67d7f25 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -318,6 +318,9 @@ void BKE_particlesettings_free(struct ParticleSettings *part);
void psys_free_path_cache(struct ParticleSystem *psys, struct PTCacheEdit *edit);
void psys_free(struct Object *ob, struct ParticleSystem *psys);
+/* Copy. */
+void psys_copy_particles(struct ParticleSystem *psys_dst, struct ParticleSystem *psys_src);
+
bool psys_render_simplify_params(struct ParticleSystem *psys, struct ChildParticle *cpa, float *params);
void psys_interpolate_uvs(const struct MTFace *tface, int quad, const float w[4], float uvco[2]);
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 41445492c04..9461b0a21a5 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -653,6 +653,51 @@ void psys_free(Object *ob, ParticleSystem *psys)
}
}
+void psys_copy_particles(ParticleSystem *psys_dst, ParticleSystem *psys_src)
+{
+ /* Free existing particles. */
+ if (psys_dst->particles != psys_src->particles) {
+ psys_free_particles(psys_dst);
+ }
+ if (psys_dst->child != psys_src->child) {
+ psys_free_children(psys_dst);
+ }
+ /* Restore counters. */
+ psys_dst->totpart = psys_src->totpart;
+ psys_dst->totchild = psys_src->totchild;
+ /* Copy particles and children. */
+ psys_dst->particles = MEM_dupallocN(psys_src->particles);
+ psys_dst->child = MEM_dupallocN(psys_src->child);
+ if (psys_dst->part->type == PART_HAIR) {
+ ParticleData *pa;
+ int p;
+ for (p = 0, pa = psys_dst->particles; p < psys_dst->totpart; p++, pa++) {
+ pa->hair = MEM_dupallocN(pa->hair);
+ }
+ }
+ if (psys_dst->particles && (psys_dst->particles->keys || psys_dst->particles->boid)) {
+ ParticleKey *key = psys_dst->particles->keys;
+ BoidParticle *boid = psys_dst->particles->boid;
+ ParticleData *pa;
+ int p;
+ if (key != NULL) {
+ key = MEM_dupallocN(key);
+ }
+ if (boid != NULL) {
+ boid = MEM_dupallocN(boid);
+ }
+ for (p = 0, pa = psys_dst->particles; p < psys_dst->totpart; p++, pa++) {
+ if (boid != NULL) {
+ pa->boid = boid++;
+ }
+ if (key != NULL) {
+ pa->keys = key;
+ key += pa->totkey;
+ }
+ }
+ }
+}
+
/************************************************/
/* Interpolation */
/************************************************/
More information about the Bf-blender-cvs
mailing list