[Bf-blender-cvs] [4f8c63e77b7] sculpt-dev: Array Brush: BMesh duplication working

Pablo Dobarro noreply at git.blender.org
Fri Jul 2 22:20:20 CEST 2021


Commit: 4f8c63e77b7f0ed2709ceffc218c6093a13a871c
Author: Pablo Dobarro
Date:   Fri Jul 2 19:52:58 2021 +0200
Branches: sculpt-dev
https://developer.blender.org/rB4f8c63e77b7f0ed2709ceffc218c6093a13a871c

Array Brush: BMesh duplication working

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

A	source/blender/editors/sculpt_paint/sculpt_array.c

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

diff --git a/source/blender/editors/sculpt_paint/sculpt_array.c b/source/blender/editors/sculpt_paint/sculpt_array.c
new file mode 100644
index 00000000000..771e82e8330
--- /dev/null
+++ b/source/blender/editors/sculpt_paint/sculpt_array.c
@@ -0,0 +1,215 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2020 Blender Foundation.
+ * All rights reserved.
+ */
+
+/** \file
+ * \ingroup edsculpt
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_math.h"
+#include "BLI_task.h"
+
+#include "DNA_brush_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+
+#include "BKE_brush.h"
+#include "BKE_ccg.h"
+#include "BKE_colortools.h"
+#include "BKE_context.h"
+#include "BKE_mesh.h"
+#include "BKE_multires.h"
+#include "BKE_node.h"
+#include "BKE_object.h"
+#include "BKE_paint.h"
+#include "BKE_pbvh.h"
+#include "BKE_scene.h"
+
+#include "paint_intern.h"
+#include "sculpt_intern.h"
+
+#include "GPU_immediate.h"
+#include "GPU_immediate_util.h"
+#include "GPU_matrix.h"
+#include "GPU_state.h"
+
+#include "bmesh.h"
+
+#include <math.h>
+#include <stdlib.h>
+
+
+static const char array_symmetry_pass_cd_name[] = "v_symmetry_pass";
+static const char array_instance_cd_name[] = "v_array_instance";
+
+#define SCUPT_ARRAY_COUNT 5
+
+static void sculpt_array_modify_sculpt_mesh(Object *ob, Mesh *array_mesh)
+{
+  SculptSession *ss = ob->sculpt;	
+  Mesh *sculpt_mesh = BKE_object_get_original_mesh(ob);
+  BMesh *bm;
+  const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_ME(sculpt_mesh, array_mesh);
+  bm = BM_mesh_create(&allocsize,
+                      &((struct BMeshCreateParams){
+                          .use_toolflags = false,
+                      }));
+
+  BM_mesh_bm_from_me(bm,
+                     sculpt_mesh,
+                     &((struct BMeshFromMeshParams){
+                         .calc_face_normal = true,
+                     }));
+
+  BM_mesh_bm_from_me(bm,
+                     array_mesh,
+                     &((struct BMeshFromMeshParams){
+                         .calc_face_normal = true,
+                     }));
+
+
+  Mesh *result = BKE_mesh_from_bmesh_for_eval_nomain(bm, NULL, sculpt_mesh);
+  BM_mesh_free(bm);
+  result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
+  BKE_mesh_nomain_to_mesh(result, ob->data, ob, &CD_MASK_MESH, true);
+  BKE_mesh_free(result);
+  BKE_mesh_batch_cache_dirty_tag(ob->data, BKE_MESH_BATCH_DIRTY_ALL);
+  ss->needs_pbvh_rebuild = true;
+}
+
+
+const float source_geometry_threshold = 0.5f;
+static BMesh *sculpt_array_source_mesh_calculate(Sculpt *sd, Object *ob) {
+  SculptSession *ss = ob->sculpt;
+  Mesh *sculpt_mesh = BKE_object_get_original_mesh(ob);
+  const int totvert = SCULPT_vertex_count_get(ss);
+
+  BMesh *srcbm;
+  const BMAllocTemplate allocsizea = BMALLOC_TEMPLATE_FROM_ME(sculpt_mesh);
+  srcbm = BM_mesh_create(&allocsizea,
+                      &((struct BMeshCreateParams){
+                          .use_toolflags = true,
+                      }));
+
+  BM_mesh_bm_from_me(srcbm,
+                     sculpt_mesh,
+                     &((struct BMeshFromMeshParams){
+                         .calc_face_normal = true,
+                     }));
+
+  BM_mesh_elem_table_ensure(srcbm, BM_VERT);
+  BM_mesh_elem_index_ensure(srcbm, BM_VERT); 
+
+  for (int i = 0; i < srcbm->totvert; i++) {
+	const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, i);
+	const float mask = 1.0f - SCULPT_vertex_mask_get(ss, i);
+	const float influence = mask * automask;
+	if (influence >= source_geometry_threshold) {
+		continue;
+	}
+	BMVert *vert = BM_vert_at_index(srcbm, i);
+	BM_elem_flag_set(vert, BM_ELEM_TAG, true);
+  }
+
+  /* TODO: Handle individual Face Sets for Face Set automasking. */
+  BM_mesh_delete_hflag_context(srcbm, BM_ELEM_TAG, DEL_VERTS);
+  
+  
+  /*
+  BMO_op_callf(srcbm,
+               (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE),
+               "duplicate geom=%hvef use_select_history=%b use_edge_flip_from_face=%b",
+               BM_ELEM_TAG, false, false);
+	       */
+	       
+
+
+  //CustomData_bmesh_merge(&srcbm->vdata, &destbm->vdata, CD_NA, 0, destbm, BM_VERT).
+
+  
+  
+  BMesh *destbm;
+  const BMAllocTemplate allocsizeb = BMALLOC_TEMPLATE_FROM_ME(sculpt_mesh);
+  destbm = BM_mesh_create(&allocsizeb,
+                      &((struct BMeshCreateParams){
+                          .use_toolflags = true,
+                      }));
+
+  BM_mesh_bm_from_me(destbm,
+                     sculpt_mesh,
+                     &((struct BMeshFromMeshParams){
+                         .calc_face_normal = true,
+                     }));
+
+/*
+  BM_mesh_elem_table_ensure(srcbm, BM_VERT);
+  BM_mesh_elem_index_ensure(srcbm, BM_VERT); 
+  for (int i = 0; i < srcbm->totvert; i++) {
+	BMVert *vert = BM_vert_at_index(srcbm, i);
+	BM_elem_flag_set(vert, BM_ELEM_TAG, true);
+	BM_elem_flag_set(vert, BM_ELEM_SELECT, true);
+  }
+  */
+
+/*
+  CustomData_bmesh_merge(&srcbm->vdata, &destbm->vdata, &CD_MASK_BMESH, 0, destbm, BM_VERT);
+  CustomData_bmesh_merge(&srcbm->edata, &destbm->edata, &CD_MASK_BMESH, 0, destbm, BM_EDGE);
+  CustomData_bmesh_merge(&srcbm->pdata, &destbm->pdata, &CD_MASK_BMESH, 0, destbm, BM_FACE);
+  CustomData_bmesh_merge(&srcbm->ldata, &destbm->ldata, &CD_MASK_BMESH, 0, destbm, BM_LOOP);
+  */
+
+  BM_mesh_elem_toolflags_ensure(destbm);
+  BM_mesh_copy_init_customdata(destbm, srcbm, &bm_mesh_allocsize_default);
+  const int opflag = (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE);
+
+  for (int i = 0; i < SCUPT_ARRAY_COUNT; i++) {
+  	BMO_op_callf(srcbm, opflag, "duplicate geom=%avef dest=%p", destbm);
+  }
+
+  Mesh *result = BKE_mesh_from_bmesh_for_eval_nomain(destbm, NULL, sculpt_mesh);
+  result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
+  BKE_mesh_nomain_to_mesh(result, ob->data, ob, &CD_MASK_MESH, true);
+
+  BKE_mesh_free(result);
+  BKE_mesh_batch_cache_dirty_tag(ob->data, BKE_MESH_BATCH_DIRTY_ALL);
+  ss->needs_pbvh_rebuild = true;
+
+  return srcbm;
+}
+
+void SCULPT_do_array_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
+{
+  SculptSession *ss = ob->sculpt;
+  Brush *brush = BKE_paint_brush(&sd->paint);
+
+
+  if (SCULPT_stroke_is_first_brush_step(ss->cache)) {
+	/* Calculate source array mesh. */
+	sculpt_array_source_mesh_calculate(sd, ob);
+	
+	/* Insert copies and prepare datalayers. */
+	return;
+  }
+
+  return;
+
+}
\ No newline at end of file



More information about the Bf-blender-cvs mailing list