Revision: 21196
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21196
Author:   jhk
Date:     2009-06-27 17:41:47 +0200 (Sat, 27 Jun 2009)

Log Message:
-----------
Particle ID block controls:
* Adding/removing particle systems to an object.
* Changing of particle settings.
* Currently showing an object's particle systems in a list (like materials).

Modified Paths:
--------------
    branches/blender2.5/blender/release/ui/buttons_particle.py
    branches/blender2.5/blender/source/blender/blenkernel/BKE_particle.h
    branches/blender2.5/blender/source/blender/blenkernel/intern/depsgraph.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/particle.c
    
branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_intern.h
    
branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_ops.c
    
branches/blender2.5/blender/source/blender/editors/space_buttons/space_buttons.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_object.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_particle.c

Modified: branches/blender2.5/blender/release/ui/buttons_particle.py
===================================================================
--- branches/blender2.5/blender/release/ui/buttons_particle.py  2009-06-27 
15:28:58 UTC (rev 21195)
+++ branches/blender2.5/blender/release/ui/buttons_particle.py  2009-06-27 
15:41:47 UTC (rev 21196)
@@ -7,6 +7,7 @@
 def particle_panel_poll(context):
        psys = context.particle_system
        if psys==None:  return False
+       if psys.settings==None:  return False
        return psys.settings.type in ('EMITTER', 'REACTOR', 'HAIR')
 
 class ParticleButtonsPanel(bpy.types.Panel):
@@ -29,42 +30,51 @@
                ob = context.object
                psys = context.particle_system
 
-               split = layout.split(percentage=0.65)
+               if ob:
+                       row = layout.row()
 
-               if psys:
-                       split.template_ID(psys, "settings")
+                       row.template_list(ob, "particle_systems", 
"active_particle_system_index")
 
+                       col = row.column(align=True)
+                       col.itemO("OBJECT_OT_particle_system_slot_add", 
icon="ICON_ZOOMIN", text="")
+                       col.itemO("OBJECT_OT_particle_system_slot_remove", 
icon="ICON_ZOOMOUT", text="")
+
                if psys:
+                       split = layout.split(percentage=0.65)
+                       
+                       split.template_ID(psys, "settings", 
new="PARTICLE_OT_new")
+                       
                        #row = layout.row()
                        #row.itemL(text="Viewport")
                        #row.itemL(text="Render")
                        
                        part = psys.settings
-                       ptype = psys.settings.type
                        
