Commit: ab7d30f63aa12181e68679f931e36bf34e358a1d
Author: Sergey Sharybin
Date:   Fri Jul 17 11:29:35 2015 +0200
Branches: opensubdiv-modifier
https://developer.blender.org/rBab7d30f63aa12181e68679f931e36bf34e358a1d

OpenSubdiv: Fix some bad array subscriptions in drawing code

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

M       intern/opensubdiv/opensubdiv_converter.cc
M       intern/opensubdiv/opensubdiv_converter_capi.h
M       source/blender/blenkernel/intern/CCGSubSurf.c
M       source/blender/blenkernel/intern/CCGSubSurf_intern.h
M       source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
M       source/blender/blenkernel/intern/subsurf_ccg.c

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

diff --git a/intern/opensubdiv/opensubdiv_converter.cc 
b/intern/opensubdiv/opensubdiv_converter.cc
index 401e7b3..f5f3547 100644
--- a/intern/opensubdiv/opensubdiv_converter.cc
+++ b/intern/opensubdiv/opensubdiv_converter.cc
@@ -247,6 +247,36 @@ int openSubdiv_topologyRefinerGetSubdivLevel(
        return refiner->GetMaxLevel();
 }
 
+int openSubdiv_topologyRefinerGetNumVerts(
+        const OpenSubdiv_TopologyRefinerDescr *topology_refiner)
+{
+       using OpenSubdiv::Far::TopologyLevel;
+       using OpenSubdiv::Far::TopologyRefiner;
+       const TopologyRefiner *refiner = (const TopologyRefiner 
*)topology_refiner;
+       const TopologyLevel &base_level = refiner->GetLevel(0);
+       return base_level.GetNumVertices();
+}
+
+int openSubdiv_topologyRefinerGetNumEdges(
+        const OpenSubdiv_TopologyRefinerDescr *topology_refiner)
+{
+       using OpenSubdiv::Far::TopologyLevel;
+       using OpenSubdiv::Far::TopologyRefiner;
+       const TopologyRefiner *refiner = (const TopologyRefiner 
*)topology_refiner;
+       const TopologyLevel &base_level = refiner->GetLevel(0);
+       return base_level.GetNumEdges();
+}
+
+int openSubdiv_topologyRefinerGetNumFaces(
+        const OpenSubdiv_TopologyRefinerDescr *topology_refiner)
+{
+       using OpenSubdiv::Far::TopologyLevel;
+       using OpenSubdiv::Far::TopologyRefiner;
+       const TopologyRefiner *refiner = (const TopologyRefiner 
*)topology_refiner;
+       const TopologyLevel &base_level = refiner->GetLevel(0);
+       return base_level.GetNumFaces();
+}
+
 int openSubdiv_topologyRefnerCompareConverter(
         const OpenSubdiv_TopologyRefinerDescr *topology_refiner,
         OpenSubdiv_Converter *converter)
