[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