[Bf-blender-cvs] [7ad8272952c] blender2.8: DRW: Only trash UV and tangent data when using BKE_MESH_BATCH_DIRTY_SHADING

Clément Foucault noreply at git.blender.org
Wed Sep 19 20:02:20 CEST 2018


Commit: 7ad8272952c6465dca67b7ece2e80ab6b51a4ed9
Author: Clément Foucault
Date:   Wed Sep 19 19:36:25 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB7ad8272952c6465dca67b7ece2e80ab6b51a4ed9

DRW: Only trash UV and tangent data when using BKE_MESH_BATCH_DIRTY_SHADING

This improves the problem encountered when animating materials on static
meshes but does not fix the core issue. See T55326.

===================================================================

M	source/blender/draw/intern/draw_cache_impl_mesh.c

===================================================================

diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 3314030cd5e..fe24ad707c1 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -1732,6 +1732,27 @@ static MeshBatchCache *mesh_batch_cache_get(Mesh *me)
 	return me->runtime.batch_cache;
 }
 
+static void mesh_batch_cache_discard_shaded_tri(MeshBatchCache *cache)
+{
+	GPU_VERTBUF_DISCARD_SAFE(cache->shaded_triangles_data);
+	if (cache->shaded_triangles_in_order) {
+		for (int i = 0; i < cache->mat_len; ++i) {
+			GPU_INDEXBUF_DISCARD_SAFE(cache->shaded_triangles_in_order[i]);
+		}
+	}
+	if (cache->shaded_triangles) {
+		for (int i = 0; i < cache->mat_len; ++i) {
+			GPU_BATCH_DISCARD_SAFE(cache->shaded_triangles[i]);
+		}
+	}
+
+	MEM_SAFE_FREE(cache->shaded_triangles_in_order);
+	MEM_SAFE_FREE(cache->shaded_triangles);
+
+	MEM_SAFE_FREE(cache->auto_layer_names);
+	MEM_SAFE_FREE(cache->auto_layer_is_srgb);
+}
+
 void DRW_mesh_batch_cache_dirty_tag(Mesh *me, int mode)
 {
 	MeshBatchCache *cache = me->runtime.batch_cache;
@@ -1763,9 +1784,7 @@ void DRW_mesh_batch_cache_dirty_tag(Mesh *me, int mode)
 			cache->is_dirty = true;
 			break;
 		case BKE_MESH_BATCH_DIRTY_SHADING:
-			/* TODO: This should only update UV and tangent data,
-			 * and not free the entire cache. */
-			cache->is_dirty = true;
+			mesh_batch_cache_discard_shaded_tri(cache);
 			break;
 		case BKE_MESH_BATCH_DIRTY_SCULPT_COORDS:
 			cache->is_sculpt_points_tag = true;
@@ -1877,23 +1896,7 @@ static void mesh_batch_cache_clear(Mesh *me)
 	GPU_VERTBUF_DISCARD_SAFE(cache->edges_face_overlay);
 	DRW_TEXTURE_FREE_SAFE(cache->edges_face_overlay_tx);
 
-	GPU_VERTBUF_DISCARD_SAFE(cache->shaded_triangles_data);
-	if (cache->shaded_triangles_in_order) {
-		for (int i = 0; i < cache->mat_len; ++i) {
-			GPU_INDEXBUF_DISCARD_SAFE(cache->shaded_triangles_in_order[i]);
-		}
-	}
-	if (cache->shaded_triangles) {
-		for (int i = 0; i < cache->mat_len; ++i) {
-			GPU_BATCH_DISCARD_SAFE(cache->shaded_triangles[i]);
-		}
-	}
-
-	MEM_SAFE_FREE(cache->shaded_triangles_in_order);
-	MEM_SAFE_FREE(cache->shaded_triangles);
-
-	MEM_SAFE_FREE(cache->auto_layer_names);
-	MEM_SAFE_FREE(cache->auto_layer_is_srgb);
+	mesh_batch_cache_discard_shaded_tri(cache);
 
 	if (cache->texpaint_triangles) {
 		for (int i = 0; i < cache->mat_len; ++i) {



More information about the Bf-blender-cvs mailing list