[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