Merge branch 'master' into blender2.8
[blender.git] / source / blender / blenkernel / intern / subsurf_ccg.c
index 5d0f06e95ec930957113453fc92d295f04df24b1..fa83567c3b9f42684de7ab94cea2312b72ecde0d 100644 (file)
@@ -1931,7 +1931,8 @@ static void ccgDM_glNormalFast(float *a, float *b, float *c, float *d)
        no[1] = b_dZ * a_cX - b_dX * a_cZ;
        no[2] = b_dX * a_cY - b_dY * a_cX;
 
-       /* don't normalize, GL_NORMALIZE is enabled */
+       normalize_v3(no); /* we no longer rely on GL_NORMALIZE */
+
        glNormal3fv(no);
 }
 
@@ -3439,261 +3440,6 @@ static void ccgDM_drawMappedFacesMat(DerivedMesh *dm,
 #undef PASSATTRIB
 }
 
-static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
-                                      DMSetDrawOptionsTex drawParams,
-                                      DMSetDrawOptionsMappedTex drawParamsMapped,
-                                      DMCompareDrawOptions compareDrawOptions,
-                                      void *userData, DMDrawFlag flag)
-{
-       CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
-       CCGSubSurf *ss = ccgdm->ss;
-       CCGKey key;
-       int colType;
-       const MLoopCol *mloopcol = NULL;
-       MTexPoly *mtexpoly = DM_get_poly_data_layer(dm, CD_MTEXPOLY);
-       DMFlagMat *faceFlags = ccgdm->faceFlags;
-       DMDrawOption draw_option;
-       int i, totpoly;
-       bool flush;
-       const bool use_tface = (flag & DM_DRAW_USE_ACTIVE_UV) != 0;
-       const bool use_colors = (flag & DM_DRAW_USE_COLORS) != 0;
-       unsigned int next_actualFace;
-       unsigned int gridFaces = ccgSubSurf_getGridSize(ss) - 1;
-       int mat_index;
-       int tot_element, start_element, tot_drawn;
-
-       if (use_colors) {
-               colType = CD_TEXTURE_MLOOPCOL;
-               mloopcol = dm->getLoopDataArray(dm, colType);
-               if (!mloopcol) {
-                       colType = CD_PREVIEW_MLOOPCOL;
-                       mloopcol = dm->getLoopDataArray(dm, colType);
-               }
-               if (!mloopcol) {
-                       colType = CD_MLOOPCOL;
-                       mloopcol = dm->getLoopDataArray(dm, colType);
-               }
-       }
-
-#ifdef WITH_OPENSUBDIV
-       if (ccgdm->useGpuBackend) {
-               const int active_uv_layer = CustomData_get_active_layer_index(&dm->loopData, CD_MLOOPUV);
-               if (UNLIKELY(ccgSubSurf_prepareGLMesh(ss, true, active_uv_layer) == false)) {
-                       return;
-               }
-               if (drawParams == NULL) {
-                       ccgSubSurf_drawGLMesh(ss, true, -1, -1);
-                       return;
-               }
-               const int level = ccgSubSurf_getSubdivisionLevels(ss);
-               const int face_side = 1 << level;
-               const int grid_side = 1 << (level - 1);
-               const int face_patches = face_side * face_side;
-               const int grid_patches = grid_side * grid_side;
-               const int num_base_faces = ccgSubSurf_getNumGLMeshBaseFaces(ss);
-               int current_patch = 0;
-               int mat_nr = -1;
-               int start_draw_patch = 0, num_draw_patches = 0;
-               bool draw_smooth = false;
-               for (i = 0; i < num_base_faces; ++i) {
-                       const int num_face_verts = ccgSubSurf_getNumGLMeshBaseFaceVerts(ss, i);
-                       const int num_patches = (num_face_verts == 4) ? face_patches
-                                                                     : num_face_verts * grid_patches;
-                       if (faceFlags) {
-                               mat_nr = faceFlags[i].mat_nr;
-                               draw_smooth = (faceFlags[i].flag & ME_SMOOTH);
-                       }
-                       else {
-                               mat_nr = 0;
-                               draw_smooth = false;
-                       }
-
-                       if (drawParams != NULL) {
-                               MTexPoly *tp = (use_tface && mtexpoly) ? &mtexpoly[i] : NULL;
-                               draw_option = drawParams(tp, (mloopcol != NULL), mat_nr);
-                       }
-                       else {
-                               draw_option = (drawParamsMapped)
-                                                 ? drawParamsMapped(userData, i, mat_nr)
-                                                 : DM_DRAW_OPTION_NORMAL;
-                       }
-
-                       flush = (draw_option == DM_DRAW_OPTION_SKIP) || (i == num_base_faces - 1);
-
-                       const int next_face = min_ii(i + 1, num_base_faces - 1);
-                       if (!flush && compareDrawOptions) {
-                               flush |= compareDrawOptions(userData, i, next_face) == 0;
-                       }
-                       if (!flush && faceFlags) {
-                               bool new_draw_smooth = (faceFlags[next_face].flag & ME_SMOOTH);
-                               flush |= (new_draw_smooth != draw_smooth);
-                       }
-
-                       current_patch += num_patches;
-
-                       if (flush) {
-                               if (draw_option != DM_DRAW_OPTION_SKIP) {
-                                       num_draw_patches += num_patches;
-                               }
-                               if (num_draw_patches != 0) {
-                                       glShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT);
-                                       ccgSubSurf_drawGLMesh(ss,
-                                                             true,
-                                                             start_draw_patch,
-                                                             num_draw_patches);
-                               }
-                               start_draw_patch = current_patch;
-                               num_draw_patches = 0;
-                       }
-                       else {
-                               num_draw_patches += num_patches;
-                       }
-               }
-               glShadeModel(GL_SMOOTH);
-               return;
-       }
-#endif
-
-       CCG_key_top_level(&key, ss);
-       ccgdm_pbvh_update(ccgdm);
-
-       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 (mloopcol) {
-               GPU_color_setup(dm, colType);
-       }
-
-       next_actualFace = 0;
-
-       /* lastFlag = 0; */ /* UNUSED */
-       for (mat_index = 0; mat_index < dm->drawObject->totmaterial; mat_index++) {
-               GPUBufferMaterial *bufmat = dm->drawObject->materials + mat_index;
-               next_actualFace = bufmat->polys[0];
-               totpoly = bufmat->totpolys;
-
-               tot_element = 0;
-               tot_drawn = 0;
-               start_element = 0;
-
-               for (i = 0; i < totpoly; i++) {
-                       int polyindex = bufmat->polys[i];
-                       CCGFace *f = ccgdm->faceMap[polyindex].face;
-                       int numVerts = ccgSubSurf_getFaceNumVerts(f);
-                       int index = ccgDM_getFaceMapIndex(ss, f);
-                       int orig_index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
-                       int mat_nr;
-                       int facequads = numVerts * gridFaces * gridFaces;
-                       int actualFace = ccgdm->faceMap[polyindex].startFace;
-
-                       if (i != totpoly - 1) {
-                               polyindex = bufmat->polys[i + 1];
-                               next_actualFace = ccgdm->faceMap[polyindex].startFace;
-                       }
-
-                       if (faceFlags) {
-                               mat_nr = faceFlags[orig_index].mat_nr;
-                       }
-                       else {
-                               mat_nr = 0;
-                       }
-
-                       if (drawParams) {
-                               MTexPoly *tp = (use_tface && mtexpoly) ? &mtexpoly[actualFace] : NULL;
-                               draw_option = drawParams(tp, (mloopcol != NULL), mat_nr);
-                       }
-                       else if (index != ORIGINDEX_NONE)
-                               draw_option = (drawParamsMapped) ? drawParamsMapped(userData, index, mat_nr) : DM_DRAW_OPTION_NORMAL;
-                       else
-                               draw_option = DM_DRAW_OPTION_NORMAL;
-
-                       /* flush buffer if current triangle isn't drawable or it's last triangle */
-                       flush = (draw_option == DM_DRAW_OPTION_SKIP) || (i == totpoly - 1);
-
-                       if (!flush && compareDrawOptions) {
-                               /* also compare draw options and flush buffer if they're different
-                                * need for face selection highlight in edit mode */
-                               flush |= compareDrawOptions(userData, actualFace, next_actualFace) == 0;
-                       }
-
-                       tot_element += facequads * 6;
-
-                       if (flush) {
-                               if (draw_option != DM_DRAW_OPTION_SKIP)
-                                       tot_drawn += facequads * 6;
-
-                               if (tot_drawn) {
-                                       if (mloopcol && draw_option != DM_DRAW_OPTION_NO_MCOL)
-                                               GPU_color_switch(1);
-                                       else
-                                               GPU_color_switch(0);
-
-                                       GPU_buffer_draw_elements(dm->drawObject->triangles, GL_TRIANGLES, bufmat->start + start_element, tot_drawn);
-                                       tot_drawn = 0;
-                               }
-
-                               start_element = tot_element;
-                       }
-                       else {
-                               tot_drawn += facequads * 6;
-                       }
-               }
-       }
-
-
-       GPU_buffers_unbind();
-}
-
-static void ccgDM_drawFacesTex(DerivedMesh *dm,
-                               DMSetDrawOptionsTex setDrawOptions,
-                               DMCompareDrawOptions compareDrawOptions,
-                               void *userData, DMDrawFlag flag)
-{
-       ccgDM_drawFacesTex_common(dm, setDrawOptions, NULL, compareDrawOptions, userData, flag);
-}
-
-static void ccgDM_drawMappedFacesTex(DerivedMesh *dm,
-                                     DMSetDrawOptionsMappedTex setDrawOptions,
-                                     DMCompareDrawOptions compareDrawOptions,
-                                     void *userData, DMDrawFlag flag)
-{
-       ccgDM_drawFacesTex_common(dm, NULL, setDrawOptions, compareDrawOptions, userData, flag);
-}
-
-/* same as cdDM_drawUVEdges */
-static void ccgDM_drawUVEdges(DerivedMesh *dm)
-{
-       MPoly *mpoly = dm->getPolyArray(dm);
-       int totpoly = dm->getNumPolys(dm);
-       int prevstart = 0;
-       bool prevdraw = true;
-       int curpos = 0;
-       int i;
-
-       GPU_uvedge_setup(dm);
-       for (i = 0; i < totpoly; i++, mpoly++) {
-               const bool draw = (mpoly->flag & ME_HIDE) == 0;
-
-               if (prevdraw != draw) {
-                       if (prevdraw && (curpos != prevstart)) {
-                               glDrawArrays(GL_LINES, prevstart, curpos - prevstart);
-                       }
-                       prevstart = curpos;
-               }
-
-               curpos += 2 * mpoly->totloop;
-               prevdraw = draw;
-       }
-       if (prevdraw && (curpos != prevstart)) {
-               glDrawArrays(GL_LINES, prevstart, curpos - prevstart);
-       }
-       GPU_buffers_unbind();
-}
-
 static void ccgDM_drawMappedFaces(DerivedMesh *dm,
                                   DMSetDrawOptions setDrawOptions,
                                   DMSetMaterial setMaterial,
@@ -4628,13 +4374,10 @@ static void set_default_ccgdm_callbacks(CCGDerivedMesh *ccgdm)
        ccgdm->dm.drawEdges = ccgDM_drawEdges;
        ccgdm->dm.drawLooseEdges = ccgDM_drawLooseEdges;
        ccgdm->dm.drawFacesSolid = ccgDM_drawFacesSolid;
-       ccgdm->dm.drawFacesTex = ccgDM_drawFacesTex;
        ccgdm->dm.drawFacesGLSL = ccgDM_drawFacesGLSL;
        ccgdm->dm.drawMappedFaces = ccgDM_drawMappedFaces;
-       ccgdm->dm.drawMappedFacesTex = ccgDM_drawMappedFacesTex;
        ccgdm->dm.drawMappedFacesGLSL = ccgDM_drawMappedFacesGLSL;
        ccgdm->dm.drawMappedFacesMat = ccgDM_drawMappedFacesMat;
-       ccgdm->dm.drawUVEdges = ccgDM_drawUVEdges;
 
        ccgdm->dm.drawMappedEdgesInterp = ccgDM_drawMappedEdgesInterp;
        ccgdm->dm.drawMappedEdges = ccgDM_drawMappedEdges;
@@ -5092,8 +4835,7 @@ static bool subsurf_use_gpu_backend(SubsurfFlags flags)
         */
        return
                (flags & SUBSURF_USE_GPU_BACKEND) != 0 &&
-               (U.opensubdiv_compute_type != USER_OPENSUBDIV_COMPUTE_NONE) &&
-               (openSubdiv_supportGPUDisplay());
+               (U.opensubdiv_compute_type != USER_OPENSUBDIV_COMPUTE_NONE);
 #else
        (void)flags;
        return false;