[Bf-blender-cvs] [9dbf3b9fab2] sculpt-dev: Array Brush: Implement array instances datalayer

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


Commit: 9dbf3b9fab24c18a3bd12eae5b9569881048b7d2
Author: Pablo Dobarro
Date:   Fri Jul 2 22:10:21 2021 +0200
Branches: sculpt-dev
https://developer.blender.org/rB9dbf3b9fab24c18a3bd12eae5b9569881048b7d2

Array Brush: Implement array instances datalayer

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

M	source/blender/editors/sculpt_paint/sculpt_array.c
M	source/blender/editors/sculpt_paint/sculpt_intern.h

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

diff --git a/source/blender/editors/sculpt_paint/sculpt_array.c b/source/blender/editors/sculpt_paint/sculpt_array.c
index 771e82e8330..0983562fa95 100644
--- a/source/blender/editors/sculpt_paint/sculpt_array.c
+++ b/source/blender/editors/sculpt_paint/sculpt_array.c
@@ -62,6 +62,7 @@ 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
+#define ARRAY_INSTANCE_ORIGINAL -1 
 
 static void sculpt_array_modify_sculpt_mesh(Object *ob, Mesh *array_mesh)
 {
@@ -103,6 +104,20 @@ static BMesh *sculpt_array_source_mesh_calculate(Sculpt *sd, Object *ob) {
   Mesh *sculpt_mesh = BKE_object_get_original_mesh(ob);
   const int totvert = SCULPT_vertex_count_get(ss);
 
+  int *v_array_instance = CustomData_add_layer_named(&sculpt_mesh->vdata,
+                                                    CD_PROP_INT32,
+                                                    CD_CALLOC,
+                                                    NULL,
+                                                    sculpt_mesh->totvert,
+                                                    array_instance_cd_name);
+
+  for (int i = 0; i < sculpt_mesh->totvert; i++) {
+    v_array_instance[i] = ARRAY_INSTANCE_ORIGINAL;
+  }
+
+  printf("ARRAY INSTANCE SET\n");
+
+
   BMesh *srcbm;
   const BMAllocTemplate allocsizea = BMALLOC_TEMPLATE_FROM_ME(sculpt_mesh);
   srcbm = BM_mesh_create(&allocsizea,
@@ -177,18 +192,54 @@ static BMesh *sculpt_array_source_mesh_calculate(Sculpt *sd, Object *ob) {
   CustomData_bmesh_merge(&srcbm->ldata, &destbm->ldata, &CD_MASK_BMESH, 0, destbm, BM_LOOP);
   */
 
+
+  printf("GET LAYER INDEX\n");
+
+  const int cd_array_instance_index = CustomData_get_named_layer_index(
+      &srcbm->vdata, CD_PROP_INT32, array_instance_cd_name);
+
+  printf("DONE\n");
+
+  if (cd_array_instance_index == -1) {
+      printf("NO DATALAYER INDEX\n");
+  }
+
+  printf("GET LAYER OFFSET\n");
+
+  const int cd_array_instance_offset = CustomData_get_n_offset(
+      &srcbm->vdata, CD_PROP_INT32, cd_array_instance_index);
+
+  printf("DONE\n");
+
+  if (cd_array_instance_offset == -1) {
+      printf("NO DATALAYER offset\n");
+  }
+
+
   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);
+
+  BM_mesh_elem_table_ensure(srcbm, BM_VERT);
+  BM_mesh_elem_index_ensure(srcbm, BM_VERT); 
 
   for (int i = 0; i < SCUPT_ARRAY_COUNT; i++) {
+  	for (int j = 0; j < srcbm->totvert; j++) {
+		BMVert *vert = BM_vert_at_index(srcbm, j);
+		printf("SET INDEX %d\n", i);
+		BM_ELEM_CD_SET_INT(vert, cd_array_instance_offset, i);
+  	}
+  	const int opflag = (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE);
+        //CustomData_bmesh_merge(&srcbm->vdata, &destbm->vdata, &CD_MASK_BMESH.vmask, 0, destbm, BM_VERT);
+        BM_mesh_copy_init_customdata(destbm, srcbm, &bm_mesh_allocsize_default);
   	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;
@@ -207,9 +258,48 @@ void SCULPT_do_array_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode
 	sculpt_array_source_mesh_calculate(sd, ob);
 	
 	/* Insert copies and prepare datalayers. */
+
+        Mesh *sculpt_mesh = BKE_object_get_original_mesh(ob);
+	int *cd_array_instance = CustomData_get_layer_named(
+      &sculpt_mesh->vdata, CD_PROP_INT32, array_instance_cd_name);
+
+	if (!cd_array_instance) {
+		printf("NO CD LAYER\n");
+		return;
+	}
+
+	const int totvert = SCULPT_vertex_count_get(ss);
+
+	for (int i = 0; i < totvert; i++) {
+		const int array_index = cd_array_instance[i];
+		//printf("array index %d\n", array_index);
+	}
 	return;
   }
+   
+
+    Mesh *sculpt_mesh = BKE_object_get_original_mesh(ob);
+    int *cd_array_instance = CustomData_get_layer_named(
+    &sculpt_mesh->vdata, CD_PROP_INT32, array_instance_cd_name);
+   const int totvert = SCULPT_vertex_count_get(ss);
+
+   if (!ss->cache->array_orco) {
+  ss->cache->array_orco = MEM_calloc_arrayN(sculpt_mesh->totvert, sizeof(float) * 3, "array orco");
+  for (int i = 0; i < sculpt_mesh->totvert; i++) {
+	copy_v3_v3(ss->cache->array_orco[i], sculpt_mesh->mvert[i].co);
+  }
+
 
-  return;
+   }
+
+   for (int i = 0; i < totvert; i++) {
+   	const int array_index = cd_array_instance[i];
+	const float fade = ((float)array_index + 1.0f) / (float)(SCUPT_ARRAY_COUNT);
+	madd_v3_v3v3fl(ss->mvert[i].co, ss->cache->array_orco[i], ss->cache->grab_delta_symmetry, fade);
+   }
+ 
+  for (int i = 0; i < totnode; i++) {
+    BKE_pbvh_node_mark_update(nodes[i]);
+  }
 
 }
\ No newline at end of file
diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h
index 90fae3d024c..a981911e5b4 100644
--- a/source/blender/editors/sculpt_paint/sculpt_intern.h
+++ b/source/blender/editors/sculpt_paint/sculpt_intern.h
@@ -981,6 +981,9 @@ typedef struct StrokeCache {
   /* Multires Displacement Smear. */
   float (*prev_displacement)[3];
   float (*limit_surface_co)[3];
+  
+  /* Array brush. */
+  float (*array_orco)[3];
 
   /* The rest is temporary storage that isn't saved as a property */



More information about the Bf-blender-cvs mailing list