[Bf-blender-cvs] [ab7d30f] opensubdiv-modifier: OpenSubdiv: Fix some bad array subscriptions in drawing code

Sergey Sharybin noreply at git.blender.org
Fri Jul 17 11:37:21 CEST 2015


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;




More information about the Bf-blender-cvs mailing list