Revision: 35430
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35430
Author:   jhk
Date:     2011-03-09 14:18:33 +0000 (Wed, 09 Mar 2011)
Log Message:
-----------
Fix for [#26372] Objects as PS Hair displays and renders differently
* Grid distribution isn't really suited for hair, so this is now disabled.
* Setting a jittered distribution with particles/face = 1 now creates particles 
on the center of faces.
* Quite a bit of cleanup of the whole particle distribution code.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_particle.h
    trunk/blender/source/blender/blenkernel/intern/anim.c
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/blenkernel/intern/particle_system.c
    trunk/blender/source/blender/makesdna/DNA_particle_types.h
    trunk/blender/source/blender/makesrna/intern/rna_particle.c
    trunk/blender/source/blender/render/intern/source/convertblender.c

Modified: trunk/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_particle.h      2011-03-09 
14:16:21 UTC (rev 35429)
+++ trunk/blender/source/blender/blenkernel/BKE_particle.h      2011-03-09 
14:18:33 UTC (rev 35430)
@@ -242,7 +242,7 @@
 int psys_get_particle_state(struct ParticleSimulationData *sim, int p, struct 
ParticleKey *state, int always);
 
 /* for anim.c */
-void psys_get_dupli_texture(struct Object *ob, struct ParticleSettings *part, 
struct ParticleSystemModifierData *psmd, struct ParticleData *pa, struct 
ChildParticle *cpa, float *uv, float *orco);
+void psys_get_dupli_texture(struct ParticleSystem *psys, struct 
ParticleSettings *part, struct ParticleSystemModifierData *psmd, struct 
ParticleData *pa, struct ChildParticle *cpa, float *uv, float *orco);
 void psys_get_dupli_path_transform(struct ParticleSimulationData *sim, struct 
ParticleData *pa, struct ChildParticle *cpa, struct ParticleCacheKey *cache, 
float mat[][4], float *scale);
 
 ParticleThread *psys_threads_create(struct ParticleSimulationData *sim);

Modified: trunk/blender/source/blender/blenkernel/intern/anim.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim.c       2011-03-09 
14:16:21 UTC (rev 35429)
+++ trunk/blender/source/blender/blenkernel/intern/anim.c       2011-03-09 
14:18:33 UTC (rev 35430)
@@ -1346,8 +1346,6 @@
                                /* for groups, pick the object based on 
settings */
                                if(part->draw&PART_DRAW_RAND_GR)
                                        b= BLI_rand() % totgroup;
-                               else if(part->from==PART_FROM_PARTICLE)
-                                       b= pa_num % totgroup;
                                else
                                        b= a % totgroup;
 
@@ -1402,7 +1400,7 @@
                                        dob= new_dupli_object(lb, go->ob, mat, 
par->lay, counter, OB_DUPLIPARTS, animated);
                                        copy_m4_m4(dob->omat, 
obcopylist[b].obmat);
                                        if(G.rendering)
-                                               psys_get_dupli_texture(par, 
part, sim.psmd, pa, cpa, dob->uv, dob->orco);
+                                               psys_get_dupli_texture(psys, 
part, sim.psmd, pa, cpa, dob->uv, dob->orco);
                                }
                        }
                        else {
@@ -1434,7 +1432,7 @@
                                dob= new_dupli_object(lb, ob, mat, ob->lay, 
counter, GS(id->name) == ID_GR ? OB_DUPLIGROUP : OB_DUPLIPARTS, animated);
                                copy_m4_m4(dob->omat, oldobmat);
                                if(G.rendering)
-                                       psys_get_dupli_texture(par, part, 
sim.psmd, pa, cpa, dob->uv, dob->orco);
+                                       psys_get_dupli_texture(psys, part, 
sim.psmd, pa, cpa, dob->uv, dob->orco);
                        }
                }
 

Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c   2011-03-09 
14:16:21 UTC (rev 35429)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c   2011-03-09 
14:18:33 UTC (rev 35430)
@@ -2407,7 +2407,7 @@
                steps = (int)pow(2.0, (double)pset->draw_step);
        }
 
