Commit: a3a084111041666f9464fc7d3339a8c8e528d964
Author: Nathan Vollmer
Date:   Sat Jul 9 16:23:15 2016 -0600
Branches: soc-2016-pbvh-painting
https://developer.blender.org/rBa3a084111041666f9464fc7d3339a8c8e528d964

Added mirror buttons to weight paint, and added pbvh leaf selection and 
mirrored symmetry code. Still need to create callbacks for pbvh leaf selection.

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

M       release/scripts/addons
M       release/scripts/addons_contrib
M       release/scripts/startup/bl_ui/space_view3d_toolbar.py
M       source/blender/editors/sculpt_paint/paint_intern.h
M       source/blender/editors/sculpt_paint/paint_vertex.c
M       source/blender/editors/sculpt_paint/sculpt_intern.h

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

diff --git a/release/scripts/addons b/release/scripts/addons
index 9dd1799..04138bd 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit 9dd17998ca72cdc1abce8e9e9cff8b82798244e2
+Subproject commit 04138bdf09c5835273ab10177e99f2ffd3f1bc44
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
index 6176bf6..21462b9 160000
--- a/release/scripts/addons_contrib
+++ b/release/scripts/addons_contrib
@@ -1 +1 @@
-Subproject commit 6176bf658d03be565f7c82e2d2527c9c2aa1cf3b
+Subproject commit 21462b91fffb2a4693ef08cfee16a6fab32c4acb
diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py 
b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index c7fcc95..2e9d830 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -1694,6 +1694,7 @@ class VIEW3D_PT_tools_brush_appearance(Panel, 
View3DPaintPanel):
 class VIEW3D_PT_tools_weightpaint(View3DPanel, Panel):
     bl_category = "Tools"
     bl_context = "weightpaint"
+    bl_options = {'DEFAULT_CLOSED'}
     bl_label = "Weight Tools"
 
     def draw(self, context):
@@ -1706,6 +1707,26 @@ class VIEW3D_PT_tools_weightpaint(View3DPanel, Panel):
         props.use_reverse_transfer = True
         props.data_type = 'VGROUP_WEIGHTS'
 
+class VIEW3D_PT_weightpaint_symmetry(Panel, View3DPaintPanel):
+    bl_category = "Tools"
+    bl_context = "weightpaint"
+    bl_options = {'DEFAULT_CLOSED'}
+    bl_label = "Symmetry / Lock"
+    
+    def draw(self, context):
+        layout = self.layout
+        toolsettings = context.tool_settings
+        wpaint = toolsettings.weight_paint
+
+        col = layout.column(align=True)
+        col.label(text="Mirror:")
+        row = col.row(align=True)
+        
+        row.prop(wpaint, "use_symmetry_x", text="X", toggle=True)
+        row.prop(wpaint, "use_symmetry_y", text="Y", toggle=True)
+        row.prop(wpaint, "use_symmetry_z", text="Z", toggle=True)
+        
+        layout.column().prop(wpaint, "radial_symmetry", text="Radial")
 
 class VIEW3D_PT_tools_weightpaint_options(Panel, View3DPaintPanel):
     bl_category = "Options"
diff --git a/source/blender/editors/sculpt_paint/paint_intern.h 
b/source/blender/editors/sculpt_paint/paint_intern.h
index e892107..fe4b6e4 100644
--- a/source/blender/editors/sculpt_paint/paint_intern.h
+++ b/source/blender/editors/sculpt_paint/paint_intern.h
@@ -30,6 +30,8 @@
 
 #include "ED_view3d.h"
 #include "BKE_DerivedMesh.h"
+#include "BKE_mesh_mapping.h"
+#include "BLI_stack.h"
 
 #ifndef __PAINT_INTERN_H__
 #define __PAINT_INTERN_H__
@@ -92,6 +94,56 @@ void paint_cursor_start(struct bContext *C, int 
(*poll)(struct bContext *C));
 void paint_cursor_start_explicit(struct Paint *p, struct wmWindowManager *wm, 
int (*poll)(struct bContext *C));
 void paint_cursor_delete_textures(void);
 
+/**
+* Variables stored both for 'active' and 'mirror' sides.
+*/
+struct WeightPaintGroupData {
+  /** index of active group or its mirror
+  *
+  * - 'active' is always `ob->actdef`.
+  * - 'mirror' is -1 when 'ME_EDIT_MIRROR_X' flag id disabled,
+  *   otherwise this will be set to the mirror or the active group (if the 
group isn't mirrored).
+  */
+  int index;
+  /** lock that includes the 'index' as locked too
+  *
+  * - 'active' is set of locked or active/selected groups
+  * - 'mirror' is set of locked or mirror groups
+  */
+  const bool *lock;
+};
+
+typedef struct WPaintData {
+  ViewContext vc;
+  int *indexar;
+
+  struct WeightPaintGroupData active, mirror;
+
+  void *vp_handle;
+  DMCoNo *vertexcosnos;
+
+  float wpimat[3][3];
+
+  /* variables for auto normalize */
+  const bool *vgroup_validmap; /* stores if vgroups tie to deforming bones or 
not */
+  const bool *lock_flags;
+
+  /* variables for multipaint */
+  const bool *defbase_sel;      /* set of selected groups */
+  int defbase_tot_sel;          /* number of selected groups */
+  bool do_multipaint;           /* true if multipaint enabled and multiple 
groups selected */
+
+  /* variables for blur */
+  struct {
+    MeshElemMap *vmap;
+    int *vmap_mem;
+  } blur_data;
+
+  BLI_Stack *accumulate_stack;  /* for reuse (WPaintDefer) */
+
+  int defbase_tot;
+} WPaintData;
+
 /* paint_vertex.c */
 typedef struct VPaintData {
        ViewContext vc;
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c 
b/source/blender/editors/sculpt_paint/paint_vertex.c
index 41d17e4..d7bfd01 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -35,7 +35,6 @@
 #include "BLI_math.h"
 #include "BLI_array_utils.h"
 #include "BLI_bitmap.h"
-#include "BLI_stack.h"
 
 #include "IMB_imbuf.h"
 #include "IMB_imbuf_types.h"
@@ -60,7 +59,6 @@
 #include "BKE_depsgraph.h"
 #include "BKE_deform.h"
 #include "BKE_mesh.h"
-#include "BKE_mesh_mapping.h"
 #include "BKE_modifier.h"
 #include "BKE_object_deform.h"
 #include "BKE_paint.h"
@@ -1480,25 +1478,6 @@ static void multipaint_apply_change(MDeformVert *dvert, 
const int defbase_tot, f
        }
 }
 
