Dyntopo: avoid redundant lookup on original data

This commit is contained in:
Campbell Barton 2015-04-17 17:31:56 +10:00
parent 50522cba92
commit e05f719b8b
3 changed files with 32 additions and 13 deletions

@ -1086,6 +1086,24 @@ float BM_log_original_mask(BMLog *log, BMVert *v)
return lv->mask;
}
void BM_log_original_vert_data(
BMLog *log, BMVert *v,
const float **r_co, const short **r_no)
{
BMLogEntry *entry = log->current_entry;
const BMLogVert *lv;
unsigned v_id = bm_log_vert_id_get(log, v);
void *key = SET_UINT_IN_POINTER(v_id);
BLI_assert(entry);
BLI_assert(BLI_ghash_haskey(entry->modified_verts, key));
lv = BLI_ghash_lookup(entry->modified_verts, key);
*r_co = lv->co;
*r_no = lv->no;
}
/************************ Debugging and Testing ***********************/
/* For internal use only (unit testing) */

@ -96,6 +96,11 @@ const short *BM_log_original_vert_no(BMLog *log, BMVert *v);
/* Get the logged mask of a vertex */
float BM_log_original_mask(BMLog *log, BMVert *v);
/* Get the logged data of a vertex (avoid multiple lookups) */
void BM_log_original_vert_data(
BMLog *log, BMVert *v,
const float **r_co, const short **r_no);
/* For internal use only (unit testing) */
BMLogEntry *BM_log_current_entry(BMLog *log);
struct RangeTreeUInt *BM_log_unused_ids(BMLog *log);

@ -285,26 +285,22 @@ static void sculpt_orig_vert_data_update(SculptOrigVertData *orig_data,
PBVHVertexIter *iter)
{
if (orig_data->unode->type == SCULPT_UNDO_COORDS) {
if (orig_data->coords) {
if (orig_data->bm_log) {
BM_log_original_vert_data(
orig_data->bm_log, iter->bm_vert,
&orig_data->co, &orig_data->no);
}
else {
orig_data->co = orig_data->coords[iter->i];
}
else {
orig_data->co = BM_log_original_vert_co(orig_data->bm_log, iter->bm_vert);
}
if (orig_data->normals) {
orig_data->no = orig_data->normals[iter->i];
}
else {
orig_data->no = BM_log_original_vert_no(orig_data->bm_log, iter->bm_vert);
}
}
else if (orig_data->unode->type == SCULPT_UNDO_MASK) {
if (orig_data->vmasks) {
orig_data->mask = orig_data->vmasks[iter->i];
if (orig_data->bm_log) {
orig_data->mask = BM_log_original_mask(orig_data->bm_log, iter->bm_vert);
}
else {
orig_data->mask = BM_log_original_mask(orig_data->bm_log, iter->bm_vert);
orig_data->mask = orig_data->vmasks[iter->i];
}
}
}