diff options
author | Campbell Barton <ideasman42@gmail.com> | 2011-11-29 10:58:16 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2011-11-29 10:58:16 +0400 |
commit | 5380545c9780c8aabf050f0bdd4a547f45d9794e (patch) | |
tree | 0dca31a32af4cf3b6c53ab984a856dbf224c4931 /source/blender | |
parent | e3c6e47a382e6a8c92482cda048b396e0e9cc581 (diff) | |
parent | 3f57c06c7b8f01e16109c8bdbaba9643fe380d3c (diff) |
svn merge ^/trunk/blender -r42221:42245
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/intern/anim.c | 31 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/tracking.c | 41 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 14 | ||||
-rw-r--r-- | source/blender/editors/object/object_add.c | 8 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/paint_vertex.c | 60 |
5 files changed, 65 insertions, 89 deletions
diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c index 4ebdd40a8fd..ac104dfe206 100644 --- a/source/blender/blenkernel/intern/anim.c +++ b/source/blender/blenkernel/intern/anim.c @@ -1017,7 +1017,7 @@ static void face_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, floa MLoop *mloop; MVert *mvert; float pmat[4][4], imat[3][3], (*orco)[3] = NULL, w; - int lay, oblay, totface, totloop, a; + int lay, oblay, totface, a; Scene *sce = NULL; Group *group = NULL; GroupObject *go = NULL; @@ -1031,30 +1031,17 @@ static void face_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, floa em = me->edit_btmesh; if(em) { - int totvert; dm= editbmesh_get_derived_cage(scene, par, em, CD_MASK_BAREMESH); - - totface= dm->getNumFaces(dm); - mpoly= MEM_mallocN(sizeof(MPoly)*totface, "mface temp"); - dm->copyPolyArray(dm, mpoly); - - totloop= dm->numLoopData; /* BMESH_TODO, we should have an api function for this! */ - mloop= MEM_mallocN(sizeof(MLoop)*totloop, "mloop temp"); - dm->copyLoopArray(dm, mloop); - - totvert= dm->getNumVerts(dm); - mvert= MEM_mallocN(sizeof(MVert)*totvert, "mvert temp"); - dm->copyVertArray(dm, mvert); } else { dm = mesh_get_derived_deform(scene, par, CD_MASK_BAREMESH); - - totface= dm->getNumFaces(dm); - mpoly= dm->getPolyArray(dm); - mloop= dm->getLoopArray(dm); - mvert= dm->getVertArray(dm); } + totface= dm->getNumFaces(dm); + mpoly= dm->getPolyArray(dm); + mloop= dm->getLoopArray(dm); + mvert= dm->getVertArray(dm); + if(G.rendering) { orco= (float(*)[3])get_mesh_orco_verts(par); @@ -1199,12 +1186,6 @@ static void face_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, floa if (sce) base= base->next; /* scene loop */ else go= go->next; /* group loop */ } - - if(em) { - MEM_freeN(mpoly); - MEM_freeN(mloop); - MEM_freeN(mvert); - } if(orco) MEM_freeN(orco); diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index cb94e3f3ec1..2d906a9199b 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -718,7 +718,7 @@ typedef struct TrackContext { float *patch; /* keyframed patch */ /* ** SAD tracker ** */ - int patsize; /* size of pattern (currently only 16x16 due to libmv side) */ + int pattern_size; /* size of pattern */ unsigned char *pattern; /* keyframed pattern */ unsigned char *warped; /* warped version of reference */ #else @@ -786,12 +786,16 @@ MovieTrackingContext *BKE_tracking_context_new(MovieClip *clip, MovieClipUser *u #ifdef WITH_LIBMV { + float patx, paty; + patx= (int)((track->pat_max[0]-track->pat_min[0])*width); + paty= (int)((track->pat_max[1]-track->pat_min[1])*height); + if(track->tracker==TRACKER_KLT) { float search_size_x= (track->search_max[0]-track->search_min[0])*width; float search_size_y= (track->search_max[1]-track->search_min[1])*height; float pattern_size_x= (track->pat_max[0]-track->pat_min[0])*width; float pattern_size_y= (track->pat_max[1]-track->pat_min[1])*height; - int wndx, wndy; + int wndx= (int)patx/2, wndy= (int)paty/2; /* compute the maximum pyramid size */ float search_to_pattern_ratio= MIN2(search_size_x, search_size_y) @@ -804,13 +808,10 @@ MovieTrackingContext *BKE_tracking_context_new(MovieClip *clip, MovieClipUser *u * than the search size */ int level= MIN2(track->pyramid_levels, max_pyramid_levels); - wndx= (int)((track->pat_max[0]-track->pat_min[0])*width)/2; - wndy= (int)((track->pat_max[1]-track->pat_min[1])*height)/2; - track_context.region_tracker= libmv_regionTrackerNew(100, level, MAX2(wndx, wndy)); } else if(track->tracker==TRACKER_SAD) { - /* nothing to initialize */ + track_context.pattern_size= MAX2(patx, paty); } } #endif @@ -1093,10 +1094,10 @@ static void get_warped(TrackContext *track_context, int x, int y, int width, uns { int i, j; - for(i=0; i<track_context->patsize; i++) { - for(j=0; j<track_context->patsize; j++) { - track_context->warped[i*track_context->patsize+j]= - image[(y+i-track_context->patsize/2)*width+x+j-track_context->patsize/2]; + for(i=0; i<track_context->pattern_size; i++) { + for(j=0; j<track_context->pattern_size; j++) { + track_context->warped[i*track_context->pattern_size+j]= + image[(y+i-track_context->pattern_size/2)*width+x+j-track_context->pattern_size/2]; } } } @@ -1226,13 +1227,12 @@ int BKE_tracking_next(MovieTrackingContext *context) warp[2][0]= pos[0]; warp[2][1]= pos[1]; - /* pattern size is hardcoded to 16x16px in libmv */ - track_context->patsize= 16; - - if(!track_context->pattern) - track_context->pattern= MEM_callocN(sizeof(unsigned char)*track_context->patsize*track_context->patsize, "trackking pattern"); + if(!track_context->pattern) { + int square= track_context->pattern_size*track_context->pattern_size; + track_context->pattern= MEM_callocN(sizeof(unsigned char)*square, "trackking pattern"); + } - libmv_SADSamplePattern(image, width, warp, track_context->pattern); + libmv_SADSamplePattern(image, width, warp, track_context->pattern, track_context->pattern_size); MEM_freeN(image); IMB_freeImBuf(ibuf); @@ -1245,8 +1245,10 @@ int BKE_tracking_next(MovieTrackingContext *context) ibuf= get_frame_ibuf(context, curfra); - if(track_context->warped==NULL) - track_context->warped= MEM_callocN(sizeof(unsigned char)*track_context->patsize*track_context->patsize, "trackking warped"); + if(track_context->warped==NULL) { + int square= track_context->pattern_size*track_context->pattern_size; + track_context->warped= MEM_callocN(sizeof(unsigned char)*square, "trackking warped"); + } image_old= get_search_bytebuf(ibuf, track, marker, &width, &height, pos, origin); get_warped(track_context, pos[0], pos[1], width, image_old); @@ -1260,7 +1262,8 @@ int BKE_tracking_next(MovieTrackingContext *context) warp[2][0]= pos[0]; warp[2][1]= pos[1]; - correlation= libmv_SADTrackerTrack(track_context->pattern, track_context->warped, image_new, width, width, height, warp); + correlation= libmv_SADTrackerTrack(track_context->pattern, track_context->warped, + track_context->pattern_size, image_new, width, width, height, warp); x2= warp[2][0]; y2= warp[2][1]; diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 57cd3ab8537..aa44eca0605 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -12690,6 +12690,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) { Scene *sce; MovieClip *clip; + bScreen *sc; for(sce = main->scene.first; sce; sce = sce->id.next) { if (sce->r.im_format.depth == 0) { @@ -12708,6 +12709,19 @@ static void do_versions(FileData *fd, Library *lib, Main *main) settings->default_search_size= 51; } } + + for (sc= main->screen.first; sc; sc= sc->id.next) { + ScrArea *sa; + for (sa= sc->areabase.first; sa; sa= sa->next) { + SpaceLink *sl; + for (sl= sa->spacedata.first; sl; sl= sl->next) { + if(sl->spacetype==SPACE_VIEW3D) { + View3D *v3d= (View3D *)sl; + v3d->flag2&= ~V3D_RENDER_SHADOW; + } + } + } + } } /* WATCH IT!!!: pointers from libdata have not been converted yet here! */ diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index b168a9c4cf3..1d0e09c17c0 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -330,7 +330,9 @@ Object *ED_object_add_type(bContext *C, int type, float *loc, float *rot, DAG_id_type_tag(bmain, ID_OB); DAG_scene_sort(bmain, scene); - ED_render_id_flush_update(bmain, ob->data); + if (ob->data) { + ED_render_id_flush_update(bmain, ob->data); + } if(enter_editmode) ED_object_enter_editmode(C, EM_IGNORE_LAYER); @@ -1817,7 +1819,9 @@ Base *ED_object_add_duplicate(Main *bmain, Scene *scene, Base *base, int dupflag set_sca_new_poins_ob(ob); DAG_scene_sort(bmain, scene); - ED_render_id_flush_update(bmain, ob->data); + if (ob->data) { + ED_render_id_flush_update(bmain, ob->data); + } return basen; } diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c index 2382f34299e..a988fa6db02 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.c +++ b/source/blender/editors/sculpt_paint/paint_vertex.c @@ -1229,7 +1229,7 @@ static char *gen_lock_flags(Object* ob, int defbase_tot) lock_flags[i] = ((defgroup->flag & DG_LOCK_WEIGHT) != 0); is_locked |= lock_flags[i]; } - if(is_locked){ + if (is_locked) { return lock_flags; } @@ -1352,12 +1352,12 @@ static float redistribute_change(MDeformVert *ndv, char *change_status, int chan /* left overs */ return totchange; } - +static float get_mp_change(MDeformVert *odv, char *defbase_sel, float brush_change); /* observe the changes made to the weights of groups. * make sure all locked groups on the vertex have the same deformation * by moving the changes made to groups onto other unlocked groups */ -static void enforce_locks(MDeformVert *odv, MDeformVert *ndv, int defbase_tot, - const char *lock_flags, const char *vgroup_validmap, char do_auto_normalize) +static void enforce_locks(MDeformVert *odv, MDeformVert *ndv, int defbase_tot, char *defbase_sel, + const char *lock_flags, const char *vgroup_validmap, char do_auto_normalize, char do_multipaint) { float totchange = 0.0f; float totchange_allowed = 0.0f; @@ -1368,13 +1368,10 @@ static void enforce_locks(MDeformVert *odv, MDeformVert *ndv, int defbase_tot, unsigned int i; MDeformWeight *ndw; MDeformWeight *odw; - MDeformWeight *ndw2; - MDeformWeight *odw2; - int designatedw = -1; - int designatedw_changed = FALSE; - float storedw; + + float changed_sum = 0.0f; + char *change_status; - char new_weight_has_zero = FALSE; if(!lock_flags || !has_locked_group(ndv, lock_flags)) { return; @@ -1387,7 +1384,7 @@ static void enforce_locks(MDeformVert *odv, MDeformVert *ndv, int defbase_tot, odw = defvert_find_index(odv, i); /* the weights are zero, so we can assume a lot */ if(!ndw || !odw) { - if (!lock_flags[i] && vgroup_validmap[i]){ + if (!lock_flags[i] && vgroup_validmap[i]) { defvert_verify_index(odv, i); defvert_verify_index(ndv, i); total_valid++; @@ -1401,16 +1398,11 @@ static void enforce_locks(MDeformVert *odv, MDeformVert *ndv, int defbase_tot, } else if(ndw->weight != odw->weight) { /* changed groups are handled here */ totchange += ndw->weight - odw->weight; + changed_sum += ndw->weight; change_status[i] = 2; /* was altered already */ total_changed++; - if(ndw->weight == 0) { - new_weight_has_zero = TRUE; - } - else if(designatedw == -1){ - designatedw = i; - } } /* unchanged, unlocked bone groups are handled here */ - else if (vgroup_validmap[i]){ + else if (vgroup_validmap[i]) { totchange_allowed += ndw->weight; total_valid++; change_status[i] = 1; /* can be altered while redistributing */ @@ -1448,30 +1440,12 @@ static void enforce_locks(MDeformVert *odv, MDeformVert *ndv, int defbase_tot, totchange_allowed = redistribute_change(ndv, change_status, 1, -1, totchange_allowed, total_valid, do_auto_normalize); left_over += totchange_allowed; if(left_over) { - /* more than one nonzero weights were changed with the same ratio, so keep them changed that way! */ - if(total_changed > 1 && !new_weight_has_zero && designatedw >= 0) { - /* this dw is special, it is used as a base to determine how to change the others */ - ndw = defvert_find_index(ndv, designatedw); - odw = defvert_find_index(odv, designatedw); - storedw = ndw->weight; - for(i = 0; i < ndv->totweight; i++) { - if(ndv->dw[i].def_nr == designatedw) { - continue; - } - ndw2 = &ndv->dw[i]; - if(change_status[ndw2->def_nr] == 2) { - odw2 = &odv->dw[i]; - - if(!designatedw_changed) { - ndw->weight = (-left_over + odw->weight + odw2->weight)/(1.0f + ndw2->weight/ndw->weight); - designatedw_changed = TRUE; - } - ndw2->weight = ndw->weight * ndw2->weight / storedw; - } - } - } - /* a weight was changed to zero, only one weight was changed, - * or designatedw is still -1 put weight back as evenly as possible */ + /* more than one nonzero weights were changed with the same ratio with multipaint, so keep them changed that way! */ + if(total_changed > 1 && do_multipaint) { + float undo_change = get_mp_change(ndv, defbase_sel, left_over); + multipaint_selection(ndv, undo_change, defbase_sel, defbase_tot); + } + /* or designatedw is still -1 put weight back as evenly as possible */ else { redistribute_change(ndv, change_status, 2, -2, left_over, total_changed, do_auto_normalize); } @@ -1592,7 +1566,7 @@ static int apply_mp_locks_normalize(Mesh *me, const WeightPaintInfo *wpi, } clamp_weights(dv); - enforce_locks(&dv_test, dv, wpi->defbase_tot, wpi->lock_flags, wpi->vgroup_validmap, wpi->do_auto_normalize); + enforce_locks(&dv_test, dv, wpi->defbase_tot, wpi->defbase_sel, wpi->lock_flags, wpi->vgroup_validmap, wpi->do_auto_normalize, wpi->do_multipaint); do_weight_paint_auto_normalize_all_groups(dv, wpi->vgroup_validmap, wpi->do_auto_normalize); |