Merge branch 'master' into greasepencil-object
[blender.git] / source / blender / draw / engines / gpencil / gpencil_engine.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 2017, Blender Foundation.
17  */
18
19 /** \file
20  * \ingroup draw
21  */
22
23 #ifndef __GPENCIL_ENGINE_H__
24 #define __GPENCIL_ENGINE_H__
25
26 #include "GPU_batch.h"
27
28 struct GPENCIL_Data;
29 struct GPENCIL_StorageList;
30 struct MaterialGPencilStyle;
31 struct ModifierData;
32 struct Object;
33 struct RenderEngine;
34 struct RenderLayer;
35 struct bGPDstroke;
36 struct tGPspoint;
37 struct GpencilBatchCache;
38 struct GpencilBatchCacheElem;
39 struct GpencilBatchGroup;
40
41 #define GPENCIL_CACHE_BLOCK_SIZE 8
42 #define GPENCIL_MAX_SHGROUPS 65536
43 #define GPENCIL_GROUPS_BLOCK_SIZE 1024
44
45 /* used to expand VBOs. Size has a big impact in the speed */
46 #define GPENCIL_VBO_BLOCK_SIZE 128
47
48 #define GPENCIL_COLOR_SOLID 0
49 #define GPENCIL_COLOR_TEXTURE 1
50 #define GPENCIL_COLOR_PATTERN 2
51
52 #define GP_IS_CAMERAVIEW ((rv3d != NULL) && (rv3d->persp == RV3D_CAMOB && v3d->camera))
53
54 /* *********** OBJECTS CACHE *********** */
55 typedef struct tGPencilObjectCache_shgrp {
56   int mode;
57   bool clamp_layer;
58   float blend_opacity;
59   DRWShadingGroup *init_shgrp;
60   DRWShadingGroup *end_shgrp;
61 } tGPencilObjectCache_shgrp;
62
63 /* used to save gpencil object data for drawing */
64 typedef struct tGPencilObjectCache {
65   struct Object *ob;
66   struct bGPdata *gpd;
67   int idx; /*original index, can change after sort */
68   char *name;
69
70   /* effects */
71   bool has_fx;
72   ListBase shader_fx;
73   float pixfactor;
74   DRWShadingGroup *fx_wave_sh;
75   DRWShadingGroup *fx_blur_sh;
76   DRWShadingGroup *fx_colorize_sh;
77   DRWShadingGroup *fx_pixel_sh;
78   DRWShadingGroup *fx_rim_sh;
79   DRWShadingGroup *fx_shadow_sh;
80   DRWShadingGroup *fx_glow_sh;
81   DRWShadingGroup *fx_swirl_sh;
82   DRWShadingGroup *fx_flip_sh;
83   DRWShadingGroup *fx_light_sh;
84
85   float loc[3];
86   float obmat[4][4];
87   float zdepth;   /* z-depth value to sort gp object */
88   bool is_dup_ob; /* flag to tag duplicate objects */
89   float scale;
90
91   /* shading type */
92   int shading_type[2];
93
94   /* GPU data size */
95   int tot_vertex;
96   int tot_triangles;
97
98   /* Save shader groups by layer */
99   int tot_layers;
100   tGPencilObjectCache_shgrp *shgrp_array;
101
102 } tGPencilObjectCache;
103
104 /* *********** LISTS *********** */
105 typedef struct GPENCIL_shgroup {
106   int s_clamp;
107   int stroke_style;
108   int color_type;
109   int mode;
110   int texture_mix;
111   int texture_flip;
112   int texture_clamp;
113   int fill_style;
114   int keep_size;
115   int caps_mode[2];
116   float obj_scale;
117   int xray_mode;
118   int use_follow_path;
119
120   float gradient_f;
121   float gradient_s[2];
122
123   float mix_stroke_factor;
124
125   /* color of the wireframe */
126   float wire_color[4];
127   /* shading type and mode */
128   int shading_type[2];
129   int is_xray;
130 } GPENCIL_shgroup;
131
132 typedef struct GPENCIL_Storage {
133   int shgroup_id; /* total elements */
134   float unit_matrix[4][4];
135   int stroke_style;
136   int color_type;
137   int mode;
138   int xray;
139   int keep_size;
140   float obj_scale;
141   float pixfactor;
142   bool is_playing;
143   bool is_render;
144   bool is_mat_preview;
145   int is_xray;
146   bool reset_cache;
147   bool buffer_stroke;
148   bool buffer_fill;
149   bool buffer_ctrlpoint;
150   const float *pixsize;
151   float render_pixsize;
152   int tonemapping;
153   int do_select_outline;
154   float select_color[4];
155   short multisamples;
156
157   short framebuffer_flag; /* flag what framebuffer need to create */
158
159   int blend_mode;
160   int clamp_layer;
161   float blend_opacity;
162
163   /* simplify settings*/
164   bool simplify_fill;
165   bool simplify_modif;
166   bool simplify_fx;
167   bool simplify_blend;
168
169   float gradient_f;
170   float gradient_s[2];
171   int use_follow_path;
172
173   float mix_stroke_factor;
174
175   /* Render Matrices and data */
176   float persmat[4][4], persinv[4][4];
177   float viewmat[4][4], viewinv[4][4];
178   float winmat[4][4], wininv[4][4];
179   float view_vecs[2][4]; /* vec4[2] */
180
181   float grid_matrix[4][4];
182   int shade_render[2];
183
184   Object *camera; /* camera pointer for render mode */
185 } GPENCIL_Storage;
186
187 typedef enum eGpencilFramebuffer_Flag {
188   GP_FRAMEBUFFER_MULTISAMPLE = (1 << 0),
189   GP_FRAMEBUFFER_BASIC = (1 << 1),
190   GP_FRAMEBUFFER_DRAW = (1 << 2),
191 } eGpencilFramebuffer_Flag;
192
193 typedef struct GPENCIL_StorageList {
194   struct GPENCIL_Storage *storage;
195   struct g_data *g_data;
196   struct GPENCIL_shgroup *shgroups;
197 } GPENCIL_StorageList;
198
199 typedef struct GPENCIL_PassList {
200   struct DRWPass *stroke_pass_2d;
201   struct DRWPass *stroke_pass_3d;
202   struct DRWPass *edit_pass;
203   struct DRWPass *drawing_pass;
204   struct DRWPass *mix_pass;
205   struct DRWPass *mix_pass_noblend;
206   struct DRWPass *background_pass;
207   struct DRWPass *paper_pass;
208   struct DRWPass *grid_pass;
209   struct DRWPass *blend_pass;
210
211   /* effects */
212   struct DRWPass *fx_shader_pass;
213   struct DRWPass *fx_shader_pass_blend;
214
215 } GPENCIL_PassList;
216
217 typedef struct GPENCIL_FramebufferList {
218   struct GPUFrameBuffer *main;
219   struct GPUFrameBuffer *temp_fb_a;
220   struct GPUFrameBuffer *temp_fb_b;
221   struct GPUFrameBuffer *temp_fb_fx;
222   struct GPUFrameBuffer *background_fb;
223
224   struct GPUFrameBuffer *multisample_fb;
225 } GPENCIL_FramebufferList;
226
227 typedef struct GPENCIL_TextureList {
228   struct GPUTexture *texture;
229
230   /* multisample textures */
231   struct GPUTexture *multisample_color;
232   struct GPUTexture *multisample_depth;
233
234 } GPENCIL_TextureList;
235
236 typedef struct GPENCIL_Data {
237   void *engine_type; /* Required */
238   struct GPENCIL_FramebufferList *fbl;
239   struct GPENCIL_TextureList *txl;
240   struct GPENCIL_PassList *psl;
241   struct GPENCIL_StorageList *stl;
242
243   /* render textures */
244   struct GPUTexture *render_depth_tx;
245   struct GPUTexture *render_color_tx;
246
247 } GPENCIL_Data;
248
249 /* *********** STATIC *********** */
250 typedef struct g_data {
251   struct DRWShadingGroup *shgrps_edit_point;
252   struct DRWShadingGroup *shgrps_edit_line;
253   struct DRWShadingGroup *shgrps_drawing_stroke;
254   struct DRWShadingGroup *shgrps_drawing_fill;
255   struct DRWShadingGroup *shgrps_grid;
256
257   int gp_cache_used; /* total objects in cache */
258   int gp_cache_size; /* size of the cache */
259   struct tGPencilObjectCache *gp_object_cache;
260
261   int session_flag;
262   bool do_instances;
263
264 } g_data; /* Transient data */
265
266 /* flags for fast drawing support */
267 typedef enum eGPsession_Flag {
268   GP_DRW_PAINT_HOLD = (1 << 0),
269   GP_DRW_PAINT_IDLE = (1 << 1),
270   GP_DRW_PAINT_FILLING = (1 << 2),
271   GP_DRW_PAINT_READY = (1 << 3),
272   GP_DRW_PAINT_PAINTING = (1 << 4),
273 } eGPsession_Flag;
274
275 typedef struct GPENCIL_e_data {
276   /* general drawing shaders */
277   struct GPUShader *gpencil_fill_sh;
278   struct GPUShader *gpencil_stroke_sh;
279   struct GPUShader *gpencil_point_sh;
280   struct GPUShader *gpencil_edit_point_sh;
281   struct GPUShader *gpencil_line_sh;
282   struct GPUShader *gpencil_drawing_fill_sh;
283   struct GPUShader *gpencil_fullscreen_sh;
284   struct GPUShader *gpencil_simple_fullscreen_sh;
285   struct GPUShader *gpencil_blend_fullscreen_sh;
286   struct GPUShader *gpencil_background_sh;
287   struct GPUShader *gpencil_paper_sh;
288
289   /* effects */
290   struct GPUShader *gpencil_fx_blur_sh;
291   struct GPUShader *gpencil_fx_colorize_sh;
292   struct GPUShader *gpencil_fx_flip_sh;
293   struct GPUShader *gpencil_fx_glow_prepare_sh;
294   struct GPUShader *gpencil_fx_glow_resolve_sh;
295   struct GPUShader *gpencil_fx_light_sh;
296   struct GPUShader *gpencil_fx_pixel_sh;
297   struct GPUShader *gpencil_fx_rim_prepare_sh;
298   struct GPUShader *gpencil_fx_rim_resolve_sh;
299   struct GPUShader *gpencil_fx_shadow_prepare_sh;
300   struct GPUShader *gpencil_fx_shadow_resolve_sh;
301   struct GPUShader *gpencil_fx_swirl_sh;
302   struct GPUShader *gpencil_fx_wave_sh;
303
304   /* textures */
305   struct GPUTexture *background_depth_tx;
306   struct GPUTexture *background_color_tx;
307
308   struct GPUTexture *gpencil_blank_texture;
309
310   /* runtime pointers texture */
311   struct GPUTexture *input_depth_tx;
312   struct GPUTexture *input_color_tx;
313
314   /* working textures */
315   struct GPUTexture *temp_color_tx_a;
316   struct GPUTexture *temp_depth_tx_a;
317
318   struct GPUTexture *temp_color_tx_b;
319   struct GPUTexture *temp_depth_tx_b;
320
321   struct GPUTexture *temp_color_tx_fx;
322   struct GPUTexture *temp_depth_tx_fx;
323
324   /* for buffer only one batch is nedeed because the drawing is only of one stroke */
325   GPUBatch *batch_buffer_stroke;
326   GPUBatch *batch_buffer_fill;
327   GPUBatch *batch_buffer_ctrlpoint;
328
329   /* grid geometry */
330   GPUBatch *batch_grid;
331
332 } GPENCIL_e_data; /* Engine data */
333
334 /* general drawing functions */
335 struct DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(struct GPENCIL_e_data *e_data,
336                                                           struct GPENCIL_Data *vedata,
337                                                           struct DRWPass *pass,
338                                                           struct GPUShader *shader,
339                                                           struct Object *ob,
340                                                           struct bGPdata *gpd,
341                                                           struct bGPDlayer *gpl,
342                                                           struct bGPDstroke *gps,
343                                                           struct MaterialGPencilStyle *gp_style,
344                                                           int id,
345                                                           bool onion,
346                                                           const float scale,
347                                                           const int shading_type[2]);
348 void DRW_gpencil_populate_datablock(struct GPENCIL_e_data *e_data,
349                                     void *vedata,
350                                     struct Object *ob,
351                                     struct tGPencilObjectCache *cache_ob);
352 void DRW_gpencil_populate_buffer_strokes(struct GPENCIL_e_data *e_data,
353                                          void *vedata,
354                                          struct ToolSettings *ts,
355                                          struct Object *ob);
356 void DRW_gpencil_populate_multiedit(struct GPENCIL_e_data *e_data,
357                                     void *vedata,
358                                     struct Object *ob,
359                                     struct tGPencilObjectCache *cache_ob);
360 void DRW_gpencil_triangulate_stroke_fill(struct Object *ob, struct bGPDstroke *gps);
361 void DRW_gpencil_populate_particles(struct GPENCIL_e_data *e_data,
362                                     struct GHash *gh_objects,
363                                     void *vedata);
364
365 void DRW_gpencil_multisample_ensure(struct GPENCIL_Data *vedata, int rect_w, int rect_h);
366
367 /* create geometry functions */
368 void DRW_gpencil_get_point_geom(struct GpencilBatchCacheElem *be,
369                                 struct bGPDstroke *gps,
370                                 short thickness,
371                                 const float ink[4]);
372 void DRW_gpencil_get_stroke_geom(struct GpencilBatchCacheElem *be,
373                                  struct bGPDstroke *gps,
374                                  short thickness,
375                                  const float ink[4]);
376 void DRW_gpencil_get_fill_geom(struct GpencilBatchCacheElem *be,
377                                struct Object *ob,
378                                struct bGPDstroke *gps,
379                                const float color[4]);
380 void DRW_gpencil_get_edit_geom(struct GpencilBatchCacheElem *be,
381                                struct bGPDstroke *gps,
382                                float alpha,
383                                short dflag);
384 void DRW_gpencil_get_edlin_geom(struct GpencilBatchCacheElem *be,
385                                 struct bGPDstroke *gps,
386                                 float alpha,
387                                 short dflag);
388
389 struct GPUBatch *DRW_gpencil_get_buffer_stroke_geom(struct bGPdata *gpd, short thickness);
390 struct GPUBatch *DRW_gpencil_get_buffer_fill_geom(struct bGPdata *gpd);
391 struct GPUBatch *DRW_gpencil_get_buffer_point_geom(struct bGPdata *gpd, short thickness);
392 struct GPUBatch *DRW_gpencil_get_buffer_ctrlpoint_geom(struct bGPdata *gpd);
393 struct GPUBatch *DRW_gpencil_get_grid(Object *ob);
394
395 /* object cache functions */
396 struct tGPencilObjectCache *gpencil_object_cache_add(struct tGPencilObjectCache *cache_array,
397                                                      struct Object *ob,
398                                                      int *gp_cache_size,
399                                                      int *gp_cache_used);
400
401 bool DRW_gpencil_onion_active(struct bGPdata *gpd);
402
403 /* shading groups cache functions */
404 struct GpencilBatchGroup *gpencil_group_cache_add(struct GpencilBatchGroup *cache_array,
405                                                   struct bGPDlayer *gpl,
406                                                   struct bGPDframe *gpf,
407                                                   struct bGPDstroke *gps,
408                                                   const short type,
409                                                   const bool onion,
410                                                   const int vertex_idx,
411                                                   int *grp_size,
412                                                   int *grp_used);
413
414 /* geometry batch cache functions */
415 struct GpencilBatchCache *gpencil_batch_cache_get(struct Object *ob, int cfra);
416
417 /* effects */
418 void GPENCIL_create_fx_shaders(struct GPENCIL_e_data *e_data);
419 void GPENCIL_delete_fx_shaders(struct GPENCIL_e_data *e_data);
420 void GPENCIL_create_fx_passes(struct GPENCIL_PassList *psl);
421
422 void DRW_gpencil_fx_prepare(struct GPENCIL_e_data *e_data,
423                             struct GPENCIL_Data *vedata,
424                             struct tGPencilObjectCache *cache_ob);
425 void DRW_gpencil_fx_draw(struct GPENCIL_e_data *e_data,
426                          struct GPENCIL_Data *vedata,
427                          struct tGPencilObjectCache *cache_ob);
428
429 /* main functions */
430 void GPENCIL_engine_init(void *vedata);
431 void GPENCIL_cache_init(void *vedata);
432 void GPENCIL_cache_populate(void *vedata, struct Object *ob);
433 void GPENCIL_cache_finish(void *vedata);
434 void GPENCIL_draw_scene(void *vedata);
435
436 /* render */
437 void GPENCIL_render_init(struct GPENCIL_Data *ved,
438                          struct RenderEngine *engine,
439                          struct Depsgraph *depsgraph);
440 void GPENCIL_render_to_image(void *vedata,
441                              struct RenderEngine *engine,
442                              struct RenderLayer *render_layer,
443                              const rcti *rect);
444
445 /* Use of multisample framebuffers. */
446 #define MULTISAMPLE_GP_SYNC_ENABLE(lvl, fbl) \
447   { \
448     if ((lvl > 0) && (fbl->multisample_fb != NULL)) { \
449       DRW_stats_query_start("GP Multisample Blit"); \
450       GPU_framebuffer_bind(fbl->multisample_fb); \
451       GPU_framebuffer_clear_color_depth(fbl->multisample_fb, (const float[4]){0.0f}, 1.0f); \
452       DRW_stats_query_end(); \
453     } \
454   } \
455   ((void)0)
456
457 #define MULTISAMPLE_GP_SYNC_DISABLE(lvl, fbl, fb, txl) \
458   { \
459     if ((lvl > 0) && (fbl->multisample_fb != NULL)) { \
460       DRW_stats_query_start("GP Multisample Resolve"); \
461       GPU_framebuffer_bind(fb); \
462       DRW_multisamples_resolve(txl->multisample_depth, txl->multisample_color, true); \
463       DRW_stats_query_end(); \
464     } \
465   } \
466   ((void)0)
467
468 #define GPENCIL_3D_DRAWMODE(ob, gpd) \
469   ((gpd) && (gpd->draw_mode == GP_DRAWMODE_3D) && ((ob->dtx & OB_DRAWXRAY) == 0))
470
471 #define GPENCIL_USE_SOLID(stl) \
472   ((stl) && ((stl->storage->is_render) || (stl->storage->is_mat_preview)))
473
474 #endif /* __GPENCIL_ENGINE_H__ */