-/**
- * Variables stored both for 'active' and 'mirror' sides.
- */
-struct WeightPaintGroupData {
-       /** index of active group or its mirror 
-        *
-        * - 'active' is always `ob->actdef`.
-        * - 'mirror' is -1 when 'ME_EDIT_MIRROR_X' flag id disabled,
-        *   otherwise this will be set to the mirror or the active group (if 
the group isn't mirrored).
-        */
-       int index;
-       /** lock that includes the 'index' as locked too
-        *
-        * - 'active' is set of locked or active/selected groups
-        * - 'mirror' is set of locked or mirror groups
-        */
-       const bool *lock;
-};
-
 /* struct to avoid passing many args each call to do_weight_paint_vertex()
  * this _could_ be made a part of the operators 'WPaintData' struct, or at
  * least a member, but for now keep its own struct, initialized on every
@@ -1821,6 +1800,7 @@ static void 
vertex_paint_init_session_average_arrays(Object *ob){
  */
 static int wpaint_mode_toggle_exec(bContext *C, wmOperator *op)
 {              
+  //added
        Object *ob = CTX_data_active_object(C);
        const int mode_flag = OB_MODE_WEIGHT_PAINT;
        const bool is_mode_set = (ob->mode & mode_flag) != 0;
@@ -1865,7 +1845,7 @@ static int wpaint_mode_toggle_exec(bContext *C, 
wmOperator *op)
 
                if (wp == NULL)
                        wp = scene->toolsettings->wpaint = new_vpaint(1);
-
+    wp->radial_symm[0] = wp->radial_symm[1] = wp->radial_symm[2] = 1;
                paint_cursor_start(C, weight_paint_poll);
 
                BKE_paint_init(scene, ePaintWeight, PAINT_CURSOR_WEIGHT_PAINT);
@@ -1874,6 +1854,11 @@ static int wpaint_mode_toggle_exec(bContext *C, 
wmOperator *op)
                ED_mesh_mirror_spatial_table(ob, NULL, NULL, NULL, 's');
                ED_vgroup_sync_from_pose(ob);
 
+    /* Create vertex/weight paint mode session data */
+    if (ob->sculpt)
+      BKE_sculptsession_free(ob);
+
+    vertex_paint_init_session(scene, ob);
 
                /* Cache needs to be initialized before mesh_build_data is 
called. */
                ob->sculpt->cache = MEM_callocN(sizeof(StrokeCache), "stroke 
cache");
@@ -1932,37 +1917,6 @@ struct WPaintVGroupIndex {
        int mirror;
 };
 
-struct WPaintData {
-       ViewContext vc;
-       int *indexar;
-
-       struct WeightPaintGroupData active, mirror;
-
-       void *vp_handle;
-       DMCoNo *vertexcosnos;
-
-       float wpimat[3][3];
-
-       /* variables for auto normalize */
-       const bool *vgroup_validmap; /* stores if vgroups tie to deforming 
bones or not */
-       const bool *lock_flags;
-
-       /* variables for multipaint */
-       const bool *defbase_sel;      /* set of selected groups */
-       int defbase_tot_sel;          /* number of selected groups */
-       bool do_multipaint;           /* true if multipaint enabled and 
multiple groups selected */
-
-       /* variables for blur */
-       struct {
-               MeshElemMap *vmap;
-               int *vmap_mem;
-       } blur_data;
-
-       BLI_Stack *accumulate_stack;  /* for reuse (WPaintDefer) */
-
-       int defbase_tot;
-};
-
 /* ensure we have data on wpaint start, add if needed */
 static bool wpaint_ensure_data(
         bContext *C, wmOperator *op,
@@ -2365,8 +2319,145 @@ static float wpaint_blur_weight_calc_from_connected(
        return paintweight;
 }
 
+/* Flip all the editdata across the axis/axes specified by symm. Used to
+* calculate multiple modifications to the mesh when symmetry is enabled. */
+static void calc_brushdata_symm(VPaint *vd, StrokeCache *cache, const char 
symm,
+  const char axis, const float angle)
+{
+  (void)vd; /* unused */
+
+  flip_v3_v3(cache->location, cache->true_location, symm);
+  flip_v3_v3(cache->grab_delta_symmetry, cache->grab_delta, symm);
+  flip_v3_v3(cache->view_normal, cache->true_view_normal, symm);
+
+  /* XXX This reduces the length of the grab delta if it approaches the line 
of symmetry
+  * XXX However, a different approach appears to be needed */
+#if 0
+  if (sd->paint.symmetry_flags & SCULPT_SYMMETRY_FEATHER) {
+    float frac = 1.0f / max_overlap_count(sd);
+    float reduce = (feather - frac) / (1 - frac);
+
+    printf("feather: %f frac: %f reduce: %f\n", feather, frac, reduce);
+
+    if (frac < 1)
+      mul_v3_fl(cache->grab_delta_symmetry, reduce);
+  }
+#endif
+
+  unit_m4(cache->symm_rot_mat);
+  unit_m4(cache->symm_rot_mat_inv);
+  zero_v3(cache->plane_offset);
+
+  if (axis) { /* expects XYZ */
+    rotate_m4(cache->symm_rot_mat, axis, angle);
+    rotate_m4(cache->symm_rot_mat_inv, axis, -angle);
+  }
+
+  mul_m4_v3(cache->symm_rot_mat, cache->location);
+  mul_m4_v3(cache->symm_rot_mat, cache->grab_delta_symmetry);
+
+  if (cache->supports_gravity) {
+    flip_v3_v3(cache->gravity_direction, cache->true_gravity_direction, symm);
+    mul_m4_v3(cache->symm_rot_mat, cache->gravity_direction);
+  }
+
+  if (cache->is_rake_rotation_valid) {
+    flip_qt_qt(cache->rake_rotation_symmetry, cache->rake_rotation, symm);
+  }
+}
+
+static void wpaint_paint_leaves(Object *ob, Sculpt *sd, VPaint *vp, WPaintData 
*wpd, Mesh *me, PBVHNode **nodes, int totnode)
+{
+  Brush *brush = ob->sculpt->cache->brush;//BKE_paint_brush(&sd->paint);
+
+  /* threaded loop over nodes */
+  SculptThreadedTaskData data = {
+    .sd = sd, .ob = ob, .brush = brush, .nodes = nodes,
+  };
+
+  data.vp = vp;
+  data.wpd = wpd;
+  data.lcol = (unsigned int*)me->mloopcol;
+  data.me = me;
+
+  printf("Painting leaves\n");
+  //

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to