diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-09-06 16:39:27 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-09-07 12:54:20 +0300 |
commit | dfeff72af71c1f3a62805253e439cf8ffd3815e6 (patch) | |
tree | d9fdf5e9bd92bcc8e9682b3a4b5cb237723e2434 /source/blender/blenkernel/intern/subdiv.c | |
parent | cbab3e1e908792a2c9aa1266805ba59e8368727a (diff) |
Subdiv: Add ptex offsets to a subdiv structure
This is something what we need to know quite often from various places.
Added it as a cached value in Subdiv itself, so it can be queried easily
from any area.
Shouldn't be a problem from memory usage point of view, it's 4MB per
1M faces coarse mesh. This is very low percentage of mesh itself, and
even lower percentage of highres subdivided mesh.
Diffstat (limited to 'source/blender/blenkernel/intern/subdiv.c')
-rw-r--r-- | source/blender/blenkernel/intern/subdiv.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/subdiv.c b/source/blender/blenkernel/intern/subdiv.c index f847d62018a..82275b7305f 100644 --- a/source/blender/blenkernel/intern/subdiv.c +++ b/source/blender/blenkernel/intern/subdiv.c @@ -118,5 +118,28 @@ void BKE_subdiv_free(Subdiv *subdiv) openSubdiv_deleteTopologyRefiner(subdiv->topology_refiner); } BKE_subdiv_displacement_detach(subdiv); + if (subdiv->cache_.face_ptex_offset != NULL) { + MEM_freeN(subdiv->cache_.face_ptex_offset); + } MEM_freeN(subdiv); } + +int *BKE_subdiv_face_ptex_offset_get(Subdiv *subdiv) +{ + if (subdiv->cache_.face_ptex_offset != NULL) { + return subdiv->cache_.face_ptex_offset; + } + const int num_coarse_faces = + subdiv->topology_refiner->getNumFaces(subdiv->topology_refiner); + subdiv->cache_.face_ptex_offset = MEM_malloc_arrayN( + num_coarse_faces, sizeof(int), "subdiv face_ptex_offset"); + int ptex_offset = 0; + for (int face_index = 0; face_index < num_coarse_faces; face_index++) { + const int num_ptex_faces = + subdiv->topology_refiner->getNumFacePtexFaces( + subdiv->topology_refiner, face_index); + subdiv->cache_.face_ptex_offset[face_index] = ptex_offset; + ptex_offset += num_ptex_faces; + } + return subdiv->cache_.face_ptex_offset; +} |