[Bf-blender-cvs] [7f2c122] soc-2016-pbvh-painting: Preliminary PBVH painting on vertex paint. Should have weight painting at a similar stage relatively soon. Still need to select all leaves within brush region.

Nathan Vollmer noreply at git.blender.org
Sat Jun 11 12:41:45 CEST 2016


Commit: 7f2c122ca972fe75949049322f790680df9e0616
Author: Nathan Vollmer
Date:   Sat Jun 11 04:41:35 2016 -0600
Branches: soc-2016-pbvh-painting
https://developer.blender.org/rB7f2c122ca972fe75949049322f790680df9e0616

Preliminary PBVH painting on vertex paint. Should have weight painting at a similar stage relatively soon. Still need to select all leaves within brush region.

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

M	source/blender/editors/sculpt_paint/paint_vertex.c
M	source/blender/editors/sculpt_paint/sculpt.c
M	source/blender/editors/sculpt_paint/sculpt_intern.h

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

diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index 7e91df12..f775835 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -65,6 +65,8 @@
 #include "BKE_paint.h"
 #include "BKE_report.h"
 #include "BKE_colortools.h"
+#include "BKE_pbvh.h"
+#include "BKE_ccg.h"s
 
 #include "WM_api.h"
 #include "WM_types.h"
@@ -78,6 +80,9 @@
 #include "sculpt_intern.h"
 #include "paint_intern.h"  /* own include */
 