-                       if ptype not in ('EMITTER', 'REACTOR', 'HAIR'):
-                               layout.itemL(text="No settings for fluid 
particles")
-                               return
+                       if part:
+                               ptype = psys.settings.type
+                               if ptype not in ('EMITTER', 'REACTOR', 'HAIR'):
+                                       layout.itemL(text="No settings for 
fluid particles")
+                                       return
+                                       
+                               split = layout.split(percentage=0.65)
                                
-                       split = layout.split(percentage=0.65)
-                       
-                       split.enabled = particle_panel_enabled(psys)
-                       split.itemR(part, "type")
-                       split.itemR(psys, "seed")
-                       
-                       split = layout.split(percentage=0.65)
-                       if part.type=='HAIR':
-                               if psys.editable==True:
-                                       split.itemO("PARTICLE_OT_editable_set", 
text="Free Edit")
-                               else:
-                                       split.itemO("PARTICLE_OT_editable_set", 
text="Make Editable")
-                               row = split.row()
-                               row.enabled = particle_panel_enabled(psys)
-                               row.itemR(part, "hair_step")
-                       elif part.type=='REACTOR':
                                split.enabled = particle_panel_enabled(psys)
-                               split.itemR(psys, "reactor_target_object")
-                               split.itemR(psys, 
"reactor_target_particle_system", text="Particle System")
+                               split.itemR(part, "type")
+                               split.itemR(psys, "seed")
+                               
+                               split = layout.split(percentage=0.65)
+                               if part.type=='HAIR':
+                                       if psys.editable==True:
+                                               
split.itemO("PARTICLE_OT_editable_set", text="Free Edit")
+                                       else:
+                                               
split.itemO("PARTICLE_OT_editable_set", text="Make Editable")
+                                       row = split.row()
+                                       row.enabled = 
particle_panel_enabled(psys)
+                                       row.itemR(part, "hair_step")
+                               elif part.type=='REACTOR':
+                                       split.enabled = 
particle_panel_enabled(psys)
+                                       split.itemR(psys, 
"reactor_target_object")
+                                       split.itemR(psys, 
"reactor_target_particle_system", text="Particle System")
                
 class PARTICLE_PT_emission(ParticleButtonsPanel):
        __idname__= "PARTICLE_PT_emission"
@@ -120,6 +130,7 @@
        def poll(self, context):
                psys = context.particle_system
                if psys==None:  return False
+               if psys.settings==None:  return False
                return psys.settings.type in ('EMITTER', 'REACTOR')
 
        def draw(self, context):
@@ -287,7 +298,10 @@
        __label__ = "Render"
        
        def poll(self, context):
-               return (context.particle_system != None)
+               psys = context.particle_system
+               if psys==None: return False
+               if psys.settings==None: return False
+               return True;
                
        def draw(self, context):
                layout = self.layout
@@ -421,7 +435,10 @@
        __default_closed__ = True
        
        def poll(self, context):
-               return (context.particle_system != None)
+               psys = context.particle_system
+               if psys==None: return False
+               if psys.settings==None: return False
+               return True;
        
        def draw(self, context):
                layout = self.layout

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_particle.h        
2009-06-27 15:28:58 UTC (rev 21195)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_particle.h        
2009-06-27 15:41:47 UTC (rev 21196)
@@ -217,6 +217,7 @@
 
 struct ParticleSystem *psys_get_current(struct Object *ob);
 short psys_get_current_num(struct Object *ob);
+void psys_set_current_num(Object *ob, int index);
 struct Object *psys_find_object(struct Scene *scene, struct ParticleSystem 
*psys);
 //struct ParticleSystem *psys_get(struct Object *ob, int index);
 struct ParticleData *psys_get_selected_particle(struct ParticleSystem *psys, 
int *index);
@@ -250,6 +251,8 @@
 void psys_particle_on_emitter(struct ParticleSystemModifierData *psmd, int 
distr, int index, int index_dmcache, float *fuv, float foffset, float *vec, 
float *nor, float *utan, float *vtan, float *orco, float *ornor);
 struct ParticleSystemModifierData *psys_get_modifier(struct Object *ob, struct 
ParticleSystem *psys);
 
+void object_add_particle_system_slot(struct Scene *scene, struct Object *ob);
+void object_remove_particle_system_slot(struct Scene *scene, struct Object 
*ob);
 struct ParticleSettings *psys_new_settings(char *name, struct Main *main);
 struct ParticleSettings *psys_copy_settings(struct ParticleSettings *part);
 void psys_flush_particle_settings(struct Scene *scene, struct ParticleSettings 
*part, int recalc);

Modified: 
branches/blender2.5/blender/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/depsgraph.c    
2009-06-27 15:28:58 UTC (rev 21195)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/depsgraph.c    
2009-06-27 15:41:47 UTC (rev 21196)
@@ -559,7 +559,7 @@
 
                        dag_add_relation(dag, node, node, DAG_RL_OB_DATA, 
"Particle-Object Relation");
 
-                       if(psys->flag & PSYS_DISABLED || psys->flag & 
PSYS_DELETE)
+                       if(!psys_check_enabled(ob, psys))
                                continue;
 
                        if(part->phystype==PART_PHYS_KEYED && psys->keyed_ob &&

Modified: 
branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c     
2009-06-27 15:28:58 UTC (rev 21195)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c     
2009-06-27 15:41:47 UTC (rev 21196)
@@ -6295,6 +6295,9 @@
        MTex *mtex;
        int i;
 
+       if(!psmd->psys->part)
+               return 0;
+
        ma= give_current_material(ob, psmd->psys->part->omat);
        if(ma) {
                for(i=0; i<MAX_MTEX; i++) {

Modified: 
branches/blender2.5/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/particle.c     
2009-06-27 15:28:58 UTC (rev 21195)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/particle.c     
2009-06-27 15:41:47 UTC (rev 21196)
@@ -222,6 +222,20 @@
        
        return i;
 }
+void psys_set_current_num(Object *ob, int index)
+{
+       ParticleSystem *psys;
+       short i;
+
+       if(ob==0) return;
+
+       for(psys=ob->particlesystem.first, i=0; psys; psys=psys->next, i++) {
+               if(i == index - 1)
+                       psys->flag |= PSYS_CURRENT;
+               else
+                       psys->flag &= ~PSYS_CURRENT;
+       }
+}
 Object *psys_find_object(Scene *scene, ParticleSystem *psys)
 {
        Base *base = scene->base.first;
@@ -307,7 +321,7 @@
        ParticleSystemModifierData *psmd;
        Mesh *me;
 
-       if(psys->flag & PSYS_DISABLED || psys->flag & PSYS_DELETE)
+       if(psys->flag & PSYS_DISABLED || psys->flag & PSYS_DELETE || 
!psys->part)
                return 0;
 
        if(ob->type == OB_MESH) {
@@ -2915,6 +2929,61 @@
 /************************************************/
 /*                     ParticleSettings handling                       */
 /************************************************/
+void object_add_particle_system_slot(Scene *scene, Object *ob)
+{
+       ParticleSystem *psys;
+       ModifierData *md;
+       ParticleSystemModifierData *psmd;
+
+       if(!ob || ob->type != OB_MESH)
+               return;
+
+       psys = ob->particlesystem.first;
+       for(; psys; psys=psys->next)
+               psys->flag &= ~PSYS_CURRENT;
+
+       psys = MEM_callocN(sizeof(ParticleSystem), "particle_system");
+       psys->pointcache = BKE_ptcache_add();
+       BLI_addtail(&ob->particlesystem, psys);
+
+       psys->part = psys_new_settings("PSys", NULL);
+
+       md= modifier_new(eModifierType_ParticleSystem);
+       sprintf(md->name, "ParticleSystem %i", 
BLI_countlist(&ob->particlesystem));
+       psmd= (ParticleSystemModifierData*) md;
+       psmd->psys=psys;
+       BLI_addtail(&ob->modifiers, md);
+
+       psys->totpart=0;
+       psys->flag = PSYS_ENABLED|PSYS_CURRENT;
+       psys->cfra=bsystem_time(scene,ob,scene->r.cfra+1,0.0);
+
+       DAG_scene_sort(scene);
+       DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+}
+void object_remove_particle_system_slot(Scene *scene, Object *ob)
+{
+       ParticleSystem *psys = psys_get_current(ob);
+       ParticleSystemModifierData *psmd;
+
+       if(!psys)
+               return;
+
+       /* clear modifier */
+       psmd= psys_get_modifier(ob, psys);
+       BLI_remlink(&ob->modifiers, psmd);
+       modifier_free((ModifierData *)psmd);
+
+       /* clear particle system */
+       BLI_remlink(&ob->particlesystem, psys);
+       psys_free(ob,psys);
+
+       if(ob->particlesystem.first)
+               ((ParticleSystem *) ob->particlesystem.first)->flag |= 
PSYS_CURRENT;
+
+       DAG_scene_sort(scene);
+       DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+}
 static void default_particle_settings(ParticleSettings *part)
 {
        int i;
@@ -3001,6 +3070,9 @@
 {
        ParticleSettings *part;
 
+       if(main==NULL)
+               main = G.main;
+
        part= alloc_libblock(&main->particle, ID_PA, name);
        
        default_particle_settings(part);

Modified: 
branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_intern.h
===================================================================
--- 
branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_intern.h
   2009-06-27 15:28:58 UTC (rev 21195)
+++ 
branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_intern.h
   2009-06-27 15:41:47 UTC (rev 21196)
@@ -71,5 +71,10 @@
 void TEXTURE_OT_new(struct wmOperatorType *ot);
 void WORLD_OT_new(struct wmOperatorType *ot);
 
+void OBJECT_OT_particle_system_slot_add(struct wmOperatorType *ot);
+void OBJECT_OT_particle_system_slot_remove(struct wmOperatorType *ot);
+
+void PARTICLE_OT_new(struct wmOperatorType *ot);
+
 #endif /* ED_BUTTONS_INTERN_H */
 


@@ 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