[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