[Bf-blender-cvs] [1b64055] temp_display_optimization: WIP code that handles textured drawing for subsurf with vertex buffers.

Antony Riakiotakis noreply at git.blender.org
Tue Jun 23 19:23:07 CEST 2015


Commit: 1b64055c2c1b3e1e57333b292cfffdacd9a46637
Author: Antony Riakiotakis
Date:   Tue Jun 23 19:22:58 2015 +0200
Branches: temp_display_optimization
https://developer.blender.org/rB1b64055c2c1b3e1e57333b292cfffdacd9a46637

WIP code that handles textured drawing for subsurf with vertex buffers.

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

M	source/blender/blenkernel/intern/cdderivedmesh.c
M	source/blender/blenkernel/intern/subsurf_ccg.c

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

diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index bd6a73b..831b2f2 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -1681,7 +1681,7 @@ static void cdDM_copy_gpu_data(DerivedMesh *dm, int type, float *varray, int *in
 			cdDM_buffer_copy_triangles(dm, varray, index, mat_orig_to_new, user_data);
 			break;
 		case GPU_BUFFER_TRIANGLES_FAST:
-			/* */
+			/* only supported in subsurf */
 		default:
 			break;
 	}
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index bc3a7c2..cea9fbd 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -1947,6 +1947,42 @@ static void ccgDM_prepare_vertex_data(DerivedMesh *dm, float *varray, int *UNUSE
 	}
 }
 
+/* Only used by non-editmesh types */
+static void ccgDM_prepare_uv_data(DerivedMesh *dm, float *varray, int *UNUSED(vindex),
+                                      int *UNUSED(mat_orig_to_new), void *UNUSED(user_data))
+{
+	CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
+	CCGSubSurf *ss = ccgdm->ss;
+	CCGKey key;
+	MTFace *tf = DM_get_tessface_data_layer(dm, CD_MTFACE);
+	int gridSize = ccgSubSurf_getGridSize(ss);
+	int gridFaces = gridSize - 1;
+	int i, totface = ccgSubSurf_getNumFaces(ss);
+	int start = 0;
+
+	CCG_key_top_level(&key, ss);
+	ccgdm_pbvh_update(ccgdm);
+
+	for (i = 0; i < totface; i++) {
+		CCGFace *f = ccgdm->faceMap[i].face;
+		int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f);
+
+		for (S = 0; S < numVerts; S++) {
+			for (y = 0; y < gridFaces; y++) {
+				for (x = 0; x < gridFaces; x++) {
+					copy_v2_v2(&varray[start], tf->uv[0]);
+					copy_v2_v2(&varray[start + 2], tf->uv[3]);
+					copy_v2_v2(&varray[start + 4], tf->uv[2]);
+					copy_v2_v2(&varray[start + 6], tf->uv[1]);
+
+					tf++;
+					start += 8;
+				}
+			}
+		}
+	}
+}
+
 static void ccgDM_copy_gpu_data(DerivedMesh *dm, int type, float *varray, int *index,
                          int *mat_orig_to_new, void *UNUSED(user_data))
 {	
@@ -1957,6 +1993,15 @@ static void ccgDM_copy_gpu_data(DerivedMesh *dm, int type, float *varray, int *i
 		case GPU_BUFFER_NORMAL:
 			ccgDM_prepare_normal_data(dm, varray, index, mat_orig_to_new, NULL);
 			break;
+		case GPU_BUFFER_UV:
+			ccgDM_prepare_uv_data(dm, varray, index, mat_orig_to_new, NULL);
+			break;
+		case GPU_BUFFER_UV_TEXPAINT:
+			//ccgDM_prepare_uv_data(dm, varray, index, mat_orig_to_new, NULL);
+			break;
+		case GPU_BUFFER_COLOR:
+			//ccgDM_prepare_uv_data(dm, varray, index, mat_orig_to_new, NULL);
+			break;
 		case GPU_BUFFER_TRIANGLES:
 			ccgDM_prepare_triangle_data(dm, varray, index, mat_orig_to_new, NULL);
 			break;
@@ -2591,6 +2636,17 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
 		mcol = dm->getTessFaceDataArray(dm, colType);
 	}
 
+	GPU_vertex_setup(dm);
+	GPU_normal_setup(dm);
+	GPU_triangle_setup(dm);
+	if (flag & DM_DRAW_USE_TEXPAINT_UV)
+		GPU_texpaint_uv_setup(dm);
+	else
+		GPU_uv_setup(dm);
+	if (mcol) {
+		GPU_color_setup(dm, colType);
+	}
+
 	totface = ccgSubSurf_getNumFaces(ss);
 
 	if (flag & DM_DRAW_USE_TEXPAINT_UV) {
@@ -2790,6 +2846,8 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
 			}
 		}
 	}
+
+	GPU_buffer_unbind();
 }
 
 static void ccgDM_drawFacesTex(DerivedMesh *dm,




More information about the Bf-blender-cvs mailing list