diff --git a/intern/opensubdiv/opensubdiv_converter_capi.h 
b/intern/opensubdiv/opensubdiv_converter_capi.h
index df2fb57..7c96d3d 100644
--- a/intern/opensubdiv/opensubdiv_converter_capi.h
+++ b/intern/opensubdiv/opensubdiv_converter_capi.h
@@ -100,6 +100,15 @@ void openSubdiv_deleteTopologyRefinerDescr(
 int openSubdiv_topologyRefinerGetSubdivLevel(
         const OpenSubdiv_TopologyRefinerDescr *topology_refiner);
 
+int openSubdiv_topologyRefinerGetNumVerts(
+        const OpenSubdiv_TopologyRefinerDescr *topology_refiner);
+
+int openSubdiv_topologyRefinerGetNumEdges(
+        const OpenSubdiv_TopologyRefinerDescr *topology_refiner);
+
+int openSubdiv_topologyRefinerGetNumFaces(
+        const OpenSubdiv_TopologyRefinerDescr *topology_refiner);
+
 int openSubdiv_topologyRefnerCompareConverter(
         const OpenSubdiv_TopologyRefinerDescr *topology_refiner,
         OpenSubdiv_Converter *converter);
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c 
b/source/blender/blenkernel/intern/CCGSubSurf.c
index 530e9f8..fc6ae9e 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -1192,15 +1192,39 @@ CCGError ccgSubSurf_stitchFaces(CCGSubSurf *ss, int 
lvl, CCGFace **effectedF, in
 
 int ccgSubSurf_getNumVerts(const CCGSubSurf *ss)
 {
-       return ss->vMap->numEntries;
+#ifdef WITH_OPENSUBDIV
+       if (ss->skip_grids) {
+               return ccgSubSurf__getNumOsdBaseVerts(ss);
+       }
+       else
+#endif
+       {
+               return ss->vMap->numEntries;
+       }
 }
 int ccgSubSurf_getNumEdges(const CCGSubSurf *ss)
 {
-       return ss->eMap->numEntries;
+#ifdef WITH_OPENSUBDIV
+       if (ss->skip_grids) {
+               return ccgSubSurf__getNumOsdBaseEdges(ss);
+       }
+       else
+#endif
+       {
+               return ss->eMap->numEntries;
+       }
 }
 int ccgSubSurf_getNumFaces(const CCGSubSurf *ss)
 {
-       return ss->fMap->numEntries;
+#ifdef WITH_OPENSUBDIV
+       if (ss->skip_grids) {
+               return ccgSubSurf__getNumOsdBaseFaces(ss);
+       }
+       else
+#endif
+       {
+               return ss->fMap->numEntries;
+       }
 }
 
 CCGVert *ccgSubSurf_getVert(CCGSubSurf *ss, CCGVertHDL v)
diff --git a/source/blender/blenkernel/intern/CCGSubSurf_intern.h 
b/source/blender/blenkernel/intern/CCGSubSurf_intern.h
index 95ea914..d80bdcd 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf_intern.h
+++ b/source/blender/blenkernel/intern/CCGSubSurf_intern.h
@@ -303,6 +303,10 @@ void ccgSubSurf__sync_legacy(CCGSubSurf *ss);
 
 void ccgSubSurf__sync_opensubdiv(CCGSubSurf *ss);
 
+int ccgSubSurf__getNumOsdBaseVerts(const CCGSubSurf *ss);
+int ccgSubSurf__getNumOsdBaseEdges(const CCGSubSurf *ss);
+int ccgSubSurf__getNumOsdBaseFaces(const CCGSubSurf *ss);
+
 /* * CCGSubSurf_opensubdiv_converter.c * */
 
 struct OpenSubdiv_Converter;
diff --git a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c 
b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
index 65053df..4688eee 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
@@ -133,6 +133,9 @@ static bool compare_osd_derivedmesh_topology(CCGSubSurf 
*ss, DerivedMesh *dm)
        if (ss->osd_mesh == NULL && ss->osd_topology_refiner == NULL) {
                return true;
        }
+       /* TODO(sergey): De-duplicate with topology counter at the bottom of
+        * the file.
+        */
        if (ss->osd_topology_refiner != NULL) {
                topology_refiner = ss->osd_topology_refiner;
        }
@@ -811,8 +814,7 @@ void ccgSubSurf_prepareTopologyRefiner(CCGSubSurf *ss, 
DerivedMesh *dm)
                }
                for (vert = 0; vert < num_verts; vert++) {
                        copy_v3_v3(ss->osd_coarse_coords[vert * 2 + 0], 
mvert[vert].co);
-                       /* TODO(sergey): Support proper normals here. */
-                       zero_v3(ss->osd_coarse_coords[vert * 2 + 1]);
+                       normal_short_to_float_v3(ss->osd_coarse_coords[vert * 2 
+ 1], mvert[vert].no);
                }
                ss->osd_num_coarse_coords = num_verts;
                ss->osd_coarse_coords_invalid = true;
@@ -848,6 +850,34 @@ void ccgSubSurf__sync_opensubdiv(CCGSubSurf *ss)
 #endif
 }
 
-#undef OSD_LOG
+static const OpenSubdiv_TopologyRefinerDescr* get_effective_refiner(
+        const CCGSubSurf *ss)
+{
+       if (ss->osd_topology_refiner) {
+               return ss->osd_topology_refiner;
+       }
+       return openSubdiv_getGLMeshTopologyRefiner(ss->osd_mesh);
+}
+
+int ccgSubSurf__getNumOsdBaseVerts(const CCGSubSurf *ss)
+{
+       const OpenSubdiv_TopologyRefinerDescr *topology_refiner =
+               get_effective_refiner(ss);
+       return openSubdiv_topologyRefinerGetNumVerts(topology_refiner);
+}
+
+int ccgSubSurf__getNumOsdBaseEdges(const CCGSubSurf *ss)
+{
+       const OpenSubdiv_TopologyRefinerDescr *topology_refiner =
+               get_effective_refiner(ss);
+       return openSubdiv_topologyRefinerGetNumEdges(topology_refiner);
+}
+
+int ccgSubSurf__getNumOsdBaseFaces(const CCGSubSurf *ss)
+{
+       const OpenSubdiv_TopologyRefinerDescr *topology_refiner =
+               get_effective_refiner(ss);
+       return openSubdiv_topologyRefinerGetNumFaces(topology_refiner);
+}
 
 #endif  /* WITH_OPENSUBDIV */
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c 
b/source/blender/blenkernel/intern/subsurf_ccg.c
index 1ca5792..0584549 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -1858,6 +1858,13 @@ static void ccgDM_drawLooseEdges(DerivedMesh *dm)
        int totedge = ccgSubSurf_getNumEdges(ss);
        int i, j, edgeSize = ccgSubSurf_getEdgeSize(ss);
 
