[Bf-blender-cvs] [3f0eb1f] opensubdiv-modifier: OpenSubdiv: Support edge and outline drawing

Sergey Sharybin noreply at git.blender.org
Fri Jul 4 16:50:14 CEST 2014


Commit: 3f0eb1fc4b222239dec1edba89410c4c408a9d2b
Author: Sergey Sharybin
Date:   Fri Jul 4 17:03:32 2014 +0600
https://developer.blender.org/rB3f0eb1fc4b222239dec1edba89410c4c408a9d2b

OpenSubdiv: Support edge and outline drawing

This gives some performance drop, most of it could be solved
by skipping base vertices synchronization when drawing both
outline ad solid view.

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

M	intern/opensubdiv/opensubdiv_capi.h
M	intern/opensubdiv/opensubdiv_gpu_capi.cc
M	source/blender/blenkernel/intern/CCGSubSurf.c
M	source/blender/blenkernel/intern/CCGSubSurf.h
M	source/blender/blenkernel/intern/subsurf_ccg.c

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

diff --git a/intern/opensubdiv/opensubdiv_capi.h b/intern/opensubdiv/opensubdiv_capi.h
index 36604d6..ccf88be 100644
--- a/intern/opensubdiv/opensubdiv_capi.h
+++ b/intern/opensubdiv/opensubdiv_capi.h
@@ -70,7 +70,7 @@ void openSubdiv_osdGLMeshUpdateVertexBuffer(struct OpenSubdiv_GLMesh *gl_mesh,
                                             int num_verts);
 void openSubdiv_osdGLMeshRefine(struct OpenSubdiv_GLMesh *gl_mesh);
 void openSubdiv_osdGLMeshSynchronize(struct OpenSubdiv_GLMesh *gl_mesh);
-void openSubdiv_osdGLMeshDisplay(struct OpenSubdiv_GLMesh *gl_mesh);
+void openSubdiv_osdGLMeshDisplay(struct OpenSubdiv_GLMesh *gl_mesh, int fill_quads);
 void openSubdiv_osdGLMeshBindvertexBuffer(struct OpenSubdiv_GLMesh *gl_mesh);
 
 int openSubdiv_getAvailableControllers(void);
diff --git a/intern/opensubdiv/opensubdiv_gpu_capi.cc b/intern/opensubdiv/opensubdiv_gpu_capi.cc
index 29ce53c..33a678e 100644
--- a/intern/opensubdiv/opensubdiv_gpu_capi.cc
+++ b/intern/opensubdiv/opensubdiv_gpu_capi.cc
@@ -111,7 +111,7 @@ static GLuint linkProgram(const char *define)
 }
 #endif  /* OPENSUBDIV_LEGACY_DRAW */
 
-void openSubdiv_osdGLMeshDisplay(OpenSubdiv_GLMesh *gl_mesh)
+void openSubdiv_osdGLMeshDisplay(OpenSubdiv_GLMesh *gl_mesh, int fill_quads)
 {
 #ifndef OPENSUBDIV_LEGACY_DRAW
 	static GLuint quad_fill_program = 0;
@@ -134,6 +134,10 @@ void openSubdiv_osdGLMeshDisplay(OpenSubdiv_GLMesh *gl_mesh)
 	glUseProgram(quad_fill_program);
 #endif
 
+	if (!fill_quads) {
+		glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+	}
+
 	for (int i = 0; i < (int)patches.size(); ++i) {
 		OpenSubdiv::OsdDrawContext::PatchArray const &patch = patches[i];
 		OpenSubdiv::OsdDrawContext::PatchDescriptor desc = patch.GetDescriptor();
@@ -146,6 +150,14 @@ void openSubdiv_osdGLMeshDisplay(OpenSubdiv_GLMesh *gl_mesh)
 			               NULL);
 		}
 	}
+
+	/* Restore state. */
+	if (!fill_quads) {
+		glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+	}
 	glBindVertexArray(0);
+#ifndef OPENSUBDIV_LEGACY_DRAW
+	/* TODO(sergey): Store previously used program and roll back to it? */
 	glUseProgram(0);
+#endif
 }
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index 13098bf..e282ada 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -2388,12 +2388,12 @@ void ccgSubSurf_prepareGLMesh(CCGSubSurf *ss)
 	}
 }
 
-void ccgSubSurf_drawGLMesh(CCGSubSurf *ss)
+void ccgSubSurf_drawGLMesh(CCGSubSurf *ss, bool fill_quads)
 {
 	if (LIKELY(ss->osd_mesh != NULL)) {
 		openSubdiv_osdGLMeshBindvertexBuffer(ss->osd_mesh);
 		glBindVertexArray(ss->osd_vao);
-		openSubdiv_osdGLMeshDisplay(ss->osd_mesh);
+		openSubdiv_osdGLMeshDisplay(ss->osd_mesh, fill_quads);
 		glBindVertexArray(0);
 		glBindBuffer(GL_ARRAY_BUFFER, 0);
 	}
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.h b/source/blender/blenkernel/intern/CCGSubSurf.h
index 93f4756..4589927 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.h
+++ b/source/blender/blenkernel/intern/CCGSubSurf.h
@@ -188,7 +188,7 @@ void				ccgFaceIterator_free		(CCGFaceIterator *fi);
 
 #ifdef WITH_OPENSUBDIV
 void ccgSubSurf_prepareGLMesh(CCGSubSurf *ss);
-void ccgSubSurf_drawGLMesh(CCGSubSurf *ss);
+void ccgSubSurf_drawGLMesh(CCGSubSurf *ss, bool fill_quads);
 void ccgSubSurf_setSkipGrids(CCGSubSurf *ss, bool skip_grids);
 #endif
 
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index e494f38..fb49569 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -1662,10 +1662,9 @@ static void ccgDM_drawEdges(DerivedMesh *dm, bool drawLooseEdges, bool drawAllEd
 
 #ifdef WITH_OPENSUBDIV
 	if (!ccgSubSurf_getSimpleSubdiv(ss)) {
-		/* TODO(sergey): Support edge drawing. */
-		(void) dm;
-		(void) drawLooseEdges;
-		(void) drawAllEdges;
+		/* TODO(sergey): We currently only support all edges drawing. */
+		ccgSubSurf_prepareGLMesh(ss);
+		ccgSubSurf_drawGLMesh(ss, false);
 		return;
 	}
 #endif
@@ -1809,7 +1808,7 @@ static void ccgDM_drawFacesSolid(DerivedMesh *dm, float (*partial_redraw_planes)
 		glShadeModel(shademodel);
 
 		ccgSubSurf_prepareGLMesh(ss);
-		ccgSubSurf_drawGLMesh(ss);
+		ccgSubSurf_drawGLMesh(ss, true);
 
 		/* We're done with drawing if drawing happens using OpenSubdiv. */
 		return;




More information about the Bf-blender-cvs mailing list