[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29554] branches/soc-2010-jwilkins/source/ blender: * Bug Fix: corrected behavior or grab when symmetry is enabled

Jason Wilkins Jason.A.Wilkins at gmail.com
Sat Jun 19 04:54:19 CEST 2010


Revision: 29554
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29554
Author:   jwilkins
Date:     2010-06-19 04:54:17 +0200 (Sat, 19 Jun 2010)

Log Message:
-----------
* Bug Fix: corrected behavior or grab when symmetry is enabled

Modified Paths:
--------------
    branches/soc-2010-jwilkins/source/blender/blenlib/BLI_pbvh.h
    branches/soc-2010-jwilkins/source/blender/blenlib/intern/pbvh.c
    branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/paint_stroke.c
    branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c
    branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt_undo.c

Modified: branches/soc-2010-jwilkins/source/blender/blenlib/BLI_pbvh.h
===================================================================
--- branches/soc-2010-jwilkins/source/blender/blenlib/BLI_pbvh.h	2010-06-18 23:48:52 UTC (rev 29553)
+++ branches/soc-2010-jwilkins/source/blender/blenlib/BLI_pbvh.h	2010-06-19 02:54:17 UTC (rev 29554)
@@ -36,6 +36,10 @@
 typedef struct PBVH PBVH;
 typedef struct PBVHNode PBVHNode;
 
+typedef struct {
+	float (*co)[3];
+} PBVHProxyNode;
+
 /* Callbacks */
 
 /* returns 1 if the search should continue from this node, 0 otherwise */
@@ -222,6 +226,10 @@
 		} \
 	}
 
+void BLI_pbvh_node_get_proxies(PBVHNode* node, PBVHProxyNode** proxies, int* proxy_count);
+void BLI_pbvh_node_free_proxies(PBVHNode* node);
+PBVHProxyNode* BLI_pbvh_node_add_proxy(PBVH* bvh, PBVHNode* node);
+void BLI_pbvh_gather_proxies(PBVH* pbvh, PBVHNode*** nodes,  int* totnode);
 
 #endif /* BLI_PBVH_H */
 

Modified: branches/soc-2010-jwilkins/source/blender/blenlib/intern/pbvh.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/blenlib/intern/pbvh.c	2010-06-18 23:48:52 UTC (rev 29553)
+++ branches/soc-2010-jwilkins/source/blender/blenlib/intern/pbvh.c	2010-06-19 02:54:17 UTC (rev 29554)
@@ -92,6 +92,9 @@
 	char flag;
 
 	float tmin; // used for raycasting, is how close bb is to the ray point
+
+	int proxy_count;
+	PBVHProxyNode* proxies;
 };
 
 struct PBVH {
@@ -1190,6 +1193,18 @@
 	copy_v3_v3(bb_max, node->orig_vb.bmax);
 }
 
+void BLI_pbvh_node_get_proxies(PBVHNode* node, PBVHProxyNode** proxies, int* proxy_count)
+{
+	if (node->proxy_count > 0) {
+		if (proxies) *proxies = node->proxies;
+		if (proxy_count) *proxy_count = node->proxy_count;
+	}
+	else {
+		if (proxies) *proxies = 0;
+		if (proxy_count) *proxy_count = 0;
+	}
+}
+
 /********************************* Raycast ***********************************/
 
 typedef struct {
@@ -1467,3 +1482,79 @@
 	bvh->gridfaces= gridfaces;
 }
 
+/* Proxies */
+
+PBVHProxyNode* BLI_pbvh_node_add_proxy(PBVH* bvh, PBVHNode* node)
+{
+	int index, totverts;
+
+	index = node->proxy_count;
+
+	node->proxy_count++;
+
+	if (node->proxies)
+		node->proxies= MEM_reallocN(node->proxies, node->proxy_count*sizeof(PBVHProxyNode));
+	else
+		node->proxies= MEM_mallocN(sizeof(PBVHProxyNode), "PBVHNodeProxy");
+
+	if (bvh->grids)
+		totverts = node->totprim*bvh->gridsize*bvh->gridsize;
+	else 
+		totverts = node->uniq_verts;
+
+	node->proxies[index].co= MEM_callocN(sizeof(float[3])*totverts, "PBVHNodeProxy.co");
+
+	return node->proxies + index;
+}
+
+void BLI_pbvh_node_free_proxies(PBVHNode* node)
+{
+	int p;
+
+	for (p= 0; p < node->proxy_count; p++) {
+		MEM_freeN(node->proxies[p].co);
+		node->proxies[p].co= 0;
+	}
+
+	MEM_freeN(node->proxies);
+	node->proxies = 0;
+
+	node->proxy_count= 0;
+}
+
+void BLI_pbvh_gather_proxies(PBVH* pbvh, PBVHNode*** r_array,  int* r_tot)
+{
+	PBVHNode **array= NULL, **newarray, *node;
+	int tot= 0, space= 0;
+	int n;
+
+	for (n= 0; n < pbvh->totnode; n++) {
+		node = pbvh->nodes + n;
+
+		if(node->proxy_count > 0) {
+			if(tot == space) {
+				/* resize array if needed */
+				space= (tot == 0)? 32: space*2;
+				newarray= MEM_callocN(sizeof(PBVHNode)*space, "BLI_pbvh_gather_proxies");
+
+				if (array) {
+					memcpy(newarray, array, sizeof(PBVHNode)*tot);
+					MEM_freeN(array);
+				}
+
+				array= newarray;
+			}
+
+			array[tot]= node;
+			tot++;
+		}
+	}
+
+	if(tot == 0 && array) {
+		MEM_freeN(array);
+		array= NULL;
+	}
+
+	*r_array= array;
+	*r_tot= tot;
+}

