Commit: 13715adc09ad9cbe8228af1d6ca38f193acbeb67 Author: Clément Foucault Date: Mon Jan 22 00:14:28 2018 +0100 Branches: blender2.8 https://developer.blender.org/rB13715adc09ad9cbe8228af1d6ca38f193acbeb67
DRW: Object Mode: Fix bad camera display in camera view This fix T53485 : Ortho cameras display frame when in camera view =================================================================== M source/blender/draw/intern/draw_cache.c M source/blender/draw/intern/draw_cache.h M source/blender/draw/modes/object_mode.c =================================================================== diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c index 5ef1e0de1c7..6a922860d9d 100644 --- a/source/blender/draw/intern/draw_cache.c +++ b/source/blender/draw/intern/draw_cache.c @@ -88,6 +88,7 @@ static struct DRWShapeCache { Gwn_Batch *drw_bone_point_wire; Gwn_Batch *drw_bone_arrows; Gwn_Batch *drw_camera; + Gwn_Batch *drw_camera_frame; Gwn_Batch *drw_camera_tria; Gwn_Batch *drw_camera_focus; Gwn_Batch *drw_particle_cross; @@ -2101,6 +2102,46 @@ Gwn_Batch *DRW_cache_camera_get(void) return SHC.drw_camera; } +Gwn_Batch *DRW_cache_camera_frame_get(void) +{ + if (!SHC.drw_camera_frame) { + float v1 = 1.0f; /* + X + Y */ + float v2 = 2.0f; /* + X - Y */ + float v3 = 3.0f; /* - X - Y */ + float v4 = 4.0f; /* - X + Y */ + int v_idx = 0; + + static Gwn_VertFormat format = { 0 }; + static struct { uint pos; } attr_id; + if (format.attrib_ct == 0) { + /* use x coordinate to identify the vertex + * the vertex shader take care to place it + * appropriatelly */ + attr_id.pos = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 1, GWN_FETCH_FLOAT); + } + + /* Vertices */ + Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format); + GWN_vertbuf_data_alloc(vbo, 8); + + /* camera frame */ + GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, &v1); + GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, &v2); + + GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, &v2); + GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, &v3); + + GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, &v3); + GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, &v4); + + GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, &v4); + GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, &v1); + + SHC.drw_camera_frame = GWN_batch_create_ex(GWN_PRIM_LINES, vbo, NULL, GWN_BATCH_OWNS_VBO); + } + return SHC.drw_camera_frame; +} + Gwn_Batch *DRW_cache_camera_tria_get(void) { if (!SHC.drw_camera_tria) { diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h index 148171a966a..c039bb8883d 100644 --- a/source/blender/draw/intern/draw_cache.h +++ b/source/blender/draw/intern/draw_cache.h @@ -79,6 +79,7 @@ struct Gwn_Batch *DRW_cache_lamp_spot_square_get(void); /* Camera */ struct Gwn_Batch *DRW_cache_camera_get(void); +struct Gwn_Batch *DRW_cache_camera_frame_get(void); struct Gwn_Batch *DRW_cache_camera_tria_get(void); /* Speaker */ diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index 175eb172cd1..5ad9e19079e 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -186,6 +186,7 @@ typedef struct OBJECT_PrivateData { /* Camera */ DRWShadingGroup *camera; + DRWShadingGroup *camera_frame; DRWShadingGroup *camera_tria; DRWShadingGroup *camera_focus; DRWShadingGroup *camera_clip; @@ -929,6 +930,9 @@ static void OBJECT_cache_init(void *vedata) geom = DRW_cache_camera_get(); stl->g_data->camera = shgroup_camera_instance(psl->non_meshes, geom); + geom = DRW_cache_camera_frame_get(); + stl->g_data->camera_frame = shgroup_camera_instance(psl->non_meshes, geom); + geom = DRW_cache_camera_tria_get(); stl->g_data->camera_tria = shgroup_camera_instance(psl->non_meshes, geom); @@ -1223,9 +1227,11 @@ static void DRW_shgroup_camera(OBJECT_StorageList *stl, Object *ob, ViewLayer *v const DRWContextState *draw_ctx = DRW_context_state_get(); View3D *v3d = draw_ctx->v3d; Scene *scene = draw_ctx->scene; + RegionView3D *rv3d = draw_ctx->rv3d; Camera *cam = ob->data; const bool is_active = (ob == v3d->camera); + const bool look_through = (is_active && (rv3d->persp == RV3D_CAMOB)); float *color; DRW_object_wire_theme_get(ob, view_layer, &color); @@ -1238,7 +1244,7 @@ static void DRW_shgroup_camera(OBJECT_StorageList *stl, Object *ob, ViewLayer *v BKE_camera_view_frame_ex(scene, cam, cam->drawsize, false, scale, asp, shift, &drawsize, vec); - // /* Frame coords */ + /* Frame coords */ copy_v2_v2(cam->drwcorners[0], vec[0]); copy_v2_v2(cam->drwcorners[1], vec[1]); copy_v2_v2(cam->drwcorners[2], vec[2]); @@ -1253,13 +1259,23 @@ static void DRW_shgroup_camera(OBJECT_StorageList *stl, Object *ob, ViewLayer *v cam->drwtria[1][0] = shift[0]; cam->drwtria[1][1] = shift[1] + ((1.1f * drawsize * (asp[1] + 0.7f)) * scale[1]); - DRW_shgroup_call_dynamic_add(stl->g_data->camera, color, cam->drwcorners, &cam->drwdepth, cam->drwtria, ob->obmat); - - /* Active cam */ - if (is_active) { + if (look_through) { + /* Only draw the frame. */ + DRW_shgroup_call_dynamic_add( + stl->g_data->camera_frame, color, cam->drwcorners, + &cam->drwdepth, cam->drwtria, ob->obmat); + } + else { DRW_shgroup_call_dynamic_add( - stl->g_data->camera_tria, color, - cam->drwcorners, &cam->drwdepth, cam->drwtria, ob->obmat); + stl->g_data->camera, color, cam->drwcorners, + &cam->drwdepth, cam->drwtria, ob->obmat); + + /* Active cam */ + if (is_active) { + DRW_shgroup_call_dynamic_add( + stl->g_data->camera_tria, color, + cam->drwcorners, &cam->drwdepth, cam->drwtria, ob->obmat); + } } /* draw the rest in normalize object space */ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs