OpenSubdiv: Cleanup, Remove from legacy SubsurfCCG code
[blender.git] / source / blender / blenkernel / BKE_subsurf.h
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  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  */
19 #ifndef __BKE_SUBSURF_H__
20 #define __BKE_SUBSURF_H__
21
22 /** \file
23  * \ingroup bke
24  */
25
26 /* struct DerivedMesh is used directly */
27 #include "BKE_DerivedMesh.h"
28
29 /* Thread sync primitives used directly.  */
30 #include "BLI_threads.h"
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35
36 struct CCGEdge;
37 struct CCGElem;
38 struct CCGFace;
39 struct CCGVert;
40 struct DMFlagMat;
41 struct DerivedMesh;
42 struct EdgeHash;
43 struct MPoly;
44 struct Mesh;
45 struct MeshElemMap;
46 struct Object;
47 struct PBVH;
48 struct PBVH;
49 struct SubsurfModifierData;
50
51 /**************************** External *****************************/
52
53 typedef enum {
54   SUBSURF_USE_RENDER_PARAMS = 1,
55   SUBSURF_IS_FINAL_CALC = 2,
56   SUBSURF_FOR_EDIT_MODE = 4,
57   SUBSURF_IN_EDIT_MODE = 8,
58   SUBSURF_ALLOC_PAINT_MASK = 16,
59   SUBSURF_USE_GPU_BACKEND = 32,
60   SUBSURF_IGNORE_SIMPLIFY = 64,
61 } SubsurfFlags;
62
63 struct DerivedMesh *subsurf_make_derived_from_derived(struct DerivedMesh *dm,
64                                                       struct SubsurfModifierData *smd,
65                                                       const struct Scene *scene,
66                                                       float (*vertCos)[3],
67                                                       SubsurfFlags flags);
68
69 void subsurf_calculate_limit_positions(struct Mesh *me, float (*r_positions)[3]);
70
71 /* get gridsize from 'level', level must be greater than zero */
72 int BKE_ccg_gridsize(int level);
73
74 /* x/y grid coordinates at 'low_level' can be multiplied by the result
75  * of this function to convert to grid coordinates at 'high_level' */
76 int BKE_ccg_factor(int low_level, int high_level);
77
78 void subsurf_copy_grid_hidden(struct DerivedMesh *dm,
79                               const struct MPoly *mpoly,
80                               struct MVert *mvert,
81                               const struct MDisps *mdisps);
82
83 void subsurf_copy_grid_paint_mask(struct DerivedMesh *dm,
84                                   const struct MPoly *mpoly,
85                                   float *paint_mask,
86                                   const struct GridPaintMask *grid_paint_mask);
87
88 bool subsurf_has_edges(struct DerivedMesh *dm);
89 bool subsurf_has_faces(struct DerivedMesh *dm);
90
91 typedef enum MultiresModifiedFlags {
92   /* indicates the grids have been sculpted on, so MDisps
93    * have to be updated */
94   MULTIRES_COORDS_MODIFIED = 1,
95   /* indicates elements have been hidden or unhidden */
96   MULTIRES_HIDDEN_MODIFIED = 2,
97 } MultiresModifiedFlags;
98
99 /**************************** Internal *****************************/
100
101 typedef struct CCGDerivedMesh {
102   DerivedMesh dm;
103
104   struct CCGSubSurf *ss;
105   int freeSS;
106   int drawInteriorEdges, useSubsurfUv;
107
108   struct {
109     int startVert;
110     struct CCGVert *vert;
111   } * vertMap;
112   struct {
113     int startVert;
114     int startEdge;
115     struct CCGEdge *edge;
116   } * edgeMap;
117   struct {
118     int startVert;
119     int startEdge;
120     int startFace;
121     struct CCGFace *face;
122   } * faceMap;
123
124   short *edgeFlags;
125   struct DMFlagMat *faceFlags;
126
127   int *reverseFaceMap;
128
129   struct PBVH *pbvh;
130
131   struct MeshElemMap *pmap;
132   int *pmap_mem;
133
134   struct CCGElem **gridData;
135   int *gridOffset;
136   struct CCGFace **gridFaces;
137   struct DMFlagMat *gridFlagMats;
138   unsigned int **gridHidden;
139   /* Elements in arrays above. */
140   unsigned int numGrid;
141
142   struct {
143     struct MultiresModifierData *mmd;
144     int local_mmd;
145
146     int lvl, totlvl;
147     float (*orco)[3];
148
149     struct Object *ob;
150     MultiresModifiedFlags modified_flags;
151   } multires;
152
153   struct EdgeHash *ehash;
154
155   ThreadMutex loops_cache_lock;
156   ThreadRWMutex origindex_cache_rwlock;
157 } CCGDerivedMesh;
158
159 #ifdef __cplusplus
160 }
161 #endif
162
163 #endif