[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12779] trunk/blender/source/blender:
Brecht Van Lommel
brechtvanlommel at pandora.be
Tue Dec 4 14:57:28 CET 2007
Revision: 12779
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12779
Author: blendix
Date: 2007-12-04 14:57:28 +0100 (Tue, 04 Dec 2007)
Log Message:
-----------
Particles
=========
- Fix crash in particle transform with the particle system not editable.
- Particle child distribution and caching is now multithreaded.
- Child particles now have a separate Render Amount next to the existing
Amount. The render amount particles are now only distributed and cached
at render time, which should make editing with child particles faster.
- Two new options for diffuse strand shading:
- Surface Diffuse: computes the strand normal taking the normal at
the surface into account.
- Blending Distance: the distance in Blender units over which to
blend in the normal at the surface.
- Special strand rendering for more memory efficient and faster hair and
grass. This is a work in progress, and has a number of known issues,
don't report bugs to me for this feature yet.
More info:
http://www.blender.org/development/current-projects/changes-since-244/particles/
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_particle.h
trunk/blender/source/blender/blenkernel/intern/anim.c
trunk/blender/source/blender/blenkernel/intern/material.c
trunk/blender/source/blender/blenkernel/intern/particle.c
trunk/blender/source/blender/blenkernel/intern/particle_system.c
trunk/blender/source/blender/blenlib/BLI_rand.h
trunk/blender/source/blender/blenlib/intern/rand.c
trunk/blender/source/blender/blenloader/intern/readfile.c
trunk/blender/source/blender/include/BIF_editparticle.h
trunk/blender/source/blender/makesdna/DNA_material_types.h
trunk/blender/source/blender/makesdna/DNA_particle_types.h
trunk/blender/source/blender/render/extern/include/RE_pipeline.h
trunk/blender/source/blender/render/extern/include/RE_shader_ext.h
trunk/blender/source/blender/render/intern/include/render_types.h
trunk/blender/source/blender/render/intern/include/renderdatabase.h
trunk/blender/source/blender/render/intern/include/shading.h
trunk/blender/source/blender/render/intern/include/zbuf.h
trunk/blender/source/blender/render/intern/source/convertblender.c
trunk/blender/source/blender/render/intern/source/envmap.c
trunk/blender/source/blender/render/intern/source/pipeline.c
trunk/blender/source/blender/render/intern/source/rendercore.c
trunk/blender/source/blender/render/intern/source/renderdatabase.c
trunk/blender/source/blender/render/intern/source/shadbuf.c
trunk/blender/source/blender/render/intern/source/shadeinput.c
trunk/blender/source/blender/render/intern/source/shadeoutput.c
trunk/blender/source/blender/render/intern/source/zbuf.c
trunk/blender/source/blender/src/buttons_object.c
trunk/blender/source/blender/src/buttons_scene.c
trunk/blender/source/blender/src/buttons_shading.c
trunk/blender/source/blender/src/drawobject.c
trunk/blender/source/blender/src/editparticle.c
trunk/blender/source/blender/src/renderwin.c
trunk/blender/source/blender/src/transform_conversions.c
Added Paths:
-----------
trunk/blender/source/blender/render/intern/include/strand.h
trunk/blender/source/blender/render/intern/source/strand.c
Modified: trunk/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_particle.h 2007-12-04 12:39:27 UTC (rev 12778)
+++ trunk/blender/source/blender/blenkernel/BKE_particle.h 2007-12-04 13:57:28 UTC (rev 12779)
@@ -54,6 +54,7 @@
struct IpoCurve;
struct LinkNode;
struct KDTree;
+struct RNG;
typedef struct ParticleEffectorCache {
struct ParticleEffectorCache *next, *prev;
@@ -148,6 +149,42 @@
int totkeys;
} ParticleEdit;
+typedef struct ParticleThreadContext {
+ /* shared */
+ struct Object *ob;
+ struct DerivedMesh *dm;
+ struct ParticleSystemModifierData *psmd;
+ struct ParticleSystem *psys;
+ struct Material *ma;
+
+ /* distribution */
+ struct KDTree *tree;
+
+ struct ParticleSeam *seams;
+ int totseam;
+
+ float *jit, *jitoff, *weight;
+ float maxweight;
+ int *index, jitlevel;
+
+ int from, cfrom, distr;
+
+ /* path caching */
+ int editupdate, between, steps;
+ int totchild, totparent;
+
+ float cfra;
+
+ float *vg_length, *vg_clump, *vg_kink;
+ float *vg_rough1, *vg_rough2, *vg_roughe;
+} ParticleThreadContext;
+
+typedef struct ParticleThread {
+ ParticleThreadContext *ctx;
+ struct RNG *rng, *rng_path;
+ int num, tot;
+} ParticleThread;
+
/* ----------- functions needed outside particlesystem ---------------- */
/* particle.c */
int count_particles(struct ParticleSystem *psys);
@@ -170,6 +207,7 @@
void psys_free_settings(struct ParticleSettings *part);
void free_child_path_cache(struct ParticleSystem *psys);
void psys_free_path_cache(struct ParticleSystem *psys);
+void psys_free_render_memory(struct Object *ob, struct ParticleSystem *psys);
void free_hair(struct ParticleSystem *psys);
void free_keyed_keys(struct ParticleSystem *psys);
void psys_free(struct Object * ob, struct ParticleSystem * psys);
@@ -195,11 +233,19 @@
int do_guide(struct ParticleKey *state, int pa_num, float time, struct ListBase *lb);
float psys_get_size(struct Object *ob, struct Material *ma, struct ParticleSystemModifierData *psmd, struct IpoCurve *icu_size, struct ParticleSystem *psys, struct ParticleSettings *part, struct ParticleData *pa, float *vg_size);
float psys_get_timestep(struct ParticleSettings *part);
-float psys_get_child_time(struct ParticleSystem *psys, int child_nbr, float cfra);
-float psys_get_child_size(struct ParticleSystem *psys, int child_nbr, float cfra, float *pa_time);
+float psys_get_child_time(struct ParticleSystem *psys, struct ChildParticle *cpa, float cfra);
+float psys_get_child_size(struct ParticleSystem *psys, struct ChildParticle *cpa, float cfra, float *pa_time);
void psys_get_particle_on_path(struct Object *ob, struct ParticleSystem *psys, int pa_num, struct ParticleKey *state, int vel);
int psys_get_particle_state(struct Object *ob, struct ParticleSystem *psys, int p, struct ParticleKey *state, int always);
+ParticleThread *psys_threads_create(struct Object *ob, struct ParticleSystem *psys, int totthread);
+int psys_threads_init_distribution(ParticleThread *threads, struct DerivedMesh *dm, int from);
+int psys_threads_init_path(ParticleThread *threads, float cfra, int editupdate);
+void psys_threads_free(ParticleThread *threads);
+
+void psys_thread_distribute_particle(ParticleThread *thread, struct ParticleData *pa, struct ChildParticle *cpa, int p);
+void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa, ParticleCacheKey *keys, int i);
+
/* particle_system.c */
int psys_count_keyed_targets(struct Object *ob, struct ParticleSystem *psys);
void psys_get_reactor_target(struct Object *ob, struct ParticleSystem *psys, struct Object **target_ob, struct ParticleSystem **target_psys);
Modified: trunk/blender/source/blender/blenkernel/intern/anim.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim.c 2007-12-04 12:39:27 UTC (rev 12778)
+++ trunk/blender/source/blender/blenkernel/intern/anim.c 2007-12-04 13:57:28 UTC (rev 12779)
@@ -640,7 +640,7 @@
pa_num = a;
pa_time = psys->particles[psys->child[a - totpart].parent].time;
- size=psys_get_child_size(psys, a - totpart, ctime, 0);
+ size=psys_get_child_size(psys, &psys->child[a - totpart], ctime, 0);
}
if(part->draw_as==PART_DRAW_GR) {
@@ -783,7 +783,7 @@
{
ListBase *duplilist= MEM_mallocN(sizeof(ListBase), "duplilist");
duplilist->first= duplilist->last= NULL;
-
+
if(ob->transflag & OB_DUPLI) {
if(ob->transflag & OB_DUPLIPARTS) {
ParticleSystem *psys = ob->particlesystem.first;
@@ -808,7 +808,7 @@
DupliObject *dob;
group_duplilist(duplilist, ob, 0); /* now recursive */
-
+
/* make copy already, because in group dupli's deform displists can be makde, requiring parent matrices */
for(dob= duplilist->first; dob; dob= dob->next)
Mat4CpyMat4(dob->ob->obmat, dob->mat);
Modified: trunk/blender/source/blender/blenkernel/intern/material.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/material.c 2007-12-04 12:39:27 UTC (rev 12778)
+++ trunk/blender/source/blender/blenkernel/intern/material.c 2007-12-04 13:57:28 UTC (rev 12779)
@@ -687,6 +687,9 @@
/* will become or-ed result of all node modes */
ma->mode_l= ma->mode;
ma->mode_l &= ~MA_SHLESS;
+
+ if(ma->strand_surfnor > 0.0f)
+ ma->mode_l |= MA_STR_SURFDIFF;
}
static void init_render_nodetree(bNodeTree *ntree, Material *basemat, int r_mode, float *amb)
Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c 2007-12-04 12:39:27 UTC (rev 12778)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c 2007-12-04 13:57:28 UTC (rev 12779)
@@ -56,6 +56,7 @@
#include "BLI_kdtree.h"
#include "BLI_linklist.h"
#include "BLI_rand.h"
+#include "BLI_threads.h"
#include "BKE_anim.h"
@@ -299,6 +300,27 @@
}
free_child_path_cache(psys);
}
+void psys_free_render_memory(Object *ob, ParticleSystem *psys)
+{
+ ParticleSystemModifierData *psmd;
+
+ /* this is a bad function, but saves a lot of memory rendering.
+ * particles should really be generated on the fly with render
+ * settings! */
+ psys_free_path_cache(psys);
+
+ if(psys->child){
+ MEM_freeN(psys->child);
+ psys->child=0;
+ psys->totchild=0;
+ }
+
+ psmd= psys_get_modifier(ob, psys);
+ psmd->flag &= ~eParticleSystemFlag_psys_updated;
+
+ psys->recalc |= PSYS_ALLOC|PSYS_DISTR;
+ //DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+}
/* free everything */
void psys_free(Object *ob, ParticleSystem * psys)
{
@@ -1195,41 +1217,33 @@
VECADD(state->co,state->co,rough);
}
-static int check_path_length(int k, int p, ParticleCacheKey **cache, ParticleCacheKey *state, float length, float *dvec)
+static int check_path_length(int k, ParticleCacheKey *keys, ParticleCacheKey *state, float max_length, float *cur_length, float length, float *dvec)
{
- static float max_length = 1.0, cur_length = 0.0;
-
- if(k) {
- if(cur_length + length > max_length){
- //if(p<totparent){
- // if(k<=(int)cache[totpart+p]->time){
- // /* parents need to be calculated fully first so that they don't mess up their children */
- // /* we'll make a note of where we got to though so that they're easy to finish later */
- // state->time=(max_length-cur_length)/length;
- // cache[totpart+p]->time=(float)k;
- // }
- //}
- //else{
- VecMulf(dvec, (max_length - cur_length) / length);
- VECADD(state->co, (state - 1)->co, dvec);
- cache[p]->steps = k;
- /* something over the maximum step value */
- return k=100000;
- //}
- }
- else {
- cur_length+=length;
- }
+ if(*cur_length + length > max_length){
+ //if(p<totparent){
+ // if(k<=(int)cache[totpart+p]->time){
+ // /* parents need to be calculated fully first so that they don't mess up their children */
+ // /* we'll make a note of where we got to though so that they're easy to finish later */
+ // state->time=(max_length-*cur_length)/length;
+ // cache[totpart+p]->time=(float)k;
+ // }
+ //}
+ //else{
+ VecMulf(dvec, (max_length - *cur_length) / length);
+ VECADD(state->co, (state - 1)->co, dvec);
+ keys->steps = k;
+ /* something over the maximum step value */
+ return k=100000;
+ //}
}
- else {/* reset signal */
- max_length=length;
- cur_length=0.0;
+ else {
+ *cur_length+=length;
+ return k;
}
- return k;
}
-static void finalize_path_length(int p, ParticleCacheKey **cache)
+static void finalize_path_length(ParticleCacheKey *keys)
{
- ParticleCacheKey *state = cache[p];
+ ParticleCacheKey *state = keys;
float dvec[3];
state += state->steps;
@@ -1301,42 +1315,54 @@
if(orcos)
MEM_freeN(orcos);
}
-void psys_cache_child_paths(Object *ob, ParticleSystem *psys, float cfra, int editupdate)
+
+static void get_strand_normal(Material *ma, float *surfnor, float surfdist, float *nor)
{
+ float cross[3], nstrand[3], vnor[3], blend;
+
+ if(!((ma->mode & MA_STR_SURFDIFF) || (ma->strand_surfnor > 0.0f)))
+ return;
+
+ if(ma->mode & MA_STR_SURFDIFF) {
+ Crossf(cross, surfnor, nor);
+ Crossf(nstrand, nor, cross);
+
+ blend= INPR(nstrand, surfnor);
+ CLAMP(blend, 0.0f, 1.0f);
+
+ VecLerpf(vnor, nstrand, surfnor, blend);
+ Normalize(vnor);
+ }
+ else
+ VECCOPY(vnor, nor)
+
+ if(ma->strand_surfnor > 0.0f) {
+ if(ma->strand_surfnor > surfdist) {
+ blend= (ma->strand_surfnor - surfdist)/ma->strand_surfnor;
+ VecLerpf(vnor, vnor, surfnor, blend);
+ Normalize(vnor);
+ }
+ }
+
+ VECCOPY(nor, vnor);
+}
+
+int psys_threads_init_path(ParticleThread *threads, float cfra, int editupdate)
+{
+ ParticleThreadContext *ctx= threads[0].ctx;
+ Object *ob= ctx->ob;
+ ParticleSystem *psys= ctx->psys;
ParticleSettings *part = psys->part;
ParticleEditSettings *pset = &G.scene->toolsettings->particle;
- ParticleSystemModifierData *psmd = psys_get_modifier(ob,psys);
- ParticleData *pa;
- ChildParticle *cpa;
- ParticleCacheKey **cache = psys->childcache, **pcache = psys->pathcache;
- ParticleCacheKey *tcache, *state, *par=0, *key[4];
- ParticleTexture ptex;
- Material *ma = give_current_material(ob, part->omat);
-
- float length, pa_length = 1.0, pa_clump = 1.0, pa_kink = 1.0;
- float pa_rough1 = 1.0, pa_rough2 = 1.0, pa_roughe = 1.0;
- float t, rough_t;
- float dvec[3], orco[3], ornor[3], imat[4][4];
- float *vg_length = 0, *vg_clump = 0, *vg_kink = 0;
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list