From 5fe3524ab162cf6f9080653fc5f2c1a1384f2c64 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 26 Jan 2010 11:15:45 +0000 Subject: [PATCH] Fix #20803: convert button in particle modifier didn't work for creating duplis yet. --- .../editors/interface/interface_templates.c | 6 +- source/blender/editors/object/object_add.c | 1 - .../blender/editors/object/object_modifier.c | 123 +++++++++--------- 3 files changed, 63 insertions(+), 67 deletions(-) diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index f9c27c8572f..a90ddd991ca 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -797,8 +797,10 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif if (md->type==eModifierType_ParticleSystem) { ParticleSystem *psys= ((ParticleSystemModifierData *)md)->psys; - if (!(ob->mode & OB_MODE_PARTICLE_EDIT)) { - if(ELEM3(psys->part->ren_as, PART_DRAW_PATH, PART_DRAW_GR, PART_DRAW_OB) && psys->pathcache) + if (!(ob->mode & OB_MODE_PARTICLE_EDIT) && psys->pathcache) { + if(ELEM(psys->part->ren_as, PART_DRAW_GR, PART_DRAW_OB)) + uiItemO(row, "Convert", 0, "OBJECT_OT_duplicates_make_real"); + else if(psys->part->ren_as == PART_DRAW_PATH) uiItemO(row, "Convert", 0, "OBJECT_OT_modifier_convert"); } } diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 23bd7034cfe..fede69c10cb 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -1152,7 +1152,6 @@ void OBJECT_OT_duplicates_make_real(wmOperatorType *ot) ot->idname= "OBJECT_OT_duplicates_make_real"; /* api callbacks */ - ot->invoke= WM_operator_confirm; ot->exec= object_duplicates_make_real_exec; ot->poll= ED_operator_scene_editable; diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index eec8104f29b..155e0043132 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -265,78 +265,73 @@ int ED_object_modifier_convert(ReportList *reports, Scene *scene, Object *ob, Mo psys=((ParticleSystemModifierData *)md)->psys; part= psys->part; - if(part->ren_as == PART_DRAW_GR || part->ren_as == PART_DRAW_OB) { - ; // XXX make_object_duplilist_real(NULL); + if(part->ren_as != PART_DRAW_PATH || psys->pathcache == 0) + return 0; + + totpart= psys->totcached; + totchild= psys->totchildcache; + + if(totchild && (part->draw&PART_DRAW_PARENT)==0) + totpart= 0; + + /* count */ + cache= psys->pathcache; + for(a=0; asteps+1; + totedge+= key->steps; } - else { - if(part->ren_as != PART_DRAW_PATH || psys->pathcache == 0) - return 0; - totpart= psys->totcached; - totchild= psys->totchildcache; + cache= psys->childcache; + for(a=0; asteps+1; + totedge+= key->steps; + } - if(totchild && (part->draw&PART_DRAW_PARENT)==0) - totpart= 0; + if(totvert==0) return 0; - /* count */ - cache= psys->pathcache; - for(a=0; asteps+1; - totedge+= key->steps; - } + /* add new mesh */ + obn= add_object(scene, OB_MESH); + me= obn->data; + + me->totvert= totvert; + me->totedge= totedge; + + me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, totvert); + me->medge= CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, NULL, totedge); + me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, 0); + + mvert= me->mvert; + medge= me->medge; - cache= psys->childcache; - for(a=0; asteps+1; - totedge+= key->steps; - } - - if(totvert==0) return 0; - - /* add new mesh */ - obn= add_object(scene, OB_MESH); - me= obn->data; - - me->totvert= totvert; - me->totedge= totedge; - - me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, totvert); - me->medge= CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, NULL, totedge); - me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, 0); - - mvert= me->mvert; - medge= me->medge; - - /* copy coordinates */ - cache= psys->pathcache; - for(a=0; asteps; - for(k=0; k<=kmax; k++,key++,cvert++,mvert++) { - VECCOPY(mvert->co,key->co); - if(k) { - medge->v1= cvert-1; - medge->v2= cvert; - medge->flag= ME_EDGEDRAW|ME_EDGERENDER|ME_LOOSEEDGE; - medge++; - } + /* copy coordinates */ + cache= psys->pathcache; + for(a=0; asteps; + for(k=0; k<=kmax; k++,key++,cvert++,mvert++) { + VECCOPY(mvert->co,key->co); + if(k) { + medge->v1= cvert-1; + medge->v2= cvert; + medge->flag= ME_EDGEDRAW|ME_EDGERENDER|ME_LOOSEEDGE; + medge++; } } + } - cache=psys->childcache; - for(a=0; asteps; - for(k=0; k<=kmax; k++,key++,cvert++,mvert++) { - VECCOPY(mvert->co,key->co); - if(k) { - medge->v1=cvert-1; - medge->v2=cvert; - medge->flag= ME_EDGEDRAW|ME_EDGERENDER|ME_LOOSEEDGE; - medge++; - } + cache=psys->childcache; + for(a=0; asteps; + for(k=0; k<=kmax; k++,key++,cvert++,mvert++) { + VECCOPY(mvert->co,key->co); + if(k) { + medge->v1=cvert-1; + medge->v2=cvert; + medge->flag= ME_EDGEDRAW|ME_EDGERENDER|ME_LOOSEEDGE; + medge++; } } }