Commit: 805ddc77905036c98788f9875c01adf2d44a2486
Author: Antony Riakiotakis
Date:   Fri Apr 17 11:37:34 2015 +0200
Branches: GPU_data_request
https://developer.blender.org/rB805ddc77905036c98788f9875c01adf2d44a2486

Merge branch 'master' into GPU_data_request

Conflicts:
        source/blender/makesdna/DNA_view3d_types.h

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



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

diff --cc source/blender/blenkernel/CMakeLists.txt
index 834ee2e,67c8f0f..f12e9d4
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@@ -172,9 -173,7 +173,8 @@@ set(SR
        intern/tracking_solver.c
        intern/tracking_stabilize.c
        intern/tracking_util.c
-       intern/treehash.c
        intern/unit.c
 +      intern/workflow_shaders.c
        intern/world.c
        intern/writeavi.c
        intern/writeframeserver.c
@@@ -270,12 -272,8 +273,9 @@@
        BKE_text.h
        BKE_texture.h
        BKE_tracking.h
-       BKE_treehash.h
        BKE_unit.h
        BKE_utildefines.h
 +      BKE_workflow_shaders.h
        BKE_world.h
        BKE_writeavi.h
        BKE_writeframeserver.h
diff --cc source/blender/blenkernel/intern/subsurf_ccg.c
index 6372c36,a4e0eaa..5727b7f
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@@ -1769,277 -1754,15 +1769,277 @@@ static void ccgDM_prepare_normal_data(D
        int gridSize = ccgSubSurf_getGridSize(ss);
        int gridFaces = gridSize - 1;
        DMFlagMat *faceFlags = ccgdm->faceFlags;
 -      int step = (fast) ? gridSize - 1 : 1;
        int i, totface = ccgSubSurf_getNumFaces(ss);
 -      int drawcurrent = 0, matnr = -1, shademodel = -1;
 +      int matnr, shademodel;
 +      int start;
 +
 +      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);
 +              int index = 
GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
 +              short (*ln)[4][3] = NULL;
 +
 +              if (faceFlags) {
 +                      shademodel = (lnors || (faceFlags[index].flag & 
ME_SMOOTH)) ? GL_SMOOTH : GL_FLAT;
 +                      matnr = faceFlags[index].mat_nr;
 +              }
 +              else {
 +                      shademodel = GL_SMOOTH;
 +                      matnr = 0;
 +              }
 +
 +              if (lnors) {
 +                      ln = lnors;
 +                      lnors += gridFaces * gridFaces * numVerts;
 +              }
 +
 +              for (S = 0; S < numVerts; S++) {
 +                      CCGElem *faceGridData = 
ccgSubSurf_getFaceGridDataArray(ss, f, S);
 +
 +                      if (ln) {
 +                              /* Can't use quad strips here... */
 +                              for (y = 0; y < gridFaces; y ++) {
 +                                      for (x = 0; x < gridFaces; x ++) {
 +                                              start = 
vindex[mat_orig_to_new[matnr]];
 +                                              
 +                                              
normal_short_to_float_v3(&varray[start], ln[0][1]);
 +                                              
normal_short_to_float_v3(&varray[start + 3], ln[0][2]);
 +                                              
normal_short_to_float_v3(&varray[start + 6], ln[0][3]);
 +                              
 +                                              
normal_short_to_float_v3(&varray[start + 9], ln[0][3]);
 +                                              
normal_short_to_float_v3(&varray[start + 12], ln[0][1]);
 +                                              
normal_short_to_float_v3(&varray[start + 15], ln[0][0]);
 +                                              
 +                                              vindex[mat_orig_to_new[matnr]] 
+= 18;
 +                                              
 +                                              ln ++;
 +                                      }
 +                              }
 +                      }
 +                      else if (shademodel == GL_SMOOTH) {
 +                              for (y = 0; y < gridFaces; y ++) {
 +                                      for (x = 0; x < gridFaces; x ++) {
 +                                              float *a = 
CCG_grid_elem_no(&key, faceGridData, x, y );
 +                                              float *b = 
CCG_grid_elem_no(&key, faceGridData, x + 1, y);
 +                                              float *c = 
CCG_grid_elem_no(&key, faceGridData, x + 1, y + 1);
 +                                              float *d = 
CCG_grid_elem_no(&key, faceGridData, x, y + 1);
 +
 +                                              start = 
vindex[mat_orig_to_new[matnr]];
 +                                              
 +                                              copy_v3_v3(&varray[start], d);
 +                                              copy_v3_v3(&varray[start + 3], 
c);
 +                                              copy_v3_v3(&varray[start + 6], 
b);
 +                              
 +                                              copy_v3_v3(&varray[start + 9], 
d);
 +                                              copy_v3_v3(&varray[start + 12], 
b);
 +                                              copy_v3_v3(&varray[start + 15], 
a);
 +                                              
 +                                              vindex[mat_orig_to_new[matnr]] 
+= 18;
 +                                      }
 +                              }
 +                      }
 +                      else {
 +                              for (y = 0; y < gridFaces; y ++) {
 +                                      for (x = 0; x < gridFaces; x ++) {
 +                                              float no[3];
 +                                              float *a = 
CCG_grid_elem_co(&key, faceGridData, x, y );
 +                                              float *b = 
CCG_grid_elem_co(&key, faceGridData, x + 1, y );
 +                                              float *c = 
CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1);
 +                                              float *d = 
CCG_grid_elem_co(&key, faceGridData, x, y + 1);
 +
 +                                              ccgDM_NormalFast(a, b, c, d, 
no);
 +      
 +                                              start = 
vindex[mat_orig_to_new[matnr]];
 +                                              
 +                                              copy_v3_v3(&varray[start], no);
 +                                              copy_v3_v3(&varray[start + 3], 
no);
 +                                              copy_v3_v3(&varray[start + 6], 
no);
 +                              
 +                                              copy_v3_v3(&varray[start + 9], 
no);
 +                                              copy_v3_v3(&varray[start + 12], 
no);
 +                                              copy_v3_v3(&varray[start + 15], 
no);
 +                                              
 +                                              vindex[mat_orig_to_new[matnr]] 
+= 18;
 +                                      }
 +                              }
 +                      }
 +              }
 +      }
 +}
  
 +/* Only used by non-editmesh types */
 +static void ccgDM_prepare_vertex_data(DerivedMesh *dm, float *varray, int 
*vindex,
 +                                      int *mat_orig_to_new, void 
*UNUSED(user_data))
 +{
 +      CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
 +      CCGSubSurf *ss = ccgdm->ss;
 +      CCGKey key;
 +      int gridSize = ccgSubSurf_getGridSize(ss);
 +      int gridFaces = gridSize - 1;
 +      DMFlagMat *faceFlags = ccgdm->faceFlags;
 +      int i, totface = ccgSubSurf_getNumFaces(ss);
 +      int matnr = -1, start;
 +      
        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);
 +              int index = 
GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
 +              
 +              if (faceFlags) {
 +                      matnr = faceFlags[index].mat_nr;
 +              }
 +              else {
 +                      matnr = 0;
 +              }
 +              
 +              for (S = 0; S < numVerts; S++) {
 +                      CCGElem *faceGridData = 
ccgSubSurf_getFaceGridDataArray(ss, f, S);
 +                      for (y = 0; y < gridFaces; y++) {
 +                              for (x = 0; x < gridFaces; x++) {
 +                                      float *a = CCG_grid_elem_co(&key, 
faceGridData, x, y);
 +                                      float *b = CCG_grid_elem_co(&key, 
faceGridData, x + 1, y);
 +                                      float *c = CCG_grid_elem_co(&key, 
faceGridData, x + 1, y + 1);
 +                                      float *d = CCG_grid_elem_co(&key, 
faceGridData, x, y + 1);
 +
 +                                      start = vindex[mat_orig_to_new[matnr]];
 +                                      
 +                                      copy_v3_v3(&varray[start], d);
 +                                      copy_v3_v3(&varray[start + 3], c);
 +                                      copy_v3_v3(&varray[start + 6], b);
 +                      
 +                                      copy_v3_v3(&varray[start + 9], d);
 +                                      copy_v3_v3(&varray[start + 12], b);
 +                                      copy_v3_v3(&varray[start + 15], a);
 +                                      
 +                                      vindex[mat_orig_to_new[matnr]] += 18;
 +                              }
 +                      }
 +              }
 +      }
 +}
 +
 +static void ccgDM_copy_gpu_data(DerivedMesh *dm, int type, float *varray, int 
*index,
 +                         int *mat_orig_to_new, void *UNUSED(user_data))
 +{     
 +      switch(type) {
 +              case GPU_BUFFER_VERTEX:
 +                      ccgDM_prepare_vertex_data(dm, varray, index, 
mat_orig_to_new, NULL);
 +                      break;
 +              case GPU_BUFFER_NORMAL:
 +                      ccgDM_prepare_normal_data(dm, varray, index, 
mat_orig_to_new, NULL);
 +                      break;
 +              default:
 +                      break;
 +      }
 +}
 +
 +static GPUDrawObject *ccgDM_GPUObjectNew(DerivedMesh *dm) {
 +//    GPUBufferMaterial *mat;
 +      int *mat_orig_to_new;
 +      CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
 +      CCGSubSurf *ss = ccgdm->ss;
 +      GPUDrawObject *gdo;
 +      DMFlagMat *faceFlags = ccgdm->faceFlags;
 +      int gridSize = ccgSubSurf_getGridSize(ss);
 +      int gridFaces = gridSize - 1;
 +      int totmat = (faceFlags) ? dm->totmat : 1;
 +      int *points_per_mat;
 +      int i, curmat, curpoint, totface;
 +
 +      /* object contains at least one material (default included) so zero 
means uninitialized dm */
 +      BLI_assert(totmat != 0);
 +
 +      totface = ccgSubSurf_getNumFaces(ss);
 +
 +      points_per_mat = MEM_callocN(sizeof(*points_per_mat) * totmat, 
"GPU_drawobject_new.mat_orig_to_new");
 +      
 +      if (faceFlags) {
 +              for (i = 0; i < totface; i++) {
 +                      CCGFace *f = ccgdm->faceMap[i].face;
 +                      int numVerts = ccgSubSurf_getFaceNumVerts(f);
 +                      int index = 
GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
 +                      int new_matnr = faceFlags[index].mat_nr;
 +                      points_per_mat[new_matnr] += numVerts * gridFaces * 
gridFaces * 6;
 +              }
 +      }
 +      else {
 +              for (i = 0; i < totface; i++) {
 +                      points_per_mat[0] += gridFaces * gridFaces * 6;
 +              }
 +      }
 +      
 +      /* create the GPUDrawObject */
 +      gdo = MEM_callocN(sizeof(GPUDrawObject), "GPUDrawObject");
 +      gdo->totvert = ccgSubSurf_getNumFinalFaces(ss) * 6;
 +      gdo->totedge = ccgSubSurf_getNumFinalEdges(ss) * 2;
 +
 +      /* count the number of materials used by this DerivedMesh */
 +      for (i = 0; i < totmat; i++) {
 +              if (points_per_mat[i] > 0)
 +                      gdo->totmaterial++;
 +      }
 +
 +      /* allocate an array of materials used by this DerivedMesh */
 +      gdo->materials = MEM_mallocN(sizeof(GPUBufferMaterial) * 
gdo->totmaterial,
 +                                   "GPUDrawObject.materials");
 +
 +      /* initialize the materials array */
 +      for (i = 0, curmat = 0, curpoint = 0; i < totmat; i++) {
 +              if (points_per_mat[i] > 0) {
 +                      gdo->materials[curmat].start = curpoint;
 +                      gdo->materials[curmat].totpoint = points_per_mat[i];
 +                      gdo->materials[curmat].mat_nr = i;
 +
 +                      curpoint += points_per_mat[i];
 +                      curmat++;
 +              }
 +      }
 +
 +      /* store total number of points used for triangles */
 +      gdo->tot_triangle_point = curpoint;
 +
 +      mat_orig_to_new = MEM_callocN(sizeof(*mat_orig_to_new) * totmat,
 +                                                   
"GPUDrawObject.mat_orig_to_new");
 +
 +      /* build a map from the original material indices to the new
 +       * GPUBufferMaterial indices */
 +      for (i = 0; i < gdo->totmaterial; i++) {
 +              mat_orig_to_new[gdo->materials[i].mat_nr] = i;
 +              
 +      }
 +
 +      /*
 +      for (i = 0; i < totface; i++) {
 +              CCGFace *f = ccgdm->faceMap[i].face;
 +              int index = 
GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
 +              int new_matnr = faceFlags[index].mat_nr;
 +      
 +              mat = &gdo->materials[mat_orig_to_new[new_matnr]];
 +
 +      }
 +      */
 +
 +
 +      MEM_freeN(mat_orig_to_new);
 +      MEM_freeN(points_per_mat);
 +
 +      return gdo;
 +}
 +
 +/* Only used by non-editmesh types */
 +static void ccgDM_drawFacesSolid(DerivedMesh *dm, float 
(*partial_redraw_planes)[4], bool fast, DMSetMaterial setMaterial)
 +{
 +      int a;
 +      CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
  
        if (ccgdm->pbvh && ccgdm->multires.mmd && !fast) {
-               if (dm->numTessFaceData) {
+               if (BKE_pbvh_has_faces(ccgdm->pbvh)) {
                        BKE_pbvh_draw(ccgdm->pbvh, partial_redraw_planes, NULL,
                                      setMaterial, false);
                        glShadeModel(GL_FLAT);
diff --cc source/blender/editors/space_view3d/drawobject.c
index ae22f1c,ecc2499..d83613b
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@@ -1872,251 -2092,13 +2097,256 @@@ static void drawcamera(Scene *scene, Vi
                        glPopMatrix();
                }
        }
+ 
+       /* ster

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to