diff options
Diffstat (limited to 'source/blender/editors/space_view3d/space_view3d.c')
-rw-r--r-- | source/blender/editors/space_view3d/space_view3d.c | 100 |
1 files changed, 81 insertions, 19 deletions
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index b3accb431ee..35fb2bce115 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -56,6 +56,7 @@ #include "GPU_extensions.h" #include "GPU_material.h" +#include "GPU_compositing.h" #include "BIF_gl.h" @@ -414,10 +415,15 @@ static void view3d_free(SpaceLink *sl) /* matcap material, its preview rect gets freed via icons */ if (vd->defmaterial) { if (vd->defmaterial->gpumaterial.first) - GPU_material_free(vd->defmaterial); + GPU_material_free(&vd->defmaterial->gpumaterial); BKE_previewimg_free(&vd->defmaterial->preview); MEM_freeN(vd->defmaterial); } + + if (vd->fx_settings.ssao) + MEM_freeN(vd->fx_settings.ssao); + if (vd->fx_settings.dof) + MEM_freeN(vd->fx_settings.dof); } @@ -459,7 +465,11 @@ 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) + v3dn->fx_settings.ssao = MEM_dupallocN(v3do->fx_settings.ssao); + return (SpaceLink *)v3dn; } @@ -559,12 +569,17 @@ static void view3d_main_area_exit(wmWindowManager *wm, ARegion *ar) GPU_offscreen_free(rv3d->gpuoffscreen); rv3d->gpuoffscreen = NULL; } + + if (rv3d->compositor) { + GPU_fx_compositor_destroy(rv3d->compositor); + rv3d->compositor = NULL; + } } static int view3d_ob_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *UNUSED(event)) { if (drag->type == WM_DRAG_ID) { - ID *id = (ID *)drag->poin; + ID *id = drag->poin; if (GS(id->name) == ID_OB) return 1; } @@ -574,7 +589,7 @@ static int view3d_ob_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent static int view3d_group_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *UNUSED(event)) { if (drag->type == WM_DRAG_ID) { - ID *id = (ID *)drag->poin; + ID *id = drag->poin; if (GS(id->name) == ID_GR) return 1; } @@ -584,7 +599,7 @@ static int view3d_group_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEve static int view3d_mat_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *UNUSED(event)) { if (drag->type == WM_DRAG_ID) { - ID *id = (ID *)drag->poin; + ID *id = drag->poin; if (GS(id->name) == ID_MA) return 1; } @@ -594,12 +609,12 @@ static int view3d_mat_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent static int view3d_ima_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *UNUSED(event)) { if (drag->type == WM_DRAG_ID) { - ID *id = (ID *)drag->poin; + ID *id = drag->poin; if (GS(id->name) == ID_IM) return 1; } else if (drag->type == WM_DRAG_PATH) { - if (ELEM(drag->icon, 0, ICON_FILE_IMAGE)) /* rule might not work? */ + if (ELEM(drag->icon, 0, ICON_FILE_IMAGE, ICON_FILE_MOVIE)) /* rule might not work? */ return 1; } return 0; @@ -641,14 +656,14 @@ static int view3d_ima_mesh_drop_poll(bContext *C, wmDrag *drag, const wmEvent *e static void view3d_ob_drop_copy(wmDrag *drag, wmDropBox *drop) { - ID *id = (ID *)drag->poin; + ID *id = drag->poin; RNA_string_set(drop->ptr, "name", id->name + 2); } static void view3d_group_drop_copy(wmDrag *drag, wmDropBox *drop) { - ID *id = (ID *)drag->poin; + ID *id = drag->poin; drop->opcontext = WM_OP_EXEC_DEFAULT; RNA_string_set(drop->ptr, "name", id->name + 2); @@ -656,19 +671,23 @@ static void view3d_group_drop_copy(wmDrag *drag, wmDropBox *drop) static void view3d_id_drop_copy(wmDrag *drag, wmDropBox *drop) { - ID *id = (ID *)drag->poin; + ID *id = drag->poin; RNA_string_set(drop->ptr, "name", id->name + 2); } static void view3d_id_path_drop_copy(wmDrag *drag, wmDropBox *drop) { - ID *id = (ID *)drag->poin; + ID *id = drag->poin; - if (id) + if (id) { RNA_string_set(drop->ptr, "name", id->name + 2); - if (drag->path[0]) + RNA_struct_property_unset(drop->ptr, "filepath"); + } + else if (drag->path[0]) { RNA_string_set(drop->ptr, "filepath", drag->path); + RNA_struct_property_unset(drop->ptr, "image"); + } } @@ -709,6 +728,9 @@ static void view3d_main_area_free(ARegion *ar) if (rv3d->gpuoffscreen) { GPU_offscreen_free(rv3d->gpuoffscreen); } + if (rv3d->compositor) { + GPU_fx_compositor_destroy(rv3d->compositor); + } MEM_freeN(rv3d); ar->regiondata = NULL; @@ -732,6 +754,7 @@ static void *view3d_main_area_duplicate(void *poin) new->render_engine = NULL; new->sms = NULL; new->smooth_timer = NULL; + new->compositor = NULL; return new; } @@ -813,6 +836,16 @@ static void view3d_main_area_listener(bScreen *sc, ScrArea *sa, ARegion *ar, wmN case ND_WORLD: /* handled by space_view3d_listener() for v3d access */ break; + case ND_DRAW_RENDER_VIEWPORT: + { + if (v3d->camera && (scene == wmn->reference)) { + RegionView3D *rv3d = ar->regiondata; + if (rv3d->persp == RV3D_CAMOB) { + ED_region_tag_redraw(ar); + } + } + break; + } } if (wmn->action == NA_EDITED) ED_region_tag_redraw(ar); @@ -852,13 +885,35 @@ static void view3d_main_area_listener(bScreen *sc, ScrArea *sa, ARegion *ar, wmN break; } break; + case NC_CAMERA: + switch (wmn->data) { + case ND_DRAW_RENDER_VIEWPORT: + { + if (v3d->camera && (v3d->camera->data == wmn->reference)) { + RegionView3D *rv3d = ar->regiondata; + if (rv3d->persp == RV3D_CAMOB) { + ED_region_tag_redraw(ar); + } + } + break; + } + } + break; case NC_GROUP: /* all group ops for now */ ED_region_tag_redraw(ar); break; case NC_BRUSH: - if (wmn->action == NA_EDITED) - ED_region_tag_redraw_overlay(ar); + switch (wmn->action) { + case NA_EDITED: + ED_region_tag_redraw_overlay(ar); + break; + case NA_SELECTED: + /* used on brush changes - needed because 3d cursor + * has to be drawn if clone brush is selected */ + ED_region_tag_redraw(ar); + break; + } break; case NC_MATERIAL: switch (wmn->data) { @@ -950,8 +1005,9 @@ static void view3d_main_area_listener(bScreen *sc, ScrArea *sa, ARegion *ar, wmN break; case NC_GPENCIL: - if (wmn->action == NA_EDITED) + if (ELEM(wmn->action, NA_EDITED, NA_SELECTED)) { ED_region_tag_redraw(ar); + } break; } } @@ -1007,6 +1063,10 @@ static void view3d_header_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa) if (wmn->data == ND_SPACE_VIEW3D) ED_region_tag_redraw(ar); break; + case NC_GPENCIL: + if (wmn->data & ND_GPENCIL_EDITMODE) + ED_region_tag_redraw(ar); + break; } } @@ -1092,7 +1152,8 @@ static void view3d_buttons_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa ED_region_tag_redraw(ar); break; case NC_BRUSH: - if (wmn->action == NA_EDITED) + /* NA_SELECTED is used on brush changes */ + if (ELEM(wmn->action, NA_EDITED, NA_SELECTED)) ED_region_tag_redraw(ar); break; case NC_SPACE: @@ -1104,7 +1165,7 @@ static void view3d_buttons_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa ED_region_tag_redraw(ar); break; case NC_GPENCIL: - if (wmn->data == ND_DATA || wmn->action == NA_EDITED) + if ((wmn->data & (ND_DATA | ND_GPENCIL_EDITMODE)) || (wmn->action == NA_EDITED)) ED_region_tag_redraw(ar); break; case NC_IMAGE: @@ -1168,7 +1229,8 @@ static void space_view3d_listener(bScreen *UNUSED(sc), ScrArea *sa, struct wmNot case NC_WORLD: switch (wmn->data) { case ND_WORLD_DRAW: - if (v3d->flag2 & V3D_RENDER_OVERRIDE) + case ND_WORLD: + if (v3d->flag3 & V3D_SHOW_WORLD) ED_area_tag_redraw_regiontype(sa, RGN_TYPE_WINDOW); break; } |