34 return 1 << (high_level - low_level);
49 v->numEdges =
v->numFaces = 0;
62 for (
int i = 0;
i <
v->numEdges;
i++) {
63 if (
v->edges[
i] ==
e) {
64 v->edges[
i] =
v->edges[--
v->numEdges];
71 for (
int i = 0;
i <
v->numFaces;
i++) {
72 if (
v->faces[
i] == f) {
73 v->faces[
i] =
v->faces[--
v->numFaces];
81 ss,
v->edges, (
v->numEdges + 1) *
sizeof(*
v->edges),
v->numEdges *
sizeof(*
v->edges)));
82 v->edges[
v->numEdges++] =
e;
87 ss,
v->faces, (
v->numFaces + 1) *
sizeof(*
v->faces),
v->numFaces *
sizeof(*
v->faces)));
88 v->faces[
v->numFaces++] = f;
92 for (
int i = 0;
i <
v->numEdges;
i++) {
94 if ((
e->v0 ==
v &&
e->v1 == vQ) || (
e->v1 ==
v &&
e->v0 == vQ)) {
142 for (
int i = 0;
i <
e->numFaces;
i++) {
143 if (
e->faces[
i] == f) {
144 e->faces[
i] =
e->faces[--
e->numFaces];
152 ss,
e->faces, (
e->numFaces + 1) *
sizeof(*
e->faces),
e->numFaces *
sizeof(*
e->faces)));
153 e->faces[
e->numFaces++] = f;
185 int num_face_data = (numVerts * maxGridSize + numVerts * maxGridSize * maxGridSize + 1);
197 for (
int i = 0;
i < numVerts;
i++) {
239 if (subdivLevels < 1) {
310 allocatorIFC.
release(allocator);
315 int allowEdgeCreation,
316 float defaultCreaseValue,
317 void *defaultUserData)
327 if (defaultUserData) {
337 int *allowEdgeCreation_r,
338 float *defaultCreaseValue_r,
339 void *defaultUserData_r)
341 if (allowEdgeCreation_r) {
345 if (defaultCreaseValue_r) {
348 if (defaultUserData_r) {
356 if (subdivisionLevels <= 0) {
375 int *vertUserOffset_r,
376 int *edgeUserOffset_r,
377 int *faceUserOffset_r)
381 if (vertUserOffset_r) {
384 if (edgeUserOffset_r) {
387 if (faceUserOffset_r) {
393 CCGSubSurf *ss,
int useAgeCounts,
int vertUserOffset,
int edgeUserOffset,
int faceUserOffset)
417 if (useVertNormals) {
494 if (!
v ||
v->numFaces ||
v->numEdges) {
513 if (!
e ||
e->numFaces) {
554 static_cast<const float *
>(vertData),
560 static_cast<const float *
>(vertData),
568 static_cast<const float *
>(vertData),
572 for (
i = 0;
i <
v->numEdges;
i++) {
577 for (
i = 0;
i <
v->numFaces;
i++) {
594 static_cast<const float *
>(vertData),
600 static_cast<const float *
>(vertData),
608 static_cast<const float *
>(vertData),
637 if (!
e ||
e->v0->vHDL != e_vHDL0 ||
e->v1->vHDL != e_vHDL1 || crease !=
e->crease) {
641 eNew =
_edge_new(eHDL, v0, v1, crease, ss);
645 eNew->next =
e->next;
666 if (!
e ||
e->v0->vHDL != e_vHDL0 ||
e->v1->vHDL != e_vHDL1 ||
e->crease != crease) {
696 int j, k, topologyChanged = 0;
709 for (k = 0; k < numVerts; k++) {
712 for (k = 0; k < numVerts; k++) {
725 if (!f || topologyChanged) {
732 fNew->next = f->
next;
741 for (k = 0; k < numVerts; k++) {
756 for (k = 0; k < numVerts; k++) {
763 for (k = 0; k < numVerts; k++) {
797 if (!f || topologyChanged) {
802 for (k = 0; k < numVerts; k++) {
812 for (j = 0; j < f->numVerts; j++) {
814 for (k = 0; k < f->numVerts; k++) {
870 if (*
faces ==
nullptr) {
876 for (; f; f = f->
next) {
900 int numV, numE,
i, j;
906 for (
i = 0;
i < numFaces;
i++) {
914 for (;
v;
v =
v->next) {
915 for (j = 0; j <
v->numFaces; j++) {
921 if (j ==
v->numFaces) {
931 for (;
e;
e =
e->next) {
932 for (j = 0; j <
e->numFaces; j++) {
938 if (j ==
e->numFaces) {
953 int i, S,
x, gridSize, cornerIdx, subdivLevels;
957 lvl = (lvl) ? lvl : subdivLevels;
959 cornerIdx = gridSize - 1;
963 for (
i = 0;
i < numEffectedF;
i++) {
974 for (
x = 0;
x < gridSize;
x++) {
978 for (
x = 0;
x < gridSize;
x++) {
979 int eI = gridSize - 1 -
x;
1001 int i, S,
x, gridSize, cornerIdx, subdivLevels;
1005 lvl = (lvl) ? lvl : subdivLevels;
1007 cornerIdx = gridSize - 1;
1011 for (
i = 0;
i < numEffectedF;
i++) {
1014 for (S = 0; S < f->
numVerts; S++) {
1019 for (
x = 0;
x < gridSize;
x++) {
1020 int eI = gridSize - 1 -
x;
1022 static_cast<const float *
>(
1026 static_cast<const float *
>(
1031 for (
x = 1;
x < gridSize - 1;
x++) {
1053 int numEffectedV, numEffectedE, freeF;
1054 int i, S,
x, gridSize, cornerIdx, subdivLevels, edgeSize;
1058 lvl = (lvl) ? lvl : subdivLevels;
1061 cornerIdx = gridSize - 1;
1065 ss, effectedF, numEffectedF, &effectedV, &numEffectedV, &effectedE, &numEffectedE);
1068 for (
i = 0;
i < numEffectedV;
i++) {
1075 for (
i = 0;
i < numEffectedE;
i++) {
1079 for (
x = 0;
x < edgeSize;
x++) {
1086 for (
i = 0;
i < numEffectedF;
i++) {
1091 for (S = 0; S < f->
numVerts; S++) {
1092 for (
x = 0;
x < gridSize;
x++) {
1097 for (S = 0; S < f->
numVerts; S++) {
1109 for (
x = 1;
x < gridSize - 1;
x++) {
1114 for (
x = 0;
x < gridSize - 1;
x++) {
1115 int eI = gridSize - 1 -
x;
1135 for (
i = 0;
i < numEffectedV;
i++) {
1142 for (
i = 0;
i < numEffectedE;
i++) {
1149 for (
x = 1;
x < edgeSize - 1;
x++) {
1156 for (
i = 0;
i < numEffectedF;
i++) {
1161 for (S = 0; S < f->
numVerts; S++) {
1162 for (
x = 1;
x < gridSize - 1;
x++) {
1167 for (S = 0; S < f->
numVerts; S++) {
1176 for (
x = 1;
x < gridSize - 1;
x++) {
1181 for (
x = 0;
x < gridSize - 1;
x++) {
1182 int eI = gridSize - 1 -
x;
1185 static_cast<const float *
>(
1189 static_cast<const float *
>(
1200 for (
i = 0;
i < numEffectedV;
i++) {
1203 for (
i = 0;
i < numEffectedE;
i++) {
1206 for (
i = 0;
i < numEffectedF;
i++) {
1303 if (index < 0 || index >=
v->numFaces) {
1306 return v->faces[index];
1314 if (index < 0 || index >=
v->numEdges) {
1317 return v->edges[index];
1355 if (index < 0 || index >=
e->numFaces) {
1358 return e->faces[index];
1415 if (index < 0 || index >= f->
numVerts) {
1422 if (index < 0 || index >= f->
numVerts) {
1521 ss->
numGrids * ((gridSize - 2) + ((gridSize - 2) * (gridSize - 2))));
1523 return numFinalVerts;
1530 ss->
numGrids * ((gridSize - 1) + 2 * ((gridSize - 2) * (gridSize - 1))));
1531 return numFinalEdges;
1536 int numFinalFaces = ss->
numGrids * ((gridSize - 1) * (gridSize - 1));
1537 return numFinalFaces;
ATTR_WARN_UNUSED_RESULT const size_t num
void ccgSubSurf_initFaceIterator(CCGSubSurf *ss, CCGFaceIterator *fiter)
static void ccgSubSurf__sync(CCGSubSurf *ss)
int BKE_ccg_gridsize(int level)
int ccgSubSurf_getNumFinalEdges(const CCGSubSurf *ss)
CCGFace * ccgSubSurf_getFace(CCGSubSurf *ss, CCGFaceHDL f)
int ccgSubSurf_getNumFaces(const CCGSubSurf *ss)
void ccgVertIterator_next(CCGVertIterator *vi)
void CCG_key_top_level(CCGKey *key, const CCGSubSurf *ss)
void CCG_key(CCGKey *key, const CCGSubSurf *ss, int level)
int ccgSubSurf_getVertNumFaces(CCGVert *v)
static void _face_free(CCGFace *f, CCGSubSurf *ss)
int ccgSubSurf_getNumFinalFaces(const CCGSubSurf *ss)
int ccgSubSurf_getEdgeAge(CCGSubSurf *ss, CCGEdge *e)
void ccgSubSurf__effectedFaceNeighbors(CCGSubSurf *ss, CCGFace **faces, int numFaces, CCGVert ***verts, int *numVerts, CCGEdge ***edges, int *numEdges)
int ccgFaceIterator_isStopped(CCGFaceIterator *fi)
static void _vert_free(CCGVert *v, CCGSubSurf *ss)
CCGSubSurf * ccgSubSurf_new(CCGMeshIFC *ifc, int subdivLevels, CCGAllocatorIFC *allocatorIFC, CCGAllocatorHDL allocator)
int ccgEdgeIterator_isStopped(CCGEdgeIterator *ei)
CCGError ccgSubSurf_updateFromFaces(CCGSubSurf *ss, int lvl, CCGFace **effectedF, int numEffectedF)
void ccgSubSurf__allFaces(CCGSubSurf *ss, CCGFace ***faces, int *numFaces, int *freeFaces)
CCGError ccgSubSurf_setAllowEdgeCreation(CCGSubSurf *ss, int allowEdgeCreation, float defaultCreaseValue, void *defaultUserData)
CCGError ccgSubSurf_updateToFaces(CCGSubSurf *ss, int lvl, CCGFace **effectedF, int numEffectedF)
void ccgSubSurf_initEdgeIterator(CCGSubSurf *ss, CCGEdgeIterator *eiter)
void ccgSubSurf_setNumLayers(CCGSubSurf *ss, int numLayers)
void * ccgSubSurf_getEdgeUserData(CCGSubSurf *ss, CCGEdge *e)
int ccgSubSurf_getNumVerts(const CCGSubSurf *ss)
void * ccgSubSurf_getFaceUserData(CCGSubSurf *ss, CCGFace *f)
void * ccgSubSurf_getFaceGridEdgeDataArray(CCGSubSurf *ss, CCGFace *f, int gridIndex)
void * ccgSubSurf_getVertData(CCGSubSurf *ss, CCGVert *v)
CCGError ccgSubSurf_syncFace(CCGSubSurf *ss, CCGFaceHDL fHDL, int numVerts, CCGVertHDL *vHDLs, CCGFace **f_r)
static void _vert_remEdge(CCGVert *v, CCGEdge *e)
static CCGVert * _vert_new(CCGVertHDL vHDL, CCGSubSurf *ss)
static void * _edge_getCoVert(CCGEdge *e, CCGVert *v, int lvl, int x, int dataSize)
void * ccgSubSurf_getEdgeLevelData(CCGSubSurf *ss, CCGEdge *e, int x, int level)
int ccgSubSurf_getSubdivisionLevels(const CCGSubSurf *ss)
static void _vert_addFace(CCGVert *v, CCGFace *f, CCGSubSurf *ss)
static CCGEdge * _edge_new(CCGEdgeHDL eHDL, CCGVert *v0, CCGVert *v1, float crease, CCGSubSurf *ss)
CCGVert * ccgSubSurf_getEdgeVert0(CCGEdge *e)
CCGEdge * ccgSubSurf_getVertEdge(CCGVert *v, int index)
CCGError ccgSubSurf_processSync(CCGSubSurf *ss)
int ccgSubSurf_getVertNumEdges(CCGVert *v)
void * ccgSubSurf_getEdgeData(CCGSubSurf *ss, CCGEdge *e, int x)
static void _edge_free(CCGEdge *e, CCGSubSurf *ss)
void * ccgSubSurf_getVertUserData(CCGSubSurf *ss, CCGVert *v)
CCGError ccgSubSurf_setCalcVertexNormals(CCGSubSurf *ss, int useVertNormals, int normalDataOffset)
int ccgSubSurf_getFaceAge(CCGSubSurf *ss, CCGFace *f)
CCGError ccgSubSurf_stitchFaces(CCGSubSurf *ss, int lvl, CCGFace **effectedF, int numEffectedF)
CCGError ccgSubSurf_syncVert(CCGSubSurf *ss, CCGVertHDL vHDL, const void *vertData, int seam, CCGVert **v_r)
void * ccgSubSurf_getVertLevelData(CCGSubSurf *ss, CCGVert *v, int level)
CCGVert * ccgSubSurf_getVert(CCGSubSurf *ss, CCGVertHDL v)
int ccgSubSurf_getSimpleSubdiv(const CCGSubSurf *ss)
void * ccgSubSurf_getFaceGridDataArray(CCGSubSurf *ss, CCGFace *f, int gridIndex)
int ccgSubSurf_getGridSize(const CCGSubSurf *ss)
CCGError ccgSubSurf_syncVertDel(CCGSubSurf *ss, CCGVertHDL vHDL)
CCGError ccgSubSurf_syncEdgeDel(CCGSubSurf *ss, CCGEdgeHDL eHDL)
float ccgSubSurf_getEdgeCrease(CCGEdge *e)
CCGFace * ccgSubSurf_getVertFace(CCGVert *v, int index)
CCGError ccgSubSurf_initPartialSync(CCGSubSurf *ss)
CCGEdgeHDL ccgSubSurf_getEdgeEdgeHandle(CCGEdge *e)
static void _edge_unlinkMarkAndFree(CCGEdge *e, CCGSubSurf *ss)
static void _face_unlinkMarkAndFree(CCGFace *f, CCGSubSurf *ss)
CCGVert * ccgSubSurf_getEdgeVert1(CCGEdge *e)
void ccgEdgeIterator_next(CCGEdgeIterator *ei)
void ccgSubSurf_initVertIterator(CCGSubSurf *ss, CCGVertIterator *viter)
void ccgSubSurf_getUseAgeCounts(CCGSubSurf *ss, int *useAgeCounts_r, int *vertUserOffset_r, int *edgeUserOffset_r, int *faceUserOffset_r)
CCGFaceHDL ccgSubSurf_getFaceFaceHandle(CCGFace *f)
void ccgSubSurf_setAllocMask(CCGSubSurf *ss, int allocMask, int maskOffset)
void ccgSubSurf_free(CCGSubSurf *ss)
CCGError ccgSubSurf_initFullSync(CCGSubSurf *ss)
CCGError ccgSubSurf_setUseAgeCounts(CCGSubSurf *ss, int useAgeCounts, int vertUserOffset, int edgeUserOffset, int faceUserOffset)
CCGVert * ccgVertIterator_getCurrent(CCGVertIterator *vi)
CCGError ccgSubSurf_syncFaceDel(CCGSubSurf *ss, CCGFaceHDL fHDL)
CCGEdge * ccgSubSurf_getFaceEdge(CCGFace *f, int index)
void * ccgSubSurf_getEdgeDataArray(CCGSubSurf *ss, CCGEdge *e)
int ccgSubSurf_getNumEdges(const CCGSubSurf *ss)
int ccgSubSurf_getNumFinalVerts(const CCGSubSurf *ss)
int ccgSubSurf_getEdgeLevelSize(const CCGSubSurf *ss, int level)
void * ccgSubSurf_getFaceGridData(CCGSubSurf *ss, CCGFace *f, int gridIndex, int x, int y)
void ccgFaceIterator_next(CCGFaceIterator *fi)
int BKE_ccg_factor(int low_level, int high_level)
int ccgVertIterator_isStopped(CCGVertIterator *vi)
CCGEdge * ccgEdgeIterator_getCurrent(CCGEdgeIterator *ei)
static CCGEdge * _vert_findEdgeTo(const CCGVert *v, const CCGVert *vQ)
CCGVert * ccgSubSurf_getFaceVert(CCGFace *f, int index)
static void _edge_addFace(CCGEdge *e, CCGFace *f, CCGSubSurf *ss)
int ccgSubSurf_getEdgeNumFaces(CCGEdge *e)
int ccgSubSurf_getEdgeSize(const CCGSubSurf *ss)
static void _vert_remFace(CCGVert *v, CCGFace *f)
static void _edge_remFace(CCGEdge *e, CCGFace *f)
CCGEdge * ccgSubSurf_getEdge(CCGSubSurf *ss, CCGEdgeHDL e)
int ccgSubSurf_getGridLevelSize(const CCGSubSurf *ss, int level)
CCGError ccgSubSurf_setSubdivisionLevels(CCGSubSurf *ss, int subdivisionLevels)
int ccgSubSurf_getFaceEdgeIndex(CCGFace *f, CCGEdge *e)
CCGVertHDL ccgSubSurf_getVertVertHandle(CCGVert *v)
static void _vert_addEdge(CCGVert *v, CCGEdge *e, CCGSubSurf *ss)
static CCGFace * _face_new(CCGFaceHDL fHDL, CCGVert **verts, CCGEdge **edges, int numVerts, CCGSubSurf *ss)
CCGError ccgSubSurf_syncEdge(CCGSubSurf *ss, CCGEdgeHDL eHDL, CCGVertHDL e_vHDL0, CCGVertHDL e_vHDL1, float crease, CCGEdge **e_r)
CCGFace * ccgFaceIterator_getCurrent(CCGFaceIterator *fi)
void * ccgSubSurf_getFaceCenterData(CCGFace *f)
int ccgSubSurf_getFaceNumVerts(CCGFace *f)
void ccgSubSurf_getAllowEdgeCreation(CCGSubSurf *ss, int *allowEdgeCreation_r, float *defaultCreaseValue_r, void *defaultUserData_r)
void * ccgSubSurf_getFaceGridEdgeData(CCGSubSurf *ss, CCGFace *f, int gridIndex, int x)
CCGFace * ccgSubSurf_getEdgeFace(CCGEdge *e, int index)
int ccgSubSurf_getVertAge(CCGSubSurf *ss, CCGVert *v)
EHashIterator CCGFaceIterator
EHashIterator CCGVertIterator
@ eCCGError_InvalidSyncState
EHashIterator CCGEdgeIterator
BLI_INLINE uint8_t * VERT_getLevelData(CCGVert *v)
BLI_INLINE int ccg_edgesize(int level)
BLI_INLINE uint8_t * EDGE_getLevelData(CCGEdge *e)
BLI_INLINE CCGVert ** FACE_getVerts(CCGFace *f)
BLI_INLINE int ccg_gridsize(int level)
BLI_INLINE void * ccg_face_getIECo(CCGFace *f, int lvl, int S, int x, int levels, int dataSize)
BLI_INLINE void VertDataZero(float v[], const CCGSubSurf *ss)
BLI_INLINE CCGEdge ** FACE_getEdges(CCGFace *f)
BLI_INLINE bool VertDataEqual(const float a[], const float b[], const CCGSubSurf *ss)
BLI_INLINE int ccg_edgebase(int level)
BLI_INLINE void * ccg_face_getIFCo(CCGFace *f, int lvl, int S, int x, int y, int levels, int dataSize)
BLI_INLINE uint8_t * FACE_getCenterData(CCGFace *f)
BLI_INLINE void VertDataCopy(float dst[], const float src[], const CCGSubSurf *ss)
BLI_INLINE void * ccg_vert_getCo(CCGVert *v, int lvl, int dataSize)
BLI_INLINE void VertDataMulN(float v[], float f, const CCGSubSurf *ss)
BLI_INLINE void * ccg_edge_getCo(CCGEdge *e, int lvl, int x, int dataSize)
BLI_INLINE void VertDataAdd(float a[], const float b[], const CCGSubSurf *ss)
#define CCGSUBSURF_alloc(ss, nb)
CCGAllocatorIFC * ccg_getStandardAllocatorIFC(void)
void ccg_ehashIterator_init(EHash *eh, EHashIterator *ehi)
void ccg_ehashIterator_next(EHashIterator *ehi)
void ccg_ehash_insert(EHash *eh, EHEntry *entry)
#define EDGE_getCo(e, lvl, x)
int ccg_ehashIterator_isStopped(EHashIterator *ehi)
void * ccg_ehash_lookupWithPrev(EHash *eh, void *key, void ***prevp_r)
#define FACE_getIFCo(f, lvl, S, x, y)
void * ccg_ehashIterator_getCurrent(EHashIterator *ehi)
#define VERT_getCo(v, lvl)
#define CCGSUBSURF_free(ss, ptr)
void ccg_ehash_free(EHash *eh, EHEntryFreeFP freeEntry, void *user_data)
#define CCGSUBSURF_realloc(ss, ptr, nb, ob)
void(*)(EHEntry *, void *) EHEntryFreeFP
EHash * ccg_ehash_new(int estimatedNumEntries, CCGAllocatorIFC *allocatorIFC, CCGAllocatorHDL allocator)
void * ccg_ehash_lookup(EHash *eh, void *key)
void ccgSubSurf__sync_legacy(CCGSubSurf *ss)
#define FACE_getIECo(f, lvl, S, x)
Read Guarded memory(de)allocation.
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
#define MEM_reallocN(vmemh, len)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
void(* release)(CCGAllocatorHDL a)
void *(* alloc)(CCGAllocatorHDL a, int numBytes)
CCGAllocatorIFC allocatorIFC
void * defaultEdgeUserData
CCGAllocatorHDL allocator