[Bf-blender-cvs] [13715adc09a] blender2.8: DRW: Object Mode: Fix bad camera display in camera view

Clément Foucault noreply at git.blender.org
Mon Jan 22 00:14:53 CET 2018


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 */



More information about the Bf-blender-cvs mailing list