diff options
author | Joseph Eagar <joeedh@gmail.com> | 2020-10-24 03:19:47 +0300 |
---|---|---|
committer | Joseph Eagar <joeedh@gmail.com> | 2020-10-24 03:19:47 +0300 |
commit | 6c9c7f14ec87c62ff5eca5e200640b4bd6ccdedf (patch) | |
tree | f0abb70051b1801b932e037ed74969bb9af38fdd /source/blender/editors/sculpt_paint/sculpt_dyntopo.c | |
parent | 8f6326d494fad50305e406557dee7d2d2cb44dd3 (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.c | 70 |
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 { |