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:
authorClément Foucault <foucault.clem@gmail.com>2017-05-13 17:45:06 +0300
committerClément Foucault <foucault.clem@gmail.com>2017-05-15 17:14:17 +0300
commit5a377521aad51d10222ff69505271024df32af4e (patch)
treea536df38ca7aac6126a97f981bcd952bcc1106de /source/blender/draw/modes/edit_mesh_mode.c
parentb3e62a8aa229fd9d365cd5bac02705f0fdb2c315 (diff)
Mesh Batch Cache: Split Edit Mesh mode Vertex Buffers for faster update.
Diffstat (limited to 'source/blender/draw/modes/edit_mesh_mode.c')
-rw-r--r--source/blender/draw/modes/edit_mesh_mode.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c
index f51274b8fee..4034b56155b 100644
--- a/source/blender/draw/modes/edit_mesh_mode.c
+++ b/source/blender/draw/modes/edit_mesh_mode.c
@@ -101,6 +101,7 @@ static struct {
GPUShader *overlay_mix_sh;
GPUShader *overlay_facefill_sh;
GPUShader *normals_face_sh;
+ GPUShader *normals_loop_sh;
GPUShader *normals_sh;
GPUShader *depth_sh;
} e_data = {NULL}; /* Engine data */
@@ -224,6 +225,13 @@ static void EDIT_MESH_engine_init(void *vedata)
datatoc_gpu_shader_uniform_color_frag_glsl,
"#define FACE_NORMALS\n");
}
+ if (!e_data.normals_loop_sh) {
+ e_data.normals_loop_sh = DRW_shader_create(
+ datatoc_edit_normals_vert_glsl,
+ datatoc_edit_normals_geom_glsl,
+ datatoc_gpu_shader_uniform_color_frag_glsl,
+ "#define LOOP_NORMALS\n");
+ }
if (!e_data.normals_sh) {
e_data.normals_sh = DRW_shader_create(
datatoc_edit_normals_vert_glsl,
@@ -347,7 +355,7 @@ static void EDIT_MESH_cache_init(void *vedata)
DRW_shgroup_uniform_float(stl->g_data->vnormals_shgrp, "normalSize", &size_normal, 1);
DRW_shgroup_uniform_vec4(stl->g_data->vnormals_shgrp, "color", ts.colorVNormal, 1);
- stl->g_data->lnormals_shgrp = DRW_shgroup_create(e_data.normals_sh, psl->normals);
+ stl->g_data->lnormals_shgrp = DRW_shgroup_create(e_data.normals_loop_sh, psl->normals);
DRW_shgroup_uniform_float(stl->g_data->lnormals_shgrp, "normalSize", &size_normal, 1);
DRW_shgroup_uniform_vec4(stl->g_data->lnormals_shgrp, "color", ts.colorLNormal, 1);
}
@@ -454,14 +462,19 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob)
DRW_shgroup_call_add(stl->g_data->fnormals_shgrp, geom, ob->obmat);
}
- if (vnormals_do) {
- geom = DRW_cache_mesh_verts_get(ob);
- DRW_shgroup_call_add(stl->g_data->vnormals_shgrp, geom, ob->obmat);
- }
+ if (vnormals_do || lnormals_do) {
+ struct Batch *geo_ovl_tris, *geo_ovl_ledges, *geo_ovl_lverts;
+ DRW_cache_mesh_normals_overlay_get(ob, &geo_ovl_tris, &geo_ovl_ledges, &geo_ovl_lverts);
+
+ if (vnormals_do) {
+ DRW_shgroup_call_add(stl->g_data->vnormals_shgrp, geo_ovl_tris, ob->obmat);
+ DRW_shgroup_call_add(stl->g_data->vnormals_shgrp, geo_ovl_ledges, ob->obmat);
+ DRW_shgroup_call_add(stl->g_data->vnormals_shgrp, geo_ovl_lverts, ob->obmat);
+ }
- if (lnormals_do) {
- geom = DRW_cache_mesh_surface_verts_get(ob);
- DRW_shgroup_call_add(stl->g_data->lnormals_shgrp, geom, ob->obmat);
+ if (lnormals_do) {
+ DRW_shgroup_call_add(stl->g_data->lnormals_shgrp, geo_ovl_tris, ob->obmat);
+ }
}
if ((v3d->flag & V3D_ZBUF_SELECT) == 0) {
@@ -543,6 +556,7 @@ static void EDIT_MESH_engine_free(void)
DRW_SHADER_FREE_SAFE(e_data.overlay_facedot_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_mix_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_facefill_sh);
+ DRW_SHADER_FREE_SAFE(e_data.normals_loop_sh);
DRW_SHADER_FREE_SAFE(e_data.normals_face_sh);
DRW_SHADER_FREE_SAFE(e_data.normals_sh);
}