[Bf-blender-cvs] [5a377521aad] blender2.8: Mesh Batch Cache: Split Edit Mesh mode Vertex Buffers for faster update.
Clément Foucault
noreply at git.blender.org
Mon May 15 16:16:45 CEST 2017
Commit: 5a377521aad51d10222ff69505271024df32af4e
Author: Clément Foucault
Date: Sat May 13 16:45:06 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB5a377521aad51d10222ff69505271024df32af4e
Mesh Batch Cache: Split Edit Mesh mode Vertex Buffers for faster update.
===================================================================
M source/blender/draw/intern/draw_cache.c
M source/blender/draw/intern/draw_cache.h
M source/blender/draw/intern/draw_cache_impl.h
M source/blender/draw/intern/draw_cache_impl_mesh.c
M source/blender/draw/modes/edit_mesh_mode.c
D source/blender/draw/modes/shaders/edit_normals_face_vert.glsl
M source/blender/draw/modes/shaders/edit_normals_vert.glsl
===================================================================
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index f5c02f244da..abaab1b9322 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -1747,6 +1747,19 @@ void DRW_cache_mesh_wire_overlay_get(
*r_lverts = DRW_mesh_batch_cache_get_overlay_loose_verts(me);
}
+void DRW_cache_mesh_normals_overlay_get(
+ Object *ob,
+ Batch **r_tris, Batch **r_ledges, Batch **r_lverts)
+{
+ BLI_assert(ob->type == OB_MESH);
+
+ Mesh *me = ob->data;
+
+ *r_tris = DRW_mesh_batch_cache_get_overlay_triangles_nor(me);
+ *r_ledges = DRW_mesh_batch_cache_get_overlay_loose_edges_nor(me);
+ *r_lverts = DRW_mesh_batch_cache_get_overlay_loose_verts(me);
+}
+
Batch *DRW_cache_face_centers_get(Object *ob)
{
BLI_assert(ob->type == OB_MESH);
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index 0da09bcc332..417630ef935 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -91,6 +91,9 @@ struct Batch *DRW_cache_mesh_surface_overlay_get(struct Object *ob);
void DRW_cache_mesh_wire_overlay_get(
struct Object *ob,
struct Batch **r_tris, struct Batch **r_ledges, struct Batch **r_lverts);
+void DRW_cache_mesh_normals_overlay_get(
+ struct Object *ob,
+ struct Batch **r_tris, struct Batch **r_ledges, struct Batch **r_lverts);
struct Batch *DRW_cache_face_centers_get(struct Object *ob);
struct Batch *DRW_cache_mesh_wire_outline_get(struct Object *ob);
struct Batch *DRW_cache_mesh_surface_get(struct Object *ob);
diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index 2363d097261..3dd6b07dd71 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -85,7 +85,9 @@ struct Batch *DRW_mesh_batch_cache_get_points_with_normals(struct Mesh *me);
struct Batch *DRW_mesh_batch_cache_get_all_verts(struct Mesh *me);
struct Batch *DRW_mesh_batch_cache_get_fancy_edges(struct Mesh *me);
struct Batch *DRW_mesh_batch_cache_get_overlay_triangles(struct Mesh *me);
+struct Batch *DRW_mesh_batch_cache_get_overlay_triangles_nor(struct Mesh *me);
struct Batch *DRW_mesh_batch_cache_get_overlay_loose_edges(struct Mesh *me);
+struct Batch *DRW_mesh_batch_cache_get_overlay_loose_edges_nor(struct Mesh *me);
struct Batch *DRW_mesh_batch_cache_get_overlay_loose_verts(struct Mesh *me);
struct Batch *DRW_mesh_batch_cache_get_overlay_facedots(struct Mesh *me);
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 83101e65d49..3b8d758ae58 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -1190,7 +1190,10 @@ static bool mesh_render_data_looptri_cos_nors_smooth_get(
MeshRenderData *rdata, const int tri_idx,
float *(*r_vert_cos)[3], short **r_tri_nor, short *(*r_vert_nors)[3], bool *r_is_smooth)
{
- BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP | MR_DATATYPE_POLY));
+ BLI_assert(rdata->types & MR_DATATYPE_VERT);
+ BLI_assert(rdata->types & MR_DATATYPE_LOOPTRI);
+ BLI_assert(rdata->types & MR_DATATYPE_LOOP);
+ BLI_assert(rdata->types & MR_DATATYPE_POLY);
if (rdata->edit_bmesh) {
const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[tri_idx];
@@ -1549,62 +1552,115 @@ static unsigned char mesh_render_data_vertex_flag(MeshRenderData *rdata, const i
}
static void add_overlay_tri(
- MeshRenderData *rdata, VertexBuffer *vbo, const unsigned int pos_id, const unsigned int edgeMod_id,
+ MeshRenderData *rdata, VertexBuffer *vbo_pos, VertexBuffer *vbo_nor, VertexBuffer *vbo_data,
+ const unsigned int pos_id, const unsigned int vnor_id, const unsigned int lnor_id, const unsigned int data_id,
const int tri_vert_idx[3], const int tri_edge_idx[3], const int f, const int base_vert_idx)
{
- const float *pos;
EdgeDrawAttr *eattr;
- unsigned char fflag;
- unsigned char vflag;
-
- pos = mesh_render_data_vert_co(rdata, tri_vert_idx[0]);
- eattr = mesh_render_data_edge_flag(rdata, tri_edge_idx[1]);
- fflag = mesh_render_data_looptri_flag(rdata, f);
- vflag = mesh_render_data_vertex_flag(rdata, tri_vert_idx[0]);
- eattr->v_flag = fflag | vflag;
- VertexBuffer_set_attrib(vbo, pos_id, base_vert_idx + 0, pos);
- VertexBuffer_set_attrib(vbo, edgeMod_id, base_vert_idx + 0, eattr);
-
- pos = mesh_render_data_vert_co(rdata, tri_vert_idx[1]);
- eattr = mesh_render_data_edge_flag(rdata, tri_edge_idx[2]);
- vflag = mesh_render_data_vertex_flag(rdata, tri_vert_idx[1]);
- eattr->v_flag = fflag | vflag;
- VertexBuffer_set_attrib(vbo, pos_id, base_vert_idx + 1, pos);
- VertexBuffer_set_attrib(vbo, edgeMod_id, base_vert_idx + 1, eattr);
-
- pos = mesh_render_data_vert_co(rdata, tri_vert_idx[2]);
- eattr = mesh_render_data_edge_flag(rdata, tri_edge_idx[0]);
- vflag = mesh_render_data_vertex_flag(rdata, tri_vert_idx[2]);
- eattr->v_flag = fflag | vflag;
- VertexBuffer_set_attrib(vbo, pos_id, base_vert_idx + 2, pos);
- VertexBuffer_set_attrib(vbo, edgeMod_id, base_vert_idx + 2, eattr);
+ unsigned char fflag;
+ unsigned char vflag;
+
+ if (vbo_pos) {
+ for (int i = 0; i < 3; ++i) {
+ const float *pos = mesh_render_data_vert_co(rdata, tri_vert_idx[i]);
+ VertexBuffer_set_attrib(vbo_pos, pos_id, base_vert_idx + i, pos);
+ }
+ }
+
+ if (vbo_nor) {
+ float *tri_vert_cos[3];
+ short *tri_nor, *tri_vert_nors[3];
+ bool is_smooth;
+
+ mesh_render_data_looptri_cos_nors_smooth_get(
+ rdata, f, &tri_vert_cos, &tri_nor, &tri_vert_nors, &is_smooth);
+ for (int i = 0; i < 3; ++i) {
+ /* TODO real loop normal */
+ const short *svnor = mesh_render_data_vert_nor(rdata, tri_vert_idx[i]);
+ const short *slnor = tri_vert_nors[i];
+ fflag = mesh_render_data_looptri_flag(rdata, f);
+#if USE_10_10_10
+ PackedNormal vnor = convert_i10_s3(svnor);
+ PackedNormal lnor = convert_i10_s3(slnor);
+ VertexBuffer_set_attrib(vbo_nor, vnor_id, base_vert_idx + i, &vnor);
+ VertexBuffer_set_attrib(vbo_nor, lnor_id, base_vert_idx + i, &lnor);
+#else
+ VertexBuffer_set_attrib(vbo_nor, vnor_id, base_vert_idx + i, svnor);
+ VertexBuffer_set_attrib(vbo_nor, lnor_id, base_vert_idx + i, slnor);
+#endif
+ }
+ }
+
+ if (vbo_data) {
+ fflag = mesh_render_data_looptri_flag(rdata, f);
+ for (int i = 0; i < 3; ++i) {
+ int iedge = (i == 2) ? 0 : i+1;
+ eattr = mesh_render_data_edge_flag(rdata, tri_edge_idx[iedge]);
+ vflag = mesh_render_data_vertex_flag(rdata, tri_vert_idx[i]);
+ eattr->v_flag = fflag | vflag;
+ VertexBuffer_set_attrib(vbo_data, data_id, base_vert_idx + i, eattr);
+ }
+ }
}
static void add_overlay_loose_edge(
- MeshRenderData *rdata, VertexBuffer *vbo, const unsigned int pos_id, const unsigned int edgeMod_id,
- const int v1, const int v2, const int e, const int base_vert_idx)
+ MeshRenderData *rdata, VertexBuffer *vbo_pos, VertexBuffer *vbo_nor, VertexBuffer *vbo_data,
+ const unsigned int pos_id, const unsigned int vnor_id, const unsigned int data_id,
+ const int edge_vert_idx[2], const int e, const int base_vert_idx)
{
- EdgeDrawAttr *eattr = mesh_render_data_edge_flag(rdata, e);
- const float *pos = mesh_render_data_vert_co(rdata, v1);
- eattr->v_flag = mesh_render_data_vertex_flag(rdata, v1);
- VertexBuffer_set_attrib(vbo, pos_id, base_vert_idx + 0, pos);
- VertexBuffer_set_attrib(vbo, edgeMod_id, base_vert_idx + 0, eattr);
+ if (vbo_pos) {
+ for (int i = 0; i < 2; ++i) {
+ const float *pos = mesh_render_data_vert_co(rdata, edge_vert_idx[i]);
+ VertexBuffer_set_attrib(vbo_pos, pos_id, base_vert_idx + i, pos);
+ }
+ }
- pos = mesh_render_data_vert_co(rdata, v2);
- eattr->v_flag = mesh_render_data_vertex_flag(rdata, v2);
- VertexBuffer_set_attrib(vbo, pos_id, base_vert_idx + 1, pos);
- VertexBuffer_set_attrib(vbo, edgeMod_id, base_vert_idx + 1, eattr);
+ if (vbo_nor) {
+ for (int i = 0; i < 2; ++i) {
+ short *nor = mesh_render_data_vert_nor(rdata, edge_vert_idx[i]);
+#if USE_10_10_10
+ PackedNormal vnor = convert_i10_s3(nor);
+ VertexBuffer_set_attrib(vbo_nor, vnor_id, base_vert_idx + i, &vnor);
+#else
+ VertexBuffer_set_attrib(vbo_nor, vnor_id, base_vert_idx + i, &nor);
+#endif
+ }
+ }
+
+ if (vbo_data) {
+ EdgeDrawAttr *eattr = mesh_render_data_edge_flag(rdata, e);
+ for (int i = 0; i < 2; ++i) {
+ eattr->v_flag = mesh_render_data_vertex_flag(rdata, edge_vert_idx[i]);
+ VertexBuffer_set_attrib(vbo_data, data_id, base_vert_idx + i, eattr);
+ }
+ }
}
static void add_overlay_loose_vert(
- MeshRenderData *rdata, VertexBuffer *vbo, const unsigned int pos_id, const unsigned int edgeMod_id,
+ MeshRenderData *rdata, VertexBuffer *vbo_pos, VertexBuffer *vbo_nor, VertexBuffer *vbo_data,
+ const unsigned int pos_id, const unsigned int vnor_id, const unsigned int data_id,
const int v, const int base_vert_idx)
{
- unsigned char vflag[4] = {0, 0, 0, 0};
- const float *pos = mesh_render_data_vert_co(rdata, v);
- vflag[0] = mesh_render_data_vertex_flag(rdata, v);
- VertexBuffer_set_attrib(vbo, pos_id, base_vert_idx + 0, pos);
- VertexBuffer_set_attrib(vbo, edgeMod_id, base_vert_idx + 0, vflag);
+ if (vbo_pos) {
+ const float *pos = mesh_render_data_vert_co(rdata, v);
+ VertexBuffer_set_attrib(vbo_pos, pos_id, base_vert_idx, pos);
+ }
+
+ if (vbo_nor) {
+ short *nor = mesh_render_data_vert_nor(rdata, v);
+#if USE_10_10_10
+ PackedNormal vnor = convert_i10_s3(edge_nor);
+ VertexBuffer_set_attrib(vbo_nor, vnor_id, base_vert_idx, &vnor);
+#else
+ VertexBuffer_set_attrib(vbo_nor, vnor_id, base_vert_idx, nor);
+#endif
+ }
+
+ if (vbo_data) {
+ unsigned char vflag[4] = {0, 0, 0, 0};
+ vflag[0] = mesh_render_data_vertex_flag(rdata, v);
+ VertexBuffer_set_attrib(vbo_data, data_id, base_vert_idx, vflag);
+ }
}
/** \} */
@@ -1646,14 +1702,29 @@ typedef struct MeshBatchCache {
ElementList **shaded_triangles_in_order;
Batch **shaded_triangles;
- /* TODO : split in 2 buffers to avoid unnecessary
- * data transfer when selecting/deselecting
-
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list