+#ifdef WITH_OPENSUBDIV
+       if (ccgdm->useGpuBackend) {
+               /* TODO(sergey): Needs implementation. */
+               return;
+       }
+#endif
+
        CCG_key_top_level(&key, ss);
 
        for (j = 0; j < totedge; j++) {
@@ -2394,9 +2401,25 @@ static void ccgDM_drawFacesSolid(DerivedMesh *dm, float 
(*partial_redraw_planes)
 #ifdef WITH_OPENSUBDIV
        if (ccgdm->useGpuBackend) {
                CCGSubSurf *ss = ccgdm->ss;
+               DMFlagMat *faceFlags = ccgdm->faceFlags;
+               int new_matnr;
+               bool draw_smooth;
                if (UNLIKELY(ccgSubSurf_prepareGLMesh(ss, setMaterial != NULL) 
== false)) {
                        return;
                }
+               /* TODO(sergey): Single matierial currently. */
+               if (faceFlags) {
+                       draw_smooth = (faceFlags[0].flag & ME_SMOOTH);
+                       new_matnr = (faceFlags[0].mat_nr + 1);
+               }
+               else {
+                       draw_smooth = true;
+                       new_matnr = 1;
+               }
+               if (setMaterial) {
+                       setMaterial(new_matnr, NULL);
+               }
+               glShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT);
                ccgSubSurf_drawGLMesh(ss, true, -1, -1);
                return;
        }
@@ -2436,11 +2459,22 @@ static void ccgDM_drawMappedFacesGLSL(DerivedMesh *dm,
 
 #ifdef WITH_OPENSUBDIV
        if (ccgdm->useGpuBackend) {
-               int new_matnr = faceFlags[0].mat_nr + 1;
+               int new_matnr;
+               bool draw_smooth;
                GPU_draw_update_fvar_offset(dm);
                if (UNLIKELY(ccgSubSurf_prepareGLMesh(ss, false) == false)) {
                        return;
                }
+               /* TODO(sergey): Single matierial currently. */
+               if (faceFlags) {
+                       draw_smooth = (faceFlags[0].flag & ME_SMOOTH);
+                       new_matnr = (faceFlags[0].mat_nr + 1);
+               }
+               else {
+                       draw_smooth = true;
+                       new_matnr = 1;
+               }
+               glShadeModel(draw_smooth ? GL_SMOOTH : GL_FLAT);
                setMaterial(new_matnr, &gattribs);
                ccgSubSurf_drawGLMesh(ss, true, -1, -1);
                return;
@@ -3318,9 +3352,11 @@ static void ccgDM_release(DerivedMesh *dm)
                if (ccgdm->pmap_mem) MEM_freeN(ccgdm->pmap_mem);
                MEM_freeN(ccgdm->edgeFlags);
                MEM_freeN(ccgdm->faceFlags);
-               MEM_freeN(ccgdm->vertMap);
-               MEM_freeN(ccgdm->edgeMap);
-               MEM_freeN(ccgdm->faceMap);
+               if (ccgdm->useGpuBackend == false) {
+                       MEM_freeN(ccgdm->vertMap);
+                       MEM_freeN(ccgdm->edgeMap);
+                       MEM_freeN(ccgdm->faceMap);
+               }
                MEM_freeN(ccgdm);
        }
 }
@@ -4302,11 +4338,8 @@ static void set_ccgdm_gpu_geometry(CCGDerivedMesh *ccgdm,
        DMFlagMat *faceFlags = ccgdm->faceFlags;
 
        for (index = 0; index < totface; index++) {
-               CCGFace *f = ccgdm->faceMap[index].face;
-               int origIndex = 
GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
-
-               faceFlags->flag = mpoly ?  mpoly[origIndex].flag : 0;
-               faceFlags->mat_nr = mpoly ? mpoly[origIndex].mat_nr : 0;
+               faceFlags->flag = mpoly ?  mpoly[index].flag : 0;
+               faceFlags->mat_nr = mpoly ? mpoly[index].mat_nr : 0;
                faceFlags++;
        }
 
@@ -4364,6 +4397,8 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
                ccgdm->reverseFaceMap =
                        MEM_callocN(sizeof(int) * 
ccgSubSurf_getNumFinalFaces(ss),
                                    "reverseFaceMap");
+
+               create_ccgdm_maps(ccgdm, ss);
        }
        else {
                DM_from_template(&ccgdm->dm, dm, DM_TYPE_CCGDM,
@@ -4374,7 +4409,6 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
        }
 
        set_default_ccgdm_callbacks(ccgdm);
-       create_ccgdm_maps(ccgdm, ss);
 
        ccgdm->ss = ss;
        ccgdm->drawInteriorEdges = drawInteriorEdges;

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

Reply via email to