+#include "bmesh.h"
+#include "bmesh_tools.h"
+
 /* small structure to defer applying weight-paint results */
 struct WPaintDefer {
 	int index;
@@ -740,7 +745,6 @@ static unsigned int vpaint_blend(VPaint *vp, unsigned int col, unsigned int colo
 {
 	Brush *brush = BKE_paint_brush(&vp->paint);
 	const int tool = brush->vertexpaint_tool;
-
 	col = vpaint_blend_tool(tool, col, paintcol, alpha_i);
 
 	/* if no spray, clip color adding with colorig & orig alpha */
@@ -2011,6 +2015,8 @@ static void vwpaint_update_cache_invariants(bContext *C, VPaint *vd, SculptSessi
 
 	cache->brush = brush;
 
+	cache->first_time = 1;
+
 	/* cache projection matrix */
 	ED_view3d_ob_project_mat_get(cache->vc->rv3d, ob, cache->projection_mat);
 
@@ -2020,6 +2026,8 @@ static void vwpaint_update_cache_invariants(bContext *C, VPaint *vd, SculptSessi
 	copy_m3_m4(mat, ob->imat);
 	mul_m3_v3(mat, viewDir);
 	normalize_v3_v3(cache->true_view_normal, viewDir);
+
+	cache->nodes = MEM_callocN(sizeof(PBVHNode*), "PBVH node ptr");
 }
 
 /* Initialize the stroke cache variants from operator properties */
@@ -2077,6 +2085,8 @@ static void vwpaint_update_cache_variants(bContext *C, VPaint *vd, Object *ob,
 
 	cache->radius_squared = cache->radius * cache->radius;
 
+	//Many of these items might be uncommented/removed in the future.
+
 	//if (brush->flag & BRUSH_ANCHORED) {
 	//	/* true location has been calculated as part of the stroke system already here */
 	//	if (brush->flag & BRUSH_EDGE_TO_EDGE) {
@@ -2103,6 +2113,7 @@ static void vwpaint_update_cache_variants(bContext *C, VPaint *vd, Object *ob,
 	//}
 
 	//cache->special_rotation = ups->brush_rotation;
+	cache->totNodes = 0;
 }
 
 
@@ -2829,6 +2840,8 @@ static bool vpaint_stroke_test_start(bContext *C, struct wmOperator *op, const f
 	Object *ob = CTX_data_active_object(C);
 	Mesh *me;
 	float mat[4][4], imat[4][4];
+	SculptSession *ss = ob->sculpt;
+	VPaint *vd = CTX_data_tool_settings(C)->wpaint;
 
 	/* context checks could be a poll() */
 	me = BKE_mesh_from_object(ob);
@@ -2877,35 +2890,9 @@ static bool vpaint_stroke_test_start(bContext *C, struct wmOperator *op, const f
 	invert_m4_m4(imat, mat);
 	copy_m3_m4(vpd->vpimat, imat);
 
-	return 1;
-}
-
-static void vpaint_paint_leaf(Mesh *me, VPaintData *vpd, SculptSession *ss) {
-	StrokeCache* cache = ss->cache;
-	
-	int r_unique = 0;
-	int r_total = 0;
-	int* r_vert_indices;
-	MeshElemMap *r_map = NULL;
-
-	if (cache->didNodeChange == true) {
-		int *r_mem = NULL;
-		MVert* r_verts;
-		BKE_pbvh_node_num_verts(ss->pbvh, cache->node, &r_unique, &cache->totVerts);
-		BKE_pbvh_node_get_verts(ss->pbvh, cache->node, &cache->vert_indices, &r_verts);
-		BKE_mesh_vert_loop_map_create(&cache->vert_to_loop, &r_mem, me->mpoly, me->mloop, me->totvert, me->totpoly, me->totloop);
-	}
-
-	unsigned int* lcol = (unsigned int*)me->mloopcol;
+	vwpaint_update_cache_invariants(C, vd, ss, op, mouse);
 
-	//Very ghetto. paints the same loop multiple times...
-	for (int i = 0; i < cache->totVerts; ++i) {
-		MLoop loop;
-		for (int j = 0; j < cache->vert_to_loop[cache->vert_indices[i]].count; ++j) {
-			//vpaint_paint_loop(me, r_map[r_vert_indices[i]].indices[j]);
-			lcol[cache->vert_to_loop[cache->vert_indices[i]].indices[j]] = vpd->paintcol;
-		}
-	}
+	return 1;
 }
 
 static void vpaint_paint_poly(VPaint *vp, VPaintData *vpd, Mesh *me,
@@ -2977,77 +2964,202 @@ static void vpaint_paint_poly(VPaint *vp, VPaintData *vpd, Mesh *me,
 	}
 }
 
+static void vpaint_paint_loop(VPaint *vp, VPaintData *vpd, Mesh *me,
+	const unsigned int index, const float brush_size_pressure, const float brush_alpha_pressure)
+{
+	ViewContext *vc = &vpd->vc;
+	Brush *brush = BKE_paint_brush(&vp->paint);
+	MPoly *mpoly = &me->mpoly[index];
+	MLoop *ml;
+	unsigned int *lcol = (unsigned int*)me->mloopcol;
+	unsigned int *lcolorig = (unsigned int *)vp->vpaint_prev;
+	bool *mlooptag = (vpd->mlooptag) ? vpd->mlooptag : NULL;
+	float alpha;
+	int brush_alpha_pressure_i = (int)(brush_alpha_pressure * 255.0f);
+
+
+	//Looks like by default, older vertex paint would average all the old vertices colors together. 
+	//I need to calculate this average outside this function.
+
+	//if (brush->vertexpaint_tool == PAINT_BLEND_BLUR) {
+	//	unsigned int blend[4] = { 0 };
+	//	unsigned int tcol;
+	//	char *col;
+
+	//	//for (j = 0; j < totloop; j++) {
+	//	//col = (char *)(lcol[index]);
+	//	//blend[0] += col[0]/10;
+	//	//blend[1] += col[1]/10;
+	//	//blend[2] += col[2]/10;
+	//	//blend[3] += col[3]/10;
+	////	}
+
+	//	//blend[0] = divide_round_i(blend[0], totloop);
+	//	//blend[1] = divide_round_i(blend[1], totloop);
+	//	//blend[2] = divide_round_i(blend[2], totloop);
+	//	//blend[3] = divide_round_i(blend[3], totloop);
+	//	col = (char *)&tcol;
+	//	col[0] = blend[0];
+	//	col[1] = blend[1];
+	//	col[2] = blend[2];
+	//	col[3] = blend[3];
+
+	//	vpd->paintcol = *((unsigned int *)col);
+	//}
+
+	//ml = me->mloop + mpoly->loopstart;
+
+	float rgba[4];
+	unsigned int paintcol;
+
+	//Still need to determine how this function works
+
+	alpha = 1;// calc_vp_alpha_col_dl(vp, vc, vpd->vpimat,
+		//&vpd->vertexcosnos[ml->v], mval,
+		//brush_size_pressure, brush_alpha_pressure, rgba);
+
+	if (vpd->is_texbrush) {
+		float rgba_br[3];
+		rgb_uchar_to_float(rgba_br, (const unsigned char *)&vpd->paintcol);
+		mul_v3_v3(rgba_br, rgba);
+		rgb_float_to_uchar((unsigned char *)&paintcol, rgba_br);
+	}
+	else
+		paintcol = vpd->paintcol;
+
+	if (alpha > 0.0f) {
+		const int alpha_i = (int)(alpha * 255.0f);
+		lcol[index] = vpaint_blend(vp, lcol[index], lcolorig[index], paintcol, alpha_i, brush_alpha_pressure_i);
+
+		//Still need to determine what mlooptag is used for.
+		//if (mlooptag) mlooptag[i] = 1;
+	}
+}
+
+static void vpaint_paint_leaf(bContext *C, Mesh *me, VPaintData *vpd, SculptSession *ss, PointerRNA *itemptr) {
+	StrokeCache* cache = ss->cache;
+
+	int r_unique = 0;
+	int r_total = 0;
+	int* r_vert_indices;
+	MeshElemMap *r_map = NULL;
+	Scene *scene = CTX_data_scene(C);
+	ToolSettings *ts = CTX_data_tool_settings(C);
+	VPaint *vp = ts->vpaint;
+	Brush *brush = BKE_paint_brush(&vp->paint);
+
+	const float pressure = RNA_float_get(itemptr, "pressure");
+	const float brush_size_pressure =
+	        BKE_brush_size_get(scene, brush) * (BKE_brush_use_size_pressure(scene, brush) ? pressure : 1.0f);
+	const float brush_alpha_pressure =
+	        BKE_brush_alpha_get(scene, brush) * (BKE_brush_use_alpha_pressure(scene, brush) ? pressure : 1.0f);
+
+	//Only recalculate the map if the PBVH nodes have changed. 
+	//Currently only setup to work with one selected PBVH node.
+	if (cache->didNodeChange == true) {
+		int *r_mem = NULL;
+		MVert* r_verts;
+		BKE_pbvh_node_num_verts(ss->pbvh, cache->nodes[0], &r_unique, &cache->totVerts);
+		BKE_pbvh_node_get_verts(ss->pbvh, cache->nodes[0], &cache->vert_indices, &r_verts);
+		BKE_mesh_vert_loop_map_create(&cache->vert_to_loop, &r_mem, me->mpoly, me->mloop, me->totvert, me->totpoly, me->totloop);
+	}
+
+	unsigned int* lcol = (unsigned int*)me->mloopcol;
+
+	SculptBrushTest test;
+	sculpt_brush_test_init(ss, &test);
+	for (int i = 0; i < cache->totVerts; ++i) {
+		MVert vert = me->mvert[cache->vert_indices[i]];
+		//Test to see if the vertex coordinates are within the spherical brush region.
+		if (sculpt_brush_test(&test, vert.co)) {
+			int vertexIndex = cache->vert_indices[i];
+			for (int j = 0; j < cache->vert_to_loop[vertexIndex].count; ++j) {
+				int loopIndex = cache->vert_to_loop[vertexIndex].indices[j];
+				vpaint_paint_loop(vp, vpd, me, loopIndex, brush_size_pressure, brush_alpha_pressure);
+			}
+		}
+	}
+}
+
 static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, PointerRNA *itemptr)
 {
-	//Scene *scene = CTX_data_scene(C);
-	//ToolSettings *ts = CTX_data_tool_settings(C);
+	Scene *scene = CTX_data_scene(C);
+	ToolSettings *ts = CTX_data_tool_settings(C);
 	struct VPaintData *vpd = paint_stroke_mode_data(stroke);
-	//VPaint *vp = ts->vpaint;
-	//Brush *brush = BKE_paint_brush(&vp->paint);
+	VPaint *vp = ts->vpaint;
+	Brush *brush = BKE_paint_brush(&vp->paint);
 	ViewContext *vc = &vpd->vc;
 	Object *ob = vc->obact;
 	Mesh *me = ob->data;
-	//float mat[4][4];
-	//int *indexar = vpd->indexar;
-	//int totindex, index;
-	//float mval[2];
 
-	//const float pressure = RNA_float_get(itemptr, "pressure");
-	//const float brush_size_pressure =
-	//        BKE_brush_size_get(scene, brush) * (BKE_brush_use_size_pressure(scene, brush) ? pressure : 1.0f);
-	//const float brush_alpha_pressure =
-	//        BKE_brush_alpha_get(scene, brush) * (BKE_brush_use_alpha_pressure(scene, brush) ? pressure : 1.0f);
+	Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
 
-	//RNA_float_get_array(itemptr, "mouse", mval);
+	vwpaint_update_cache_variants(C, sd, ob, itemptr);
 
-	//view3d_operator_needs_opengl(C);
-	//ED_view3d_init_mats_rv3d(ob, vc->rv3d);
+	float mat[4][4];
+	int *indexar = vpd->indexar;
+	int totindex, index;
+	float mval[2];
 
-	///* load projection matrix */
-	//mul_m4_m4m4(mat, vc->rv3d->persmat, ob->obmat);
+	const float pressure = RNA_float_get(itemptr, "pressure");
+	const float brush_size_pressure =
+	        BKE_brush_size_get(scene, brush) * (BKE_brush_use_size_pressure(scene, brush) ? pressure : 1.0f);
+	const float brush_alpha_pressure =
+	        BKE_brush_alpha_get(scene, brush) * (BKE_brush_use_alpha_pressure(scene, brush) ? pressure : 1.0f);
 
-	///* which faces are involved */
-	//totindex = sample_backbuf_area(vc, indexar, me->totpoly, mval[0], mval[1], brush_size_pressure);
+	RNA_float_get_array(itemptr, "mouse", mval);
 
-	//if ((me->editflag & ME_EDIT_PAINT_FACE_SEL) && me->mpoly) {
-	//	for (index = 0; index < totindex; index++) {
-	/

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list