Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_view3d/view3d_draw.c
| Show First 20 Lines • Show All 83 Lines • ▼ Show 20 Lines | |||||
| #include "UI_interface.h" | #include "UI_interface.h" | ||||
| #include "UI_resources.h" | #include "UI_resources.h" | ||||
| #include "RE_engine.h" | #include "RE_engine.h" | ||||
| #include "WM_api.h" | #include "WM_api.h" | ||||
| #include "WM_types.h" | #include "WM_types.h" | ||||
| #include "WM_message.h" | |||||
| #include "RNA_access.h" | |||||
| #include "IMB_imbuf.h" | #include "IMB_imbuf.h" | ||||
| #include "IMB_imbuf_types.h" | #include "IMB_imbuf_types.h" | ||||
| #include "view3d_intern.h" /* own include */ | #include "view3d_intern.h" /* own include */ | ||||
| /* ******************** general functions ***************** */ | /* ******************** general functions ***************** */ | ||||
| ▲ Show 20 Lines • Show All 1,771 Lines • ▼ Show 20 Lines | static void view3d_draw_view(const bContext *C, ARegion *ar) | ||||
| CTX_data_eval_ctx(C, &eval_ctx); | CTX_data_eval_ctx(C, &eval_ctx); | ||||
| ED_view3d_draw_setup_view(CTX_wm_window(C), &eval_ctx, CTX_data_scene(C), ar, CTX_wm_view3d(C), NULL, NULL, NULL); | ED_view3d_draw_setup_view(CTX_wm_window(C), &eval_ctx, CTX_data_scene(C), ar, CTX_wm_view3d(C), NULL, NULL, NULL); | ||||
| /* Only 100% compliant on new spec goes bellow */ | /* Only 100% compliant on new spec goes bellow */ | ||||
| DRW_draw_view(C); | DRW_draw_view(C); | ||||
| } | } | ||||
| static void view3d_message_bus_init(const bContext *C, ViewRender *view_render, ARegion *ar) | |||||
| { | |||||
| /* Developer note: there are many properties that impact 3D view drawing, | |||||
| * so instead of subscribing to individual properties, just subscribe to types | |||||
| * accepting some redundant redraws. | |||||
| * | |||||
| * For other space types we might try avoid this, keep the 3D view as an exceptional case! */ | |||||
| struct wmMsgBus *mbus = CTX_wm_message_bus(C); | |||||
| wmMsgParams_RNA msg_key_params = {0}; | |||||
| /* Only subscribe to types. */ | |||||
| StructRNA *type_array[] = { | |||||
| /* These object have properties that impact drawing. */ | |||||
| &RNA_AreaLamp, | |||||
| &RNA_Camera, | |||||
| &RNA_Lamp, | |||||
| &RNA_Speaker, | |||||
| &RNA_SunLamp, | |||||
| /* General types the 3D view depends on. */ | |||||
| &RNA_Object, | |||||
| &RNA_ViewRenderSettings, | |||||
| &RNA_World, | |||||
| }; | |||||
| wmMsgSubscribeValue msg_sub_value_region_tag_redraw = { | |||||
| .owner = ar, | |||||
| .user_data = ar, | |||||
| .notify = ED_region_do_msg_notify_tag_redraw, | |||||
| }; | |||||
| for (int i = 0; i < ARRAY_SIZE(type_array); i++) { | |||||
| msg_key_params.ptr.type = type_array[i]; | |||||
| WM_msg_subscribe_rna_params( | |||||
| mbus, | |||||
| &msg_key_params, | |||||
| &msg_sub_value_region_tag_redraw, | |||||
| __func__); | |||||
| } | |||||
| /* Subscribe to a handful of other properties. */ | |||||
| RegionView3D *rv3d = ar->regiondata; | |||||
| WM_msg_subscribe_rna_anon_prop(mbus, RenderSettings, resolution_x, &msg_sub_value_region_tag_redraw); | |||||
| WM_msg_subscribe_rna_anon_prop(mbus, RenderSettings, resolution_y, &msg_sub_value_region_tag_redraw); | |||||
| WM_msg_subscribe_rna_anon_prop(mbus, RenderSettings, pixel_aspect_x, &msg_sub_value_region_tag_redraw); | |||||
| WM_msg_subscribe_rna_anon_prop(mbus, RenderSettings, pixel_aspect_y, &msg_sub_value_region_tag_redraw); | |||||
| if (rv3d->persp == RV3D_CAMOB) { | |||||
| WM_msg_subscribe_rna_anon_prop(mbus, RenderSettings, use_border, &msg_sub_value_region_tag_redraw); | |||||
| } | |||||
| /* Each engine could be responsible for its own engine data types. | |||||
| * For now this is simplest. */ | |||||
| if (STREQ(view_render->engine_id, RE_engine_id_BLENDER_EEVEE)) { | |||||
| extern StructRNA RNA_ViewLayerEngineSettingsEevee; | |||||
| WM_msg_subscribe_rna_anon_type(mbus, ViewLayerEngineSettingsEevee, &msg_sub_value_region_tag_redraw); | |||||
| } | |||||
| else if (STREQ(view_render->engine_id, RE_engine_id_BLENDER_CLAY)) { | |||||
| extern StructRNA RNA_ViewLayerEngineSettingsClay; | |||||
| WM_msg_subscribe_rna_anon_type(mbus, ViewLayerEngineSettingsClay, &msg_sub_value_region_tag_redraw); | |||||
| } | |||||
| } | |||||
| void view3d_main_region_draw(const bContext *C, ARegion *ar) | void view3d_main_region_draw(const bContext *C, ARegion *ar) | ||||
| { | { | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| WorkSpace *workspace = CTX_wm_workspace(C); | WorkSpace *workspace = CTX_wm_workspace(C); | ||||
| View3D *v3d = CTX_wm_view3d(C); | View3D *v3d = CTX_wm_view3d(C); | ||||
| RegionView3D *rv3d = ar->regiondata; | RegionView3D *rv3d = ar->regiondata; | ||||
| ViewRender *view_render = BKE_viewrender_get(scene, workspace); | ViewRender *view_render = BKE_viewrender_get(scene, workspace); | ||||
| RenderEngineType *type = RE_engines_find(view_render->engine_id); | RenderEngineType *type = RE_engines_find(view_render->engine_id); | ||||
| /* Provisory Blender Internal drawing */ | /* Provisory Blender Internal drawing */ | ||||
| if (type->flag & RE_USE_LEGACY_PIPELINE) { | if (type->flag & RE_USE_LEGACY_PIPELINE) { | ||||
| view3d_main_region_draw_legacy(C, ar); | view3d_main_region_draw_legacy(C, ar); | ||||
| return; | return; | ||||
| } | } | ||||
| view3d_message_bus_init(C, view_render, ar); | |||||
| if (!rv3d->viewport) { | if (!rv3d->viewport) { | ||||
| rv3d->viewport = GPU_viewport_create(); | rv3d->viewport = GPU_viewport_create(); | ||||
| } | } | ||||
| GPU_viewport_bind(rv3d->viewport, &ar->winrct); | GPU_viewport_bind(rv3d->viewport, &ar->winrct); | ||||
| view3d_draw_view(C, ar); | view3d_draw_view(C, ar); | ||||
| GPU_viewport_unbind(rv3d->viewport); | GPU_viewport_unbind(rv3d->viewport); | ||||
| ▲ Show 20 Lines • Show All 513 Lines • Show Last 20 Lines | |||||