Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2012-01-15 14:48:39 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-01-15 14:48:39 +0400
commit03b43a0db02028a0a41f0c141cd5ef1b661e5766 (patch)
treea07ae969241938625977b6a81da4bfcf465afaff /source
parentcaca9cc8f610d2967fc38bf2528a517987bffaef (diff)
move bmesh painting code into its own function, trunk has vpaint_paint_face(), this adds vpaint_paint_poly() which does the same thing.
Diffstat (limited to 'source')
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex.c167
1 files changed, 92 insertions, 75 deletions
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index ca16e8dfc7c..7a376a218b7 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -2700,6 +2700,97 @@ static void vpaint_paint_face(VPaint *vp, VPaintData *vpd, Object *ob,
}
#endif
+/* BMESH version of vpaint_paint_face (commented above) */
+
+static void vpaint_paint_poly(VPaint *vp, VPaintData *vpd, Object *ob,
+ const unsigned int index, const float mval[2],
+ const float brush_size_pressure, const float brush_alpha_pressure,
+ int UNUSED(flip)
+ )
+{
+ ViewContext *vc = &vpd->vc;
+ Brush *brush = paint_brush(&vp->paint);
+ Mesh *me = get_mesh(ob);
+ MPoly *mpoly= &me->mpoly[index];
+ MFace *mf;
+ MCol *mc;
+ MLoop *ml;
+ MLoopCol *mlc;
+ polyfacemap_e *e;
+ unsigned int *lcol = ((unsigned int*)me->mloopcol) + mpoly->loopstart;
+ unsigned int *lcolorig = ((unsigned int*)vp->vpaint_prev) + mpoly->loopstart;
+ float alpha;
+ int i, j;
+
+ int brush_alpha_pressure_i = (int)(brush_alpha_pressure*255.0f);
+
+ if(brush->vertexpaint_tool == PAINT_BLEND_BLUR) {
+ unsigned int blend[4] = {0};
+ unsigned int tcol;
+ char *col;
+
+ for (j=0; j<mpoly->totloop; j += 2) {
+ col = (char *)(lcol + j);
+ blend[0] += col[0];
+ blend[1] += col[1];
+ blend[2] += col[2];
+ blend[3] += col[3];
+ }
+
+ blend[0] /= mpoly->totloop;
+ blend[1] /= mpoly->totloop;
+ blend[2] /= mpoly->totloop;
+ blend[3] /= mpoly->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;
+ for (i=0; i<mpoly->totloop; i++, ml++) {
+ alpha= calc_vp_alpha_dl(vp, vc, vpd->vpimat,
+ vpd->vertexcosnos+6*ml->v, mval,
+ brush_size_pressure, brush_alpha_pressure);
+ if(alpha > 0.0f) {
+ const int alpha_i = (int)(alpha*255.0f);
+ lcol[i] = vpaint_blend(vp, lcol[i], lcolorig[i], vpd->paintcol, alpha_i, brush_alpha_pressure_i);
+ }
+ }
+
+#ifdef CPYCOL
+# undef CPYCOL
+#endif
+#define CPYCOL(c, l) (c)->a = (l)->a, (c)->r = (l)->r, (c)->g = (l)->g, (c)->b = (l)->b
+
+ /* update vertex colors for tesselations incrementally,
+ * rather then regenerating the tesselation altogether .*/
+ for (e = vpd->polyfacemap[index].first; e; e = e->next) {
+ mf = me->mface + e->facenr;
+ mc = me->mcol + e->facenr*4;
+
+ ml = me->mloop + mpoly->loopstart;
+ mlc = me->mloopcol + mpoly->loopstart;
+ for (j=0; j<mpoly->totloop; j++, ml++, mlc++) {
+ if (ml->v == mf->v1)
+ CPYCOL(mc, mlc);
+ else if (ml->v == mf->v2)
+ CPYCOL(mc+1, mlc);
+ else if (ml->v == mf->v3)
+ CPYCOL(mc+2, mlc);
+ else if (mf->v4 && ml->v == mf->v4)
+ CPYCOL(mc+3, mlc);
+
+ }
+ }
+
+#undef CPYCOL
+
+}
+
static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, PointerRNA *itemptr)
{
Scene *scene= CTX_data_scene(C);
@@ -2709,7 +2800,6 @@ static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
Brush *brush = paint_brush(&vp->paint);
ViewContext *vc= &vpd->vc;
Object *ob= vc->obact;
- polyfacemap_e *e;
Mesh *me= ob->data;
float mat[4][4];
int *indexar= vpd->indexar;
@@ -2720,8 +2810,6 @@ static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
const float brush_size_pressure = brush_size(scene, brush) * (brush_use_size_pressure(scene, brush) ? pressure : 1.0f);
const float brush_alpha_pressure = brush_alpha(scene, brush) * (brush_use_alpha_pressure(scene, brush) ? pressure : 1.0f);
- int brush_alpha_pressure_i = (int)(brush_alpha_pressure*255.0f);
-
RNA_float_get_array(itemptr, "mouse", mval);
flip = RNA_boolean_get(itemptr, "pen_flip");
@@ -2780,78 +2868,7 @@ static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
for(index=0; index<totindex; index++) {
if(indexar[index] && indexar[index]<=me->totpoly) {
- MPoly *mpoly= ((MPoly *)me->mpoly) + (indexar[index]-1);
- MFace *mf;
- MCol *mc;
- MLoop *ml;
- MLoopCol *mlc;
- unsigned int *lcol = ((unsigned int*)me->mloopcol) + mpoly->loopstart;
- unsigned int *lcolorig = ((unsigned int*)vp->vpaint_prev) + mpoly->loopstart;
- float alpha;
- int i, j;
-
- if(brush->vertexpaint_tool == PAINT_BLEND_BLUR) {
- unsigned int blend[5] = {0};
- char *col;
-
- for (j=0; j<mpoly->totloop; j += 2) {
- col = (char*)(lcol + j);
- blend[0] += col[0];
- blend[1] += col[1];
- blend[2] += col[2];
- blend[3] += col[3];
- }
-
- blend[0] /= mpoly->totloop;
- blend[1] /= mpoly->totloop;
- blend[2] /= mpoly->totloop;
- blend[3] /= mpoly->totloop;
- col = (char*)(blend + 4);
- 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;
- for (i=0; i<mpoly->totloop; i++, ml++) {
- alpha= calc_vp_alpha_dl(vp, vc, vpd->vpimat,
- vpd->vertexcosnos+6*ml->v, mval,
- brush_size_pressure, brush_alpha_pressure);
- if(alpha > 0.0f) {
- const int alpha_i = (int)(alpha*255.0f);
- lcol[i] = vpaint_blend(vp, lcol[i], lcolorig[i], vpd->paintcol, alpha_i, brush_alpha_pressure_i);
- }
- }
-
- #ifdef CPYCOL
- #undef CPYCOL
- #endif
- #define CPYCOL(c, l) (c)->a = (l)->a, (c)->r = (l)->r, (c)->g = (l)->g, (c)->b = (l)->b
-
- /*update vertex colors for tesselations incrementally,
- rather then regenerating the tesselation altogether.*/
- for (e=vpd->polyfacemap[(indexar[index]-1)].first; e; e=e->next) {
- mf = me->mface + e->facenr;
- mc = me->mcol + e->facenr*4;
-
- ml = me->mloop + mpoly->loopstart;
- mlc = me->mloopcol + mpoly->loopstart;
- for (j=0; j<mpoly->totloop; j++, ml++, mlc++) {
- if (ml->v == mf->v1)
- CPYCOL(mc, mlc);
- else if (ml->v == mf->v2)
- CPYCOL(mc+1, mlc);
- else if (ml->v == mf->v3)
- CPYCOL(mc+2, mlc);
- else if (mf->v4 && ml->v == mf->v4)
- CPYCOL(mc+3, mlc);
-
- }
- }
- #undef CPYCOL
+ vpaint_paint_poly(vp, vpd, ob, indexar[index]-1, mval, brush_size_pressure, brush_alpha_pressure, flip);
}
}