Modified: branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/paint_stroke.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/paint_stroke.c	2010-06-18 23:48:52 UTC (rev 29553)
+++ branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/paint_stroke.c	2010-06-19 02:54:17 UTC (rev 29554)
@@ -176,7 +176,7 @@
 	if (!loaded) {
 		//GLfloat largest_supported_anisotropy;
 
-		glGenTextures(1, &(brush->overlay_texture));
+		glGenTextures(1, (GLint*)(&(brush->overlay_texture)));
 		glBindTexture(GL_TEXTURE_2D, brush->overlay_texture);
 		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, grid_texture0);
 		glTexImage2D(GL_TEXTURE_2D, 1, GL_RGB,  8,  8, 0, GL_RGBA, GL_UNSIGNED_BYTE, grid_texture1);
@@ -210,10 +210,9 @@
 	int i, j;
 	float xlim, ylim;
 
-	// XXX there has to be a better way to guess if a texture is procedural
 	int procedural = 1;//brush->mtex.tex && brush->mtex.tex->type != TEX_IMAGE;
 
-	if (brush->overlay_texture) glDeleteTextures(1, &brush->overlay_texture);
+	if (brush->overlay_texture) glDeleteTextures(1, (GLint*)(&brush->overlay_texture));
 
 	width = height = 256;
 
@@ -274,7 +273,7 @@
 		}
 	}
 
-	glGenTextures(1, &(brush->overlay_texture));
+	glGenTextures(1, (GLint*)(&(brush->overlay_texture)));
 
 	glBindTexture(GL_TEXTURE_2D, brush->overlay_texture);
 
