[Bf-blender-cvs] [0d542db1e1d] temp_bmesh_multires: Sculpt dyntopo:

Joseph Eagar noreply at git.blender.org
Sat Aug 21 05:38:29 CEST 2021


Commit: 0d542db1e1d29dc40d4f1db7ce88f6256dfb513c
Author: Joseph Eagar
Date:   Fri Aug 20 20:36:04 2021 -0700
Branches: temp_bmesh_multires
https://developer.blender.org/rB0d542db1e1d29dc40d4f1db7ce88f6256dfb513c

Sculpt dyntopo:

* Fixed multires apply base feeding bad original coordinates to
  deform modifiers.
* Roughed out some code for cache performance testing.
* Wrote skeleton code for a PBVH texel API; hasn't been tested
  yet and may be removed.

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

M	source/blender/blenkernel/BKE_mesh.h
M	source/blender/blenkernel/BKE_pbvh.h
M	source/blender/blenkernel/CMakeLists.txt
M	source/blender/blenkernel/intern/multires_reshape.c
M	source/blender/blenkernel/intern/multires_reshape_util.c
M	source/blender/blenkernel/intern/pbvh_bmesh.c
A	source/blender/blenkernel/intern/pbvh_cache_test_main.c
A	source/blender/blenkernel/intern/pbvh_displacement.c
M	source/blender/editors/sculpt_paint/CMakeLists.txt
A	source/blender/editors/sculpt_paint/sculpt_displacement.c
A	source/blender/editors/sculpt_paint/sculpt_displacement.h
M	source/blender/modifiers/intern/MOD_correctivesmooth.c
M	source/blender/python/intern/bpy_msgbus.c

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

diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 60d4725b4f4..d3f960a4332 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -642,7 +642,7 @@ void BKE_mesh_calc_edges_tessface(struct Mesh *mesh);
 
 /* In DerivedMesh.cc */
 void BKE_mesh_wrapper_deferred_finalize(struct Mesh *me_eval,
-                                        const CustomData_MeshMasks *cd_mask_finalize);
+                                        const struct CustomData_MeshMasks *cd_mask_finalize);
 
 /* **** Depsgraph evaluation **** */
 
diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h
index 2f87895b262..05837f8f847 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -41,6 +41,12 @@ typedef struct SculptFaceRef {
   intptr_t i;
 } SculptFaceRef;
 