-       if(totchild && part->from!=PART_FROM_PARTICLE && 
part->childtype==PART_CHILD_FACES){
+       if(totchild && part->childtype==PART_CHILD_FACES){
                totparent=(int)(totchild*part->parents*0.3);
                
                if(G.rendering && part->child_nbr && part->ren_child_nbr)
@@ -2449,16 +2449,14 @@
        psys->lattice = psys_get_lattice(&ctx->sim);
 
        /* cache all relevant vertex groups if they exist */
-       if(part->from!=PART_FROM_PARTICLE){
-               ctx->vg_length = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_LENGTH);
-               ctx->vg_clump = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_CLUMP);
-               ctx->vg_kink = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_KINK);
-               ctx->vg_rough1 = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_ROUGH1);
-               ctx->vg_rough2 = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_ROUGH2);
-               ctx->vg_roughe = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_ROUGHE);
-               if(psys->part->flag & PART_CHILD_EFFECT)
-                       ctx->vg_effector = 
psys_cache_vgroup(ctx->dm,psys,PSYS_VG_EFFECTOR);
-       }
+       ctx->vg_length = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_LENGTH);
+       ctx->vg_clump = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_CLUMP);
+       ctx->vg_kink = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_KINK);
+       ctx->vg_rough1 = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_ROUGH1);
+       ctx->vg_rough2 = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_ROUGH2);
+       ctx->vg_roughe = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_ROUGHE);
+       if(psys->part->flag & PART_CHILD_EFFECT)
+               ctx->vg_effector = 
psys_cache_vgroup(ctx->dm,psys,PSYS_VG_EFFECTOR);
 
        /* set correct ipo timing */
 #if 0 // XXX old animation system
@@ -2912,8 +2910,8 @@
        if(ma && (psys->part->draw & PART_DRAW_MAT_COL))
                VECCOPY(col, &ma->r)
 
