Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/draw/intern')
-rw-r--r--source/blender/draw/intern/draw_cache_impl_mesh.c126
1 files changed, 47 insertions, 79 deletions
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 7dba612f32f..f2518bb8eca 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -2305,28 +2305,6 @@ static void mesh_create_pos_and_nor_tess(MeshRenderData *rdata, GPUVertBuf *vbo,
}
}
-BLI_INLINE void mesh_edit_add_select_index(GPUVertBufRaw *buf, GPUVertCompType comp, uint index)
-{
- /* We don't need to sanitize the value because the elements
- * with these undefined values will never get drawn. */
- switch (comp) {
- case GPU_COMP_U32:
- *((uint *)GPU_vertbuf_raw_step(buf)) = index;
- break;
- case GPU_COMP_U16:
- *((ushort *)GPU_vertbuf_raw_step(buf)) = (ushort)index;
- break;
- case GPU_COMP_U8:
- *((uchar *)GPU_vertbuf_raw_step(buf)) = (uchar)index;
- break;
- default:
- BLI_assert(0);
- break;
- }
-}
-
-#define SELECT_COMP_FORMAT(el_len) (el_len > 0xFF ? (el_len > 0xFFFF ? GPU_COMP_U32 : GPU_COMP_U16) : GPU_COMP_U8)
-
static void mesh_create_edit_vertex_loops(
MeshRenderData *rdata,
GPUVertBuf *vbo_pos_nor,
@@ -2344,69 +2322,60 @@ static void mesh_create_edit_vertex_loops(
const int ledge_len = mesh_render_data_loose_edges_len_get_maybe_mapped(rdata);
const int loop_len = mesh_render_data_loops_len_get_maybe_mapped(rdata);
const int tot_loop_len = loop_len + ledge_len * 2 + lvert_len;
- static struct { uint vert, edge, face, pos, nor, lnor, data, uvs; } attr_id;
float (*lnors)[3] = rdata->loop_normals;
uchar fflag;
- /* Choose the most compact vertex format. */
- GPUVertCompType vert_comp = SELECT_COMP_FORMAT(vert_len);
- GPUVertCompType edge_comp = SELECT_COMP_FORMAT(edge_len);
- GPUVertCompType face_comp = SELECT_COMP_FORMAT(poly_len);
-
- GPUVertFormat format_vert_idx = { 0 }, format_edge_idx = { 0 }, format_face_idx = { 0 };
- attr_id.vert = GPU_vertformat_attr_add(&format_vert_idx, "color", vert_comp, 1, GPU_FETCH_INT);
- attr_id.edge = GPU_vertformat_attr_add(&format_edge_idx, "color", edge_comp, 1, GPU_FETCH_INT);
- attr_id.face = GPU_vertformat_attr_add(&format_face_idx, "color", face_comp, 1, GPU_FETCH_INT);
-
/* Static formats */
- static GPUVertFormat format_pos_nor = { 0 }, format_lnor = { 0 }, format_flag = { 0 }, format_uv = { 0 };
- if (format_pos_nor.attr_len == 0) {
- attr_id.pos = GPU_vertformat_attr_add(&format_pos_nor, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
- attr_id.nor = GPU_vertformat_attr_add(&format_pos_nor, "vnor", GPU_COMP_I10, 3, GPU_FETCH_INT_TO_FLOAT_UNIT);
- attr_id.lnor = GPU_vertformat_attr_add(&format_lnor, "lnor", GPU_COMP_I10, 3, GPU_FETCH_INT_TO_FLOAT_UNIT);
- attr_id.data = GPU_vertformat_attr_add(&format_flag, "data", GPU_COMP_U8, 4, GPU_FETCH_INT);
- attr_id.uvs = GPU_vertformat_attr_add(&format_uv, "u", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
- GPU_vertformat_alias_add(&format_uv, "pos");
- GPU_vertformat_alias_add(&format_flag, "flag");
+ static struct { GPUVertFormat sel_id, pos_nor, lnor, flag, uv; } format = { 0 };
+ static struct { uint sel_id, pos, nor, lnor, data, uvs; } attr_id;
+ if (format.sel_id.attr_len == 0) {
+ attr_id.sel_id = GPU_vertformat_attr_add(&format.sel_id, "color", GPU_COMP_U32, 1, GPU_FETCH_INT);
+ attr_id.pos = GPU_vertformat_attr_add(&format.pos_nor, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+ attr_id.nor = GPU_vertformat_attr_add(&format.pos_nor, "vnor", GPU_COMP_I10, 3, GPU_FETCH_INT_TO_FLOAT_UNIT);
+ attr_id.lnor = GPU_vertformat_attr_add(&format.lnor, "lnor", GPU_COMP_I10, 3, GPU_FETCH_INT_TO_FLOAT_UNIT);
+ attr_id.data = GPU_vertformat_attr_add(&format.flag, "data", GPU_COMP_U8, 4, GPU_FETCH_INT);
+ attr_id.uvs = GPU_vertformat_attr_add(&format.uv, "u", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+ GPU_vertformat_alias_add(&format.uv, "pos");
+ GPU_vertformat_alias_add(&format.flag, "flag");
}
GPUVertBufRaw raw_verts, raw_edges, raw_faces, raw_pos, raw_nor, raw_lnor, raw_uv, raw_data;
if (DRW_TEST_ASSIGN_VBO(vbo_pos_nor)) {
- GPU_vertbuf_init_with_format(vbo_pos_nor, &format_pos_nor);
+ GPU_vertbuf_init_with_format(vbo_pos_nor, &format.pos_nor);
GPU_vertbuf_data_alloc(vbo_pos_nor, tot_loop_len);
GPU_vertbuf_attr_get_raw_data(vbo_pos_nor, attr_id.pos, &raw_pos);
GPU_vertbuf_attr_get_raw_data(vbo_pos_nor, attr_id.nor, &raw_nor);
}
if (DRW_TEST_ASSIGN_VBO(vbo_lnor)) {
- GPU_vertbuf_init_with_format(vbo_lnor, &format_lnor);
+ GPU_vertbuf_init_with_format(vbo_lnor, &format.lnor);
GPU_vertbuf_data_alloc(vbo_lnor, tot_loop_len);
GPU_vertbuf_attr_get_raw_data(vbo_lnor, attr_id.lnor, &raw_lnor);
}
if (DRW_TEST_ASSIGN_VBO(vbo_data)) {
- GPU_vertbuf_init_with_format(vbo_data, &format_flag);
+ GPU_vertbuf_init_with_format(vbo_data, &format.flag);
GPU_vertbuf_data_alloc(vbo_data, tot_loop_len);
GPU_vertbuf_attr_get_raw_data(vbo_data, attr_id.data, &raw_data);
}
if (DRW_TEST_ASSIGN_VBO(vbo_uv)) {
- GPU_vertbuf_init_with_format(vbo_uv, &format_uv);
+ GPU_vertbuf_init_with_format(vbo_uv, &format.uv);
GPU_vertbuf_data_alloc(vbo_uv, tot_loop_len);
GPU_vertbuf_attr_get_raw_data(vbo_uv, attr_id.uvs, &raw_uv);
}
/* Select Idx */
if (DRW_TEST_ASSIGN_VBO(vbo_verts)) {
- GPU_vertbuf_init_with_format(vbo_verts, &format_vert_idx);
+ GPU_vertbuf_init_with_format(vbo_verts, &format.sel_id);
GPU_vertbuf_data_alloc(vbo_verts, tot_loop_len);
- GPU_vertbuf_attr_get_raw_data(vbo_verts, attr_id.vert, &raw_verts);
+ GPU_vertbuf_attr_get_raw_data(vbo_verts, attr_id.sel_id, &raw_verts);
}
if (DRW_TEST_ASSIGN_VBO(vbo_edges)) {
- GPU_vertbuf_init_with_format(vbo_edges, &format_edge_idx);
+ GPU_vertbuf_init_with_format(vbo_edges, &format.sel_id);
GPU_vertbuf_data_alloc(vbo_edges, tot_loop_len);
- GPU_vertbuf_attr_get_raw_data(vbo_edges, attr_id.edge, &raw_edges);
+ GPU_vertbuf_attr_get_raw_data(vbo_edges, attr_id.sel_id, &raw_edges);
}
if (DRW_TEST_ASSIGN_VBO(vbo_faces)) {
- GPU_vertbuf_init_with_format(vbo_faces, &format_face_idx);
+ GPU_vertbuf_init_with_format(vbo_faces, &format.sel_id);
GPU_vertbuf_data_alloc(vbo_faces, tot_loop_len);
- GPU_vertbuf_attr_get_raw_data(vbo_faces, attr_id.face, &raw_faces);
+ GPU_vertbuf_attr_get_raw_data(vbo_faces, attr_id.sel_id, &raw_faces);
}
if (rdata->edit_bmesh && rdata->mapped.use == false) {
@@ -2449,14 +2418,14 @@ static void mesh_create_edit_vertex_loops(
/* Select Idx */
if (vbo_verts) {
int vidx = BM_elem_index_get(loop->v);
- mesh_edit_add_select_index(&raw_verts, vert_comp, vidx);
+ *((uint *)GPU_vertbuf_raw_step(&raw_verts)) = vidx;
}
if (vbo_edges) {
int eidx = BM_elem_index_get(loop->e);
- mesh_edit_add_select_index(&raw_edges, edge_comp, eidx);
+ *((uint *)GPU_vertbuf_raw_step(&raw_edges)) = eidx;
}
if (vbo_faces) {
- mesh_edit_add_select_index(&raw_faces, face_comp, fidx);
+ *((uint *)GPU_vertbuf_raw_step(&raw_faces)) = fidx;
}
}
}
@@ -2481,11 +2450,11 @@ static void mesh_create_edit_vertex_loops(
/* Select Idx */
if (vbo_verts) {
int vidx = BM_elem_index_get(eve);
- mesh_edit_add_select_index(&raw_verts, vert_comp, vidx);
+ *((uint *)GPU_vertbuf_raw_step(&raw_verts)) = vidx;
}
if (vbo_edges) {
int eidx = BM_elem_index_get(eed);
- mesh_edit_add_select_index(&raw_edges, edge_comp, eidx);
+ *((uint *)GPU_vertbuf_raw_step(&raw_edges)) = eidx;
}
}
}
@@ -2508,7 +2477,7 @@ static void mesh_create_edit_vertex_loops(
/* Select Idx */
if (vbo_verts) {
int vidx = BM_elem_index_get(eve);
- mesh_edit_add_select_index(&raw_verts, vert_comp, vidx);
+ *((uint *)GPU_vertbuf_raw_step(&raw_verts)) = vidx;
}
}
}
@@ -2581,14 +2550,14 @@ static void mesh_create_edit_vertex_loops(
/* Select Idx */
if (vbo_verts) {
int vidx = v_origindex[l->v];
- mesh_edit_add_select_index(&raw_verts, vert_comp, vidx);
+ *((uint *)GPU_vertbuf_raw_step(&raw_verts)) = vidx;
}
if (vbo_edges) {
int eidx = e_origindex[l->e];
- mesh_edit_add_select_index(&raw_edges, edge_comp, eidx);
+ *((uint *)GPU_vertbuf_raw_step(&raw_edges)) = eidx;
}
if (vbo_faces) {
- mesh_edit_add_select_index(&raw_faces, face_comp, fidx);
+ *((uint *)GPU_vertbuf_raw_step(&raw_faces)) = fidx;
}
}
}
@@ -2622,11 +2591,11 @@ static void mesh_create_edit_vertex_loops(
/* Select Idx */
if (vbo_verts) {
int vidx = v_origindex[v];
- mesh_edit_add_select_index(&raw_verts, vert_comp, vidx);
+ *((uint *)GPU_vertbuf_raw_step(&raw_verts)) = vidx;
}
if (vbo_edges) {
int eidx = e_origindex[e];
- mesh_edit_add_select_index(&raw_edges, edge_comp, eidx);
+ *((uint *)GPU_vertbuf_raw_step(&raw_edges)) = eidx;
}
}
}
@@ -2653,7 +2622,7 @@ static void mesh_create_edit_vertex_loops(
/* Select Idx */
if (vbo_verts) {
int vidx = v_origindex[v];
- mesh_edit_add_select_index(&raw_verts, vert_comp, vidx);
+ *((uint *)GPU_vertbuf_raw_step(&raw_verts)) = vidx;
}
}
}
@@ -2691,14 +2660,14 @@ static void mesh_create_edit_vertex_loops(
/* Select Idx */
if (vbo_verts) {
int vidx = v_origindex ? v_origindex[l->v] : l->v;
- mesh_edit_add_select_index(&raw_verts, vert_comp, vidx);
+ *((uint *)GPU_vertbuf_raw_step(&raw_verts)) = vidx;
}
if (vbo_edges) {
int eidx = e_origindex ? e_origindex[l->e] : l->e;
- mesh_edit_add_select_index(&raw_edges, edge_comp, eidx);
+ *((uint *)GPU_vertbuf_raw_step(&raw_edges)) = eidx;
}
if (vbo_faces) {
- mesh_edit_add_select_index(&raw_faces, face_comp, fidx);
+ *((uint *)GPU_vertbuf_raw_step(&raw_faces)) = fidx;
}
}
}
@@ -2716,10 +2685,10 @@ static void mesh_create_edit_vertex_loops(
copy_v3_v3(GPU_vertbuf_raw_step(&raw_pos), mvert[vidx].co);
}
if (vbo_verts) {
- mesh_edit_add_select_index(&raw_verts, vert_comp, vidx);
+ *((uint *)GPU_vertbuf_raw_step(&raw_verts)) = vidx;
}
if (vbo_edges) {
- mesh_edit_add_select_index(&raw_edges, edge_comp, eidx);
+ *((uint *)GPU_vertbuf_raw_step(&raw_edges)) = eidx;
}
}
}
@@ -2734,7 +2703,7 @@ static void mesh_create_edit_vertex_loops(
copy_v3_v3(GPU_vertbuf_raw_step(&raw_pos), mvert->co);
}
if (vbo_verts) {
- mesh_edit_add_select_index(&raw_verts, vert_comp, vidx);
+ *((uint *)GPU_vertbuf_raw_step(&raw_verts)) = vidx;
}
}
}
@@ -2751,11 +2720,11 @@ static void mesh_create_edit_facedots_select_id(
{
const int poly_len = mesh_render_data_polys_len_get_maybe_mapped(rdata);
- GPUVertCompType comp = SELECT_COMP_FORMAT(poly_len);
-
- GPUVertFormat format = { 0 };
- struct { uint idx; } attr_id;
- attr_id.idx = GPU_vertformat_attr_add(&format, "color", comp, 1, GPU_FETCH_INT);
+ static GPUVertFormat format = { 0 };
+ static struct { uint idx; } attr_id;
+ if (format.attr_len == 0) {
+ attr_id.idx = GPU_vertformat_attr_add(&format, "color", GPU_COMP_U32, 1, GPU_FETCH_INT);
+ }
GPUVertBufRaw idx_step;
GPU_vertbuf_init_with_format(vbo, &format);
@@ -2768,13 +2737,13 @@ static void mesh_create_edit_facedots_select_id(
for (int poly = 0; poly < poly_len; poly++) {
const BMFace *efa = BM_face_at_index(rdata->edit_bmesh->bm, poly);
if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
- mesh_edit_add_select_index(&idx_step, comp, poly);
+ *((uint *)GPU_vertbuf_raw_step(&idx_step)) = poly;
}
}
}
else {
for (int poly = 0; poly < poly_len; poly++) {
- mesh_edit_add_select_index(&idx_step, comp, poly);
+ *((uint *)GPU_vertbuf_raw_step(&idx_step)) = poly;
}
}
}
@@ -2785,7 +2754,7 @@ static void mesh_create_edit_facedots_select_id(
if (p_orig != ORIGINDEX_NONE) {
const BMFace *efa = BM_face_at_index(rdata->edit_bmesh->bm, p_orig);
if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
- mesh_edit_add_select_index(&idx_step, comp, poly);
+ *((uint *)GPU_vertbuf_raw_step(&idx_step)) = poly;
}
}
}
@@ -2797,7 +2766,6 @@ static void mesh_create_edit_facedots_select_id(
GPU_vertbuf_data_resize(vbo, facedot_len_used);
}
}
-#undef SELECT_COMP_FORMAT
static void mesh_create_pos_and_nor(MeshRenderData *rdata, GPUVertBuf *vbo)
{