Commit: 282811f8b83dac4a38a9e66c3047c15cfd26b8bd
Author: Antony Riakiotakis
Date:   Tue Sep 1 15:59:48 2015 +0300
Branches: master
https://developer.blender.org/rB282811f8b83dac4a38a9e66c3047c15cfd26b8bd

Fix projection painting normal culling operating on individual
triangles.

This made the normal-related artifacts of projection painting much more
apparent. Now we do culling based on
whole polygons. Pure backface culling still uses individual
triangles.

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

M       source/blender/editors/sculpt_paint/paint_image_proj.c

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

diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.c 
b/source/blender/editors/sculpt_paint/paint_image_proj.c
index 2b0aba9..ef9acb9 100644
--- a/source/blender/editors/sculpt_paint/paint_image_proj.c
+++ b/source/blender/editors/sculpt_paint/paint_image_proj.c
@@ -3559,34 +3559,6 @@ static bool project_paint_winclip(
 }
 #endif //PROJ_DEBUG_WINCLIP
 
-/* Return true if face should be culled, false otherwise */
-static bool project_paint_backface_cull(
-        const ProjPaintState *ps, const MLoopTri *lt,
-        const ProjPaintFaceCoSS *coSS)
-{
-       if (ps->do_backfacecull) {
-               if (ps->do_mask_normal) {
-                       const int lt_vtri[3] = { PS_LOOPTRI_AS_VERT_INDEX_3(ps, 
lt) };
-                       /* Since we are interpolating the normals of faces, we 
want to make
-                        * sure all the verts are pointing away from the view,
-                        * not just the face */
-                       if ((ps->vertFlags[lt_vtri[0]] & PROJ_VERT_CULL) &&
-                           (ps->vertFlags[lt_vtri[1]] & PROJ_VERT_CULL) &&
-                           (ps->vertFlags[lt_vtri[2]] & PROJ_VERT_CULL))
-                       {
-                               return true;
-                       }
-               }
-               else {
-                       if ((line_point_side_v2(coSS->v1, coSS->v2, coSS->v3) < 
0.0f) != ps->is_flip_object) {
-                               return true;
-                       }
-
-               }
-       }
-
-       return false;
-}
 
 static void project_paint_build_proj_ima(
         ProjPaintState *ps, MemArena *arena,
@@ -3631,6 +3603,7 @@ static void project_paint_prepare_all_faces(
        TexPaintSlot *slot = NULL;
        const MLoopTri *lt;
        int image_index = -1, tri_index;
+       int prev_poly = -1;
 
        for (tri_index = 0, lt = ps->dm_mlooptri; tri_index < 
ps->dm_totlooptri; tri_index++, lt++) {
                bool is_face_sel;
@@ -3691,8 +3664,37 @@ static void project_paint_prepare_all_faces(
 
 #endif //PROJ_DEBUG_WINCLIP
 
-                               if (project_paint_backface_cull(ps, lt, &coSS)) 
{
-                                       continue;
+                               /* backface culls individual triangles but mask 
normal will use polygon */
+                               if (ps->do_backfacecull) {
+                                       if (ps->do_mask_normal) {
+                                               if (prev_poly != lt->poly) {\
+                                                       int iloop;
+                                                       bool culled = true;
+                                                       const MPoly *poly = 
ps->dm_mpoly + lt->poly;
+                                                       int poly_loops = 
poly->totloop;
+                                                       prev_poly = lt->poly;
+                                                       for (iloop = 0; iloop < 
poly_loops; iloop++) {
+                                                               if 
(!(ps->vertFlags[ps->dm_mloop[poly->loopstart + iloop].v] & PROJ_VERT_CULL)) {
+                                                                       culled 
= false;
+                                                                       break;
+                                                               }
+                                                       }
+
+                                                       if (culled) {
+                                                               /* poly loops - 
2 is number of triangles for poly,
+                                                                * but counter 
gets incremented when continuing, so decrease by 3 */
+                                                               int poly_tri = 
poly_loops - 3;
+                                                               tri_index += 
poly_tri;
+                                                               lt += poly_tri;
+                                                               continue;
+                                                       }
+                                               }
+                                       }
+                                       else {
+                                               if 
((line_point_side_v2(coSS.v1, coSS.v2, coSS.v3) < 0.0f) != ps->is_flip_object) {
+                                                       continue;
+                                               }
+                                       }
                                }
                        }

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to