diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2018-08-01 15:16:41 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2018-08-01 15:16:41 +0300 |
commit | 936d1cef6e6124a8f8f3ce50182afa2e1c947c6f (patch) | |
tree | 429a7503472bd8fe38ceb062086e447cb3a83423 /source/blender/draw/intern | |
parent | 4e6bcd10e559ab541df53a3d7b645faac1a7fe27 (diff) | |
parent | ddd62f1b1063d69df5171c7b3457ffcffcc6b0e4 (diff) |
Merge branch 'blender2.8' into soc-2018-bevel
Conflicts:
release/scripts/addons
release/scripts/startup/bl_ui/space_view3d_toolbar.py
source/blender/editors/space_outliner/outliner_draw.c
Diffstat (limited to 'source/blender/draw/intern')
-rw-r--r-- | source/blender/draw/intern/DRW_render.h | 20 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_anim_viz.c | 13 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_armature.c | 31 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache.c | 110 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache.h | 3 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl.h | 4 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl_metaball.c | 2 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_common.c | 10 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_common.h | 10 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 222 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager_data.c | 27 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager_shader.c | 11 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_view.c | 11 |
13 files changed, 388 insertions, 86 deletions
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index adcfe2524c7..abba8d3ce91 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -120,11 +120,21 @@ typedef char DRWViewportEmptyList; if (dfbl->multisample_fb != NULL) { \ DRW_stats_query_start("Multisample Resolve"); \ GPU_framebuffer_bind(dfbl->default_fb); \ - DRW_multisamples_resolve(dtxl->multisample_depth, dtxl->multisample_color); \ + DRW_multisamples_resolve(dtxl->multisample_depth, dtxl->multisample_color, true); \ DRW_stats_query_end(); \ } \ } +#define MULTISAMPLE_SYNC_DISABLE_NO_DEPTH(dfbl, dtxl) { \ + if (dfbl->multisample_fb != NULL) { \ + DRW_stats_query_start("Multisample Resolve"); \ + GPU_framebuffer_bind(dfbl->default_fb); \ + DRW_multisamples_resolve(dtxl->multisample_depth, dtxl->multisample_color, false); \ + DRW_stats_query_end(); \ + } \ +} + + typedef struct DrawEngineDataSize { @@ -225,10 +235,10 @@ void DRW_uniformbuffer_free(struct GPUUniformBuffer *ubo); } \ } while (0) -void DRW_transform_to_display(struct GPUTexture *tex); +void DRW_transform_to_display(struct GPUTexture *tex, bool use_view_settings); void DRW_transform_none(struct GPUTexture *tex); void DRW_multisamples_resolve( - struct GPUTexture *src_depth, struct GPUTexture *src_color); + struct GPUTexture *src_depth, struct GPUTexture *src_color, bool use_depth); /* Shaders */ struct GPUShader *DRW_shader_create( @@ -402,6 +412,8 @@ void DRW_shgroup_uniform_int_copy(DRWShadingGroup *shgroup, const char *name, co void DRW_shgroup_uniform_bool_copy(DRWShadingGroup *shgroup, const char *name, const bool value); void DRW_shgroup_uniform_float_copy(DRWShadingGroup *shgroup, const char *name, const float value); +bool DRW_shgroup_is_empty(DRWShadingGroup *shgroup); + /* Passes */ DRWPass *DRW_pass_create(const char *name, DRWState state); void DRW_pass_state_set(DRWPass *pass, DRWState state); @@ -410,6 +422,8 @@ void DRW_pass_state_remove(DRWPass *pass, DRWState state); void DRW_pass_foreach_shgroup(DRWPass *pass, void (*callback)(void *userData, DRWShadingGroup *shgrp), void *userData); void DRW_pass_sort_shgroup_z(DRWPass *pass); +bool DRW_pass_is_empty(DRWPass *pass); + /* Viewport */ typedef enum { /* keep in sync with the union struct DRWMatrixState. */ diff --git a/source/blender/draw/intern/draw_anim_viz.c b/source/blender/draw/intern/draw_anim_viz.c index 95894783cfe..7ddcb306cea 100644 --- a/source/blender/draw/intern/draw_anim_viz.c +++ b/source/blender/draw/intern/draw_anim_viz.c @@ -90,10 +90,12 @@ typedef struct MPATH_Data { MPATH_StorageList *stl; } MPATH_Data; -struct { +#if 0 +static struct { GPUShader *mpath_line_sh; GPUShader *mpath_points_sh; } e_data = {0}; +#endif /* *************************** Path Cache *********************************** */ @@ -322,12 +324,19 @@ static void MPATH_draw_scene(void *vedata) DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); + if (DRW_pass_is_empty(psl->lines) && + DRW_pass_is_empty(psl->points)) + { + /* Nothing to draw. */ + return; + } + MULTISAMPLE_SYNC_ENABLE(dfbl, dtxl) DRW_draw_pass(psl->lines); DRW_draw_pass(psl->points); - MULTISAMPLE_SYNC_DISABLE(dfbl, dtxl) + MULTISAMPLE_SYNC_DISABLE_NO_DEPTH(dfbl, dtxl) } /* *************************** Draw Engine Defines ****************************** */ diff --git a/source/blender/draw/intern/draw_armature.c b/source/blender/draw/intern/draw_armature.c index f0a32dfc8e0..a84b3fdeb41 100644 --- a/source/blender/draw/intern/draw_armature.c +++ b/source/blender/draw/intern/draw_armature.c @@ -95,6 +95,8 @@ static struct { DRWShadingGroup *lines_ik_spline; DRWArmaturePasses passes; + + bool transparent; } g_data = {NULL}; @@ -139,7 +141,8 @@ static void drw_shgroup_bone_octahedral( } if (g_data.bone_octahedral_solid == NULL) { struct GPUBatch *geom = DRW_cache_bone_octahedral_get(); - g_data.bone_octahedral_solid = shgroup_instance_bone_shape_solid(g_data.passes.bone_solid, geom); + g_data.bone_octahedral_solid = shgroup_instance_bone_shape_solid(g_data.passes.bone_solid, geom, + g_data.transparent); } float final_bonemat[4][4]; mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat); @@ -160,7 +163,7 @@ static void drw_shgroup_bone_box( } if (g_data.bone_box_solid == NULL) { struct GPUBatch *geom = DRW_cache_bone_box_get(); - g_data.bone_box_solid = shgroup_instance_bone_shape_solid(g_data.passes.bone_solid, geom); + g_data.bone_box_solid = shgroup_instance_bone_shape_solid(g_data.passes.bone_solid, geom, g_data.transparent); } float final_bonemat[4][4]; mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat); @@ -234,13 +237,13 @@ static void drw_shgroup_bone_envelope( g_data.bone_point_wire = shgroup_instance_bone_sphere_outline(g_data.passes.bone_wire); } if (g_data.bone_point_solid == NULL) { - g_data.bone_point_solid = shgroup_instance_bone_sphere_solid(g_data.passes.bone_solid); + g_data.bone_point_solid = shgroup_instance_bone_sphere_solid(g_data.passes.bone_solid, g_data.transparent); } if (g_data.bone_envelope_wire == NULL) { g_data.bone_envelope_wire = shgroup_instance_bone_envelope_outline(g_data.passes.bone_wire); } if (g_data.bone_envelope_solid == NULL) { - g_data.bone_envelope_solid = shgroup_instance_bone_envelope_solid(g_data.passes.bone_solid); + g_data.bone_envelope_solid = shgroup_instance_bone_envelope_solid(g_data.passes.bone_solid, g_data.transparent); /* We can have a lot of overdraw if we don't do this. Also envelope are not subject to * inverted matrix. */ DRW_shgroup_state_enable(g_data.bone_envelope_solid, DRW_STATE_CULL_BACK); @@ -329,7 +332,8 @@ static void drw_shgroup_bone_custom_solid( } if (surf) { - DRWShadingGroup *shgrp_geom_solid = shgroup_instance_bone_shape_solid(g_data.passes.bone_solid, surf); + DRWShadingGroup *shgrp_geom_solid = shgroup_instance_bone_shape_solid(g_data.passes.bone_solid, surf, + g_data.transparent); DRW_shgroup_call_dynamic_add(shgrp_geom_solid, final_bonemat, bone_color, hint_color); } @@ -372,7 +376,7 @@ static void drw_shgroup_bone_point( g_data.bone_point_wire = shgroup_instance_bone_sphere_outline(g_data.passes.bone_wire); } if (g_data.bone_point_solid == NULL) { - g_data.bone_point_solid = shgroup_instance_bone_sphere_solid(g_data.passes.bone_solid); + g_data.bone_point_solid = shgroup_instance_bone_sphere_solid(g_data.passes.bone_solid, g_data.transparent); } float final_bonemat[4][4]; mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat); @@ -456,7 +460,7 @@ static void drw_shgroup_bone_ik_spline_lines(const float start[3], const float e * \{ */ /* global here is reset before drawing each bone */ -struct { +static struct { const ThemeWireColor *bcolor; } g_color; @@ -1732,11 +1736,12 @@ static void draw_armature_pose(Object *ob, const float const_color[4]) /** * This function set the object space to use for all subsequent `DRW_shgroup_bone_*` calls. */ -static void drw_shgroup_armature(Object *ob, DRWArmaturePasses passes) +static void drw_shgroup_armature(Object *ob, DRWArmaturePasses passes, bool transp) { memset(&g_data, 0x0, sizeof(g_data)); g_data.ob = ob; g_data.passes = passes; + g_data.transparent = transp; memset(&g_color, 0x0, sizeof(g_color)); } @@ -1745,19 +1750,19 @@ void DRW_shgroup_armature_object(Object *ob, ViewLayer *view_layer, DRWArmatureP float *color; DRW_object_wire_theme_get(ob, view_layer, &color); passes.bone_envelope = NULL; /* Don't do envelope distance in object mode. */ - drw_shgroup_armature(ob, passes); + drw_shgroup_armature(ob, passes, false); draw_armature_pose(ob, color); } -void DRW_shgroup_armature_pose(Object *ob, DRWArmaturePasses passes) +void DRW_shgroup_armature_pose(Object *ob, DRWArmaturePasses passes, bool transp) { - drw_shgroup_armature(ob, passes); + drw_shgroup_armature(ob, passes, transp); draw_armature_pose(ob, NULL); } -void DRW_shgroup_armature_edit(Object *ob, DRWArmaturePasses passes) +void DRW_shgroup_armature_edit(Object *ob, DRWArmaturePasses passes, bool transp) { - drw_shgroup_armature(ob, passes); + drw_shgroup_armature(ob, passes, transp); draw_armature_edit(ob); } diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c index dff863b11bb..c3fa9f5c1aa 100644 --- a/source/blender/draw/intern/draw_cache.c +++ b/source/blender/draw/intern/draw_cache.c @@ -107,6 +107,7 @@ static struct DRWShapeCache { GPUBatch *drw_particle_cross; GPUBatch *drw_particle_circle; GPUBatch *drw_particle_axis; + GPUBatch *drw_gpencil_axes; } SHC = {NULL}; void DRW_shape_cache_free(void) @@ -241,13 +242,15 @@ static GPUVertBuf *sphere_wire_vbo(const float rad) cv[0] = p[(i + j) % NSEGMENTS][0]; cv[1] = p[(i + j) % NSEGMENTS][1]; - if (axis == 0) - v[0] = cv[0], v[1] = cv[1], v[2] = 0.0f; - else if (axis == 1) - v[0] = cv[0], v[1] = 0.0f, v[2] = cv[1]; - else - v[0] = 0.0f, v[1] = cv[0], v[2] = cv[1]; - + if (axis == 0) { + ARRAY_SET_ITEMS(v, cv[0], cv[1], 0.0f); + } + else if (axis == 1) { + ARRAY_SET_ITEMS(v, cv[0], 0.0f, cv[1]); + } + else { + ARRAY_SET_ITEMS(v, 0.0f, cv[0], cv[1]); + } GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 2 + j + (NSEGMENTS * 2 * axis), v); } } @@ -551,12 +554,67 @@ GPUBatch *DRW_cache_screenspace_circle_get(void) #undef CIRCLE_RESOL } -/** \} */ +/* Grease Pencil object */ +GPUBatch *DRW_cache_gpencil_axes_get(void) +{ + if (!SHC.drw_gpencil_axes) { + int axis; + float v1[3] = { 0.0f, 0.0f, 0.0f }; + float v2[3] = { 0.0f, 0.0f, 0.0f }; + + /* cube data */ + const GLfloat verts[8][3] = { + { -0.25f, -0.25f, -0.25f }, + { -0.25f, -0.25f, 0.25f }, + { -0.25f, 0.25f, -0.25f }, + { -0.25f, 0.25f, 0.25f }, + { 0.25f, -0.25f, -0.25f }, + { 0.25f, -0.25f, 0.25f }, + { 0.25f, 0.25f, -0.25f }, + { 0.25f, 0.25f, 0.25f } + }; + + const GLubyte indices[24] = { 0, 1, 1, 3, 3, 2, 2, 0, 0, 4, 4, 5, 5, 7, 7, 6, 6, 4, 1, 5, 3, 7, 2, 6 }; + + /* Position Only 3D format */ + static GPUVertFormat format = { 0 }; + static uint pos_id; + if (format.attr_len == 0) { + pos_id = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); + } + + GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format); + + /* alloc 30 elements for cube and 3 axis */ + GPU_vertbuf_data_alloc(vbo, ARRAY_SIZE(indices) + 6); + + /* draw axis */ + for (axis = 0; axis < 3; axis++) { + v1[axis] = 1.0f; + v2[axis] = -1.0f; + + GPU_vertbuf_attr_set(vbo, pos_id, axis * 2, v1); + GPU_vertbuf_attr_set(vbo, pos_id, axis * 2 + 1, v2); + + /* reset v1 & v2 to zero for next axis */ + v1[axis] = v2[axis] = 0.0f; + } + + /* draw cube */ + for (int i = 0; i < 24; ++i) { + GPU_vertbuf_attr_set(vbo, pos_id, i + 6, verts[indices[i]]); + } + + SHC.drw_gpencil_axes = GPU_batch_create_ex(GPU_PRIM_LINES, vbo, NULL, GPU_BATCH_OWNS_VBO); + } + return SHC.drw_gpencil_axes; +} + /* -------------------------------------------------------------------- */ /** \name Common Object API - * \{ */ +* \{ */ GPUBatch *DRW_cache_object_wire_outline_get(Object *ob) { @@ -769,17 +827,17 @@ GPUBatch *DRW_cache_empty_cone_get(void) cv[1] = p[(i) % NSEGMENTS][1]; /* cone sides */ - v[0] = cv[0], v[1] = 0.0f, v[2] = cv[1]; + ARRAY_SET_ITEMS(v, cv[0], 0.0f, cv[1]); GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 4, v); - v[0] = 0.0f, v[1] = 2.0f, v[2] = 0.0f; + ARRAY_SET_ITEMS(v, 0.0f, 2.0f, 0.0f); GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 4 + 1, v); /* end ring */ - v[0] = cv[0], v[1] = 0.0f, v[2] = cv[1]; + ARRAY_SET_ITEMS(v, cv[0], 0.0f, cv[1]); GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 4 + 2, v); cv[0] = p[(i + 1) % NSEGMENTS][0]; cv[1] = p[(i + 1) % NSEGMENTS][1]; - v[0] = cv[0], v[1] = 0.0f, v[2] = cv[1]; + ARRAY_SET_ITEMS(v, cv[0], 0.0f, cv[1]); GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 4 + 3, v); } @@ -1522,9 +1580,9 @@ GPUBatch *DRW_cache_lamp_spot_get(void) cv[1] = p[i % NSEGMENTS][1]; /* cone sides */ - v[0] = cv[0], v[1] = cv[1], v[2] = -1.0f; + ARRAY_SET_ITEMS(v, cv[0], cv[1], -1.0f); GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 4, v); - v[0] = 0.0f, v[1] = 0.0f, v[2] = 0.0f; + ARRAY_SET_ITEMS(v, 0.0f, 0.0f, 0.0f); GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 4 + 1, v); GPU_vertbuf_attr_set(vbo, attr_id.n1, i * 4, n[(i) % NSEGMENTS]); @@ -1533,11 +1591,11 @@ GPUBatch *DRW_cache_lamp_spot_get(void) GPU_vertbuf_attr_set(vbo, attr_id.n2, i * 4 + 1, n[(i + 1) % NSEGMENTS]); /* end ring */ - v[0] = cv[0], v[1] = cv[1], v[2] = -1.0f; + ARRAY_SET_ITEMS(v, cv[0], cv[1], -1.0f); GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 4 + 2, v); cv[0] = p[(i + 1) % NSEGMENTS][0]; cv[1] = p[(i + 1) % NSEGMENTS][1]; - v[0] = cv[0], v[1] = cv[1], v[2] = -1.0f; + ARRAY_SET_ITEMS(v, cv[0], cv[1], -1.0f); GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 4 + 3, v); GPU_vertbuf_attr_set(vbo, attr_id.n1, i * 4 + 2, n[(i) % NSEGMENTS]); @@ -2954,7 +3012,7 @@ GPUBatch *DRW_cache_curve_edge_wire_get(Object *ob) BLI_assert(ob->type == OB_CURVE); struct Curve *cu = ob->data; - return DRW_curve_batch_cache_get_wire_edge(cu, ob->curve_cache); + return DRW_curve_batch_cache_get_wire_edge(cu, ob->runtime.curve_cache); } GPUBatch *DRW_cache_curve_edge_normal_get(Object *ob, float normal_size) @@ -2962,7 +3020,7 @@ GPUBatch *DRW_cache_curve_edge_normal_get(Object *ob, float normal_size) BLI_assert(ob->type == OB_CURVE); struct Curve *cu = ob->data; - return DRW_curve_batch_cache_get_normal_edge(cu, ob->curve_cache, normal_size); + return DRW_curve_batch_cache_get_normal_edge(cu, ob->runtime.curve_cache, normal_size); } GPUBatch *DRW_cache_curve_edge_overlay_get(Object *ob) @@ -2986,7 +3044,7 @@ GPUBatch *DRW_cache_curve_surface_get(Object *ob) BLI_assert(ob->type == OB_CURVE); struct Curve *cu = ob->data; - return DRW_curve_batch_cache_get_triangles_with_normals(cu, ob->curve_cache); + return DRW_curve_batch_cache_get_triangles_with_normals(cu, ob->runtime.curve_cache); } /* Return list of batches */ @@ -2996,7 +3054,7 @@ GPUBatch **DRW_cache_curve_surface_shaded_get( BLI_assert(ob->type == OB_CURVE); struct Curve *cu = ob->data; - return DRW_curve_batch_cache_get_surface_shaded(cu, ob->curve_cache, gpumat_array, gpumat_array_len); + return DRW_curve_batch_cache_get_surface_shaded(cu, ob->runtime.curve_cache, gpumat_array, gpumat_array_len); } /** \} */ @@ -3032,7 +3090,7 @@ GPUBatch *DRW_cache_text_edge_wire_get(Object *ob) BLI_assert(ob->type == OB_FONT); struct Curve *cu = ob->data; - return DRW_curve_batch_cache_get_wire_edge(cu, ob->curve_cache); + return DRW_curve_batch_cache_get_wire_edge(cu, ob->runtime.curve_cache); } GPUBatch *DRW_cache_text_surface_get(Object *ob) @@ -3042,7 +3100,7 @@ GPUBatch *DRW_cache_text_surface_get(Object *ob) if (cu->editfont && (cu->flag & CU_FAST)) { return NULL; } - return DRW_curve_batch_cache_get_triangles_with_normals(cu, ob->curve_cache); + return DRW_curve_batch_cache_get_triangles_with_normals(cu, ob->runtime.curve_cache); } GPUBatch **DRW_cache_text_surface_shaded_get( @@ -3053,7 +3111,7 @@ GPUBatch **DRW_cache_text_surface_shaded_get( if (cu->editfont && (cu->flag & CU_FAST)) { return NULL; } - return DRW_curve_batch_cache_get_surface_shaded(cu, ob->curve_cache, gpumat_array, gpumat_array_len); + return DRW_curve_batch_cache_get_surface_shaded(cu, ob->runtime.curve_cache, gpumat_array, gpumat_array_len); } GPUBatch *DRW_cache_text_cursor_overlay_get(Object *ob) @@ -3082,7 +3140,7 @@ GPUBatch *DRW_cache_surf_surface_get(Object *ob) BLI_assert(ob->type == OB_SURF); struct Curve *cu = ob->data; - return DRW_curve_batch_cache_get_triangles_with_normals(cu, ob->curve_cache); + return DRW_curve_batch_cache_get_triangles_with_normals(cu, ob->runtime.curve_cache); } /* Return list of batches */ @@ -3092,7 +3150,7 @@ GPUBatch **DRW_cache_surf_surface_shaded_get( BLI_assert(ob->type == OB_SURF); struct Curve *cu = ob->data; - return DRW_curve_batch_cache_get_surface_shaded(cu, ob->curve_cache, gpumat_array, gpumat_array_len); + return DRW_curve_batch_cache_get_surface_shaded(cu, ob->runtime.curve_cache, gpumat_array, gpumat_array_len); } /** \} */ diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h index 129c0252f30..7d0996b3059 100644 --- a/source/blender/draw/intern/draw_cache.h +++ b/source/blender/draw/intern/draw_cache.h @@ -82,6 +82,9 @@ struct GPUBatch *DRW_cache_field_vortex_get(void); struct GPUBatch *DRW_cache_field_tube_limit_get(void); struct GPUBatch *DRW_cache_field_cone_limit_get(void); +/* Grease Pencil */ +struct GPUBatch *DRW_cache_gpencil_axes_get(void); + /* Lamps */ struct GPUBatch *DRW_cache_lamp_get(void); struct GPUBatch *DRW_cache_lamp_shadows_get(void); diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h index eeb7b1c41ee..d4dbe5db80d 100644 --- a/source/blender/draw/intern/draw_cache_impl.h +++ b/source/blender/draw/intern/draw_cache_impl.h @@ -41,6 +41,7 @@ struct Curve; struct Lattice; struct Mesh; struct MetaBall; +struct bGPdata; /* Expose via BKE callbacks */ void DRW_mball_batch_cache_dirty(struct MetaBall *mb, int mode); @@ -58,6 +59,9 @@ void DRW_lattice_batch_cache_free(struct Lattice *lt); void DRW_particle_batch_cache_dirty(struct ParticleSystem *psys, int mode); void DRW_particle_batch_cache_free(struct ParticleSystem *psys); +void DRW_gpencil_batch_cache_dirty(struct bGPdata *gpd); +void DRW_gpencil_batch_cache_free(struct bGPdata *gpd); + /* Curve */ struct GPUBatch *DRW_curve_batch_cache_get_wire_edge(struct Curve *cu, struct CurveCache *ob_curve_cache); struct GPUBatch *DRW_curve_batch_cache_get_normal_edge( diff --git a/source/blender/draw/intern/draw_cache_impl_metaball.c b/source/blender/draw/intern/draw_cache_impl_metaball.c index 375b0ba6bb2..2172997a714 100644 --- a/source/blender/draw/intern/draw_cache_impl_metaball.c +++ b/source/blender/draw/intern/draw_cache_impl_metaball.c @@ -140,7 +140,7 @@ GPUBatch *DRW_metaball_batch_cache_get_triangles_with_normals(Object *ob) MetaBallBatchCache *cache = metaball_batch_cache_get(mb); if (cache->batch == NULL) { - ListBase *lb = &ob->curve_cache->disp; + ListBase *lb = &ob->runtime.curve_cache->disp; cache->batch = GPU_batch_create_ex( GPU_PRIM_TRIS, DRW_displist_vertbuf_calc_pos_with_normals(lb), diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c index c9fc5eba079..77d6e888771 100644 --- a/source/blender/draw/intern/draw_common.c +++ b/source/blender/draw/intern/draw_common.c @@ -552,7 +552,7 @@ DRWShadingGroup *shgroup_instance_bone_envelope_distance(DRWPass *pass) return grp; } -DRWShadingGroup *shgroup_instance_bone_envelope_solid(DRWPass *pass) +DRWShadingGroup *shgroup_instance_bone_envelope_solid(DRWPass *pass, bool transp) { if (g_shaders.bone_envelope == NULL) { g_shaders.bone_envelope = DRW_shader_create( @@ -572,6 +572,7 @@ DRWShadingGroup *shgroup_instance_bone_envelope_solid(DRWPass *pass) g_shaders.bone_envelope, pass, DRW_cache_bone_envelope_solid_get(), g_formats.instance_bone_envelope); + DRW_shgroup_uniform_float_copy(grp, "alpha", transp ? 0.6f : 1.0f); return grp; } @@ -623,7 +624,7 @@ DRWShadingGroup *shgroup_instance_bone_shape_outline(DRWPass *pass, struct GPUBa return grp; } -DRWShadingGroup *shgroup_instance_bone_shape_solid(DRWPass *pass, struct GPUBatch *geom) +DRWShadingGroup *shgroup_instance_bone_shape_solid(DRWPass *pass, struct GPUBatch *geom, bool transp) { if (g_shaders.shape_solid == NULL) { g_shaders.shape_solid = DRW_shader_create( @@ -641,11 +642,12 @@ DRWShadingGroup *shgroup_instance_bone_shape_solid(DRWPass *pass, struct GPUBatc g_shaders.shape_solid, pass, geom, g_formats.instance_bone); DRW_shgroup_uniform_vec2(grp, "viewportSize", DRW_viewport_size_get(), 1); + DRW_shgroup_uniform_float_copy(grp, "alpha", transp ? 0.6f : 1.0f); return grp; } -DRWShadingGroup *shgroup_instance_bone_sphere_solid(DRWPass *pass) +DRWShadingGroup *shgroup_instance_bone_sphere_solid(DRWPass *pass, bool transp) { if (g_shaders.bone_sphere == NULL) { g_shaders.bone_sphere = DRW_shader_create( @@ -662,6 +664,8 @@ DRWShadingGroup *shgroup_instance_bone_sphere_solid(DRWPass *pass) DRWShadingGroup *grp = DRW_shgroup_instance_create( g_shaders.bone_sphere, pass, DRW_cache_bone_point_get(), g_formats.instance_bone); + /* More transparent than the shape to be less distractive. */ + DRW_shgroup_uniform_float_copy(grp, "alpha", transp ? 0.4f : 1.0f); return grp; } diff --git a/source/blender/draw/intern/draw_common.h b/source/blender/draw/intern/draw_common.h index 80b2ec8db71..0ad1402f29e 100644 --- a/source/blender/draw/intern/draw_common.h +++ b/source/blender/draw/intern/draw_common.h @@ -128,11 +128,11 @@ struct DRWShadingGroup *shgroup_instance_mball_handles(struct DRWPass *pass); struct DRWShadingGroup *shgroup_instance_bone_axes(struct DRWPass *pass); struct DRWShadingGroup *shgroup_instance_bone_envelope_distance(struct DRWPass *pass); struct DRWShadingGroup *shgroup_instance_bone_envelope_outline(struct DRWPass *pass); -struct DRWShadingGroup *shgroup_instance_bone_envelope_solid(struct DRWPass *pass); +struct DRWShadingGroup *shgroup_instance_bone_envelope_solid(struct DRWPass *pass, bool transp); struct DRWShadingGroup *shgroup_instance_bone_shape_outline(struct DRWPass *pass, struct GPUBatch *geom); -struct DRWShadingGroup *shgroup_instance_bone_shape_solid(struct DRWPass *pass, struct GPUBatch *geom); +struct DRWShadingGroup *shgroup_instance_bone_shape_solid(struct DRWPass *pass, struct GPUBatch *geom, bool transp); struct DRWShadingGroup *shgroup_instance_bone_sphere_outline(struct DRWPass *pass); -struct DRWShadingGroup *shgroup_instance_bone_sphere_solid(struct DRWPass *pass); +struct DRWShadingGroup *shgroup_instance_bone_sphere_solid(struct DRWPass *pass, bool transp); struct DRWShadingGroup *shgroup_instance_bone_stick(struct DRWPass *pass); struct GPUShader *mpath_line_shader_get(void); @@ -155,8 +155,8 @@ typedef struct DRWArmaturePasses { } DRWArmaturePasses; void DRW_shgroup_armature_object(struct Object *ob, struct ViewLayer *view_layer, struct DRWArmaturePasses passes); -void DRW_shgroup_armature_pose(struct Object *ob, struct DRWArmaturePasses passes); -void DRW_shgroup_armature_edit(struct Object *ob, struct DRWArmaturePasses passes); +void DRW_shgroup_armature_pose(struct Object *ob, struct DRWArmaturePasses passes, bool transp); +void DRW_shgroup_armature_edit(struct Object *ob, struct DRWArmaturePasses passes, bool transp); /* draw_hair.c */ diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index cc4f8ec7947..ba53c3aa664 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -48,6 +48,7 @@ #include "ED_space_api.h" #include "ED_screen.h" +#include "ED_gpencil.h" #include "ED_particle.h" #include "ED_view3d.h" @@ -94,7 +95,7 @@ /** Render State: No persistent data between draw calls. */ DRWManager DST = {NULL}; -ListBase DRW_engines = {NULL, NULL}; +static ListBase DRW_engines = {NULL, NULL}; extern struct GPUUniformBuffer *view_ubo; /* draw_manager_exec.c */ @@ -224,7 +225,7 @@ bool DRW_check_psys_visible_within_active_context( * \{ */ /* Use color management profile to draw texture to framebuffer */ -void DRW_transform_to_display(GPUTexture *tex) +void DRW_transform_to_display(GPUTexture *tex, bool use_view_settings) { drw_state_set(DRW_STATE_WRITE_COLOR); @@ -239,8 +240,11 @@ void DRW_transform_to_display(GPUTexture *tex) /* View transform is already applied for offscreen, don't apply again, see: T52046 */ if (!(DST.options.is_image_render && !DST.options.is_scene_render)) { Scene *scene = DST.draw_ctx.scene; + ColorManagedDisplaySettings *display_settings = &scene->display_settings; + ColorManagedViewSettings *view_settings = (use_view_settings) ? &scene->view_settings : NULL; + use_ocio = IMB_colormanagement_setup_glsl_draw_from_space( - &scene->view_settings, &scene->display_settings, NULL, dither, false); + view_settings, display_settings, NULL, dither, false); } if (!use_ocio) { @@ -317,10 +321,14 @@ void DRW_transform_none(GPUTexture *tex) /* Use manual multisample resolve pass. * Much quicker than blitting back and forth. * Assume destination fb is bound*/ -void DRW_multisamples_resolve(GPUTexture *src_depth, GPUTexture *src_color) +void DRW_multisamples_resolve(GPUTexture *src_depth, GPUTexture *src_color, bool use_depth) { - drw_state_set(DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_PREMUL | - DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL); + DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_PREMUL; + + if (use_depth) { + state |= DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL; + } + drw_state_set(state); int samples = GPU_texture_samples(src_depth); @@ -330,22 +338,39 @@ void DRW_multisamples_resolve(GPUTexture *src_depth, GPUTexture *src_color) GPUBatch *geom = DRW_cache_fullscreen_quad_get(); int builtin; - switch (samples) { - case 2: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_2; break; - case 4: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_4; break; - case 8: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_8; break; - case 16: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_16; break; - default: - BLI_assert(0); - builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_2; - break; + if (use_depth) { + switch (samples) { + case 2: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_2_DEPTH_TEST; break; + case 4: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_4_DEPTH_TEST; break; + case 8: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_8_DEPTH_TEST; break; + case 16: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_16_DEPTH_TEST; break; + default: + BLI_assert("Mulisample count unsupported by blit shader."); + builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_2_DEPTH_TEST; + break; + } + } + else { + switch (samples) { + case 2: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_2; break; + case 4: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_4; break; + case 8: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_8; break; + case 16: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_16; break; + default: + BLI_assert("Mulisample count unsupported by blit shader."); + builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_2; + break; + } } GPU_batch_program_set_builtin(geom, builtin); - GPU_texture_bind(src_depth, 0); + if (use_depth) { + GPU_texture_bind(src_depth, 0); + GPU_batch_uniform_1i(geom, "depthMulti", 0); + } + GPU_texture_bind(src_color, 1); - GPU_batch_uniform_1i(geom, "depthMulti", 0); GPU_batch_uniform_1i(geom, "colorMulti", 1); float mat[4][4]; @@ -1198,10 +1223,17 @@ static void drw_engines_enable_from_mode(int mode) break; case CTX_MODE_OBJECT: break; + case CTX_MODE_GPENCIL_PAINT: + case CTX_MODE_GPENCIL_EDIT: + case CTX_MODE_GPENCIL_SCULPT: + case CTX_MODE_GPENCIL_WEIGHT: + break; default: BLI_assert(!"Draw mode invalid"); break; } + /* grease pencil */ + use_drw_engine(&draw_engine_gpencil_type); } static void drw_engines_enable_from_overlays(int overlay_flag) @@ -1234,6 +1266,10 @@ static void drw_engines_enable(ViewLayer *view_layer, RenderEngineType *engine_t drw_engines_enable_from_object_mode(); drw_engines_enable_from_mode(mode); } + else { + /* if gpencil must draw the strokes, but not the object */ + drw_engines_enable_from_mode(mode); + } } static void drw_engines_disable(void) @@ -1353,6 +1389,7 @@ void DRW_draw_render_loop_ex( Scene *scene = DEG_get_evaluated_scene(depsgraph); ViewLayer *view_layer = DEG_get_evaluated_view_layer(depsgraph); RegionView3D *rv3d = ar->regiondata; + bool do_annotations = (((v3d->flag2 & V3D_SHOW_ANNOTATION) != 0) && ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0)); DST.draw_ctx.evil_C = evil_C; DST.viewport = viewport; @@ -1382,7 +1419,7 @@ void DRW_draw_render_loop_ex( DRW_hair_init(); /* No framebuffer allowed before drawing. */ - BLI_assert(GPU_framebuffer_current_get() == 0); + BLI_assert(GPU_framebuffer_active_get() == NULL); /* Init engines */ drw_engines_init(); @@ -1447,6 +1484,17 @@ void DRW_draw_render_loop_ex( drw_engines_draw_scene(); + /* annotations - temporary drawing buffer (3d space) */ + /* XXX: Or should we use a proper draw/overlay engine for this case? */ + if (((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) && + (do_annotations)) + { + glDisable(GL_DEPTH_TEST); + /* XXX: as scene->gpd is not copied for COW yet */ + ED_gpencil_draw_view3d_annotations(DEG_get_input_scene(depsgraph), depsgraph, v3d, ar, true); + glEnable(GL_DEPTH_TEST); + } + DRW_draw_callbacks_post_scene(); if (DST.draw_ctx.evil_C) { ED_region_draw_cb_draw(DST.draw_ctx.evil_C, DST.draw_ctx.ar, REGION_DRAW_POST_VIEW); @@ -1471,6 +1519,17 @@ void DRW_draw_render_loop_ex( DRW_draw_region_info(); + /* annotations - temporary drawing buffer (screenspace) */ + /* XXX: Or should we use a proper draw/overlay engine for this case? */ + if (((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) && + (do_annotations)) + { + glDisable(GL_DEPTH_TEST); + /* XXX: as scene->gpd is not copied for COW yet */ + ED_gpencil_draw_view3d_annotations(DEG_get_input_scene(depsgraph), depsgraph, v3d, ar, false); + glEnable(GL_DEPTH_TEST); + } + if ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) { /* Draw 2D after region info so we can draw on top of the camera passepartout overlay. * 'DRW_draw_region_info' sets the projection in pixel-space. */ @@ -1559,6 +1618,121 @@ void DRW_draw_render_loop_offscreen( GPU_offscreen_bind(ofs, false); } +/* helper to check if exit object type to render */ +static bool DRW_render_check_object_type(struct Depsgraph *depsgraph, short obtype) +{ + DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN(depsgraph, ob) + { + if ((ob->type == obtype) && (DRW_check_object_visible_within_active_context(ob))) { + return true; + } + } + DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END + + return false; +} + +static void DRW_render_gpencil_to_image(RenderEngine *engine, struct Depsgraph *depsgraph, struct RenderLayer *render_layer, const rcti *rect) +{ + if (draw_engine_gpencil_type.render_to_image) { + if (DRW_render_check_object_type(depsgraph, OB_GPENCIL)) { + ViewportEngineData *gpdata = drw_viewport_engine_data_ensure(&draw_engine_gpencil_type); + draw_engine_gpencil_type.render_to_image(gpdata, engine, render_layer, rect); + } + } +} + +void DRW_render_gpencil(struct RenderEngine *engine, struct Depsgraph *depsgraph) +{ + /* This function is only valid for Cycles + * Eevee done all work in the Eevee render directly. + * Maybe it can be done equal for both engines? + */ + if (STREQ(engine->type->name, "Eevee")) { + return; + } + + Scene *scene = DEG_get_evaluated_scene(depsgraph); + ViewLayer *view_layer = DEG_get_evaluated_view_layer(depsgraph); + RenderEngineType *engine_type = engine->type; + RenderData *r = &scene->r; + Render *render = engine->re; + /* Changing Context */ + if (G.background && DST.gl_context == NULL) { + WM_init_opengl(G_MAIN); + } + + void *re_gl_context = RE_gl_context_get(render); + void *re_gpu_context = NULL; + + /* Changing Context */ + if (re_gl_context != NULL) { + DRW_opengl_render_context_enable(re_gl_context); + /* We need to query gpu context after a gl context has been bound. */ + re_gpu_context = RE_gpu_context_get(render); + DRW_gawain_render_context_enable(re_gpu_context); + } + else { + DRW_opengl_context_enable(); + } + + /* Reset before using it. */ + drw_state_prepare_clean_for_draw(&DST); + DST.options.is_image_render = true; + DST.options.is_scene_render = true; + DST.options.draw_background = scene->r.alphamode == R_ADDSKY; + DST.buffer_finish_called = true; + + DST.draw_ctx = (DRWContextState) { + .scene = scene, .view_layer = view_layer, + .engine_type = engine_type, + .depsgraph = depsgraph, .object_mode = OB_MODE_OBJECT, + }; + drw_context_state_init(); + + DST.viewport = GPU_viewport_create(); + const int size[2] = { (r->size * r->xsch) / 100, (r->size * r->ysch) / 100 }; + GPU_viewport_size_set(DST.viewport, size); + + drw_viewport_var_init(); + + /* set default viewport */ + gpuPushAttrib(GPU_ENABLE_BIT | GPU_VIEWPORT_BIT); + glDisable(GL_SCISSOR_TEST); + glViewport(0, 0, size[0], size[1]); + + /* Main rendering. */ + rctf view_rect; + rcti render_rect; + RE_GetViewPlane(render, &view_rect, &render_rect); + if (BLI_rcti_is_empty(&render_rect)) { + BLI_rcti_init(&render_rect, 0, size[0], 0, size[1]); + } + + RenderResult *render_result = RE_engine_get_result(engine); + RenderLayer *render_layer = render_result->layers.first; + + DRW_render_gpencil_to_image(engine, depsgraph, render_layer, &render_rect); + + /* Force cache to reset. */ + drw_viewport_cache_resize(); + GPU_viewport_free(DST.viewport); + DRW_state_reset(); + + glDisable(GL_DEPTH_TEST); + + /* Restore Drawing area. */ + gpuPopAttrib(); + glEnable(GL_SCISSOR_TEST); + GPU_framebuffer_restore(); + + /* Changing Context */ + /* GPXX Review this context */ + DRW_opengl_context_disable(); + + DST.buffer_finish_called = false; +} + void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph) { Scene *scene = DEG_get_evaluated_scene(depsgraph); @@ -1639,6 +1813,8 @@ void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph) { RE_SetActiveRenderView(render, render_view->name); engine_type->draw_engine->render_to_image(data, engine, render_layer, &render_rect); + /* grease pencil: render result is merged in the previous render result. */ + DRW_render_gpencil_to_image(engine, depsgraph, render_layer, &render_rect); DST.buffer_finish_called = false; } @@ -1647,8 +1823,6 @@ void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph) /* Force cache to reset. */ drw_viewport_cache_resize(); - /* TODO grease pencil */ - GPU_viewport_free(DST.viewport); GPU_framebuffer_restore(); @@ -2262,6 +2436,7 @@ void DRW_engines_register(void) DRW_engine_register(&draw_engine_particle_type); DRW_engine_register(&draw_engine_pose_type); DRW_engine_register(&draw_engine_sculpt_type); + DRW_engine_register(&draw_engine_gpencil_type); /* setup callbacks */ { @@ -2280,6 +2455,9 @@ void DRW_engines_register(void) /* BKE: particle.c */ extern void *BKE_particle_batch_cache_dirty_cb; extern void *BKE_particle_batch_cache_free_cb; + /* BKE: gpencil.c */ + extern void *BKE_gpencil_batch_cache_dirty_cb; + extern void *BKE_gpencil_batch_cache_free_cb; BKE_mball_batch_cache_dirty_cb = DRW_mball_batch_cache_dirty; BKE_mball_batch_cache_free_cb = DRW_mball_batch_cache_free; @@ -2295,6 +2473,9 @@ void DRW_engines_register(void) BKE_particle_batch_cache_dirty_cb = DRW_particle_batch_cache_dirty; BKE_particle_batch_cache_free_cb = DRW_particle_batch_cache_free; + + BKE_gpencil_batch_cache_dirty_cb = DRW_gpencil_batch_cache_dirty; + BKE_gpencil_batch_cache_free_cb = DRW_gpencil_batch_cache_free; } } @@ -2351,6 +2532,7 @@ void DRW_opengl_context_create(void) } /* This changes the active context. */ DST.gl_context = WM_opengl_context_create(); + WM_opengl_context_activate(DST.gl_context); /* Be sure to create gawain.context too. */ DST.gpu_context = GPU_context_create(); if (!G.background) { diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c index dccb869c133..407eea16d91 100644 --- a/source/blender/draw/intern/draw_manager_data.c +++ b/source/blender/draw/intern/draw_manager_data.c @@ -998,6 +998,23 @@ void DRW_shgroup_stencil_mask(DRWShadingGroup *shgroup, uint mask) shgroup->stencil_mask = mask; } +bool DRW_shgroup_is_empty(DRWShadingGroup *shgroup) +{ + switch (shgroup->type) { + case DRW_SHG_NORMAL: + case DRW_SHG_FEEDBACK_TRANSFORM: + return shgroup->calls.first == NULL; + case DRW_SHG_POINT_BATCH: + case DRW_SHG_LINE_BATCH: + case DRW_SHG_TRIANGLE_BATCH: + case DRW_SHG_INSTANCE: + case DRW_SHG_INSTANCE_EXTERNAL: + return shgroup->instance_count == 0; + } + BLI_assert(!"Shading Group type not supported"); + return true; +} + /** \} */ /* -------------------------------------------------------------------- */ @@ -1019,6 +1036,16 @@ DRWPass *DRW_pass_create(const char *name, DRWState state) return pass; } +bool DRW_pass_is_empty(DRWPass *pass) +{ + for (DRWShadingGroup *shgroup = pass->shgroups.first; shgroup; shgroup = shgroup->next) { + if (!DRW_shgroup_is_empty(shgroup)) { + return false; + } + } + return true; +} + void DRW_pass_state_set(DRWPass *pass, DRWState state) { pass->state = state; diff --git a/source/blender/draw/intern/draw_manager_shader.c b/source/blender/draw/intern/draw_manager_shader.c index b0aec4a7600..b85e6267687 100644 --- a/source/blender/draw/intern/draw_manager_shader.c +++ b/source/blender/draw/intern/draw_manager_shader.c @@ -72,6 +72,7 @@ typedef struct DRWShaderCompiler { ThreadMutex compilation_lock; void *gl_context; + bool own_context; int shaders_done; /* To compute progress. */ } DRWShaderCompiler; @@ -146,7 +147,7 @@ static void drw_deferred_shader_compilation_free(void *custom_data) BLI_spin_end(&comp->list_lock); BLI_mutex_end(&comp->compilation_lock); - if (comp->gl_context) { + if (comp->own_context) { /* Only destroy if the job owns the context. */ WM_opengl_context_dispose(comp->gl_context); } @@ -189,8 +190,11 @@ static void drw_deferred_shader_add(GPUMaterial *mat, bool deferred) BLI_movelisttolist(&comp->queue, &old_comp->queue); BLI_spin_unlock(&old_comp->list_lock); /* Do not recreate context, just pass ownership. */ - comp->gl_context = old_comp->gl_context; - old_comp->gl_context = NULL; + if (old_comp->gl_context) { + comp->gl_context = old_comp->gl_context; + old_comp->own_context = false; + comp->own_context = true; + } } BLI_addtail(&comp->queue, dsh); @@ -199,6 +203,7 @@ static void drw_deferred_shader_add(GPUMaterial *mat, bool deferred) if (comp->gl_context == NULL) { comp->gl_context = WM_opengl_context_create(); WM_opengl_context_activate(DST.gl_context); + comp->own_context = true; } WM_jobs_customdata_set(wm_job, comp, drw_deferred_shader_compilation_free); diff --git a/source/blender/draw/intern/draw_view.c b/source/blender/draw/intern/draw_view.c index 05aecea1d7a..95835a691a3 100644 --- a/source/blender/draw/intern/draw_view.c +++ b/source/blender/draw/intern/draw_view.c @@ -561,21 +561,12 @@ void DRW_draw_grid(void) void DRW_draw_background(void) { - const DRWContextState *draw_ctx = DRW_context_state_get(); - /* Just to make sure */ glDepthMask(GL_TRUE); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glStencilMask(0xFF); - if ((draw_ctx->v3d->flag3 & V3D_SHOW_WORLD) && - (draw_ctx->scene->world != NULL)) - { - const World *world = draw_ctx->scene->world; - glClearColor(world->horr, world->horg, world->horb, 1.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); - } - else if (UI_GetThemeValue(TH_SHOW_BACK_GRAD)) { + if (UI_GetThemeValue(TH_SHOW_BACK_GRAD)) { float m[4][4]; unit_m4(m); |