Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Eagar <joeedh@gmail.com>2020-10-24 03:19:47 +0300
committerJoseph Eagar <joeedh@gmail.com>2020-10-24 03:19:47 +0300
commit6c9c7f14ec87c62ff5eca5e200640b4bd6ccdedf (patch)
treef0abb70051b1801b932e037ed74969bb9af38fdd /source/blender/editors/sculpt_paint/sculpt_dyntopo.c
parent8f6326d494fad50305e406557dee7d2d2cb44dd3 (diff)
* Migrated optimizations from trimesh to bmesh dyntopo:
- Original coordinate/normals are now stored in customdata layers, instead of being looked up in the BMLog - Vertex "indices" are now actually pointers to BMVerts. - Dyntopo split/collapse is now time-limited - Increased pbvh->leaf_limit to 2000 - Nodes are split after topolgy updates, not just after the user lets up the mouse. * Also, renamed TMElemSet to TableGSet TODO: - Migrate PBVHNode->bm_[unique_verts/other_verts/faces] to TableGSet. Currently GHash is completely inlined in this branch which does almost the same thing performance-size; inlining GHash seems beyond the scope of this project however.
Diffstat (limited to 'source/blender/editors/sculpt_paint/sculpt_dyntopo.c')
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_dyntopo.c70
1 files changed, 57 insertions, 13 deletions
diff --git a/source/blender/editors/sculpt_paint/sculpt_dyntopo.c b/source/blender/editors/sculpt_paint/sculpt_dyntopo.c
index 525b10b3661..ac48f928da9 100644
--- a/source/blender/editors/sculpt_paint/sculpt_dyntopo.c
+++ b/source/blender/editors/sculpt_paint/sculpt_dyntopo.c
@@ -292,19 +292,68 @@ void SCULPT_dynamic_topology_disable(bContext *C, SculptUndoNode *unode)
}
#else
+void SCULPT_dyntopo_save_origverts(SculptSession *ss)
+{
+ BMIter iter;
+ BMVert *v;
+
+ BM_ITER_MESH (v, &iter, ss->bm, BM_VERTS_OF_MESH) {
+ float *co = BM_ELEM_CD_GET_VOID_P(v, ss->cd_origco_offset);
+ float *no = BM_ELEM_CD_GET_VOID_P(v, ss->cd_origno_offset);
+
+ copy_v3_v3(co, v->co);
+ copy_v3_v3(co, v->no);
+ }
+}
+
void SCULPT_dyntopo_node_layers_add(SculptSession *ss)
{
- int cd_node_layer_index;
+ int cd_node_layer_index, cd_face_node_layer_index;
char layer_id[] = "_dyntopo_node_id";
+ char origco_id[] = "_dyntopop_orig_co";
+ char origno_id[] = "_dyntopop_orig_no";
+
+ int cd_origco_index, cd_origno_index;
+
+ cd_origco_index = CustomData_get_named_layer_index(&ss->bm->vdata, CD_PROP_FLOAT3, origco_id);
+ if (cd_origco_index == -1) {
+ BM_data_layer_add_named(ss->bm, &ss->bm->vdata, CD_PROP_FLOAT3, origco_id);
+ }
+
+ cd_origno_index = CustomData_get_named_layer_index(&ss->bm->vdata, CD_PROP_FLOAT3, origno_id);
+ if (cd_origno_index == -1) {
+ BM_data_layer_add_named(ss->bm, &ss->bm->vdata, CD_PROP_FLOAT3, origno_id);
+ }
cd_node_layer_index = CustomData_get_named_layer_index(&ss->bm->vdata, CD_PROP_INT32, layer_id);
if (cd_node_layer_index == -1) {
BM_data_layer_add_named(ss->bm, &ss->bm->vdata, CD_PROP_INT32, layer_id);
- cd_node_layer_index = CustomData_get_named_layer_index(
- &ss->bm->vdata, CD_PROP_INT32, layer_id);
}
+ cd_face_node_layer_index = CustomData_get_named_layer_index(&ss->bm->pdata, CD_PROP_INT32, layer_id);
+ if (cd_face_node_layer_index == -1) {
+ BM_data_layer_add_named(ss->bm, &ss->bm->pdata, CD_PROP_INT32, layer_id);
+ }
+
+ //get indices again, as they might have changed after adding new layers
+ cd_origco_index = CustomData_get_named_layer_index(&ss->bm->vdata, CD_PROP_FLOAT3, origco_id);
+ cd_origno_index = CustomData_get_named_layer_index(&ss->bm->vdata, CD_PROP_FLOAT3, origno_id);
+ cd_node_layer_index = CustomData_get_named_layer_index(&ss->bm->vdata, CD_PROP_INT32, layer_id);
+ cd_face_node_layer_index = CustomData_get_named_layer_index(&ss->bm->pdata, CD_PROP_INT32, layer_id);
+
+ ss->cd_origco_offset = CustomData_get_n_offset(
+ &ss->bm->vdata,
+ CD_PROP_FLOAT3,
+ cd_origco_index - CustomData_get_layer_index(&ss->bm->vdata, CD_PROP_FLOAT3));
+ ss->bm->vdata.layers[cd_origco_index].flag |= CD_FLAG_TEMPORARY;
+
+ ss->cd_origno_offset = CustomData_get_n_offset(
+ &ss->bm->vdata,
+ CD_PROP_FLOAT3,
+ cd_origno_index - CustomData_get_layer_index(&ss->bm->vdata, CD_PROP_FLOAT3));
+ ss->bm->vdata.layers[cd_origno_index].flag |= CD_FLAG_TEMPORARY;
+
ss->cd_vert_node_offset = CustomData_get_n_offset(
&ss->bm->vdata,
CD_PROP_INT32,
@@ -312,19 +361,14 @@ void SCULPT_dyntopo_node_layers_add(SculptSession *ss)
ss->bm->vdata.layers[cd_node_layer_index].flag |= CD_FLAG_TEMPORARY;
- cd_node_layer_index = CustomData_get_named_layer_index(&ss->bm->pdata, CD_PROP_INT32, layer_id);
- if (cd_node_layer_index == -1) {
- BM_data_layer_add_named(ss->bm, &ss->bm->pdata, CD_PROP_INT32, layer_id);
- cd_node_layer_index = CustomData_get_named_layer_index(
- &ss->bm->pdata, CD_PROP_INT32, layer_id);
- }
-
ss->cd_face_node_offset = CustomData_get_n_offset(
&ss->bm->pdata,
CD_PROP_INT32,
- cd_node_layer_index - CustomData_get_layer_index(&ss->bm->pdata, CD_PROP_INT32));
+ cd_face_node_layer_index - CustomData_get_layer_index(&ss->bm->pdata, CD_PROP_INT32));
+
+ ss->bm->pdata.layers[cd_face_node_layer_index].flag |= CD_FLAG_TEMPORARY;
- ss->bm->pdata.layers[cd_node_layer_index].flag |= CD_FLAG_TEMPORARY;
+ SCULPT_dyntopo_save_origverts(ss);
}
void SCULPT_dynamic_topology_enable_ex(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob)
@@ -514,7 +558,7 @@ static int sculpt_dynamic_topology_toggle_exec(bContext *C, wmOperator *UNUSED(o
WM_cursor_wait(true);
- if (ss->tm) {
+ if (ss->tm || ss->bm) {
sculpt_dynamic_topology_disable_with_undo(bmain, depsgraph, scene, ob);
}
else {