Blender  V2.93
overlay_shader.c
Go to the documentation of this file.
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 2019, Blender Foundation.
17  */
18 
23 #include "DRW_render.h"
24 
25 #include "GPU_shader.h"
26 
27 #include "UI_resources.h"
28 
29 #include "overlay_private.h"
30 
31 extern char datatoc_antialiasing_frag_glsl[];
32 extern char datatoc_antialiasing_vert_glsl[];
33 extern char datatoc_armature_dof_vert_glsl[];
51 extern char datatoc_background_frag_glsl[];
52 extern char datatoc_clipbound_vert_glsl[];
53 extern char datatoc_depth_only_vert_glsl[];
60 extern char datatoc_edit_gpencil_vert_glsl[];
64 extern char datatoc_edit_mesh_frag_glsl[];
65 extern char datatoc_edit_mesh_geom_glsl[];
66 extern char datatoc_edit_mesh_vert_glsl[];
83 extern char datatoc_extra_frag_glsl[];
84 extern char datatoc_extra_vert_glsl[];
89 extern char datatoc_extra_point_vert_glsl[];
90 extern char datatoc_extra_wire_frag_glsl[];
91 extern char datatoc_extra_wire_vert_glsl[];
92 extern char datatoc_facing_frag_glsl[];
93 extern char datatoc_facing_vert_glsl[];
94 extern char datatoc_grid_frag_glsl[];
95 extern char datatoc_grid_vert_glsl[];
96 extern char datatoc_image_frag_glsl[];
98 extern char datatoc_image_vert_glsl[];
106 extern char datatoc_paint_face_vert_glsl[];
107 extern char datatoc_paint_point_vert_glsl[];
108 extern char datatoc_paint_texture_frag_glsl[];
109 extern char datatoc_paint_texture_vert_glsl[];
110 extern char datatoc_paint_vertcol_frag_glsl[];
111 extern char datatoc_paint_vertcol_vert_glsl[];
112 extern char datatoc_paint_weight_frag_glsl[];
113 extern char datatoc_paint_weight_vert_glsl[];
114 extern char datatoc_paint_wire_vert_glsl[];
115 extern char datatoc_particle_vert_glsl[];
116 extern char datatoc_particle_frag_glsl[];
117 extern char datatoc_sculpt_mask_vert_glsl[];
118 extern char datatoc_sculpt_mask_frag_glsl[];
121 extern char datatoc_wireframe_vert_glsl[];
122 extern char datatoc_wireframe_frag_glsl[];
123 extern char datatoc_xray_fade_frag_glsl[];
124 
133 
134 extern char datatoc_gpencil_common_lib_glsl[];
135 
136 extern char datatoc_common_overlay_lib_glsl[];
139 extern char datatoc_common_fxaa_lib_glsl[];
140 extern char datatoc_common_smaa_lib_glsl[];
141 extern char datatoc_common_globals_lib_glsl[];
143 extern char datatoc_common_view_lib_glsl[];
144 
145 typedef struct OVERLAY_Shaders {
231 
232 static struct {
235 } e_data = {{{NULL}}};
236 
238 {
239  if (e_data.lib == NULL) {
241  /* NOTE: These need to be ordered by dependencies. */
242  DRW_SHADER_LIB_ADD(e_data.lib, common_globals_lib);
243  DRW_SHADER_LIB_ADD(e_data.lib, common_overlay_lib);
244  DRW_SHADER_LIB_ADD(e_data.lib, common_colormanagement_lib);
245  DRW_SHADER_LIB_ADD(e_data.lib, common_view_lib);
246  }
247 }
248 
250 {
251  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
252  if (!sh_data->antialiasing) {
254  .vert = (const char *[]){datatoc_common_globals_lib_glsl,
256  NULL},
257  .frag = (const char *[]){datatoc_common_globals_lib_glsl,
259  NULL},
260  .defs = (const char *[]){NULL},
261  });
262  }
263  return sh_data->antialiasing;
264 }
265 
267 {
268  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
269  if (!sh_data->background) {
271  .vert = (const char *[]){datatoc_common_fullscreen_vert_glsl, NULL},
272  .frag =
274  });
275  }
276  return sh_data->background;
277 }
278 
280 {
281  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
282  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[0];
283  if (!sh_data->clipbound) {
286  .frag = (const char *[]){datatoc_gpu_shader_uniform_color_frag_glsl, NULL},
287  .defs = (const char *[]){sh_cfg->def, NULL},
288  });
289  }
290  return sh_data->clipbound;
291 }
292 
294 {
295  const DRWContextState *draw_ctx = DRW_context_state_get();
296  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
297  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
298  if (!sh_data->depth_only) {
300  .vert = (const char *[]){sh_cfg->lib,
303  NULL},
304  .frag = (const char *[]){datatoc_gpu_shader_depth_only_frag_glsl, NULL},
305  .defs = (const char *[]){sh_cfg->def, NULL},
306  });
307  }
308  return sh_data->depth_only;
309 }
310 
312 {
313  const DRWContextState *draw_ctx = DRW_context_state_get();
314  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
315  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
316  if (!sh_data->edit_mesh_vert) {
318  .vert = (const char *[]){sh_cfg->lib,
323  NULL},
324  .frag = (const char *[]){datatoc_gpu_shader_point_varying_color_frag_glsl, NULL},
325  .defs = (const char *[]){sh_cfg->def, "#define VERT\n", NULL},
326  });
327  }
328  return sh_data->edit_mesh_vert;
329 }
330 
332 {
333  const DRWContextState *draw_ctx = DRW_context_state_get();
334  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
335  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
336  GPUShader **sh = use_flat_interp ? &sh_data->edit_mesh_edge_flat : &sh_data->edit_mesh_edge;
337  if (*sh == NULL) {
338  /* Use geometry shader to draw edge wire-frame. This ensure us
339  * the same result across platforms and more flexibility.
340  * But we pay the cost of running a geometry shader.
341  * In the future we might consider using only the vertex shader
342  * and loading data manually with buffer textures. */
343  const bool use_geom_shader = true;
344  const bool use_smooth_wires = (U.gpu_flag & USER_GPU_FLAG_NO_EDIT_MODE_SMOOTH_WIRE) == 0;
345  const char *geom_sh_code[] = {use_geom_shader ? sh_cfg->lib : NULL,
349  NULL};
350  const char *vert_sh_code[] = {sh_cfg->lib,
355  NULL};
356  const char *frag_sh_code[] = {sh_cfg->lib,
361  NULL};
362  const char *defs[] = {sh_cfg->def,
363  use_geom_shader ? "#define USE_GEOM_SHADER\n" : "",
364  use_smooth_wires ? "#define USE_SMOOTH_WIRE\n" : "",
365  use_flat_interp ? "#define FLAT\n" : "",
366  "#define EDGE\n",
367  NULL};
368 
370  .vert = vert_sh_code,
371  .frag = frag_sh_code,
372  .geom = geom_sh_code,
373  .defs = defs,
374  });
375  }
376  return *sh;
377 }
378 
380 {
381  const DRWContextState *draw_ctx = DRW_context_state_get();
382  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
383  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
384  const char extensions[] = "#extension GL_ARB_conservative_depth : enable\n";
385  if (use_outline && !sh_data->armature_sphere_outline) {
387  .vert = (const char *[]){sh_cfg->lib,
391  NULL},
392  .frag = (const char *[]){extensions,
395  NULL},
396  .defs = (const char *[]){sh_cfg->def, NULL},
397  });
398  }
399  else if (!sh_data->armature_sphere_solid) {
401  .vert = (const char *[]){sh_cfg->lib,
404  NULL},
405  .frag = (const char *[]){extensions,
408  NULL},
409  .defs = (const char *[]){sh_cfg->def, NULL},
410  });
411  }
413 }
414 
416 {
417  const DRWContextState *draw_ctx = DRW_context_state_get();
418  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
419  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
420  if (use_outline && !sh_data->armature_shape_outline) {
422  .vert = (const char *[]){sh_cfg->lib,
426  NULL},
427  .geom = (const char *[]){sh_cfg->lib,
431  NULL},
432  .frag =
434  .defs = (const char *[]){sh_cfg->def, NULL},
435  });
436  }
437  else if (!sh_data->armature_shape_solid) {
439  .vert = (const char *[]){sh_cfg->lib,
442  NULL},
443  .frag = (const char *[]){datatoc_armature_shape_solid_frag_glsl, NULL},
444  .defs = (const char *[]){sh_cfg->def, NULL},
445  });
446  }
448 }
449 
451 {
452  const DRWContextState *draw_ctx = DRW_context_state_get();
453  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
454  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
457  .vert = (const char *[]){sh_cfg->lib,
461  NULL},
462  .frag =
464  .defs = (const char *[]){sh_cfg->def, NULL},
465  });
466  }
468 }
469 
471 {
472  const DRWContextState *draw_ctx = DRW_context_state_get();
473  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
474  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
475  if (use_outline && !sh_data->armature_envelope_outline) {
477  .vert = (const char *[]){sh_cfg->lib,
481  NULL},
482  .frag =
484  .defs = (const char *[]){sh_cfg->def, NULL},
485  });
486  }
487  else if (!sh_data->armature_envelope_solid) {
489  .vert = (const char *[]){sh_cfg->lib,
492  NULL},
493  .frag = (const char *[]){datatoc_armature_envelope_solid_frag_glsl, NULL},
494  .defs = (const char *[]){sh_cfg->def, NULL},
495  });
496  }
498 }
499 
501 {
502  const DRWContextState *draw_ctx = DRW_context_state_get();
503  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
504  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
505  if (!sh_data->armature_stick) {
507  .vert = (const char *[]){sh_cfg->lib,
511  NULL},
512  .frag = (const char *[]){datatoc_armature_stick_frag_glsl, NULL},
513  .defs = (const char *[]){sh_cfg->def, NULL},
514  });
515  }
516  return sh_data->armature_stick;
517 }
518 
520 {
521  const DRWContextState *draw_ctx = DRW_context_state_get();
522  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
523  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
524  if (!sh_data->armature_dof_wire) {
526  .vert = (const char *[]){sh_cfg->lib,
530  NULL},
531  .frag =
533  .defs = (const char *[]){sh_cfg->def, "#define EDGE\n", NULL},
534  });
535  }
536  return sh_data->armature_dof_wire;
537 }
538 
540 {
541  const DRWContextState *draw_ctx = DRW_context_state_get();
542  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
543  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
544  if (!sh_data->armature_dof_solid) {
546  .vert = (const char *[]){sh_cfg->lib,
550  NULL},
551  .frag = (const char *[]){datatoc_common_view_lib_glsl,
553  NULL},
554  .defs = (const char *[]){sh_cfg->def, NULL},
555  });
556  }
557  return sh_data->armature_dof_solid;
558 }
559 
561 {
562  const DRWContextState *draw_ctx = DRW_context_state_get();
563  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
564  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
565  if (!sh_data->armature_wire) {
567  .vert = (const char *[]){sh_cfg->lib,
571  NULL},
572  .frag =
574  .defs = (const char *[]){sh_cfg->def, NULL},
575  });
576  }
577  return sh_data->armature_wire;
578 }
579 
581 {
582  const DRWContextState *draw_ctx = DRW_context_state_get();
583  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
584  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
585  if (!sh_data->edit_curve_handle) {
587  .vert = (const char *[]){sh_cfg->lib,
591  NULL},
592  .geom = (const char *[]){sh_cfg->lib,
596  NULL},
597  .frag = (const char *[]){datatoc_gpu_shader_3D_smooth_color_frag_glsl, NULL},
598  .defs = (const char *[]){sh_cfg->def, NULL},
599  });
600  }
601  return sh_data->edit_curve_handle;
602 }
603 
605 {
606  const DRWContextState *draw_ctx = DRW_context_state_get();
607  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
608  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
609  if (!sh_data->edit_curve_point) {
611  .vert = (const char *[]){sh_cfg->lib,
615  NULL},
616  .frag = (const char *[]){datatoc_gpu_shader_point_varying_color_frag_glsl, NULL},
617  .defs = (const char *[]){sh_cfg->def, NULL},
618  });
619  }
620  return sh_data->edit_curve_point;
621 }
622 
624 {
625  const DRWContextState *draw_ctx = DRW_context_state_get();
626  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
627  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
628  if (!sh_data->edit_curve_wire) {
630  .vert = (const char *[]){sh_cfg->lib,
634  NULL},
635  .frag = (const char *[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
636  .defs = (const char *[]){sh_cfg->def, "#define IN_PLACE_INSTANCES\n", NULL},
637  });
638  }
639  return sh_data->edit_curve_wire;
640 }
641 
643 {
644  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
647  .vert = (const char *[]){datatoc_common_view_lib_glsl,
649  NULL},
650  .frag = (const char *[]){datatoc_gpu_shader_point_varying_color_frag_glsl, NULL},
651  });
652  }
654 }
655 
657 {
658  const DRWContextState *draw_ctx = DRW_context_state_get();
659  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
660  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
661  if (!sh_data->edit_gpencil_point) {
663  .vert = (const char *[]){sh_cfg->lib,
667  NULL},
668  .frag = (const char *[]){datatoc_gpu_shader_point_varying_color_frag_glsl, NULL},
669  .defs = (const char *[]){sh_cfg->def, "#define USE_POINTS\n", NULL},
670  });
671  }
672  return sh_data->edit_gpencil_point;
673 }
674 
676 {
677  const DRWContextState *draw_ctx = DRW_context_state_get();
678  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
679  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
680  if (!sh_data->edit_gpencil_wire) {
682  .vert = (const char *[]){sh_cfg->lib,
686  NULL},
687  .frag = (const char *[]){datatoc_gpu_shader_3D_smooth_color_frag_glsl, NULL},
688  .defs = (const char *[]){sh_cfg->def, NULL},
689  });
690  }
691  return sh_data->edit_gpencil_wire;
692 }
693 
695 {
696  const DRWContextState *draw_ctx = DRW_context_state_get();
697  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
698  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
699  if (!sh_data->edit_lattice_point) {
701  .vert = (const char *[]){sh_cfg->lib,
705  NULL},
706  .frag = (const char *[]){datatoc_gpu_shader_point_varying_color_frag_glsl, NULL},
707  .defs = (const char *[]){sh_cfg->def, NULL},
708  });
709  }
710  return sh_data->edit_lattice_point;
711 }
712 
714 {
715  const DRWContextState *draw_ctx = DRW_context_state_get();
716  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
717  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
718  if (!sh_data->edit_lattice_wire) {
720  .vert = (const char *[]){sh_cfg->lib,
724  NULL},
725  .frag = (const char *[]){datatoc_gpu_shader_3D_smooth_color_frag_glsl, NULL},
726  .defs = (const char *[]){sh_cfg->def, NULL},
727  });
728  }
729  return sh_data->edit_lattice_wire;
730 }
731 
733 {
734  const DRWContextState *draw_ctx = DRW_context_state_get();
735  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
736  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
737  if (!sh_data->edit_mesh_face) {
739  .vert = (const char *[]){sh_cfg->lib,
744  NULL},
745  .frag = (const char *[]){datatoc_gpu_shader_3D_smooth_color_frag_glsl, NULL},
746  .defs = (const char *[]){sh_cfg->def, "#define FACE\n", NULL},
747  });
748  }
749  return sh_data->edit_mesh_face;
750 }
751 
753 {
754  const DRWContextState *draw_ctx = DRW_context_state_get();
755  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
756  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
757  if (!sh_data->edit_mesh_facedot) {
759  .vert = (const char *[]){sh_cfg->lib,
764  NULL},
765  .frag = (const char *[]){datatoc_gpu_shader_point_varying_color_frag_glsl, NULL},
766  .defs = (const char *[]){sh_cfg->def, "#define FACEDOT\n", NULL},
767  });
768  }
769  return sh_data->edit_mesh_facedot;
770 }
771 
773 {
774  const DRWContextState *draw_ctx = DRW_context_state_get();
775  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
776  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
777  if (!sh_data->edit_mesh_normals) {
779  .vert = (const char *[]){sh_cfg->lib,
783  NULL},
784  .frag = (const char *[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
785  .defs = (const char *[]){sh_cfg->def, "#define INSTANCED_ATTR\n", NULL},
786  });
787  }
788  return sh_data->edit_mesh_normals;
789 }
790 
792 {
793  const DRWContextState *draw_ctx = DRW_context_state_get();
794  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
795  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
796  if (!sh_data->edit_mesh_analysis) {
798  .vert = (const char *[]){sh_cfg->lib,
801  NULL},
802  .frag = (const char *[]){datatoc_edit_mesh_analysis_frag_glsl, NULL},
803  .defs = (const char *[]){sh_cfg->def, NULL},
804  });
805  }
806  return sh_data->edit_mesh_analysis;
807 }
808 
810 {
811  const DRWContextState *draw_ctx = DRW_context_state_get();
812  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
813  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
816  .vert = (const char *[]){sh_cfg->lib,
820  NULL},
821  .frag = (const char *[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
822  .defs = (const char *[]){sh_cfg->def, "#define INSTANCED_ATTR\n", NULL},
823  });
824  }
826 }
827 
829 {
830  const DRWContextState *draw_ctx = DRW_context_state_get();
831  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
832  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
835  .vert = (const char *[]){sh_cfg->lib,
839  NULL},
840  .frag = (const char *[]){datatoc_gpu_shader_3D_smooth_color_frag_glsl, NULL},
841  .defs = (const char *[]){sh_cfg->def, NULL},
842  });
843  }
845 }
846 
848 {
849  const DRWContextState *draw_ctx = DRW_context_state_get();
850  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
851  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
854  .vert = (const char *[]){sh_cfg->lib,
858  NULL},
859  .frag = (const char *[]){datatoc_gpu_shader_point_varying_color_frag_glsl, NULL},
860  .defs = (const char *[]){sh_cfg->def, NULL},
861  });
862  }
864 }
865 
867 {
868  const DRWContextState *draw_ctx = DRW_context_state_get();
869  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
870  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
871  GPUShader **sh = (is_select) ? &sh_data->extra_select : &sh_data->extra;
872  if (!*sh) {
874  .vert = (const char *[]){sh_cfg->lib,
878  NULL},
879  .frag = (const char *[]){datatoc_common_view_lib_glsl, datatoc_extra_frag_glsl, NULL},
880  .defs = (const char *[]){sh_cfg->def, (is_select) ? "#define SELECT_EDGES\n" : NULL, NULL},
881  });
882  }
883  return *sh;
884 }
885 
887 {
888  const DRWContextState *draw_ctx = DRW_context_state_get();
889  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
890  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
893  .vert = (const char *[]){sh_cfg->lib,
898  NULL},
899  .frag = (const char *[]){datatoc_gpu_shader_point_varying_color_frag_glsl, NULL},
900  .defs = (const char *[]){sh_cfg->def, NULL},
901  });
902  }
904 }
905 
907 {
908  const DRWContextState *draw_ctx = DRW_context_state_get();
909  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
910  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
911  if (!sh_data->extra_groundline) {
913  .vert = (const char *[]){sh_cfg->lib,
917  NULL},
918  .frag = (const char *[]){datatoc_common_view_lib_glsl, datatoc_extra_frag_glsl, NULL},
919  .defs = (const char *[]){sh_cfg->def, NULL},
920  });
921  }
922  return sh_data->extra_groundline;
923 }
924 
925 GPUShader *OVERLAY_shader_extra_wire(bool use_object, bool is_select)
926 {
927  const DRWContextState *draw_ctx = DRW_context_state_get();
928  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
929  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
930  GPUShader **sh = (is_select) ? &sh_data->extra_wire_select : &sh_data->extra_wire[use_object];
931  if (!*sh) {
932  char colorids[1024];
933  /* NOTE: define all ids we need here. */
934  BLI_snprintf(colorids,
935  sizeof(colorids),
936  "#define TH_ACTIVE %d\n"
937  "#define TH_SELECT %d\n"
938  "#define TH_TRANSFORM %d\n"
939  "#define TH_WIRE %d\n"
940  "#define TH_CAMERA_PATH %d\n",
941  TH_ACTIVE,
942  TH_SELECT,
943  TH_TRANSFORM,
944  TH_WIRE,
947  .vert = (const char *[]){sh_cfg->lib,
951  NULL},
953  .defs = (const char *[]){sh_cfg->def,
954  colorids,
955  (is_select) ? "#define SELECT_EDGES\n" : "",
956  (use_object) ? "#define OBJECT_WIRE \n" : NULL,
957  NULL},
958  });
959  }
960  return *sh;
961 }
962 
964 {
965  const DRWContextState *draw_ctx = DRW_context_state_get();
966  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
967  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
968  if (!sh_data->extra_loose_point) {
970  .vert = (const char *[]){sh_cfg->lib,
974  NULL},
975  .frag = (const char *[]){datatoc_common_globals_lib_glsl,
977  NULL},
978  .defs = (const char *[]){sh_cfg->def, NULL},
979  });
980  }
981  return sh_data->extra_loose_point;
982 }
983 
985 {
986  const DRWContextState *draw_ctx = DRW_context_state_get();
987  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
988  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
989  if (!sh_data->extra_point) {
991  .vert = (const char *[]){sh_cfg->lib,
995  NULL},
996  .frag =
998  NULL},
999  .defs = (const char *[]){sh_cfg->def, NULL},
1000  });
1001  }
1002  return sh_data->extra_point;
1003 }
1004 
1006 {
1007  const DRWContextState *draw_ctx = DRW_context_state_get();
1008  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
1009  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
1010  if (!sh_data->facing) {
1012  .vert = (const char *[]){sh_cfg->lib,
1015  NULL},
1017  .defs = (const char *[]){sh_cfg->def, NULL},
1018  });
1019  }
1020  return sh_data->facing;
1021 }
1022 
1024 {
1025  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
1026  if (!sh_data->gpencil_canvas) {
1028  .vert = (const char *[]){datatoc_common_globals_lib_glsl,
1031  NULL},
1032  .frag = (const char *[]){datatoc_common_view_lib_glsl, datatoc_extra_frag_glsl, NULL},
1033  });
1034  }
1035  return sh_data->gpencil_canvas;
1036 }
1037 
1039 {
1040  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
1041  if (!sh_data->grid) {
1043  .vert = (const char *[]){datatoc_common_globals_lib_glsl,
1046  NULL},
1047  .frag = (const char *[]){datatoc_common_globals_lib_glsl,
1050  NULL},
1051  });
1052  }
1053  return sh_data->grid;
1054 }
1055 
1057 {
1058  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
1059  if (!sh_data->grid_image) {
1062  NULL,
1064  e_data.lib,
1065  "#define blender_srgb_to_framebuffer_space(a) a\n");
1066  }
1067  return sh_data->grid_image;
1068 }
1069 
1071 {
1072  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
1076  }
1078 }
1079 
1081 {
1082  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
1083  if (!sh_data->edit_uv_mask_image) {
1086  NULL,
1088  e_data.lib,
1089  NULL);
1090  }
1091  return sh_data->edit_uv_mask_image;
1092 }
1093 
1095 {
1096  const DRWContextState *draw_ctx = DRW_context_state_get();
1097  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
1098  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
1099  if (!sh_data->image) {
1101  .vert = (const char *[]){sh_cfg->lib,
1104  NULL},
1105  .frag = (const char *[]){datatoc_common_colormanagement_lib_glsl,
1107  NULL},
1108  .defs = (const char *[]){sh_cfg->def, NULL},
1109  });
1110  }
1111  return sh_data->image;
1112 }
1113 
1115 {
1116  const DRWContextState *draw_ctx = DRW_context_state_get();
1117  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
1118  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
1119  if (!sh_data->motion_path_line) {
1121  .vert = (const char *[]){sh_cfg->lib,
1125  NULL},
1126  .geom = (const char *[]){sh_cfg->lib,
1130  NULL},
1131  .frag = (const char *[]){datatoc_gpu_shader_3D_smooth_color_frag_glsl, NULL},
1132  .defs = (const char *[]){sh_cfg->def, NULL},
1133  });
1134  }
1135  return sh_data->motion_path_line;
1136 }
1137 
1139 {
1140  const DRWContextState *draw_ctx = DRW_context_state_get();
1141  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
1142  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
1143  if (!sh_data->motion_path_vert) {
1145  .vert = (const char *[]){sh_cfg->lib,
1149  NULL},
1150  .frag = (const char *[]){datatoc_gpu_shader_point_varying_color_frag_glsl, NULL},
1151  .defs = (const char *[]){sh_cfg->def, NULL},
1152  });
1153  }
1154  return sh_data->motion_path_vert;
1155 }
1156 
1158 {
1159  const DRWContextState *draw_ctx = DRW_context_state_get();
1160  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
1161  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
1162  if (use_wire && !sh_data->outline_prepass_wire) {
1164  .vert = (const char *[]){sh_cfg->lib,
1168  NULL},
1169  .geom = (const char *[]){sh_cfg->lib,
1172  NULL},
1173  .frag = (const char *[]){datatoc_outline_prepass_frag_glsl, NULL},
1174  .defs = (const char *[]){sh_cfg->def, "#define USE_GEOM\n", NULL},
1175  });
1176  }
1177  else if (!sh_data->outline_prepass) {
1179  .vert = (const char *[]){sh_cfg->lib,
1183  NULL},
1184  .frag = (const char *[]){datatoc_outline_prepass_frag_glsl, NULL},
1185  .defs = (const char *[]){sh_cfg->def, NULL},
1186  });
1187  }
1188  return use_wire ? sh_data->outline_prepass_wire : sh_data->outline_prepass;
1189 }
1190 
1192 {
1193  const DRWContextState *draw_ctx = DRW_context_state_get();
1194  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
1195  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
1198  .vert = (const char *[]){sh_cfg->lib,
1203  NULL},
1204  .frag = (const char *[]){datatoc_common_view_lib_glsl,
1207  NULL},
1208  .defs = (const char *[]){sh_cfg->def,
1209  "#define USE_GPENCIL\n",
1210  "#define UNIFORM_RESOURCE_ID\n",
1211  NULL},
1212  });
1213  }
1215 }
1216 
1218 {
1219  const DRWContextState *draw_ctx = DRW_context_state_get();
1220  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
1221  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
1224  .vert = (const char *[]){sh_cfg->lib,
1229  NULL},
1230  .frag = (const char *[]){datatoc_common_view_lib_glsl,
1233  NULL},
1234  .defs = (const char *[]){sh_cfg->def,
1235  "#define POINTCLOUD\n",
1236  "#define INSTANCED_ATTR\n",
1237  "#define UNIFORM_RESOURCE_ID\n",
1238  NULL},
1239  });
1240  }
1242 }
1243 
1245 {
1246  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
1247  if (!sh_data->outline_detect) {
1249  .vert = (const char *[]){datatoc_common_fullscreen_vert_glsl, NULL},
1250  .frag = (const char *[]){datatoc_common_view_lib_glsl,
1253  NULL},
1254  });
1255  }
1256  return sh_data->outline_detect;
1257 }
1258 
1260 {
1261  const DRWContextState *draw_ctx = DRW_context_state_get();
1262  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
1263  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
1264  if (!sh_data->paint_face) {
1266  .vert = (const char *[]){sh_cfg->lib,
1269  NULL},
1270  .frag = (const char *[]){datatoc_gpu_shader_uniform_color_frag_glsl, NULL},
1271  .defs = (const char *[]){sh_cfg->def, NULL},
1272  });
1273  }
1274  return sh_data->paint_face;
1275 }
1276 
1278 {
1279  const DRWContextState *draw_ctx = DRW_context_state_get();
1280  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
1281  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
1282  if (!sh_data->paint_point) {
1284  .vert = (const char *[]){sh_cfg->lib,
1288  NULL},
1289  .frag = (const char *[]){datatoc_gpu_shader_point_varying_color_frag_glsl, NULL},
1290  .defs = (const char *[]){sh_cfg->def, NULL},
1291  });
1292  }
1293  return sh_data->paint_point;
1294 }
1295 
1297 {
1298  const DRWContextState *draw_ctx = DRW_context_state_get();
1299  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
1300  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
1301  if (!sh_data->paint_texture) {
1303  .vert = (const char *[]){sh_cfg->lib,
1306  NULL},
1307  .frag = (const char *[]){datatoc_common_colormanagement_lib_glsl,
1309  NULL},
1310  .defs = (const char *[]){sh_cfg->def, NULL},
1311  });
1312  }
1313  return sh_data->paint_texture;
1314 }
1315 
1317 {
1318  const DRWContextState *draw_ctx = DRW_context_state_get();
1319  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
1320  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
1321  if (!sh_data->paint_vertcol) {
1323  .vert = (const char *[]){sh_cfg->lib,
1327  NULL},
1328  .frag = (const char *[]){datatoc_common_globals_lib_glsl,
1330  NULL},
1331  .defs = (const char *[]){sh_cfg->def, NULL},
1332  });
1333  }
1334  return sh_data->paint_vertcol;
1335 }
1336 
1338 {
1339  const DRWContextState *draw_ctx = DRW_context_state_get();
1340  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
1341  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
1342  if (!sh_data->paint_weight) {
1344  .vert = (const char *[]){sh_cfg->lib,
1348  NULL},
1349  .frag = (const char *[]){datatoc_common_globals_lib_glsl,
1351  NULL},
1352  .defs = (const char *[]){sh_cfg->def, NULL},
1353  });
1354  }
1355  return sh_data->paint_weight;
1356 }
1357 
1359 {
1360  const DRWContextState *draw_ctx = DRW_context_state_get();
1361  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
1362  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
1363  if (!sh_data->paint_wire) {
1365  .vert = (const char *[]){sh_cfg->lib,
1369  NULL},
1370  .frag = (const char *[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
1371  .defs = (const char *[]){sh_cfg->def, NULL},
1372  });
1373  }
1374  return sh_data->paint_wire;
1375 }
1376 
1378 {
1379  const DRWContextState *draw_ctx = DRW_context_state_get();
1380  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
1381  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
1382  if (!sh_data->particle_dot) {
1384  .vert = (const char *[]){sh_cfg->lib,
1388  NULL},
1389  .frag = (const char *[]){datatoc_common_view_lib_glsl, datatoc_particle_frag_glsl, NULL},
1390  .defs = (const char *[]){sh_cfg->def, "#define USE_DOTS\n", NULL},
1391  });
1392  }
1393  return sh_data->particle_dot;
1394 }
1395 
1397 {
1398  const DRWContextState *draw_ctx = DRW_context_state_get();
1399  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
1400  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
1401  if (!sh_data->particle_shape) {
1403  .vert = (const char *[]){sh_cfg->lib,
1407  NULL},
1408  .frag = (const char *[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
1409  .defs = (const char *[]){sh_cfg->def, "#define INSTANCED_ATTR\n", NULL},
1410  });
1411  }
1412  return sh_data->particle_shape;
1413 }
1414 
1416 {
1417  const DRWContextState *draw_ctx = DRW_context_state_get();
1418  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
1419  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
1420  if (!sh_data->sculpt_mask) {
1422  .vert = (const char *[]){sh_cfg->lib,
1425  NULL},
1426  .frag = (const char *[]){datatoc_sculpt_mask_frag_glsl, NULL},
1427  .defs = (const char *[]){sh_cfg->def, NULL},
1428  });
1429  }
1430  return sh_data->sculpt_mask;
1431 }
1432 
1434 {
1435  const DRWContextState *draw_ctx = DRW_context_state_get();
1436  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
1437  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
1438  if (!sh_data->uniform_color) {
1440  .vert = (const char *[]){sh_cfg->lib,
1443  NULL},
1444  .frag = (const char *[]){datatoc_gpu_shader_uniform_color_frag_glsl, NULL},
1445  .defs = (const char *[]){sh_cfg->def, NULL},
1446  });
1447  }
1448  return sh_data->uniform_color;
1449 }
1450 
1451 struct GPUShader *OVERLAY_shader_volume_velocity(bool use_needle, bool use_mac)
1452 {
1453  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
1454  if (use_needle && !sh_data->volume_velocity_needle_sh) {
1457  NULL,
1460  "#define blender_srgb_to_framebuffer_space(a) a\n"
1461  "#define USE_NEEDLE\n");
1462  }
1463  else if (use_mac && !sh_data->volume_velocity_mac_sh) {
1466  NULL,
1469  "#define blender_srgb_to_framebuffer_space(a) a\n"
1470  "#define USE_MAC\n");
1471  }
1472  else if (!sh_data->volume_velocity_sh) {
1475  NULL,
1478  "#define blender_srgb_to_framebuffer_space(a) a\n");
1479  }
1480  if (use_needle) {
1482  }
1483  if (use_mac) {
1485  }
1486 
1487  return sh_data->volume_velocity_sh;
1488 }
1489 
1490 struct GPUShader *OVERLAY_shader_volume_gridlines(bool color_with_flags, bool color_range)
1491 {
1492  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
1493  if (!sh_data->volume_gridlines_flags_sh && color_with_flags) {
1496  NULL,
1499  "#define blender_srgb_to_framebuffer_space(a) a\n"
1500  "#define SHOW_FLAGS\n");
1501  }
1502  else if (!sh_data->volume_gridlines_range_sh && color_range) {
1505  NULL,
1508  "#define blender_srgb_to_framebuffer_space(a) a\n"
1509  "#define SHOW_RANGE\n");
1510  }
1511  else if (!sh_data->volume_gridlines_sh) {
1514  NULL,
1517  "#define blender_srgb_to_framebuffer_space(a) a\n");
1518  }
1519 
1520  if (color_with_flags) {
1522  }
1523  if (color_range) {
1525  }
1526 
1527  return sh_data->volume_gridlines_sh;
1528 }
1529 
1531 {
1532  const DRWContextState *draw_ctx = DRW_context_state_get();
1533  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
1534  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
1535  if (!sh_data->wireframe_select) {
1537  .vert = (const char *[]){sh_cfg->lib,
1542  NULL},
1543  .frag = (const char *[]){datatoc_wireframe_frag_glsl, NULL},
1544  .defs = (const char *[]){sh_cfg->def, "#define SELECT_EDGES\n", NULL},
1545  });
1546  }
1547  return sh_data->wireframe_select;
1548 }
1549 
1551 {
1552  const DRWContextState *draw_ctx = DRW_context_state_get();
1553  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
1554  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
1555  if (!sh_data->wireframe[custom_bias]) {
1557  .vert = (const char *[]){sh_cfg->lib,
1562  NULL},
1563  .frag = (const char *[]){datatoc_common_view_lib_glsl,
1566  NULL},
1567  .defs = (const char *[]){sh_cfg->def,
1568  custom_bias ? "#define CUSTOM_DEPTH_BIAS\n" : NULL,
1569  NULL},
1570  });
1571  }
1572  return sh_data->wireframe[custom_bias];
1573 }
1574 
1576 {
1577  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
1578  if (!sh_data->xray_fade) {
1580  .vert = (const char *[]){datatoc_common_fullscreen_vert_glsl, NULL},
1581  .frag = (const char *[]){datatoc_xray_fade_frag_glsl, NULL},
1582  });
1583  }
1584  return sh_data->xray_fade;
1585 }
1586 
1587 /* -------------------------------------------------------------------- */
1592 {
1593  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
1594  if (!sh_data->edit_uv_edges) {
1598  e_data.lib,
1599  NULL);
1600  }
1601  return sh_data->edit_uv_edges;
1602 }
1603 
1605 {
1606  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
1607  if (!sh_data->edit_uv_faces) {
1610  NULL,
1612  e_data.lib,
1613  "#define blender_srgb_to_framebuffer_space(a) a\n");
1614  }
1615  return sh_data->edit_uv_faces;
1616 }
1617 
1619 {
1620  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
1621  if (!sh_data->edit_uv_face_dots) {
1624  NULL,
1626  e_data.lib,
1627  "#define blender_srgb_to_framebuffer_space(a) a\n");
1628  }
1629  return sh_data->edit_uv_face_dots;
1630 }
1631 
1633 {
1634  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
1635  if (!sh_data->edit_uv_verts) {
1638  }
1639 
1640  return sh_data->edit_uv_verts;
1641 }
1642 
1644 {
1645  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
1649  NULL,
1651  e_data.lib,
1652  "#define blender_srgb_to_framebuffer_space(a) a\n");
1653  }
1654 
1656 }
1657 
1659 {
1660  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
1664  NULL,
1666  e_data.lib,
1667  "#define blender_srgb_to_framebuffer_space(a) a\n#define STRETCH_ANGLE\n");
1668  }
1669 
1671 }
1672 
1674 {
1675  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
1679  NULL,
1681  e_data.lib,
1682  "#define blender_srgb_to_framebuffer_space(a) a\n");
1683  }
1685 }
1686 
1690 
1692 {
1694  {
1695  {"pos", DRW_ATTR_FLOAT, 3},
1696  });
1698  {
1699  {"pos", DRW_ATTR_FLOAT, 3},
1700  {"color", DRW_ATTR_FLOAT, 4},
1701  });
1703  {
1704  {"inst_pos", DRW_ATTR_FLOAT, 3},
1705  });
1707  {
1708  {"color", DRW_ATTR_FLOAT, 4},
1709  {"inst_obmat", DRW_ATTR_FLOAT, 16},
1710  });
1712  {
1713  {"pos", DRW_ATTR_FLOAT, 3},
1714  {"colorid", DRW_ATTR_INT, 1},
1715  });
1717  {
1718  {"pos", DRW_ATTR_FLOAT, 3},
1719  {"colorid", DRW_ATTR_INT, 1},
1720  });
1722  {
1723  {"inst_obmat", DRW_ATTR_FLOAT, 16},
1724  });
1726  {
1727  {"boneStart", DRW_ATTR_FLOAT, 3},
1728  {"boneEnd", DRW_ATTR_FLOAT, 3},
1729  {"wireColor", DRW_ATTR_FLOAT, 4}, /* TODO uchar color */
1730  {"boneColor", DRW_ATTR_FLOAT, 4},
1731  {"headColor", DRW_ATTR_FLOAT, 4},
1732  {"tailColor", DRW_ATTR_FLOAT, 4},
1733  });
1735  {
1736  {"headSphere", DRW_ATTR_FLOAT, 4},
1737  {"tailSphere", DRW_ATTR_FLOAT, 4},
1738  {"outlineColorSize", DRW_ATTR_FLOAT, 4},
1739  {"xAxis", DRW_ATTR_FLOAT, 3},
1740  });
1742  {
1743  {"headSphere", DRW_ATTR_FLOAT, 4},
1744  {"tailSphere", DRW_ATTR_FLOAT, 4},
1745  {"xAxis", DRW_ATTR_FLOAT, 3},
1746  });
1748  {
1749  {"headSphere", DRW_ATTR_FLOAT, 4},
1750  {"tailSphere", DRW_ATTR_FLOAT, 4},
1751  {"boneColor", DRW_ATTR_FLOAT, 3},
1752  {"stateColor", DRW_ATTR_FLOAT, 3},
1753  {"xAxis", DRW_ATTR_FLOAT, 3},
1754  });
1755 
1756  return &g_formats;
1757 }
1758 
1760 {
1762 
1763  for (int sh_data_index = 0; sh_data_index < ARRAY_SIZE(e_data.sh_data); sh_data_index++) {
1764  OVERLAY_Shaders *sh_data = &e_data.sh_data[sh_data_index];
1765  GPUShader **sh_data_as_array = (GPUShader **)sh_data;
1766  for (int i = 0; i < (sizeof(OVERLAY_Shaders) / sizeof(GPUShader *)); i++) {
1767  DRW_SHADER_FREE_SAFE(sh_data_as_array[i]);
1768  }
1769  }
1770  struct GPUVertFormat **format = (struct GPUVertFormat **)&g_formats;
1771  for (int i = 0; i < sizeof(g_formats) / sizeof(void *); i++, format++) {
1773  }
1774 }
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
#define ARRAY_SIZE(arr)
@ USER_GPU_FLAG_NO_EDIT_MODE_SMOOTH_WIRE
#define DRW_shader_create_with_lib(vert, geom, frag, lib, defines)
Definition: DRW_render.h:237
#define DRW_shgroup_instance_format(format,...)
Definition: DRW_render.h:391
#define DRW_SHADER_LIB_FREE_SAFE(lib)
Definition: DRW_render.h:298
#define DRW_SHADER_LIB_ADD(lib, lib_name)
Definition: DRW_render.h:291
#define DRW_SHADER_FREE_SAFE(shader)
Definition: DRW_render.h:279
#define DRW_shader_create_with_shaderlib(vert, geom, frag, lib, defines)
Definition: DRW_render.h:239
struct GPUShader GPUShader
Definition: GPU_shader.h:33
const GPUShaderConfigData GPU_shader_cfg_data[GPU_SHADER_CFG_LEN]
#define GPU_shader_create_from_arrays(...)
Definition: GPU_shader.h:69
#define GPU_SHADER_CFG_LEN
Definition: GPU_shader.h:395
#define MEM_SAFE_FREE(v)
@ TH_WIRE
Definition: UI_resources.h:85
@ TH_TRANSFORM
Definition: UI_resources.h:92
@ TH_CAMERA_PATH
Definition: UI_resources.h:254
@ TH_SELECT
Definition: UI_resources.h:88
@ TH_ACTIVE
Definition: UI_resources.h:89
unsigned int U
Definition: btGjkEpa3.h:78
const DRWContextState * DRW_context_state_get(void)
DRWShaderLibrary * DRW_shader_library_create(void)
format
Definition: logImageCore.h:47
char datatoc_gpu_shader_uniform_color_frag_glsl[]
GPUShader * OVERLAY_shader_edit_lattice_wire(void)
char datatoc_armature_shape_solid_frag_glsl[]
char datatoc_extra_groundline_vert_glsl[]
char datatoc_paint_wire_vert_glsl[]
char datatoc_antialiasing_vert_glsl[]
char datatoc_edit_gpencil_guide_vert_glsl[]
char datatoc_extra_point_vert_glsl[]
char datatoc_gpu_shader_common_obinfos_lib_glsl[]
char datatoc_gpu_shader_3D_smooth_color_frag_glsl[]
GPUShader * OVERLAY_shader_edit_uv_stretching_angle_get(void)
char datatoc_wireframe_frag_glsl[]
char datatoc_armature_envelope_solid_frag_glsl[]
char datatoc_edit_mesh_geom_glsl[]
char datatoc_common_pointcloud_lib_glsl[]
char datatoc_edit_particle_point_vert_glsl[]
char datatoc_common_fxaa_lib_glsl[]
char datatoc_armature_shape_solid_vert_glsl[]
GPUShader * OVERLAY_shader_image(void)
void OVERLAY_shader_library_ensure(void)
char datatoc_clipbound_vert_glsl[]
char datatoc_edit_curve_handle_vert_glsl[]
char datatoc_sculpt_mask_frag_glsl[]
GPUShader * OVERLAY_shader_edit_curve_handle(void)
void OVERLAY_shader_free(void)
char datatoc_armature_envelope_solid_vert_glsl[]
char datatoc_edit_curve_point_vert_glsl[]
char datatoc_background_frag_glsl[]
GPUShader * OVERLAY_shader_armature_degrees_of_freedom_wire(void)
char datatoc_armature_sphere_solid_frag_glsl[]
char datatoc_xray_fade_frag_glsl[]
char datatoc_gpu_shader_depth_only_frag_glsl[]
GPUShader * OVERLAY_shader_edit_gpencil_guide_point(void)
char datatoc_particle_frag_glsl[]
GPUShader * OVERLAY_shader_edit_lattice_point(void)
struct OVERLAY_Shaders OVERLAY_Shaders
char datatoc_armature_shape_outline_vert_glsl[]
char datatoc_paint_texture_frag_glsl[]
GPUShader * OVERLAY_shader_edit_mesh_edge(bool use_flat_interp)
char datatoc_armature_sphere_solid_vert_glsl[]
char datatoc_edit_uv_tiled_image_borders_vert_glsl[]
GPUShader * OVERLAY_shader_paint_face(void)
char datatoc_grid_frag_glsl[]
char datatoc_common_smaa_lib_glsl[]
char datatoc_paint_weight_vert_glsl[]
char datatoc_extra_wire_frag_glsl[]
GPUShader * OVERLAY_shader_edit_uv_face_get(void)
char datatoc_armature_envelope_distance_frag_glsl[]
GPUShader * OVERLAY_shader_armature_sphere(bool use_outline)
char datatoc_armature_sphere_outline_vert_glsl[]
GPUShader * OVERLAY_shader_wireframe(bool custom_bias)
GPUShader * OVERLAY_shader_edit_gpencil_point(void)
char datatoc_paint_weight_frag_glsl[]
char datatoc_facing_frag_glsl[]
char datatoc_facing_vert_glsl[]
GPUShader * OVERLAY_shader_edit_curve_wire(void)
GPUShader * OVERLAY_shader_outline_prepass(bool use_wire)
char datatoc_wireframe_vert_glsl[]
GPUShader * OVERLAY_shader_edit_mesh_facedot(void)
char datatoc_motion_path_line_geom_glsl[]
char datatoc_extra_loose_point_vert_glsl[]
GPUShader * OVERLAY_shader_extra_groundline(void)
char datatoc_extra_loose_point_frag_glsl[]
GPUShader * OVERLAY_shader_extra_loose_point(void)
GPUShader * OVERLAY_shader_armature_degrees_of_freedom_solid(void)
GPUShader * OVERLAY_shader_edit_uv_stencil_image(void)
OVERLAY_Shaders sh_data[GPU_SHADER_CFG_LEN]
char datatoc_edit_mesh_analysis_frag_glsl[]
char datatoc_edit_uv_edges_frag_glsl[]
GPUShader * OVERLAY_shader_edit_gpencil_wire(void)
GPUShader * OVERLAY_shader_background(void)
char datatoc_paint_face_vert_glsl[]
GPUShader * OVERLAY_shader_clipbound(void)
char datatoc_edit_uv_verts_frag_glsl[]
GPUShader * OVERLAY_shader_edit_uv_face_dots_get(void)
struct GPUShader * OVERLAY_shader_volume_velocity(bool use_needle, bool use_mac)
char datatoc_outline_prepass_frag_glsl[]
char datatoc_armature_shape_wire_vert_glsl[]
char datatoc_edit_particle_strand_vert_glsl[]
char datatoc_sculpt_mask_vert_glsl[]
char datatoc_edit_uv_image_mask_frag_glsl[]
char datatoc_edit_uv_face_dots_vert_glsl[]
GPUShader * OVERLAY_shader_motion_path_vert(void)
GPUShader * OVERLAY_shader_particle_dot(void)
char datatoc_armature_stick_frag_glsl[]
char datatoc_edit_uv_edges_geom_glsl[]
char datatoc_motion_path_point_vert_glsl[]
char datatoc_edit_mesh_normal_vert_glsl[]
char datatoc_image_vert_glsl[]
char datatoc_common_view_lib_glsl[]
char datatoc_extra_vert_glsl[]
GPUShader * OVERLAY_shader_paint_point(void)
GPUShader * OVERLAY_shader_edit_mesh_skin_root(void)
GPUShader * OVERLAY_shader_extra_grid(void)
char datatoc_edit_uv_stretching_vert_glsl[]
char datatoc_armature_dof_solid_frag_glsl[]
char datatoc_edit_uv_image_vert_glsl[]
char datatoc_depth_only_vert_glsl[]
struct GPUShader * OVERLAY_shader_volume_gridlines(bool color_with_flags, bool color_range)
GPUShader * OVERLAY_shader_edit_uv_stretching_area_get(void)
char datatoc_common_fullscreen_vert_glsl[]
char datatoc_extra_lightprobe_grid_vert_glsl[]
GPUShader * OVERLAY_shader_particle_shape(void)
GPUShader * OVERLAY_shader_motion_path_line(void)
char datatoc_edit_mesh_skin_root_vert_glsl[]
GPUShader * OVERLAY_shader_edit_mesh_vert(void)
GPUShader * OVERLAY_shader_paint_weight(void)
GPUShader * OVERLAY_shader_edit_uv_verts_get(void)
char datatoc_paint_vertcol_frag_glsl[]
char datatoc_edit_mesh_common_lib_glsl[]
char datatoc_edit_uv_faces_vert_glsl[]
GPUShader * OVERLAY_shader_extra(bool is_select)
GPUShader * OVERLAY_shader_edit_particle_strand(void)
GPUShader * OVERLAY_shader_extra_wire(bool use_object, bool is_select)
DRWShaderLibrary * lib
char datatoc_gpu_shader_point_varying_color_frag_glsl[]
char datatoc_edit_lattice_wire_vert_glsl[]
GPUShader * OVERLAY_shader_sculpt_mask(void)
GPUShader * OVERLAY_shader_edit_uv_mask_image(void)
GPUShader * OVERLAY_shader_armature_shape_wire(void)
char datatoc_outline_prepass_geom_glsl[]
char datatoc_motion_path_line_vert_glsl[]
char datatoc_antialiasing_frag_glsl[]
char datatoc_paint_point_vert_glsl[]
char datatoc_paint_vertcol_vert_glsl[]
GPUShader * OVERLAY_shader_edit_uv_edges_get(void)
char datatoc_common_colormanagement_lib_glsl[]
char datatoc_armature_wire_vert_glsl[]
GPUShader * OVERLAY_shader_edit_mesh_face(void)
char datatoc_common_globals_lib_glsl[]
char datatoc_gpu_shader_point_varying_color_varying_outline_aa_frag_glsl[]
GPUShader * OVERLAY_shader_edit_mesh_normal(void)
GPUShader * OVERLAY_shader_armature_shape(bool use_outline)
GPUShader * OVERLAY_shader_xray_fade(void)
char datatoc_armature_wire_frag_glsl[]
GPUShader * OVERLAY_shader_armature_wire(void)
GPUShader * OVERLAY_shader_grid(void)
char datatoc_extra_frag_glsl[]
GPUShader * OVERLAY_shader_edit_curve_point(void)
GPUShader * OVERLAY_shader_depth_only(void)
GPUShader * OVERLAY_shader_paint_wire(void)
char datatoc_volume_velocity_vert_glsl[]
GPUShader * OVERLAY_shader_armature_envelope(bool use_outline)
char datatoc_edit_lattice_point_vert_glsl[]
GPUShader * OVERLAY_shader_edit_particle_point(void)
GPUShader * OVERLAY_shader_edit_uv_tiled_image_borders_get(void)
char datatoc_armature_dof_vert_glsl[]
char datatoc_edit_uv_verts_vert_glsl[]
char datatoc_extra_wire_vert_glsl[]
char datatoc_edit_curve_handle_geom_glsl[]
GPUShader * OVERLAY_shader_paint_vertcol(void)
char datatoc_grid_vert_glsl[]
char datatoc_outline_detect_frag_glsl[]
GPUShader * OVERLAY_shader_extra_point(void)
char datatoc_edit_curve_wire_vert_glsl[]
char datatoc_paint_texture_vert_glsl[]
char datatoc_image_frag_glsl[]
GPUShader * OVERLAY_shader_grid_image(void)
char datatoc_edit_uv_edges_vert_glsl[]
GPUShader * OVERLAY_shader_outline_prepass_gpencil(void)
GPUShader * OVERLAY_shader_antialiasing(void)
char datatoc_gpu_shader_2D_smooth_color_frag_glsl[]
char datatoc_armature_stick_vert_glsl[]
char datatoc_armature_envelope_outline_vert_glsl[]
static struct @254 e_data
GPUShader * OVERLAY_shader_outline_prepass_pointcloud(void)
GPUShader * OVERLAY_shader_gpencil_canvas(void)
char datatoc_edit_mesh_analysis_vert_glsl[]
struct GPUShader * OVERLAY_shader_uniform_color(void)
char datatoc_edit_gpencil_canvas_vert_glsl[]
GPUShader * OVERLAY_shader_outline_detect(void)
char datatoc_edit_mesh_vert_glsl[]
char datatoc_outline_prepass_vert_glsl[]
char datatoc_edit_gpencil_vert_glsl[]
char datatoc_gpu_shader_flat_color_frag_glsl[]
char datatoc_gpencil_common_lib_glsl[]
char datatoc_common_overlay_lib_glsl[]
char datatoc_particle_vert_glsl[]
GPUShader * OVERLAY_shader_armature_stick(void)
OVERLAY_InstanceFormats * OVERLAY_shader_instance_formats_get(void)
GPUShader * OVERLAY_shader_facing(void)
char datatoc_edit_mesh_frag_glsl[]
static OVERLAY_InstanceFormats g_formats
GPUShader * OVERLAY_shader_paint_texture(void)
char datatoc_armature_shape_outline_geom_glsl[]
GPUShader * OVERLAY_shader_edit_mesh_analysis(void)
GPUShader * OVERLAY_shader_wireframe_select(void)
char datatoc_volume_gridlines_vert_glsl[]
eGPUShaderConfig sh_cfg
Definition: DRW_render.h:759
const char * lib
Definition: GPU_shader.h:398
const char * def
Definition: GPU_shader.h:399
struct GPUVertFormat * point_extra
struct GPUVertFormat * instance_bone_envelope_outline
struct GPUVertFormat * instance_bone
struct GPUVertFormat * pos
struct GPUVertFormat * pos_color
struct GPUVertFormat * instance_extra
struct GPUVertFormat * wire_extra
struct GPUVertFormat * instance_pos
struct GPUVertFormat * instance_bone_envelope
struct GPUVertFormat * instance_bone_stick
struct GPUVertFormat * instance_bone_envelope_distance
GPUShader * image
GPUShader * edit_curve_handle
GPUShader * edit_uv_stencil_image
GPUShader * edit_mesh_face
GPUShader * edit_uv_face_dots
GPUShader * volume_gridlines_sh
GPUShader * armature_envelope_solid
GPUShader * edit_uv_faces
GPUShader * edit_particle_strand
GPUShader * grid_image
GPUShader * volume_velocity_mac_sh
GPUShader * paint_face
GPUShader * depth_only
GPUShader * clipbound
GPUShader * paint_vertcol
GPUShader * wireframe_select
GPUShader * edit_mesh_normals
GPUShader * outline_prepass_pointcloud
GPUShader * edit_uv_verts
GPUShader * edit_uv_stretching_angle
GPUShader * motion_path_vert
GPUShader * outline_detect
GPUShader * grid
GPUShader * edit_mesh_edge_flat
GPUShader * edit_mesh_skin_root
GPUShader * edit_mesh_fnormals
GPUShader * particle_dot
GPUShader * edit_curve_point
GPUShader * armature_shape_solid
GPUShader * volume_gridlines_flags_sh
GPUShader * paint_weight
GPUShader * paint_wire
GPUShader * sculpt_mask
GPUShader * edit_mesh_edge
GPUShader * outline_prepass_gpencil
GPUShader * edit_uv_tiled_image_borders
GPUShader * edit_gpencil_guide_point
GPUShader * uniform_color
GPUShader * edit_mesh_facedot
GPUShader * edit_uv_edges
GPUShader * particle_shape
GPUShader * antialiasing
GPUShader * outline_prepass
GPUShader * armature_sphere_solid
GPUShader * edit_gpencil_wire
GPUShader * armature_shape_wire
GPUShader * edit_lattice_point
GPUShader * extra_point
GPUShader * extra_loose_point
GPUShader * extra_select
GPUShader * edit_lattice_wire
GPUShader * armature_envelope_outline
GPUShader * background
GPUShader * extra_lightprobe_grid
GPUShader * wireframe[2]
GPUShader * paint_texture
GPUShader * edit_mesh_vert
GPUShader * edit_mesh_analysis
GPUShader * extra_groundline
GPUShader * facing
GPUShader * edit_gpencil_point
GPUShader * paint_point
GPUShader * armature_shape_outline
GPUShader * xray_fade
GPUShader * volume_velocity_needle_sh
GPUShader * extra_wire[2]
GPUShader * armature_stick
GPUShader * outline_prepass_wire
GPUShader * edit_uv_mask_image
GPUShader * pointcloud_dot
GPUShader * armature_dof_wire
GPUShader * armature_wire
GPUShader * edit_particle_point
GPUShader * volume_velocity_sh
GPUShader * edit_mesh_vnormals
GPUShader * edit_curve_wire
GPUShader * extra_wire_select
GPUShader * armature_dof_solid
GPUShader * volume_gridlines_range_sh
GPUShader * gpencil_canvas
GPUShader * edit_uv_stretching_area
GPUShader * armature_sphere_outline
GPUShader * motion_path_line
GPUShader * extra