Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/modes/object_mode.c
| Show First 20 Lines • Show All 3,050 Lines • ▼ Show 20 Lines | static void DRW_shgroup_texture_space(OBJECT_ShadingGroupList *sgl, Object *ob, int theme_id) | ||||
| mul_m4_m4m4(tmp, ob->obmat, tmp); | mul_m4_m4m4(tmp, ob->obmat, tmp); | ||||
| float color[4]; | float color[4]; | ||||
| UI_GetThemeColor4fv(theme_id, color); | UI_GetThemeColor4fv(theme_id, color); | ||||
| DRW_buffer_add_entry(sgl->texspace, color, &one, tmp); | DRW_buffer_add_entry(sgl->texspace, color, &one, tmp); | ||||
| } | } | ||||
| static void DRW_shgroup_bounds(OBJECT_ShadingGroupList *sgl, Object *ob, int theme_id) | static void drw_shgroup_bounds(OBJECT_ShadingGroupList *sgl, | ||||
| const BoundBox *bb, | |||||
| const float obmat[4][4], | |||||
| const float color[4], | |||||
| const char boundtype) | |||||
| { | { | ||||
| float color[4], center[3], size[3], tmp[4][4], final_mat[4][4], one = 1.0f; | float 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, | |||||
| OB_GPENCIL)) { | |||||
| 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_center_aabb(bb, center); | ||||
| BKE_boundbox_calc_size_aabb(bb, size); | BKE_boundbox_calc_size_aabb(bb, size); | ||||
| switch (ob->boundtype) { | switch (boundtype) { | ||||
| case OB_BOUND_BOX: | case OB_BOUND_BOX: | ||||
| size_to_mat4(tmp, size); | size_to_mat4(tmp, size); | ||||
| copy_v3_v3(tmp[3], center); | copy_v3_v3(tmp[3], center); | ||||
| mul_m4_m4m4(tmp, ob->obmat, tmp); | mul_m4_m4m4(tmp, obmat, tmp); | ||||
| DRW_buffer_add_entry(sgl->empties.cube, color, &one, tmp); | DRW_buffer_add_entry(sgl->empties.cube, color, &one, tmp); | ||||
| break; | break; | ||||
| case OB_BOUND_SPHERE: | case OB_BOUND_SPHERE: | ||||
| size[0] = max_fff(size[0], size[1], size[2]); | size[0] = max_fff(size[0], size[1], size[2]); | ||||
| size[1] = size[2] = size[0]; | size[1] = size[2] = size[0]; | ||||
| size_to_mat4(tmp, size); | size_to_mat4(tmp, size); | ||||
| copy_v3_v3(tmp[3], center); | copy_v3_v3(tmp[3], center); | ||||
| mul_m4_m4m4(tmp, ob->obmat, tmp); | mul_m4_m4m4(tmp, obmat, tmp); | ||||
| DRW_buffer_add_entry(sgl->empties.sphere, color, &one, tmp); | DRW_buffer_add_entry(sgl->empties.sphere, color, &one, tmp); | ||||
| break; | break; | ||||
| case OB_BOUND_CYLINDER: | case OB_BOUND_CYLINDER: | ||||
| size[0] = max_ff(size[0], size[1]); | size[0] = max_ff(size[0], size[1]); | ||||
| size[1] = size[0]; | size[1] = size[0]; | ||||
| size_to_mat4(tmp, size); | size_to_mat4(tmp, size); | ||||
| copy_v3_v3(tmp[3], center); | copy_v3_v3(tmp[3], center); | ||||
| mul_m4_m4m4(tmp, ob->obmat, tmp); | mul_m4_m4m4(tmp, obmat, tmp); | ||||
| DRW_buffer_add_entry(sgl->empties.cylinder, color, &one, tmp); | DRW_buffer_add_entry(sgl->empties.cylinder, color, &one, tmp); | ||||
| break; | break; | ||||
| case OB_BOUND_CONE: | case OB_BOUND_CONE: | ||||
| size[0] = max_ff(size[0], size[1]); | size[0] = max_ff(size[0], size[1]); | ||||
| size[1] = size[0]; | size[1] = size[0]; | ||||
| size_to_mat4(tmp, size); | size_to_mat4(tmp, size); | ||||
| copy_v3_v3(tmp[3], center); | copy_v3_v3(tmp[3], center); | ||||
| /* Cone batch has base at 0 and is pointing towards +Y. */ | /* Cone batch has base at 0 and is pointing towards +Y. */ | ||||
| swap_v3_v3(tmp[1], tmp[2]); | swap_v3_v3(tmp[1], tmp[2]); | ||||
| tmp[3][2] -= size[2]; | tmp[3][2] -= size[2]; | ||||
| mul_m4_m4m4(tmp, ob->obmat, tmp); | mul_m4_m4m4(tmp, obmat, tmp); | ||||
| DRW_buffer_add_entry(sgl->empties.cone, color, &one, tmp); | DRW_buffer_add_entry(sgl->empties.cone, color, &one, tmp); | ||||
| break; | break; | ||||
| case OB_BOUND_CAPSULE: | case OB_BOUND_CAPSULE: | ||||
| size[0] = max_ff(size[0], size[1]); | size[0] = max_ff(size[0], size[1]); | ||||
| size[1] = size[0]; | size[1] = size[0]; | ||||
| scale_m4_fl(tmp, size[0]); | scale_m4_fl(tmp, size[0]); | ||||
| copy_v2_v2(tmp[3], center); | copy_v2_v2(tmp[3], center); | ||||
| tmp[3][2] = center[2] + max_ff(0.0f, size[2] - size[0]); | tmp[3][2] = center[2] + max_ff(0.0f, size[2] - size[0]); | ||||
| mul_m4_m4m4(final_mat, ob->obmat, tmp); | mul_m4_m4m4(final_mat, obmat, tmp); | ||||
| DRW_buffer_add_entry(sgl->empties.capsule_cap, color, &one, final_mat); | DRW_buffer_add_entry(sgl->empties.capsule_cap, color, &one, final_mat); | ||||
| negate_v3(tmp[2]); | negate_v3(tmp[2]); | ||||
| tmp[3][2] = center[2] - max_ff(0.0f, size[2] - size[0]); | tmp[3][2] = center[2] - max_ff(0.0f, size[2] - size[0]); | ||||
| mul_m4_m4m4(final_mat, ob->obmat, tmp); | mul_m4_m4m4(final_mat, obmat, tmp); | ||||
| DRW_buffer_add_entry(sgl->empties.capsule_cap, color, &one, final_mat); | DRW_buffer_add_entry(sgl->empties.capsule_cap, color, &one, final_mat); | ||||
| tmp[2][2] = max_ff(0.0f, size[2] * 2.0f - size[0] * 2.0f); | tmp[2][2] = max_ff(0.0f, size[2] * 2.0f - size[0] * 2.0f); | ||||
| mul_m4_m4m4(final_mat, ob->obmat, tmp); | mul_m4_m4m4(final_mat, obmat, tmp); | ||||
| DRW_buffer_add_entry(sgl->empties.capsule_body, color, &one, final_mat); | DRW_buffer_add_entry(sgl->empties.capsule_body, color, &one, final_mat); | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| static void DRW_shgroup_bounds(OBJECT_ShadingGroupList *sgl, Object *ob, int theme_id) | |||||
| { | |||||
| float color[4]; | |||||
| 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, | |||||
| OB_GPENCIL)) { | |||||
| 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); | |||||
| drw_shgroup_bounds(sgl, bb, ob->obmat, color, ob->boundtype); | |||||
| } | |||||
| static void DRW_shgroup_rigidbody_shape(OBJECT_ShadingGroupList *sgl, Object *ob, int theme_id) | |||||
| { | |||||
| BoundBox *bb = BKE_object_boundbox_get(ob); | |||||
| if (bb == NULL) { | |||||
| return; | |||||
| } | |||||
| char boundtype = 0; | |||||
| switch (ob->rigidbody_object->shape) { | |||||
| case RB_SHAPE_BOX: | |||||
| boundtype = OB_BOUND_BOX; | |||||
| break; | |||||
| case RB_SHAPE_SPHERE: | |||||
| boundtype = OB_BOUND_SPHERE; | |||||
| break; | |||||
| case RB_SHAPE_CYLINDER: | |||||
| boundtype = OB_BOUND_CYLINDER; | |||||
| break; | |||||
| case RB_SHAPE_CONE: | |||||
| boundtype = OB_BOUND_CONE; | |||||
| break; | |||||
| case RB_SHAPE_CAPSULE: | |||||
| boundtype = OB_BOUND_CAPSULE; | |||||
| break; | |||||
| default: | |||||
| return; | |||||
| } | |||||
| float color[4]; | |||||
| UI_GetThemeColor4fv(theme_id, color); | |||||
| drw_shgroup_bounds(sgl, bb, ob->obmat, color, boundtype); | |||||
| } | |||||
| static void OBJECT_cache_populate_particles(OBJECT_Shaders *sh_data, | static void OBJECT_cache_populate_particles(OBJECT_Shaders *sh_data, | ||||
| Object *ob, | Object *ob, | ||||
| OBJECT_PassList *psl) | OBJECT_PassList *psl) | ||||
| { | { | ||||
| for (ParticleSystem *psys = ob->particlesystem.first; psys; psys = psys->next) { | for (ParticleSystem *psys = ob->particlesystem.first; psys; psys = psys->next) { | ||||
| if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) { | if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 258 Lines • ▼ Show 20 Lines | switch (ob->type) { | ||||
| if (theme_id == TH_UNDEFINED) { | if (theme_id == TH_UNDEFINED) { | ||||
| theme_id = DRW_object_wire_theme_get(ob, view_layer, NULL); | theme_id = DRW_object_wire_theme_get(ob, view_layer, NULL); | ||||
| } | } | ||||
| shgroup = shgroup_theme_id_to_wire(sgl, theme_id, ob->base_flag); | shgroup = shgroup_theme_id_to_wire(sgl, theme_id, ob->base_flag); | ||||
| DRW_shgroup_call(shgroup, geom, ob); | DRW_shgroup_call(shgroup, geom, ob); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| if (ob->rigidbody_object) { | |||||
| DRW_shgroup_rigidbody_shape(sgl, ob, theme_id); | |||||
| } | |||||
| break; | break; | ||||
| } | } | ||||
| case OB_SURF: { | case OB_SURF: { | ||||
| if (hide_object_extra) { | if (hide_object_extra) { | ||||
| break; | break; | ||||
| } | } | ||||
| geom = DRW_cache_surf_edge_wire_get(ob); | geom = DRW_cache_surf_edge_wire_get(ob); | ||||
| if (geom == NULL) { | if (geom == NULL) { | ||||
| ▲ Show 20 Lines • Show All 377 Lines • Show Last 20 Lines | |||||