DRW: Object Mode: Fix bad camera display in camera view
This fix T53485 : Ortho cameras display frame when in camera view
This commit is contained in:
parent
777e1d358a
commit
13715adc09
Notes:
blender-bot
2023-02-14 06:20:49 +01:00
Referenced by issue #53485, Ortho cameras display frame when in camera view
|
@ -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) {
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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_tria, color,
|
||||
cam->drwcorners, &cam->drwdepth, cam->drwtria, ob->obmat);
|
||||
stl->g_data->camera_frame, color, cam->drwcorners,
|
||||
&cam->drwdepth, cam->drwtria, ob->obmat);
|
||||
}
|
||||
else {
|
||||
DRW_shgroup_call_dynamic_add(
|
||||
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 */
|
||||
|
|
Loading…
Reference in New Issue