forked from bartvdbraak/blender
merging revisions 28564-28569 from render branch into trunk
This commit is contained in:
parent
cef3e3099a
commit
a7cbd5008e
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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()
|
||||
|
@ -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){
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
return strcmp(def_a->name, def_b->name);
|
||||
}
|
||||
|
||||
#define DEF_GROUP_SIZE (sizeof(((bDeformGroup *)NULL)->name))
|
||||
static int vertex_group_sort_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
|
||||
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;
|
||||
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= sort_map_update + 1;
|
||||
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;
|
||||
for(def = ob->defbase.first; def; def=def->next) {
|
||||
BLI_strncpy(name, def->name, MAX_VGROUP_NAME);
|
||||
name += MAX_VGROUP_NAME;
|
||||
}
|
||||
|
||||
BLI_sortlist(&ob->defbase, vgroup_sort);
|
||||
return name_array;
|
||||
}
|
||||
|
||||
static int vgroup_do_remap(Object *ob, char *name_array, wmOperator *op)
|
||||
{
|
||||
MDeformVert *dvert= NULL;
|
||||
bDeformGroup *def;
|
||||
int def_tot = BLI_countlist(&ob->defbase);
|
||||
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;
|
||||
|
||||
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);
|
||||
|
||||
DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
|
||||
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
#undef DEF_GROUP_SIZE
|
||||
|
||||
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 strcmp(def_a->name, def_b->name);
|
||||
}
|
||||
|
||||
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");
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
||||
|
@ -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) */
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
uintptr_t mem_in_use, mmap_in_use, peak_memory;
|
||||
float megs_used_memory, mmap_used_memory, megs_peak_memory;
|
||||
|
||||
spos+= sprintf(spos, "Fra:%d Mem:%.2fM ", rs->cfra, megs_used_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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user