Commit: bb4cef71eeaf36aa61187d47b8a8ae06ba55f7c0 Author: Hans Goudey Date: Fri Jun 19 15:07:13 2020 -0400 Branches: master https://developer.blender.org/rBbb4cef71eeaf36aa61187d47b8a8ae06ba55f7c0
UI: ShaderFx Drag and Drop, Layout Updates This patch implements the list panel system D7490 for grease pencil shader effects. It also moves their drawing to a callback in ShaderFxTypeInfo in line with the extensible architecture refactoring goal T75724. The implementation is basically exactly the same as for the modifier patch (9b099c86123fc82). Thanks to Matias Mendiola (@mendio) for helping to develop the layout changes. Differential Revision: https://developer.blender.org/D7985 =================================================================== M release/scripts/startup/bl_ui/properties_data_shaderfx.py M source/blender/blenkernel/BKE_shader_fx.h M source/blender/blenkernel/intern/shader_fx.c M source/blender/blenloader/intern/versioning_290.c M source/blender/editors/include/ED_object.h M source/blender/editors/include/UI_interface.h M source/blender/editors/interface/interface_templates.c M source/blender/editors/object/object_intern.h M source/blender/editors/object/object_ops.c M source/blender/editors/object/object_shader_fx.c M source/blender/editors/space_buttons/space_buttons.c M source/blender/makesdna/DNA_shader_fx_types.h M source/blender/makesrna/intern/rna_shader_fx.c M source/blender/makesrna/intern/rna_ui_api.c M source/blender/shader_fx/CMakeLists.txt M source/blender/shader_fx/intern/FX_shader_blur.c M source/blender/shader_fx/intern/FX_shader_colorize.c M source/blender/shader_fx/intern/FX_shader_flip.c M source/blender/shader_fx/intern/FX_shader_glow.c M source/blender/shader_fx/intern/FX_shader_light.c M source/blender/shader_fx/intern/FX_shader_pixel.c M source/blender/shader_fx/intern/FX_shader_rim.c M source/blender/shader_fx/intern/FX_shader_shadow.c M source/blender/shader_fx/intern/FX_shader_swirl.c M source/blender/shader_fx/intern/FX_shader_wave.c A source/blender/shader_fx/intern/FX_ui_common.c A source/blender/shader_fx/intern/FX_ui_common.h =================================================================== diff --git a/release/scripts/startup/bl_ui/properties_data_shaderfx.py b/release/scripts/startup/bl_ui/properties_data_shaderfx.py index 1d4bf37b282..a96fef018c7 100644 --- a/release/scripts/startup/bl_ui/properties_data_shaderfx.py +++ b/release/scripts/startup/bl_ui/properties_data_shaderfx.py @@ -24,11 +24,11 @@ class ShaderFxButtonsPanel: bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' bl_context = "shaderfx" - bl_options = {'HIDE_HEADER'} class DATA_PT_shader_fx(ShaderFxButtonsPanel, Panel): bl_label = "Effects" + bl_options = {'HIDE_HEADER'} # Unused: always show for now. @@ -39,122 +39,8 @@ class DATA_PT_shader_fx(ShaderFxButtonsPanel, Panel): def draw(self, context): layout = self.layout - - ob = context.object - layout.operator_menu_enum("object.shaderfx_add", "type") - - for fx in ob.shader_effects: - box = layout.template_shaderfx(fx) - if box: - # match enum type to our functions, avoids a lookup table. - getattr(self, fx.type)(box, fx) - - # the mt.type enum is (ab)used for a lookup on function names - # ...to avoid lengthy if statements - # so each type must have a function here. - - def FX_BLUR(self, layout, fx): - - layout.prop(fx, "use_dof_mode", text="Use Depth of Field") - layout.separator() - - col = layout.column() - col.enabled = not fx.use_dof_mode - col.prop(fx, "size", text="Size") - col.separator() - col.prop(fx, "rotation") - - layout.prop(fx, "samples", text="Samples") - - - def FX_COLORIZE(self, layout, fx): - layout.prop(fx, "mode", text="Mode") - - if fx.mode == 'DUOTONE': - layout.prop(fx, "low_color", text="Low Color") - if fx.mode == 'CUSTOM': - layout.prop(fx, "low_color", text="Color") - - if fx.mode == 'DUOTONE': - layout.prop(fx, "high_color", text="High Color") - - layout.prop(fx, "factor") - - def FX_WAVE(self, layout, fx): - row = layout.row(align=True) - row.prop(fx, "orientation", expand=True) - - layout.separator() - layout.prop(fx, "amplitude") - layout.prop(fx, "period") - layout.prop(fx, "phase") - - def FX_PIXEL(self, layout, fx): - layout.prop(fx, "size", text="Size") - - def FX_RIM(self, layout, fx): - layout.prop(fx, "offset", text="Offset") - - layout.prop(fx, "rim_color") - layout.prop(fx, "mask_color") - layout.prop(fx, "mode", text="Blend") - layout.prop(fx, "blur") - layout.prop(fx, "samples") - - def FX_SHADOW(self, layout, fx): - layout.prop(fx, "offset", text="Offset") - - layout.prop(fx, "shadow_color") - layout.prop(fx, "scale") - layout.prop(fx, "rotation") - - layout.separator() - layout.prop(fx, "blur") - layout.prop(fx, "samples") - - layout.separator() - layout.prop(fx, "use_object", text="Use Object as Pivot") - if fx.use_object: - row = layout.row() - row.prop(fx, "object", text="Object") - - layout.separator() - layout.prop(fx, "use_wave", text="Use Wave Effect") - if fx.use_wave is True: - row = layout.row(align=True) - row.prop(fx, "orientation", expand=True) - layout.prop(fx, "amplitude") - layout.prop(fx, "period") - layout.prop(fx, "phase") - - def FX_GLOW(self, layout, fx): - layout.prop(fx, "mode") - if fx.mode == 'LUMINANCE': - layout.prop(fx, "threshold") - else: - layout.prop(fx, "select_color") - - layout.prop(fx, "glow_color") - layout.separator() - layout.prop(fx, "blend_mode", text="Blend") - layout.prop(fx, "opacity") - - layout.prop(fx, "size") - layout.prop(fx, "rotation") - layout.prop(fx, "samples") - - layout.prop(fx, "use_glow_under", text="Glow Under") - - def FX_SWIRL(self, layout, fx): - layout.prop(fx, "object", text="Object") - - layout.prop(fx, "radius") - layout.prop(fx, "angle") - - def FX_FLIP(self, layout, fx): - layout.prop(fx, "flip_horizontal") - layout.prop(fx, "flip_vertical") + layout.template_shaderfx() classes = ( diff --git a/source/blender/blenkernel/BKE_shader_fx.h b/source/blender/blenkernel/BKE_shader_fx.h index bdc782a606e..31e14c6c884 100644 --- a/source/blender/blenkernel/BKE_shader_fx.h +++ b/source/blender/blenkernel/BKE_shader_fx.h @@ -28,6 +28,7 @@ extern "C" { #endif +struct ARegionType; struct ID; struct ListBase; struct ModifierUpdateDepsgraphContext; @@ -157,11 +158,17 @@ typedef struct ShaderFxTypeInfo { struct Object *ob, ShaderFxIDWalkFunc walk, void *userData); + + /* Register the panel types for the effect's UI. */ + void (*panelRegister)(struct ARegionType *region_type); } ShaderFxTypeInfo; +#define SHADERFX_TYPE_PANEL_PREFIX "FX_PT_" + /* Initialize global data (type info and some common global storages). */ void BKE_shaderfx_init(void); +void BKE_shaderfxType_panel_id(ShaderFxType type, char *panel_id); const ShaderFxTypeInfo *BKE_shaderfx_get_info(ShaderFxType type); struct ShaderFxData *BKE_shaderfx_new(int type); void BKE_shaderfx_free_ex(struct ShaderFxData *fx, const int flag); diff --git a/source/blender/blenkernel/intern/shader_fx.c b/source/blender/blenkernel/intern/shader_fx.c index 0ad61de1ff2..2923298c5d5 100644 --- a/source/blender/blenkernel/intern/shader_fx.c +++ b/source/blender/blenkernel/intern/shader_fx.c @@ -82,8 +82,9 @@ ShaderFxData *BKE_shaderfx_new(int type) BLI_strncpy(fx->name, DATA_(fxi->name), sizeof(fx->name)); fx->type = type; - fx->mode = eShaderFxMode_Realtime | eShaderFxMode_Render | eShaderFxMode_Expanded; + fx->mode = eShaderFxMode_Realtime | eShaderFxMode_Render; fx->flag = eShaderFxFlag_OverrideLibrary_Local; + fx->ui_expand_flag = 1; /* Expand only the parent panel by default. */ if (fxi->flags & eShaderFxTypeFlag_EnableInEditmode) { fx->mode |= eShaderFxMode_Editmode; @@ -156,7 +157,7 @@ bool BKE_shaderfx_depends_ontime(ShaderFxData *fx) const ShaderFxTypeInfo *BKE_shaderfx_get_info(ShaderFxType type) { /* type unsigned, no need to check < 0 */ - if (type < NUM_SHADER_FX_TYPES && shader_fx_types[type]->name[0] != '\0') { + if (type < NUM_SHADER_FX_TYPES && type > 0 && shader_fx_types[type]->name[0] != '\0') { return shader_fx_types[type]; } else { @@ -164,6 +165,20 @@ const ShaderFxTypeInfo *BKE_shaderfx_get_info(ShaderFxType type) } } +/** + * Get an effect's panel type, which was defined in the #panelRegister callback. + * + * \note ShaderFx panel types are assumed to be named with the struct name field concatenated to + * the defined prefix. + */ +void BKE_shaderfxType_panel_id(ShaderFxType type, char *r_idname) +{ + const ShaderFxTypeInfo *fxi = BKE_shaderfx_get_info(type); + + strcpy(r_idname, SHADERFX_TYPE_PANEL_PREFIX); + strcat(r_idname, fxi->name); +} + void BKE_shaderfx_copydata_generic(const ShaderFxData *fx_src, ShaderFxData *fx_dst) { const ShaderFxTypeInfo *fxi = BKE_shaderfx_get_info(fx_src->type); @@ -198,6 +213,7 @@ void BKE_shaderfx_copydata_ex(ShaderFxData *fx, ShaderFxData *target, const int target->mode = fx->mode; target->flag = fx->flag; + target->ui_expand_flag = fx->ui_expand_flag; if (fxi->copyData) { fxi->copyData(fx, target); diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c index 00c73ebe9a7..bf4ed270e33 100644 --- a/source/blender/blenloader/intern/versioning_290.c +++ b/source/blender/blenloader/intern/versioning_290.c @@ -30,6 +30,7 @@ #include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "DNA_shader_fx_types.h" #include "BKE_collection.h" #include "BKE_colortools.h" @@ -317,5 +318,19 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) } } } + + /* Transition to saving expansion for all of an effect's subpanels. */ + if (!DNA_struct_elem_find(fd->filesdna, "ShaderFxData", "short", "ui_expand_flag")) { + for (Object *object = bmain->objects.first; object != NULL; object = object->id.next) { + LISTBASE_FOREACH (ShaderFxData *, fx, &object->shader_fx) { + if (fx->mode & eShaderFxMode_Expanded_DEPRECATED) { + fx->ui_expand_flag = 1; + } + else { + fx->ui_expand_flag = 0; + } + } + } + } } } diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h index 0cc926987b2..73c58753531 100644 --- a/source/blender/editors/include/ED_object.h +++ b/source/blender/editors/include/ED_object.h @@ -453,6 +453,10 @@ int ED_object_shaderfx_move_down(struct ReportList *reports, int ED_object_shaderfx_move_up(struct ReportList *reports, struct Object *ob, struct ShaderFxData *fx); +bool ED_object_shaderfx_move_to_index(struct ReportList *reports, + struct Object *ob, + struct ShaderFxData *fx, + const int index); /* object_select.c */ void ED_object_select_linked_by_id(struct bContext *C, struct ID *id); diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 8e9591c1963..bcbee51246e 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -2005,6 +2005,7 @@ void uiTemplatePathBuilder(uiLayout *layout, const char *text); void uiTemplateModifiers(uiLayout *layout, struct bContext *C); void uiTemplateGpencilModifiers(uiLayout *layout, struct bContext *C); +void uiTemplateShaderFx(uiLayout *layout, struct bContext *C); void uiTemplateConstraints(uiLayout *layout, struct bContext *C, bool use_bone_c @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] https://lists.blender.org/mailman/listinfo/bf-blender-cvs
