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,

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to