[Bf-blender-cvs] [8933363] vertex_paint_pbvh: Vertex painting PBVH refactor:

Antony Riakiotakis noreply at git.blender.org
Wed Dec 24 14:42:59 CET 2014


Commit: 89333638a8cc4aeb2eae2a1bd48f71396672aeb4
Author: Antony Riakiotakis
Date:   Sat Oct 18 14:39:28 2014 +0200
Branches: vertex_paint_pbvh
https://developer.blender.org/rB89333638a8cc4aeb2eae2a1bd48f71396672aeb4

Vertex painting PBVH refactor:

Refactor PBVH off SculptSession and in a separate PaintSession struct
Entering Vertex painting will generate a PBVH and vertex painting now
draws using PBVH.
Add stub vertex painting operator that will use PBVH.

===================================================================

M	source/blender/blenkernel/BKE_paint.h
M	source/blender/blenkernel/intern/DerivedMesh.c
M	source/blender/blenkernel/intern/cdderivedmesh.c
M	source/blender/blenkernel/intern/multires.c
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenkernel/intern/paint.c
M	source/blender/blenkernel/intern/subsurf_ccg.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/editors/object/object_edit.c
M	source/blender/editors/sculpt_paint/CMakeLists.txt
M	source/blender/editors/sculpt_paint/paint_cursor.c
M	source/blender/editors/sculpt_paint/paint_hide.c
M	source/blender/editors/sculpt_paint/paint_intern.h
M	source/blender/editors/sculpt_paint/paint_mask.c
M	source/blender/editors/sculpt_paint/paint_ops.c
M	source/blender/editors/sculpt_paint/paint_utils.c
A	source/blender/editors/sculpt_paint/paint_vertex_pbvh.c
M	source/blender/editors/sculpt_paint/sculpt.c
M	source/blender/editors/sculpt_paint/sculpt_intern.h
M	source/blender/editors/sculpt_paint/sculpt_undo.c
M	source/blender/editors/space_info/info_stats.c
M	source/blender/editors/space_view3d/drawobject.c
M	source/blender/makesdna/DNA_object_types.h
M	source/blender/makesrna/intern/rna_object.c
M	source/blender/makesrna/intern/rna_sculpt_paint.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index b080ca3..24a485a 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -145,6 +145,7 @@ float paint_grid_paint_mask(const struct GridPaintMask *gpm, unsigned level,
 /* stroke related */
 void paint_calculate_rake_rotation(struct UnifiedPaintSettings *ups, const float mouse_pos[2]);
 
+
 /* Session data (mode-specific) */
 
 typedef struct SculptSession {
@@ -169,8 +170,6 @@ typedef struct SculptSession {
 	/* Undo/redo log for dynamic topology sculpting */
 	struct BMLog *bm_log;
 
-	/* PBVH acceleration structure */
-	struct PBVH *pbvh;
 	bool show_diffuse_color;
 
 	/* Painting on deformed mesh */
@@ -178,14 +177,7 @@ typedef struct SculptSession {
 	float (*orig_cos)[3]; /* coords of undeformed mesh */
 	float (*deform_cos)[3]; /* coords of deformed mesh but without stroke displacement */
 	float (*deform_imats)[3][3]; /* crazyspace deformation matrices */
-
-	/* Partial redraw */
-	bool partial_redraw;
 	
-	/* Used to cache the render of the active texture */
-	unsigned int texcache_side, *texcache, texcache_actual;
-	struct ImagePool *tex_pool;
-
 	/* Layer brush persistence between strokes */
 	float (*layer_co)[3]; /* Copy of the mesh vertices' locations */
 
@@ -200,6 +192,24 @@ typedef struct SculptSession {
 	int average_stroke_counter;
 } SculptSession;
 
+/* Session data (common) */
+typedef struct PaintSession {
+	/* PBVH acceleration structure */
+	struct PBVH *pbvh;
+
+	/* Used to cache the render of the active texture */
+	unsigned int texcache_side, *texcache, texcache_actual;
+	struct ImagePool *tex_pool;
+
+	/* Partial redraw */
+	bool partial_redraw;
+	
+	/* mode specific stuff */
+	SculptSession *sculpt;
+} PaintSession;
+
+void BKE_free_paintsession(struct Object *ob);
+
 void BKE_free_sculptsession(struct Object *ob);
 void BKE_free_sculptsession_deformMats(struct SculptSession *ss);
 void BKE_sculptsession_bm_to_me(struct Object *ob, bool reorder);
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index e8000a0..6c9985b 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -1484,8 +1484,8 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
 	MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0);
 	const bool has_multires = (mmd && mmd->sculptlvl != 0);
 	bool multires_applied = false;
-	const bool sculpt_mode = ob->mode & OB_MODE_SCULPT && ob->sculpt && !useRenderParams;
-	const bool sculpt_dyntopo = (sculpt_mode && ob->sculpt->bm)  && !useRenderParams;
+	const bool sculpt_mode = ob->mode & OB_MODE_SCULPT && ob->paint && ob->paint->sculpt && !useRenderParams;
+	const bool sculpt_dyntopo = (sculpt_mode && ob->paint->sculpt->bm)  && !useRenderParams;
 	const int draw_flag = dm_drawflag_calc(scene->toolsettings);
 
 	/* Generic preview only in object mode! */
@@ -2282,12 +2282,17 @@ static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask,
 	ob->derivedDeform->needsFree = 0;
 	ob->lastDataMask = dataMask;
 
-	if ((ob->mode & OB_MODE_SCULPT) && ob->sculpt) {
+	if ((ob->mode & OB_MODE_SCULPT) && ob->paint && ob->paint->sculpt) {
 		/* create PBVH immediately (would be created on the fly too,
 		 * but this avoids waiting on first stroke) */
 
 		BKE_sculpt_update_mesh_elements(scene, scene->toolsettings->sculpt, ob, false, false);
 	}
+	else if ((ob->mode & OB_MODE_VERTEX_PAINT) && ob->paint) {
+		/* needs to be called after we ensure tessface */
+		DerivedMesh *dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
+		ob->paint->pbvh = dm->getPBVH(ob, dm);
+	}
 
 	BLI_assert(!(ob->derivedFinal->dirty & DM_DIRTY_NORMALS));
 }
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 6ac8569..f6df071 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -222,23 +222,26 @@ static const MeshElemMap *cdDM_getPolyMap(Object *ob, DerivedMesh *dm)
 
 static bool check_sculpt_object_deformed(Object *object, bool for_construction)
 {
+	SculptSession *ss = object->paint->sculpt;
 	bool deformed = false;
 
+	if (!ss)
+		return deformed;
 	/* Active modifiers means extra deformation, which can't be handled correct
 	 * on birth of PBVH and sculpt "layer" levels, so use PBVH only for internal brush
 	 * stuff and show final DerivedMesh so user would see actual object shape.
 	 */
-	deformed |= object->sculpt->modifiers_active;
+	deformed |= ss->modifiers_active;
 
 	if (for_construction) {
-		deformed |= object->sculpt->kb != NULL;
+		deformed |= ss->kb != NULL;
 	}
 	else {
 		/* As in case with modifiers, we can't synchronize deformation made against
 		 * PBVH and non-locked keyblock, so also use PBVH only for brushes and
 		 * final DM to give final result to user.
 		 */
-		deformed |= object->sculpt->kb && (object->shapeflag & OB_SHAPE_LOCK) == 0;
+		deformed |= ss->kb && (object->shapeflag & OB_SHAPE_LOCK) == 0;
 	}
 
 	return deformed;
@@ -254,37 +257,40 @@ static bool can_pbvh_draw(Object *ob, DerivedMesh *dm)
 		return false;
 	}
 
-	return cddm->mvert == me->mvert || ob->sculpt->kb;
+	return cddm->mvert == me->mvert || (ob->paint->sculpt && ob->paint->sculpt->kb);
 }
 
 static PBVH *cdDM_getPBVH(Object *ob, DerivedMesh *dm)
 {
 	CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
+	SculptSession *ss;
 
 	if (!ob) {
 		cddm->pbvh = NULL;
 		return NULL;
 	}
 
-	if (!ob->sculpt)
+	if (!ob->paint)
 		return NULL;
 
-	if (ob->sculpt->pbvh) {
-		cddm->pbvh = ob->sculpt->pbvh;
+	if (ob->paint->pbvh) {
+		cddm->pbvh = ob->paint->pbvh;
 		cddm->pbvh_draw = can_pbvh_draw(ob, dm);
 	}
 
+	ss = ob->paint->sculpt;
+
 	/* Sculpting on a BMesh (dynamic-topology) gets a special PBVH */
-	if (!cddm->pbvh && ob->sculpt->bm) {
+	if (!cddm->pbvh && ss && ss->bm) {
 		cddm->pbvh = BKE_pbvh_new();
 		cddm->pbvh_draw = true;
 
-		BKE_pbvh_build_bmesh(cddm->pbvh, ob->sculpt->bm,
-		                     ob->sculpt->bm_smooth_shading,
-		                     ob->sculpt->bm_log, ob->sculpt->cd_vert_node_offset,
-		                     ob->sculpt->cd_face_node_offset);
+		BKE_pbvh_build_bmesh(cddm->pbvh, ss->bm,
+		                     ss->bm_smooth_shading,
+		                     ss->bm_log, ss->cd_vert_node_offset,
+		                     ss->cd_face_node_offset);
 
-		pbvh_show_diffuse_color_set(cddm->pbvh, ob->sculpt->show_diffuse_color);
+		pbvh_show_diffuse_color_set(cddm->pbvh, ss->show_diffuse_color);
 	}
 		
 
@@ -303,9 +309,13 @@ static PBVH *cdDM_getPBVH(Object *ob, DerivedMesh *dm)
 		BKE_pbvh_build_mesh(cddm->pbvh, me->mface, me->mvert,
 		                    me->totface, me->totvert, &me->vdata);
 
-		pbvh_show_diffuse_color_set(cddm->pbvh, ob->sculpt->show_diffuse_color);
+		if (ss) {
+			pbvh_show_diffuse_color_set(cddm->pbvh, ss->show_diffuse_color);
 
-		deformed = check_sculpt_object_deformed(ob, true);
+			deformed = check_sculpt_object_deformed(ob, true);
+		}
+		else 
+			deformed = false;
 
 		if (deformed && ob->derivedDeform) {
 			DerivedMesh *deformdm = ob->derivedDeform;
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index 0adc65b..3e7696d 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -377,9 +377,9 @@ void multires_force_update(Object *ob)
 	if (ob) {
 		BKE_object_free_derived_caches(ob);
 
-		if (ob->sculpt && ob->sculpt->pbvh) {
-			BKE_pbvh_free(ob->sculpt->pbvh);
-			ob->sculpt->pbvh = NULL;
+		if (ob->paint && ob->paint->pbvh) {
+			BKE_pbvh_free(ob->paint->pbvh);
+			ob->paint->pbvh = NULL;
 		}
 	}
 }
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index a0d1b25..fc7544e 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -395,7 +395,7 @@ void BKE_object_free_ex(Object *ob, bool do_id_user)
 	if (ob->bsoft) bsbFree(ob->bsoft);
 	if (ob->gpulamp.first) GPU_lamp_free(ob);
 
-	BKE_free_sculptsession(ob);
+	BKE_free_paintsession(ob);
 
 	if (ob->pc_ids.first) BLI_freelistN(&ob->pc_ids);
 
@@ -1481,7 +1481,7 @@ Object *BKE_object_copy_ex(Main *bmain, Object *ob, bool copy_caches)
 	BKE_constraints_copy(&obn->constraints, &ob->constraints, true);
 
 	obn->mode = OB_MODE_OBJECT;
-	obn->sculpt = NULL;
+	obn->paint = NULL;
 
 	/* increase user numbers */
 	id_us_plus((ID *)obn->data);
@@ -3179,25 +3179,26 @@ void BKE_object_handle_update(EvaluationContext *eval_ctx, Scene *scene, Object
 
 void BKE_object_sculpt_modifiers_changed(Object *ob)
 {
-	SculptSession *ss = ob->sculpt;
+	PaintSession *psession = ob->paint;
+	SculptSession *ss = psession ? psession->sculpt : NULL;
 
 	if (ss) {
 		if (!ss->cache) {
 			/* we free pbvh on changes, except during sculpt since it can't deal with
 			 * changing PVBH node organization, we hope topology does not change in
 			 * the meantime .. weak */
-			if (ss->pbvh) {
-				BKE_pbvh_free(ss->pbvh);
-				ss->pbvh = NULL;
+			if (psession->pbvh) {
+				BKE_pbvh_free(psession->pbvh);
+				psession->pbvh = NULL;
 			}
 
-			BKE_free_sculptsession_deformMats(ob->sculpt);
+			BKE_free_sculptsession_deformMats(psession->sculpt);
 		}
 		else {
 			PBVHNode **nodes;
 			int n, totnode;
 
-			BKE_pbvh_search_gather(ss->pbvh, NULL, NULL, &nodes, &totnode);
+			BKE_pbvh_search_gather(psession->pbvh, NULL, NULL, &nodes, &totnode);
 
 			for (n = 0; n < totnode; n++)
 				BKE_pbvh_node_mark_update(nodes[n]);
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index 96fff33..de6ca48 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -507,7 +507,7 @@ void BKE_free_sculptsession_deformMats(SculptSession *ss)
 /* Write out the sculpt dynamic-topology BMesh to the Mesh */
 static void sculptsession_bm_to_me_update_data_only(Object *ob, bool reorder)
 {
-	SculptSession *ss = ob->sculpt;
+	SculptSession *ss = ob->paint->sculpt;
 
 	if (ss->bm) {
 		if 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list