@@ -618,11 +617,12 @@
 
 		if (brush->mtex.brush_map_mode == MTEX_MAP_MODE_TILED && brush->flag & BRUSH_TEXTURE_OVERLAY) {
 			const float diameter = 2*brush->size;
-			float inv_scale_x , inv_scale_y;
-			int procedural;
+			//float inv_scale_x , inv_scale_y;
+			//int procedural;
 
 			//load_grid(brush);
-			procedural = load_tex(brush, &vc);
+			//procedural = load_tex(brush, &vc);
+			load_tex(brush, &vc);
 
 			glEnable(GL_TEXTURE_2D);
 			glBindTexture(GL_TEXTURE_2D, brush->overlay_texture);
@@ -634,21 +634,21 @@
 			glMatrixMode(GL_TEXTURE);
 			glLoadIdentity();
 
-			if (!procedural) {
-				glTranslatef(0.5f, 0.5f, 0);
-				glTranslatef(-brush->texture_center_x, -brush->texture_center_y, 0);
+			//if (!procedural) {
+			//	glTranslatef(0.5f, 0.5f, 0);
+			//	glTranslatef(-brush->texture_center_x, -brush->texture_center_y, 0);
 
-				inv_scale_x = 10000.0f / (brush->texture_scale_x*brush->texture_scale_percentage);
-				inv_scale_y = 10000.0f / (brush->texture_scale_y*brush->texture_scale_percentage);
+			//	inv_scale_x = 10000.0f / (brush->texture_scale_x*brush->texture_scale_percentage);
+			//	inv_scale_y = 10000.0f / (brush->texture_scale_y*brush->texture_scale_percentage);
 
-				glScalef(inv_scale_x, inv_scale_y, 0);
+			//	glScalef(inv_scale_x, inv_scale_y, 0);
 
-				glRotatef(-brush->mtex.rot * 180.0f/M_PI, 0, 0, 1);
+			//	glRotatef(-brush->mtex.rot * 180.0f/M_PI, 0, 0, 1);
 
-				glScalef(viewport[2] / diameter, viewport[3] / diameter, 0);
+			//	glScalef(viewport[2] / diameter, viewport[3] / diameter, 0);
 
-				glTranslatef(-0.5f, -0.5f, 0);
-			}
+			//	glTranslatef(-0.5f, -0.5f, 0);
+			//}
 
 			glColor4f(1.0f, 1.0f, 1.0f, brush->texture_overlay_alpha / 100.0f);
 			glBegin(GL_QUADS);

Modified: branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c	2010-06-18 23:48:52 UTC (rev 29553)
+++ branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c	2010-06-19 02:54:17 UTC (rev 29554)
@@ -95,6 +95,63 @@
 //#include <omp.h>
 //#endif
 
+void ED_sculpt_force_update(bContext *C)
+{
+	Object *ob= CTX_data_active_object(C);
+
+	if(ob && (ob->mode & OB_MODE_SCULPT))
+		multires_force_update(ob);
+}
+
+/* Sculpt mode handles multires differently from regular meshes, but only if
+   it's the last modifier on the stack and it is not on the first level */
+struct MultiresModifierData *sculpt_multires_active(Scene *scene, Object *ob)
+{
+	ModifierData *md, *nmd;
+	
+	for(md= modifiers_getVirtualModifierList(ob); md; md= md->next) {
+		if(md->type == eModifierType_Multires) {
+			MultiresModifierData *mmd= (MultiresModifierData*)md;
+
+			/* Check if any of the modifiers after multires are active
+			 * if not it can use the multires struct */
+			for(nmd= md->next; nmd; nmd= nmd->next)
+				if(modifier_isEnabled(scene, nmd, eModifierMode_Realtime))
+					break;
+
+			if(!nmd && mmd->sculptlvl > 0)
+				return mmd;
+		}
+	}
+
+	return NULL;
+}
+
+/* Checks whether full update mode (slower) needs to be used to work with modifiers */
+int sculpt_modifiers_active(Scene *scene, Object *ob)
+{
+	ModifierData *md;
+	MultiresModifierData *mmd= sculpt_multires_active(scene, ob);
+
+	/* check if there are any modifiers after what we are sculpting,
+	   for a multires modifier with a deform modifier in front, we
+	   do no need to recalculate the modifier stack. note that this
+	   needs to be in sync with ccgDM_use_grid_pbvh! */
+	if(mmd)
+		md= mmd->modifier.next;
+	else
+		md= modifiers_getVirtualModifierList(ob);
+	
+	/* exception for shape keys because we can edit those */
+	for(; md; md= md->next) {
+		if(modifier_isEnabled(scene, md, eModifierMode_Realtime))
+			if(md->type != eModifierType_ShapeKey)
+				return 1;
+	}
+
+	return 0;
+}
+
 /* ===== STRUCTS =====
  *
  */
@@ -366,18 +423,7 @@
 	//}
 }
 
-/* area of overlap of two circles of radius 1 seperated by d units from their centers */
-static float circle_overlap(float d)
-{
-	return (2*acos(d/2)-(1/2)*d*sqrt(4-d*d));
-}
 
-/* percentage of overlap of two circles of radius 1 seperated by d units from their centers */
-static float circle_overlap_percent(float d)
-{
-	return circle_overlap(d) / M_PI;
-}
-
 /* ===== Sculpting =====
  *
  */
@@ -460,6 +506,18 @@
 
 }
 
+/* area of overlap of two circles of radius 1 seperated by d units from their centers */
+static float circle_overlap(float d)
+{
+	return (2*acos(d/2)-(1/2)*d*sqrt(4-d*d));
+}
+
+/* percentage of overlap of two circles of radius 1 seperated by d units from their centers */
+static float circle_overlap_percent(float d)
+{
+	return circle_overlap(d) / M_PI;
+}
+
 /* Return modified brush strength. Includes the direction of the brush, positive
    values pull vertices, negative values push. Uses tablet pressure and a
    special multiplier found experimentally to scale the strength factor. */
@@ -468,7 +526,7 @@
 	Brush *brush = paint_brush(&sd->paint);
 
 	/* Primary strength input; square it to make lower values more sensitive */
-	float alpha = brush->alpha * brush->alpha * brush->strength_multiplier;
+	float alpha    = brush->alpha * brush->alpha * brush->strength_multiplier;
 	float dir      = brush->flag & BRUSH_DIR_IN ? -1 : 1;
 	float pressure = brush->flag & BRUSH_ALPHA_PRESSURE ? cache->pressure : 1;
 	float flip     = cache->flip ? -1 : 1;
@@ -1144,22 +1202,20 @@
 		PBVHVertexIter vd;
 		SculptBrushTest test;
 		float (*origco)[3];
+		float (*proxy)[3];
 	

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list