Blender  V3.3
paint_toolslots.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
7 #include <limits.h>
8 
9 #include "MEM_guardedalloc.h"
10 
11 #include "DNA_brush_types.h"
12 #include "DNA_modifier_types.h"
13 #include "DNA_scene_types.h"
14 
15 #include "BLI_utildefines.h"
16 
17 #include "BKE_brush.h"
18 #include "BKE_lib_id.h"
19 #include "BKE_main.h"
20 #include "BKE_paint.h"
21 
22 /* -------------------------------------------------------------------- */
30 {
31  /* Tool slots are 'uchar'. */
32  BLI_assert(len <= UCHAR_MAX);
33  if (paint->tool_slots_len < len) {
34  paint->tool_slots = MEM_recallocN(paint->tool_slots, sizeof(*paint->tool_slots) * len);
35  paint->tool_slots_len = len;
36  }
37 }
38 
39 static void paint_toolslots_init(Main *bmain, Paint *paint)
40 {
41  if (paint == NULL) {
42  return;
43  }
44  const eObjectMode ob_mode = paint->runtime.ob_mode;
45  BLI_assert(paint->runtime.tool_offset && ob_mode);
46  for (Brush *brush = bmain->brushes.first; brush; brush = brush->id.next) {
47  if (brush->ob_mode & ob_mode) {
48  const int slot_index = BKE_brush_tool_get(brush, paint);
49  BKE_paint_toolslots_len_ensure(paint, slot_index + 1);
50  if (paint->tool_slots[slot_index].brush == NULL) {
51  paint->tool_slots[slot_index].brush = brush;
52  id_us_plus(&brush->id);
53  }
54  }
55  }
56 }
57 
61 static void paint_toolslots_init_with_runtime(Main *bmain, ToolSettings *ts, Paint *paint)
62 {
63  if (paint == NULL) {
64  return;
65  }
66 
67  /* Needed so #Paint_Runtime is updated when versioning. */
68  BKE_paint_runtime_init(ts, paint);
69  paint_toolslots_init(bmain, paint);
70 }
71 
73 {
74  for (Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) {
77  if (ts->sculpt) {
79  }
80  if (ts->vpaint) {
82  }
83  if (ts->wpaint) {
85  }
86  if (ts->uvsculpt) {
88  }
89  if (ts->gp_paint) {
91  }
92  if (ts->gp_vertexpaint) {
94  }
95  if (ts->gp_sculptpaint) {
97  }
98  if (ts->gp_weightpaint) {
100  }
101  if (ts->curves_sculpt) {
103  }
104  }
105 }
106 
110 {
111  const uint tool_offset = paint->runtime.tool_offset;
112  UNUSED_VARS_NDEBUG(tool_offset);
113  BLI_assert(tool_offset != 0);
114  const int slot_index = BKE_brush_tool_get(brush, paint);
115  BKE_paint_toolslots_len_ensure(paint, slot_index + 1);
116  PaintToolSlot *tslot = &paint->tool_slots[slot_index];
117  id_us_plus(&brush->id);
118  if (tslot->brush) {
119  id_us_min(&tslot->brush->id);
120  }
121  tslot->brush = brush;
122 }
123 
125 {
126  if (paint->brush == NULL) {
127  return;
128  }
130 }
131 
133 {
134  /* Clear slots with invalid slots or mode (unlikely but possible). */
135  const uint tool_offset = paint->runtime.tool_offset;
136  UNUSED_VARS_NDEBUG(tool_offset);
137  const eObjectMode ob_mode = paint->runtime.ob_mode;
138  BLI_assert(tool_offset && ob_mode);
139  for (int i = 0; i < paint->tool_slots_len; i++) {
140  PaintToolSlot *tslot = &paint->tool_slots[i];
141  if (tslot->brush) {
142  if ((i != BKE_brush_tool_get(tslot->brush, paint)) ||
143  (tslot->brush->ob_mode & ob_mode) == 0) {
144  id_us_min(&tslot->brush->id);
145  tslot->brush = NULL;
146  }
147  }
148  }
149 
150  /* Unlikely but possible the active brush is not currently using a slot. */
152 
153  /* Fill slots from brushes. */
154  paint_toolslots_init(bmain, paint);
155 }
156 
157 Brush *BKE_paint_toolslots_brush_get(Paint *paint, int slot_index)
158 {
159  if (slot_index < paint->tool_slots_len) {
160  PaintToolSlot *tslot = &paint->tool_slots[slot_index];
161  return tslot->brush;
162  }
163  return NULL;
164 }
#define BKE_brush_tool_get(brush, p)
Definition: BKE_brush.h:169
void id_us_min(struct ID *id)
Definition: lib_id.c:313
void id_us_plus(struct ID *id)
Definition: lib_id.c:305
void BKE_paint_runtime_init(const struct ToolSettings *ts, struct Paint *paint)
#define BLI_assert(a)
Definition: BLI_assert.h:46
unsigned int uint
Definition: BLI_sys_types.h:67
#define UNUSED_VARS_NDEBUG(...)
eObjectMode
Read Guarded memory(de)allocation.
#define MEM_recallocN(vmemh, len)
Scene scene
int len
Definition: draw_manager.c:108
static void paint_toolslots_init_with_runtime(Main *bmain, ToolSettings *ts, Paint *paint)
void BKE_paint_toolslots_len_ensure(Paint *paint, int len)
void BKE_paint_toolslots_brush_update_ex(Paint *paint, Brush *brush)
void BKE_paint_toolslots_brush_validate(Main *bmain, Paint *paint)
Brush * BKE_paint_toolslots_brush_get(Paint *paint, int slot_index)
static void paint_toolslots_init(Main *bmain, Paint *paint)
void BKE_paint_toolslots_init_from_main(struct Main *bmain)
void BKE_paint_toolslots_brush_update(Paint *paint)
short ob_mode
void * next
Definition: DNA_ID.h:369
void * first
Definition: DNA_listBase.h:31
Definition: BKE_main.h:121
ListBase brushes
Definition: BKE_main.h:193
ListBase scenes
Definition: BKE_main.h:168
struct Brush * brush
unsigned short ob_mode
unsigned int tool_offset
struct Paint_Runtime runtime
int tool_slots_len
struct PaintToolSlot * tool_slots
struct Brush * brush
struct ToolSettings * toolsettings
Paint paint
GpWeightPaint * gp_weightpaint
struct ImagePaintSettings imapaint
GpPaint * gp_paint
GpSculptPaint * gp_sculptpaint
CurvesSculpt * curves_sculpt
UvSculpt * uvsculpt
GpVertexPaint * gp_vertexpaint