[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31304] branches/soc-2010-nicolasbishop/ source/blender/editors/sculpt_paint: == Ptex ==

Nicholas Bishop nicholasbishop at gmail.com
Fri Aug 13 03:59:44 CEST 2010


Revision: 31304
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31304
Author:   nicholasbishop
Date:     2010-08-13 03:59:42 +0200 (Fri, 13 Aug 2010)

Log Message:
-----------
== Ptex ==

Fixed anchored and drag dot stroke modes.

* Vpaint mesh restore

Modified Paths:
--------------
    branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_intern.h
    branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_vertex.c
    branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/pbvh_undo.c

Modified: branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_intern.h
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_intern.h	2010-08-13 00:34:57 UTC (rev 31303)
+++ branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_intern.h	2010-08-13 01:59:42 UTC (rev 31304)
@@ -243,6 +243,8 @@
 pbvh_undo_s3 pbvh_undo_node_no(PBVHUndoNode *unode);
 float *pbvh_undo_node_layer_disp(PBVHUndoNode *unode);
 void pbvh_undo_node_set_layer_disp(PBVHUndoNode *unode, float *layer_disp);
+const char *pbvh_undo_node_mptex_name(PBVHUndoNode *unode);
+struct MPtex *pbvh_undo_node_mptex(PBVHUndoNode *unode);
 
 /* ptex.c */
 void PTEX_OT_layer_add(struct wmOperatorType *ot);

Modified: branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_vertex.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_vertex.c	2010-08-13 00:34:57 UTC (rev 31303)
+++ branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_vertex.c	2010-08-13 01:59:42 UTC (rev 31304)
@@ -1972,12 +1972,114 @@
 	}
 }
 
+static void vpaint_restore_node(PBVH *pbvh, PBVHNode *node, PBVHUndoNode *unode,
+				CustomData *fdata,
+				int uses_grids, GridToFace *grid_face_map)
+{
+	MPtex *mptex;
+	int i;
+
+	mptex = CustomData_get_layer_named(fdata, CD_MPTEX,
+					   (char*)pbvh_undo_node_mptex_name(unode));
+
+	if(uses_grids) {
+		int *grid_indices, totgrid;
+
+		BLI_pbvh_node_get_grids(pbvh, node,
+					&grid_indices, &totgrid,
+					NULL, NULL, NULL, NULL, NULL);
+
+		for(i = 0; i < totgrid; ++i) {
+			GridToFace *gtf;
+			MPtex *src_pt, *dest_pt;
+			char *src_data, *dest_data;
+			int layersize, rowlen, ures, vres, v;
+
+			gtf = &grid_face_map[grid_indices[i]];
+
+			dest_pt = mptex + gtf->face;
+			src_pt = &pbvh_undo_node_mptex(unode)[i];
+
+			dest_data = mptex_grid_offset(dest_pt, gtf->offset, &ures, &vres, &rowlen);
+			src_data = src_pt->data;
+
+			layersize = dest_pt->channels * ptex_data_size(dest_pt->type);
+
+			for(v = 0; v < vres; ++v) {
+				memcpy(dest_data, src_data, layersize*ures);
+
+				src_data += layersize*ures;
+				dest_data += layersize*rowlen;
+			}
+		}
+	}
+	else {
+		int *face_indices, totface;
+
+		BLI_pbvh_node_get_faces(pbvh, node, NULL,
+					&face_indices, NULL, &totface);
+
+		for(i = 0; i < totface; i++) {
+			MPtex *pt = &mptex[face_indices[i]];
+			int layersize, texels, j;
+			
+			for(j = 0, texels = 0; j < pt->subfaces; ++j)
+				texels += pt->res[j][0] * pt->res[j][1];
+
+			layersize = pt->channels * ptex_data_size(pt->type);
+
+			memcpy(pt->data, pbvh_undo_node_mptex(unode)[i].data,
+			       layersize * texels);
+			     
+		}
+	}
+
+	BLI_pbvh_node_set_flags(node, SET_INT_IN_POINTER(PBVH_UpdateColorBuffers|
+							 PBVH_UpdateRedraw));
+}
+
+static void vpaint_restore(VPaint *vp, Object *ob)
+{
+	Brush *brush = paint_brush(&vp->paint);
+	PBVH *pbvh = ob->paint->pbvh;
+
+	/* Restore the mesh before continuing with anchored stroke */
+	if((brush->flag & BRUSH_ANCHORED) ||
+	   (brush->flag & BRUSH_RESTORE_MESH))
+	{
+		PBVHNode **nodes;
+		CustomData *fdata;
+		GridToFace *grid_face_map;
+		int n, totnode, uses_grids;
+
+		BLI_pbvh_search_gather(pbvh, NULL, NULL, &nodes, &totnode);
+
+		uses_grids = BLI_pbvh_uses_grids(pbvh);
+		grid_face_map = BLI_pbvh_get_grid_face_map(pbvh);
+		BLI_pbvh_get_customdata(pbvh, NULL, &fdata);
+
+		for(n = 0; n < totnode; n++) {
+			PBVHUndoNode *unode;
+			
+			unode= pbvh_undo_get_node(nodes[n]);
+			if(unode) {
+				vpaint_restore_node(pbvh, nodes[n], unode, fdata, uses_grids, grid_face_map);
+			}
+		}
+
+		if(nodes)
+			MEM_freeN(nodes);
+	}
+}
+
 static void vpaint_stroke_update_step(bContext *C, PaintStroke *stroke,
 					  PointerRNA *itemptr)
 {
 	VPaint *vp= CTX_data_tool_settings(C)->vpaint;
 	Object *ob = CTX_data_active_object(C);
 
+	vpaint_restore(vp, ob);
+
 	paint_stroke_apply_brush(C, stroke, &vp->paint);
 
 	if(paint_brush(&vp->paint)->vertexpaint_tool == VERTEX_PAINT_BLUR)

Modified: branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/pbvh_undo.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/pbvh_undo.c	2010-08-13 00:34:57 UTC (rev 31303)
+++ branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/pbvh_undo.c	2010-08-13 01:59:42 UTC (rev 31304)
@@ -634,3 +634,13 @@
 {
 	unode->layer_disp = layer_disp;
 }
+
+const char *pbvh_undo_node_mptex_name(PBVHUndoNode *unode)
+{
+	return unode->mptex_name;
+}
+
+struct MPtex *pbvh_undo_node_mptex(PBVHUndoNode *unode)
+{
+	return unode->mptex;
+}





More information about the Bf-blender-cvs mailing list