[Bf-blender-cvs] [8def551] opensubdiv-modifier: OpenSubdiv: Support matcap viewport drawing

Sergey Sharybin noreply at git.blender.org
Mon Jul 14 17:14:33 CEST 2014


Commit: 8def551763565d7154599550f33075e0b0cc659b
Author: Sergey Sharybin
Date:   Mon Jul 14 20:31:09 2014 +0600
https://developer.blender.org/rB8def551763565d7154599550f33075e0b0cc659b

OpenSubdiv: Support matcap viewport drawing

Matcap display is a part of more generic drawMappedFacesGLSL(),
but this doesn't mean GLSL viewport materials are working.

For now stuff is only tested and verified for matcap materials,
BI/Cycles materials and textures are still not supported.

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

M	source/blender/blenkernel/intern/subsurf_ccg.c

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

diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 122ed54..45c0b63 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -2019,6 +2019,57 @@ static void ccgDM_drawMappedFacesGLSL(DerivedMesh *dm,
 	short (*lnors)[4][3] = dm->getTessFaceDataArray(dm, CD_TESSLOOPNORMAL);
 	int a, i, do_draw, numVerts, matnr, new_matnr, totface;
 
+#ifdef WITH_OPENSUBDIV
+	{
+		int i, matnr = -1, shademodel = -1;
+		CCGFaceIterator *fi;
+		ccgSubSurf_prepareGLMesh(ss);
+		do_draw = 0;
+		for (fi = ccgSubSurf_getFaceIterator(ss), i = 0;
+		     !ccgFaceIterator_isStopped(fi);
+		     ccgFaceIterator_next(fi), ++i)
+		{
+			CCGFace *f = ccgFaceIterator_getCurrent(fi);
+			int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
+			int origIndex = ccgDM_getFaceMapIndex(ss, f);
+			int new_matnr, new_shademodel;
+
+			if (faceFlags) {
+				new_shademodel = (lnors || (faceFlags[index].flag & ME_SMOOTH))
+					? GL_SMOOTH
+					: GL_FLAT;
+				new_matnr = faceFlags[index].mat_nr;
+			}
+			else {
+				new_shademodel = GL_SMOOTH;
+				new_matnr = 0;
+			}
+
+			if (new_shademodel != shademodel) {
+				glShadeModel(new_shademodel);
+				shademodel = new_shademodel;
+			}
+
+			if (new_matnr != matnr) {
+				do_draw = setMaterial(matnr = new_matnr, &gattribs);
+				matnr = new_matnr;
+			}
+
+			if (!do_draw || (setDrawOptions && (origIndex != ORIGINDEX_NONE) &&
+			                (setDrawOptions(userData, origIndex) == DM_DRAW_OPTION_SKIP)))
+			{
+				continue;
+			}
+
+			ccgSubSurf_drawGLMesh(ss, true, i);
+		}
+		ccgFaceIterator_free(fi);
+
+		/* We're done with drawing if drawing happens using OpenSubdiv. */
+		return;
+	}
+#endif
+
 	CCG_key_top_level(&key, ss);
 	ccgdm_pbvh_update(ccgdm);




More information about the Bf-blender-cvs mailing list