+#if 0
+typedef struct SculptLoopRef {
+  intptr_t i;
+} SculptLoopRef;
+#endif
+
 BLI_INLINE SculptVertRef BKE_pbvh_make_vref(intptr_t i)
 {
   SculptVertRef ret = {i};
@@ -745,6 +751,97 @@ void BKE_pbvh_update_vert_boundary(int cd_dyn_vert, int cd_faceset_offset, struc
 
 PBVHNode *BKE_pbvh_get_node_leaf_safe(PBVH *pbvh, int i);
 
+#if 0
+typedef enum {
+  SCULPT_TEXTURE_UV = 1 << 0,  // per-uv
+  // SCULPT_TEXTURE_PTEX?
+} SculptTextureType;
+
+typedef int TexLayerRef;
+
+/*
+Texture points are texels projected into 3d.
+*/
+typedef intptr_t TexPointRef;
+
+void *BKE_pbvh_get_tex_settings(PBVH *pbvh, PBVHNode *node, TexLayerRef vdm);
+void *BKE_pbvh_get_tex_data(PBVH *pbvh, PBVHNode *node, TexPointRef vdm);
+
+typedef struct SculptTextureDef {
+  SculptTextureType type;
+  int settings_size;
+
+  void (*build_begin)(PBVH *pbvh, PBVHNode *node, TexLayerRef vdm);
+
+  /*vdms can cache data per node, which is freed to maintain memory limit.
+    they store cache in the same structure they return in buildNodeData.*/
+  void (*freeCachedData)(PBVH *pbvh, PBVHNode *node, TexLayerRef vdm);
+  void (*ensuredCachedData)(PBVH *pbvh, PBVHNode *node, TexLayerRef vdm);
+
+  /*builds all data that isn't cached.*/
+  void *(*buildNodeData)(PBVH *pbvh, PBVHNode *node);
+  bool (*validate)(PBVH *pbvh, TexLayerRef vdm);
+
+  void (*getPointsFromNode)(PBVH *pbvh,
+                            PBVHNode *node,
+                            TexLayerRef vdm,
+                            TexPointRef **r_ids,
+                            float ***r_cos,
+                            float ***r_nos,
+                            int *r_totpoint);
+  void (*releaseNodePoints)(
+      PBVH *pbvh, PBVHNode *node, TexLayerRef vdm, TexPointRef *ids, float **cos, float **nos);
+
+#  if 0
+  int (*getTrisFromNode)(PBVH *pbvh,
+                         PBVHNode *node,
+                         TexLayerRef vdm,
+                         TexPointRef *((*r_tris)[3]),
+                         TexPointRef **r_ids,
+                         int tottri,
+                         int totid);
+  void (*getTriInterpWeightsFromNode)(PBVH *pbvh,
+                                      PBVHNode *node,
+                                      TexLayerRef vdm,
+                                      float *((*r_tris)[3]),
+                                      SculptLoopRef ***r_src_loops,
+                                      int tottri,
+                                      int totloop);
+  int (*getTriCount)(PBVH *pbvh, PBVHNode *node, TexLayerRef vdm);
+#  endif
+
+  void (*getPointNeighbors)(PBVH *pbvh,
+                            PBVHNode *node,
+                            TexLayerRef vdm,
+                            TexPointRef id,
+                            TexPointRef **r_neighbor_ids,
+                            int *r_totneighbor,
+                            int maxneighbors,
+                            TexPointRef **r_duplicates_id,
+                            int r_totduplicate,
+                            int maxduplicates);
+  void (*getPointValence)(PBVH *pbvh, PBVHNode *node, TexLayerRef vdm, TexPointRef id);
+  void (*freeNodeData)(PBVH *pbvh, PBVHNode *node, TexLayerRef vdm, void *settings);
+
+  void (*getPointsFromIds)(
+      PBVH *pbvh, PBVHNode *node, TexLayerRef vdm, TexPointRef *ids, int totid);
+
+  /*displacement texture stuff*/
+  // can be tangent, object space displacement, whatever
+  void (*worldToDelta)(PBVH *pbvh, PBVHNode *node, TexLayerRef vdm, TexPointRef *ids, int totid);
+  void (*deltaToWorld)(PBVH *pbvh, PBVHNode *node, TexLayerRef vdm, TexPointRef *ids, int totid);
+} SculptDisplacementDef;
+
+typedef struct SculptLayerEntry {
+  char name[64];
+  int type;
+  void *settings;
+  float factor;
+  struct SculptLayerEntry *parent;
+} SculptLayerEntry;
+
+#endif
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 21d12147c2c..953e670e892 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -235,6 +235,7 @@ set(SRC
   intern/particle_system.c
   intern/pbvh.c
   intern/pbvh_bmesh.c
+  intern/pbvh_displacement.c
   intern/pointcache.c
   intern/pointcloud.cc
   intern/preferences.c
@@ -792,3 +793,74 @@ if(WITH_GTESTS)
   include(GTestTesting)
   blender_add_test_lib(bf_blenkernel_tests "${TEST_SRC}" "${INC};${TEST_INC}" "${INC_SYS}" "${LIB}")
 endif()
+
+
+set(PBVH_CACHE_TEST_INC
+  .
+  ../blenfont
+  ../blenlib
+  ../blenloader
+  ../blentranslation
+  ../bmesh
+  ../depsgraph
+  ../draw
+  ../functions
+  ../gpencil_modifiers
+  ../gpu
+  ../ikplugin
+  ../imbuf
+  ../makesdna
+  ../makesrna
+  ../modifiers
+  ../nodes
+  ../render
+  ../sequencer
+  ../shader_fx
+  ../simulation
+  ../../../intern/eigen
+  ../../../intern/ghost
+  ../../../intern/glew-mx
+  ../../../intern/guardedalloc
+  ../../../intern/iksolver/extern
+  ../../../intern/atomic
+  ../../../intern/clog
+  ../../../intern/libmv
+  ../../../intern/mantaflow/extern
+  ../../../intern/memutil
+  ../../../intern/mikktspace
+  ../../../intern/opensubdiv
+  ../../../extern/curve_fit_nd
+)
+
+set(PBVH_CACHE_TEST_SRC
+  intern/pbvh_cache_test_main.c
+)
+
+setup_libdirs()
+
+add_executable(pbvh_cache_test ${PBVH_CACHE_TEST_SRC} ${PBVH_CACHE_TEST_INC})
+setup_platform_linker_flags(pbvh_cache_test)
+
+target_link_libraries(pbvh_cache_test bf_blenkernel bf_bmesh bf_intern_ghost bf_blenlib bf_intern_guardedalloc)
+
+if(WIN32)
+  set_target_properties(pbvh_cache_test PROPERTIES VS_GLOBAL_VcpkgEnabled "false")
+  set_target_properties(pbvh_cache_test PROPERTIES
+    PDB_NAME "pbvh_cache_test_private"
+    PDB_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>")
+    if(WITH_WINDOWS_PDB AND WITH_WINDOWS_STRIPPED_PDB)
+      # This is slightly messy, but single target generators like ninja will not have the
+      # CMAKE_CFG_INTDIR variable and multitarget generators like msbuild will not have
+      # CMAKE_BUILD_TYPE. This can be simplified by target_link_options and the $<CONFIG>
+      # generator expression in newer cmake (2.13+) but until that time this fill have suffice.
+      if(CMAKE_BUILD_TYPE)
+        set_property(TARGET pbvh_cache_test APPEND_STRING PROPERTY LINK_FLAGS  " /PDBSTRIPPED:${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/pbvh_cache_test_public.pdb")
+      else()
+        set_property(TARGET pbvh_cache_test APPEND_STRING PROPERTY LINK_FLAGS  " /PDBSTRIPPED:${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/pbvh_cache_test_public.pdb")
+      endif()
+  endif()
+endif()
+
+if (WIN32)
+target_link_libraries(pbvh_cache_test Vfw32.lib Imm32.lib Version.lib Comctl32.lib Shcore.lib Pathcch.lib)
+endif()
diff --git a/source/blender/blenkernel/intern/multires_reshape.c b/source/blender/blenkernel/intern/multires_reshape.c
index bd52d70b223..9dcc9544441 100644
--- a/source/blender/blenkernel/intern/multires_reshape.c
+++ b/source/blender/blenkernel/intern/multires_reshape.c
@@ -292,6 +292,12 @@ void multiresModifier_base_apply(struct Depsgraph *depsgraph,
   multires_reshape_apply_base_update_mesh_coords(&reshape_context);
   multires_reshape_apply_base_refit_base_mesh(&reshape_context);
 
+  /**
+   * Tag update so deform modifiers (e.g. smooth corrective)
+   * get updated original coordinates
+   */
+  DEG_id_tag_update((ID *)object, ID_RECALC_GEOMETRY);
+
   /* Reshape to the stored final state.
    * Not that the base changed, so the subdiv is to be refined to the new positions. Unfortunately,
    * this can not be done foe entirely cheap: if there were deformation modifiers prior to the
diff --git a/source/blender/blenkernel/intern/multires_reshape_util.c b/source/blender/blenkernel/intern/multires_reshape_util.c
index 8fb406e54a5..ce5dc488e67 100644
--- a/source/blender/blenkernel/intern/multires_reshape_util.c
+++ b/source/blender/blenkernel/intern/multires_reshape_util.c
@@ -315,6 +315,8 @@ void multires_reshape_free_original_grids(MultiresReshapeContext *reshape_contex
 
 void multires_reshape_context_free(MultiresReshapeContext *reshape_context)
 {
+  ModifierData *md;
+
   if (reshape_context->need_free_subdiv) {
     BKE_subdiv_free(reshape_context->subdiv);
   }
diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c
index 42d353eb0da..85ed314e370 100644
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@ -3395,3 +3395,190 @@ BMesh *BKE_pbvh_reorder_bmesh1(PBVH *pbvh)
 
   return pbvh->bm;
 }
+
+// only floats! and 8 byte aligned!
+typedef struct CacheParams {
+  float vchunk, echunk, lchunk, pchunk;
+  int cluster_steps, cluster_size;
+} CacheParams;
+
+typedef struct CacheParamDef {
+  char name[32];
+  float defvalue, min, max;
+} CacheParamDef;
+
+CacheParamDef pbvh_bmesh_cache_param_def[] = {{"vchunk", 512.0f, 256.0f, 1024.0f * 12.0f},
+                                              {"echunk", 512.0f, 256.0f, 1024.0f * 12.0f},
+                                              {"lchunk", 512.0f, 256.0f, 1024.0f * 12.0f},
+                                              {"pchunk", 512.0f, 256.0f, 1024.0f * 12.0f},
+                                              {"cluster_steps", 512.0f, 1.0f, 256.0f},
+                                              

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list