diff options
author | Joseph Eagar <joeedh@gmail.com> | 2010-05-04 16:31:24 +0400 |
---|---|---|
committer | Joseph Eagar <joeedh@gmail.com> | 2010-05-04 16:31:24 +0400 |
commit | a7cbd5008e830224e73e2e55f89d0783ded422e5 (patch) | |
tree | 63f8d80c1db62e0a8f71db6d89de9d95e4b91fa0 | |
parent | cef3e3099a8d808474237e26cf373b3943897cb3 (diff) |
merging revisions 28564-28569 from render branch into trunk
-rw-r--r-- | intern/guardedalloc/MEM_guardedalloc.h | 6 | ||||
-rw-r--r-- | intern/guardedalloc/intern/mallocn.c | 23 | ||||
-rw-r--r-- | release/scripts/ui/properties_data_mesh.py | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/particle.c | 25 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 7 | ||||
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 8 | ||||
-rw-r--r-- | source/blender/editors/object/object_intern.h | 1 | ||||
-rw-r--r-- | source/blender/editors/object/object_ops.c | 1 | ||||
-rw-r--r-- | source/blender/editors/object/object_vgroup.c | 298 | ||||
-rw-r--r-- | source/blender/editors/render/render_internal.c | 8 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/drawobject.c | 12 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_action_types.h | 1 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_modifier_types.h | 1 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_object_types.h | 1 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 18 |
15 files changed, 326 insertions, 87 deletions
diff --git a/intern/guardedalloc/MEM_guardedalloc.h b/intern/guardedalloc/MEM_guardedalloc.h index 705f099ab63..c51e96f04b5 100644 --- a/intern/guardedalloc/MEM_guardedalloc.h +++ b/intern/guardedalloc/MEM_guardedalloc.h @@ -144,6 +144,12 @@ extern "C" { uintptr_t MEM_get_mapped_memory_in_use(void); int MEM_get_memory_blocks_in_use(void); + /*reset the peak memory statistic to zero*/ + void MEM_reset_peak_memory(void); + + /*get the peak memory usage in bytes, including mmap allocations*/ + uintptr_t MEM_get_peak_memory(void); + #ifdef __cplusplus } #endif diff --git a/intern/guardedalloc/intern/mallocn.c b/intern/guardedalloc/intern/mallocn.c index 9f2f57e119c..09f2d33a674 100644 --- a/intern/guardedalloc/intern/mallocn.c +++ b/intern/guardedalloc/intern/mallocn.c @@ -138,7 +138,7 @@ static const char *check_memlist(MemHead *memh); static volatile int totblock= 0; -static volatile uintptr_t mem_in_use= 0, mmap_in_use= 0; +static volatile uintptr_t mem_in_use= 0, mmap_in_use= 0, peak_mem = 0; static volatile struct localListBase _membase; static volatile struct localListBase *membase = &_membase; @@ -293,6 +293,8 @@ static void make_memhead_header(MemHead *memh, size_t len, const char *str) totblock++; mem_in_use += len; + + peak_mem = mem_in_use > peak_mem ? mem_in_use : peak_mem; } void *MEM_mallocN(size_t len, const char *str) @@ -377,6 +379,7 @@ void *MEM_mapallocN(size_t len, const char *str) make_memhead_header(memh, len, str); memh->mmap= 1; mmap_in_use += len; + peak_mem = mmap_in_use > peak_mem ? mmap_in_use : peak_mem; mem_unlock_thread(); #ifdef DEBUG_MEMCOUNTER if(_mallocn_count==DEBUG_MEMCOUNTER_ERROR_VAL) @@ -802,6 +805,24 @@ static const char *check_memlist(MemHead *memh) return(name); } +uintptr_t MEM_get_peak_memory(void) +{ + uintptr_t _peak_mem; + + mem_lock_thread(); + _peak_mem = peak_mem; + mem_unlock_thread(); + + return _peak_mem; +} + +void MEM_reset_peak_memory(void) +{ + mem_lock_thread(); + peak_mem = 0; + mem_unlock_thread(); +} + uintptr_t MEM_get_memory_in_use(void) { uintptr_t _mem_in_use; diff --git a/release/scripts/ui/properties_data_mesh.py b/release/scripts/ui/properties_data_mesh.py index 780a743f15a..5321c76679c 100644 --- a/release/scripts/ui/properties_data_mesh.py +++ b/release/scripts/ui/properties_data_mesh.py @@ -155,6 +155,9 @@ class DATA_PT_vertex_groups(DataButtonsPanel): col.operator("object.vertex_group_add", icon='ZOOMIN', text="") col.operator("object.vertex_group_remove", icon='ZOOMOUT', text="") col.menu("MESH_MT_vertex_group_specials", icon='DOWNARROW_HLT', text="") + if group: + col.operator("object.vertex_group_move", icon='TRIA_UP', text="").direction = 'UP' + col.operator("object.vertex_group_move", icon='TRIA_DOWN', text="").direction = 'DOWN' if group: row = layout.row() diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 31378e3a80a..3ac1ada58cb 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -2950,7 +2950,7 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf float birthtime = 0.0, dietime = 0.0; float t, time = 0.0, keytime = 0.0, frs_sec; float hairmat[4][4], rotmat[3][3], prev_tangent[3]; - int k,i; + int k, i; int steps = (int)pow(2.0, (double)pset->draw_step); int totpart = edit->totpoint, recalc_set=0; float sel_col[3]; @@ -3097,17 +3097,26 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf /* selection coloring in edit mode */ if(pset->brushtype==PE_BRUSH_WEIGHT){ - if(k==0) + float t2; + + if(k==0) { weight_to_rgb(pind.hkey[1]->weight, ca->col, ca->col+1, ca->col+2); - else if(k >= steps - 1) - weight_to_rgb(pind.hkey[0]->weight, ca->col, ca->col+1, ca->col+2); - else - weight_to_rgb((1.0f - keytime) * pind.hkey[0]->weight + keytime * pind.hkey[1]->weight, ca->col, ca->col+1, ca->col+2); + } else { + float w1[3], w2[3]; + keytime = (t - (*pind.ekey[0]->time))/((*pind.ekey[1]->time) - (*pind.ekey[0]->time)); + + weight_to_rgb(pind.hkey[0]->weight, w1, w1+1, w1+2); + weight_to_rgb(pind.hkey[1]->weight, w2, w2+1, w2+2); + + interp_v3_v3v3(ca->col, w1, w2, keytime); + } /* at the moment this is only used for weight painting. * will need to move out of this check if its used elsewhere. */ - pind.hkey[0] = pind.hkey[1]; - pind.hkey[1]++; + t2 = birthtime + ((float)(k+1)/(float)steps) * (dietime - birthtime); + + while (pind.hkey[1]->time < t2) pind.hkey[1]++; + pind.hkey[0] = pind.hkey[1] - 1; } else { if((ekey + (pind.ekey[0] - point->keys))->flag & PEK_SELECT){ diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index be19f7bfc18..fad679bc9f3 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2221,6 +2221,12 @@ static void lib_link_pose(FileData *fd, Object *ob, bPose *pose) /* always rebuild to match proxy or lib changes */ rebuild= ob->proxy || (ob->id.lib==NULL && arm->id.lib); + if (ob->proxy && pose->proxy_act_bone[0]) { + Bone *bone = get_named_bone(arm, pose->proxy_act_bone); + if (bone) + arm->act_bone = bone; + } + for (pchan = pose->chanbase.first; pchan; pchan=pchan->next) { lib_link_constraints(fd, (ID *)ob, &pchan->constraints); @@ -11579,7 +11585,6 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob) PartEff *paf; int a; - expand_doit(fd, mainvar, ob->data); for (md=ob->modifiers.first; md; md=md->next) { diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 98b3300ce4c..5f2ee73e129 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -1266,6 +1266,14 @@ static void write_objects(WriteData *wd, ListBase *idbase) write_sensors(wd, &ob->sensors); write_controllers(wd, &ob->controllers); write_actuators(wd, &ob->actuators); + + if (ob->type == OB_ARMATURE) { + bArmature *arm = ob->data; + if (arm && ob->pose && arm->act_bone) { + strcpy(ob->pose->proxy_act_bone, arm->act_bone->name); + } + } + write_pose(wd, ob->pose); write_defgroups(wd, &ob->defbase); write_constraints(wd, &ob->constraints); diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h index 6b43591479d..90c5f48ffeb 100644 --- a/source/blender/editors/object/object_intern.h +++ b/source/blender/editors/object/object_intern.h @@ -196,6 +196,7 @@ void OBJECT_OT_vertex_group_clean(struct wmOperatorType *ot); void OBJECT_OT_vertex_group_mirror(struct wmOperatorType *ot); void OBJECT_OT_vertex_group_set_active(struct wmOperatorType *ot); void OBJECT_OT_vertex_group_sort(struct wmOperatorType *ot); +void OBJECT_OT_vertex_group_move(struct wmOperatorType *ot); void OBJECT_OT_game_property_new(struct wmOperatorType *ot); void OBJECT_OT_game_property_remove(struct wmOperatorType *ot); diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index 082aa3db62b..5ddf33ca170 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -176,6 +176,7 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_vertex_group_mirror); WM_operatortype_append(OBJECT_OT_vertex_group_set_active); WM_operatortype_append(OBJECT_OT_vertex_group_sort); + WM_operatortype_append(OBJECT_OT_vertex_group_move); WM_operatortype_append(OBJECT_OT_game_property_new); WM_operatortype_append(OBJECT_OT_game_property_remove); diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index 246bc3875f1..47390c19742 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -122,6 +122,72 @@ void ED_vgroup_data_create(ID *id) } } +int ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_tot) +{ + if(id) { + switch(GS(id->name)) { + case ID_ME: + { + Mesh *me = (Mesh *)id; + *dvert_tot= me->totvert; + + if (!me->edit_mesh) { + int i; + + *dvert_arr= MEM_mallocN(sizeof(void*)*me->totvert, "vgroup parray from me"); + + for (i=0; i<me->totvert; i++) { + (*dvert_arr)[i] = me->dvert + i; + } + } else { + EditMesh *em = me->edit_mesh; + EditVert *eve; + int i; + + if (!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT)) { + *dvert_tot = 0; + *dvert_arr = NULL; + return 0; + } + + i = 0; + for (eve=em->verts.first; eve; eve=eve->next) i++; + + *dvert_arr= MEM_mallocN(sizeof(void*)*i, "vgroup parray from me"); + *dvert_tot = i; + + i = 0; + for (eve=em->verts.first; eve; eve=eve->next, i++) { + (*dvert_arr)[i] = CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT); + } + + } + return 1; + } + case ID_LT: + { + int i=0; + + Lattice *lt= (Lattice *)id; + lt= (lt->editlatt)? lt->editlatt: lt; + + *dvert_tot= lt->pntsu*lt->pntsv*lt->pntsw; + *dvert_arr= MEM_mallocN(sizeof(void*)*(*dvert_tot), "vgroup parray from me"); + + for (i=0; i<*dvert_tot; i++) { + (*dvert_arr)[i] = lt->dvert + i; + } + + return 1; + } + } + } + + *dvert_arr= NULL; + *dvert_tot= 0; + return 0; +} + /* returns true if the id type supports weights */ int ED_vgroup_give_array(ID *id, MDeformVert **dvert_arr, int *dvert_tot) { @@ -153,20 +219,22 @@ int ED_vgroup_give_array(ID *id, MDeformVert **dvert_arr, int *dvert_tot) /* matching index only */ int ED_vgroup_copy_array(Object *ob, Object *ob_from) { - MDeformVert *dvert_array_from, *dvf; - MDeformVert *dvert_array, *dv; - + MDeformVert **dvert_array_from, **dvf; + MDeformVert **dvert_array, **dv; int dvert_tot_from; int dvert_tot; int i; int totdef_from= BLI_countlist(&ob_from->defbase); int totdef= BLI_countlist(&ob->defbase); - ED_vgroup_give_array(ob_from->data, &dvert_array_from, &dvert_tot_from); - ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot); + ED_vgroup_give_parray(ob_from->data, &dvert_array_from, &dvert_tot_from); + ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot); - if(ob==ob_from || dvert_tot==0 || (dvert_tot != dvert_tot_from) || dvert_array_from==NULL || dvert_array==NULL) + if(ob==ob_from || dvert_tot==0 || (dvert_tot != dvert_tot_from) || dvert_array_from==NULL || dvert_array==NULL) { + if (dvert_array) MEM_freeN(dvert_array); + if (dvert_array_from) MEM_freeN(dvert_array_from); return 0; + } /* do the copy */ BLI_freelistN(&ob->defbase); @@ -187,15 +255,18 @@ int ED_vgroup_copy_array(Object *ob, Object *ob_from) dv= dvert_array; for(i=0; i<dvert_tot; i++, dvf++, dv++) { - if(dv->dw) - MEM_freeN(dv->dw); + if((*dv)->dw) + MEM_freeN((*dv)->dw); - *dv= *dvf; + *(*dv)= *(*dvf); - if(dv->dw) - dv->dw= MEM_dupallocN(dv->dw); + if((*dv)->dw) + (*dv)->dw= MEM_dupallocN((*dv)->dw); } + MEM_freeN(dvert_array); + MEM_freeN(dvert_array_from); + return 1; } @@ -537,7 +608,7 @@ static void vgroup_duplicate(Object *ob) bDeformGroup *dg, *cdg; char name[32], s[32]; MDeformWeight *org, *cpy; - MDeformVert *dvert, *dvert_array=NULL; + MDeformVert *dvert, **dvert_array=NULL; int i, idg, icdg, dvert_tot=0; dg = BLI_findlink(&ob->defbase, (ob->actdef-1)); @@ -570,13 +641,13 @@ static void vgroup_duplicate(Object *ob) ob->actdef = BLI_countlist(&ob->defbase); icdg = (ob->actdef-1); - ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot); + ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot); if(!dvert_array) return; for(i = 0; i < dvert_tot; i++) { - dvert = dvert_array+i; + dvert = dvert_array[i]; org = defvert_find_index(dvert, idg); if(org) { float weight = org->weight; @@ -585,16 +656,18 @@ static void vgroup_duplicate(Object *ob) cpy->weight = weight; } } + + MEM_freeN(dvert_array); } static void vgroup_normalize(Object *ob) { bDeformGroup *dg; MDeformWeight *dw; - MDeformVert *dvert, *dvert_array=NULL; + MDeformVert *dvert, **dvert_array=NULL; int i, def_nr, dvert_tot=0; - ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot); + ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot); dg = BLI_findlink(&ob->defbase, (ob->actdef-1)); @@ -604,7 +677,7 @@ static void vgroup_normalize(Object *ob) def_nr= ob->actdef-1; for(i = 0; i < dvert_tot; i++) { - dvert = dvert_array+i; + dvert = dvert_array[i]; dw = defvert_find_index(dvert, def_nr); if(dw) { weight_max = MAX2(dw->weight, weight_max); @@ -613,7 +686,7 @@ static void vgroup_normalize(Object *ob) if(weight_max > 0.0f) { for(i = 0; i < dvert_tot; i++) { - dvert = dvert_array+i; + dvert = dvert_array[i]; dw = defvert_find_index(dvert, def_nr); if(dw) { dw->weight /= weight_max; @@ -624,16 +697,18 @@ static void vgroup_normalize(Object *ob) } } } + + if (dvert_array) MEM_freeN(dvert_array); } static void vgroup_levels(Object *ob, float offset, float gain) { bDeformGroup *dg; MDeformWeight *dw; - MDeformVert *dvert, *dvert_array=NULL; + MDeformVert *dvert, **dvert_array=NULL; int i, def_nr, dvert_tot=0; - ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot); + ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot); dg = BLI_findlink(&ob->defbase, (ob->actdef-1)); @@ -641,7 +716,7 @@ static void vgroup_levels(Object *ob, float offset, float gain) def_nr= ob->actdef-1; for(i = 0; i < dvert_tot; i++) { - dvert = dvert_array+i; + dvert = dvert_array[i]; dw = defvert_find_index(dvert, def_nr); if(dw) { dw->weight = gain * (dw->weight + offset); @@ -650,17 +725,19 @@ static void vgroup_levels(Object *ob, float offset, float gain) } } } + + if (dvert_array) MEM_freeN(dvert_array); } /* TODO - select between groups */ static void vgroup_normalize_all(Object *ob, int lock_active) { MDeformWeight *dw, *dw_act; - MDeformVert *dvert, *dvert_array=NULL; + MDeformVert *dvert, **dvert_array=NULL; int i, dvert_tot=0; float tot_weight; - ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot); + ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot); if(dvert_array) { if(lock_active) { @@ -672,7 +749,7 @@ static void vgroup_normalize_all(Object *ob, int lock_active) tot_weight= 0.0f; dw_act= NULL; - dvert = dvert_array+i; + dvert = dvert_array[i]; j= dvert->totweight; while(j--) { @@ -710,7 +787,7 @@ static void vgroup_normalize_all(Object *ob, int lock_active) for(i = 0; i < dvert_tot; i++) { int j; tot_weight= 0.0f; - dvert = dvert_array+i; + dvert = dvert_array[i]; j= dvert->totweight; while(j--) { @@ -731,6 +808,8 @@ static void vgroup_normalize_all(Object *ob, int lock_active) } } } + + if (dvert_array) MEM_freeN(dvert_array); } @@ -738,10 +817,10 @@ static void vgroup_invert(Object *ob, int auto_assign, int auto_remove) { bDeformGroup *dg; MDeformWeight *dw; - MDeformVert *dvert, *dvert_array=NULL; + MDeformVert *dvert, **dvert_array=NULL; int i, def_nr, dvert_tot=0; - ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot); + ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot); dg = BLI_findlink(&ob->defbase, (ob->actdef-1)); @@ -750,7 +829,7 @@ static void vgroup_invert(Object *ob, int auto_assign, int auto_remove) for(i = 0; i < dvert_tot; i++) { - dvert = dvert_array+i; + dvert = dvert_array[i]; if(auto_assign) { dw= defvert_verify_index(dvert, def_nr); @@ -768,6 +847,8 @@ static void vgroup_invert(Object *ob, int auto_assign, int auto_remove) } } } + + if (dvert_array) MEM_freeN(dvert_array); } static void vgroup_blend(Object *ob) @@ -858,10 +939,10 @@ static void vgroup_clean(Object *ob, float eul, int keep_single) { bDeformGroup *dg; MDeformWeight *dw; - MDeformVert *dvert, *dvert_array=NULL; + MDeformVert *dvert, **dvert_array=NULL; int i, def_nr, dvert_tot=0; - ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot); + ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot); /* only the active group */ dg = BLI_findlink(&ob->defbase, (ob->actdef-1)); @@ -869,7 +950,7 @@ static void vgroup_clean(Object *ob, float eul, int keep_single) def_nr= ob->actdef-1; for(i = 0; i < dvert_tot; i++) { - dvert = dvert_array+i; + dvert = dvert_array[i]; dw= defvert_find_index(dvert, def_nr); @@ -880,21 +961,23 @@ static void vgroup_clean(Object *ob, float eul, int keep_single) } } } + + if (dvert_array) MEM_freeN(dvert_array); } static void vgroup_clean_all(Object *ob, float eul, int keep_single) { MDeformWeight *dw; - MDeformVert *dvert, *dvert_array=NULL; + MDeformVert *dvert, **dvert_array=NULL; int i, dvert_tot=0; - ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot); + ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot); if(dvert_array) { for(i = 0; i < dvert_tot; i++) { int j; - dvert = dvert_array+i; + dvert = dvert_array[i]; j= dvert->totweight; while(j--) { @@ -910,6 +993,8 @@ static void vgroup_clean_all(Object *ob, float eul, int keep_single) } } } + + if (dvert_array) MEM_freeN(dvert_array); } void ED_vgroup_mirror(Object *ob, int mirror_weights, int flip_vgroups) @@ -1920,41 +2005,38 @@ void OBJECT_OT_vertex_group_set_active(wmOperatorType *ot) ot->prop= prop; } -static int vgroup_sort(void *def_a_ptr, void *def_b_ptr) +/*creates the name_array parameter for vgroup_do_remap, call this before fiddling + with the order of vgroups then call vgroup_do_remap after*/ +static char *vgroup_init_remap(Object *ob) { - bDeformGroup *def_a= (bDeformGroup *)def_a_ptr; - bDeformGroup *def_b= (bDeformGroup *)def_b_ptr; + bDeformGroup *def; + int def_tot = BLI_countlist(&ob->defbase); + char *name_array= MEM_mallocN(MAX_VGROUP_NAME * sizeof(char) * def_tot, "sort vgroups"); + char *name; - return strcmp(def_a->name, def_b->name); + name= name_array; + for(def = ob->defbase.first; def; def=def->next) { + BLI_strncpy(name, def->name, MAX_VGROUP_NAME); + name += MAX_VGROUP_NAME; + } + + return name_array; } -#define DEF_GROUP_SIZE (sizeof(((bDeformGroup *)NULL)->name)) -static int vertex_group_sort_exec(bContext *C, wmOperator *op) +static int vgroup_do_remap(Object *ob, char *name_array, wmOperator *op) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + MDeformVert *dvert= NULL; bDeformGroup *def; int def_tot = BLI_countlist(&ob->defbase); - char *name; - char *name_array= MEM_mallocN(DEF_GROUP_SIZE * sizeof(char) * def_tot, "sort vgroups"); - int *sort_map_update= MEM_mallocN(DEF_GROUP_SIZE * sizeof(int) * def_tot + 1, "sort vgroups"); /* needs a dummy index at the start*/ + int *sort_map_update= MEM_mallocN(MAX_VGROUP_NAME * sizeof(int) * def_tot + 1, "sort vgroups"); /* needs a dummy index at the start*/ int *sort_map= sort_map_update + 1; + char *name; int i; - MDeformVert *dvert= NULL; - int dvert_tot; - - name= name_array; - for(def = ob->defbase.first; def; def=def->next){ - BLI_strncpy(name, def->name, DEF_GROUP_SIZE); - name += DEF_GROUP_SIZE; - } - - BLI_sortlist(&ob->defbase, vgroup_sort); - name= name_array; for(def= ob->defbase.first, i=0; def; def=def->next, i++){ sort_map[i]= BLI_findstringindex(&ob->defbase, name, offsetof(bDeformGroup, name)); - name += DEF_GROUP_SIZE; + name += MAX_VGROUP_NAME; } if(ob->mode == OB_MODE_EDIT) { @@ -1975,8 +2057,12 @@ static int vertex_group_sort_exec(bContext *C, wmOperator *op) } } else { + int dvert_tot=0; + ED_vgroup_give_array(ob->data, &dvert, &dvert_tot); - while(dvert_tot--) { + + /*create as necassary*/ + while(dvert && dvert_tot--) { if(dvert->totweight) defvert_remap(dvert, sort_map); dvert++; @@ -1988,21 +2074,45 @@ static int vertex_group_sort_exec(bContext *C, wmOperator *op) sort_map[i]++; sort_map_update[0]= 0; - vgroup_remap_update_users(ob, sort_map_update); ob->actdef= sort_map_update[ob->actdef]; - MEM_freeN(name_array); - MEM_freeN(sort_map_update); + return OPERATOR_FINISHED; +} - DAG_id_flush_update(&ob->id, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob); +static int vgroup_sort(void *def_a_ptr, void *def_b_ptr) +{ + bDeformGroup *def_a= (bDeformGroup *)def_a_ptr; + bDeformGroup *def_b= (bDeformGroup *)def_b_ptr; - return OPERATOR_FINISHED; + return strcmp(def_a->name, def_b->name); } -#undef DEF_GROUP_SIZE +static int vertex_group_sort_exec(bContext *C, wmOperator *op) +{ + Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + char *name_array; + int ret; + + /*init remapping*/ + name_array = vgroup_init_remap(ob); + + /*sort vgroup names*/ + BLI_sortlist(&ob->defbase, vgroup_sort); + + /*remap vgroup data to map to correct names*/ + ret = vgroup_do_remap(ob, name_array, op); + + if (ret != OPERATOR_CANCELLED) { + DAG_id_flush_update(&ob->id, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob); + } + + if (name_array) MEM_freeN(name_array); + + return ret; +} void OBJECT_OT_vertex_group_sort(wmOperatorType *ot) { @@ -2017,3 +2127,63 @@ void OBJECT_OT_vertex_group_sort(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } + +static int vgroup_move_exec(bContext *C, wmOperator *op) +{ + Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + bDeformGroup *def; + char *name_array; + int dir= RNA_enum_get(op->ptr, "direction"), ret; + + def = BLI_findlink(&ob->defbase, ob->actdef - 1); + if (!def) { + return OPERATOR_CANCELLED; + } + + name_array = vgroup_init_remap(ob); + + if (dir == 1) { /*up*/ + void *prev = def->prev; + + BLI_remlink(&ob->defbase, def); + BLI_insertlinkbefore(&ob->defbase, prev, def); + } else { /*down*/ + void *next = def->next; + + BLI_remlink(&ob->defbase, def); + BLI_insertlinkafter(&ob->defbase, next, def); + } + + ret = vgroup_do_remap(ob, name_array, op); + + if (name_array) MEM_freeN(name_array); + + if (ret != OPERATOR_CANCELLED) { + DAG_id_flush_update(&ob->id, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob); + } + + return ret; +} + +void OBJECT_OT_vertex_group_move(wmOperatorType *ot) +{ + static EnumPropertyItem vgroup_slot_move[] = { + {1, "UP", 0, "Up", ""}, + {-1, "DOWN", 0, "Down", ""}, + {0, NULL, 0, NULL, NULL} + }; + + /* identifiers */ + ot->name= "Move Vertex Group"; + ot->idname= "OBJECT_OT_vertex_group_move"; + + /* api callbacks */ + ot->poll= vertex_group_poll; + ot->exec= vgroup_move_exec; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_enum(ot->srna, "direction", vgroup_slot_move, 0, "Direction", "Direction to move, UP or DOWN"); +} diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index b699ec1abc5..c34b906356e 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -455,15 +455,17 @@ static void render_freejob(void *rjv) static void make_renderinfo_string(RenderStats *rs, Scene *scene, char *str) { char info_time_str[32]; // used to be extern to header_info.c - uintptr_t mem_in_use, mmap_in_use; - float megs_used_memory, mmap_used_memory; + uintptr_t mem_in_use, mmap_in_use, peak_memory; + float megs_used_memory, mmap_used_memory, megs_peak_memory; char *spos= str; mem_in_use= MEM_get_memory_in_use(); mmap_in_use= MEM_get_mapped_memory_in_use(); + peak_memory = MEM_get_peak_memory(); megs_used_memory= (mem_in_use-mmap_in_use)/(1024.0*1024.0); mmap_used_memory= (mmap_in_use)/(1024.0*1024.0); + megs_peak_memory = (peak_memory)/(1024.0*1024.0); if(scene->lay & 0xFF000000) spos+= sprintf(spos, "Localview | "); @@ -477,7 +479,7 @@ static void make_renderinfo_string(RenderStats *rs, Scene *scene, char *str) spos+= sprintf(spos, "Fra:%d Ve:%d Fa:%d ", (scene->r.cfra), rs->totvert, rs->totface); if(rs->tothalo) spos+= sprintf(spos, "Ha:%d ", rs->tothalo); if(rs->totstrand) spos+= sprintf(spos, "St:%d ", rs->totstrand); - spos+= sprintf(spos, "La:%d Mem:%.2fM (%.2fM) ", rs->totlamp, megs_used_memory, mmap_used_memory); + spos+= sprintf(spos, "La:%d Mem:%.2fM (%.2fM, combined peak %.2fM) ", rs->totlamp, megs_used_memory, mmap_used_memory, megs_peak_memory); if(rs->curfield) spos+= sprintf(spos, "Field %d ", rs->curfield); diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index c484cde42a9..9cfeb04d080 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -3828,7 +3828,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv float *cd2=0,*cdata2=0; /* setup gl flags */ - if(ob_dt > OB_WIRE) { + if (1) { //ob_dt > OB_WIRE) { glEnableClientState(GL_NORMAL_ARRAY); if(part->draw&PART_DRAW_MAT_COL) @@ -3838,13 +3838,13 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); glEnable(GL_COLOR_MATERIAL); } - else { + /*else { glDisableClientState(GL_NORMAL_ARRAY); glDisable(GL_COLOR_MATERIAL); glDisable(GL_LIGHTING); UI_ThemeColor(TH_WIRE); - } + }*/ if(totchild && (part->draw&PART_DRAW_PARENT)==0) totpart=0; @@ -3858,7 +3858,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv if(path->steps > 0) { glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->co); - if(ob_dt > OB_WIRE) { + if(1) { //ob_dt > OB_WIRE) { glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), path->vel); if(part->draw&PART_DRAW_MAT_COL) glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->col); @@ -3874,7 +3874,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv path=cache[a]; glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->co); - if(ob_dt > OB_WIRE) { + if(1) { //ob_dt > OB_WIRE) { glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), path->vel); if(part->draw&PART_DRAW_MAT_COL) glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->col); @@ -3885,7 +3885,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv /* restore & clean up */ - if(ob_dt > OB_WIRE) { + if(1) { //ob_dt > OB_WIRE) { if(part->draw&PART_DRAW_MAT_COL) glDisable(GL_COLOR_ARRAY); glDisable(GL_COLOR_MATERIAL); diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h index 18b3c1095cc..181ab6f0afa 100644 --- a/source/blender/makesdna/DNA_action_types.h +++ b/source/blender/makesdna/DNA_action_types.h @@ -344,6 +344,7 @@ typedef struct bPose { void *ikparam; /* IK solver parameters, structure depends on iksolver */ bAnimVizSettings avs; /* settings for visualisation of bone animation */ + char proxy_act_bone[32]; /*proxy active bone name*/ } bPose; diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 15be298f134..51f23ef210f 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -83,6 +83,7 @@ typedef struct ModifierData { struct ModifierData *next, *prev; int type, mode; + int stackindex, pad; char name[32]; /* XXX for timing info set by caller... solve later? (ton) */ diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index b572c50a4ae..38aa992a279 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -62,6 +62,7 @@ typedef struct bDeformGroup { struct bDeformGroup *next, *prev; char name[32]; } bDeformGroup; +#define MAX_VGROUP_NAME 32 /** * The following illustrates the orientation of the diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 0ebcf53d393..c578d3ea502 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -137,11 +137,20 @@ static int default_break(void *unused) {return G.afbreek == 1;} static void stats_background(void *unused, RenderStats *rs) { - uintptr_t mem_in_use= MEM_get_memory_in_use(); - float megs_used_memory= mem_in_use/(1024.0*1024.0); char str[400], *spos= str; - - spos+= sprintf(spos, "Fra:%d Mem:%.2fM ", rs->cfra, megs_used_memory); + uintptr_t mem_in_use, mmap_in_use, peak_memory; + float megs_used_memory, mmap_used_memory, megs_peak_memory; + + mem_in_use= MEM_get_memory_in_use(); + mmap_in_use= MEM_get_mapped_memory_in_use(); + peak_memory = MEM_get_peak_memory(); + + megs_used_memory= (mem_in_use-mmap_in_use)/(1024.0*1024.0); + mmap_used_memory= (mmap_in_use)/(1024.0*1024.0); + megs_peak_memory = (peak_memory)/(1024.0*1024.0); + + spos+= sprintf(spos, "Fra:%d Mem:%.2fM (%.2fM, combined peak %.2fM) ", rs->cfra, + megs_used_memory, mmap_used_memory, megs_peak_memory); if(rs->curfield) spos+= sprintf(spos, "Field %d ", rs->curfield); @@ -2727,6 +2736,7 @@ void RE_BlenderFrame(Render *re, Scene *scene, SceneRenderLayer *srl, unsigned i scene->r.cfra= frame; if(render_initialize_from_scene(re, scene, srl, lay, 0, 0)) { + MEM_reset_peak_memory(); do_render_all_options(re); } |