Object Mode: Add back object bound display
This commit is contained in:
parent
dc3b3d9453
commit
7dcc7bd5ee
|
@ -63,6 +63,9 @@ static struct DRWShapeCache {
|
|||
Gwn_Batch *drw_line_endpoints;
|
||||
Gwn_Batch *drw_empty_cube;
|
||||
Gwn_Batch *drw_empty_sphere;
|
||||
Gwn_Batch *drw_empty_cylinder;
|
||||
Gwn_Batch *drw_empty_capsule_body;
|
||||
Gwn_Batch *drw_empty_capsule_cap;
|
||||
Gwn_Batch *drw_empty_cone;
|
||||
Gwn_Batch *drw_arrows;
|
||||
Gwn_Batch *drw_axis_names;
|
||||
|
@ -784,6 +787,144 @@ Gwn_Batch *DRW_cache_empty_cone_get(void)
|
|||
#undef NSEGMENTS
|
||||
}
|
||||
|
||||
Gwn_Batch *DRW_cache_empty_cylinder_get(void)
|
||||
{
|
||||
#define NSEGMENTS 12
|
||||
if (!SHC.drw_empty_cylinder) {
|
||||
/* a single ring of vertices */
|
||||
float p[NSEGMENTS][2];
|
||||
for (int i = 0; i < NSEGMENTS; ++i) {
|
||||
float angle = 2 * M_PI * ((float)i / (float)NSEGMENTS);
|
||||
p[i][0] = cosf(angle);
|
||||
p[i][1] = sinf(angle);
|
||||
}
|
||||
|
||||
/* Position Only 3D format */
|
||||
static Gwn_VertFormat format = { 0 };
|
||||
static struct { uint pos; } attr_id;
|
||||
if (format.attr_len == 0) {
|
||||
attr_id.pos = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
|
||||
}
|
||||
|
||||
Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format);
|
||||
GWN_vertbuf_data_alloc(vbo, NSEGMENTS * 6);
|
||||
|
||||
for (int i = 0; i < NSEGMENTS; ++i) {
|
||||
float cv[2], pv[2], v[3];
|
||||
cv[0] = p[(i) % NSEGMENTS][0];
|
||||
cv[1] = p[(i) % NSEGMENTS][1];
|
||||
pv[0] = p[(i + 1) % NSEGMENTS][0];
|
||||
pv[1] = p[(i + 1) % NSEGMENTS][1];
|
||||
|
||||
/* cylinder sides */
|
||||
copy_v3_fl3(v, cv[0], cv[1], -1.0f);
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.pos, i * 6, v);
|
||||
copy_v3_fl3(v, cv[0], cv[1], 1.0f);
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.pos, i * 6 + 1, v);
|
||||
|
||||
/* top ring */
|
||||
copy_v3_fl3(v, cv[0], cv[1], 1.0f);
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.pos, i * 6 + 2, v);
|
||||
copy_v3_fl3(v, pv[0], pv[1], 1.0f);
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.pos, i * 6 + 3, v);
|
||||
|
||||
/* bottom ring */
|
||||
copy_v3_fl3(v, cv[0], cv[1], -1.0f);
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.pos, i * 6 + 4, v);
|
||||
copy_v3_fl3(v, pv[0], pv[1], -1.0f);
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.pos, i * 6 + 5, v);
|
||||
}
|
||||
|
||||
SHC.drw_empty_cylinder = GWN_batch_create_ex(GWN_PRIM_LINES, vbo, NULL, GWN_BATCH_OWNS_VBO);
|
||||
}
|
||||
return SHC.drw_empty_cylinder;
|
||||
#undef NSEGMENTS
|
||||
}
|
||||
|
||||
Gwn_Batch *DRW_cache_empty_capsule_body_get(void)
|
||||
{
|
||||
if (!SHC.drw_empty_capsule_body) {
|
||||
const float pos[8][3] = {
|
||||
{ 1.0f, 0.0f, 1.0f},
|
||||
{ 1.0f, 0.0f, 0.0f},
|
||||
{ 0.0f, 1.0f, 1.0f},
|
||||
{ 0.0f, 1.0f, 0.0f},
|
||||
{-1.0f, 0.0f, 1.0f},
|
||||
{-1.0f, 0.0f, 0.0f},
|
||||
{ 0.0f, -1.0f, 1.0f},
|
||||
{ 0.0f, -1.0f, 0.0f}
|
||||
};
|
||||
|
||||
/* Position Only 3D format */
|
||||
static Gwn_VertFormat format = { 0 };
|
||||
static struct { uint pos; } attr_id;
|
||||
if (format.attr_len == 0) {
|
||||
attr_id.pos = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
|
||||
}
|
||||
|
||||
Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format);
|
||||
GWN_vertbuf_data_alloc(vbo, 8);
|
||||
GWN_vertbuf_attr_fill(vbo, attr_id.pos, pos);
|
||||
|
||||
SHC.drw_empty_capsule_body = GWN_batch_create_ex(GWN_PRIM_LINES, vbo, NULL, GWN_BATCH_OWNS_VBO);
|
||||
}
|
||||
return SHC.drw_empty_capsule_body;
|
||||
}
|
||||
|
||||
Gwn_Batch *DRW_cache_empty_capsule_cap_get(void)
|
||||
{
|
||||
#define NSEGMENTS 24 /* Must be multiple of 2. */
|
||||
if (!SHC.drw_empty_capsule_cap) {
|
||||
/* a single ring of vertices */
|
||||
float p[NSEGMENTS][2];
|
||||
for (int i = 0; i < NSEGMENTS; ++i) {
|
||||
float angle = 2 * M_PI * ((float)i / (float)NSEGMENTS);
|
||||
p[i][0] = cosf(angle);
|
||||
p[i][1] = sinf(angle);
|
||||
}
|
||||
|
||||
/* Position Only 3D format */
|
||||
static Gwn_VertFormat format = { 0 };
|
||||
static struct { uint pos; } attr_id;
|
||||
if (format.attr_len == 0) {
|
||||
attr_id.pos = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
|
||||
}
|
||||
|
||||
Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format);
|
||||
GWN_vertbuf_data_alloc(vbo, (NSEGMENTS * 2) * 2);
|
||||
|
||||
/* Base circle */
|
||||
int vidx = 0;
|
||||
for (int i = 0; i < NSEGMENTS; ++i) {
|
||||
float v[3] = {0.0f, 0.0f, 0.0f};
|
||||
copy_v2_v2(v, p[(i) % NSEGMENTS]);
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.pos, vidx++, v);
|
||||
copy_v2_v2(v, p[(i+1) % NSEGMENTS]);
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.pos, vidx++, v);
|
||||
}
|
||||
|
||||
for (int i = 0; i < NSEGMENTS / 2; ++i) {
|
||||
float v[3] = {0.0f, 0.0f, 0.0f};
|
||||
int ci = i % NSEGMENTS;
|
||||
int pi = (i + 1) % NSEGMENTS;
|
||||
/* Y half circle */
|
||||
copy_v3_fl3(v, p[ci][0], 0.0f, p[ci][1]);
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.pos, vidx++, v);
|
||||
copy_v3_fl3(v, p[pi][0], 0.0f, p[pi][1]);
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.pos, vidx++, v);
|
||||
/* X half circle */
|
||||
copy_v3_fl3(v, 0.0f, p[ci][0], p[ci][1]);
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.pos, vidx++, v);
|
||||
copy_v3_fl3(v, 0.0f, p[pi][0], p[pi][1]);
|
||||
GWN_vertbuf_attr_set(vbo, attr_id.pos, vidx++, v);
|
||||
}
|
||||
|
||||
SHC.drw_empty_capsule_cap = GWN_batch_create_ex(GWN_PRIM_LINES, vbo, NULL, GWN_BATCH_OWNS_VBO);
|
||||
}
|
||||
return SHC.drw_empty_capsule_cap;
|
||||
#undef NSEGMENTS
|
||||
}
|
||||
|
||||
Gwn_Batch *DRW_cache_arrows_get(void)
|
||||
{
|
||||
if (!SHC.drw_arrows) {
|
||||
|
|
|
@ -66,7 +66,10 @@ struct Gwn_Batch *DRW_cache_empty_cube_get(void);
|
|||
struct Gwn_Batch *DRW_cache_circle_get(void);
|
||||
struct Gwn_Batch *DRW_cache_square_get(void);
|
||||
struct Gwn_Batch *DRW_cache_empty_sphere_get(void);
|
||||
struct Gwn_Batch *DRW_cache_empty_cylinder_get(void);
|
||||
struct Gwn_Batch *DRW_cache_empty_cone_get(void);
|
||||
struct Gwn_Batch *DRW_cache_empty_capsule_cap_get(void);
|
||||
struct Gwn_Batch *DRW_cache_empty_capsule_body_get(void);
|
||||
struct Gwn_Batch *DRW_cache_arrows_get(void);
|
||||
struct Gwn_Batch *DRW_cache_axis_names_get(void);
|
||||
struct Gwn_Batch *DRW_cache_image_plane_get(void);
|
||||
|
|
|
@ -145,6 +145,9 @@ typedef struct OBJECT_PrivateData {
|
|||
DRWShadingGroup *cube;
|
||||
DRWShadingGroup *circle;
|
||||
DRWShadingGroup *sphere;
|
||||
DRWShadingGroup *cylinder;
|
||||
DRWShadingGroup *capsule_cap;
|
||||
DRWShadingGroup *capsule_body;
|
||||
DRWShadingGroup *cone;
|
||||
DRWShadingGroup *single_arrow;
|
||||
DRWShadingGroup *single_arrow_line;
|
||||
|
@ -1093,6 +1096,15 @@ static void OBJECT_cache_init(void *vedata)
|
|||
geom = DRW_cache_empty_sphere_get();
|
||||
stl->g_data->sphere = shgroup_instance(psl->non_meshes, geom);
|
||||
|
||||
geom = DRW_cache_empty_cylinder_get();
|
||||
stl->g_data->cylinder = shgroup_instance(psl->non_meshes, geom);
|
||||
|
||||
geom = DRW_cache_empty_capsule_cap_get();
|
||||
stl->g_data->capsule_cap = shgroup_instance(psl->non_meshes, geom);
|
||||
|
||||
geom = DRW_cache_empty_capsule_body_get();
|
||||
stl->g_data->capsule_body = shgroup_instance(psl->non_meshes, geom);
|
||||
|
||||
geom = DRW_cache_empty_cone_get();
|
||||
stl->g_data->cone = shgroup_instance(psl->non_meshes, geom);
|
||||
|
||||
|
@ -2146,6 +2158,82 @@ static void DRW_shgroup_texture_space(OBJECT_StorageList *stl, Object *ob, int t
|
|||
DRW_shgroup_call_dynamic_add(stl->g_data->texspace, color, &one, tmp);
|
||||
}
|
||||
|
||||
static void DRW_shgroup_bounds(OBJECT_StorageList *stl, Object *ob, int theme_id)
|
||||
{
|
||||
float color[4], center[3], size[3], tmp[4][4], final_mat[4][4], one = 1.0f;
|
||||
BoundBox bb_local;
|
||||
|
||||
if (ob->type == OB_MBALL && !BKE_mball_is_basis(ob)) {
|
||||
return;
|
||||
}
|
||||
|
||||
BoundBox *bb = BKE_object_boundbox_get(ob);
|
||||
|
||||
if (!ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT,
|
||||
OB_MBALL, OB_ARMATURE, OB_LATTICE))
|
||||
{
|
||||
const float min[3] = {-1.0f, -1.0f, -1.0f}, max[3] = {1.0f, 1.0f, 1.0f};
|
||||
bb = &bb_local;
|
||||
BKE_boundbox_init_from_minmax(bb, min, max);
|
||||
}
|
||||
|
||||
UI_GetThemeColor4fv(theme_id, color);
|
||||
BKE_boundbox_calc_center_aabb(bb, center);
|
||||
BKE_boundbox_calc_size_aabb(bb, size);
|
||||
|
||||
switch (ob->boundtype) {
|
||||
case OB_BOUND_BOX:
|
||||
size_to_mat4(tmp, size);
|
||||
copy_v3_v3(tmp[3], center);
|
||||
mul_m4_m4m4(tmp, ob->obmat, tmp);
|
||||
DRW_shgroup_call_dynamic_add(stl->g_data->cube, color, &one, tmp);
|
||||
break;
|
||||
case OB_BOUND_SPHERE:
|
||||
size[0] = max_fff(size[0], size[1], size[2]);
|
||||
size[1] = size[2] = size[0];
|
||||
size_to_mat4(tmp, size);
|
||||
copy_v3_v3(tmp[3], center);
|
||||
mul_m4_m4m4(tmp, ob->obmat, tmp);
|
||||
DRW_shgroup_call_dynamic_add(stl->g_data->sphere, color, &one, tmp);
|
||||
break;
|
||||
case OB_BOUND_CYLINDER:
|
||||
size[0] = max_ff(size[0], size[1]);
|
||||
size[1] = size[0];
|
||||
size_to_mat4(tmp, size);
|
||||
copy_v3_v3(tmp[3], center);
|
||||
mul_m4_m4m4(tmp, ob->obmat, tmp);
|
||||
DRW_shgroup_call_dynamic_add(stl->g_data->cylinder, color, &one, tmp);
|
||||
break;
|
||||
case OB_BOUND_CONE:
|
||||
size[0] = max_ff(size[0], size[1]);
|
||||
size[1] = size[0];
|
||||
size_to_mat4(tmp, size);
|
||||
copy_v3_v3(tmp[3], center);
|
||||
/* Cone batch has base at 0 and is pointing towards +Y. */
|
||||
swap_v3_v3(tmp[1], tmp[2]);
|
||||
tmp[3][2] -= size[2];
|
||||
mul_m4_m4m4(tmp, ob->obmat, tmp);
|
||||
DRW_shgroup_call_dynamic_add(stl->g_data->cone, color, &one, tmp);
|
||||
break;
|
||||
case OB_BOUND_CAPSULE:
|
||||
size[0] = max_ff(size[0], size[1]);
|
||||
size[1] = size[0];
|
||||
scale_m4_fl(tmp, size[0]);
|
||||
copy_v2_v2(tmp[3], center);
|
||||
tmp[3][2] = center[2] + max_ff(0.0f, size[2] - size[0]);
|
||||
mul_m4_m4m4(final_mat, ob->obmat, tmp);
|
||||
DRW_shgroup_call_dynamic_add(stl->g_data->capsule_cap, color, &one, final_mat);
|
||||
negate_v3(tmp[2]);
|
||||
tmp[3][2] = center[2] - max_ff(0.0f, size[2] - size[0]);
|
||||
mul_m4_m4m4(final_mat, ob->obmat, tmp);
|
||||
DRW_shgroup_call_dynamic_add(stl->g_data->capsule_cap, color, &one, final_mat);
|
||||
tmp[2][2] = max_ff(0.0f, size[2] * 2.0f - size[0] * 2.0f);
|
||||
mul_m4_m4m4(final_mat, ob->obmat, tmp);
|
||||
DRW_shgroup_call_dynamic_add(stl->g_data->capsule_body, color, &one, final_mat);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void OBJECT_cache_populate_particles(Object *ob,
|
||||
OBJECT_PassList *psl)
|
||||
{
|
||||
|
@ -2398,17 +2486,8 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
|
|||
DRW_shgroup_forcefield(stl, ob, view_layer);
|
||||
}
|
||||
|
||||
if (((ob->base_flag & BASE_FROMDUPLI) == 0) &&
|
||||
(md = modifiers_findByType(ob, eModifierType_Smoke)) &&
|
||||
(modifier_isEnabled(scene, md, eModifierMode_Realtime)) &&
|
||||
(((SmokeModifierData *)md)->domain != NULL))
|
||||
{
|
||||
DRW_shgroup_volume_extra(psl, stl, ob, view_layer, scene, md);
|
||||
}
|
||||
|
||||
/* don't show object extras in set's */
|
||||
if ((ob->base_flag & (BASE_FROM_SET | BASE_FROMDUPLI)) == 0) {
|
||||
|
||||
DRW_shgroup_object_center(stl, ob, view_layer, v3d);
|
||||
|
||||
if (show_relations) {
|
||||
|
@ -2434,6 +2513,17 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
|
|||
if ((ob->dtx & OB_TEXSPACE) && ELEM(ob->type, OB_MESH, OB_CURVE, OB_MBALL)) {
|
||||
DRW_shgroup_texture_space(stl, ob, theme_id);
|
||||
}
|
||||
|
||||
if (ob->dtx & OB_DRAWBOUNDOX) {
|
||||
DRW_shgroup_bounds(stl, ob, theme_id);
|
||||
}
|
||||
|
||||
if ((md = modifiers_findByType(ob, eModifierType_Smoke)) &&
|
||||
(modifier_isEnabled(scene, md, eModifierMode_Realtime)) &&
|
||||
(((SmokeModifierData *)md)->domain != NULL))
|
||||
{
|
||||
DRW_shgroup_volume_extra(psl, stl, ob, view_layer, scene, md);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue