Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2011-11-29 10:58:16 +0400
committerCampbell Barton <ideasman42@gmail.com>2011-11-29 10:58:16 +0400
commit5380545c9780c8aabf050f0bdd4a547f45d9794e (patch)
tree0dca31a32af4cf3b6c53ab984a856dbf224c4931 /source/blender
parente3c6e47a382e6a8c92482cda048b396e0e9cc581 (diff)
parent3f57c06c7b8f01e16109c8bdbaba9643fe380d3c (diff)
svn merge ^/trunk/blender -r42221:42245
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/intern/anim.c31
-rw-r--r--source/blender/blenkernel/intern/tracking.c41
-rw-r--r--source/blender/blenloader/intern/readfile.c14
-rw-r--r--source/blender/editors/object/object_add.c8
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex.c60
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);