svn merge ^/trunk/blender -r42221:42245
This commit is contained in:
		@@ -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.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								extern/libmv/libmv-capi.cpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								extern/libmv/libmv-capi.cpp
									
									
									
									
										vendored
									
									
								
							@@ -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);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								extern/libmv/libmv-capi.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								extern/libmv/libmv-capi.h
									
									
									
									
										vendored
									
									
								
							@@ -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 */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								extern/libmv/libmv/tracking/sad.cc
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								extern/libmv/libmv/tracking/sad.cc
									
									
									
									
										vendored
									
									
								
							@@ -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) {
 | 
			
		||||
 
 | 
			
		||||
@@ -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="")
 | 
			
		||||
 
 | 
			
		||||
@@ -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()
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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];
 | 
			
		||||
 
 | 
			
		||||
@@ -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! */
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user