-       if(psys->part->from!=PART_FROM_PARTICLE && !(psys->flag & 
PSYS_GLOBAL_HAIR)) {
-               if(!(psys->part->flag & PART_CHILD_EFFECT))
+       if((psys->flag & PSYS_GLOBAL_HAIR)==0) {
+               if((psys->part->flag & PART_CHILD_EFFECT)==0)
                        vg_effector = psys_cache_vgroup(psmd->dm, psys, 
PSYS_VG_EFFECTOR);
                
                if(!psys->totchild)
@@ -4042,7 +4040,7 @@
                if(state->time < 0.0f)
                        t = psys_get_child_time(psys, cpa, -state->time, NULL, 
NULL);
                
-               if(totchild && part->from!=PART_FROM_PARTICLE && 
part->childtype==PART_CHILD_FACES){
+               if(totchild && part->childtype==PART_CHILD_FACES){
                        /* part->parents could still be 0 so we can't test with 
totparent */
                        between=1;
                }
@@ -4192,7 +4190,7 @@
                if(!psys->totchild)
                        return 0;
 
-               if(part->from != PART_FROM_PARTICLE && part->childtype == 
PART_CHILD_FACES){
+               if(part->childtype == PART_CHILD_FACES){
                        if(!(psys->flag & PSYS_KEYED))
                                return 0;
 
@@ -4314,13 +4312,15 @@
        }
 }
 
-void psys_get_dupli_texture(Object *UNUSED(ob), ParticleSettings *part, 
ParticleSystemModifierData *psmd, ParticleData *pa, ChildParticle *cpa, float 
*uv, float *orco)
+void psys_get_dupli_texture(ParticleSystem *psys, ParticleSettings *part, 
ParticleSystemModifierData *psmd, ParticleData *pa, ChildParticle *cpa, float 
*uv, float *orco)
 {
        MFace *mface;
        MTFace *mtface;
        float loc[3];
        int num;
 
+       uv[0] = uv[1] = 0.f;
+
        if(cpa) {
                if(part->childtype == PART_CHILD_FACES) {
                        mtface= CustomData_get_layer(&psmd->dm->faceData, 
CD_MTFACE);
@@ -4329,43 +4329,36 @@
                                mtface += cpa->num;
                                psys_interpolate_uvs(mtface, mface->v4, 
cpa->fuv, uv);
                        }
-                       else
-                               uv[0]= uv[1]= 0.0f;
+               
+                       
psys_particle_on_emitter(psmd,PART_FROM_FACE,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,loc,0,0,0,orco,0);
+                       return;
                }
-               else
-                       uv[0]= uv[1]= 0.0f;
-
-               psys_particle_on_emitter(psmd,
-                       (part->childtype == PART_CHILD_FACES)? PART_FROM_FACE: 
PART_FROM_PARTICLE,
-                       
cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,loc,0,0,0,orco,0);
+               else {
+                       pa = psys->particles + cpa->pa[0];
+               }
        }
-       else {
-               if(part->from == PART_FROM_FACE) {
-                       mtface= CustomData_get_layer(&psmd->dm->faceData, 
CD_MTFACE);
-                       num= pa->num_dmcache;
 
-                       if(num == DMCACHE_NOTFOUND)
-                               num= pa->num;
+       if(part->from == PART_FROM_FACE) {
+               mtface= CustomData_get_layer(&psmd->dm->faceData, CD_MTFACE);
+               num= pa->num_dmcache;
 
-                       if (num >= psmd->dm->getNumFaces(psmd->dm)) {
-                               /* happens when simplify is enabled
-                                * gives invalid coords but would crash 
otherwise */
-                               num= DMCACHE_NOTFOUND;
-                       }
+               if(num == DMCACHE_NOTFOUND)
+                       num= pa->num;
 
-                       if(mtface && num != DMCACHE_NOTFOUND) {
-                               mface= psmd->dm->getFaceData(psmd->dm, num, 
CD_MFACE);
-                               mtface += num;
-                               psys_interpolate_uvs(mtface, mface->v4, 
pa->fuv, uv);
-                       }
-                       else
-                               uv[0]= uv[1]= 0.0f;
+               if (num >= psmd->dm->getNumFaces(psmd->dm)) {
+                       /* happens when simplify is enabled
+                               * gives invalid coords but would crash 
otherwise */
+                       num= DMCACHE_NOTFOUND;
                }
-               else
-                       uv[0]= uv[1]= 0.0f;
 
-               
psys_particle_on_emitter(psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,0,0,0,orco,0);
+               if(mtface && num != DMCACHE_NOTFOUND) {
+                       mface= psmd->dm->getFaceData(psmd->dm, num, CD_MFACE);
+                       mtface += num;
+                       psys_interpolate_uvs(mtface, mface->v4, pa->fuv, uv);
+               }
        }
+
+       
psys_particle_on_emitter(psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,0,0,0,orco,0);
 }
 
 void psys_get_dupli_path_transform(ParticleSimulationData *sim, ParticleData 
*pa, ChildParticle *cpa, ParticleCacheKey *cache, float mat[][4], float *scale)
@@ -4380,7 +4373,7 @@
        len= normalize_v3(vec);
 
        if(psys->part->rotmode) {
-               if(!pa)
+               if(pa == NULL)
                        pa= psys->particles+cpa->pa[0];
 
                vec_to_quat( q,xvec, ob->trackflag, ob->upflag);
@@ -4391,12 +4384,13 @@
                mul_m4_m4m4(mat, obrotmat, qmat);
        }
        else {
+               if(pa == NULL && psys->part->childflat != PART_CHILD_FACES)
+                       pa = psys->particles + cpa->pa[0];
+
                if(pa)
                        
psys_particle_on_emitter(psmd,sim->psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,nor,0,0,0,0);
                else
-                       psys_particle_on_emitter(psmd,
-                               (psys->part->childtype == PART_CHILD_FACES)? 
PART_FROM_FACE: PART_FROM_PARTICLE,
-                               
cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,loc,nor,0,0,0,0);
+                       
psys_particle_on_emitter(psmd,PART_FROM_FACE,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,loc,nor,0,0,0,0);
                
                copy_m3_m4(nmat, ob->imat);
                transpose_m3(nmat);

Modified: trunk/blender/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle_system.c    
2011-03-09 14:16:21 UTC (rev 35429)
+++ trunk/blender/source/blender/blenkernel/intern/particle_system.c    
2011-03-09 14:18:33 UTC (rev 35430)
@@ -329,6 +329,10 @@
        }
 }
 
+/************************************************/
+/*                     Distribution                                            
*/
+/************************************************/
+
 void psys_calc_dmcache(Object *ob, DerivedMesh *dm, ParticleSystem *psys)
 {
        /* use for building derived mesh mapping info:
@@ -405,8 +409,36 @@
        }
 }
 
-static void distribute_particles_in_grid(DerivedMesh *dm, ParticleSystem *psys)
+static void distribute_simple_children(Scene *scene, Object *ob, DerivedMesh 
*finaldm, ParticleSystem *psys)
 {
+       ChildParticle *cpa = psys->child;
+       int i, p;
+       int child_nbr= get_psys_child_number(scene, psys);
+       int totpart= get_psys_tot_child(scene, psys);
+
+       alloc_child_particles(psys, totpart);
+
+       for(i=0; i<child_nbr; i++){
+               for(p=0; p<psys->totpart; p++,cpa++){
+                       float length=2.0;
+                       cpa->parent=p;
+                                       
+                       /* create even spherical distribution inside unit 
sphere */
+                       while(length>=1.0f){
+                               cpa->fuv[0]=2.0f*BLI_frand()-1.0f;
+                               cpa->fuv[1]=2.0f*BLI_frand()-1.0f;
+                               cpa->fuv[2]=2.0f*BLI_frand()-1.0f;
+                               length=len_v3(cpa->fuv);
+                       }
+
+                       cpa->num=-1;
+               }
+       }

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to