1 /* 2 * This program is free software; you can redistribute it and/or 3 * modify it under the terms of the GNU General Public License 4 * as published by the Free Software Foundation; either version 2 5 * of the License, or (at your option) any later version. 6 * 7 * This program is distributed in the hope that it will be useful, 8 * but WITHOUT ANY WARRANTY; without even the implied warranty of 9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 * GNU General Public License for more details. 11 * 12 * You should have received a copy of the GNU General Public License 13 * along with this program; if not, write to the Free Software Foundation, 14 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 15 */ 16 17 #pragma once 18 19 /** \file 20 * \ingroup bke 21 */ 22 23 typedef void *CCGMeshHDL; 24 typedef void *CCGVertHDL; 25 typedef void *CCGEdgeHDL; 26 typedef void *CCGFaceHDL; 27 28 typedef struct CCGEdge CCGEdge; 29 typedef struct CCGFace CCGFace; 30 typedef struct CCGSubSurf CCGSubSurf; 31 typedef struct CCGVert CCGVert; 32 33 typedef struct CCGMeshIFC { 34 int vertUserSize, edgeUserSize, faceUserSize; 35 int numLayers; 36 int vertDataSize; 37 int simpleSubdiv; 38 } CCGMeshIFC; 39 40 /***/ 41 42 typedef void *CCGAllocatorHDL; 43 44 typedef struct CCGAllocatorIFC { 45 void *(*alloc)(CCGAllocatorHDL a, int numBytes); 46 void *(*realloc)(CCGAllocatorHDL a, void *ptr, int newSize, int oldSize); 47 void (*free)(CCGAllocatorHDL a, void *ptr); 48 void (*release)(CCGAllocatorHDL a); 49 } CCGAllocatorIFC; 50 51 /* private, so we can allocate on the stack */ 52 typedef struct _EHashIterator { 53 struct _EHash *eh; 54 int curBucket; 55 struct _EHEntry *curEntry; 56 } EHashIterator; 57 58 /***/ 59 60 typedef enum { 61 eCCGError_None = 0, 62 63 eCCGError_InvalidSyncState, 64 eCCGError_InvalidValue, 65 } CCGError; 66 67 /***/ 68 69 /* TODO(sergey): This actually depends on subsurf level as well. */ 70 #define CCG_TASK_LIMIT 16 71 72 /***/ 73 74 CCGSubSurf *ccgSubSurf_new(CCGMeshIFC *ifc, 75 int subdivLevels, 76 CCGAllocatorIFC *allocatorIFC, 77 CCGAllocatorHDL allocator); 78 void ccgSubSurf_free(CCGSubSurf *ss); 79 80 CCGError ccgSubSurf_initFullSync(CCGSubSurf *ss); 81 CCGError ccgSubSurf_initPartialSync(CCGSubSurf *ss); 82 #ifdef WITH_OPENSUBDIV 83 CCGError ccgSubSurf_initOpenSubdivSync(CCGSubSurf *ss); 84 #endif 85 86 CCGError ccgSubSurf_syncVert( 87 CCGSubSurf *ss, CCGVertHDL vHDL, const void *vertData, int seam, CCGVert **v_r); 88 CCGError ccgSubSurf_syncEdge(CCGSubSurf *ss, 89 CCGEdgeHDL eHDL, 90 CCGVertHDL e_vHDL0, 91 CCGVertHDL e_vHDL1, 92 float crease, 93 CCGEdge **e_r); 94 CCGError ccgSubSurf_syncFace( 95 CCGSubSurf *ss, CCGFaceHDL fHDL, int numVerts, CCGVertHDL *vHDLs, CCGFace **f_r); 96 97 CCGError ccgSubSurf_syncVertDel(CCGSubSurf *ss, CCGVertHDL vHDL); 98 CCGError ccgSubSurf_syncEdgeDel(CCGSubSurf *ss, CCGEdgeHDL eHDL); 99 CCGError ccgSubSurf_syncFaceDel(CCGSubSurf *ss, CCGFaceHDL fHDL); 100 101 CCGError ccgSubSurf_processSync(CCGSubSurf *ss); 102 103 CCGError ccgSubSurf_updateFromFaces(CCGSubSurf *ss, 104 int lvl, 105 CCGFace **effectedF, 106 int numEffectedF); 107 CCGError ccgSubSurf_updateToFaces(CCGSubSurf *ss, int lvl, CCGFace **effectedF, int numEffectedF); 108 CCGError ccgSubSurf_updateNormals(CCGSubSurf *ss, CCGFace **effectedF, int numEffectedF); 109 CCGError ccgSubSurf_updateLevels(CCGSubSurf *ss, int lvl, CCGFace **effectedF, int numEffectedF); 110 CCGError ccgSubSurf_stitchFaces(CCGSubSurf *ss, int lvl, CCGFace **effectedF, int numEffectedF); 111 112 CCGError ccgSubSurf_setSubdivisionLevels(CCGSubSurf *ss, int subdivisionLevels); 113 114 CCGError ccgSubSurf_setAllowEdgeCreation(CCGSubSurf *ss, 115 int allowEdgeCreation, 116 float defaultCreaseValue, 117 void *defaultUserData); 118 void ccgSubSurf_getAllowEdgeCreation(CCGSubSurf *ss, 119 int *allowEdgeCreation_r, 120 float *defaultCreaseValue_r, 121 void *defaultUserData_r); 122 123 void ccgSubSurf_getUseAgeCounts(CCGSubSurf *ss, 124 int *useAgeCounts_r, 125 int *vertUserOffset_r, 126 int *edgeUserOffset_r, 127 int *faceUserOffset_r); 128 CCGError ccgSubSurf_setUseAgeCounts( 129 CCGSubSurf *ss, int useAgeCounts, int vertUserOffset, int edgeUserOffset, int faceUserOffset); 130 131 CCGError ccgSubSurf_setCalcVertexNormals(CCGSubSurf *ss, int useVertNormals, int normalDataOffset); 132 void ccgSubSurf_setAllocMask(CCGSubSurf *ss, int allocMask, int maskOffset); 133 134 void ccgSubSurf_setNumLayers(CCGSubSurf *ss, int numLayers); 135 136 /***/ 137 138 int ccgSubSurf_getNumVerts(const CCGSubSurf *ss); 139 int ccgSubSurf_getNumEdges(const CCGSubSurf *ss); 140 int ccgSubSurf_getNumFaces(const CCGSubSurf *ss); 141 142 int ccgSubSurf_getSubdivisionLevels(const CCGSubSurf *ss); 143 int ccgSubSurf_getEdgeSize(const CCGSubSurf *ss); 144 int ccgSubSurf_getEdgeLevelSize(const CCGSubSurf *ss, int level); 145 int ccgSubSurf_getGridSize(const CCGSubSurf *ss); 146 int ccgSubSurf_getGridLevelSize(const CCGSubSurf *ss, int level); 147 int ccgSubSurf_getSimpleSubdiv(const CCGSubSurf *ss); 148 149 CCGVert *ccgSubSurf_getVert(CCGSubSurf *ss, CCGVertHDL v); 150 CCGVertHDL ccgSubSurf_getVertVertHandle(CCGVert *v); 151 int ccgSubSurf_getVertNumFaces(CCGVert *v); 152 CCGFace *ccgSubSurf_getVertFace(CCGVert *v, int index); 153 int ccgSubSurf_getVertNumEdges(CCGVert *v); 154 CCGEdge *ccgSubSurf_getVertEdge(CCGVert *v, int index); 155 156 int ccgSubSurf_getVertAge(CCGSubSurf *ss, CCGVert *v); 157 void *ccgSubSurf_getVertUserData(CCGSubSurf *ss, CCGVert *v); 158 void *ccgSubSurf_getVertData(CCGSubSurf *ss, CCGVert *v); 159 void *ccgSubSurf_getVertLevelData(CCGSubSurf *ss, CCGVert *v, int level); 160 161 CCGEdge *ccgSubSurf_getEdge(CCGSubSurf *ss, CCGEdgeHDL e); 162 CCGEdgeHDL ccgSubSurf_getEdgeEdgeHandle(CCGEdge *e); 163 int ccgSubSurf_getEdgeNumFaces(CCGEdge *e); 164 CCGFace *ccgSubSurf_getEdgeFace(CCGEdge *e, int index); 165 CCGVert *ccgSubSurf_getEdgeVert0(CCGEdge *e); 166 CCGVert *ccgSubSurf_getEdgeVert1(CCGEdge *e); 167 float ccgSubSurf_getEdgeCrease(CCGEdge *e); 168 169 int ccgSubSurf_getEdgeAge(CCGSubSurf *ss, CCGEdge *e); 170 void *ccgSubSurf_getEdgeUserData(CCGSubSurf *ss, CCGEdge *e); 171 void *ccgSubSurf_getEdgeDataArray(CCGSubSurf *ss, CCGEdge *e); 172 void *ccgSubSurf_getEdgeData(CCGSubSurf *ss, CCGEdge *e, int x); 173 void *ccgSubSurf_getEdgeLevelData(CCGSubSurf *ss, CCGEdge *e, int x, int level); 174 175 CCGFace *ccgSubSurf_getFace(CCGSubSurf *ss, CCGFaceHDL f); 176 CCGFaceHDL ccgSubSurf_getFaceFaceHandle(CCGFace *f); 177 int ccgSubSurf_getFaceNumVerts(CCGFace *f); 178 CCGVert *ccgSubSurf_getFaceVert(CCGFace *f, int index); 179 CCGEdge *ccgSubSurf_getFaceEdge(CCGFace *f, int index); 180 int ccgSubSurf_getFaceEdgeIndex(CCGFace *f, CCGEdge *e); 181 182 int ccgSubSurf_getFaceAge(CCGSubSurf *ss, CCGFace *f); 183 void *ccgSubSurf_getFaceUserData(CCGSubSurf *ss, CCGFace *f); 184 void *ccgSubSurf_getFaceCenterData(CCGFace *f); 185 void *ccgSubSurf_getFaceGridEdgeDataArray(CCGSubSurf *ss, CCGFace *f, int gridIndex); 186 void *ccgSubSurf_getFaceGridEdgeData(CCGSubSurf *ss, CCGFace *f, int gridIndex, int x); 187 void *ccgSubSurf_getFaceGridDataArray(CCGSubSurf *ss, CCGFace *f, int gridIndex); 188 void *ccgSubSurf_getFaceGridData(CCGSubSurf *ss, CCGFace *f, int gridIndex, int x, int y); 189 190 int ccgSubSurf_getNumFinalVerts(const CCGSubSurf *ss); 191 int ccgSubSurf_getNumFinalEdges(const CCGSubSurf *ss); 192 int ccgSubSurf_getNumFinalFaces(const CCGSubSurf *ss); 193 194 /***/ 195 196 typedef struct _EHashIterator CCGEdgeIterator; 197 typedef struct _EHashIterator CCGFaceIterator; 198 typedef struct _EHashIterator CCGVertIterator; 199 200 void ccgSubSurf_initVertIterator(CCGSubSurf *ss, CCGVertIterator *viter); 201 void ccgSubSurf_initEdgeIterator(CCGSubSurf *ss, CCGEdgeIterator *eiter); 202 void ccgSubSurf_initFaceIterator(CCGSubSurf *ss, CCGFaceIterator *fiter); 203 204 CCGVert *ccgVertIterator_getCurrent(CCGVertIterator *vi); 205 int ccgVertIterator_isStopped(CCGVertIterator *vi); 206 void ccgVertIterator_next(CCGVertIterator *vi); 207 208 CCGEdge *ccgEdgeIterator_getCurrent(CCGEdgeIterator *ei); 209 int ccgEdgeIterator_isStopped(CCGEdgeIterator *ei); 210 void ccgEdgeIterator_next(CCGEdgeIterator *ei); 211 212 CCGFace *ccgFaceIterator_getCurrent(CCGFaceIterator *fi); 213 int ccgFaceIterator_isStopped(CCGFaceIterator *fi); 214 void ccgFaceIterator_next(CCGFaceIterator *fi); 215