WIP: Brush assets project #106303
|
@ -245,7 +245,9 @@ mark_as_advanced(CPACK_OVERRIDE_PACKAGENAME)
|
|||
mark_as_advanced(BUILDINFO_OVERRIDE_DATE)
|
||||
mark_as_advanced(BUILDINFO_OVERRIDE_TIME)
|
||||
|
||||
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.16")
|
||||
# CMAKE 3.28.2 has issues with the combination of PCH and unity builds, disable for now.
|
||||
# upstream ticket https://gitlab.kitware.com/cmake/cmake/-/issues/25650
|
||||
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.16" AND NOT ${CMAKE_VERSION} VERSION_EQUAL "3.28.2")
|
||||
option(WITH_UNITY_BUILD "\
|
||||
Enable unity build for modules that support it to improve compile times.\n\
|
||||
WARNING: this option allows files to be built without all necessary headers!\n
|
||||
|
|
|
@ -1114,14 +1114,13 @@ class USERPREF_PT_theme_text_style(ThemePanel, CenterAlignMixIn, Panel):
|
|||
|
||||
layout.separator()
|
||||
|
||||
layout.label(text="Widget")
|
||||
self._ui_font_style(layout, style.widget)
|
||||
|
||||
layout.separator()
|
||||
|
||||
layout.label(text="Widget Label")
|
||||
self._ui_font_style(layout, style.widget_label)
|
||||
|
||||
layout.separator()
|
||||
|
||||
layout.label(text="Widget")
|
||||
self._ui_font_style(layout, style.widget)
|
||||
|
||||
class USERPREF_PT_theme_bone_color_sets(ThemePanel, CenterAlignMixIn, Panel):
|
||||
bl_label = "Bone Color Sets"
|
||||
|
|
|
@ -335,7 +335,7 @@ void BKE_image_merge(struct Main *bmain, struct Image *dest, struct Image *sourc
|
|||
/**
|
||||
* Scale the image.
|
||||
*/
|
||||
bool BKE_image_scale(struct Image *image, int width, int height);
|
||||
bool BKE_image_scale(struct Image *image, int width, int height, struct ImageUser *iuser);
|
||||
|
||||
/**
|
||||
* Check if texture has alpha `planes == 32 || planes == 16`.
|
||||
|
|
|
@ -775,7 +775,7 @@ void BKE_image_merge(Main *bmain, Image *dest, Image *source)
|
|||
}
|
||||
}
|
||||
|
||||
bool BKE_image_scale(Image *image, int width, int height)
|
||||
bool BKE_image_scale(Image *image, int width, int height, ImageUser *iuser)
|
||||
{
|
||||
/* NOTE: We could be clever and scale all imbuf's
|
||||
* but since some are mipmaps its not so simple. */
|
||||
|
@ -783,7 +783,7 @@ bool BKE_image_scale(Image *image, int width, int height)
|
|||
ImBuf *ibuf;
|
||||
void *lock;
|
||||
|
||||
ibuf = BKE_image_acquire_ibuf(image, nullptr, &lock);
|
||||
ibuf = BKE_image_acquire_ibuf(image, iuser, &lock);
|
||||
|
||||
if (ibuf) {
|
||||
IMB_scaleImBuf(ibuf, width, height);
|
||||
|
|
|
@ -790,6 +790,7 @@ void DrawMultiBuf::bind(RecordingState &state,
|
|||
else {
|
||||
GPU_memory_barrier(GPU_BARRIER_SHADER_STORAGE);
|
||||
}
|
||||
GPU_storagebuf_sync_as_indirect_buffer(command_buf_);
|
||||
}
|
||||
|
||||
GPU_debug_group_end();
|
||||
|
|
|
@ -644,20 +644,21 @@ static uiBut *add_tab_button(uiBlock &block, StringRefNull name)
|
|||
const int pad_x = UI_UNIT_X * 0.3f;
|
||||
const int but_width = std::min(string_width + 2 * pad_x, UI_UNIT_X * 8);
|
||||
|
||||
uiBut *but = uiDefBut(&block,
|
||||
UI_BTYPE_TAB,
|
||||
0,
|
||||
name.c_str(),
|
||||
0,
|
||||
0,
|
||||
but_width,
|
||||
UI_UNIT_Y,
|
||||
nullptr,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
"Enable catalog, making contained assets visible in the asset shelf");
|
||||
uiBut *but = uiDefBut(
|
||||
&block,
|
||||
UI_BTYPE_TAB,
|
||||
0,
|
||||
name,
|
||||
0,
|
||||
0,
|
||||
but_width,
|
||||
UI_UNIT_Y,
|
||||
nullptr,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
TIP_("Enable catalog, making contained assets visible in the asset shelf"));
|
||||
|
||||
UI_but_drawflag_enable(but, UI_BUT_ALIGN_DOWN);
|
||||
UI_but_flag_disable(but, UI_BUT_UNDO);
|
||||
|
|
|
@ -1010,8 +1010,6 @@ uiBut *uiDefButF(uiBlock *block,
|
|||
float *poin,
|
||||
float min,
|
||||
float max,
|
||||
float a1,
|
||||
float a2,
|
||||
const char *tip);
|
||||
uiBut *uiDefButI(uiBlock *block,
|
||||
int type,
|
||||
|
@ -1734,6 +1732,9 @@ void UI_but_node_link_set(uiBut *but, bNodeSocket *socket, const float draw_colo
|
|||
void UI_but_number_step_size_set(uiBut *but, float step_size);
|
||||
void UI_but_number_precision_set(uiBut *but, float precision);
|
||||
|
||||
void UI_but_number_slider_step_size_set(uiBut *but, float step_size);
|
||||
void UI_but_number_slider_precision_set(uiBut *but, float precision);
|
||||
|
||||
void UI_block_func_handle_set(uiBlock *block, uiBlockHandleFunc func, void *arg);
|
||||
void UI_block_func_butmenu_set(uiBlock *block, uiMenuHandleFunc func, void *arg);
|
||||
void UI_block_func_set(uiBlock *block, uiButHandleFunc func, void *arg1, void *arg2);
|
||||
|
|
|
@ -641,6 +641,9 @@ static float ui_but_get_float_precision(uiBut *but)
|
|||
if (but->type == UI_BTYPE_NUM) {
|
||||
return ((uiButNumber *)but)->precision;
|
||||
}
|
||||
if (but->type == UI_BTYPE_NUM_SLIDER) {
|
||||
return ((uiButNumberSlider *)but)->precision;
|
||||
}
|
||||
|
||||
return but->a2;
|
||||
}
|
||||
|
@ -650,6 +653,9 @@ static float ui_but_get_float_step_size(uiBut *but)
|
|||
if (but->type == UI_BTYPE_NUM) {
|
||||
return ((uiButNumber *)but)->step_size;
|
||||
}
|
||||
if (but->type == UI_BTYPE_NUM_SLIDER) {
|
||||
return ((uiButNumberSlider *)but)->step_size;
|
||||
}
|
||||
|
||||
return but->a1;
|
||||
}
|
||||
|
@ -3964,6 +3970,9 @@ static uiBut *ui_but_new(const eButType type)
|
|||
case UI_BTYPE_NUM:
|
||||
but = MEM_new<uiButNumber>("uiButNumber");
|
||||
break;
|
||||
case UI_BTYPE_NUM_SLIDER:
|
||||
but = MEM_new<uiButNumberSlider>("uiButNumber");
|
||||
break;
|
||||
case UI_BTYPE_COLOR:
|
||||
but = MEM_new<uiButColor>("uiButColor");
|
||||
break;
|
||||
|
@ -4544,7 +4553,7 @@ static uiBut *ui_def_but_rna(uiBlock *block,
|
|||
const PropertyType proptype = RNA_property_type(prop);
|
||||
int icon = 0;
|
||||
uiMenuCreateFunc func = nullptr;
|
||||
const bool always_set_a1_a2 = ELEM(type, UI_BTYPE_NUM);
|
||||
const bool always_set_a1_a2 = ELEM(type, UI_BTYPE_NUM, UI_BTYPE_NUM_SLIDER);
|
||||
|
||||
if (ELEM(type, UI_BTYPE_COLOR, UI_BTYPE_HSVCIRCLE, UI_BTYPE_HSVCUBE)) {
|
||||
BLI_assert(index == -1);
|
||||
|
@ -4659,6 +4668,11 @@ static uiBut *ui_def_but_rna(uiBlock *block,
|
|||
UI_but_number_step_size_set(but, a1);
|
||||
UI_but_number_precision_set(but, a2);
|
||||
}
|
||||
else if (but->type == UI_BTYPE_NUM_SLIDER) {
|
||||
/* Set default values, can be overridden later. */
|
||||
UI_but_number_slider_step_size_set(but, a1);
|
||||
UI_but_number_slider_precision_set(but, a2);
|
||||
}
|
||||
|
||||
but->rnapoin = *ptr;
|
||||
but->rnaprop = prop;
|
||||
|
@ -4710,6 +4724,10 @@ static uiBut *ui_def_but_rna(uiBlock *block,
|
|||
uiButNumber *number_but = (uiButNumber *)but;
|
||||
number_but->step_size = ui_get_but_step_unit(but, number_but->step_size);
|
||||
}
|
||||
if (type == UI_BTYPE_NUM_SLIDER) {
|
||||
uiButNumberSlider *number_but = (uiButNumberSlider *)but;
|
||||
number_but->step_size = ui_get_but_step_unit(but, number_but->step_size);
|
||||
}
|
||||
else {
|
||||
but->a1 = ui_get_but_step_unit(but, but->a1);
|
||||
}
|
||||
|
@ -5049,8 +5067,6 @@ uiBut *uiDefButF(uiBlock *block,
|
|||
float *poin,
|
||||
float min,
|
||||
float max,
|
||||
float a1,
|
||||
float a2,
|
||||
const char *tip)
|
||||
{
|
||||
return uiDefBut(block,
|
||||
|
@ -5064,8 +5080,8 @@ uiBut *uiDefButF(uiBlock *block,
|
|||
(void *)poin,
|
||||
min,
|
||||
max,
|
||||
a1,
|
||||
a2,
|
||||
0.0f,
|
||||
0.0f,
|
||||
tip);
|
||||
}
|
||||
uiBut *uiDefButI(uiBlock *block,
|
||||
|
@ -6480,6 +6496,25 @@ void UI_but_number_precision_set(uiBut *but, float precision)
|
|||
BLI_assert(precision > -2);
|
||||
}
|
||||
|
||||
void UI_but_number_slider_step_size_set(uiBut *but, float step_size)
|
||||
{
|
||||
uiButNumberSlider *but_number = (uiButNumberSlider *)but;
|
||||
BLI_assert(but->type == UI_BTYPE_NUM_SLIDER);
|
||||
|
||||
but_number->step_size = step_size;
|
||||
BLI_assert(step_size > 0);
|
||||
}
|
||||
|
||||
void UI_but_number_slider_precision_set(uiBut *but, float precision)
|
||||
{
|
||||
uiButNumberSlider *but_number = (uiButNumberSlider *)but;
|
||||
BLI_assert(but->type == UI_BTYPE_NUM_SLIDER);
|
||||
|
||||
but_number->precision = precision;
|
||||
/* -1 is a valid value, UI code figures out an appropriate precision then. */
|
||||
BLI_assert(precision > -2);
|
||||
}
|
||||
|
||||
void UI_but_focus_on_enter_event(wmWindow *win, uiBut *but)
|
||||
{
|
||||
wmEvent event;
|
||||
|
|
|
@ -5624,6 +5624,7 @@ static bool ui_numedit_but_SLI(uiBut *but,
|
|||
const bool snap,
|
||||
const bool shift)
|
||||
{
|
||||
uiButNumberSlider *slider_but = reinterpret_cast<uiButNumberSlider *>(but);
|
||||
float cursor_x_range, f, tempf, softmin, softmax, softrange;
|
||||
int temp, lvalue;
|
||||
bool changed = false;
|
||||
|
@ -5655,7 +5656,7 @@ static bool ui_numedit_but_SLI(uiBut *but,
|
|||
const float size = (is_horizontal) ? BLI_rctf_size_x(&but->rect) :
|
||||
-BLI_rctf_size_y(&but->rect);
|
||||
cursor_x_range = size * (but->softmax - but->softmin) /
|
||||
(but->softmax - but->softmin + but->a1);
|
||||
(but->softmax - but->softmin + slider_but->step_size);
|
||||
}
|
||||
else {
|
||||
const float ofs = (BLI_rctf_size_y(&but->rect) / 2.0f);
|
||||
|
|
|
@ -321,8 +321,14 @@ struct uiBut {
|
|||
|
||||
/** Derived struct for #UI_BTYPE_NUM */
|
||||
struct uiButNumber : public uiBut {
|
||||
float step_size = 0;
|
||||
float precision = 0;
|
||||
float step_size = 0.0f;
|
||||
float precision = 0.0f;
|
||||
};
|
||||
|
||||
/** Derived struct for #UI_BTYPE_NUM_SLIDER */
|
||||
struct uiButNumberSlider : public uiBut {
|
||||
float step_size = 0.0f;
|
||||
float precision = 0.0f;
|
||||
};
|
||||
|
||||
/** Derived struct for #UI_BTYPE_COLOR */
|
||||
|
|
|
@ -649,9 +649,10 @@ static void ui_item_array(uiLayout *layout,
|
|||
UI_UNIT_Y);
|
||||
if (slider && but->type == UI_BTYPE_NUM) {
|
||||
uiButNumber *number_but = (uiButNumber *)but;
|
||||
|
||||
but->a1 = number_but->step_size;
|
||||
const float step_size = number_but->step_size;
|
||||
but = ui_but_change_type(but, UI_BTYPE_NUM_SLIDER);
|
||||
uiButNumberSlider *slider_but = reinterpret_cast<uiButNumberSlider *>(but);
|
||||
slider_but->step_size = step_size;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -719,9 +720,10 @@ static void ui_item_array(uiLayout *layout,
|
|||
block, ptr, prop, a, str_buf, icon, 0, 0, width_item, UI_UNIT_Y);
|
||||
if (slider && but->type == UI_BTYPE_NUM) {
|
||||
uiButNumber *number_but = (uiButNumber *)but;
|
||||
|
||||
but->a1 = number_but->step_size;
|
||||
const float step_size = number_but->step_size;
|
||||
but = ui_but_change_type(but, UI_BTYPE_NUM_SLIDER);
|
||||
uiButNumberSlider *slider_but = reinterpret_cast<uiButNumberSlider *>(but);
|
||||
slider_but->step_size = step_size;
|
||||
}
|
||||
if ((toggle == 1) && but->type == UI_BTYPE_CHECKBOX) {
|
||||
but->type = UI_BTYPE_TOGGLE;
|
||||
|
@ -2448,10 +2450,11 @@ void uiItemFullR(uiLayout *layout,
|
|||
but = uiDefAutoButR(block, ptr, prop, index, name, icon, 0, 0, w, h);
|
||||
|
||||
if (slider && but->type == UI_BTYPE_NUM) {
|
||||
uiButNumber *num_but = (uiButNumber *)but;
|
||||
|
||||
but->a1 = num_but->step_size;
|
||||
uiButNumber *number_but = (uiButNumber *)but;
|
||||
const float step_size = number_but->step_size;
|
||||
but = ui_but_change_type(but, UI_BTYPE_NUM_SLIDER);
|
||||
uiButNumberSlider *slider_but = reinterpret_cast<uiButNumberSlider *>(but);
|
||||
slider_but->step_size = step_size;
|
||||
}
|
||||
|
||||
if (flag & UI_ITEM_R_CHECKBOX_INVERT) {
|
||||
|
|
|
@ -623,9 +623,11 @@ static void ui_block_colorpicker(uiBlock *block,
|
|||
0,
|
||||
0.0,
|
||||
0.0,
|
||||
10,
|
||||
3,
|
||||
0,
|
||||
0,
|
||||
TIP_("Red"));
|
||||
UI_but_number_slider_step_size_set(bt, 10);
|
||||
UI_but_number_slider_precision_set(bt, 3);
|
||||
UI_but_func_set(bt, ui_colorpicker_rgba_update_cb, bt, nullptr);
|
||||
bt->custom_data = cpicker;
|
||||
bt = uiDefButR_prop(block,
|
||||
|
@ -641,9 +643,11 @@ static void ui_block_colorpicker(uiBlock *block,
|
|||
1,
|
||||
0.0,
|
||||
0.0,
|
||||
10,
|
||||
3,
|
||||
0,
|
||||
0,
|
||||
TIP_("Green"));
|
||||
UI_but_number_slider_step_size_set(bt, 10);
|
||||
UI_but_number_slider_precision_set(bt, 3);
|
||||
UI_but_func_set(bt, ui_colorpicker_rgba_update_cb, bt, nullptr);
|
||||
bt->custom_data = cpicker;
|
||||
bt = uiDefButR_prop(block,
|
||||
|
@ -659,9 +663,11 @@ static void ui_block_colorpicker(uiBlock *block,
|
|||
2,
|
||||
0.0,
|
||||
0.0,
|
||||
10,
|
||||
3,
|
||||
0,
|
||||
0,
|
||||
TIP_("Blue"));
|
||||
UI_but_number_slider_step_size_set(bt, 10);
|
||||
UI_but_number_slider_precision_set(bt, 3);
|
||||
UI_but_func_set(bt, ui_colorpicker_rgba_update_cb, bt, nullptr);
|
||||
bt->custom_data = cpicker;
|
||||
|
||||
|
@ -683,9 +689,9 @@ static void ui_block_colorpicker(uiBlock *block,
|
|||
cpicker->hsv_scene_linear,
|
||||
0.0,
|
||||
1.0,
|
||||
10,
|
||||
3,
|
||||
TIP_("Hue"));
|
||||
UI_but_number_slider_step_size_set(bt, 10);
|
||||
UI_but_number_slider_precision_set(bt, 3);
|
||||
UI_but_flag_disable(bt, UI_BUT_UNDO);
|
||||
UI_but_func_set(bt, ui_colorpicker_hsv_update_cb, bt, nullptr);
|
||||
bt->custom_data = cpicker;
|
||||
|
@ -700,9 +706,9 @@ static void ui_block_colorpicker(uiBlock *block,
|
|||
cpicker->hsv_scene_linear + 1,
|
||||
0.0,
|
||||
1.0,
|
||||
10,
|
||||
3,
|
||||
TIP_("Saturation"));
|
||||
UI_but_number_slider_step_size_set(bt, 10);
|
||||
UI_but_number_slider_precision_set(bt, 3);
|
||||
UI_but_flag_disable(bt, UI_BUT_UNDO);
|
||||
UI_but_func_set(bt, ui_colorpicker_hsv_update_cb, bt, nullptr);
|
||||
bt->custom_data = cpicker;
|
||||
|
@ -718,9 +724,9 @@ static void ui_block_colorpicker(uiBlock *block,
|
|||
cpicker->hsv_scene_linear + 2,
|
||||
0.0,
|
||||
1.0,
|
||||
10,
|
||||
3,
|
||||
TIP_("Lightness"));
|
||||
UI_but_number_slider_step_size_set(bt, 10);
|
||||
UI_but_number_slider_precision_set(bt, 3);
|
||||
}
|
||||
else {
|
||||
bt = uiDefButF(block,
|
||||
|
@ -734,10 +740,10 @@ static void ui_block_colorpicker(uiBlock *block,
|
|||
cpicker->hsv_scene_linear + 2,
|
||||
0.0,
|
||||
softmax,
|
||||
10,
|
||||
3,
|
||||
CTX_TIP_(BLT_I18NCONTEXT_COLOR, "Value"));
|
||||
}
|
||||
UI_but_number_slider_step_size_set(bt, 10);
|
||||
UI_but_number_slider_precision_set(bt, 3);
|
||||
UI_but_flag_disable(bt, UI_BUT_UNDO);
|
||||
|
||||
bt->hardmax = hardmax; /* Not common but RGB may be over 1.0. */
|
||||
|
@ -760,9 +766,11 @@ static void ui_block_colorpicker(uiBlock *block,
|
|||
3,
|
||||
0.0,
|
||||
0.0,
|
||||
10,
|
||||
3,
|
||||
0,
|
||||
0,
|
||||
TIP_("Alpha"));
|
||||
UI_but_number_slider_step_size_set(bt, 10);
|
||||
UI_but_number_slider_precision_set(bt, 3);
|
||||
UI_but_func_set(bt, ui_colorpicker_rgba_update_cb, bt, nullptr);
|
||||
bt->custom_data = cpicker;
|
||||
}
|
||||
|
|
|
@ -4314,8 +4314,6 @@ static uiBlock *curvemap_clipping_func(bContext *C, ARegion *region, void *cumap
|
|||
&cumap->clipr.xmin,
|
||||
-100.0,
|
||||
cumap->clipr.xmax,
|
||||
0,
|
||||
0,
|
||||
"");
|
||||
UI_but_number_step_size_set(bt, 10);
|
||||
UI_but_number_precision_set(bt, 2);
|
||||
|
@ -4330,8 +4328,6 @@ static uiBlock *curvemap_clipping_func(bContext *C, ARegion *region, void *cumap
|
|||
&cumap->clipr.ymin,
|
||||
-100.0,
|
||||
cumap->clipr.ymax,
|
||||
0,
|
||||
0,
|
||||
"");
|
||||
UI_but_number_step_size_set(bt, 10);
|
||||
UI_but_number_precision_set(bt, 2);
|
||||
|
@ -4346,8 +4342,6 @@ static uiBlock *curvemap_clipping_func(bContext *C, ARegion *region, void *cumap
|
|||
&cumap->clipr.xmax,
|
||||
cumap->clipr.xmin,
|
||||
100.0,
|
||||
0,
|
||||
0,
|
||||
"");
|
||||
UI_but_number_step_size_set(bt, 10);
|
||||
UI_but_number_precision_set(bt, 2);
|
||||
|
@ -4362,8 +4356,6 @@ static uiBlock *curvemap_clipping_func(bContext *C, ARegion *region, void *cumap
|
|||
&cumap->clipr.ymax,
|
||||
cumap->clipr.ymin,
|
||||
100.0,
|
||||
0,
|
||||
0,
|
||||
"");
|
||||
UI_but_number_step_size_set(bt, 10);
|
||||
UI_but_number_precision_set(bt, 2);
|
||||
|
@ -4889,8 +4881,6 @@ static void curvemap_buttons_layout(uiLayout *layout,
|
|||
&cmp->x,
|
||||
bounds.xmin,
|
||||
bounds.xmax,
|
||||
0,
|
||||
0,
|
||||
"");
|
||||
UI_but_number_step_size_set(bt, 1);
|
||||
UI_but_number_precision_set(bt, 5);
|
||||
|
@ -4905,8 +4895,6 @@ static void curvemap_buttons_layout(uiLayout *layout,
|
|||
&cmp->y,
|
||||
bounds.ymin,
|
||||
bounds.ymax,
|
||||
0,
|
||||
0,
|
||||
"");
|
||||
UI_but_number_step_size_set(bt, 1);
|
||||
UI_but_number_precision_set(bt, 5);
|
||||
|
@ -5533,8 +5521,6 @@ static void CurveProfile_buttons_layout(uiLayout *layout, PointerRNA *ptr, RNAUp
|
|||
selection_x,
|
||||
bounds.xmin,
|
||||
bounds.xmax,
|
||||
0,
|
||||
0,
|
||||
"");
|
||||
UI_but_number_step_size_set(bt, 1);
|
||||
UI_but_number_precision_set(bt, 5);
|
||||
|
@ -5553,8 +5539,6 @@ static void CurveProfile_buttons_layout(uiLayout *layout, PointerRNA *ptr, RNAUp
|
|||
selection_y,
|
||||
bounds.ymin,
|
||||
bounds.ymax,
|
||||
0,
|
||||
0,
|
||||
"");
|
||||
UI_but_number_step_size_set(bt, 1);
|
||||
UI_but_number_precision_set(bt, 5);
|
||||
|
|
|
@ -163,8 +163,8 @@ uiBut *uiDefAutoButR(uiBlock *block,
|
|||
index,
|
||||
0,
|
||||
0,
|
||||
-1,
|
||||
-1,
|
||||
0,
|
||||
0,
|
||||
nullptr);
|
||||
}
|
||||
else {
|
||||
|
|
|
@ -555,8 +555,6 @@ void uiTemplateMarker(uiLayout *layout,
|
|||
&cb->marker_pos[0],
|
||||
-10 * width,
|
||||
10.0 * width,
|
||||
0,
|
||||
0,
|
||||
TIP_("X-position of marker at frame in screen coordinates"));
|
||||
UI_but_number_step_size_set(bt, step);
|
||||
UI_but_number_precision_set(bt, digits);
|
||||
|
@ -571,8 +569,6 @@ void uiTemplateMarker(uiLayout *layout,
|
|||
&cb->marker_pos[1],
|
||||
-10 * height,
|
||||
10.0 * height,
|
||||
0,
|
||||
0,
|
||||
TIP_("Y-position of marker at frame in screen coordinates"));
|
||||
UI_but_number_step_size_set(bt, step);
|
||||
UI_but_number_precision_set(bt, digits);
|
||||
|
@ -602,8 +598,6 @@ void uiTemplateMarker(uiLayout *layout,
|
|||
&cb->track_offset[0],
|
||||
-10 * width,
|
||||
10.0 * width,
|
||||
0,
|
||||
0,
|
||||
TIP_("X-offset to parenting point"));
|
||||
UI_but_number_step_size_set(bt, step);
|
||||
UI_but_number_precision_set(bt, digits);
|
||||
|
@ -618,8 +612,6 @@ void uiTemplateMarker(uiLayout *layout,
|
|||
&cb->track_offset[1],
|
||||
-10 * height,
|
||||
10.0 * height,
|
||||
0,
|
||||
0,
|
||||
TIP_("Y-offset to parenting point"));
|
||||
UI_but_number_step_size_set(bt, step);
|
||||
UI_but_number_precision_set(bt, digits);
|
||||
|
@ -649,8 +641,6 @@ void uiTemplateMarker(uiLayout *layout,
|
|||
&cb->marker_pat[0],
|
||||
3.0f,
|
||||
10.0 * width,
|
||||
0,
|
||||
0,
|
||||
TIP_("Width of marker's pattern in screen coordinates"));
|
||||
UI_but_number_step_size_set(bt, step);
|
||||
UI_but_number_precision_set(bt, digits);
|
||||
|
@ -665,8 +655,6 @@ void uiTemplateMarker(uiLayout *layout,
|
|||
&cb->marker_pat[1],
|
||||
3.0f,
|
||||
10.0 * height,
|
||||
0,
|
||||
0,
|
||||
TIP_("Height of marker's pattern in screen coordinates"));
|
||||
UI_but_number_step_size_set(bt, step);
|
||||
UI_but_number_precision_set(bt, digits);
|
||||
|
@ -696,8 +684,6 @@ void uiTemplateMarker(uiLayout *layout,
|
|||
&cb->marker_search_pos[0],
|
||||
-width,
|
||||
width,
|
||||
0,
|
||||
0,
|
||||
TIP_("X-position of search at frame relative to marker's position"));
|
||||
UI_but_number_step_size_set(bt, step);
|
||||
UI_but_number_precision_set(bt, digits);
|
||||
|
@ -712,8 +698,6 @@ void uiTemplateMarker(uiLayout *layout,
|
|||
&cb->marker_search_pos[1],
|
||||
-height,
|
||||
height,
|
||||
0,
|
||||
0,
|
||||
TIP_("Y-position of search at frame relative to marker's position"));
|
||||
UI_but_number_step_size_set(bt, step);
|
||||
UI_but_number_precision_set(bt, digits);
|
||||
|
@ -728,8 +712,6 @@ void uiTemplateMarker(uiLayout *layout,
|
|||
&cb->marker_search[0],
|
||||
3.0f,
|
||||
10.0 * width,
|
||||
0,
|
||||
0,
|
||||
TIP_("Width of marker's search in screen coordinates"));
|
||||
UI_but_number_step_size_set(bt, step);
|
||||
UI_but_number_precision_set(bt, digits);
|
||||
|
@ -744,8 +726,6 @@ void uiTemplateMarker(uiLayout *layout,
|
|||
&cb->marker_search[1],
|
||||
3.0f,
|
||||
10.0 * height,
|
||||
0,
|
||||
0,
|
||||
TIP_("Height of marker's search in screen coordinates"));
|
||||
UI_but_number_step_size_set(bt, step);
|
||||
UI_but_number_precision_set(bt, digits);
|
||||
|
|
|
@ -562,8 +562,6 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
|
|||
&tfp->ve_median.generic.location[0],
|
||||
-lim,
|
||||
lim,
|
||||
0,
|
||||
0,
|
||||
"");
|
||||
UI_but_number_step_size_set(but, 10);
|
||||
UI_but_number_precision_set(but, RNA_TRANSLATION_PREC_DEFAULT);
|
||||
|
@ -579,8 +577,6 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
|
|||
&tfp->ve_median.generic.location[1],
|
||||
-lim,
|
||||
lim,
|
||||
0,
|
||||
0,
|
||||
"");
|
||||
UI_but_number_step_size_set(but, 10);
|
||||
UI_but_number_precision_set(but, RNA_TRANSLATION_PREC_DEFAULT);
|
||||
|
@ -596,8 +592,6 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
|
|||
&tfp->ve_median.generic.location[2],
|
||||
-lim,
|
||||
lim,
|
||||
0,
|
||||
0,
|
||||
"");
|
||||
UI_but_number_step_size_set(but, 10);
|
||||
UI_but_number_precision_set(but, RNA_TRANSLATION_PREC_DEFAULT);
|
||||
|
@ -615,8 +609,6 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
|
|||
&(tfp->ve_median.curve.b_weight),
|
||||
0.01,
|
||||
100.0,
|
||||
0,
|
||||
0,
|
||||
"");
|
||||
UI_but_number_step_size_set(but, 1);
|
||||
UI_but_number_precision_set(but, 3);
|
||||
|
@ -685,8 +677,6 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
|
|||
&ve_median->bv_weight,
|
||||
0.0,
|
||||
1.0,
|
||||
0,
|
||||
0,
|
||||
TIP_("Vertex weight used by Bevel modifier"));
|
||||
UI_but_number_step_size_set(but, 1);
|
||||
UI_but_number_precision_set(but, 2);
|
||||
|
@ -702,8 +692,6 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
|
|||
&ve_median->v_crease,
|
||||
0.0,
|
||||
1.0,
|
||||
0,
|
||||
0,
|
||||
TIP_("Weight used by the Subdivision Surface modifier"));
|
||||
UI_but_number_step_size_set(but, 1);
|
||||
UI_but_number_precision_set(but, 2);
|
||||
|
@ -721,8 +709,6 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
|
|||
&ve_median->skin[0],
|
||||
0.0,
|
||||
100.0,
|
||||
0,
|
||||
0,
|
||||
TIP_("X radius used by Skin modifier"));
|
||||
UI_but_number_step_size_set(but, 1);
|
||||
UI_but_number_precision_set(but, 3);
|
||||
|
@ -737,8 +723,6 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
|
|||
&ve_median->skin[1],
|
||||
0.0,
|
||||
100.0,
|
||||
0,
|
||||
0,
|
||||
TIP_("Y radius used by Skin modifier"));
|
||||
UI_but_number_step_size_set(but, 1);
|
||||
UI_but_number_precision_set(but, 3);
|
||||
|
@ -771,8 +755,6 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
|
|||
&ve_median->be_weight,
|
||||
0.0,
|
||||
1.0,
|
||||
0,
|
||||
0,
|
||||
TIP_("Edge weight used by Bevel modifier"));
|
||||
UI_but_number_step_size_set(but, 1);
|
||||
UI_but_number_precision_set(but, 2);
|
||||
|
@ -788,8 +770,6 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
|
|||
&ve_median->e_crease,
|
||||
0.0,
|
||||
1.0,
|
||||
0,
|
||||
0,
|
||||
TIP_("Weight used by the Subdivision Surface modifier"));
|
||||
UI_but_number_step_size_set(but, 1);
|
||||
UI_but_number_precision_set(but, 2);
|
||||
|
@ -866,8 +846,6 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
|
|||
&ve_median->weight,
|
||||
0.0,
|
||||
1.0,
|
||||
0,
|
||||
0,
|
||||
TIP_("Weight used for Soft Body Goal"));
|
||||
UI_but_number_step_size_set(but, 1);
|
||||
UI_but_number_precision_set(but, 3);
|
||||
|
@ -882,8 +860,6 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
|
|||
&ve_median->radius,
|
||||
0.0,
|
||||
100.0,
|
||||
0,
|
||||
0,
|
||||
TIP_("Radius of curve control points"));
|
||||
UI_but_number_step_size_set(but, 1);
|
||||
UI_but_number_precision_set(but, 3);
|
||||
|
@ -898,8 +874,6 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
|
|||
&ve_median->tilt,
|
||||
-tilt_limit,
|
||||
tilt_limit,
|
||||
0,
|
||||
0,
|
||||
TIP_("Tilt of curve control points"));
|
||||
UI_but_number_step_size_set(but, 1);
|
||||
UI_but_number_precision_set(but, 3);
|
||||
|
@ -941,8 +915,6 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
|
|||
&ve_median->weight,
|
||||
0.0,
|
||||
1.0,
|
||||
0,
|
||||
0,
|
||||
TIP_("Weight used for Soft Body Goal"));
|
||||
UI_but_number_step_size_set(but, 1);
|
||||
UI_but_number_precision_set(but, 3);
|
||||
|
@ -1273,8 +1245,6 @@ static void v3d_object_dimension_buts(bContext *C, uiLayout *layout, View3D *v3d
|
|||
&(tfp->ob_dims[i]),
|
||||
0.0f,
|
||||
lim,
|
||||
0,
|
||||
0,
|
||||
"");
|
||||
UI_but_number_step_size_set(but, 10);
|
||||
UI_but_number_precision_set(but, 3);
|
||||
|
@ -1441,8 +1411,6 @@ static void view3d_panel_vgroup(const bContext *C, Panel *panel)
|
|||
&vertex_weight,
|
||||
0.0,
|
||||
1.0,
|
||||
0,
|
||||
0,
|
||||
"");
|
||||
UI_but_number_step_size_set(but, 1);
|
||||
UI_but_number_precision_set(but, 3);
|
||||
|
|
|
@ -169,8 +169,6 @@ static void uvedit_vertex_buttons(const bContext *C, uiBlock *block)
|
|||
UI_UNIT_Y,
|
||||
&uvedit_old_center[0],
|
||||
UNPACK2(range_xy[0]),
|
||||
0,
|
||||
0,
|
||||
"");
|
||||
UI_but_number_step_size_set(but, step);
|
||||
UI_but_number_precision_set(but, digits);
|
||||
|
@ -184,8 +182,6 @@ static void uvedit_vertex_buttons(const bContext *C, uiBlock *block)
|
|||
UI_UNIT_Y,
|
||||
&uvedit_old_center[1],
|
||||
UNPACK2(range_xy[1]),
|
||||
0,
|
||||
0,
|
||||
"");
|
||||
UI_but_number_step_size_set(but, step);
|
||||
UI_but_number_precision_set(but, digits);
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
#include "BKE_collection.h"
|
||||
#include "BKE_curves.hh"
|
||||
#include "BKE_deform.hh"
|
||||
#include "BKE_customdata.hh"
|
||||
#include "BKE_geometry_set_instances.hh"
|
||||
#include "BKE_instances.hh"
|
||||
#include "BKE_material.h"
|
||||
|
@ -1171,7 +1171,22 @@ static void execute_realize_mesh_tasks(const RealizeInstancesOptions &options,
|
|||
dst_attribute_writers.append(
|
||||
dst_attributes.lookup_or_add_for_write_only_span(attribute_id, domain, data_type));
|
||||
}
|
||||
|
||||
const char *active_layer = CustomData_get_active_layer_name(&first_mesh.corner_data,
|
||||
CD_PROP_FLOAT2);
|
||||
if (active_layer != nullptr) {
|
||||
int id = CustomData_get_named_layer(&dst_mesh->corner_data, CD_PROP_FLOAT2, active_layer);
|
||||
if (id >= 0) {
|
||||
CustomData_set_layer_active(&dst_mesh->corner_data, CD_PROP_FLOAT2, id);
|
||||
}
|
||||
}
|
||||
const char *render_layer = CustomData_get_render_layer_name(&first_mesh.corner_data,
|
||||
CD_PROP_FLOAT2);
|
||||
if (render_layer != nullptr) {
|
||||
int id = CustomData_get_named_layer(&dst_mesh->corner_data, CD_PROP_FLOAT2, render_layer);
|
||||
if (id >= 0) {
|
||||
CustomData_set_layer_render(&dst_mesh->corner_data, CD_PROP_FLOAT2, id);
|
||||
}
|
||||
}
|
||||
/* Actually execute all tasks. */
|
||||
threading::parallel_for(tasks.index_range(), 100, [&](const IndexRange task_range) {
|
||||
for (const int task_index : task_range) {
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include "GEO_separate_geometry.hh"
|
||||
|
||||
#include "BKE_curves.hh"
|
||||
#include "BKE_customdata.hh"
|
||||
#include "BKE_geometry_fields.hh"
|
||||
#include "BKE_grease_pencil.hh"
|
||||
#include "BKE_instances.hh"
|
||||
|
@ -183,6 +184,27 @@ void separate_geometry(bke::GeometrySet &geometry_set,
|
|||
std::optional<Mesh *> dst_mesh = separate_mesh_selection(
|
||||
*mesh, selection, domain, mode, propagation_info);
|
||||
if (dst_mesh) {
|
||||
if (*dst_mesh) {
|
||||
const char *active_layer = CustomData_get_active_layer_name(&mesh->corner_data,
|
||||
CD_PROP_FLOAT2);
|
||||
if (active_layer != nullptr) {
|
||||
int id = CustomData_get_named_layer(
|
||||
&((*dst_mesh)->corner_data), CD_PROP_FLOAT2, active_layer);
|
||||
if (id >= 0) {
|
||||
CustomData_set_layer_active(&((*dst_mesh)->corner_data), CD_PROP_FLOAT2, id);
|
||||
}
|
||||
}
|
||||
|
||||
const char *render_layer = CustomData_get_render_layer_name(&mesh->corner_data,
|
||||
CD_PROP_FLOAT2);
|
||||
if (render_layer != nullptr) {
|
||||
int id = CustomData_get_named_layer(
|
||||
&((*dst_mesh)->corner_data), CD_PROP_FLOAT2, render_layer);
|
||||
if (id >= 0) {
|
||||
CustomData_set_layer_render(&((*dst_mesh)->corner_data), CD_PROP_FLOAT2, id);
|
||||
}
|
||||
}
|
||||
}
|
||||
geometry_set.replace_mesh(*dst_mesh);
|
||||
}
|
||||
some_valid_domain = true;
|
||||
|
|
|
@ -326,7 +326,8 @@ void GPU_batch_draw_advanced(
|
|||
* The argument are expected to be valid for the type of geometry contained by this #GPUBatch
|
||||
* (index or non-indexed).
|
||||
*
|
||||
* A `GPU_BARRIER_COMMAND` memory barrier is automatically added before the call.
|
||||
* The indirect buffer needs to be synced after filling its contents and before calling this
|
||||
* function using `GPU_storagebuf_sync_as_indirect_buffer`.
|
||||
*
|
||||
* For more info see the GL documentation:
|
||||
* https://registry.khronos.org/OpenGL-Refpages/gl4/html/glDrawArraysIndirect.xhtml
|
||||
|
@ -339,7 +340,8 @@ void GPU_batch_draw_indirect(GPUBatch *batch, GPUStorageBuf *indirect_buf, intpt
|
|||
* The argument are expected to be valid for the type of geometry contained by this #GPUBatch
|
||||
* (index or non-indexed).
|
||||
*
|
||||
* A `GPU_BARRIER_COMMAND` memory barrier is automatically added before the call.
|
||||
* The indirect buffer needs to be synced after filling its contents and before calling this
|
||||
* function using `GPU_storagebuf_sync_as_indirect_buffer`.
|
||||
*
|
||||
* For more info see the GL documentation:
|
||||
* https://registry.khronos.org/OpenGL-Refpages/gl4/html/glMultiDrawArraysIndirect.xhtml
|
||||
|
|
|
@ -81,6 +81,12 @@ void GPU_storagebuf_read(GPUStorageBuf *ssbo, void *data);
|
|||
void GPU_storagebuf_copy_sub_from_vertbuf(
|
||||
GPUStorageBuf *ssbo, GPUVertBuf *src, uint dst_offset, uint src_offset, uint copy_size);
|
||||
|
||||
/**
|
||||
* Ensure the ssbo is ready to be used as an indirect buffer in `GPU_batch_draw_indirect`.
|
||||
* NOTE: Internallly, this is only required for the OpenGL backend.
|
||||
*/
|
||||
void GPU_storagebuf_sync_as_indirect_buffer(GPUStorageBuf *ssbo);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -116,4 +116,9 @@ void GPU_storagebuf_read(GPUStorageBuf *ssbo, void *data)
|
|||
unwrap(ssbo)->read(data);
|
||||
}
|
||||
|
||||
void GPU_storagebuf_sync_as_indirect_buffer(GPUStorageBuf *ssbo)
|
||||
{
|
||||
unwrap(ssbo)->sync_as_indirect_buffer();
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
|
|
@ -48,6 +48,7 @@ class StorageBuf {
|
|||
virtual void copy_sub(VertBuf *src, uint dst_offset, uint src_offset, uint copy_size) = 0;
|
||||
virtual void read(void *data) = 0;
|
||||
virtual void async_flush_to_host() = 0;
|
||||
virtual void sync_as_indirect_buffer() = 0;
|
||||
};
|
||||
|
||||
/* Syntactic sugar. */
|
||||
|
|
|
@ -76,6 +76,7 @@ class MTLStorageBuf : public StorageBuf {
|
|||
void copy_sub(VertBuf *src, uint dst_offset, uint src_offset, uint copy_size) override;
|
||||
void read(void *data) override;
|
||||
void async_flush_to_host() override;
|
||||
void sync_as_indirect_buffer() override{/* No-Op.*/};
|
||||
|
||||
void init();
|
||||
|
||||
|
|
|
@ -276,11 +276,7 @@ void GLBatch::draw_indirect(GPUStorageBuf *indirect_buf, intptr_t offset)
|
|||
GL_CHECK_RESOURCES("Batch");
|
||||
|
||||
this->bind();
|
||||
|
||||
/* TODO(fclem): Make the barrier and binding optional if consecutive draws are issued. */
|
||||
dynamic_cast<GLStorageBuf *>(unwrap(indirect_buf))->bind_as(GL_DRAW_INDIRECT_BUFFER);
|
||||
/* This barrier needs to be here as it only work on the currently bound indirect buffer. */
|
||||
glMemoryBarrier(GL_COMMAND_BARRIER_BIT);
|
||||
|
||||
GLenum gl_type = to_gl(prim_type);
|
||||
if (elem) {
|
||||
|
@ -303,11 +299,7 @@ void GLBatch::multi_draw_indirect(GPUStorageBuf *indirect_buf,
|
|||
GL_CHECK_RESOURCES("Batch");
|
||||
|
||||
this->bind();
|
||||
|
||||
/* TODO(fclem): Make the barrier and binding optional if consecutive draws are issued. */
|
||||
dynamic_cast<GLStorageBuf *>(unwrap(indirect_buf))->bind_as(GL_DRAW_INDIRECT_BUFFER);
|
||||
/* This barrier needs to be here as it only work on the currently bound indirect buffer. */
|
||||
glMemoryBarrier(GL_COMMAND_BARRIER_BIT);
|
||||
|
||||
GLenum gl_type = to_gl(prim_type);
|
||||
if (elem) {
|
||||
|
|
|
@ -183,6 +183,13 @@ void GLStorageBuf::read(void *data)
|
|||
}
|
||||
}
|
||||
|
||||
void GLStorageBuf::sync_as_indirect_buffer()
|
||||
{
|
||||
bind_as(GL_DRAW_INDIRECT_BUFFER);
|
||||
glMemoryBarrier(GL_COMMAND_BARRIER_BIT);
|
||||
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, 0);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
} // namespace blender::gpu
|
||||
|
|
|
@ -38,6 +38,7 @@ class GLStorageBuf : public StorageBuf {
|
|||
void copy_sub(VertBuf *src, uint dst_offset, uint src_offset, uint copy_size) override;
|
||||
void read(void *data) override;
|
||||
void async_flush_to_host() override;
|
||||
void sync_as_indirect_buffer() override;
|
||||
|
||||
/* Special internal function to bind SSBOs to indirect argument targets. */
|
||||
void bind_as(GLenum target);
|
||||
|
|
|
@ -36,6 +36,7 @@ class VKStorageBuffer : public StorageBuf, public VKBindableResource {
|
|||
void copy_sub(VertBuf *src, uint dst_offset, uint src_offset, uint copy_size) override;
|
||||
void read(void *data) override;
|
||||
void async_flush_to_host() override;
|
||||
void sync_as_indirect_buffer() override{/* No-Op.*/};
|
||||
|
||||
VkBuffer vk_handle() const
|
||||
{
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <ctime>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "DNA_packedFile_types.h"
|
||||
|
||||
|
@ -179,10 +180,21 @@ static void rna_Image_update(Image *image, ReportList *reports)
|
|||
BKE_image_release_ibuf(image, ibuf, nullptr);
|
||||
}
|
||||
|
||||
static void rna_Image_scale(Image *image, ReportList *reports, int width, int height)
|
||||
static void rna_Image_scale(
|
||||
Image *image, ReportList *reports, int width, int height, int frame, int tile_index)
|
||||
{
|
||||
if (!BKE_image_scale(image, width, height)) {
|
||||
BKE_reportf(reports, RPT_ERROR, "Image '%s' does not have any image data", image->id.name + 2);
|
||||
ImageUser iuser{};
|
||||
BKE_imageuser_default(&iuser);
|
||||
iuser.framenr = frame;
|
||||
if (image->source == IMA_SRC_TILED) {
|
||||
const ImageTile *tile = static_cast<ImageTile *>(BLI_findlink(&image->tiles, tile_index));
|
||||
if (tile != nullptr) {
|
||||
iuser.tile = tile->tile_number;
|
||||
}
|
||||
}
|
||||
|
||||
if (!BKE_image_scale(image, width, height, &iuser)) {
|
||||
BKE_reportf(reports, RPT_ERROR, "Image '%s' failed to load image buffer", image->id.name + 2);
|
||||
return;
|
||||
}
|
||||
BKE_image_partial_update_mark_full_update(image);
|
||||
|
@ -334,6 +346,9 @@ void RNA_api_image(StructRNA *srna)
|
|||
RNA_def_parameter_flags(parm, PropertyFlag(0), PARM_REQUIRED);
|
||||
parm = RNA_def_int(func, "height", 1, 1, INT_MAX, "", "Height", 1, INT_MAX);
|
||||
RNA_def_parameter_flags(parm, PropertyFlag(0), PARM_REQUIRED);
|
||||
RNA_def_int(func, "frame", 0, 0, INT_MAX, "Frame", "Frame (for image sequences)", 0, INT_MAX);
|
||||
RNA_def_int(
|
||||
func, "tile_index", 0, 0, INT_MAX, "Tile", "Tile index (for tiled images)", 0, INT_MAX);
|
||||
|
||||
func = RNA_def_function(srna, "gl_touch", "rna_Image_gl_touch");
|
||||
RNA_def_function_ui_description(
|
||||
|
|
Loading…
Reference in New Issue