From 0c918213646734acbbda110dca3fa2e2198b3894 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Wed, 14 Mar 2012 06:31:24 +0000 Subject: [PATCH] Add new CCG accessor functions. ccg_gridsize() converts a level into gridsize, ccg_factor() is for converting coordinates between different multires levels. --- source/blender/blenkernel/BKE_subsurf.h | 10 ++++++++++ source/blender/blenkernel/intern/CCGSubSurf.c | 11 ++++++++++- source/blender/blenkernel/intern/subsurf_ccg.c | 1 - 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/source/blender/blenkernel/BKE_subsurf.h b/source/blender/blenkernel/BKE_subsurf.h index 7f4ff1bf2e3..bc333f8fd66 100644 --- a/source/blender/blenkernel/BKE_subsurf.h +++ b/source/blender/blenkernel/BKE_subsurf.h @@ -31,6 +31,9 @@ * \ingroup bke */ +/* struct DerivedMesh is used directly */ +#include "BKE_DerivedMesh.h" + struct DMFlagMat; struct DMGridAdjacency; struct DMGridData; @@ -61,6 +64,13 @@ struct DerivedMesh *subsurf_make_derived_from_derived( void subsurf_calculate_limit_positions(struct Mesh *me, float (*positions_r)[3]); +/* get gridsize from 'level', level must be greater than zero */ +int ccg_gridsize(int level); + +/* x/y grid coordinates at 'low_level' can be multiplied by the result + of this function to convert to grid coordinates at 'high_level' */ +int ccg_factor(int low_level, int high_level); + /**************************** Internal *****************************/ typedef struct CCGDerivedMesh { diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c index 7cee0272e4b..f0075217102 100644 --- a/source/blender/blenkernel/intern/CCGSubSurf.c +++ b/source/blender/blenkernel/intern/CCGSubSurf.c @@ -8,6 +8,7 @@ #include #include "CCGSubSurf.h" +#include "BKE_subsurf.h" #include "MEM_guardedalloc.h" #include "BLO_sys_types.h" // for intptr_t support @@ -227,7 +228,7 @@ static CCGAllocatorIFC *_getStandardAllocatorIFC(void) /***/ -static int ccg_gridsize(int level) +int ccg_gridsize(int level) { BLI_assert(level > 0); BLI_assert(level <= 31); @@ -235,6 +236,14 @@ static int ccg_gridsize(int level) return (1 << (level - 1)) + 1; } +int ccg_factor(int low_level, int high_level) +{ + BLI_assert(low_level > 0 && high_level > 0); + BLI_assert(low_level <= high_level); + + return 1 << (high_level - low_level); +} + static int ccg_edgesize(int level) { BLI_assert(level > 0); diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index dbce2e144f2..401f678344b 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -3388,4 +3388,3 @@ void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]) dm->release(dm); } -