svn merge ^/trunk/blender -r42221:42245

This commit is contained in:
2011-11-29 06:58:16 +00:00
11 changed files with 100 additions and 107 deletions

View File

@@ -39,7 +39,7 @@ As well as pep8 we have other conventions used for blender python scripts.
.. code-block:: python
bpy.context.scene.render.file_format = 'PNG'
bpy.context.scene.render.image_settings.file_format = 'PNG'
bpy.context.scene.render.filepath = "//render_out"
* pep8 also defines that lines should not exceed 79 characters, we felt this is too restrictive so this is optional per script.
@@ -181,7 +181,7 @@ When removing many items in a large list this can provide a good speedup.
Avoid Copying Lists
^^^^^^^^^^^^^^^^^^^
When passing a list/dictionary to a function, it is faster to have the function modify the list rather then returning a new list so python dosn't have tp duplicate the list in memory.
When passing a list/dictionary to a function, it is faster to have the function modify the list rather then returning a new list so python doesn't have to duplicate the list in memory.
Functions that modify a list in-place are more efficient then functions that create new lists.

View File

@@ -297,16 +297,16 @@ void libmv_regionTrackerDestroy(libmv_RegionTracker *libmv_tracker)
/* ************ Tracks ************ */
void libmv_SADSamplePattern(unsigned char *image, int stride,
float warp[3][2], unsigned char *pattern)
float warp[3][2], unsigned char *pattern, int pattern_size)
{
libmv::mat32 mat32;
memcpy(mat32.data, warp, sizeof(float)*3*2);
libmv::SamplePattern(image, stride, mat32, pattern, 16);
libmv::SamplePattern(image, stride, mat32, pattern, pattern_size);
}
float libmv_SADTrackerTrack(unsigned char *pattern, unsigned char *warped, unsigned char *image, int stride,
float libmv_SADTrackerTrack(unsigned char *pattern, unsigned char *warped, int pattern_size, unsigned char *image, int stride,
int width, int height, float warp[3][2])
{
float result;
@@ -314,7 +314,7 @@ float libmv_SADTrackerTrack(unsigned char *pattern, unsigned char *warped, unsig
memcpy(mat32.data, warp, sizeof(float)*3*2);
result = libmv::Track(pattern, warped, 16, image, stride, width, height, &mat32, 16, 16);
result = libmv::Track(pattern, warped, pattern_size, image, stride, width, height, &mat32, 16, 16);
memcpy(warp, mat32.data, sizeof(float)*3*2);

View File

@@ -50,8 +50,8 @@ void libmv_regionTrackerDestroy(struct libmv_RegionTracker *libmv_tracker);
/* SAD Tracker */
void libmv_SADSamplePattern(unsigned char *image, int stride,
float warp[3][2], unsigned char *pattern);
float libmv_SADTrackerTrack(unsigned char *pattern, unsigned char *warped, unsigned char *image,
float warp[3][2], unsigned char *pattern, int pattern_size);
float libmv_SADTrackerTrack(unsigned char *pattern, unsigned char *warped, int pattern_size, unsigned char *image,
int stride, int width, int height, float warp[3][2]);
/* Tracks */

View File

@@ -25,6 +25,7 @@
#include "libmv/tracking/sad.h"
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
namespace libmv {
@@ -78,15 +79,31 @@ void SamplePattern(ubyte* image, int stride, mat32 warp, ubyte* pattern, int siz
#ifdef __SSE2__
#include <emmintrin.h>
static uint SAD(const ubyte* pattern, const ubyte* image, int stride, int size) {
static uint SAD(/*const*/ ubyte* pattern, /*const*/ ubyte* image, int stride, int size) {
uint sad = 0;
__m128i a = _mm_setzero_si128();
for(int i = 0; i < size; i++) {
for(int j = 0; j < size/16; j++) {
int j = 0;
for(j = 0; j < size/16; j++) {
if((i*size/16+j) % 32 == 0) {
sad += _mm_extract_epi16(a,0) + _mm_extract_epi16(a,4);
a = _mm_setzero_si128();
}
a = _mm_adds_epu16(a, _mm_sad_epu8( _mm_loadu_si128((__m128i*)(pattern+i*size+j*16)),
_mm_loadu_si128((__m128i*)(image+i*stride+j*16))));
}
for(j = j*16; j < size; j++) {
sad += abs((int)pattern[i*size+j] - image[i*stride+j]);
}
}
return _mm_extract_epi16(a,0) + _mm_extract_epi16(a,4);
sad += _mm_extract_epi16(a,0) + _mm_extract_epi16(a,4);
return sad;
}
#else
static uint SAD(const ubyte* pattern, const ubyte* image, int stride, int size) {

View File

@@ -120,9 +120,9 @@ class CLIP_PT_tools_marker(Panel):
col.separator()
col2 = col.column(align=True)
col2.prop(settings, "default_pattern_size")
col2.prop(settings, "default_search_size")
sub = col.column(align=True)
sub.prop(settings, "default_pattern_size")
sub.prop(settings, "default_search_size")
col.label(text="Tracker:")
col.prop(settings, "default_tracker", text="")
@@ -134,9 +134,9 @@ class CLIP_PT_tools_marker(Panel):
col.separator()
col2 = col.column(align=True)
col2.prop(settings, "default_frames_limit")
col2.prop(settings, "default_margin")
sub = col.column(align=True)
sub.prop(settings, "default_frames_limit")
sub.prop(settings, "default_margin")
col.label(text="Match:")
col.prop(settings, "default_pattern_match", text="")

View File

@@ -361,7 +361,7 @@ class INFO_MT_help(Menu):
layout = self.layout
layout.operator("wm.url_open", text="Manual", icon='HELP').url = 'http://wiki.blender.org/index.php/Doc:Manual'
layout.operator("wm.url_open", text="Manual", icon='HELP').url = 'http://wiki.blender.org/index.php/Doc:2.6/Manual'
layout.operator("wm.url_open", text="Release Log", icon='URL').url = 'http://www.blender.org/development/release-logs/blender-260/'
layout.separator()

View File

@@ -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);

View File

@@ -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) {
int square= track_context->pattern_size*track_context->pattern_size;
track_context->pattern= MEM_callocN(sizeof(unsigned char)*square, "trackking pattern");
}
if(!track_context->pattern)
track_context->pattern= MEM_callocN(sizeof(unsigned char)*track_context->patsize*track_context->patsize, "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];

View File

@@ -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! */

View File

@@ -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;
}

View File

@@ -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);