DRW: Add batch garbage collection
[blender.git] / source / blender / draw / intern / draw_cache_impl.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  * Copyright 2016, Blender Foundation.
17  */
18
19 /** \file
20  * \ingroup draw
21  */
22
23 #ifndef __DRAW_CACHE_IMPL_H__
24 #define __DRAW_CACHE_IMPL_H__
25
26 struct CurveCache;
27 struct GPUBatch;
28 struct GPUIndexBuf;
29 struct GPUMaterial;
30 struct GPUTexture;
31 struct GPUVertBuf;
32 struct ListBase;
33 struct ModifierData;
34 struct PTCacheEdit;
35 struct ParticleSystem;
36 struct SpaceImage;
37 struct ToolSettings;
38
39 struct Curve;
40 struct Lattice;
41 struct Mesh;
42 struct MetaBall;
43 struct bGPdata;
44
45 /* Expose via BKE callbacks */
46 void DRW_mball_batch_cache_dirty_tag(struct MetaBall *mb, int mode);
47 void DRW_mball_batch_cache_free(struct MetaBall *mb);
48
49 void DRW_curve_batch_cache_dirty_tag(struct Curve *cu, int mode);
50 void DRW_curve_batch_cache_free(struct Curve *cu);
51
52 void DRW_mesh_batch_cache_dirty_tag(struct Mesh *me, int mode);
53 void DRW_mesh_batch_cache_free(struct Mesh *me);
54
55 void DRW_lattice_batch_cache_dirty_tag(struct Lattice *lt, int mode);
56 void DRW_lattice_batch_cache_free(struct Lattice *lt);
57
58 void DRW_particle_batch_cache_dirty_tag(struct ParticleSystem *psys, int mode);
59 void DRW_particle_batch_cache_free(struct ParticleSystem *psys);
60
61 void DRW_gpencil_batch_cache_dirty_tag(struct bGPdata *gpd);
62 void DRW_gpencil_batch_cache_free(struct bGPdata *gpd);
63
64 /* Garbage collection */
65 void DRW_batch_cache_free_old(struct Object *ob, int ctime);
66
67 void DRW_mesh_batch_cache_free_old(struct Mesh *me, int ctime);
68
69 /* Curve */
70 void DRW_curve_batch_cache_create_requested(struct Object *ob);
71
72 struct GPUBatch *DRW_curve_batch_cache_get_wire_edge(struct Curve *cu);
73 struct GPUBatch *DRW_curve_batch_cache_get_normal_edge(struct Curve *cu);
74 struct GPUBatch *DRW_curve_batch_cache_get_edge_detection(struct Curve *cu, bool *r_is_manifold);
75 struct GPUBatch *DRW_curve_batch_cache_get_edit_edges(struct Curve *cu);
76 struct GPUBatch *DRW_curve_batch_cache_get_edit_verts(struct Curve *cu, bool handles);
77
78 struct GPUBatch *DRW_curve_batch_cache_get_triangles_with_normals(struct Curve *cu);
79 struct GPUBatch **DRW_curve_batch_cache_get_surface_shaded(struct Curve *cu,
80                                                            struct GPUMaterial **gpumat_array,
81                                                            uint gpumat_array_len);
82 struct GPUBatch *DRW_curve_batch_cache_get_wireframes_face(struct Curve *cu);
83 /* Metaball */
84 struct GPUBatch *DRW_metaball_batch_cache_get_triangles_with_normals(struct Object *ob);
85 struct GPUBatch **DRW_metaball_batch_cache_get_surface_shaded(struct Object *ob,
86                                                               struct MetaBall *mb,
87                                                               struct GPUMaterial **gpumat_array,
88                                                               uint gpumat_array_len);
89 struct GPUBatch *DRW_metaball_batch_cache_get_wireframes_face(struct Object *ob);
90 struct GPUBatch *DRW_metaball_batch_cache_get_edge_detection(struct Object *ob,
91                                                              bool *r_is_manifold);
92
93 /* DispList */
94 void DRW_displist_vertbuf_create_pos_and_nor(struct ListBase *lb, struct GPUVertBuf *vbo);
95 void DRW_displist_vertbuf_create_wiredata(struct ListBase *lb, struct GPUVertBuf *vbo);
96 void DRW_displist_vertbuf_create_loop_pos_and_nor_and_uv(struct ListBase *lb,
97                                                          struct GPUVertBuf *vbo_pos_nor,
98                                                          struct GPUVertBuf *vbo_uv);
99 void DRW_displist_indexbuf_create_lines_in_order(struct ListBase *lb, struct GPUIndexBuf *ibo);
100 void DRW_displist_indexbuf_create_triangles_in_order(struct ListBase *lb, struct GPUIndexBuf *ibo);
101 void DRW_displist_indexbuf_create_triangles_loop_split_by_material(struct ListBase *lb,
102                                                                    struct GPUIndexBuf **ibo_mat,
103                                                                    uint mat_len);
104 void DRW_displist_indexbuf_create_edges_adjacency_lines(struct ListBase *lb,
105                                                         struct GPUIndexBuf *ibo,
106                                                         bool *r_is_manifold);
107
108 /* Lattice */
109 struct GPUBatch *DRW_lattice_batch_cache_get_all_edges(struct Lattice *lt,
110                                                        bool use_weight,
111                                                        const int actdef);
112 struct GPUBatch *DRW_lattice_batch_cache_get_all_verts(struct Lattice *lt);
113 struct GPUBatch *DRW_lattice_batch_cache_get_edit_verts(struct Lattice *lt);
114
115 /* Mesh */
116 void DRW_mesh_batch_cache_create_requested(struct Object *ob,
117                                            struct Mesh *me,
118                                            const struct ToolSettings *ts,
119                                            const bool is_paint_mode,
120                                            const bool use_hide);
121
122 struct GPUBatch *DRW_mesh_batch_cache_get_all_verts(struct Mesh *me);
123 struct GPUBatch *DRW_mesh_batch_cache_get_all_edges(struct Mesh *me);
124 struct GPUBatch *DRW_mesh_batch_cache_get_loose_edges(struct Mesh *me);
125 struct GPUBatch *DRW_mesh_batch_cache_get_edge_detection(struct Mesh *me, bool *r_is_manifold);
126 struct GPUBatch *DRW_mesh_batch_cache_get_surface(struct Mesh *me);
127 struct GPUBatch *DRW_mesh_batch_cache_get_surface_edges(struct Mesh *me);
128 struct GPUBatch **DRW_mesh_batch_cache_get_surface_shaded(struct Mesh *me,
129                                                           struct GPUMaterial **gpumat_array,
130                                                           uint gpumat_array_len,
131                                                           char **auto_layer_names,
132                                                           int **auto_layer_is_srgb,
133                                                           int *auto_layer_count);
134 struct GPUBatch **DRW_mesh_batch_cache_get_surface_texpaint(struct Mesh *me);
135 struct GPUBatch *DRW_mesh_batch_cache_get_surface_texpaint_single(struct Mesh *me);
136 struct GPUBatch *DRW_mesh_batch_cache_get_surface_vertpaint(struct Mesh *me);
137 struct GPUBatch *DRW_mesh_batch_cache_get_surface_weights(struct Mesh *me);
138 /* edit-mesh drawing */
139 struct GPUBatch *DRW_mesh_batch_cache_get_edit_triangles(struct Mesh *me);
140 struct GPUBatch *DRW_mesh_batch_cache_get_edit_vertices(struct Mesh *me);
141 struct GPUBatch *DRW_mesh_batch_cache_get_edit_edges(struct Mesh *me);
142 struct GPUBatch *DRW_mesh_batch_cache_get_edit_lnors(struct Mesh *me);
143 struct GPUBatch *DRW_mesh_batch_cache_get_edit_facedots(struct Mesh *me);
144 /* edit-mesh selection */
145 struct GPUBatch *DRW_mesh_batch_cache_get_triangles_with_select_id(struct Mesh *me);
146 struct GPUBatch *DRW_mesh_batch_cache_get_facedots_with_select_id(struct Mesh *me);
147 struct GPUBatch *DRW_mesh_batch_cache_get_edges_with_select_id(struct Mesh *me);
148 struct GPUBatch *DRW_mesh_batch_cache_get_verts_with_select_id(struct Mesh *me);
149 /* Object mode Wireframe overlays */
150 struct GPUBatch *DRW_mesh_batch_cache_get_wireframes_face(struct Mesh *me);
151 /* edit-mesh UV editor */
152 struct GPUBatch *DRW_mesh_batch_cache_get_edituv_faces_strech_area(struct Mesh *me);
153 struct GPUBatch *DRW_mesh_batch_cache_get_edituv_faces_strech_angle(struct Mesh *me);
154 struct GPUBatch *DRW_mesh_batch_cache_get_edituv_faces(struct Mesh *me);
155 struct GPUBatch *DRW_mesh_batch_cache_get_edituv_edges(struct Mesh *me);
156 struct GPUBatch *DRW_mesh_batch_cache_get_edituv_verts(struct Mesh *me);
157 struct GPUBatch *DRW_mesh_batch_cache_get_edituv_facedots(struct Mesh *me);
158 /* For Image UV editor. */
159 struct GPUBatch *DRW_mesh_batch_cache_get_uv_edges(struct Mesh *me);
160
161 void DRW_mesh_cache_sculpt_coords_ensure(struct Mesh *me);
162
163 /* Edit mesh bitflags (is this the right place?) */
164 enum {
165   VFLAG_VERT_ACTIVE = 1 << 0,
166   VFLAG_VERT_SELECTED = 1 << 1,
167   VFLAG_EDGE_ACTIVE = 1 << 2,
168   VFLAG_EDGE_SELECTED = 1 << 3,
169   VFLAG_EDGE_SEAM = 1 << 4,
170   VFLAG_EDGE_SHARP = 1 << 5,
171   VFLAG_EDGE_FREESTYLE = 1 << 6,
172   /* Beware to not go over 1 << 7 (it's a byte flag)
173    * (see gpu_shader_edit_mesh_overlay_geom.glsl) */
174 };
175
176 enum {
177   VFLAG_FACE_ACTIVE = 1 << 0,
178   VFLAG_FACE_SELECTED = 1 << 1,
179   VFLAG_FACE_FREESTYLE = 1 << 2,
180   VFLAG_VERT_UV_SELECT = 1 << 3,
181   VFLAG_VERT_UV_PINNED = 1 << 4,
182   VFLAG_EDGE_UV_SELECT = 1 << 5,
183   VFLAG_FACE_UV_ACTIVE = 1 << 6,
184   VFLAG_FACE_UV_SELECT = 1 << 7,
185   /* Beware to not go over 1 << 7 (it's a byte flag)
186    * (see gpu_shader_edit_mesh_overlay_geom.glsl) */
187 };
188
189 /* Particles */
190 struct GPUBatch *DRW_particles_batch_cache_get_hair(struct Object *object,
191                                                     struct ParticleSystem *psys,
192                                                     struct ModifierData *md);
193 struct GPUBatch *DRW_particles_batch_cache_get_dots(struct Object *object,
194                                                     struct ParticleSystem *psys);
195 struct GPUBatch *DRW_particles_batch_cache_get_edit_strands(struct Object *object,
196                                                             struct ParticleSystem *psys,
197                                                             struct PTCacheEdit *edit,
198                                                             bool use_weight);
199 struct GPUBatch *DRW_particles_batch_cache_get_edit_inner_points(struct Object *object,
200                                                                  struct ParticleSystem *psys,
201                                                                  struct PTCacheEdit *edit);
202 struct GPUBatch *DRW_particles_batch_cache_get_edit_tip_points(struct Object *object,
203                                                                struct ParticleSystem *psys,
204                                                                struct PTCacheEdit *edit);
205
206 /* Common */
207 #define DRW_ADD_FLAG_FROM_VBO_REQUEST(flag, vbo, value) \
208   (flag |= DRW_vbo_requested(vbo) ? (value) : 0)
209 #define DRW_ADD_FLAG_FROM_IBO_REQUEST(flag, ibo, value) \
210   (flag |= DRW_ibo_requested(ibo) ? (value) : 0)
211
212 /* Test and assign NULL if test fails */
213 #define DRW_TEST_ASSIGN_VBO(v) (v = (DRW_vbo_requested(v) ? (v) : NULL))
214 #define DRW_TEST_ASSIGN_IBO(v) (v = (DRW_ibo_requested(v) ? (v) : NULL))
215
216 struct GPUBatch *DRW_batch_request(struct GPUBatch **batch);
217 bool DRW_batch_requested(struct GPUBatch *batch, int prim_type);
218 void DRW_ibo_request(struct GPUBatch *batch, struct GPUIndexBuf **ibo);
219 bool DRW_ibo_requested(struct GPUIndexBuf *ibo);
220 void DRW_vbo_request(struct GPUBatch *batch, struct GPUVertBuf **vbo);
221 bool DRW_vbo_requested(struct GPUVertBuf *vbo);
222
223 #endif /* __DRAW_CACHE_IMPL_H__ */