Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/intern/draw_cache_extract_mesh.c
| Show First 20 Lines • Show All 97 Lines • ▼ Show 20 Lines | typedef struct MeshRenderData { | ||||
| /** Use for #MeshStatVis calculation which use world-space coords. */ | /** Use for #MeshStatVis calculation which use world-space coords. */ | ||||
| float obmat[4][4]; | float obmat[4][4]; | ||||
| const ToolSettings *toolsettings; | const ToolSettings *toolsettings; | ||||
| /** Edit Mesh */ | /** Edit Mesh */ | ||||
| BMEditMesh *edit_bmesh; | BMEditMesh *edit_bmesh; | ||||
| BMesh *bm; | BMesh *bm; | ||||
| /** | |||||
| * Point to #MeshRenderData.me.runtime.edit_data | |||||
| * This is not the same edit_data as the `edit_data` from `Object.data.runtime.edit_data`. | |||||
| */ | |||||
| EditMeshData *edit_data; | EditMeshData *edit_data; | ||||
| /* For deformed edit-mesh data. */ | /* For deformed edit-mesh data. */ | ||||
| /* Use for #ME_WRAPPER_TYPE_BMESH. */ | /* Use for #ME_WRAPPER_TYPE_BMESH. */ | ||||
| const float (*bm_vert_coords)[3]; | const float (*bm_vert_coords)[3]; | ||||
| const float (*bm_vert_normals)[3]; | const float (*bm_vert_normals)[3]; | ||||
| const float (*bm_poly_normals)[3]; | const float (*bm_poly_normals)[3]; | ||||
| const float (*bm_poly_centers)[3]; | const float (*bm_poly_centers)[3]; | ||||
| ▲ Show 20 Lines • Show All 216 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| MeshRenderData *mr = MEM_callocN(sizeof(*mr), __func__); | MeshRenderData *mr = MEM_callocN(sizeof(*mr), __func__); | ||||
| mr->toolsettings = ts; | mr->toolsettings = ts; | ||||
| mr->mat_len = mesh_render_mat_len_get(me); | mr->mat_len = mesh_render_mat_len_get(me); | ||||
| copy_m4_m4(mr->obmat, obmat); | copy_m4_m4(mr->obmat, obmat); | ||||
| if (is_editmode) { | if (is_editmode) { | ||||
| BLI_assert(me->edit_mesh->mesh_eval_cage && me->edit_mesh->mesh_eval_final); | { | ||||
| EditMeshData *emd = me->runtime.edit_data; | |||||
| BLI_assert(emd != NULL); | |||||
| BLI_assert((emd->eval.mesh_eval_cage && emd->eval.mesh_eval_final)); | |||||
| mr->bm = me->edit_mesh->bm; | mr->bm = me->edit_mesh->bm; | ||||
| mr->edit_bmesh = me->edit_mesh; | mr->edit_bmesh = me->edit_mesh; | ||||
| mr->me = (do_final) ? me->edit_mesh->mesh_eval_final : me->edit_mesh->mesh_eval_cage; | mr->me = (do_final) ? emd->eval.mesh_eval_final : emd->eval.mesh_eval_cage; | ||||
| mr->edit_data = is_mode_active ? mr->me->runtime.edit_data : NULL; | mr->edit_data = is_mode_active ? mr->me->runtime.edit_data : NULL; | ||||
| } | |||||
| if (mr->edit_data) { | if (mr->edit_data) { | ||||
| EditMeshData *emd_final = mr->edit_data; | |||||
| if (emd_final->vertexCos) { | |||||
| BKE_editmesh_cache_ensure_vert_normals(mr->edit_bmesh, emd_final); | |||||
| BKE_editmesh_cache_ensure_poly_normals(mr->edit_bmesh, emd_final); | |||||
| } | |||||
| mr->bm_vert_coords = mr->edit_data->vertexCos; | |||||
| mr->bm_vert_normals = mr->edit_data->vertexNos; | |||||
| mr->bm_poly_normals = mr->edit_data->polyNos; | |||||
| mr->bm_poly_centers = mr->edit_data->polyCos; | |||||
| } | |||||
| #if 0 | |||||
| BLI_assert(me->runtime.edit_data != NULL); | |||||
| mr->edit_data = is_mode_active ? mr->me->runtime.edit_data : NULL; | |||||
| EditMeshData *emd = mr->edit_data; | EditMeshData *emd = mr->edit_data; | ||||
| mr->bm = me->edit_mesh->bm; | |||||
| mr->edit_bmesh = me->edit_mesh; | |||||
| mr->me = (do_final) ? mr->me->runtime.edit_data->eval.mesh_eval_final : | |||||
| mr->me->runtime.edit_data->eval.mesh_eval_cage; | |||||
| if (emd != NULL) { | |||||
| BLI_assert(emd->eval.mesh_eval_cage && emd->eval.mesh_eval_final); | |||||
| if (emd->vertexCos) { | if (emd->vertexCos) { | ||||
| BKE_editmesh_cache_ensure_vert_normals(mr->edit_bmesh, emd); | BKE_editmesh_cache_ensure_vert_normals(mr->edit_bmesh, emd); | ||||
| BKE_editmesh_cache_ensure_poly_normals(mr->edit_bmesh, emd); | BKE_editmesh_cache_ensure_poly_normals(mr->edit_bmesh, emd); | ||||
| } | } | ||||
| mr->bm_vert_coords = mr->edit_data->vertexCos; | mr->bm_vert_coords = mr->edit_data->vertexCos; | ||||
| mr->bm_vert_normals = mr->edit_data->vertexNos; | mr->bm_vert_normals = mr->edit_data->vertexNos; | ||||
| mr->bm_poly_normals = mr->edit_data->polyNos; | mr->bm_poly_normals = mr->edit_data->polyNos; | ||||
| mr->bm_poly_centers = mr->edit_data->polyCos; | mr->bm_poly_centers = mr->edit_data->polyCos; | ||||
| } | } | ||||
| #endif | |||||
| bool has_mdata = is_mode_active && (mr->me->runtime.wrapper_type == ME_WRAPPER_TYPE_MDATA); | bool has_mdata = is_mode_active && (mr->me->runtime.wrapper_type == ME_WRAPPER_TYPE_MDATA); | ||||
| bool use_mapped = is_mode_active && | bool use_mapped = is_mode_active && | ||||
| (has_mdata && !do_uvedit && mr->me && !mr->me->runtime.is_original); | (has_mdata && !do_uvedit && mr->me && !mr->me->runtime.is_original); | ||||
| int bm_ensure_types = BM_VERT | BM_EDGE | BM_LOOP | BM_FACE; | int bm_ensure_types = BM_VERT | BM_EDGE | BM_LOOP | BM_FACE; | ||||
| BM_mesh_elem_index_ensure(mr->bm, bm_ensure_types); | BM_mesh_elem_index_ensure(mr->bm, bm_ensure_types); | ||||
| Show All 18 Lines | if (use_mapped) { | ||||
| use_mapped = (mr->v_origindex || mr->e_origindex || mr->p_origindex); | use_mapped = (mr->v_origindex || mr->e_origindex || mr->p_origindex); | ||||
| } | } | ||||
| mr->extract_type = use_mapped ? MR_EXTRACT_MAPPED : MR_EXTRACT_BMESH; | mr->extract_type = use_mapped ? MR_EXTRACT_MAPPED : MR_EXTRACT_BMESH; | ||||
| /* Seems like the mesh_eval_final do not have the right origin indices. | /* Seems like the mesh_eval_final do not have the right origin indices. | ||||
| * Force not mapped in this case. */ | * Force not mapped in this case. */ | ||||
| if (has_mdata && do_final && me->edit_mesh->mesh_eval_final != me->edit_mesh->mesh_eval_cage) { | if (has_mdata && do_final && | ||||
| (me->runtime.edit_data->eval.mesh_eval_final != | |||||
| me->runtime.edit_data->eval.mesh_eval_cage)) { | |||||
| // mr->edit_bmesh = NULL; | // mr->edit_bmesh = NULL; | ||||
| mr->extract_type = MR_EXTRACT_MESH; | mr->extract_type = MR_EXTRACT_MESH; | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| mr->me = me; | mr->me = me; | ||||
| mr->edit_bmesh = NULL; | mr->edit_bmesh = NULL; | ||||
| ▲ Show 20 Lines • Show All 5,767 Lines • Show Last 20 Lines | |||||