Blender  V3.3
overlay_mode_transfer.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2021 Blender Foundation. */
3 
8 #include "BKE_paint.h"
9 #include "DRW_render.h"
10 
11 #include "ED_view3d.h"
12 
13 #include "PIL_time.h"
14 #include "UI_resources.h"
15 
16 #include "overlay_private.h"
17 
19 {
20  OVERLAY_PassList *psl = vedata->psl;
21  OVERLAY_PrivateData *pd = vedata->stl->pd;
22 
24 
25  for (int i = 0; i < 2; i++) {
26  /* Non Meshes Pass (Camera, empties, lights ...) */
29  }
30 }
31 
32 #define MODE_TRANSFER_FLASH_LENGTH 0.55f
33 /* TODO(pablodp606): Remove this option for 3.0 if fade in/out is not used. */
34 #define MODE_TRANSFER_FLASH_FADE 0.0f
35 #define MODE_TRANSFER_FLASH_MAX_ALPHA 0.25f
36 
37 static bool mode_transfer_is_animation_running(const float anim_time)
38 {
39  return anim_time >= 0.0f && anim_time <= MODE_TRANSFER_FLASH_LENGTH;
40 }
41 
42 static float mode_transfer_alpha_for_animation_time_get(const float anim_time)
43 {
44  if (anim_time > MODE_TRANSFER_FLASH_LENGTH) {
45  return 0.0f;
46  }
47 
48  if (anim_time < 0.0f) {
49  return 0.0f;
50  }
51 
52  if (MODE_TRANSFER_FLASH_FADE <= 0.0f) {
53  return (1.0f - (anim_time / MODE_TRANSFER_FLASH_LENGTH)) * MODE_TRANSFER_FLASH_MAX_ALPHA;
54  }
55 
56  const float flash_fade_in_time = MODE_TRANSFER_FLASH_LENGTH * MODE_TRANSFER_FLASH_FADE;
57  const float flash_fade_out_time = MODE_TRANSFER_FLASH_LENGTH - flash_fade_in_time;
58 
59  float alpha = 0.0f;
60  if (anim_time < flash_fade_in_time) {
61  alpha = anim_time / flash_fade_in_time;
62  }
63  else {
64  const float fade_out_anim_time = anim_time - flash_fade_in_time;
65  alpha = 1.0f - (fade_out_anim_time / flash_fade_out_time);
66  }
67 
68  return alpha * MODE_TRANSFER_FLASH_MAX_ALPHA;
69 }
70 
72 {
73  OVERLAY_PrivateData *pd = vedata->stl->pd;
74  OVERLAY_PassList *psl = vedata->psl;
75 
76  if (pd->xray_enabled) {
77  return;
78  }
79 
80  const float animation_time = pd->mode_transfer.time -
82 
83  if (!mode_transfer_is_animation_running(animation_time)) {
84  return;
85  }
86 
87  const DRWContextState *draw_ctx = DRW_context_state_get();
88  const bool use_sculpt_pbvh = BKE_sculptsession_use_pbvh_draw(ob, draw_ctx->rv3d) &&
90  const bool is_xray = (ob->dtx & OB_DRAW_IN_FRONT) != 0;
91 
92  DRWShadingGroup *mode_transfer_grp[2];
93 
94  for (int i = 0; i < 2; i++) {
96  mode_transfer_grp[i] = DRW_shgroup_create(sh, psl->mode_transfer_ps[i]);
97  DRW_shgroup_uniform_block(mode_transfer_grp[i], "globalsBlock", G_draw.block_ubo);
98 
99  float color[4];
103  DRW_shgroup_uniform_vec4_copy(mode_transfer_grp[i], "color", color);
104  }
105 
106  if (!pd->use_in_front) {
107  mode_transfer_grp[IN_FRONT] = mode_transfer_grp[NOT_IN_FRONT];
108  }
109 
110  pd->mode_transfer.any_animated = true;
111 
112  if (use_sculpt_pbvh) {
113  DRW_shgroup_call_sculpt(mode_transfer_grp[is_xray], ob, false, false);
114  }
115  else {
116  struct GPUBatch *geom = DRW_cache_object_surface_get(ob);
117  if (geom) {
118  DRW_shgroup_call(mode_transfer_grp[is_xray], geom, ob);
119  }
120  }
121 }
122 
124 {
125  OVERLAY_PassList *psl = vedata->psl;
126 
128 }
129 
131 {
132  OVERLAY_PassList *psl = vedata->psl;
133 
135 }
136 
138 {
139  OVERLAY_PrivateData *pd = vedata->stl->pd;
140  if (pd->mode_transfer.any_animated) {
142  }
143  pd->mode_transfer.any_animated = false;
144 }
bool BKE_sculptsession_use_pbvh_draw(const struct Object *ob, const struct RegionView3D *rv3d)
MINLINE void srgb_to_linearrgb_v4(float linear[4], const float srgb[4])
@ OB_DRAW_IN_FRONT
DRWState
Definition: DRW_render.h:298
@ DRW_STATE_BLEND_ALPHA
Definition: DRW_render.h:328
@ DRW_STATE_DEPTH_EQUAL
Definition: DRW_render.h:312
@ DRW_STATE_WRITE_COLOR
Definition: DRW_render.h:303
#define DRW_PASS_CREATE(pass, state)
Definition: DRW_render.h:690
#define DRW_shgroup_uniform_block(shgroup, name, ubo)
Definition: DRW_render.h:651
#define DRW_shgroup_call(shgroup, geom, ob)
Definition: DRW_render.h:414
GPUBatch
Definition: GPU_batch.h:78
struct GPUShader GPUShader
Definition: GPU_shader.h:20
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Bright Control the brightness and contrast of the input color Vector Map an input vectors to used to fine tune the interpolation of the input Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert a color
Platform independent time functions.
void UI_GetThemeColor3fv(int colorid, float col[3])
Definition: resources.c:1165
@ TH_VERTEX_SELECT
Definition: UI_resources.h:78
GPUBatch * DRW_cache_object_surface_get(Object *ob)
Definition: draw_cache.c:887
struct DRW_Global G_draw
Definition: draw_common.c:32
const DRWContextState * DRW_context_state_get(void)
bool DRW_state_is_image_render(void)
void DRW_viewport_request_redraw(void)
Definition: draw_manager.c:643
void DRW_shgroup_call_sculpt(DRWShadingGroup *shgroup, Object *ob, bool use_wire, bool use_mask)
DRWShadingGroup * DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass)
void DRW_shgroup_uniform_vec4_copy(DRWShadingGroup *shgroup, const char *name, const float *value)
void DRW_draw_pass(DRWPass *pass)
const int state
ccl_gpu_kernel_postfix ccl_global float int int int int sh
void OVERLAY_mode_transfer_cache_init(OVERLAY_Data *vedata)
#define MODE_TRANSFER_FLASH_LENGTH
static bool mode_transfer_is_animation_running(const float anim_time)
#define MODE_TRANSFER_FLASH_FADE
void OVERLAY_mode_transfer_cache_finish(OVERLAY_Data *vedata)
static float mode_transfer_alpha_for_animation_time_get(const float anim_time)
#define MODE_TRANSFER_FLASH_MAX_ALPHA
void OVERLAY_mode_transfer_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_mode_transfer_infront_draw(OVERLAY_Data *vedata)
void OVERLAY_mode_transfer_draw(OVERLAY_Data *vedata)
#define IN_FRONT
#define NOT_IN_FRONT
GPUShader * OVERLAY_shader_uniform_color(void)
struct RegionView3D * rv3d
Definition: DRW_render.h:975
struct GPUUniformBuf * block_ubo
Definition: draw_common.h:129
OVERLAY_PassList * psl
OVERLAY_StorageList * stl
DRWPass * mode_transfer_ps[2]
struct OVERLAY_PrivateData::@259 mode_transfer
struct OVERLAY_PrivateData * pd
double overlay_mode_transfer_start_time
Object_Runtime runtime
double PIL_check_seconds_timer(void)
Definition: time.c:64