8e68fdef95241ed73293438cdf16e249e1923257
[blender.git] / source / blender / draw / engines / gpencil / gpencil_engine.h
1 /*
2  * Copyright 2017, Blender Foundation.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Antonio Vazquez
19  *
20  */
21
22 /** \file blender/draw/engines/gpencil/gpencil_engine.h
23  *  \ingroup draw
24  */
25
26 #ifndef __GPENCIL_ENGINE_H__
27 #define __GPENCIL_ENGINE_H__
28
29 #include "GPU_batch.h"
30
31 struct tGPspoint;
32 struct bGPDstroke;
33 struct ModifierData;
34 struct GPENCIL_Data;
35 struct GPENCIL_StorageList;
36 struct Object;
37 struct MaterialGPencilStyle;
38 struct RenderEngine;
39 struct RenderLayer;
40
41 #define GPENCIL_CACHE_BLOCK_SIZE 8
42 #define GPENCIL_MAX_SHGROUPS 65536
43 #define GPENCIL_MIN_BATCH_SLOTS_CHUNK 16
44
45 #define GPENCIL_COLOR_SOLID   0
46 #define GPENCIL_COLOR_TEXTURE 1
47 #define GPENCIL_COLOR_PATTERN 2
48
49 #define GP_SIMPLIFY(scene) ((scene->r.simplify_gpencil & SIMPLIFY_GPENCIL_ENABLE))
50 #define GP_SIMPLIFY_ONPLAY(playing) (((playing == true) && (scene->r.simplify_gpencil & SIMPLIFY_GPENCIL_ON_PLAY)) || ((scene->r.simplify_gpencil & SIMPLIFY_GPENCIL_ON_PLAY) == 0))
51 #define GP_SIMPLIFY_FILL(scene, playing) ((GP_SIMPLIFY_ONPLAY(playing) && (GP_SIMPLIFY(scene)) && (scene->r.simplify_gpencil & SIMPLIFY_GPENCIL_FILL)))
52 #define GP_SIMPLIFY_MODIF(scene, playing) ((GP_SIMPLIFY_ONPLAY(playing) && (GP_SIMPLIFY(scene)) && (scene->r.simplify_gpencil & SIMPLIFY_GPENCIL_MODIFIER)))
53 #define GP_SIMPLIFY_FX(scene, playing) ((GP_SIMPLIFY_ONPLAY(playing) && (GP_SIMPLIFY(scene)) && (scene->r.simplify_gpencil & SIMPLIFY_GPENCIL_FX)))
54
55 #define GP_IS_CAMERAVIEW ((rv3d != NULL) && (rv3d->persp == RV3D_CAMOB && v3d->camera))
56
57  /* *********** OBJECTS CACHE *********** */
58
59  /* used to save gpencil object data for drawing */
60 typedef struct tGPencilObjectCache {
61         struct Object *ob;
62         struct bGPdata *gpd;
63         int init_grp, end_grp;
64         int idx;  /*original index, can change after sort */
65
66         /* effects */
67         bool has_fx;
68         ListBase shader_fx;
69         float pixfactor;
70         DRWShadingGroup *fx_wave_sh;
71         DRWShadingGroup *fx_blur_sh;
72         DRWShadingGroup *fx_colorize_sh;
73         DRWShadingGroup *fx_pixel_sh;
74         DRWShadingGroup *fx_rim_sh;
75         DRWShadingGroup *fx_shadow_sh;
76         DRWShadingGroup *fx_glow_sh;
77         DRWShadingGroup *fx_swirl_sh;
78         DRWShadingGroup *fx_flip_sh;
79         DRWShadingGroup *fx_light_sh;
80
81         float loc[3];
82         float obmat[4][4];
83         float zdepth;  /* z-depth value to sort gp object */
84         bool is_dup_ob;  /* flag to tag duplicate objects */
85         bool is_dup_data; /* other object uses datablock already */
86         int  data_idx;    /* derived data index */
87 } tGPencilObjectCache;
88
89   /* *********** LISTS *********** */
90 typedef struct GPENCIL_shgroup {
91         int s_clamp;
92         int stroke_style;
93         int color_type;
94         int mode;
95         int texture_mix;
96         int texture_flip;
97         int texture_clamp;
98         int fill_style;
99         int keep_size;
100         float obj_scale;
101         struct DRWShadingGroup *shgrps_fill;
102         struct DRWShadingGroup *shgrps_stroke;
103 } GPENCIL_shgroup;
104
105 typedef struct GPENCIL_Storage {
106         int shgroup_id; /* total elements */
107         float unit_matrix[4][4];
108         int stroke_style;
109         int color_type;
110         int mode;
111         int xray;
112         int keep_size;
113         float obj_scale;
114         float pixfactor;
115         bool is_playing;
116         bool is_render;
117         bool is_mat_preview;
118         bool reset_cache;
119         bool buffer_stroke;
120         bool buffer_fill;
121         const float *pixsize;
122         float render_pixsize;
123         int tonemapping;
124         short multisamples;
125
126         /* simplify settings*/
127         bool simplify_fill;
128         bool simplify_modif;
129         bool simplify_fx;
130
131         /* Render Matrices and data */
132         float persmat[4][4], persinv[4][4];
133         float viewmat[4][4], viewinv[4][4];
134         float winmat[4][4], wininv[4][4];
135         float view_vecs[2][4]; /* vec4[2] */
136
137         float grid_matrix[4][4];
138
139         Object *camera; /* camera pointer for render mode */
140 } GPENCIL_Storage;
141
142 typedef struct GPENCIL_StorageList {
143         struct GPENCIL_Storage *storage;
144         struct g_data *g_data;
145         struct GPENCIL_shgroup *shgroups;
146 } GPENCIL_StorageList;
147
148 typedef struct GPENCIL_PassList {
149         struct DRWPass *stroke_pass;
150         struct DRWPass *edit_pass;
151         struct DRWPass *drawing_pass;
152         struct DRWPass *mix_pass;
153         struct DRWPass *mix_pass_noblend;
154         struct DRWPass *background_pass;
155         struct DRWPass *paper_pass;
156         struct DRWPass *grid_pass;
157
158         /* effects */
159         struct DRWPass *fx_shader_pass;
160         struct DRWPass *fx_shader_pass_blend;
161
162 } GPENCIL_PassList;
163
164 typedef struct GPENCIL_FramebufferList {
165         struct GPUFrameBuffer *main;
166         struct GPUFrameBuffer *temp_fb_a;
167         struct GPUFrameBuffer *temp_fb_b;
168         struct GPUFrameBuffer *temp_fb_fx;
169         struct GPUFrameBuffer *background_fb;
170
171         struct GPUFrameBuffer *multisample_fb;
172 } GPENCIL_FramebufferList;
173
174 typedef struct GPENCIL_TextureList {
175         struct GPUTexture *texture;
176
177         /* multisample textures */
178         struct GPUTexture *multisample_color;
179         struct GPUTexture *multisample_depth;
180
181 } GPENCIL_TextureList;
182
183 typedef struct GPENCIL_Data {
184         void *engine_type; /* Required */
185         struct GPENCIL_FramebufferList *fbl;
186         struct GPENCIL_TextureList *txl;
187         struct GPENCIL_PassList *psl;
188         struct GPENCIL_StorageList *stl;
189
190         /* render textures */
191         struct GPUTexture *render_depth_tx;
192         struct GPUTexture *render_color_tx;
193
194 } GPENCIL_Data;
195
196 /* *********** STATIC *********** */
197 typedef struct g_data {
198         struct DRWShadingGroup *shgrps_edit_point;
199         struct DRWShadingGroup *shgrps_edit_line;
200         struct DRWShadingGroup *shgrps_drawing_stroke;
201         struct DRWShadingGroup *shgrps_drawing_fill;
202         struct DRWShadingGroup *shgrps_grid;
203
204         int gp_cache_used; /* total objects in cache */
205         int gp_cache_size; /* size of the cache */
206         struct tGPencilObjectCache *gp_object_cache;
207
208         int session_flag;
209
210 } g_data; /* Transient data */
211
212 /* flags for fast drawing support */
213 typedef enum eGPsession_Flag {
214         GP_DRW_PAINT_HOLD     = (1 << 0),
215         GP_DRW_PAINT_IDLE     = (1 << 1),
216         GP_DRW_PAINT_FILLING  = (1 << 2),
217         GP_DRW_PAINT_READY    = (1 << 3),
218         GP_DRW_PAINT_PAINTING = (1 << 4),
219 } eGPsession_Flag;
220
221 typedef struct GPENCIL_e_data {
222         /* general drawing shaders */
223         struct GPUShader *gpencil_fill_sh;
224         struct GPUShader *gpencil_stroke_sh;
225         struct GPUShader *gpencil_point_sh;
226         struct GPUShader *gpencil_edit_point_sh;
227         struct GPUShader *gpencil_line_sh;
228         struct GPUShader *gpencil_drawing_fill_sh;
229         struct GPUShader *gpencil_fullscreen_sh;
230         struct GPUShader *gpencil_simple_fullscreen_sh;
231         struct GPUShader *gpencil_background_sh;
232         struct GPUShader *gpencil_paper_sh;
233
234         /* effects */
235         struct GPUShader *gpencil_fx_blur_sh;
236         struct GPUShader *gpencil_fx_colorize_sh;
237         struct GPUShader *gpencil_fx_flip_sh;
238         struct GPUShader *gpencil_fx_glow_prepare_sh;
239         struct GPUShader *gpencil_fx_glow_resolve_sh;
240         struct GPUShader *gpencil_fx_light_sh;
241         struct GPUShader *gpencil_fx_pixel_sh;
242         struct GPUShader *gpencil_fx_rim_prepare_sh;
243         struct GPUShader *gpencil_fx_rim_resolve_sh;
244         struct GPUShader *gpencil_fx_shadow_prepare_sh;
245         struct GPUShader *gpencil_fx_shadow_resolve_sh;
246         struct GPUShader *gpencil_fx_swirl_sh;
247         struct GPUShader *gpencil_fx_wave_sh;
248
249         /* textures */
250         struct GPUTexture *background_depth_tx;
251         struct GPUTexture *background_color_tx;
252
253         struct GPUTexture *gpencil_blank_texture;
254
255         /* runtime pointers texture */
256         struct GPUTexture *input_depth_tx;
257         struct GPUTexture *input_color_tx;
258
259         /* working textures */
260         struct GPUTexture *temp_color_tx_a;
261         struct GPUTexture *temp_depth_tx_a;
262
263         struct GPUTexture *temp_color_tx_b;
264         struct GPUTexture *temp_depth_tx_b;
265
266         struct GPUTexture *temp_color_tx_fx;
267         struct GPUTexture *temp_depth_tx_fx;
268
269         /* for buffer only one batch is nedeed because the drawing is only of one stroke */
270         GPUBatch *batch_buffer_stroke;
271         GPUBatch *batch_buffer_fill;
272
273         /* grid geometry */
274         GPUBatch *batch_grid;
275
276 } GPENCIL_e_data; /* Engine data */
277
278 /* GPUBatch Cache */
279 typedef struct GpencilBatchCache {
280         /* For normal strokes, a variable number of batch can be needed depending of number of strokes.
281            It could use the stroke number as total size, but when activate the onion skining, the number
282            can change, so the size is changed dynamically.
283          */
284         GPUBatch **batch_stroke;
285         GPUBatch **batch_fill;
286         GPUBatch **batch_edit;
287         GPUBatch **batch_edlin;
288
289         /* settings to determine if cache is invalid */
290         bool is_dirty;
291         bool is_editmode;
292         int cache_frame;
293
294         /* keep information about the size of the cache */
295         int cache_size;  /* total batch slots available */
296         int cache_idx;   /* current slot index */
297 } GpencilBatchCache;
298
299 /* general drawing functions */
300 struct DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(
301         struct GPENCIL_e_data *e_data, struct GPENCIL_Data *vedata, struct DRWPass *pass, struct GPUShader *shader,
302         struct Object *ob, struct bGPdata *gpd, struct MaterialGPencilStyle *gp_style, int id, bool onion);
303 void DRW_gpencil_populate_datablock(
304         struct GPENCIL_e_data *e_data, void *vedata,
305         struct Scene *scene,
306         struct Object *ob, struct tGPencilObjectCache *cache_ob);
307 void DRW_gpencil_populate_buffer_strokes(
308         struct GPENCIL_e_data *e_data, void *vedata, struct ToolSettings *ts, struct Object *ob);
309 void DRW_gpencil_populate_multiedit(
310         struct GPENCIL_e_data *e_data, void *vedata,
311         struct Scene *scene, struct Object *ob, struct tGPencilObjectCache *cache_ob);
312 void DRW_gpencil_triangulate_stroke_fill(struct Object *ob, struct bGPDstroke *gps);
313
314 void DRW_gpencil_multisample_ensure(struct GPENCIL_Data *vedata, int rect_w, int rect_h);
315
316 /* create geometry functions */
317 struct GPUBatch *DRW_gpencil_get_point_geom(struct bGPDstroke *gps, short thickness, const float ink[4]);
318 struct GPUBatch *DRW_gpencil_get_stroke_geom(struct bGPDstroke *gps, short thickness, const float ink[4]);
319 struct GPUBatch *DRW_gpencil_get_fill_geom(struct Object *ob, struct bGPDstroke *gps, const float color[4]);
320 struct GPUBatch *DRW_gpencil_get_edit_geom(struct bGPDstroke *gps, float alpha, short dflag);
321 struct GPUBatch *DRW_gpencil_get_edlin_geom(struct bGPDstroke *gps, float alpha, short dflag);
322 struct GPUBatch *DRW_gpencil_get_buffer_stroke_geom(struct bGPdata *gpd, short thickness);
323 struct GPUBatch *DRW_gpencil_get_buffer_fill_geom(struct bGPdata *gpd);
324 struct GPUBatch *DRW_gpencil_get_buffer_point_geom(struct bGPdata *gpd, short thickness);
325 struct GPUBatch *DRW_gpencil_get_grid(Object *ob);
326
327 /* object cache functions */
328 struct tGPencilObjectCache *gpencil_object_cache_add(
329         struct tGPencilObjectCache *cache_array, struct Object *ob,
330         int *gp_cache_size, int *gp_cache_used);
331
332 /* geometry batch cache functions */
333 void gpencil_batch_cache_check_free_slots(struct Object *ob);
334 struct GpencilBatchCache *gpencil_batch_cache_get(struct Object *ob, int cfra);
335
336 /* effects */
337 void GPENCIL_create_fx_shaders(struct GPENCIL_e_data *e_data);
338 void GPENCIL_delete_fx_shaders(struct GPENCIL_e_data *e_data);
339 void GPENCIL_create_fx_passes(struct GPENCIL_PassList *psl);
340
341 void DRW_gpencil_fx_prepare(
342         struct GPENCIL_e_data *e_data, struct GPENCIL_Data *vedata,
343         struct tGPencilObjectCache *cache);
344 void DRW_gpencil_fx_draw(
345         struct GPENCIL_e_data *e_data, struct GPENCIL_Data *vedata,
346         struct tGPencilObjectCache *cache);
347
348 /* main functions */
349 void GPENCIL_engine_init(void *vedata);
350 void GPENCIL_cache_init(void *vedata);
351 void GPENCIL_cache_populate(void *vedata, struct Object *ob);
352 void GPENCIL_cache_finish(void *vedata);
353 void GPENCIL_draw_scene(void *vedata);
354
355 /* render */
356 void GPENCIL_render_init(struct GPENCIL_Data *ved, struct RenderEngine *engine, struct Depsgraph *depsgraph);
357 void GPENCIL_render_to_image(void *vedata, struct RenderEngine *engine, struct RenderLayer *render_layer, const rcti *rect);
358
359 /* Use of multisample framebuffers. */
360 #define MULTISAMPLE_GP_SYNC_ENABLE(lvl, fbl) { \
361         if ((lvl > 0) && (fbl->multisample_fb != NULL)) { \
362                 DRW_stats_query_start("GP Multisample Blit"); \
363                 GPU_framebuffer_bind(fbl->multisample_fb); \
364                 GPU_framebuffer_clear_color_depth(fbl->multisample_fb, (const float[4]){0.0f}, 1.0f); \
365                 DRW_stats_query_end(); \
366         } \
367 }
368
369 #define MULTISAMPLE_GP_SYNC_DISABLE(lvl, fbl, fb, txl) { \
370         if ((lvl > 0) && (fbl->multisample_fb != NULL)) { \
371                 DRW_stats_query_start("GP Multisample Resolve"); \
372                 GPU_framebuffer_bind(fb); \
373                 DRW_multisamples_resolve(txl->multisample_depth, txl->multisample_color, true); \
374                 DRW_stats_query_end(); \
375         } \
376 }
377
378 #endif /* __GPENCIL_ENGINE_H__ */