2.5: Modifiers & Menus
* Popup menus now remember the last clicked item again. * Modifier and File Format menus are now organized in multiple columns with categories. * Hook, explode, uv project modifiers have all their buttons again with the relevant operators implemented. * Modifiers that can't be added by the user, or don't work on curves for example, are not in the menu anymore. * Fix search menu overlapping buttons when near the bottom of the screen. * Fix uv layers search menu not working in some modifiers. * Cleanup popup menu code a bit, layout engine is used in more cases now instead of ugly position calculation code.
This commit is contained in:
parent
2881393fbb
commit
1be67b60fd
|
@ -105,7 +105,7 @@ class DATA_PT_vertex_groups(DataButtonsPanel):
|
|||
row = layout.row()
|
||||
row.itemR(group, "name")
|
||||
|
||||
if context.edit_object:
|
||||
if ob.mode == 'EDIT':
|
||||
row = layout.row()
|
||||
|
||||
sub = row.row(align=True)
|
||||
|
@ -180,7 +180,7 @@ class DATA_PT_shape_keys(DataButtonsPanel):
|
|||
|
||||
layout.itemR(kb, "name")
|
||||
|
||||
if context.edit_object:
|
||||
if ob.mode == 'EDIT':
|
||||
layout.enabled = False
|
||||
|
||||
class DATA_PT_uv_texture(DataButtonsPanel):
|
||||
|
|
|
@ -170,7 +170,7 @@ class DATA_PT_modifiers(DataButtonsPanel):
|
|||
if md.texture_coordinates == 'OBJECT':
|
||||
layout.itemR(md, "texture_coordinate_object", text="Object")
|
||||
elif md.texture_coordinates == 'UV' and ob.type == 'MESH':
|
||||
layout.item_pointerR(md, "uv_layer", ob.data, "uv_layers")
|
||||
layout.item_pointerR(md, "uv_layer", ob.data, "uv_textures")
|
||||
|
||||
def EDGE_SPLIT(self, layout, ob, md):
|
||||
split = layout.split()
|
||||
|
@ -187,21 +187,36 @@ class DATA_PT_modifiers(DataButtonsPanel):
|
|||
def EXPLODE(self, layout, ob, md):
|
||||
layout.item_pointerR(md, "vertex_group", ob, "vertex_groups")
|
||||
layout.itemR(md, "protect")
|
||||
layout.itemR(md, "split_edges")
|
||||
layout.itemR(md, "unborn")
|
||||
layout.itemR(md, "alive")
|
||||
layout.itemR(md, "dead")
|
||||
# Missing: "Refresh" and "Clear Vertex Group" Operator
|
||||
|
||||
flow = layout.column_flow(2)
|
||||
flow.itemR(md, "split_edges")
|
||||
flow.itemR(md, "unborn")
|
||||
flow.itemR(md, "alive")
|
||||
flow.itemR(md, "dead")
|
||||
|
||||
layout.itemO("object.explode_refresh", text="Refresh");
|
||||
|
||||
def FLUID_SIMULATION(self, layout, ob, md):
|
||||
layout.itemL(text="See Fluid panel.")
|
||||
|
||||
def HOOK(self, layout, ob, md):
|
||||
layout.itemR(md, "falloff")
|
||||
layout.itemR(md, "force", slider=True)
|
||||
layout.itemR(md, "object")
|
||||
layout.item_pointerR(md, "vertex_group", ob, "vertex_groups")
|
||||
# Missing: "Reset" and "Recenter" Operator
|
||||
|
||||
split = layout.split()
|
||||
split.itemR(md, "falloff")
|
||||
split.itemR(md, "force", slider=True)
|
||||
|
||||
layout.itemS()
|
||||
|
||||
row = layout.row()
|
||||
row.itemO("object.hook_reset", text="Reset")
|
||||
row.itemO("object.hook_recenter", text="Recenter")
|
||||
|
||||
if ob.mode == 'EDIT':
|
||||
row = layout.row()
|
||||
row.itemO("object.hook_select", text="Select")
|
||||
row.itemO("object.hook_assign", text="Assign")
|
||||
|
||||
def LATTICE(self, layout, ob, md):
|
||||
layout.itemR(md, "object")
|
||||
|
@ -222,7 +237,7 @@ class DATA_PT_modifiers(DataButtonsPanel):
|
|||
|
||||
layout.itemS()
|
||||
|
||||
layout.itemO("object.modifier_mdef_bind", text="Bind")
|
||||
layout.itemO("object.meshdeform_bind", text="Bind")
|
||||
row = layout.row()
|
||||
row.itemR(md, "precision")
|
||||
row.itemR(md, "dynamic")
|
||||
|
@ -346,16 +361,26 @@ class DATA_PT_modifiers(DataButtonsPanel):
|
|||
|
||||
def UV_PROJECT(self, layout, ob, md):
|
||||
if ob.type == 'MESH':
|
||||
layout.item_pointerR(md, "uv_layer", ob.data, "uv_layers")
|
||||
#layout.itemR(md, "projectors")
|
||||
layout.item_pointerR(md, "uv_layer", ob.data, "uv_textures")
|
||||
layout.itemR(md, "image")
|
||||
layout.itemR(md, "override_image")
|
||||
layout.itemL(text="Aspect Ratio:")
|
||||
col = layout.column(align=True)
|
||||
col.itemR(md, "horizontal_aspect_ratio", text="Horizontal")
|
||||
col.itemR(md, "vertical_aspect_ratio", text="Vertical")
|
||||
|
||||
#"Projectors" don't work.
|
||||
|
||||
split = layout.split()
|
||||
|
||||
col = split.column()
|
||||
col.itemL(text="Aspect Ratio:")
|
||||
|
||||
sub = col.column(align=True)
|
||||
sub.itemR(md, "horizontal_aspect_ratio", text="Horizontal")
|
||||
sub.itemR(md, "vertical_aspect_ratio", text="Vertical")
|
||||
|
||||
col = split.column()
|
||||
col.itemL(text="Projectors:")
|
||||
|
||||
sub = col.column(align=True)
|
||||
sub.itemR(md, "num_projectors", text="Number")
|
||||
for proj in md.projectors:
|
||||
sub.itemR(proj, "object", text="")
|
||||
|
||||
def WAVE(self, layout, ob, md):
|
||||
split = layout.split()
|
||||
|
@ -387,7 +412,7 @@ class DATA_PT_modifiers(DataButtonsPanel):
|
|||
layout.itemR(md, "texture")
|
||||
layout.itemR(md, "texture_coordinates")
|
||||
if md.texture_coordinates == 'MAP_UV' and ob.type == 'MESH':
|
||||
layout.item_pointerR(md, "uv_layer", ob.data, "uv_layers")
|
||||
layout.item_pointerR(md, "uv_layer", ob.data, "uv_textures")
|
||||
elif md.texture_coordinates == 'OBJECT':
|
||||
layout.itemR(md, "texture_coordinates_object")
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ class MATERIAL_PT_context_material(MaterialButtonsPanel):
|
|||
col.itemO("object.material_slot_add", icon="ICON_ZOOMIN", text="")
|
||||
col.itemO("object.material_slot_remove", icon="ICON_ZOOMOUT", text="")
|
||||
|
||||
if context.edit_object:
|
||||
if ob.mode == 'EDIT':
|
||||
row = layout.row(align=True)
|
||||
row.itemO("object.material_slot_assign", text="Assign")
|
||||
row.itemO("object.material_slot_select", text="Select")
|
||||
|
|
|
@ -247,7 +247,7 @@ class IMAGE_HT_header(bpy.types.Header):
|
|||
|
||||
"""
|
||||
mesh = context.edit_object.data
|
||||
row.item_pointerR(mesh, "active_uv_layer", mesh, "uv_layers")
|
||||
row.item_pointerR(mesh, "active_uv_layer", mesh, "uv_textures")
|
||||
"""
|
||||
|
||||
if ima:
|
||||
|
|
|
@ -90,7 +90,10 @@ typedef enum {
|
|||
eModifierTypeFlag_UsesPointCache = (1<<6),
|
||||
|
||||
/* For physics modifiers, max one per type */
|
||||
eModifierTypeFlag_Single = (1<<7)
|
||||
eModifierTypeFlag_Single = (1<<7),
|
||||
|
||||
/* Some modifier can't be added manually by user */
|
||||
eModifierTypeFlag_NoUserAdd = (1<<8)
|
||||
} ModifierTypeFlag;
|
||||
|
||||
typedef void (*ObjectWalkFunc)(void *userData, struct Object *ob, struct Object **obpoin);
|
||||
|
|
|
@ -8616,7 +8616,8 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
|
|||
mti->freeData = smokeHRModifier_freeData;
|
||||
mti->flags = eModifierTypeFlag_AcceptsMesh
|
||||
| eModifierTypeFlag_UsesPointCache
|
||||
| eModifierTypeFlag_Single;
|
||||
| eModifierTypeFlag_Single
|
||||
| eModifierTypeFlag_NoUserAdd;
|
||||
mti->deformVerts = smokeHRModifier_deformVerts;
|
||||
mti->dependsOnTime = smokeHRModifier_dependsOnTime;
|
||||
mti->updateDepgraph = smokeHRModifier_updateDepgraph;
|
||||
|
@ -8647,7 +8648,7 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
|
|||
mti = INIT_TYPE(Surface);
|
||||
mti->type = eModifierTypeType_OnlyDeform;
|
||||
mti->initData = surfaceModifier_initData;
|
||||
mti->flags = eModifierTypeFlag_AcceptsMesh;
|
||||
mti->flags = eModifierTypeFlag_AcceptsMesh|eModifierTypeFlag_NoUserAdd;
|
||||
mti->dependsOnTime = surfaceModifier_dependsOnTime;
|
||||
mti->freeData = surfaceModifier_freeData;
|
||||
mti->deformVerts = surfaceModifier_deformVerts;
|
||||
|
|
|
@ -100,6 +100,8 @@ typedef struct uiLayout uiLayout;
|
|||
#define UI_BLOCK_KEEP_OPEN 256
|
||||
#define UI_BLOCK_POPUP 512
|
||||
#define UI_BLOCK_OUT_1 1024
|
||||
#define UI_BLOCK_NO_FLIP 2048
|
||||
#define UI_BLOCK_POPUP_MEMORY 4096
|
||||
|
||||
/* uiPopupBlockHandle->menuretval */
|
||||
#define UI_RETURN_CANCEL 1 /* cancel all menus cascading */
|
||||
|
@ -254,8 +256,6 @@ void uiPupMenuNotice(struct bContext *C, char *str, ...);
|
|||
void uiPupMenuError(struct bContext *C, char *str, ...);
|
||||
void uiPupMenuReports(struct bContext *C, struct ReportList *reports);
|
||||
|
||||
void uiPupMenuSetActive(int val);
|
||||
|
||||
/* Popup Blocks
|
||||
*
|
||||
* Functions used to create popup blocks. These are like popup menus
|
||||
|
|
|
@ -225,6 +225,7 @@ static void ui_text_bounds_block(uiBlock *block, float offset)
|
|||
uiStyle *style= U.uistyles.first; // XXX pass on as arg
|
||||
uiBut *bt;
|
||||
int i = 0, j, x1addval= offset, nextcol;
|
||||
int lastcol= 0, col= 0;
|
||||
|
||||
uiStyleFontSet(&style->widget);
|
||||
|
||||
|
@ -237,18 +238,26 @@ static void ui_text_bounds_block(uiBlock *block, float offset)
|
|||
|
||||
if(j > i) i = j;
|
||||
}
|
||||
|
||||
if(bt->next && bt->x1 < bt->next->x1)
|
||||
lastcol++;
|
||||
}
|
||||
|
||||
/* cope with multi collumns */
|
||||
bt= block->buttons.first;
|
||||
while(bt) {
|
||||
if(bt->next && bt->x1 < bt->next->x1)
|
||||
if(bt->next && bt->x1 < bt->next->x1) {
|
||||
nextcol= 1;
|
||||
col++;
|
||||
}
|
||||
else nextcol= 0;
|
||||
|
||||
bt->x1 = x1addval;
|
||||
bt->x2 = bt->x1 + i + block->bounds;
|
||||
|
||||
if(col == lastcol)
|
||||
bt->x2= MAX2(bt->x2, offset + block->minbounds);
|
||||
|
||||
ui_check_but(bt); // clips text again
|
||||
|
||||
if(nextcol)
|
||||
|
@ -281,7 +290,7 @@ void ui_bounds_block(uiBlock *block)
|
|||
|
||||
if(bt->x2 > block->maxx) block->maxx= bt->x2;
|
||||
if(bt->y2 > block->maxy) block->maxy= bt->y2;
|
||||
|
||||
|
||||
bt= bt->next;
|
||||
}
|
||||
|
||||
|
@ -291,6 +300,8 @@ void ui_bounds_block(uiBlock *block)
|
|||
block->maxy += block->bounds;
|
||||
}
|
||||
|
||||
block->maxx= block->minx + MAX2(block->maxx - block->minx, block->minbounds);
|
||||
|
||||
/* hardcoded exception... but that one is annoying with larger safety */
|
||||
bt= block->buttons.first;
|
||||
if(bt && strncmp(bt->str, "ERROR", 5)==0) xof= 10;
|
||||
|
@ -2286,8 +2297,12 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
|
|||
dynstr= BLI_dynstr_new();
|
||||
BLI_dynstr_appendf(dynstr, "%s%%t", RNA_property_ui_name(prop));
|
||||
for(i=0; i<totitem; i++) {
|
||||
if(!item[i].identifier[0])
|
||||
BLI_dynstr_append(dynstr, "|%l");
|
||||
if(!item[i].identifier[0]) {
|
||||
if(item[i].name)
|
||||
BLI_dynstr_appendf(dynstr, "|%s%%l", item[i].name);
|
||||
else
|
||||
BLI_dynstr_append(dynstr, "|%l");
|
||||
}
|
||||
else if(item[i].icon)
|
||||
BLI_dynstr_appendf(dynstr, "|%s %%i%d %%x%d", item[i].name, item[i].icon, item[i].value);
|
||||
else
|
||||
|
@ -2839,6 +2854,8 @@ void uiBlockFlipOrder(uiBlock *block)
|
|||
|
||||
if(U.uiflag & USER_MENUFIXEDORDER)
|
||||
return;
|
||||
else if(block->flag & UI_BLOCK_NO_FLIP)
|
||||
return;
|
||||
|
||||
for(but= block->buttons.first; but; but= but->next) {
|
||||
if(but->flag & UI_BUT_ALIGN) return;
|
||||
|
|
|
@ -1720,6 +1720,7 @@ static void ui_blockopen_begin(bContext *C, uiBut *but, uiHandleButtonData *data
|
|||
uiBlockCreateFunc func= NULL;
|
||||
uiBlockHandleCreateFunc handlefunc= NULL;
|
||||
uiMenuCreateFunc menufunc= NULL;
|
||||
char *menustr= NULL;
|
||||
void *arg= NULL;
|
||||
|
||||
switch(but->type) {
|
||||
|
@ -1744,16 +1745,15 @@ static void ui_blockopen_begin(bContext *C, uiBut *but, uiHandleButtonData *data
|
|||
data->value= data->origvalue;
|
||||
but->editval= &data->value;
|
||||
|
||||
handlefunc= ui_block_func_MENU;
|
||||
arg= but;
|
||||
menustr= but->str;
|
||||
}
|
||||
break;
|
||||
case ICONROW:
|
||||
handlefunc= ui_block_func_ICONROW;
|
||||
menufunc= ui_block_func_ICONROW;
|
||||
arg= but;
|
||||
break;
|
||||
case ICONTEXTROW:
|
||||
handlefunc= ui_block_func_ICONTEXTROW;
|
||||
menufunc= ui_block_func_ICONTEXTROW;
|
||||
arg= but;
|
||||
break;
|
||||
case COL:
|
||||
|
@ -1771,8 +1771,8 @@ static void ui_blockopen_begin(bContext *C, uiBut *but, uiHandleButtonData *data
|
|||
if(but->block->handle)
|
||||
data->menu->popup= but->block->handle->popup;
|
||||
}
|
||||
else if(menufunc) {
|
||||
data->menu= ui_popup_menu_create(C, data->region, but, menufunc, arg);
|
||||
else if(menufunc || menustr) {
|
||||
data->menu= ui_popup_menu_create(C, data->region, but, menufunc, arg, menustr);
|
||||
if(but->block->handle)
|
||||
data->menu->popup= but->block->handle->popup;
|
||||
}
|
||||
|
@ -3729,10 +3729,15 @@ static void button_activate_exit(bContext *C, uiHandleButtonData *data, uiBut *b
|
|||
}
|
||||
}
|
||||
|
||||
/* autokey & undo push */
|
||||
if(!data->cancel)
|
||||
if(!data->cancel) {
|
||||
/* autokey & undo push */
|
||||
ui_apply_autokey_undo(C, but);
|
||||
|
||||
/* popup menu memory */
|
||||
if(block->flag & UI_BLOCK_POPUP_MEMORY)
|
||||
ui_popup_menu_memory(block, but);
|
||||
}
|
||||
|
||||
/* disable tooltips until mousemove + last active flag */
|
||||
for(block=data->region->uiblocks.first; block; block=block->next) {
|
||||
for(bt=block->buttons.first; bt; bt=bt->next)
|
||||
|
|
|
@ -287,7 +287,8 @@ struct uiBlock {
|
|||
char *lockstr;
|
||||
|
||||
float xofs, yofs; // offset to parent button
|
||||
int bounds, dobounds, mx, my; // for doing delayed
|
||||
int dobounds, mx, my; // for doing delayed
|
||||
int bounds, minbounds; // for doing delayed
|
||||
int endblock; // uiEndBlock done?
|
||||
|
||||
rctf safety; // pulldowns, to detect outside, can differ per case how it is created
|
||||
|
@ -297,6 +298,7 @@ struct uiBlock {
|
|||
int tooltipdisabled; // to avoid tooltip after click
|
||||
|
||||
int active; // to keep blocks while drawing and free them afterwards
|
||||
int puphash; // popup menu hash for memory
|
||||
|
||||
void *evil_C; // XXX hack for dynamic operator enums
|
||||
};
|
||||
|
@ -372,14 +374,15 @@ struct uiPopupBlockHandle {
|
|||
float retvec[3];
|
||||
};
|
||||
|
||||
uiBlock *ui_block_func_MENU(struct bContext *C, uiPopupBlockHandle *handle, void *arg_but);
|
||||
uiBlock *ui_block_func_ICONROW(struct bContext *C, uiPopupBlockHandle *handle, void *arg_but);
|
||||
uiBlock *ui_block_func_ICONTEXTROW(struct bContext *C, uiPopupBlockHandle *handle, void *arg_but);
|
||||
uiBlock *ui_block_func_COL(struct bContext *C, uiPopupBlockHandle *handle, void *arg_but);
|
||||
void ui_block_func_ICONROW(struct bContext *C, uiLayout *layout, void *arg_but);
|
||||
void ui_block_func_ICONTEXTROW(struct bContext *C, uiLayout *layout, void *arg_but);
|
||||
|
||||
struct ARegion *ui_tooltip_create(struct bContext *C, struct ARegion *butregion, uiBut *but);
|
||||
void ui_tooltip_free(struct bContext *C, struct ARegion *ar);
|
||||
|
||||
uiBut *ui_popup_menu_memory(uiBlock *block, uiBut *but);
|
||||
|
||||
/* searchbox for string button */
|
||||
ARegion *ui_searchbox_create(struct bContext *C, struct ARegion *butregion, uiBut *but);
|
||||
int ui_searchbox_inside(struct ARegion *ar, int x, int y);
|
||||
|
@ -394,7 +397,8 @@ typedef uiBlock* (*uiBlockHandleCreateFunc)(struct bContext *C, struct uiPopupBl
|
|||
uiPopupBlockHandle *ui_popup_block_create(struct bContext *C, struct ARegion *butregion, uiBut *but,
|
||||
uiBlockCreateFunc create_func, uiBlockHandleCreateFunc handle_create_func, void *arg);
|
||||
uiPopupBlockHandle *ui_popup_menu_create(struct bContext *C, struct ARegion *butregion, uiBut *but,
|
||||
uiMenuCreateFunc create_func, void *arg);
|
||||
uiMenuCreateFunc create_func, void *arg, char *str);
|
||||
|
||||
void ui_popup_block_free(struct bContext *C, uiPopupBlockHandle *handle);
|
||||
|
||||
void ui_set_name_menu(uiBut *but, int value);
|
||||
|
|
|
@ -619,6 +619,8 @@ void uiItemsEnumO(uiLayout *layout, char *opname, char *propname)
|
|||
wmOperatorType *ot= WM_operatortype_find(opname, 0);
|
||||
PointerRNA ptr;
|
||||
PropertyRNA *prop;
|
||||
uiBut *bt;
|
||||
uiBlock *block= layout->root->block;
|
||||
|
||||
if(!ot || !ot->srna) {
|
||||
ui_item_disabled(layout, opname);
|
||||
|
@ -631,14 +633,31 @@ void uiItemsEnumO(uiLayout *layout, char *opname, char *propname)
|
|||
if(prop && RNA_property_type(prop) == PROP_ENUM) {
|
||||
EnumPropertyItem *item;
|
||||
int totitem, i, free;
|
||||
uiLayout *split= uiLayoutSplit(layout, 0);
|
||||
uiLayout *column= uiLayoutColumn(split, 0);
|
||||
|
||||
RNA_property_enum_items(layout->root->block->evil_C, &ptr, prop, &item, &totitem, &free);
|
||||
RNA_property_enum_items(block->evil_C, &ptr, prop, &item, &totitem, &free);
|
||||
|
||||
for(i=0; i<totitem; i++)
|
||||
if(item[i].identifier[0])
|
||||
uiItemEnumO(layout, (char*)item[i].name, item[i].icon, opname, propname, item[i].value);
|
||||
else
|
||||
uiItemS(layout);
|
||||
for(i=0; i<totitem; i++) {
|
||||
if(item[i].identifier[0]) {
|
||||
uiItemEnumO(column, (char*)item[i].name, item[i].icon, opname, propname, item[i].value);
|
||||
}
|
||||
else {
|
||||
if(item[i].name) {
|
||||
if(i != 0) {
|
||||
column= uiLayoutColumn(split, 0);
|
||||
/* inconsistent, but menus with labels do not look good flipped */
|
||||
block->flag |= UI_BLOCK_NO_FLIP;
|
||||
}
|
||||
|
||||
uiItemL(column, (char*)item[i].name, 0);
|
||||
bt= block->buttons.last;
|
||||
bt->flag= UI_TEXT_LEFT;
|
||||
}
|
||||
else
|
||||
uiItemS(column);
|
||||
}
|
||||
}
|
||||
|
||||
if(free)
|
||||
MEM_freeN(item);
|
||||
|
@ -924,6 +943,8 @@ void uiItemEnumR_string(uiLayout *layout, char *name, int icon, struct PointerRN
|
|||
void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname)
|
||||
{
|
||||
PropertyRNA *prop;
|
||||
uiBlock *block= layout->root->block;
|
||||
uiBut *bt;
|
||||
|
||||
prop= RNA_struct_find_property(ptr, propname);
|
||||
|
||||
|
@ -935,14 +956,31 @@ void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname)
|
|||
if(RNA_property_type(prop) == PROP_ENUM) {
|
||||
EnumPropertyItem *item;
|
||||
int totitem, i, free;
|
||||
uiLayout *split= uiLayoutSplit(layout, 0);
|
||||
uiLayout *column= uiLayoutColumn(split, 0);
|
||||
|
||||
RNA_property_enum_items(layout->root->block->evil_C, ptr, prop, &item, &totitem, &free);
|
||||
RNA_property_enum_items(block->evil_C, ptr, prop, &item, &totitem, &free);
|
||||
|
||||
for(i=0; i<totitem; i++)
|
||||
if(item[i].identifier[0])
|
||||
uiItemEnumR(layout, (char*)item[i].name, 0, ptr, propname, item[i].value);
|
||||
else
|
||||
uiItemS(layout);
|
||||
for(i=0; i<totitem; i++) {
|
||||
if(item[i].identifier[0]) {
|
||||
uiItemEnumR(column, (char*)item[i].name, 0, ptr, propname, item[i].value);
|
||||
}
|
||||
else {
|
||||
if(item[i].name) {
|
||||
if(i != 0) {
|
||||
column= uiLayoutColumn(split, 0);
|
||||
/* inconsistent, but menus with labels do not look good flipped */
|
||||
block->flag |= UI_BLOCK_NO_FLIP;
|
||||
}
|
||||
|
||||
uiItemL(column, (char*)item[i].name, 0);
|
||||
bt= block->buttons.last;
|
||||
bt->flag= UI_TEXT_LEFT;
|
||||
}
|
||||
else
|
||||
uiItemS(column);
|
||||
}
|
||||
}
|
||||
|
||||
if(free)
|
||||
MEM_freeN(item);
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -237,11 +237,11 @@ static void template_ID(bContext *C, uiBlock *block, TemplateID *template, Struc
|
|||
int w= idptr.data?UI_UNIT_X:UI_UNIT_X*6;
|
||||
|
||||
if(newop) {
|
||||
but= uiDefIconTextButO(block, BUT, newop, WM_OP_INVOKE_REGION_WIN, ICON_ZOOMIN, "Add New", 0, 0, w, UI_UNIT_Y, NULL);
|
||||
but= uiDefIconTextButO(block, BUT, newop, WM_OP_INVOKE_REGION_WIN, ICON_ZOOMIN, (idptr.data)? "": "Add New", 0, 0, w, UI_UNIT_Y, NULL);
|
||||
uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_ADD_NEW));
|
||||
}
|
||||
else {
|
||||
but= uiDefIconTextBut(block, BUT, 0, ICON_ZOOMIN, "Add New", 0, 0, w, UI_UNIT_Y, NULL, 0, 0, 0, 0, NULL);
|
||||
but= uiDefIconTextBut(block, BUT, 0, ICON_ZOOMIN, (idptr.data)? "": "Add New", 0, 0, w, UI_UNIT_Y, NULL, 0, 0, 0, 0, NULL);
|
||||
uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_ADD_NEW));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1150,7 +1150,7 @@ void ED_object_apply_obmat(Object *ob)
|
|||
|
||||
}
|
||||
|
||||
int hook_getIndexArray(Object *obedit, int *tot, int **indexar, char *name, float *cent_r)
|
||||
int object_hook_index_array(Object *obedit, int *tot, int **indexar, char *name, float *cent_r)
|
||||
{
|
||||
*indexar= NULL;
|
||||
*tot= 0;
|
||||
|
@ -1232,9 +1232,8 @@ static void select_editcurve_hook(Object *obedit, HookModifierData *hmd)
|
|||
}
|
||||
}
|
||||
|
||||
void obedit_hook_select(Object *ob, HookModifierData *hmd)
|
||||
void object_hook_select(Object *ob, HookModifierData *hmd)
|
||||
{
|
||||
|
||||
if(ob->type==OB_MESH) select_editmesh_hook(ob, hmd);
|
||||
else if(ob->type==OB_LATTICE) select_editlattice_hook(ob, hmd);
|
||||
else if(ob->type==OB_CURVE) select_editcurve_hook(ob, hmd);
|
||||
|
@ -1318,7 +1317,7 @@ void add_hook(Scene *scene, View3D *v3d, int mode)
|
|||
int tot, ok, *indexar;
|
||||
char name[32];
|
||||
|
||||
ok = hook_getIndexArray(obedit, &tot, &indexar, name, cent);
|
||||
ok = object_hook_index_array(obedit, &tot, &indexar, name, cent);
|
||||
|
||||
if(ok==0) {
|
||||
error("Requires selected vertices or active Vertex Group");
|
||||
|
@ -1381,7 +1380,7 @@ void add_hook(Scene *scene, View3D *v3d, int mode)
|
|||
modifier_free(md);
|
||||
}
|
||||
else if(mode==5) { /* select */
|
||||
obedit_hook_select(obedit, hmd);
|
||||
object_hook_select(obedit, hmd);
|
||||
}
|
||||
else if(mode==6) { /* clear offset */
|
||||
where_is_object(scene, ob); /* ob is hook->parent */
|
||||
|
|
|
@ -34,6 +34,7 @@ struct Lattice;
|
|||
struct Curve;
|
||||
struct Object;
|
||||
struct Mesh;
|
||||
struct HookModifierData;
|
||||
|
||||
/* internal exports only */
|
||||
|
||||
|
@ -80,6 +81,9 @@ void OBJECT_OT_armature_add(struct wmOperatorType *ot);
|
|||
/* only used as menu */
|
||||
void OBJECT_OT_primitive_add(struct wmOperatorType *ot);
|
||||
|
||||
int object_hook_index_array(Object *obedit, int *tot, int **indexar, char *name, float *cent_r);
|
||||
void object_hook_select(Object *obedit, struct HookModifierData *hmd);
|
||||
|
||||
/* editlattice.c */
|
||||
void free_editLatt(Object *ob);
|
||||
void make_editLatt(Object *obedit);
|
||||
|
@ -104,7 +108,12 @@ void OBJECT_OT_modifier_apply(struct wmOperatorType *ot);
|
|||
void OBJECT_OT_modifier_convert(struct wmOperatorType *ot);
|
||||
void OBJECT_OT_modifier_copy(struct wmOperatorType *ot);
|
||||
void OBJECT_OT_multires_subdivide(struct wmOperatorType *ot);
|
||||
void OBJECT_OT_modifier_mdef_bind(struct wmOperatorType *ot);
|
||||
void OBJECT_OT_meshdeform_bind(struct wmOperatorType *ot);
|
||||
void OBJECT_OT_hook_reset(struct wmOperatorType *ot);
|
||||
void OBJECT_OT_hook_recenter(struct wmOperatorType *ot);
|
||||
void OBJECT_OT_hook_select(struct wmOperatorType *ot);
|
||||
void OBJECT_OT_hook_assign(struct wmOperatorType *ot);
|
||||
void OBJECT_OT_explode_refresh(struct wmOperatorType *ot);
|
||||
|
||||
/* editconstraint.c */
|
||||
void OBJECT_OT_constraint_add(struct wmOperatorType *ot);
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include "DNA_object_force.h"
|
||||
#include "DNA_scene_types.h"
|
||||
|
||||
#include "BLI_arithb.h"
|
||||
#include "BLI_listbase.h"
|
||||
|
||||
#include "BKE_curve.h"
|
||||
|
@ -410,6 +411,11 @@ int ED_object_modifier_copy(ReportList *reports, Object *ob, ModifierData *md)
|
|||
|
||||
/***************************** OPERATORS ****************************/
|
||||
|
||||
static int modifier_poll(bContext *C)
|
||||
{
|
||||
return (CTX_data_pointer_get_type(C, "modifier", &RNA_Modifier).data != NULL);
|
||||
}
|
||||
|
||||
/************************ add modifier operator *********************/
|
||||
|
||||
static int modifier_add_exec(bContext *C, wmOperator *op)
|
||||
|
@ -426,8 +432,46 @@ static int modifier_add_exec(bContext *C, wmOperator *op)
|
|||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
static EnumPropertyItem *modifier_add_itemf(bContext *C, PointerRNA *ptr, int *free)
|
||||
{
|
||||
EnumPropertyItem *item= NULL, *md_item;
|
||||
ModifierTypeInfo *mti;
|
||||
Object *ob;
|
||||
int totitem= 0, a;
|
||||
|
||||
if(!C) /* needed for docs */
|
||||
return modifier_type_items;
|
||||
|
||||
ob= CTX_data_active_object(C);
|
||||
|
||||
for(a=0; modifier_type_items[a].identifier; a++) {
|
||||
md_item= &modifier_type_items[a];
|
||||
|
||||
if(md_item->identifier[0]) {
|
||||
mti= modifierType_getInfo(md_item->value);
|
||||
|
||||
if(mti->flags & eModifierTypeFlag_NoUserAdd)
|
||||
continue;
|
||||
|
||||
if(!((mti->flags & eModifierTypeFlag_AcceptsCVs) ||
|
||||
(ob->type==OB_MESH && (mti->flags & eModifierTypeFlag_AcceptsMesh))))
|
||||
continue;
|
||||
}
|
||||
|
||||
RNA_enum_item_add(&item, &totitem, md_item);
|
||||
}
|
||||
|
||||
RNA_enum_item_end(&item, &totitem);
|
||||
|
||||
*free= 1;
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
void OBJECT_OT_modifier_add(wmOperatorType *ot)
|
||||
{
|
||||
PropertyRNA *prop;
|
||||
|
||||
/* identifiers */
|
||||
ot->name= "Add Modifier";
|
||||
ot->description = "Add a modifier to the active object.";
|
||||
|
@ -436,14 +480,14 @@ void OBJECT_OT_modifier_add(wmOperatorType *ot)
|
|||
/* api callbacks */
|
||||
ot->invoke= WM_menu_invoke;
|
||||
ot->exec= modifier_add_exec;
|
||||
|
||||
ot->poll= ED_operator_object_active;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
|
||||
/* XXX only some types should be here */
|
||||
RNA_def_enum(ot->srna, "type", modifier_type_items, 0, "Type", "");
|
||||
/* properties */
|
||||
prop= RNA_def_enum(ot->srna, "type", modifier_type_items, eModifierType_Subsurf, "Type", "");
|
||||
RNA_def_enum_funcs(prop, modifier_add_itemf);
|
||||
}
|
||||
|
||||
/************************ remove modifier operator *********************/
|
||||
|
@ -455,7 +499,7 @@ static int modifier_remove_exec(bContext *C, wmOperator *op)
|
|||
Object *ob= ptr.id.data;
|
||||
ModifierData *md= ptr.data;
|
||||
|
||||
if(!ob || !md || !ED_object_modifier_remove(op->reports, scene, ob, md))
|
||||
if(!ED_object_modifier_remove(op->reports, scene, ob, md))
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
|
||||
|
@ -471,6 +515,7 @@ void OBJECT_OT_modifier_remove(wmOperatorType *ot)
|
|||
ot->poll= ED_operator_object_active;
|
||||
|
||||
ot->exec= modifier_remove_exec;
|
||||
ot->poll= modifier_poll;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
|
@ -485,7 +530,7 @@ static int modifier_move_up_exec(bContext *C, wmOperator *op)
|
|||
Object *ob= ptr.id.data;
|
||||
ModifierData *md= ptr.data;
|
||||
|
||||
if(!ob || !md || !ED_object_modifier_move_up(op->reports, ob, md))
|
||||
if(!ED_object_modifier_move_up(op->reports, ob, md))
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
|
||||
|
@ -502,6 +547,7 @@ void OBJECT_OT_modifier_move_up(wmOperatorType *ot)
|
|||
ot->poll= ED_operator_object_active;
|
||||
|
||||
ot->exec= modifier_move_up_exec;
|
||||
ot->poll= modifier_poll;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
|
@ -533,6 +579,7 @@ void OBJECT_OT_modifier_move_down(wmOperatorType *ot)
|
|||
ot->poll= ED_operator_object_active;
|
||||
|
||||
ot->exec= modifier_move_down_exec;
|
||||
ot->poll= modifier_poll;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
|
@ -564,6 +611,7 @@ void OBJECT_OT_modifier_apply(wmOperatorType *ot)
|
|||
ot->poll= ED_operator_object_active;
|
||||
|
||||
ot->exec= modifier_apply_exec;
|
||||
ot->poll= modifier_poll;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
|
@ -595,6 +643,7 @@ void OBJECT_OT_modifier_convert(wmOperatorType *ot)
|
|||
ot->poll= ED_operator_object_active;
|
||||
|
||||
ot->exec= modifier_convert_exec;
|
||||
ot->poll= modifier_poll;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
|
@ -626,6 +675,7 @@ void OBJECT_OT_modifier_copy(wmOperatorType *ot)
|
|||
ot->poll= ED_operator_object_active;
|
||||
|
||||
ot->exec= modifier_copy_exec;
|
||||
ot->poll= modifier_poll;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
|
@ -639,17 +689,15 @@ static int multires_subdivide_exec(bContext *C, wmOperator *op)
|
|||
Object *ob= ptr.id.data;
|
||||
MultiresModifierData *mmd= ptr.data;
|
||||
|
||||
if(mmd) {
|
||||
multiresModifier_subdivide(mmd, ob, 1, 0, mmd->simple);
|
||||
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
|
||||
}
|
||||
multiresModifier_subdivide(mmd, ob, 1, 0, mmd->simple);
|
||||
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
static int multires_subdivide_poll(bContext *C)
|
||||
{
|
||||
return NULL != CTX_data_active_object(C) && NULL == CTX_data_edit_object(C);
|
||||
return (CTX_data_pointer_get_type(C, "modifier", &RNA_MultiresModifier).data != NULL);
|
||||
}
|
||||
|
||||
void OBJECT_OT_multires_subdivide(wmOperatorType *ot)
|
||||
|
@ -667,12 +715,12 @@ void OBJECT_OT_multires_subdivide(wmOperatorType *ot)
|
|||
|
||||
/************************ mdef bind operator *********************/
|
||||
|
||||
static int modifier_mdef_bind_poll(bContext *C)
|
||||
static int meshdeform_poll(bContext *C)
|
||||
{
|
||||
return CTX_data_pointer_get_type(C, "modifier", &RNA_MeshDeformModifier).data != NULL;
|
||||
}
|
||||
|
||||
static int modifier_mdef_bind_exec(bContext *C, wmOperator *op)
|
||||
static int meshdeform_bind_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
PointerRNA ptr= CTX_data_pointer_get(C, "modifier");
|
||||
|
@ -723,41 +771,22 @@ static int modifier_mdef_bind_exec(bContext *C, wmOperator *op)
|
|||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
void OBJECT_OT_modifier_mdef_bind(wmOperatorType *ot)
|
||||
void OBJECT_OT_meshdeform_bind(wmOperatorType *ot)
|
||||
{
|
||||
/* identifiers */
|
||||
ot->name= "Mesh Deform Bind";
|
||||
ot->description = "Bind mesh to cage in mesh deform modifier.";
|
||||
ot->idname= "OBJECT_OT_modifier_mdef_bind";
|
||||
ot->idname= "OBJECT_OT_meshdeform_bind";
|
||||
|
||||
/* api callbacks */
|
||||
ot->poll= modifier_mdef_bind_poll;
|
||||
ot->exec= modifier_mdef_bind_exec;
|
||||
ot->poll= meshdeform_poll;
|
||||
ot->exec= meshdeform_bind_exec;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void modifiers_add(void *ob_v, int type)
|
||||
{
|
||||
Object *ob = ob_v;
|
||||
ModifierTypeInfo *mti = modifierType_getInfo(type);
|
||||
|
||||
if (mti->flags&eModifierTypeFlag_RequiresOriginalData) {
|
||||
ModifierData *md = ob->modifiers.first;
|
||||
|
||||
while (md && modifierType_getInfo(md->type)->type==eModifierTypeType_OnlyDeform) {
|
||||
md = md->next;
|
||||
}
|
||||
|
||||
BLI_insertlinkbefore(&ob->modifiers, md, modifier_new(type));
|
||||
} else {
|
||||
BLI_addtail(&ob->modifiers, modifier_new(type));
|
||||
}
|
||||
ED_undo_push("Add modifier");
|
||||
}
|
||||
|
||||
typedef struct MenuEntry {
|
||||
char *name;
|
||||
int ID;
|
||||
|
@ -809,89 +838,176 @@ static uiBlock *modifiers_add_menu(void *ob_v)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
static void modifiers_clearHookOffset(bContext *C, void *ob_v, void *md_v)
|
||||
/******************** hook operators ************************/
|
||||
|
||||
static int hook_poll(bContext *C)
|
||||
{
|
||||
Object *ob = ob_v;
|
||||
ModifierData *md = md_v;
|
||||
HookModifierData *hmd = (HookModifierData*) md;
|
||||
|
||||
if (hmd->object) {
|
||||
return CTX_data_pointer_get_type(C, "modifier", &RNA_HookModifier).data != NULL;
|
||||
}
|
||||
|
||||
static int hook_reset_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_HookModifier);
|
||||
Object *ob= ptr.id.data;
|
||||
HookModifierData *hmd= ptr.data;
|
||||
|
||||
if(hmd->object) {
|
||||
Mat4Invert(hmd->object->imat, hmd->object->obmat);
|
||||
Mat4MulSerie(hmd->parentinv, hmd->object->imat, ob->obmat, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
ED_undo_push(C, "Clear hook offset");
|
||||
}
|
||||
}
|
||||
|
||||
static void modifiers_cursorHookCenter(bContext *C, void *ob_v, void *md_v)
|
||||
{
|
||||
/* XXX
|
||||
Object *ob = ob_v;
|
||||
ModifierData *md = md_v;
|
||||
HookModifierData *hmd = (HookModifierData*) md;
|
||||
|
||||
if(G.vd) {
|
||||
float *curs = give_cursor();
|
||||
float bmat[3][3], imat[3][3];
|
||||
|
||||
where_is_object(ob);
|
||||
DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
|
||||
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
|
||||
|
||||
Mat3CpyMat4(bmat, ob->obmat);
|
||||
Mat3Inv(imat, bmat);
|
||||
|
||||
curs= give_cursor();
|
||||
hmd->cent[0]= curs[0]-ob->obmat[3][0];
|
||||
hmd->cent[1]= curs[1]-ob->obmat[3][1];
|
||||
hmd->cent[2]= curs[2]-ob->obmat[3][2];
|
||||
Mat3MulVecfl(imat, hmd->cent);
|
||||
|
||||
ED_undo_push(C, "Hook cursor center");
|
||||
}*/
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
static void modifiers_selectHook(bContext *C, void *ob_v, void *md_v)
|
||||
void OBJECT_OT_hook_reset(wmOperatorType *ot)
|
||||
{
|
||||
/* XXX ModifierData *md = md_v;
|
||||
HookModifierData *hmd = (HookModifierData*) md;
|
||||
ot->name= "Hook Reset";
|
||||
ot->description= "Recalculate and and clear offset transformation.";
|
||||
ot->idname= "OBJECT_OT_hook_reset";
|
||||
|
||||
hook_select(hmd);*/
|
||||
ot->exec= hook_reset_exec;
|
||||
ot->poll= hook_poll;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
}
|
||||
|
||||
static void modifiers_reassignHook(bContext *C, void *ob_v, void *md_v)
|
||||
static int hook_recenter_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
/* XXX ModifierData *md = md_v;
|
||||
HookModifierData *hmd = (HookModifierData*) md;
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_HookModifier);
|
||||
Object *ob= ptr.id.data;
|
||||
HookModifierData *hmd= ptr.data;
|
||||
float bmat[3][3], imat[3][3];
|
||||
|
||||
Mat3CpyMat4(bmat, ob->obmat);
|
||||
Mat3Inv(imat, bmat);
|
||||
|
||||
VECSUB(hmd->cent, scene->cursor, ob->obmat[3]);
|
||||
Mat3MulVecfl(imat, hmd->cent);
|
||||
|
||||
DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
|
||||
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
void OBJECT_OT_hook_recenter(wmOperatorType *ot)
|
||||
{
|
||||
ot->name= "Hook Recenter";
|
||||
ot->description= "Set hook center to cursor position.";
|
||||
ot->idname= "OBJECT_OT_hook_recenter";
|
||||
|
||||
ot->exec= hook_recenter_exec;
|
||||
ot->poll= hook_poll;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
}
|
||||
|
||||
static int hook_select_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_HookModifier);
|
||||
Object *ob= ptr.id.data;
|
||||
HookModifierData *hmd= ptr.data;
|
||||
|
||||
object_hook_select(ob, hmd);
|
||||
|
||||
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, ob);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
void OBJECT_OT_hook_select(wmOperatorType *ot)
|
||||
{
|
||||
ot->name= "Hook Select";
|
||||
ot->description= "Selects effected vertices on mesh.";
|
||||
ot->idname= "OBJECT_OT_hook_select";
|
||||
|
||||
ot->exec= hook_select_exec;
|
||||
ot->poll= hook_poll;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
}
|
||||
|
||||
static int hook_assign_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_HookModifier);
|
||||
Object *ob= ptr.id.data;
|
||||
HookModifierData *hmd= ptr.data;
|
||||
float cent[3];
|
||||
int *indexar, tot, ok;
|
||||
char name[32];
|
||||
int *indexar, tot;
|
||||
|
||||
ok= hook_getIndexArray(&tot, &indexar, name, cent);
|
||||
if(!object_hook_index_array(ob, &tot, &indexar, name, cent)) {
|
||||
BKE_report(op->reports, RPT_WARNING, "Requires selected vertices or active vertex group");
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
if (!ok) {
|
||||
uiPupMenuError(C, "Requires selected vertices or active Vertex Group");
|
||||
} else {
|
||||
if (hmd->indexar) {
|
||||
MEM_freeN(hmd->indexar);
|
||||
}
|
||||
if(hmd->indexar)
|
||||
MEM_freeN(hmd->indexar);
|
||||
|
||||
VECCOPY(hmd->cent, cent);
|
||||
hmd->indexar = indexar;
|
||||
hmd->totindex = tot;
|
||||
}*/
|
||||
VECCOPY(hmd->cent, cent);
|
||||
hmd->indexar= indexar;
|
||||
hmd->totindex= tot;
|
||||
|
||||
DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
|
||||
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
void modifiers_explodeFacepa(bContext *C, void *arg1, void *arg2)
|
||||
void OBJECT_OT_hook_assign(wmOperatorType *ot)
|
||||
{
|
||||
ExplodeModifierData *emd=arg1;
|
||||
ot->name= "Hook Assign";
|
||||
ot->description= "Reassigns selected vertices to hook.";
|
||||
ot->idname= "OBJECT_OT_hook_assign";
|
||||
|
||||
ot->exec= hook_assign_exec;
|
||||
ot->poll= hook_poll;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
}
|
||||
|
||||
/****************** explode refresh operator *********************/
|
||||
|
||||
static int explode_refresh_poll(bContext *C)
|
||||
{
|
||||
return CTX_data_pointer_get_type(C, "modifier", &RNA_ExplodeModifier).data != NULL;
|
||||
}
|
||||
|
||||
static int explode_refresh_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_ExplodeModifier);
|
||||
Object *ob= ptr.id.data;
|
||||
ExplodeModifierData *emd= ptr.data;
|
||||
|
||||
emd->flag |= eExplodeFlag_CalcFaces;
|
||||
|
||||
DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
|
||||
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
void modifiers_explodeDelVg(bContext *C, void *arg1, void *arg2)
|
||||
void OBJECT_OT_explode_refresh(wmOperatorType *ot)
|
||||
{
|
||||
ExplodeModifierData *emd=arg1;
|
||||
emd->vgroup = 0;
|
||||
ot->name= "Explode Refresh";
|
||||
ot->description= "Refresh data in the Explode modifier.";
|
||||
ot->idname= "OBJECT_OT_explode_refresh";
|
||||
|
||||
ot->exec= explode_refresh_exec;
|
||||
ot->poll= explode_refresh_poll;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -118,7 +118,12 @@ void ED_operatortypes_object(void)
|
|||
WM_operatortype_append(OBJECT_OT_modifier_convert);
|
||||
WM_operatortype_append(OBJECT_OT_modifier_copy);
|
||||
WM_operatortype_append(OBJECT_OT_multires_subdivide);
|
||||
WM_operatortype_append(OBJECT_OT_modifier_mdef_bind);
|
||||
WM_operatortype_append(OBJECT_OT_meshdeform_bind);
|
||||
WM_operatortype_append(OBJECT_OT_hook_reset);
|
||||
WM_operatortype_append(OBJECT_OT_hook_recenter);
|
||||
WM_operatortype_append(OBJECT_OT_hook_select);
|
||||
WM_operatortype_append(OBJECT_OT_hook_assign);
|
||||
WM_operatortype_append(OBJECT_OT_explode_refresh);
|
||||
|
||||
WM_operatortype_append(OBJECT_OT_constraint_add);
|
||||
WM_operatortype_append(OBJECT_OT_constraint_add_with_targets);
|
||||
|
|
|
@ -1044,7 +1044,6 @@ static char *windowtype_pup(void)
|
|||
"Window type:%t"
|
||||
"|3D View %x1"
|
||||
|
||||
"|%l"
|
||||
"|%l"
|
||||
|
||||
"|Timeline %x15"
|
||||
|
@ -1052,7 +1051,6 @@ static char *windowtype_pup(void)
|
|||
"|DopeSheet %x12"
|
||||
"|NLA Editor %x13"
|
||||
|
||||
"|%l"
|
||||
"|%l"
|
||||
|
||||
"|UV/Image Editor %x6"
|
||||
|
@ -1062,7 +1060,6 @@ static char *windowtype_pup(void)
|
|||
"|Node Editor %x16"
|
||||
"|Logic Editor %x17"
|
||||
|
||||
"|%l"
|
||||
"|%l"
|
||||
|
||||
"|Properties %x4"
|
||||
|
@ -1070,12 +1067,10 @@ static char *windowtype_pup(void)
|
|||
"|User Preferences %x19"
|
||||
"|Info%x7"
|
||||
|
||||
"|%l"
|
||||
"|%l"
|
||||
|
||||
"|File Browser %x5"
|
||||
|
||||
"|%l"
|
||||
"|%l"
|
||||
|
||||
"|Console %x18"
|
||||
|
|
|
@ -3442,10 +3442,5 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
|
|||
|
||||
}
|
||||
}
|
||||
|
||||
/* do not do view2d totrect set here, it's now a template */
|
||||
|
||||
uiEndBlock(C, block);
|
||||
uiDrawBlock(C, block);
|
||||
}
|
||||
|
||||
|
|
|
@ -318,7 +318,7 @@ typedef struct UVProjectModifierData {
|
|||
ModifierData modifier;
|
||||
|
||||
/* the objects which do the projecting */
|
||||
struct Object *projectors[10];
|
||||
struct Object *projectors[10]; /* MOD_UVPROJECT_MAX */
|
||||
struct Image *image; /* the image to project */
|
||||
int flags;
|
||||
int num_projectors;
|
||||
|
@ -669,4 +669,6 @@ typedef struct SimpleDeformModifierData {
|
|||
coordinates or global coordinates of origin */
|
||||
#define MOD_SIMPLEDEFORM_ORIGIN_LOCAL (1<<0)
|
||||
|
||||
#define MOD_UVPROJECT_MAX 10
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1173,8 +1173,14 @@ void RNA_def_property_enum_items(PropertyRNA *prop, const EnumPropertyItem *item
|
|||
defaultfound= 1;
|
||||
}
|
||||
|
||||
if(!defaultfound)
|
||||
eprop->defaultvalue= item[0].value;
|
||||
if(!defaultfound) {
|
||||
for(i=0; item[i].identifier; i++) {
|
||||
if(item[i].identifier[0]) {
|
||||
eprop->defaultvalue= item[i].value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -43,41 +43,43 @@
|
|||
#include "WM_types.h"
|
||||
|
||||
EnumPropertyItem modifier_type_items[] ={
|
||||
{eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""},
|
||||
{0, "", 0, "Generate", ""},
|
||||
{eModifierType_Array, "ARRAY", ICON_MOD_ARRAY, "Array", ""},
|
||||
{eModifierType_Bevel, "BEVEL", ICON_MOD_BEVEL, "Bevel", ""},
|
||||
{eModifierType_Boolean, "BOOLEAN", ICON_MOD_BOOLEAN, "Boolean", ""},
|
||||
{eModifierType_Build, "BUILD", ICON_MOD_BUILD, "Build", ""},
|
||||
{eModifierType_Cast, "CAST", ICON_MOD_CAST, "Cast", ""},
|
||||
{eModifierType_Cloth, "CLOTH", ICON_MOD_CLOTH, "Cloth", ""},
|
||||
{eModifierType_Collision, "COLLISION", ICON_MOD_PHYSICS, "Collision", ""},
|
||||
{eModifierType_Curve, "CURVE", ICON_MOD_CURVE, "Curve", ""},
|
||||
{eModifierType_Decimate, "DECIMATE", ICON_MOD_DECIM, "Decimate", ""},
|
||||
{eModifierType_Displace, "DISPLACE", ICON_MOD_DISPLACE, "Displace", ""},
|
||||
{eModifierType_EdgeSplit, "EDGE_SPLIT", ICON_MOD_EDGESPLIT, "Edge Split", ""},
|
||||
{eModifierType_Explode, "EXPLODE", ICON_MOD_EXPLODE, "Explode", ""},
|
||||
{eModifierType_Fluidsim, "FLUID_SIMULATION", ICON_MOD_FLUIDSIM, "Fluid Simulation", ""},
|
||||
{eModifierType_Hook, "HOOK", ICON_HOOK, "Hook", ""},
|
||||
{eModifierType_Lattice, "LATTICE", ICON_MOD_LATTICE, "Lattice", ""},
|
||||
{eModifierType_Mask, "MASK", ICON_MOD_MASK, "Mask", ""},
|
||||
{eModifierType_MeshDeform, "MESH_DEFORM", ICON_MOD_MESHDEFORM, "Mesh Deform", ""},
|
||||
{eModifierType_Mirror, "MIRROR", ICON_MOD_MIRROR, "Mirror", ""},
|
||||
{eModifierType_Multires, "MULTIRES", ICON_MOD_MULTIRES, "Multiresolution", ""},
|
||||
{eModifierType_ParticleInstance, "PARTICLE_INSTANCE", ICON_MOD_PARTICLES, "Particle Instance", ""},
|
||||
{eModifierType_ParticleSystem, "PARTICLE_SYSTEM", ICON_MOD_PARTICLES, "Particle System", ""},
|
||||
{eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""},
|
||||
{eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""},
|
||||
{0, "", 0, "Deformers", ""},
|
||||
{eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""},
|
||||
{eModifierType_Cast, "CAST", ICON_MOD_CAST, "Cast", ""},
|
||||
{eModifierType_Curve, "CURVE", ICON_MOD_CURVE, "Curve", ""},
|
||||
{eModifierType_Displace, "DISPLACE", ICON_MOD_DISPLACE, "Displace", ""},
|
||||
{eModifierType_Hook, "HOOK", ICON_HOOK, "Hook", ""},
|
||||
{eModifierType_Lattice, "LATTICE", ICON_MOD_LATTICE, "Lattice", ""},
|
||||
{eModifierType_MeshDeform, "MESH_DEFORM", ICON_MOD_MESHDEFORM, "Mesh Deform", ""},
|
||||
{eModifierType_Shrinkwrap, "SHRINKWRAP", ICON_MOD_SHRINKWRAP, "Shrinkwrap", ""},
|
||||
{eModifierType_SimpleDeform, "SIMPLE_DEFORM", ICON_MOD_SIMPLEDEFORM, "Simple Deform", ""},
|
||||
{eModifierType_Smooth, "SMOOTH", ICON_MOD_SMOOTH, "Smooth", ""},
|
||||
{eModifierType_Wave, "WAVE", ICON_MOD_WAVE, "Wave", ""},
|
||||
{0, "", 0, "Physics", ""},
|
||||
{eModifierType_Cloth, "CLOTH", ICON_MOD_CLOTH, "Cloth", ""},
|
||||
{eModifierType_Collision, "COLLISION", ICON_MOD_PHYSICS, "Collision", ""},
|
||||
{eModifierType_Explode, "EXPLODE", ICON_MOD_EXPLODE, "Explode", ""},
|
||||
{eModifierType_Fluidsim, "FLUID_SIMULATION", ICON_MOD_FLUIDSIM, "Fluid Simulation", ""},
|
||||
{eModifierType_ParticleInstance, "PARTICLE_INSTANCE", ICON_MOD_PARTICLES, "Particle Instance", ""},
|
||||
{eModifierType_ParticleSystem, "PARTICLE_SYSTEM", ICON_MOD_PARTICLES, "Particle System", ""},
|
||||
{eModifierType_Smoke, "SMOKE", 0, "Smoke", ""},
|
||||
{eModifierType_SmokeHR, "SMOKE_HR", 0, "SmokeHR", ""},
|
||||
{eModifierType_Smooth, "SMOOTH", ICON_MOD_SMOOTH, "Smooth", ""},
|
||||
{eModifierType_Softbody, "SOFT_BODY", ICON_MOD_SOFT, "Soft Body", ""},
|
||||
{eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""},
|
||||
{eModifierType_Surface, "SURFACE", ICON_MOD_PHYSICS, "Surface", ""},
|
||||
{eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""},
|
||||
{eModifierType_Wave, "WAVE", ICON_MOD_WAVE, "Wave", ""},
|
||||
{0, NULL, 0, NULL, NULL}};
|
||||
|
||||
|
||||
#ifdef RNA_RUNTIME
|
||||
|
||||
#include "BKE_context.h"
|
||||
|
@ -87,7 +89,7 @@ EnumPropertyItem modifier_type_items[] ={
|
|||
static void rna_UVProject_projectors_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
|
||||
{
|
||||
UVProjectModifierData *uvp= (UVProjectModifierData*)ptr->data;
|
||||
rna_iterator_array_begin(iter, (void*)uvp->projectors, sizeof(Object*), 10, 0, NULL);
|
||||
rna_iterator_array_begin(iter, (void*)uvp->projectors, sizeof(Object*), uvp->num_projectors, 0, NULL);
|
||||
}
|
||||
|
||||
static StructRNA* rna_Modifier_refine(struct PointerRNA *ptr)
|
||||
|
@ -410,6 +412,34 @@ static PointerRNA rna_CollisionModifier_settings_get(PointerRNA *ptr)
|
|||
return rna_pointer_inherit_refine(ptr, &RNA_CollisionSettings, ob->pd);
|
||||
}
|
||||
|
||||
static PointerRNA rna_UVProjector_object_get(PointerRNA *ptr)
|
||||
{
|
||||
Object **ob= (Object**)ptr->data;
|
||||
return rna_pointer_inherit_refine(ptr, &RNA_Object, *ob);
|
||||
}
|
||||
|
||||
static void rna_UVProjector_object_set(PointerRNA *ptr, PointerRNA value)
|
||||
{
|
||||
Object **ob= (Object**)ptr->data;
|
||||
|
||||
if(*ob)
|
||||
id_us_min((ID*)*ob);
|
||||
if(value.data)
|
||||
id_us_plus((ID*)value.data);
|
||||
|
||||
*ob= value.data;
|
||||
}
|
||||
|
||||
static void rna_UVProjectModifier_num_projectors_set(PointerRNA *ptr, int value)
|
||||
{
|
||||
UVProjectModifierData *md= (UVProjectModifierData*)ptr->data;
|
||||
int a;
|
||||
|
||||
md->num_projectors= CLAMPIS(value, 1, MOD_UVPROJECT_MAX);
|
||||
for(a=md->num_projectors; a<MOD_UVPROJECT_MAX; a++)
|
||||
md->projectors[a]= NULL;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void rna_def_property_subdivision_common(StructRNA *srna, const char type[])
|
||||
|
@ -1150,7 +1180,7 @@ static void rna_def_modifier_uvproject(BlenderRNA *brna)
|
|||
PropertyRNA *prop;
|
||||
|
||||
srna= RNA_def_struct(brna, "UVProjectModifier", "Modifier");
|
||||
RNA_def_struct_ui_text(srna, "UVProject Modifier", "UV projection modifier to sets UVs from a projector.");
|
||||
RNA_def_struct_ui_text(srna, "UV Project Modifier", "UV projection modifier to sets UVs from a projector.");
|
||||
RNA_def_struct_sdna(srna, "UVProjectModifierData");
|
||||
RNA_def_struct_ui_icon(srna, ICON_MOD_UVPROJECT);
|
||||
|
||||
|
@ -1160,9 +1190,15 @@ static void rna_def_modifier_uvproject(BlenderRNA *brna)
|
|||
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_UVProjectModifier_uvlayer_set");
|
||||
RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
|
||||
|
||||
prop= RNA_def_property(srna, "num_projectors", PROP_INT, PROP_NONE);
|
||||
RNA_def_property_ui_text(prop, "Number of Projectors", "Number of projectors to use.");
|
||||
RNA_def_property_int_funcs(prop, NULL, "rna_UVProjectModifier_num_projectors_set", NULL);
|
||||
RNA_def_property_range(prop, 1, MOD_UVPROJECT_MAX);
|
||||
RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
|
||||
|
||||
prop= RNA_def_property(srna, "projectors", PROP_COLLECTION, PROP_NONE);
|
||||
RNA_def_property_struct_type(prop, "Object");
|
||||
RNA_def_property_collection_funcs(prop, "rna_UVProject_projectors_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_dereference_get", 0, 0, 0, 0, 0);
|
||||
RNA_def_property_struct_type(prop, "UVProjector");
|
||||
RNA_def_property_collection_funcs(prop, "rna_UVProject_projectors_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_get", 0, 0, 0, 0, 0);
|
||||
RNA_def_property_ui_text(prop, "Projectors", "");
|
||||
|
||||
prop= RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);
|
||||
|
@ -1188,6 +1224,15 @@ static void rna_def_modifier_uvproject(BlenderRNA *brna)
|
|||
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_UVPROJECT_OVERRIDEIMAGE);
|
||||
RNA_def_property_ui_text(prop, "Override Image", "Override faces' current images with the given image.");
|
||||
RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
|
||||
|
||||
srna= RNA_def_struct(brna, "UVProjector", NULL);
|
||||
RNA_def_struct_ui_text(srna, "UVProjector", "UV projector used by the UV project modifier.");
|
||||
|
||||
prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
|
||||
RNA_def_property_struct_type(prop, "Object");
|
||||
RNA_def_property_pointer_funcs(prop, "rna_UVProjector_object_get", "rna_UVProjector_object_set", NULL);
|
||||
RNA_def_property_flag(prop, PROP_EDITABLE);
|
||||
RNA_def_property_ui_text(prop, "Object", "Object to use as projector transform.");
|
||||
}
|
||||
|
||||
static void rna_def_modifier_smooth(BlenderRNA *brna)
|
||||
|
|
|
@ -1144,27 +1144,28 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
|
|||
|
||||
|
||||
static EnumPropertyItem image_type_items[] = {
|
||||
{0, "", 0, "Image", NULL},
|
||||
{R_PNG, "PNG", 0, "PNG", ""},
|
||||
{R_JPEG90, "JPEG", 0, "JPEG", ""},
|
||||
#ifdef WITH_OPENJPEG
|
||||
{R_JP2, "JPEG2000", 0, "JPEG 2000", ""},
|
||||
#endif
|
||||
{R_TIFF, "TIFF", 0, "TIFF", ""}, // XXX only with G.have_libtiff
|
||||
{R_BMP, "BMP", 0, "BMP", ""},
|
||||
{R_TARGA, "TARGA", 0, "Targa", ""},
|
||||
{R_RAWTGA, "RAWTARGA", 0, "Targa Raw", ""},
|
||||
//{R_DDS, "DDS", 0, "DDS", ""}, // XXX not yet implemented
|
||||
{R_HAMX, "HAMX", 0, "HamX", ""},
|
||||
{R_IRIS, "IRIS", 0, "Iris", ""},
|
||||
{0, "", 0, NULL, NULL},
|
||||
{0, "", 0, " ", NULL},
|
||||
#ifdef WITH_OPENEXR
|
||||
{R_OPENEXR, "OPENEXR", 0, "OpenEXR", ""},
|
||||
{R_MULTILAYER, "MULTILAYER", 0, "MultiLayer", ""},
|
||||
#endif
|
||||
{R_TIFF, "TIFF", 0, "TIFF", ""}, // XXX only with G.have_libtiff
|
||||
{R_RADHDR, "RADHDR", 0, "Radiance HDR", ""},
|
||||
{R_CINEON, "CINEON", 0, "Cineon", ""},
|
||||
{R_DPX, "DPX", 0, "DPX", ""},
|
||||
{0, "", 0, NULL, NULL},
|
||||
{0, "", 0, "Movie", NULL},
|
||||
{R_AVIRAW, "AVIRAW", 0, "AVI Raw", ""},
|
||||
{R_AVIJPEG, "AVIJPEG", 0, "AVI JPEG", ""},
|
||||
#ifdef _WIN32
|
||||
|
@ -1187,7 +1188,6 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
|
|||
#endif
|
||||
{R_FFMPEG, "FFMPEG", 0, "FFMpeg", ""},
|
||||
#endif
|
||||
{0, "", 0, NULL, NULL},
|
||||
{R_FRAMESERVER, "FRAMESERVER", 0, "Frame Server", ""},
|
||||
{0, NULL, 0, NULL, NULL}};
|
||||
|
||||
|
|
|
@ -741,7 +741,6 @@ static void WM_OT_window_duplicate(wmOperatorType *ot)
|
|||
ot->name= "Duplicate Window";
|
||||
ot->idname= "WM_OT_window_duplicate";
|
||||
|
||||
ot->invoke= WM_operator_confirm;
|
||||
ot->exec= wm_window_duplicate_op;
|
||||
ot->poll= WM_operator_winactive;
|
||||
}
|
||||
|
@ -1035,7 +1034,6 @@ static void WM_OT_window_fullscreen_toggle(wmOperatorType *ot)
|
|||
ot->name= "Toggle Fullscreen";
|
||||
ot->idname= "WM_OT_window_fullscreen_toggle";
|
||||
|
||||
ot->invoke= WM_operator_confirm;
|
||||
ot->exec= wm_window_fullscreen_toggle_op;
|
||||
ot->poll= WM_operator_winactive;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue