Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_view3d/space_view3d.cc
| /* SPDX-License-Identifier: GPL-2.0-or-later | /* SPDX-License-Identifier: GPL-2.0-or-later | ||||
| * Copyright 2008 Blender Foundation. All rights reserved. */ | * Copyright 2008 Blender Foundation. All rights reserved. */ | ||||
| /** \file | /** \file | ||||
| * \ingroup spview3d | * \ingroup spview3d | ||||
| */ | */ | ||||
| /* Allow using deprecated functionality for .blend file I/O. */ | |||||
| #define DNA_DEPRECATED_ALLOW | |||||
| #include <stdio.h> | #include <stdio.h> | ||||
| #include <string.h> | #include <string.h> | ||||
| #include "DNA_collection_types.h" | #include "DNA_collection_types.h" | ||||
| #include "DNA_defaults.h" | #include "DNA_defaults.h" | ||||
| #include "DNA_gpencil_types.h" | #include "DNA_gpencil_types.h" | ||||
| #include "DNA_lightprobe_types.h" | #include "DNA_lightprobe_types.h" | ||||
| #include "DNA_material_types.h" | #include "DNA_material_types.h" | ||||
| #include "DNA_object_types.h" | #include "DNA_object_types.h" | ||||
| #include "DNA_scene_types.h" | #include "DNA_scene_types.h" | ||||
| #include "DNA_view3d_types.h" | #include "DNA_view3d_types.h" | ||||
| #include "MEM_guardedalloc.h" | #include "MEM_guardedalloc.h" | ||||
| #include "BLI_blenlib.h" | #include "BLI_blenlib.h" | ||||
| #include "BLI_math.h" | #include "BLI_math.h" | ||||
| #include "BLI_utildefines.h" | #include "BLI_utildefines.h" | ||||
| #include "BLT_translation.h" | #include "BLT_translation.h" | ||||
| #include "BKE_asset.h" | #include "BKE_asset.h" | ||||
| #include "BKE_context.h" | #include "BKE_context.h" | ||||
| #include "BKE_curve.h" | #include "BKE_curve.h" | ||||
| #include "BKE_global.h" | #include "BKE_global.h" | ||||
| #include "BKE_gpencil.h" | |||||
| #include "BKE_icons.h" | #include "BKE_icons.h" | ||||
| #include "BKE_idprop.h" | #include "BKE_idprop.h" | ||||
| #include "BKE_lattice.h" | #include "BKE_lattice.h" | ||||
| #include "BKE_layer.h" | #include "BKE_layer.h" | ||||
| #include "BKE_lib_remap.h" | #include "BKE_lib_remap.h" | ||||
| #include "BKE_main.h" | #include "BKE_main.h" | ||||
| #include "BKE_mball.h" | #include "BKE_mball.h" | ||||
| #include "BKE_mesh.h" | #include "BKE_mesh.h" | ||||
| #include "BKE_object.h" | #include "BKE_object.h" | ||||
| #include "BKE_scene.h" | #include "BKE_scene.h" | ||||
| #include "BKE_screen.h" | #include "BKE_screen.h" | ||||
| #include "BKE_viewer_path.h" | |||||
| #include "BKE_workspace.h" | #include "BKE_workspace.h" | ||||
| #include "ED_object.h" | #include "ED_object.h" | ||||
| #include "ED_outliner.h" | #include "ED_outliner.h" | ||||
| #include "ED_render.h" | #include "ED_render.h" | ||||
| #include "ED_screen.h" | #include "ED_screen.h" | ||||
| #include "ED_space_api.h" | #include "ED_space_api.h" | ||||
| #include "ED_transform.h" | #include "ED_transform.h" | ||||
| #include "ED_undo.h" | #include "ED_undo.h" | ||||
| #include "ED_viewer_path.hh" | |||||
| #include "GPU_matrix.h" | #include "GPU_matrix.h" | ||||
| #include "DRW_engine.h" | #include "DRW_engine.h" | ||||
| #include "WM_api.h" | #include "WM_api.h" | ||||
| #include "WM_message.h" | #include "WM_message.h" | ||||
| #include "WM_toolsystem.h" | #include "WM_toolsystem.h" | ||||
| #include "WM_types.h" | #include "WM_types.h" | ||||
| #include "RE_engine.h" | #include "RE_engine.h" | ||||
| #include "RE_pipeline.h" | #include "RE_pipeline.h" | ||||
| #include "RNA_access.h" | #include "RNA_access.h" | ||||
| #include "UI_interface.h" | #include "UI_interface.h" | ||||
| #include "UI_resources.h" | #include "UI_resources.h" | ||||
| #include "BLO_read_write.h" | |||||
| #ifdef WITH_PYTHON | #ifdef WITH_PYTHON | ||||
| # include "BPY_extern.h" | # include "BPY_extern.h" | ||||
| #endif | #endif | ||||
| #include "DEG_depsgraph.h" | #include "DEG_depsgraph.h" | ||||
| #include "DEG_depsgraph_build.h" | #include "DEG_depsgraph_build.h" | ||||
| #include "view3d_intern.h" /* own include */ | #include "view3d_intern.h" /* own include */ | ||||
| ▲ Show 20 Lines • Show All 233 Lines • ▼ Show 20 Lines | static void view3d_free(SpaceLink *sl) | ||||
| if (vd->runtime.properties_storage) { | if (vd->runtime.properties_storage) { | ||||
| MEM_freeN(vd->runtime.properties_storage); | MEM_freeN(vd->runtime.properties_storage); | ||||
| } | } | ||||
| if (vd->shading.prop) { | if (vd->shading.prop) { | ||||
| IDP_FreeProperty(vd->shading.prop); | IDP_FreeProperty(vd->shading.prop); | ||||
| vd->shading.prop = nullptr; | vd->shading.prop = nullptr; | ||||
| } | } | ||||
| BKE_viewer_path_clear(&vd->viewer_path); | |||||
| } | } | ||||
| /* spacetype; init callback */ | /* spacetype; init callback */ | ||||
| static void view3d_init(wmWindowManager *UNUSED(wm), ScrArea *UNUSED(area)) | static void view3d_init(wmWindowManager *UNUSED(wm), ScrArea *UNUSED(area)) | ||||
| { | { | ||||
| } | } | ||||
| static void view3d_exit(wmWindowManager *UNUSED(wm), ScrArea *area) | static void view3d_exit(wmWindowManager *UNUSED(wm), ScrArea *area) | ||||
| Show All 22 Lines | static SpaceLink *view3d_duplicate(SpaceLink *sl) | ||||
| if (v3dn->shading.type == OB_RENDER) { | if (v3dn->shading.type == OB_RENDER) { | ||||
| v3dn->shading.type = OB_SOLID; | v3dn->shading.type = OB_SOLID; | ||||
| } | } | ||||
| if (v3dn->shading.prop) { | if (v3dn->shading.prop) { | ||||
| v3dn->shading.prop = IDP_CopyProperty(v3do->shading.prop); | v3dn->shading.prop = IDP_CopyProperty(v3do->shading.prop); | ||||
| } | } | ||||
| BKE_viewer_path_copy(&v3dn->viewer_path, &v3do->viewer_path); | |||||
| /* copy or clear inside new stuff */ | /* copy or clear inside new stuff */ | ||||
| return (SpaceLink *)v3dn; | return (SpaceLink *)v3dn; | ||||
| } | } | ||||
| /* add handlers, stuff you only do once or on area/region changes */ | /* add handlers, stuff you only do once or on area/region changes */ | ||||
| static void view3d_main_region_init(wmWindowManager *wm, ARegion *region) | static void view3d_main_region_init(wmWindowManager *wm, ARegion *region) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 943 Lines • ▼ Show 20 Lines | case NC_GPENCIL: | ||||
| if (wmn->data == ND_DATA || ELEM(wmn->action, NA_EDITED, NA_SELECTED)) { | if (wmn->data == ND_DATA || ELEM(wmn->action, NA_EDITED, NA_SELECTED)) { | ||||
| ED_region_tag_redraw(region); | ED_region_tag_redraw(region); | ||||
| } | } | ||||
| break; | break; | ||||
| case NC_WORKSPACE: | case NC_WORKSPACE: | ||||
| /* In case the region displays workspace settings. */ | /* In case the region displays workspace settings. */ | ||||
| ED_region_tag_redraw(region); | ED_region_tag_redraw(region); | ||||
| break; | break; | ||||
| case NC_VIEWER_PATH: { | |||||
| if (v3d->flag2 & V3D_SHOW_VIEWER) { | |||||
| ViewLayer *view_layer = WM_window_get_active_view_layer(window); | |||||
| if (Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, view_layer)) { | |||||
| ED_render_view3d_update(depsgraph, window, area, true); | |||||
| } | |||||
| ED_region_tag_redraw(region); | |||||
| } | |||||
| break; | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| static void view3d_do_msg_notify_workbench_view_update(struct bContext *C, | static void view3d_do_msg_notify_workbench_view_update(struct bContext *C, | ||||
| struct wmMsgSubscribeKey *UNUSED(msg_key), | struct wmMsgSubscribeKey *UNUSED(msg_key), | ||||
| struct wmMsgSubscribeValue *msg_val) | struct wmMsgSubscribeValue *msg_val) | ||||
| { | { | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| ▲ Show 20 Lines • Show All 645 Lines • ▼ Show 20 Lines | static void view3d_id_remap(ScrArea *area, SpaceLink *slink, const struct IDRemapper *mappings) | ||||
| View3D *view3d = (View3D *)slink; | View3D *view3d = (View3D *)slink; | ||||
| view3d_id_remap_v3d(area, slink, view3d, mappings, false); | view3d_id_remap_v3d(area, slink, view3d, mappings, false); | ||||
| view3d_id_remap_v3d_ob_centers(view3d, mappings); | view3d_id_remap_v3d_ob_centers(view3d, mappings); | ||||
| if (view3d->localvd != nullptr) { | if (view3d->localvd != nullptr) { | ||||
| /* Object centers in local-view aren't used, see: T52663 */ | /* Object centers in local-view aren't used, see: T52663 */ | ||||
| view3d_id_remap_v3d(area, slink, view3d->localvd, mappings, true); | view3d_id_remap_v3d(area, slink, view3d->localvd, mappings, true); | ||||
| } | } | ||||
| BKE_viewer_path_id_remap(&view3d->viewer_path, mappings); | |||||
| } | |||||
| static void view3d_blend_read_data(BlendDataReader *reader, SpaceLink *sl) | |||||
| { | |||||
| View3D *v3d = (View3D *)sl; | |||||
| memset(&v3d->runtime, 0x0, sizeof(v3d->runtime)); | |||||
| if (v3d->gpd) { | |||||
| BLO_read_data_address(reader, &v3d->gpd); | |||||
| BKE_gpencil_blend_read_data(reader, v3d->gpd); | |||||
| } | |||||
| BLO_read_data_address(reader, &v3d->localvd); | |||||
| /* render can be quite heavy, set to solid on load */ | |||||
| if (v3d->shading.type == OB_RENDER) { | |||||
| v3d->shading.type = OB_SOLID; | |||||
| } | |||||
| v3d->shading.prev_type = OB_SOLID; | |||||
| BKE_screen_view3d_shading_blend_read_data(reader, &v3d->shading); | |||||
| BKE_screen_view3d_do_versions_250(v3d, &sl->regionbase); | |||||
| BKE_viewer_path_blend_read_data(reader, &v3d->viewer_path); | |||||
| } | |||||
| static void view3d_blend_read_lib(BlendLibReader *reader, ID *parent_id, SpaceLink *sl) | |||||
| { | |||||
| View3D *v3d = (View3D *)sl; | |||||
| BLO_read_id_address(reader, parent_id->lib, &v3d->camera); | |||||
| BLO_read_id_address(reader, parent_id->lib, &v3d->ob_center); | |||||
| if (v3d->localvd) { | |||||
| BLO_read_id_address(reader, parent_id->lib, &v3d->localvd->camera); | |||||
| } | |||||
| BKE_viewer_path_blend_read_lib(reader, parent_id->lib, &v3d->viewer_path); | |||||
| } | |||||
| static void view3d_blend_write(BlendWriter *writer, SpaceLink *sl) | |||||
| { | |||||
| View3D *v3d = (View3D *)sl; | |||||
| BLO_write_struct(writer, View3D, v3d); | |||||
| if (v3d->localvd) { | |||||
| BLO_write_struct(writer, View3D, v3d->localvd); | |||||
| } | |||||
| BKE_screen_view3d_shading_blend_write(writer, &v3d->shading); | |||||
| BKE_viewer_path_blend_write(writer, &v3d->viewer_path); | |||||
| } | } | ||||
| void ED_spacetype_view3d(void) | void ED_spacetype_view3d(void) | ||||
| { | { | ||||
| SpaceType *st = MEM_cnew<SpaceType>("spacetype view3d"); | SpaceType *st = MEM_cnew<SpaceType>("spacetype view3d"); | ||||
| ARegionType *art; | ARegionType *art; | ||||
| st->spaceid = SPACE_VIEW3D; | st->spaceid = SPACE_VIEW3D; | ||||
| STRNCPY(st->name, "View3D"); | STRNCPY(st->name, "View3D"); | ||||
| st->create = view3d_create; | st->create = view3d_create; | ||||
| st->free = view3d_free; | st->free = view3d_free; | ||||
| st->init = view3d_init; | st->init = view3d_init; | ||||
| st->exit = view3d_exit; | st->exit = view3d_exit; | ||||
| st->listener = space_view3d_listener; | st->listener = space_view3d_listener; | ||||
| st->refresh = space_view3d_refresh; | st->refresh = space_view3d_refresh; | ||||
| st->duplicate = view3d_duplicate; | st->duplicate = view3d_duplicate; | ||||
| st->operatortypes = view3d_operatortypes; | st->operatortypes = view3d_operatortypes; | ||||
| st->keymap = view3d_keymap; | st->keymap = view3d_keymap; | ||||
| st->dropboxes = view3d_dropboxes; | st->dropboxes = view3d_dropboxes; | ||||
| st->gizmos = view3d_widgets; | st->gizmos = view3d_widgets; | ||||
| st->context = view3d_context; | st->context = view3d_context; | ||||
| st->id_remap = view3d_id_remap; | st->id_remap = view3d_id_remap; | ||||
| st->blend_read_data = view3d_blend_read_data; | |||||
| st->blend_read_lib = view3d_blend_read_lib; | |||||
| st->blend_write = view3d_blend_write; | |||||
| /* regions: main window */ | /* regions: main window */ | ||||
| art = MEM_cnew<ARegionType>("spacetype view3d main region"); | art = MEM_cnew<ARegionType>("spacetype view3d main region"); | ||||
| art->regionid = RGN_TYPE_WINDOW; | art->regionid = RGN_TYPE_WINDOW; | ||||
| art->keymapflag = ED_KEYMAP_GIZMO | ED_KEYMAP_TOOL | ED_KEYMAP_GPENCIL; | art->keymapflag = ED_KEYMAP_GIZMO | ED_KEYMAP_TOOL | ED_KEYMAP_GPENCIL; | ||||
| art->draw = view3d_main_region_draw; | art->draw = view3d_main_region_draw; | ||||
| art->init = view3d_main_region_init; | art->init = view3d_main_region_init; | ||||
| art->exit = view3d_main_region_exit; | art->exit = view3d_main_region_exit; | ||||
| ▲ Show 20 Lines • Show All 68 Lines • Show Last 20 Lines | |||||