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