diff options
Diffstat (limited to 'source/blender/editors/space_view3d/space_view3d.c')
-rw-r--r-- | source/blender/editors/space_view3d/space_view3d.c | 184 |
1 files changed, 180 insertions, 4 deletions
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index 5d65cccb213..bfce6e927a6 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -32,9 +32,13 @@ #include <string.h> #include <stdio.h> +#include "DNA_armature_types.h" #include "DNA_material_types.h" +#include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" +#include "DNA_camera_types.h" +#include "DNA_key_types.h" #include "MEM_guardedalloc.h" @@ -42,17 +46,22 @@ #include "BLI_math.h" #include "BLI_utildefines.h" +#include "BKE_action.h" #include "BKE_context.h" #include "BKE_depsgraph.h" #include "BKE_icons.h" +#include "BKE_key.h" #include "BKE_library.h" #include "BKE_main.h" +#include "BKE_modifier.h" #include "BKE_object.h" #include "BKE_scene.h" #include "BKE_screen.h" #include "ED_space_api.h" #include "ED_screen.h" +#include "ED_transform.h" +#include "ED_view3d.h" #include "GPU_extensions.h" #include "GPU_material.h" @@ -69,6 +78,7 @@ #include "RNA_access.h" #include "UI_resources.h" +#include "UI_interface.h" #ifdef WITH_PYTHON # include "BPY_extern.h" @@ -391,12 +401,13 @@ static SpaceLink *view3d_new(const bContext *C) ar->regiontype = RGN_TYPE_WINDOW; ar->regiondata = MEM_callocN(sizeof(RegionView3D), "region view3d"); + rv3d = ar->regiondata; rv3d->viewquat[0] = 1.0f; rv3d->persp = RV3D_PERSP; rv3d->view = RV3D_VIEW_PERSPORTHO; rv3d->dist = 10.0; - + return (SpaceLink *)v3d; } @@ -437,8 +448,7 @@ static void view3d_free(SpaceLink *sl) /* spacetype; init callback */ static void view3d_init(wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa)) -{ - +{ } static SpaceLink *view3d_duplicate(SpaceLink *sl) @@ -473,6 +483,7 @@ static SpaceLink *view3d_duplicate(SpaceLink *sl) } v3dn->properties_storage = NULL; + if (v3dn->fx_settings.dof) v3dn->fx_settings.dof = MEM_dupallocN(v3do->fx_settings.dof); if (v3dn->fx_settings.ssao) @@ -487,6 +498,12 @@ static void view3d_main_area_init(wmWindowManager *wm, ARegion *ar) ListBase *lb; wmKeyMap *keymap; + if (BLI_listbase_is_empty(&ar->widgetmaps)) { + BLI_addhead(&ar->widgetmaps, WM_widgetmap_from_type("View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW, true)); + } + + WM_event_add_area_widgetmap_handlers(ar); + /* object ops. */ /* important to be before Pose keymap since they can both be enabled at once */ @@ -543,6 +560,9 @@ static void view3d_main_area_init(wmWindowManager *wm, ARegion *ar) keymap = WM_keymap_find(wm->defaultconf, "Particle", 0, 0); WM_event_add_keymap_handler(&ar->handlers, keymap); + keymap = WM_keymap_find(wm->defaultconf, "Hair", 0, 0); + WM_event_add_keymap_handler(&ar->handlers, keymap); + /* editfont keymap swallows all... */ keymap = WM_keymap_find(wm->defaultconf, "Font", 0, 0); WM_event_add_keymap_handler(&ar->handlers, keymap); @@ -564,7 +584,6 @@ static void view3d_main_area_init(wmWindowManager *wm, ARegion *ar) lb = WM_dropboxmap_find("View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW); WM_event_add_dropbox_handler(&ar->handlers, lb); - } static void view3d_main_area_exit(wmWindowManager *wm, ARegion *ar) @@ -713,6 +732,162 @@ static void view3d_dropboxes(void) } +static int WIDGETGROUP_camera_poll(const struct bContext *C, struct wmWidgetGroupType *UNUSED(wgrouptype)) +{ + Object *ob = CTX_data_active_object(C); + + if (ob && ob->type == OB_CAMERA) { + Camera *ca = ob->data; + return (ca->flag & CAM_SHOWLIMITS) != 0; + } + return false; +} + +static void WIDGETGROUP_camera_draw(const struct bContext *C, struct wmWidgetGroup *wgroup) +{ + float color_camera[4] = {1.0f, 0.3f, 0.0f, 1.0f}; + Object *ob = CTX_data_active_object(C); + Camera *ca = ob->data; + wmWidget *widget; + PointerRNA cameraptr; + float dir[3]; + + widget = WIDGET_arrow_new(wgroup, WIDGET_ARROW_STYLE_CROSS); + WM_widget_set_draw_on_hover_only(widget, true); + WM_widget_set_3d_scale(widget, false); + WIDGET_arrow_set_color(widget, color_camera); + + RNA_pointer_create(&ca->id, &RNA_Camera, ca, &cameraptr); + WM_widget_set_origin(widget, ob->obmat[3]); + WM_widget_property(widget, ARROW_SLOT_OFFSET_WORLD_SPACE, &cameraptr, "dof_distance"); + negate_v3_v3(dir, ob->obmat[2]); + WIDGET_arrow_set_direction(widget, dir); + WIDGET_arrow_set_up_vector(widget, ob->obmat[1]); + WM_widget_set_scale(widget, ca->drawsize); +} + +#if 0 +static int WIDGETGROUP_shapekey_poll(const struct bContext *C, struct wmWidgetGroupType *UNUSED(wgrouptype)) +{ + Object *ob = CTX_data_active_object(C); + + if (ob && ob->type == OB_MESH) { + Key *key = BKE_key_from_object(ob); + KeyBlock *kb; + + if (key == NULL) + return false; + + kb = BLI_findlink(&key->block, ob->shapenr - 1); + + if (kb) + return true; + } + return false; +} + +static void WIDGETGROUP_shapekey_draw(const struct bContext *C, struct wmWidgetGroup *wgroup) +{ + float color_shape[4] = {1.0f, 0.3f, 0.0f, 1.0f}; + Object *ob = CTX_data_active_object(C); + Key *key = BKE_key_from_object(ob); + KeyBlock *kb = BLI_findlink(&key->block, ob->shapenr - 1); + wmWidget *widget; + PointerRNA shapeptr; + float dir[3]; + + widget = WIDGET_arrow_new(wgroup, WIDGET_ARROW_STYLE_NORMAL); + WM_widget_set_3d_scale(widget, false); + WIDGET_arrow_set_color(widget, color_shape); + RNA_pointer_create(&key->id, &RNA_ShapeKey, kb, &shapeptr); + WM_widget_set_origin(widget, ob->obmat[3]); + WM_widget_property(widget, ARROW_SLOT_OFFSET_WORLD_SPACE, &shapeptr, "value"); + negate_v3_v3(dir, ob->obmat[2]); + WIDGET_arrow_set_direction(widget, dir); +} +#endif + +static int WIDGETGROUP_armature_facemap_poll(const struct bContext *C, struct wmWidgetGroupType *UNUSED(wgrouptype)) +{ + Object *ob = CTX_data_active_object(C); + + if (ob && ob->type == OB_MESH && ob->fmaps.first) { + ModifierData *md; + VirtualModifierData virtualModifierData; + + md = modifiers_getVirtualModifierList(ob, &virtualModifierData); + + /* exception for shape keys because we can edit those */ + for (; md; md = md->next) { + if (modifier_isEnabled(CTX_data_scene(C), md, eModifierMode_Realtime) && md->type == eModifierType_Armature) { + ArmatureModifierData *amd = (ArmatureModifierData *) md; + if (amd->object && (amd->deformflag & ARM_DEF_FACEMAPS)) + return true; + } + } + } + return false; +} + +static void WIDGETGROUP_armature_facemap_draw(const struct bContext *C, struct wmWidgetGroup *wgroup) +{ + float color_shape[4] = {1.0f, 0.3f, 0.0f, 1.0f}; + Object *ob = CTX_data_active_object(C); + wmWidget *widget; + Object *armature; + PointerRNA famapptr; + PropertyRNA *prop; + ModifierData *md; + VirtualModifierData virtualModifierData; + int index = 0; + bFaceMap *fmap = ob->fmaps.first; + + md = modifiers_getVirtualModifierList(ob, &virtualModifierData); + + /* exception for shape keys because we can edit those */ + for (; md; md = md->next) { + if (modifier_isEnabled(CTX_data_scene(C), md, eModifierMode_Realtime) && md->type == eModifierType_Armature) { + ArmatureModifierData *amd = (ArmatureModifierData *) md; + if (amd->object && (amd->deformflag & ARM_DEF_FACEMAPS)) { + armature = amd->object; + break; + } + } + } + + + for (; fmap; fmap = fmap->next, index++) { + if (BKE_pose_channel_find_name(armature->pose, fmap->name)) { + PointerRNA *opptr; + widget = WIDGET_facemap_new(wgroup, 0, ob, index); + RNA_pointer_create(&ob->id, &RNA_FaceMap, fmap, &famapptr); + WM_widget_property(widget, FACEMAP_SLOT_FACEMAP, &famapptr, "name"); + opptr = WM_widget_operator(widget, "TRANSFORM_OT_translate"); + if ((prop = RNA_struct_find_property(opptr, "release_confirm"))) { + RNA_property_boolean_set(opptr, prop, true); + } + WIDGET_facemap_set_color(widget, color_shape); + WM_widget_set_draw_on_hover_only(widget, true); + } + } +} + + +static void view3d_widgets(void) +{ + WM_widgetmaptype_find("View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW, true, true); + + WM_widgetgrouptype_new(WIDGETGROUP_lamp_poll, WIDGETGROUP_lamp_draw, NULL, "View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW, true); + WM_widgetgrouptype_new(WIDGETGROUP_camera_poll, WIDGETGROUP_camera_draw, NULL, "View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW, true); + WM_widgetgrouptype_new(WIDGETGROUP_armature_facemap_poll, WIDGETGROUP_armature_facemap_draw, NULL, "View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW, true); + +#if 0 + wgroup_manipulator = WM_widgetgrouptype_new( + WIDGETGROUP_manipulator_poll, + WIDGETGROUP_manipulator_update); +#endif +} + /* type callback, not region itself */ static void view3d_main_area_free(ARegion *ar) @@ -1416,6 +1591,7 @@ void ED_spacetype_view3d(void) st->operatortypes = view3d_operatortypes; st->keymap = view3d_keymap; st->dropboxes = view3d_dropboxes; + st->widgets = view3d_widgets; st->context = view3d_context; /* regions: main window */ |