[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30071] branches/particles-2010/source/ blender: Basic particle buffers ported back.
Lukas Toenne
lukas.toenne at googlemail.com
Wed Jul 7 10:10:43 CEST 2010
Revision: 30071
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30071
Author: lukastoenne
Date: 2010-07-07 10:10:43 +0200 (Wed, 07 Jul 2010)
Log Message:
-----------
Basic particle buffers ported back. This needs to be extended to include particle properties.
Modified Paths:
--------------
branches/particles-2010/source/blender/blenkernel/BKE_particleset.h
branches/particles-2010/source/blender/blenkernel/intern/object.c
branches/particles-2010/source/blender/blenkernel/intern/particleset.c
branches/particles-2010/source/blender/editors/particleset/editparticleset.c
branches/particles-2010/source/blender/makesdna/DNA_particleset_types.h
branches/particles-2010/source/blender/makesdna/intern/makesdna.c
Modified: branches/particles-2010/source/blender/blenkernel/BKE_particleset.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_particleset.h 2010-07-07 07:24:09 UTC (rev 30070)
+++ branches/particles-2010/source/blender/blenkernel/BKE_particleset.h 2010-07-07 08:10:43 UTC (rev 30071)
@@ -32,8 +32,41 @@
struct ParticleSet;
+/* attribute management */
+int pset_get_particle_size(struct ParticleSet *pset);
+
+/* buffer management */
+void pset_create_particles(struct ParticleSet *pset, float cfra, int emit);
+void pset_kill_particle(struct ParticleSet *pset, int index);
+void pset_kill_all_particles(struct ParticleSet *pset);
+void pset_free_dead_pages(struct ParticleSet *pset);
+void pset_free_particles(struct ParticleSet *pset);
+void pset_reset(struct ParticleSet *pset);
+
+/* particle access */
+struct Particle* pset_get_particle(struct ParticleSet *pset, int index);
+
+struct ParticleIterator;
+typedef int (*ParticleIteratorSkipFunc)(struct ParticleIterator*);
+typedef struct ParticleIterator
+{
+ ParticleSet *pset;
+ Particle *pa;
+ int index;
+ ParticlePage *page;
+
+ ParticleIteratorSkipFunc skip;
+} ParticleIterator;
+
+void pit_init_skip(struct ParticleIterator *it, struct ParticleSet *pset, ParticleIteratorSkipFunc skip);
+void pit_init(struct ParticleIterator *it, struct ParticleSet *pset);
+void pit_next(struct ParticleIterator *it);
+void pit_goto(struct ParticleIterator *it, int index);
+
void make_local_particleset(struct ParticleSet *pset);
+struct ParticleSet *add_particleset(char *name);
struct ParticleSet* copy_particleset(struct ParticleSet *pset);
+void unlink_particleset(struct ParticleSet *pset);
void free_particleset(struct ParticleSet *pset);
#endif
Modified: branches/particles-2010/source/blender/blenkernel/intern/object.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/object.c 2010-07-07 07:24:09 UTC (rev 30070)
+++ branches/particles-2010/source/blender/blenkernel/intern/object.c 2010-07-07 08:10:43 UTC (rev 30071)
@@ -87,6 +87,7 @@
#include "BKE_object.h"
#include "BKE_paint.h"
#include "BKE_particle.h"
+#include "BKE_particleset.h"
#include "BKE_pointcache.h"
#include "BKE_property.h"
#include "BKE_sca.h"
@@ -965,6 +966,7 @@
case OB_SURF: return add_curve("Surf", OB_SURF);
case OB_FONT: return add_curve("Text", OB_FONT);
case OB_MBALL: return add_mball("Meta");
+ case OB_PSET: return add_particleset("Particles");
case OB_CAMERA: return add_camera("Camera");
case OB_LAMP: return add_lamp("Lamp");
case OB_LATTICE: return add_lattice("Lattice");
@@ -985,6 +987,7 @@
case OB_SURF: return "Surf";
case OB_FONT: return "Text";
case OB_MBALL: return "Mball";
+ case OB_PSET: return "Particles";
case OB_CAMERA: return "Camera";
case OB_LAMP: return "Lamp";
case OB_LATTICE: return "Lattice";
Modified: branches/particles-2010/source/blender/blenkernel/intern/particleset.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/particleset.c 2010-07-07 07:24:09 UTC (rev 30070)
+++ branches/particles-2010/source/blender/blenkernel/intern/particleset.c 2010-07-07 08:10:43 UTC (rev 30071)
@@ -25,22 +25,488 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include "DNA_object_types.h"
#include "DNA_particleset_types.h"
#include "MEM_guardedalloc.h"
+#include "BLI_math.h"
+
+#include "BKE_animsys.h"
+#include "BKE_global.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_particleset.h"
+#include "BKE_utildefines.h"
+/* attribute management */
+/* TODO */
+
+int pset_get_particle_size(ParticleSet *pset)
+{
+ return sizeof(Particle);
+}
+
+/* buffer management */
+static void init_particle(ParticleSet *pset, Particle *pa)
+{
+ pa->birthtime = 0.0f;
+ zero_v3(pa->loc);
+ zero_v3(pa->vel);
+}
+
+static void init_page(ParticleSet *pset, ParticlePage *page, int page_size)
+{
+ Particle *pa;
+ int psize= pset_get_particle_size(pset);
+ int p;
+
+ page->particles = MEM_callocN(page_size * psize, "ParticlePage");
+
+ /* initialise new particles */
+ for (p=0, pa=(Particle*)page->particles; p < page_size; ++p, pa = (Particle*)((char*)pa + psize)) {
+ init_particle(pset, pa);
+ }
+
+ page->fill = 0;
+ page->alive = 0;
+}
+
+static void free_page(ParticleSet *pset, ParticlePage *page)
+{
+ if (page->particles) {
+ MEM_freeN(page->particles);
+ page->particles = NULL;
+ }
+}
+
+#if 0
+static void copy_particle_data(ParticlePage *dest, ParticlePage *src, int from, int num, int psize)
+{
+ memcpy(dest->particles + (from - dest->index), src->particles + (from - src->index), num * psize);
+}
+
+static void set_page_size(ParticleSet *pset, int new_page_size)
+{
+ if (pset->page_size != new_page_size) {
+ int new_totpages = (pset->totpart+new_page_size-1)/new_page_size; /* rounding up */
+ ParticlePage *new_pages = NULL;
+ if (new_totpages > 0) {
+ int cp, p, alive;
+ int npg;
+ ParticlePage *page, *npage;
+
+ new_pages = MEM_callocN(new_totpages * sizeof(ParticlePage), "ParticlePage array");
+
+ if (pset->pages) {
+ cp = 0;
+ page = pset->pages;
+ npage = new_pages;
+ npage->index = 0;
+ npage->fill = npage->alive = 0;
+ npage->particles = NULL;
+ while (cp < pset->totpart) {
+ int copy_all = pset->totpart - cp;
+ int copy_page = page->index + page->fill - cp;
+ int copy_npage = npage->index + new_page_size - cp;
+ int copy = MIN2(copy_all, MIN2(copy_page, copy_npage));
+
+ if (page->particles) {
+ alive = 0;
+ for (p=0; p < copy; ++p)
+ if (page->particles[cp-page->index + p].alive == PARS_ALIVE)
+ ++alive;
+ if (!npage->particles && alive > 0) {
+ init_page(pset, npage, new_page_size);
+ /* start page at cp */
+ npage->fill = cp - npage->index;
+ /* mark previous particles as dead */
+ for (p=0; p < npage->fill; ++p)
+ npage->particles[p].alive = PARS_DEAD;
+ }
+ if (npage->particles) {
+ copy_particle_data(npage, page, cp, copy);
+ npage->alive += alive;
+ }
+ } else if (npage->particles) {
+ /* mark particles as dead */
+ for (p=0; p < copy; ++p)
+ npage->particles[cp-npage->index + p].alive = PARS_DEAD;
+ }
+ npage->fill += copy;
+ cp += copy;
+
+ if (copy == copy_page) {
+ free_page(pset, page);
+ ++page;
+ }
+
+ if (copy == copy_npage) {
+ ++npage;
+ npg= npage - new_pages;
+ if (npg < new_totpages) {
+
+ npage->index = npg * new_page_size;
+ npage->fill = npage->alive = 0;
+ npage->particles = NULL;
+ }
+ }
+ }
+ }
+ }
+ if (pset->pages)
+ MEM_freeN(pset->pages);
+ pset->pages = new_pages;
+ pset->totpages = new_totpages;
+ pset->page_size = new_page_size;
+ }
+
+ #if 0 /* Debugging - phonybone */
+ printf("page size set to %d: totpart=%d, totalive=%d, pages=%d\n", pset->page_size, pset->totpart, pset->totalive, pset->totpages);
+ if (pset->pages) {
+ int pg, p;
+ for (pg=0; pg < pset->totpages; ++pg) {
+ if (pset->pages[pg].particles) {
+ printf("%d [%d/%d]: \t", pset->pages[pg].index, pset->pages[pg].alive, pset->pages[pg].fill);
+ for (p=0; p < pset->page_size; ++p) {
+ if (pset->pages[pg].particles[p].alive == PARS_UNBORN)
+ printf("U ");
+ else if (pset->pages[pg].particles[p].alive == PARS_ALIVE)
+ printf("A ");
+ else if (pset->pages[pg].particles[p].alive == PARS_DEAD)
+ printf("D ");
+ }
+ printf("\n");
+ }
+ else {
+ printf("%d [%d/%d]: \t", pset->pages[pg].index, pset->pages[pg].alive, pset->pages[pg].fill);
+ for (p=0; p < pset->page_size; ++p) {
+ printf("- ");
+ }
+ printf("\n");
+ }
+ }
+ }
+ printf("--------------------------------------------------------------------------------------------\n");
+ #endif
+}
+#endif
+
+static void activate_particle(ParticleSet *pset, float cfra, Particle *pa, int p)
+{
+ pa->birthtime = cfra;
+}
+
+void pset_create_particles(ParticleSet *pset, float cfra, int emit)
+{
+ int p, k; /* counters for pages, particles */
+ int num_new_pages; /* new pages to allocate */
+ int new_pages_emit; /* particles in new pages */
+ int index; /* start index */
+ ParticlePage *page;
+ int psize= pset_get_particle_size(pset);
+ Particle *pa;
+
+ if (emit <= 0) return;
+
+ /* calculate number of new pages required */
+ new_pages_emit = emit;
+ if (pset->totpages > 0)
+ new_pages_emit -= pset->page_size - pset->pages[pset->totpages-1].fill;
+ num_new_pages= (new_pages_emit + pset->page_size-1) / pset->page_size; /* rounding up! */
+
+ /* create a new page array if necessary, else fill up the last page */
+ if (num_new_pages > 0) {
+ /* allocate bigger page array and copy old pages */
+ page = MEM_callocN(sizeof(ParticlePage) * (pset->totpages + num_new_pages), "ParticlePage array");
+ if (pset->pages) {
+ memcpy(page, pset->pages, sizeof(ParticlePage) * pset->totpages);
+ MEM_freeN(pset->pages);
+ }
+ pset->pages = page;
+ /* init new pages */
+ index = pset->totpages * pset->page_size;
+ for (p=0, page=pset->pages + pset->totpages; p < num_new_pages; ++p, ++page) {
+ page->index = index;
+ index += pset->page_size;
+ init_page(pset, page, pset->page_size);
+ }
+
+ /* activate emitted particles */
+ if (pset->totpages > 0) {
+ page = pset->pages + (pset->totpages-1);
+ for (k = 0, pa=(Particle*)((char*)page->particles + page->fill * psize); k < pset->page_size - page->fill; ++k, pa = (Particle*)((char*)pa + psize)) {
+ activate_particle(pset, cfra, pa, (pset->totpages-1)*pset->page_size + k);
+ ++page->alive;
+ ++pset->totalive;
+ }
+ page->fill = pset->page_size; /* last page completely filled */
+ }
+ for (p=0, page=pset->pages + pset->totpages; p < num_new_pages; ++p, ++page) {
+ page->fill = MIN2(new_pages_emit - p * pset->page_size, pset->page_size);
+ for (k = 0, pa = (Particle*)page->particles; k < page->fill; ++k, pa = (Particle*)((char*)pa + psize)) {
+ activate_particle(pset, cfra, pa, (p + pset->totpages)*pset->page_size + k);
+ ++page->alive;
+ ++pset->totalive;
+ }
+ }
+
+ pset->totpages += num_new_pages;
+ }
+ else {
+ page = pset->pages + (pset->totpages-1);
+ /* activate emitted particles */
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list