Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/intern/draw_cache_extract_mesh.c
| Show First 20 Lines • Show All 185 Lines • ▼ Show 20 Lines | #endif | ||||
| if (do_final && me->edit_mesh->mesh_eval_final != me->edit_mesh->mesh_eval_cage) { | if (do_final && me->edit_mesh->mesh_eval_final != me->edit_mesh->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; | ||||
| mr->extract_type = MR_EXTRACT_MESH; | |||||
| bool use_mapped = mr->me && !mr->me->runtime.is_original; | |||||
| if (use_mapped) { | |||||
| mr->v_origindex = CustomData_get_layer(&mr->me->vdata, CD_ORIGINDEX); | |||||
| mr->e_origindex = CustomData_get_layer(&mr->me->edata, CD_ORIGINDEX); | |||||
| mr->p_origindex = CustomData_get_layer(&mr->me->pdata, CD_ORIGINDEX); | |||||
| use_mapped = (mr->v_origindex || mr->e_origindex || mr->p_origindex); | |||||
| } | |||||
| mr->extract_type = use_mapped ? MR_EXTRACT_MAPPED : MR_EXTRACT_MESH; | |||||
| } | } | ||||
| if (mr->extract_type != MR_EXTRACT_BMESH) { | if (mr->extract_type != MR_EXTRACT_BMESH) { | ||||
| /* Mesh */ | /* Mesh */ | ||||
| mr->vert_len = mr->me->totvert; | mr->vert_len = mr->me->totvert; | ||||
| mr->edge_len = mr->me->totedge; | mr->edge_len = mr->me->totedge; | ||||
| mr->loop_len = mr->me->totloop; | mr->loop_len = mr->me->totloop; | ||||
| mr->poly_len = mr->me->totpoly; | mr->poly_len = mr->me->totpoly; | ||||
| ▲ Show 20 Lines • Show All 716 Lines • ▼ Show 20 Lines | |||||
| static void extract_lines_paint_mask_loop_mesh(const MeshRenderData *mr, | static void extract_lines_paint_mask_loop_mesh(const MeshRenderData *mr, | ||||
| int l, | int l, | ||||
| const MLoop *mloop, | const MLoop *mloop, | ||||
| int UNUSED(p), | int UNUSED(p), | ||||
| const MPoly *mpoly, | const MPoly *mpoly, | ||||
| void *_data) | void *_data) | ||||
| { | { | ||||
| MeshExtract_LinePaintMask_Data *data = (MeshExtract_LinePaintMask_Data *)_data; | MeshExtract_LinePaintMask_Data *data = (MeshExtract_LinePaintMask_Data *)_data; | ||||
| if (!(mr->use_hide && (mpoly->flag & ME_HIDE))) { | const int edge_idx = mloop->e; | ||||
| const MEdge *medge = &mr->medge[edge_idx]; | |||||
| if (!((mr->use_hide && (medge->flag & ME_HIDE)) || | |||||
| ((mr->extract_type == MR_EXTRACT_MAPPED) && | |||||
| (mr->e_origindex[edge_idx] == ORIGINDEX_NONE)))) { | |||||
| int loopend = mpoly->totloop + mpoly->loopstart - 1; | int loopend = mpoly->totloop + mpoly->loopstart - 1; | ||||
| int other_loop = (l == loopend) ? mpoly->loopstart : (l + 1); | int other_loop = (l == loopend) ? mpoly->loopstart : (l + 1); | ||||
| int edge_idx = mloop->e; | |||||
| if (mpoly->flag & ME_FACE_SEL) { | if (mpoly->flag & ME_FACE_SEL) { | ||||
| if (BLI_BITMAP_TEST_AND_SET_ATOMIC(data->select_map, edge_idx)) { | if (BLI_BITMAP_TEST_AND_SET_ATOMIC(data->select_map, edge_idx)) { | ||||
| /* Hide edge as it has more than 2 selected loop. */ | /* Hide edge as it has more than 2 selected loop. */ | ||||
| GPU_indexbuf_set_line_restart(&data->elb, edge_idx); | GPU_indexbuf_set_line_restart(&data->elb, edge_idx); | ||||
| } | } | ||||
| else { | else { | ||||
| /* First selected loop. Set edge visible, overwritting any unsel loop. */ | /* First selected loop. Set edge visible, overwritting any unsel loop. */ | ||||
| GPU_indexbuf_set_line_verts(&data->elb, edge_idx, l, other_loop); | GPU_indexbuf_set_line_verts(&data->elb, edge_idx, l, other_loop); | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| /* Set theses unselected loop only if this edge has no other selected loop. */ | /* Set theses unselected loop only if this edge has no other selected loop. */ | ||||
| if (!BLI_BITMAP_TEST(data->select_map, edge_idx)) { | if (!BLI_BITMAP_TEST(data->select_map, edge_idx)) { | ||||
| GPU_indexbuf_set_line_verts(&data->elb, edge_idx, l, other_loop); | GPU_indexbuf_set_line_verts(&data->elb, edge_idx, l, other_loop); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| else { | |||||
| GPU_indexbuf_set_line_restart(&data->elb, edge_idx); | |||||
| } | |||||
| } | } | ||||
| static void extract_lines_paint_mask_finish(const MeshRenderData *UNUSED(mr), | static void extract_lines_paint_mask_finish(const MeshRenderData *UNUSED(mr), | ||||
| void *ibo, | void *ibo, | ||||
| void *_data) | void *_data) | ||||
| { | { | ||||
| MeshExtract_LinePaintMask_Data *data = (MeshExtract_LinePaintMask_Data *)_data; | MeshExtract_LinePaintMask_Data *data = (MeshExtract_LinePaintMask_Data *)_data; | ||||
| GPU_indexbuf_build_in_place(&data->elb, ibo); | GPU_indexbuf_build_in_place(&data->elb, ibo); | ||||
| ▲ Show 20 Lines • Show All 539 Lines • ▼ Show 20 Lines | static void extract_pos_nor_loop_mesh(const MeshRenderData *mr, | ||||
| void *_data) | void *_data) | ||||
| { | { | ||||
| MeshExtract_PosNor_Data *data = _data; | MeshExtract_PosNor_Data *data = _data; | ||||
| PosNorLoop *vert = data->vbo_data + l; | PosNorLoop *vert = data->vbo_data + l; | ||||
| const MVert *mvert = &mr->mvert[mloop->v]; | const MVert *mvert = &mr->mvert[mloop->v]; | ||||
| copy_v3_v3(vert->pos, mvert->co); | copy_v3_v3(vert->pos, mvert->co); | ||||
| vert->nor = data->packed_nor[mloop->v]; | vert->nor = data->packed_nor[mloop->v]; | ||||
| /* Flag for paint mode overlay. */ | /* Flag for paint mode overlay. */ | ||||
| if (mpoly->flag & ME_HIDE || mvert->flag & ME_HIDE) { | if (mpoly->flag & ME_HIDE || mvert->flag & ME_HIDE || | ||||
| ((mr->extract_type == MR_EXTRACT_MAPPED) && (mr->v_origindex[mloop->v] == ORIGINDEX_NONE))) { | |||||
| vert->nor.w = -1; | vert->nor.w = -1; | ||||
| } | } | ||||
| else if (mvert->flag & SELECT) { | else if (mvert->flag & SELECT) { | ||||
| vert->nor.w = 1; | vert->nor.w = 1; | ||||
| } | } | ||||
| else { | else { | ||||
| vert->nor.w = 0; | vert->nor.w = 0; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 3,226 Lines • Show Last 20 Lines | |||||