[Bf-blender-cvs] [f5be775] opensubdiv-modifier: OpenSubdiv: Made textured view totally ready for UV maps

Sergey Sharybin noreply at git.blender.org
Tue Jul 22 14:58:10 CEST 2014


Commit: f5be7753af563a390c0a8de372a48622a9fc72e1
Author: Sergey Sharybin
Date:   Tue Jul 22 17:38:55 2014 +0600
Branches: opensubdiv-modifier
https://developer.blender.org/rBf5be7753af563a390c0a8de372a48622a9fc72e1

OpenSubdiv: Made textured view totally ready for UV maps

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

M	intern/opensubdiv/gpu_shader_opensubd_display.glsl
M	intern/opensubdiv/opensubdiv_gpu_capi.cc
M	source/blender/blenkernel/intern/subsurf_ccg.c

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

diff --git a/intern/opensubdiv/gpu_shader_opensubd_display.glsl b/intern/opensubdiv/gpu_shader_opensubd_display.glsl
index 609d1c4..d407c88 100644
--- a/intern/opensubdiv/gpu_shader_opensubd_display.glsl
+++ b/intern/opensubdiv/gpu_shader_opensubd_display.glsl
@@ -215,6 +215,7 @@ uniform float shininess;
 
 uniform sampler2D texture_buffer;
 uniform bool use_color_material;
+uniform bool use_texture_2d;
 
 in block {
 	VertexData v;
@@ -313,11 +314,12 @@ void main()
 
 	/* Compute diffuse color. */
 	float alpha;
-#ifdef USE_TEXTURE
-	L_diffuse *= texture2D(texture_buffer, inpt.v.uv).rgb;
-#else
-	L_diffuse *= diffuse.rgb;
-#endif
+	if (use_texture_2d) {
+		L_diffuse *= texture2D(texture_buffer, inpt.v.uv).rgb;
+	}
+	else {
+		L_diffuse *= diffuse.rgb;
+	}
 	alpha = diffuse.a;
 
 	/* Sum lighting. */
diff --git a/intern/opensubdiv/opensubdiv_gpu_capi.cc b/intern/opensubdiv/opensubdiv_gpu_capi.cc
index 02824ea..4b4b681 100644
--- a/intern/opensubdiv/opensubdiv_gpu_capi.cc
+++ b/intern/opensubdiv/opensubdiv_gpu_capi.cc
@@ -287,11 +287,9 @@ GLuint linkProgram(const char *define)
 	                      glGetUniformBlockIndex(program, "Lighting"),
 	                      0);
 
-#if 0  /* Used for textured view */
 	glProgramUniform1i(program,
 	                   glGetUniformLocation(program, "texture_buffer"),
 	                   0);  /* GL_TEXTURE0 */
-#endif
 
 	glProgramUniform1i(program,
 	                   glGetUniformLocation(program, "FVarDataBuffer"),
@@ -325,12 +323,15 @@ void bindProgram(PartitionedGLMeshInterface *mesh,
 	glBindBufferBase(GL_UNIFORM_BUFFER, 0, g_lighting_ub);
 
 	/* Color */
-	GLboolean use_lighting, use_color_material;
+	GLboolean use_lighting, use_color_material, use_texture_2d;
 	glGetBooleanv(GL_LIGHTING, &use_lighting);
 	glGetBooleanv(GL_COLOR_MATERIAL, &use_color_material);
+	glGetBooleanv(GL_TEXTURE_2D, &use_texture_2d);
 
 	glUniform1i(glGetUniformLocation(program, "use_color_material"),
 	            use_color_material);
+	glUniform1i(glGetUniformLocation(program, "use_texture_2d"),
+	            use_texture_2d);
 
 	if (use_lighting) {
 		float color[4];
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index afc68b5..190f960 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -2444,27 +2444,53 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
 
 #ifdef WITH_OPENSUBDIV
 	if (ccgdm->useGpuBackend) {
-		int mat_nr;
-		bool drawSmooth;
-		MTFace tmp_tf = {{{0}}};
+		MTexPoly *mtexpoly = CustomData_get_layer_n(&ccgdm->dm.polyData,
+		                                            CD_MTEXPOLY,
+		                                            0);
 
-		if (faceFlags) {
-			drawSmooth = (lnors || (faceFlags[0].flag & ME_SMOOTH));
-			mat_nr = faceFlags[0].mat_nr;
-		}
-		else {
-			drawSmooth = 1;
-			mat_nr = 0;
+		CCGFaceIterator *fi;
+
+		/* TODO(sergey): Face-by-face for now, in order to optimize
+		 * this we'll need to pass proper compareDrawOptions.
+		 */
+
+		/* If it happens we've got compare callback let us know. */
+		BLI_assert(compareDrawOptions == NULL);
+
+		if (ccgSubSurf_prepareGLMesh(ss, true) == false) {
+			return;
 		}
 
-		glShadeModel(drawSmooth ? GL_SMOOTH : GL_FLAT);
+		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));
+			MTFace tmp_tf;
+			int mat_nr;
+			bool drawSmooth;
 
-		if (drawParams != NULL)
-			drawParams(&tmp_tf, (mcol != NULL), mat_nr);
+			ME_MTEXFACE_CPY(&tmp_tf, &mtexpoly[index]);
 
-		if (ccgSubSurf_prepareGLMesh(ss, true)) {
-			ccgSubSurf_drawGLMesh(ss, true, -1, -1);
+			if (faceFlags) {
+				drawSmooth = (lnors || (faceFlags[0].flag & ME_SMOOTH));
+				mat_nr = faceFlags[0].mat_nr;
+			}
+			else {
+				drawSmooth = 1;
+				mat_nr = 0;
+			}
+
+			glShadeModel(drawSmooth ? GL_SMOOTH : GL_FLAT);
+
+			if (drawParams != NULL)
+				drawParams(&tmp_tf, (mcol != NULL), mat_nr);
+
+			ccgSubSurf_drawGLMesh(ss, true, i, 1);
 		}
+		ccgFaceIterator_free(fi);
+
 		return;
 	}
 #endif
@@ -4096,7 +4122,10 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
 	}
 	else {
 		DM_from_template(&ccgdm->dm, dm, DM_TYPE_CCGDM,
-		                 0, 0, 0, 0, 0);
+		                 0, 0, 0, 0, dm->getNumPolys(dm));
+		CustomData_copy_data(&dm->polyData,
+		                     &ccgdm->dm.polyData,
+		                     0, 0, dm->getNumPolys(dm));
 	}
 
 	set_default_ccgdm_callbacks(ccgdm);




More information about the Bf-blender-cvs mailing list